module exclusion {
    class AttachableAttribute extends Attribute
    {
    	constructor()
    	{
    		super();
    	}
    }
    class EwsEnumAttribute extends Attribute
    {
    	private schemaName: string = null;
    	get SchemaName(): string
    	{
    		return this.schemaName;
    	}
    	constructor(schemaName: string)
    	{
    		super();
    		this.schemaName = schemaName;
    	}
    }
    class RequiredServerVersionAttribute extends Attribute
    {
    	private version: ExchangeVersion = 0;
    	get Version(): ExchangeVersion
    	{
    		return this.version;
    	}
    	constructor(version: ExchangeVersion)
    	{
    		super();
    		this.version = version;
    	}
    }
    class SchemaAttribute extends Attribute
    {
    	constructor()
    	{
    		super();
    	}
    }
    class ServiceObjectDefinitionAttribute extends Attribute
    {
    	private xmlElementName: string = null;
    	private returnedByServer: boolean = false;
    	get XmlElementName(): string
    	{
    		return this.xmlElementName;
    	}
    	set ReturnedByServer(value: boolean)
    	{
    		this.returnedByServer = value;
    	}
    	get ReturnedByServer(): boolean
    	{
    		return this.returnedByServer;
    	}
    	constructor(xmlElementName: string)
    	{
    		super();
    		this.xmlElementName = xmlElementName;
    		this.returnedByServer = true;
    	}
    }
    class ExchangeServiceBase {
        static AccountIsLocked: HttpStatusCode = <HttpStatusCode>456;
        private static lockObj: any = new any();
        private requestedServerVersion: ExchangeVersion = ExchangeVersion.Exchange2013_SP1;
        private static binarySecret: number[] = null;
        private static defaultUserAgent: string = "ExchangeServicesClient/" + EwsUtilities.BuildVersion;
        private credentials: ExchangeCredentials = null;
        private useDefaultCredentials: boolean = false;
        private timeout: number = 100000;
        private traceEnabled: boolean = false;
        private sendClientLatencies: boolean = true;
        private traceFlags: TraceFlags = TraceFlags.All;
        private traceListener: ITraceListener = new EwsTraceListener();
        private preAuthenticate: boolean = false;
        private userAgent: string = ExchangeServiceBase.defaultUserAgent;
        private acceptGzipEncoding: boolean = true;
        private keepAlive: boolean = true;
        private connectionGroupName: string = null;
        private clientRequestId: string = null;
        private returnClientRequestId: boolean = false;
        private cookieContainer: CookieContainer = new CookieContainer();
        private timeZone: TimeZoneInfo = null;
        private timeZoneDefinition: TimeZoneDefinition = null;
        private serverInfo: ExchangeServerInfo = null;
        private webProxy: IWebProxy = null;
        private httpHeaders: IDictionary<string, string> = new Dictionary<string, string>();
        private httpResponseHeaders: IDictionary<string, string> = new Dictionary<string, string>();
        private ewsHttpWebRequestFactory: IEwsHttpWebRequestFactory = new EwsHttpWebRequestFactory();
        OnResponseHeadersCaptured: NEvent<(responseHeaders: WebHeaderCollection) => void> = new NEvent<(responseHeaders: WebHeaderCollection) => void>();
        OnSerializeCustomSoapHeaders: NEvent<(writer: XmlWriter) => void> = new NEvent<(writer: XmlWriter) => void>();
        set CookieContainer(value: CookieContainer) {
            this.cookieContainer = value;
        }
        get CookieContainer(): CookieContainer {
            return this.cookieContainer;
        }
        get TimeZone(): TimeZoneInfo {
            return this.timeZone;
        }
        get TimeZoneDefinition(): TimeZoneDefinition {
            if (this.timeZoneDefinition === null) {
                this.timeZoneDefinition = new TimeZoneDefinition(this.TimeZone);
            }
            return this.timeZoneDefinition;
        }
        set SendClientLatencies(value: boolean) {
            this.sendClientLatencies = value;
        }
        get SendClientLatencies(): boolean {
            return this.sendClientLatencies;
        }
        set TraceEnabled(value: boolean) {
            this.traceEnabled = value;
            if (this.traceEnabled && this.traceListener === null) {
                this.traceListener = new EwsTraceListener();
            }
        }
        get TraceEnabled(): boolean {
            return this.traceEnabled;
        }
        set TraceFlags(value: TraceFlags) {
            this.traceFlags = value;
        }
        get TraceFlags(): TraceFlags {
            return this.traceFlags;
        }
        set TraceListener(value: ITraceListener) {
            this.traceListener = value;
            this.traceEnabled = (value !== null);
        }
        get TraceListener(): ITraceListener {
            return this.traceListener;
        }
        set Credentials(value: ExchangeCredentials) {
            this.credentials = value;
            this.useDefaultCredentials = false;
            this.cookieContainer = new CookieContainer();
        }
        get Credentials(): ExchangeCredentials {
            return this.credentials;
        }
        set UseDefaultCredentials(value: boolean) {
            this.useDefaultCredentials = value;
            if (value) {
                this.credentials = null;
                this.cookieContainer = new CookieContainer();
            }
        }
        get UseDefaultCredentials(): boolean {
            return this.useDefaultCredentials;
        }
        set Timeout(value: number) {
            if (value < 1) {
                throw new ArgumentException(Strings.TimeoutMustBeGreaterThanZero);
            }
            this.timeout = value;
        }
        get Timeout(): number {
            return this.timeout;
        }
        set PreAuthenticate(value: boolean) {
            this.preAuthenticate = value;
        }
        get PreAuthenticate(): boolean {
            return this.preAuthenticate;
        }
        set AcceptGzipEncoding(value: boolean) {
            this.acceptGzipEncoding = value;
        }
        get AcceptGzipEncoding(): boolean {
            return this.acceptGzipEncoding;
        }
        get RequestedServerVersion(): ExchangeVersion {
            return this.requestedServerVersion;
        }
        set UserAgent(value: string) {
            this.userAgent = value + " (" + ExchangeServiceBase.defaultUserAgent + ")";
        }
        get UserAgent(): string {
            return this.userAgent;
        }
        set ServerInfo(value: ExchangeServerInfo) {
            this.serverInfo = value;
        }
        get ServerInfo(): ExchangeServerInfo {
            return this.serverInfo;
        }
        set WebProxy(value: IWebProxy) {
            this.webProxy = value;
        }
        get WebProxy(): IWebProxy {
            return this.webProxy;
        }
        set KeepAlive(value: boolean) {
            this.keepAlive = value;
        }
        get KeepAlive(): boolean {
            return this.keepAlive;
        }
        set ConnectionGroupName(value: string) {
            this.connectionGroupName = value;
        }
        get ConnectionGroupName(): string {
            return this.connectionGroupName;
        }
        set ClientRequestId(value: string) {
            this.clientRequestId = value;
        }
        get ClientRequestId(): string {
            return this.clientRequestId;
        }
        set ReturnClientRequestId(value: boolean) {
            this.returnClientRequestId = value;
        }
        get ReturnClientRequestId(): boolean {
            return this.returnClientRequestId;
        }
        get HttpHeaders(): IDictionary<string, string> {
            return this.httpHeaders;
        }
        get HttpResponseHeaders(): IDictionary<string, string> {
            return this.httpResponseHeaders;
        }
        static get SessionKey(): number[] {
            var obj: any;
            Monitor.Enter(obj = ExchangeServiceBase.lockObj);
            var result: number[];
            try {
                if (ExchangeServiceBase.binarySecret === null) {
                    var randomNumberGenerator: RandomNumberGenerator = RandomNumberGenerator.Create();
                    ExchangeServiceBase.binarySecret = new Array<number>(32);
                    for (var _ai: number = 0; _ai < ExchangeServiceBase.binarySecret.length; ++_ai)
                        ExchangeServiceBase.binarySecret[_ai] = 0;
                    randomNumberGenerator.GetNonZeroBytes(ExchangeServiceBase.binarySecret);
                }
                result = ExchangeServiceBase.binarySecret;
            }
            finally {
                Monitor.Exit(obj);
            }
            return result;
        }
        set HttpWebRequestFactory(value: IEwsHttpWebRequestFactory) {
            this.ewsHttpWebRequestFactory = ((value === null) ? new EwsHttpWebRequestFactory() : value);
        }
        get HttpWebRequestFactory(): IEwsHttpWebRequestFactory {
            return this.ewsHttpWebRequestFactory;
        }
        SuppressXmlVersionHeader: boolean = false;
        DoOnSerializeCustomSoapHeaders(writer: XmlWriter): void {
            EwsUtilities.Assert(writer !== null, "ExchangeService.DoOnSerializeCustomSoapHeaders", "writer is null");
            if (this.OnSerializeCustomSoapHeaders !== null) {
                this.OnSerializeCustomSoapHeaders(writer);
            }
        }
        PrepareHttpWebRequestForUrl(url: Uri, acceptGzipEncoding: boolean, allowAutoRedirect: boolean): IEwsHttpWebRequest {
            if (url.Scheme !== Uri.UriSchemeHttp && url.Scheme !== Uri.UriSchemeHttps) {
                throw new ServiceLocalException(NString.Format(Strings.UnsupportedWebProtocol, url.Scheme));
            }
            var request: IEwsHttpWebRequest = this.HttpWebRequestFactory.CreateRequest(url);
            request.PreAuthenticate = this.PreAuthenticate;
            request.Timeout = this.Timeout;
            this.SetContentType(request);
            request.Method = "POST";
            request.UserAgent = this.UserAgent;
            request.AllowAutoRedirect = allowAutoRedirect;
            request.CookieContainer = this.CookieContainer;
            request.KeepAlive = this.keepAlive;
            request.ConnectionGroupName = this.connectionGroupName;
            if (acceptGzipEncoding) {
                request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
            }
            if (!NString.IsNullOrEmpty(this.clientRequestId)) {
                request.Headers.Add("client-request-id", this.clientRequestId);
                if (this.returnClientRequestId) {
                    request.Headers.Add("return-client-request-id", "true");
                }
            }
            if (this.webProxy !== null) {
                request.Proxy = this.webProxy;
            }
            if (this.HttpHeaders.Count > 0) {
                EwsUtilities.ForEach<KeyValuePair<string, string>>(this.HttpHeaders, (kv: KeyValuePair<string, string>) => {
                    request.Headers.Add(kv.Key, kv.Value);
                });
            }
            request.UseDefaultCredentials = this.UseDefaultCredentials;
            if (!request.UseDefaultCredentials) {
                var exchangeCredentials: ExchangeCredentials = this.Credentials;
                if (exchangeCredentials === null) {
                    throw new ServiceLocalException(Strings.CredentialsRequired);
                }
                exchangeCredentials.PreAuthenticate();
                exchangeCredentials.PrepareWebRequest(request);
            }
            this.httpResponseHeaders.Clear();
            return request;
        }
        SetContentType(request: IEwsHttpWebRequest): void {
            request.ContentType = "text/xml; charset=utf-8";
            request.Accept = "text/xml";
        }
        InternalProcessHttpErrorResponse(httpWebResponse: IEwsHttpWebResponse, webException: WebException, responseHeadersTraceFlag: TraceFlags, responseTraceFlag: TraceFlags): void {
            EwsUtilities.Assert(httpWebResponse.StatusCode !== HttpStatusCode.InternalServerError, "ExchangeServiceBase.InternalProcessHttpErrorResponse", "InternalProcessHttpErrorResponse does not handle 500 ISE errors, the caller is supposed to handle this.");
            this.ProcessHttpResponseHeaders(responseHeadersTraceFlag, httpWebResponse);
            if (httpWebResponse.StatusCode === <HttpStatusCode>456) {
                var statusDescription: string = httpWebResponse.StatusDescription;
                var uri: Uri = null;
                if (Uri.IsWellFormedUriString(statusDescription, UriKind.Absolute)) {
                    uri = new Uri(statusDescription);
                }
                this.TraceMessage(responseTraceFlag, NString.Format("Account is locked. Unlock URL is {0}", uri));
                throw new AccountIsLockedException(NString.Format(Strings.AccountIsLocked, uri), uri, webException);
            }
        }
        ProcessHttpErrorResponse(httpWebResponse: IEwsHttpWebResponse, webException: WebException): void {
            throw new NotSupportedException();
        }
        IsTraceEnabledFor(traceFlags: TraceFlags): boolean {
            return this.TraceEnabled && (this.TraceFlags & traceFlags) !== TraceFlags.None;
        }
        TraceMessage(traceType: TraceFlags, logEntry: string): void {
            if (this.IsTraceEnabledFor(traceType)) {
                var text: string = TraceFlags[traceType];
                var traceMessage: string = EwsUtilities.FormatLogMessage(text, logEntry);
                this.TraceListener.Trace(text, traceMessage);
            }
        }
        TraceXml(traceType: TraceFlags, stream: MemoryStream): void {
            if (this.IsTraceEnabledFor(traceType)) {
                var text: string = TraceFlags[traceType];
                var traceMessage: string = EwsUtilities.FormatLogMessageWithXmlContent(text, stream);
                this.TraceListener.Trace(text, traceMessage);
            }
        }
        TraceHttpRequestHeaders(traceType: TraceFlags, request: IEwsHttpWebRequest): void {
            if (this.IsTraceEnabledFor(traceType)) {
                var text: string = TraceFlags[traceType];
                var logEntry: string = EwsUtilities.FormatHttpRequestHeaders(request);
                var traceMessage: string = EwsUtilities.FormatLogMessage(text, logEntry);
                this.TraceListener.Trace(text, traceMessage);
            }
        }
        ProcessHttpResponseHeaders(traceType: TraceFlags, response: IEwsHttpWebResponse): void {
            this.TraceHttpResponseHeaders(traceType, response);
            this.SaveHttpResponseHeaders(response.Headers);
        }
        private TraceHttpResponseHeaders(traceType: TraceFlags, response: IEwsHttpWebResponse): void {
            if (this.IsTraceEnabledFor(traceType)) {
                var text: string = TraceFlags[traceType];
                var logEntry: string = EwsUtilities.FormatHttpResponseHeaders(response);
                var traceMessage: string = EwsUtilities.FormatLogMessage(text, logEntry);
                this.TraceListener.Trace(text, traceMessage);
            }
        }
        private SaveHttpResponseHeaders(headers: WebHeaderCollection): void {
            EwsUtilities.Assert(this.httpResponseHeaders.Count === 0, "ExchangeServiceBase.SaveHttpResponseHeaders", "expect no headers in the dictionary yet.");
            this.httpResponseHeaders.Clear();
            var allKeys: string[] = headers.AllKeys;
            for (var i: number = 0; i < allKeys.length; i = i + 1) {
                var text: string = allKeys[i];
                this.httpResponseHeaders.Add(text, headers.get_Item(text));
            }
            if (this.OnResponseHeadersCaptured !== null) {
                this.OnResponseHeadersCaptured(headers);
            }
        }
        ConvertUniversalDateTimeStringToLocalDateTime(value: string): Nullable<DateTime> {
            if (NString.IsNullOrEmpty(value)) {
                return null;
            }
            var dateTime: DateTime = DateTime.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
            if (this.TimeZone === TimeZoneInfo.Utc) {
                return new Nullable<DateTime>(dateTime);
            }
            var value2: DateTime = EwsUtilities.ConvertTime(dateTime, TimeZoneInfo.Utc, this.TimeZone);
            if (EwsUtilities.IsLocalTimeZone(this.TimeZone)) {
                return new Nullable<DateTime>(new DateTime(value2.Ticks, DateTimeKind.Local));
            }
            return new Nullable<DateTime>(value2);
        }
        ConvertStartDateToUnspecifiedDateTime(value: string): Nullable<DateTime> {
            if (NString.IsNullOrEmpty(value)) {
                return null;
            }
            return new Nullable<DateTime>(DateTimeOffset.Parse(value, CultureInfo.InvariantCulture).Date);
        }
        ConvertDateTimeToUniversalDateTimeString(value: DateTime): string {
            var IL_45: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        var dateTime: DateTime;
                        switch (value.Kind) {
                            case DateTimeKind.Unspecified:
                                dateTime = EwsUtilities.ConvertTime(value, this.TimeZone, TimeZoneInfo.Utc);
                                _goto = IL_45;
                                continue _GOTO_LOOP;
                            case DateTimeKind.Local:
                                dateTime = EwsUtilities.ConvertTime(value, TimeZoneInfo.Local, TimeZoneInfo.Utc);
                                _goto = IL_45;
                                continue _GOTO_LOOP;
                        }
                        dateTime = value;
                        _goto = IL_45;
                        continue _GOTO_LOOP;
                    case 1:
                        return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture);
                }
            }
        }
        SetCustomUserAgent(userAgent: string): void {
            this.userAgent = userAgent;
        }
        constructor();
        constructor(timeZone: TimeZoneInfo);
        constructor(requestedServerVersion: ExchangeVersion);
        constructor(requestedServerVersion: ExchangeVersion, timeZone: TimeZoneInfo);
        constructor(service: ExchangeServiceBase, requestedServerVersion: ExchangeVersion);
        constructor(service: ExchangeServiceBase);
        constructor(timeZoneOrRequestedServerVersionOrService?: any, timeZoneOrRequestedServerVersion?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (timeZoneOrRequestedServerVersionOrService === null || timeZoneOrRequestedServerVersionOrService instanceof TimeZoneInfo)) {
                this.constructor_1(timeZoneOrRequestedServerVersionOrService);
                return;
            }
            if (arguments.length === 1 && (timeZoneOrRequestedServerVersionOrService === null || timeZoneOrRequestedServerVersionOrService.constructor === Number)) {
                this.constructor_2(timeZoneOrRequestedServerVersionOrService);
                return;
            }
            if (arguments.length === 2 && (timeZoneOrRequestedServerVersionOrService === null || timeZoneOrRequestedServerVersionOrService.constructor === Number) && (timeZoneOrRequestedServerVersion === null || timeZoneOrRequestedServerVersion instanceof TimeZoneInfo)) {
                this.constructor_3(timeZoneOrRequestedServerVersionOrService, timeZoneOrRequestedServerVersion);
                return;
            }
            if (arguments.length === 2 && (timeZoneOrRequestedServerVersionOrService === null || timeZoneOrRequestedServerVersionOrService instanceof ExchangeServiceBase) && (timeZoneOrRequestedServerVersion === null || timeZoneOrRequestedServerVersion.constructor === Number)) {
                this.constructor_4(timeZoneOrRequestedServerVersionOrService, timeZoneOrRequestedServerVersion);
                return;
            }
            this.constructor_5(timeZoneOrRequestedServerVersionOrService);
        }
        private constructor_0(): void {
            this.constructor_1(TimeZoneInfo.Local);
        }
        private constructor_1(timeZone: TimeZoneInfo): void {
            this.timeZone = timeZone;
            this.UseDefaultCredentials = true;
        }
        private constructor_2(requestedServerVersion: ExchangeVersion): void {
            this.constructor_3(requestedServerVersion, TimeZoneInfo.Local);
        }
        private constructor_3(requestedServerVersion: ExchangeVersion, timeZone: TimeZoneInfo): void {
            this.constructor_1(timeZone);
            this.requestedServerVersion = requestedServerVersion;
        }
        private constructor_4(service: ExchangeServiceBase, requestedServerVersion: ExchangeVersion): void {
            this.constructor_2(requestedServerVersion);
            this.useDefaultCredentials = service.useDefaultCredentials;
            this.credentials = service.credentials;
            this.traceEnabled = service.traceEnabled;
            this.traceListener = service.traceListener;
            this.traceFlags = service.traceFlags;
            this.timeout = service.timeout;
            this.preAuthenticate = service.preAuthenticate;
            this.userAgent = service.userAgent;
            this.acceptGzipEncoding = service.acceptGzipEncoding;
            this.keepAlive = service.keepAlive;
            this.connectionGroupName = service.connectionGroupName;
            this.timeZone = service.timeZone;
            this.httpHeaders = service.httpHeaders;
            this.ewsHttpWebRequestFactory = service.ewsHttpWebRequestFactory;
        }
        private constructor_5(service: ExchangeServiceBase): void {
            this.constructor_4(service, service.RequestedServerVersion);
        }
        Validate(): void {
        }
    }
    interface ISelfValidate {
        Validate(): void;
    }
    interface IJsonSerializable {
        ToJson(service: ExchangeService): any;
    }
    class ComplexProperty implements ISelfValidate, IJsonSerializable {
        private xmlNamespace: XmlNamespace = XmlNamespace.Types;
        OnChange: NEvent<(complexProperty: ComplexProperty) => void> = new NEvent<(complexProperty: ComplexProperty) => void>();
        set Namespace(value: XmlNamespace) {
            this.xmlNamespace = value;
        }
        get Namespace(): XmlNamespace {
            return this.xmlNamespace;
        }
        constructor() {
            super();
        }
        Changed(): void {
            if (this.OnChange !== null) {
                this.OnChange(this);
            }
        }
        SetFieldValue<T>(field: T[], value: T): void {
            var flag: boolean;
            if (field[0] === null) {
                flag = (value !== null);
            }
            else {
                flag = (!(field[0] instanceof IComparable) || (((field[0] instanceof IComparable) ? <IComparable>field[0] : null)).CompareTo(value) !== 0);
            }
            if (flag) {
                field[0] = value;
                this.Changed();
            }
        }
        ClearChangeLog(): void {
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            return false;
        }
        TryReadElementFromXmlToPatch(reader: EwsServiceXmlReader): boolean {
            return false;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void;
        LoadFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void;
        LoadFromXml(reader: EwsServiceXmlReader, xmlNamespaceOrXmlElementName: any, xmlElementName?: string): void {
            if (arguments.length === 3 && (reader === null || reader instanceof EwsServiceXmlReader) && (xmlNamespaceOrXmlElementName === null || xmlNamespaceOrXmlElementName.constructor === Number) && (xmlElementName === null || xmlElementName.constructor === String)) {
                this.LoadFromXml_0(reader, xmlNamespaceOrXmlElementName, xmlElementName);
                return;
            }
            this.LoadFromXml_1(reader, xmlNamespaceOrXmlElementName);
        }
        private LoadFromXml_0(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            this.InternalLoadFromXml(reader, xmlNamespace, xmlElementName, this.TryReadElementFromXml);
        }
        UpdateFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void;
        UpdateFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void;
        UpdateFromXml(reader: EwsServiceXmlReader, xmlNamespaceOrXmlElementName: any, xmlElementName?: string): void {
            if (arguments.length === 3 && (reader === null || reader instanceof EwsServiceXmlReader) && (xmlNamespaceOrXmlElementName === null || xmlNamespaceOrXmlElementName.constructor === Number) && (xmlElementName === null || xmlElementName.constructor === String)) {
                this.UpdateFromXml_0(reader, xmlNamespaceOrXmlElementName, xmlElementName);
                return;
            }
            this.UpdateFromXml_1(reader, xmlNamespaceOrXmlElementName);
        }
        private UpdateFromXml_0(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            this.InternalLoadFromXml(reader, xmlNamespace, xmlElementName, this.TryReadElementFromXmlToPatch);
        }
        private InternalLoadFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string, readAction: (arg: EwsServiceXmlReader) => boolean): void {
            reader.EnsureCurrentNodeIsStartElement(xmlNamespace, xmlElementName);
            this.ReadAttributesFromXml(reader);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    switch (reader.NodeType) {
                        case 1:
                            if (!readAction(reader)) {
                                reader.SkipCurrentElement();
                            }
                            break;
                        case 3:
                            this.ReadTextValueFromXml(reader);
                            break;
                    }
                }
                while (!reader.IsEndElement(xmlNamespace, xmlElementName));
            }
        }
        private LoadFromXml_1(reader: EwsServiceXmlReader, xmlElementName: string): void {
            this.LoadFromXml(reader, this.Namespace, xmlElementName);
        }
        private UpdateFromXml_1(reader: EwsServiceXmlReader, xmlElementName: string): void {
            this.UpdateFromXml(reader, this.Namespace, xmlElementName);
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            throw new NotImplementedException();
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, xmlElementName: string): void;
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void;
        WriteToXml(writer: EwsServiceXmlWriter, xmlNamespaceOrXmlElementName: any, xmlElementName?: string): void {
            if (arguments.length === 3 && (writer === null || writer instanceof EwsServiceXmlWriter) && (xmlNamespaceOrXmlElementName === null || xmlNamespaceOrXmlElementName.constructor === Number) && (xmlElementName === null || xmlElementName.constructor === String)) {
                this.WriteToXml_0(writer, xmlNamespaceOrXmlElementName, xmlElementName);
                return;
            }
            this.WriteToXml_1(writer, xmlNamespaceOrXmlElementName);
        }
        private WriteToXml_0(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            writer.WriteStartElement(xmlNamespace, xmlElementName);
            this.WriteAttributesToXml(writer);
            this.WriteElementsToXml(writer);
            writer.WriteEndElement();
        }
        private WriteToXml_1(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            this.WriteToXml(writer, this.Namespace, xmlElementName);
        }
        ToJson(service: ExchangeService): any {
            return this.InternalToJson(service);
        }
        InternalToJson(service: ExchangeService): any {
            throw new NotImplementedException();
        }
        Validate(): void {
            this.InternalValidate();
        }
        InternalValidate(): void {
        }
    }
    class ExtractedEntity extends ComplexProperty {
        Position: EmailPosition = 0;
        constructor() {
            super();
            this.Namespace = XmlNamespace.Types;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Position") {
                var value: string = reader.ReadElementValue();
                if (!NString.IsNullOrEmpty(value)) {
                    this.Position = EwsUtilities.Parse<EmailPosition>(value);
                }
                return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class AddressEntity extends ExtractedEntity {
        Address: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Address") {
                this.Address = reader.ReadElementValue();
                return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    interface ICustomUpdateSerializer {
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition): boolean;
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean;
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean;
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean;
    }
    interface IJsonCollectionDeserializer {
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void;
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void;
    }
    class ComplexPropertyCollection<TComplexProperty> extends ComplexProperty implements IEnumerable<TComplexProperty>, ICustomUpdateSerializer, IJsonCollectionDeserializer {
        private items: List<TComplexProperty> = new List<TComplexProperty>();
        private addedItems: List<TComplexProperty> = new List<TComplexProperty>();
        private modifiedItems: List<TComplexProperty> = new List<TComplexProperty>();
        private removedItems: List<TComplexProperty> = new List<TComplexProperty>();
        get Items(): List<TComplexProperty> {
            return this.items;
        }
        get AddedItems(): List<TComplexProperty> {
            return this.addedItems;
        }
        get ModifiedItems(): List<TComplexProperty> {
            return this.modifiedItems;
        }
        get RemovedItems(): List<TComplexProperty> {
            return this.removedItems;
        }
        get Count(): number {
            return this.items.Count;
        }
        get_Item(index: number): TComplexProperty {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.items.get_Item(index);
        }
        CreateComplexProperty(xmlElementName: string): TComplexProperty {
            throw new NotSupportedException();
        }
        CreateDefaultComplexProperty(): TComplexProperty {
            throw new NotSupportedException();
        }
        GetCollectionItemXmlElementName(complexProperty: TComplexProperty): string {
            throw new NotSupportedException();
        }
        constructor() {
            super();
        }
        ItemChanged(complexProperty: ComplexProperty): void {
            var tComplexProperty: TComplexProperty = ((complexProperty instanceof TComplexProperty) ? <TComplexProperty>complexProperty : null);
            EwsUtilities.Assert(tComplexProperty !== null, "ComplexPropertyCollection.ItemChanged", NString.Format("ComplexPropertyCollection.ItemChanged: the type of the complexProperty argument ({0}) is not supported.", complexProperty.GetType().Name));
            if (!this.addedItems.Contains(tComplexProperty) && !this.modifiedItems.Contains(tComplexProperty)) {
                this.modifiedItems.Add(tComplexProperty);
                this.Changed();
            }
        }
        LoadFromXml(reader: EwsServiceXmlReader, localElementName: string): void;
        LoadFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, localElementName: string): void;
        LoadFromXml(reader: EwsServiceXmlReader, localElementNameOrXmlNamespace: any, localElementName?: string): void {
            if (arguments.length === 2 && (reader === null || reader instanceof EwsServiceXmlReader) && (localElementNameOrXmlNamespace === null || localElementNameOrXmlNamespace.constructor === String)) {
                this.LoadFromXml_0(reader, localElementNameOrXmlNamespace);
                return;
            }
            this.LoadFromXml_1(reader, localElementNameOrXmlNamespace, localElementName);
        }
        private LoadFromXml_0(reader: EwsServiceXmlReader, localElementName: string): void {
            this.LoadFromXml(reader, XmlNamespace.Types, localElementName);
        }
        private LoadFromXml_1(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, localElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(xmlNamespace, localElementName);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        var tComplexProperty: TComplexProperty = this.CreateComplexProperty(reader.LocalName);
                        if (tComplexProperty !== null) {
                            tComplexProperty.LoadFromXml(reader, reader.LocalName);
                            this.InternalAdd(tComplexProperty, true);
                        }
                        else {
                            reader.SkipCurrentElement();
                        }
                    }
                }
                while (!reader.IsEndElement(xmlNamespace, localElementName));
            }
        }
        UpdateFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(xmlNamespace, xmlElementName);
            if (!reader.IsEmptyElement) {
                var num: number = 0;
                while (true) {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        var tComplexProperty: TComplexProperty = this.CreateComplexProperty(reader.LocalName);
                        var tComplexProperty2: TComplexProperty = this.get_Item(num++);
                        if (tComplexProperty === null || !tComplexProperty.GetType().IsInstanceOfType(tComplexProperty2)) {
                            break;
                        }
                        tComplexProperty2.UpdateFromXml(reader, xmlNamespace, reader.LocalName);
                    }
                    if (reader.IsEndElement(xmlNamespace, xmlElementName)) {
                        return;
                    }
                }
                throw new ServiceLocalException(Strings.PropertyTypeIncompatibleWhenUpdatingCollection);
            }
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject !== null) {
                    var tComplexProperty: TComplexProperty = null;
                    if (jsonObject.HasTypeProperty()) {
                        tComplexProperty = this.CreateComplexProperty(jsonObject.ReadTypeString());
                    }
                    else {
                        tComplexProperty = this.CreateDefaultComplexProperty();
                    }
                    if (tComplexProperty !== null) {
                        tComplexProperty.LoadFromJson(jsonObject, service);
                        this.InternalAdd(tComplexProperty, true);
                    }
                }
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            if (this.Count !== jsonCollection.length) {
                throw new ServiceLocalException(Strings.PropertyCollectionSizeMismatch);
            }
            var num: number = 0;
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject === null) {
                    throw new ServiceLocalException();
                }
                var tComplexProperty: TComplexProperty = null;
                if (jsonObject.HasTypeProperty()) {
                    tComplexProperty = this.CreateComplexProperty(jsonObject.ReadTypeString());
                }
                else {
                    tComplexProperty = this.CreateDefaultComplexProperty();
                }
                var tComplexProperty2: TComplexProperty = this.get_Item(num++);
                if (tComplexProperty === null || !tComplexProperty.GetType().IsInstanceOfType(tComplexProperty2)) {
                    throw new ServiceLocalException(Strings.PropertyTypeIncompatibleWhenUpdatingCollection);
                }
                tComplexProperty2.LoadFromJson(jsonObject, service);
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            if (this.ShouldWriteToRequest()) {
                super.WriteToXml(writer, xmlNamespace, xmlElementName);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<TComplexProperty> = this.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TComplexProperty = enumerator.Current;
                    list.Add(current.InternalToJson(service));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return list.ToArray();
        }
        ShouldWriteToRequest(): boolean {
            return this.Count > 0;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: IEnumerator<TComplexProperty> = this.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TComplexProperty = enumerator.Current;
                    current.WriteToXml(writer, this.GetCollectionItemXmlElementName(current));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        ClearChangeLog(): void {
            this.removedItems.Clear();
            this.addedItems.Clear();
            this.modifiedItems.Clear();
        }
        RemoveFromChangeLog(complexProperty: TComplexProperty): void {
            this.removedItems.Remove(complexProperty);
            this.modifiedItems.Remove(complexProperty);
            this.addedItems.Remove(complexProperty);
        }
        InternalAdd(complexProperty: TComplexProperty): void;
        InternalAdd(complexProperty: TComplexProperty, loading: boolean): void;
        InternalAdd(complexProperty: TComplexProperty, loading?: boolean): void {
            if (arguments.length === 1 && (complexProperty === null || complexProperty instanceof TComplexProperty)) {
                this.InternalAdd_0(complexProperty);
                return;
            }
            this.InternalAdd_1(complexProperty, loading);
        }
        private InternalAdd_0(complexProperty: TComplexProperty): void {
            this.InternalAdd(complexProperty, false);
        }
        private InternalAdd_1(complexProperty: TComplexProperty, loading: boolean): void {
            EwsUtilities.Assert(complexProperty !== null, "ComplexPropertyCollection.InternalAdd", "complexProperty is null");
            if (!this.items.Contains(complexProperty)) {
                this.items.Add(complexProperty);
                if (!loading) {
                    this.removedItems.Remove(complexProperty);
                    this.addedItems.Add(complexProperty);
                }
                complexProperty.OnChange.Add(this.ItemChanged);
                this.Changed();
            }
        }
        InternalClear(): void {
            while (this.Count > 0) {
                this.InternalRemoveAt(0);
            }
        }
        InternalRemoveAt(index: number): void {
            EwsUtilities.Assert(index >= 0 && index < this.Count, "ComplexPropertyCollection.InternalRemoveAt", "index is out of range.");
            this.InternalRemove(this.items.get_Item(index));
        }
        InternalRemove(complexProperty: TComplexProperty): boolean {
            EwsUtilities.Assert(complexProperty !== null, "ComplexPropertyCollection.InternalRemove", "complexProperty is null");
            if (this.items.Remove(complexProperty)) {
                complexProperty.OnChange.Remove(this.ItemChanged);
                if (!this.addedItems.Contains(complexProperty)) {
                    this.removedItems.Add(complexProperty);
                }
                else {
                    this.addedItems.Remove(complexProperty);
                }
                this.modifiedItems.Remove(complexProperty);
                this.Changed();
                return true;
            }
            return false;
        }
        Contains(complexProperty: TComplexProperty): boolean {
            return this.items.Contains(complexProperty);
        }
        IndexOf(complexProperty: TComplexProperty): number {
            return this.items.IndexOf(complexProperty);
        }
        GetEnumerator(): IEnumerator<TComplexProperty> {
            return this.items.GetEnumerator();
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition): boolean {
            if (this.Count === 0) {
                writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetDeleteFieldXmlElementName());
                propertyDefinition.WriteToXml(writer);
                writer.WriteEndElement();
                return true;
            }
            return false;
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            return false;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            if (this.Count === 0) {
                var jsonObject: JsonObject = new JsonObject();
                jsonObject.AddTypeParameter(ewsObject.GetDeleteFieldXmlElementName());
                jsonObject.Add("Path", (<IJsonSerializable>propertyDefinition).ToJson(service));
                return true;
            }
            return false;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            return false;
        }
    }
    class AddressEntityCollection extends ComplexPropertyCollection<AddressEntity>
    {
        constructor();
        constructor(collection: IEnumerable<AddressEntity>);
        constructor(collection?: IEnumerable<AddressEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<AddressEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<AddressEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): AddressEntity {
            return new AddressEntity();
        }
        CreateDefaultComplexProperty(): AddressEntity {
            return new AddressEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: AddressEntity): string {
            return "Address";
        }
    }
    class ServiceId extends ComplexProperty {
        private changeKey: string = null;
        private uniqueId: string = null;
        get IsValid(): boolean {
            return !NString.IsNullOrEmpty(this.uniqueId);
        }
        set UniqueId(value: string) {
            this.uniqueId = value;
        }
        get UniqueId(): string {
            return this.uniqueId;
        }
        set ChangeKey(value: string) {
            this.changeKey = value;
        }
        get ChangeKey(): string {
            return this.changeKey;
        }
        constructor();
        constructor(uniqueId: string);
        constructor(uniqueId?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(uniqueId);
        }
        private constructor_0(): void {
        }
        private constructor_1(uniqueId: string): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(uniqueId, "uniqueId");
            this.uniqueId = uniqueId;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.uniqueId = reader.ReadAttributeValue("Id");
            this.changeKey = reader.ReadAttributeValue("ChangeKey");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Id")) {
                            if (a === "ChangeKey") {
                                this.changeKey = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.uniqueId = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Id", this.UniqueId);
            writer.WriteAttributeValue("ChangeKey", this.ChangeKey);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetJsonTypeName());
            jsonObject.Add("Id", this.UniqueId);
            jsonObject.Add("ChangeKey", this.ChangeKey);
            return jsonObject;
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetJsonTypeName(): string {
            return this.GetXmlElementName();
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, this.GetXmlElementName());
        }
        Assign(source: ServiceId): void {
            this.uniqueId = source.UniqueId;
            this.changeKey = source.ChangeKey;
        }
        SameIdAndChangeKey(other: ServiceId): boolean {
            return NObject.GenericEquals(this, other) && ((this.ChangeKey === null && other.ChangeKey === null) || this.ChangeKey === other.ChangeKey);
        }
        Equals(obj: any): boolean {
            if (NObject.ReferenceEquals(this, obj)) {
                return true;
            }
            var serviceId: ServiceId = ((obj instanceof ServiceId) ? <ServiceId>obj : null);
            return serviceId !== null && this.IsValid && serviceId.IsValid && this.UniqueId === serviceId.UniqueId;
        }
        GetHashCode(): number {
            if (!this.IsValid) {
                return super.GetHashCode();
            }
            return NString.GetHashCode(this.UniqueId);
        }
        ToString(): string {
            if (this.uniqueId !== null) {
                return this.uniqueId;
            }
            return NString.Empty;
        }
    }
    class ItemId extends ServiceId implements IJsonSerializable {
        constructor();
        constructor(uniqueId: string);
        constructor(uniqueId?: string) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(uniqueId);
            this.constructor_1(uniqueId);
        }
        private constructor_0(): void {
        }
        static op_Implicit(uniqueId: string): ItemId {
            return new ItemId(uniqueId);
        }
        GetXmlElementName(): string {
            return "ItemId";
        }
        private constructor_1(uniqueId: string): void {
        }
    }
    class AppointmentOccurrenceId extends ItemId {
        private occurrenceIndex: number = 0;
        set OccurrenceIndex(value: number) {
            if (value < 1) {
                throw new ArgumentException(Strings.OccurrenceIndexMustBeGreaterThanZero);
            }
            this.occurrenceIndex = value;
        }
        get OccurrenceIndex(): number {
            return this.occurrenceIndex;
        }
        constructor(recurringMasterUniqueId: string, occurrenceIndex: number) {
            super(recurringMasterUniqueId);
            this.OccurrenceIndex = occurrenceIndex;
        }
        GetXmlElementName(): string {
            return "OccurrenceItemId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("RecurringMasterId", this.UniqueId);
            writer.WriteAttributeValue("InstanceIndex", this.OccurrenceIndex);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetXmlElementName());
            jsonObject.Add("RecurringMasterId", this.UniqueId);
            jsonObject.Add("InstanceIndex", this.OccurrenceIndex);
            return jsonObject;
        }
    }
    class ApprovalRequestData extends ComplexProperty {
        private isUndecidedApprovalRequest: boolean = false;
        private approvalDecision: number = 0;
        private approvalDecisionMaker: string = null;
        private approvalDecisionTime: DateTime = null;
        get IsUndecidedApprovalRequest(): boolean {
            return this.isUndecidedApprovalRequest;
        }
        get ApprovalDecision(): number {
            return this.approvalDecision;
        }
        get ApprovalDecisionMaker(): string {
            return this.approvalDecisionMaker;
        }
        get ApprovalDecisionTime(): DateTime {
            return this.approvalDecisionTime;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "IsUndecidedApprovalRequest") {
                    this.isUndecidedApprovalRequest = reader.ReadElementValue<boolean>();
                    return true;
                }
                if (localName === "ApprovalDecision") {
                    this.approvalDecision = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "ApprovalDecisionMaker") {
                    this.approvalDecisionMaker = reader.ReadElementValue<string>();
                    return true;
                }
                if (localName === "ApprovalDecisionTime") {
                    this.approvalDecisionTime = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "IsUndecidedApprovalRequest")) {
                            if (!(a === "ApprovalDecision")) {
                                if (!(a === "ApprovalDecisionMaker")) {
                                    if (a === "ApprovalDecisionTime") {
                                        this.approvalDecisionTime = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                                    }
                                }
                                else {
                                    this.approvalDecisionMaker = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.approvalDecision = jsonProperty.ReadAsInt(current);
                            }
                        }
                        else {
                            this.isUndecidedApprovalRequest = jsonProperty.ReadAsBool(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class RetentionTagBase extends ComplexProperty {
        private xmlElementName: string = null;
        private isExplicit: boolean = false;
        private retentionId: Guid = null;
        set IsExplicit(value: boolean) {
            (() => {
                var _p0 = [
                    this.isExplicit
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isExplicit = _p0[0];
                return _r;
            })();
        }
        get IsExplicit(): boolean {
            return this.isExplicit;
        }
        set RetentionId(value: Guid) {
            (() => {
                var _p0 = [
                    this.retentionId
                ];
                var _r = this.SetFieldValue<Guid>(_p0, value);
                this.retentionId = _p0[0];
                return _r;
            })();
        }
        get RetentionId(): Guid {
            return this.retentionId;
        }
        constructor(xmlElementName: string) {
            super();
            this.xmlElementName = xmlElementName;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.isExplicit = reader.ReadAttributeValue<boolean>("IsExplicit");
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.retentionId = new Guid(reader.ReadValue());
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "IsExplicit")) {
                            if (a === "Value") {
                                this.retentionId = new Guid(jsonProperty.ReadAsString(current));
                            }
                        }
                        else {
                            this.isExplicit = jsonProperty.ReadAsBool(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("IsExplicit", this.isExplicit);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (Guid.op_Inequality(this.retentionId, Guid.Empty)) {
                writer.WriteValue(this.retentionId.ToString(), this.xmlElementName);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("IsExplicit", this.isExplicit);
            if (Guid.op_Inequality(this.retentionId, Guid.Empty)) {
                jsonObject.Add("Value", this.retentionId);
            }
            return jsonObject;
        }
        ToString(): string {
            if (Guid.op_Equality(this.retentionId, Guid.Empty)) {
                return NString.Empty;
            }
            return this.retentionId.ToString();
        }
    }
    class ArchiveTag extends RetentionTagBase {
        constructor();
        constructor(isExplicit: boolean, retentionId: Guid);
        constructor(isExplicit?: boolean, retentionId?: Guid) {
            if (arguments.length === 0) {
                super("ArchiveTag");
                this.constructor_0();
                return;
            }
            super("ArchiveTag");
            this.constructor_1(isExplicit, retentionId);
        }
        private constructor_0(): void {
        }
        private constructor_1(isExplicit: boolean, retentionId: Guid): void {
            this.constructor_0();
            this.IsExplicit = isExplicit;
            this.RetentionId = retentionId;
        }
    }
    class Attachment extends ComplexProperty {
        private owner: Item = null;
        private id: string = null;
        private name: string = null;
        private contentType: string = null;
        private contentId: string = null;
        private contentLocation: string = null;
        private size: number = 0;
        private lastModifiedTime: DateTime = null;
        private isInline: boolean = false;
        private service: ExchangeService = null;
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        set Name(value: string) {
            (() => {
                var _p0 = [
                    this.name
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.name = _p0[0];
                return _r;
            })();
        }
        get Name(): string {
            return this.name;
        }
        set ContentType(value: string) {
            (() => {
                var _p0 = [
                    this.contentType
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.contentType = _p0[0];
                return _r;
            })();
        }
        get ContentType(): string {
            return this.contentType;
        }
        set ContentId(value: string) {
            (() => {
                var _p0 = [
                    this.contentId
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.contentId = _p0[0];
                return _r;
            })();
        }
        get ContentId(): string {
            return this.contentId;
        }
        set ContentLocation(value: string) {
            (() => {
                var _p0 = [
                    this.contentLocation
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.contentLocation = _p0[0];
                return _r;
            })();
        }
        get ContentLocation(): string {
            return this.contentLocation;
        }
        set Size(value: number) {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "Size");
            (() => {
                var _p0 = [
                    this.size
                ];
                var _r = this.SetFieldValue<number>(_p0, value);
                this.size = _p0[0];
                return _r;
            })();
        }
        get Size(): number {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "Size");
            return this.size;
        }
        set LastModifiedTime(value: DateTime) {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "LastModifiedTime");
            (() => {
                var _p0 = [
                    this.lastModifiedTime
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.lastModifiedTime = _p0[0];
                return _r;
            })();
        }
        get LastModifiedTime(): DateTime {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "LastModifiedTime");
            return this.lastModifiedTime;
        }
        set IsInline(value: boolean) {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "IsInline");
            (() => {
                var _p0 = [
                    this.isInline
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isInline = _p0[0];
                return _r;
            })();
        }
        get IsInline(): boolean {
            EwsUtilities.ValidatePropertyVersion(this.service, ExchangeVersion.Exchange2010, "IsInline");
            return this.isInline;
        }
        get IsNew(): boolean {
            return NString.IsNullOrEmpty(this.Id);
        }
        get Owner(): Item {
            return this.owner;
        }
        get Service(): ExchangeService {
            return this.service;
        }
        constructor(owner: Item);
        constructor(service: ExchangeService);
        constructor(ownerOrService: any) {
            super();
            if (arguments.length === 1 && (ownerOrService === null || ownerOrService instanceof Item)) {
                this.constructor_0(ownerOrService);
                return;
            }
            this.constructor_1(ownerOrService);
        }
        private constructor_0(owner: Item): void {
            this.owner = owner;
            if (owner !== null) {
                this.service = this.owner.Service;
            }
        }
        private constructor_1(service: ExchangeService): void {
            this.service = service;
        }
        ThrowIfThisIsNotNew(): void {
            if (!this.IsNew) {
                throw new InvalidOperationException(Strings.AttachmentCannotBeUpdated);
            }
        }
        SetFieldValue<T>(field: T[], value: T): void {
            this.ThrowIfThisIsNotNew();
            (() => {
                var _p0 = [
                    field[0]
                ];
                var _r = super.SetFieldValue<T>(_p0, value);
                field[0] = _p0[0];
                return _r;
            })();
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "AttachmentId":
                    this.id = reader.ReadAttributeValue("Id");
                    if (this.Owner !== null) {
                        var text: string = reader.ReadAttributeValue("RootItemChangeKey");
                        if (!NString.IsNullOrEmpty(text)) {
                            this.Owner.RootItemId.ChangeKey = text;
                        }
                    }
                    reader.ReadEndElementIfNecessary(XmlNamespace.Types, "AttachmentId");
                    return true;
                case "Name":
                    this.name = reader.ReadElementValue();
                    return true;
                case "ContentType":
                    this.contentType = reader.ReadElementValue();
                    return true;
                case "ContentId":
                    this.contentId = reader.ReadElementValue();
                    return true;
                case "ContentLocation":
                    this.contentLocation = reader.ReadElementValue();
                    return true;
                case "Size":
                    this.size = reader.ReadElementValue<number>();
                    return true;
                case "LastModifiedTime":
                    this.lastModifiedTime = reader.ReadElementValueAsDateTime().Value;
                    return true;
                case "IsInline":
                    this.isInline = reader.ReadElementValue<boolean>();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "AttachmentId":
                            this.LoadAttachmentIdFromJson(jsonProperty.ReadAsJsonObject(current));
                            break;
                        case "Name":
                            this.name = jsonProperty.ReadAsString(current);
                            break;
                        case "ContentType":
                            this.contentType = jsonProperty.ReadAsString(current);
                            break;
                        case "ContentId":
                            this.contentId = jsonProperty.ReadAsString(current);
                            break;
                        case "ContentLocation":
                            this.contentLocation = jsonProperty.ReadAsString(current);
                            break;
                        case "Size":
                            this.size = jsonProperty.ReadAsInt(current);
                            break;
                        case "LastModifiedTime":
                            this.lastModifiedTime = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                            break;
                        case "IsInline":
                            this.isInline = jsonProperty.ReadAsBool(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        private LoadAttachmentIdFromJson(jsonObject: JsonObject): void {
            this.id = jsonObject.ReadAsString("Id");
            if (this.Owner !== null && jsonObject.ContainsKey("RootItemChangeKey")) {
                var text: string = jsonObject.ReadAsString("RootItemChangeKey");
                if (!NString.IsNullOrEmpty(text)) {
                    this.Owner.RootItemId.ChangeKey = text;
                }
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Name", this.Name);
            writer.WriteElementValue(XmlNamespace.Types, "ContentType", this.ContentType);
            writer.WriteElementValue(XmlNamespace.Types, "ContentId", this.ContentId);
            writer.WriteElementValue(XmlNamespace.Types, "ContentLocation", this.ContentLocation);
            if (writer.Service.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                writer.WriteElementValue(XmlNamespace.Types, "IsInline", this.IsInline);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetXmlElementName());
            jsonObject.Add("Name", this.Name);
            jsonObject.Add("ContentType", this.ContentType);
            jsonObject.Add("ContentId", this.ContentId);
            jsonObject.Add("ContentLocation", this.ContentLocation);
            if (service.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                jsonObject.Add("IsInline", this.IsInline);
            }
            return jsonObject;
        }
        InternalLoad(bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            this.service.GetAttachment(this, bodyType, additionalProperties);
        }
        Validate(attachmentIndex: number): void {
        }
        Load(): void {
            this.InternalLoad(null, null);
        }
    }
    interface IOwnedProperty {
        Owner: ServiceObject;
    }
    class AttachmentCollection extends ComplexPropertyCollection<Attachment> implements IOwnedProperty {
        private owner: Item = null;
        set Owner(value: ServiceObject) {
            var item: Item = ((value instanceof Item) ? <Item>value : null);
            EwsUtilities.Assert(item !== null, "AttachmentCollection.IOwnedProperty.set_Owner", "value is not a descendant of ItemBase");
            this.owner = item;
        }
        get Owner(): ServiceObject {
            return this.owner;
        }
        constructor() {
            super();
        }
        AddFileAttachment(fileName: string): FileAttachment;
        AddFileAttachment(name: string, fileName: string): FileAttachment;
        AddFileAttachment(name: string, contentStream: Stream): FileAttachment;
        AddFileAttachment(name: string, content: number[]): FileAttachment;
        AddFileAttachment(fileNameOrName: string, fileNameOrContentStream?: any): FileAttachment {
            if (arguments.length === 1 && (fileNameOrName === null || fileNameOrName.constructor === String)) {
                return this.AddFileAttachment_0(fileNameOrName);
            }
            if (arguments.length === 2 && (fileNameOrName === null || fileNameOrName.constructor === String) && (fileNameOrContentStream === null || fileNameOrContentStream.constructor === String)) {
                return this.AddFileAttachment_1(fileNameOrName, fileNameOrContentStream);
            }
            if (arguments.length === 2 && (fileNameOrName === null || fileNameOrName.constructor === String) && (fileNameOrContentStream === null || fileNameOrContentStream instanceof Stream)) {
                return this.AddFileAttachment_2(fileNameOrName, fileNameOrContentStream);
            }
            return this.AddFileAttachment_3(fileNameOrName, fileNameOrContentStream);
        }
        private AddFileAttachment_0(fileName: string): FileAttachment {
            return this.AddFileAttachment(Path.GetFileName(fileName), fileName);
        }
        private AddFileAttachment_1(name: string, fileName: string): FileAttachment {
            var fileAttachment: FileAttachment = new FileAttachment(this.owner);
            fileAttachment.Name = name;
            fileAttachment.FileName = fileName;
            super.InternalAdd(fileAttachment);
            return fileAttachment;
        }
        private AddFileAttachment_2(name: string, contentStream: Stream): FileAttachment {
            var fileAttachment: FileAttachment = new FileAttachment(this.owner);
            fileAttachment.Name = name;
            fileAttachment.ContentStream = contentStream;
            super.InternalAdd(fileAttachment);
            return fileAttachment;
        }
        private AddFileAttachment_3(name: string, content: number[]): FileAttachment {
            var fileAttachment: FileAttachment = new FileAttachment(this.owner);
            fileAttachment.Name = name;
            fileAttachment.Content = content;
            super.InternalAdd(fileAttachment);
            return fileAttachment;
        }
        AddItemAttachment<TItem>(): ItemAttachment<TItem> {
            if (new Type("TItem").GetCustomAttributes(new Type("AttachableAttribute"), false).length === 0) {
                throw new InvalidOperationException(NString.Format("Items of type {0} are not supported as attachments.", new Type("TItem").Name));
            }
            var itemAttachment: ItemAttachment<TItem> = new ItemAttachment<TItem>(this.owner);
            itemAttachment.Item = <TItem>(<any>EwsUtilities.CreateItemFromItemClass(itemAttachment, new Type("TItem"), true));
            super.InternalAdd(itemAttachment);
            return itemAttachment;
        }
        Clear(): void {
            super.InternalClear();
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            super.InternalRemoveAt(index);
        }
        Remove(attachment: Attachment): boolean {
            EwsUtilities.ValidateParam(attachment, "attachment");
            return super.InternalRemove(attachment);
        }
        CreateComplexProperty(xmlElementName: string): Attachment {
            if (xmlElementName !== null) {
                if (xmlElementName === "FileAttachment") {
                    return new FileAttachment(this.owner);
                }
                if (xmlElementName === "ItemAttachment") {
                    return new ItemAttachment(this.owner);
                }
            }
            return null;
        }
        CreateDefaultComplexProperty(): Attachment {
            throw new JsonDeserializationNotImplementedException();
        }
        GetCollectionItemXmlElementName(complexProperty: Attachment): string {
            if (complexProperty instanceof FileAttachment) {
                return "FileAttachment";
            }
            return "ItemAttachment";
        }
        Save(): void {
            var list: List<Attachment> = new List<Attachment>();
            var enumerator: List_Enumerator<Attachment> = this.RemovedItems.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    if (!current.IsNew) {
                        list.Add(current);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (list.Count > 0) {
                this.InternalDeleteAttachments(list);
            }
            list.Clear();
            var enumerator2: IEnumerator<Attachment> = super.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: Attachment = enumerator2.Current;
                    if (current2.IsNew) {
                        list.Add(current2);
                    }
                }
            }
            finally {
                if (enumerator2 !== null) {
                    enumerator2.Dispose();
                }
            }
            if (list.Count > 0) {
                if (this.owner.IsAttachment) {
                    this.InternalCreateAttachments(this.owner.ParentAttachment.Id, list);
                }
                else {
                    this.InternalCreateAttachments(this.owner.Id.UniqueId, list);
                }
            }
            var enumerator3: IEnumerator<Attachment> = super.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: Attachment = enumerator3.Current;
                    var itemAttachment: ItemAttachment = ((current3 instanceof ItemAttachment) ? <ItemAttachment>current3 : null);
                    if (itemAttachment !== null && itemAttachment.Item !== null) {
                        itemAttachment.Item.Attachments.Save();
                        itemAttachment.Item.ClearChangeLog();
                    }
                }
            }
            finally {
                if (enumerator3 !== null) {
                    enumerator3.Dispose();
                }
            }
            super.ClearChangeLog();
        }
        HasUnprocessedChanges(): boolean {
            var enumerator: IEnumerator<Attachment> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    if (current.IsNew) {
                        var result: boolean = true;
                        return result;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            var enumerator2: List_Enumerator<Attachment> = this.RemovedItems.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: Attachment = enumerator2.Current;
                    if (!current2.IsNew) {
                        var result: boolean = true;
                        return result;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            var enumerator3: IEnumerator<ItemAttachment> = Enumerable.OfType<ItemAttachment>(this).GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: ItemAttachment = enumerator3.Current;
                    if (current3.Item !== null && current3.Item.Attachments.HasUnprocessedChanges()) {
                        var result: boolean = true;
                        return result;
                    }
                }
            }
            finally {
                if (enumerator3 !== null) {
                    enumerator3.Dispose();
                }
            }
            return false;
        }
        ClearChangeLog(): void {
        }
        Validate(): void {
            var flag: boolean = false;
            for (var i: number = 0; i < this.AddedItems.Count; i = i + 1) {
                var attachment: Attachment = this.AddedItems.get_Item(i);
                if (attachment.IsNew) {
                    if (this.owner.IsNew && this.owner.Service.RequestedServerVersion >= ExchangeVersion.Exchange2010_SP2) {
                        var fileAttachment: FileAttachment = ((attachment instanceof FileAttachment) ? <FileAttachment>attachment : null);
                        if (fileAttachment !== null && fileAttachment.IsContactPhoto) {
                            if (flag) {
                                throw new ServiceValidationException(Strings.MultipleContactPhotosInAttachment);
                            }
                            flag = true;
                        }
                    }
                    attachment.Validate(i);
                }
            }
        }
        private InternalDeleteAttachments(attachments: IEnumerable<Attachment>): void {
            var serviceResponseCollection: ServiceResponseCollection<DeleteAttachmentResponse> = this.owner.Service.DeleteAttachments(attachments);
            var enumerator: IEnumerator<DeleteAttachmentResponse> = serviceResponseCollection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DeleteAttachmentResponse = enumerator.Current;
                    if (current.Result !== ServiceResult.Error) {
                        super.RemoveFromChangeLog(current.Attachment);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            if (serviceResponseCollection.OverallResult === ServiceResult.Error) {
                throw new DeleteAttachmentException(serviceResponseCollection, Strings.AtLeastOneAttachmentCouldNotBeDeleted);
            }
        }
        private InternalCreateAttachments(parentItemId: string, attachments: IEnumerable<Attachment>): void {
            var serviceResponseCollection: ServiceResponseCollection<CreateAttachmentResponse> = this.owner.Service.CreateAttachments(parentItemId, attachments);
            var enumerator: IEnumerator<CreateAttachmentResponse> = serviceResponseCollection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: CreateAttachmentResponse = enumerator.Current;
                    if (current.Result !== ServiceResult.Error) {
                        super.RemoveFromChangeLog(current.Attachment);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            if (serviceResponseCollection.OverallResult === ServiceResult.Error) {
                throw new CreateAttachmentException(serviceResponseCollection, Strings.AttachmentCreationFailed);
            }
        }
    }
    interface ISearchStringProvider {
        GetSearchString(): string;
    }
    class EmailAddress extends ComplexProperty implements ISearchStringProvider {
        static SmtpRoutingType: string = "SMTP";
        private name: string = null;
        private address: string = null;
        private routingType: string = null;
        private mailboxType: Nullable<MailboxType> = null;
        private id: ItemId = null;
        set Name(value: string) {
            (() => {
                var _p0 = [
                    this.name
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.name = _p0[0];
                return _r;
            })();
        }
        get Name(): string {
            return this.name;
        }
        set Address(value: string) {
            (() => {
                var _p0 = [
                    this.address
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.address = _p0[0];
                return _r;
            })();
        }
        get Address(): string {
            return this.address;
        }
        set RoutingType(value: string) {
            (() => {
                var _p0 = [
                    this.routingType
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.routingType = _p0[0];
                return _r;
            })();
        }
        get RoutingType(): string {
            return this.routingType;
        }
        set MailboxType(value: Nullable<MailboxType>) {
            (() => {
                var _p0 = [
                    this.mailboxType
                ];
                var _r = this.SetFieldValue<Nullable<MailboxType>>(_p0, value);
                this.mailboxType = _p0[0];
                return _r;
            })();
        }
        get MailboxType(): Nullable<MailboxType> {
            return this.mailboxType;
        }
        set Id(value: ItemId) {
            (() => {
                var _p0 = [
                    this.id
                ];
                var _r = this.SetFieldValue<ItemId>(_p0, value);
                this.id = _p0[0];
                return _r;
            })();
        }
        get Id(): ItemId {
            return this.id;
        }
        constructor();
        constructor(smtpAddress: string);
        constructor(name: string, smtpAddress: string);
        constructor(name: string, address: string, routingType: string);
        constructor(name: string, address: string, routingType: string, mailboxType: MailboxType);
        constructor(name: string, address: string, routingType: string, mailboxType: MailboxType, itemId: ItemId);
        constructor(mailbox: EmailAddress);
        constructor(smtpAddressOrNameOrMailbox?: any, smtpAddressOrAddress?: string, routingType?: string, mailboxType?: MailboxType, itemId?: ItemId) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String)) {
                this.constructor_1(smtpAddressOrNameOrMailbox);
                return;
            }
            if (arguments.length === 2 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String)) {
                this.constructor_2(smtpAddressOrNameOrMailbox, smtpAddressOrAddress);
                return;
            }
            if (arguments.length === 3 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String) && (routingType === null || routingType.constructor === String)) {
                this.constructor_3(smtpAddressOrNameOrMailbox, smtpAddressOrAddress, routingType);
                return;
            }
            if (arguments.length === 4 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String) && (routingType === null || routingType.constructor === String) && (mailboxType === null || mailboxType.constructor === Number)) {
                this.constructor_4(smtpAddressOrNameOrMailbox, smtpAddressOrAddress, routingType, mailboxType);
                return;
            }
            if (arguments.length === 5 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String) && (routingType === null || routingType.constructor === String) && (mailboxType === null || mailboxType.constructor === Number) && (itemId === null || itemId instanceof ItemId)) {
                this.constructor_5(smtpAddressOrNameOrMailbox, smtpAddressOrAddress, routingType, mailboxType, itemId);
                return;
            }
            this.constructor_6(smtpAddressOrNameOrMailbox);
        }
        private constructor_0(): void {
        }
        private constructor_1(smtpAddress: string): void {
            this.constructor_0();
            this.address = smtpAddress;
        }
        private constructor_2(name: string, smtpAddress: string): void {
            this.constructor_1(smtpAddress);
            this.name = name;
        }
        private constructor_3(name: string, address: string, routingType: string): void {
            this.constructor_2(name, address);
            this.routingType = routingType;
        }
        private constructor_4(name: string, address: string, routingType: string, mailboxType: MailboxType): void {
            this.constructor_3(name, address, routingType);
            this.mailboxType = new Nullable<MailboxType>(mailboxType);
        }
        private constructor_5(name: string, address: string, routingType: string, mailboxType: MailboxType, itemId: ItemId): void {
            this.constructor_3(name, address, routingType);
            this.mailboxType = new Nullable<MailboxType>(mailboxType);
            this.id = itemId;
        }
        private constructor_6(mailbox: EmailAddress): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(mailbox, "mailbox");
            this.Name = mailbox.Name;
            this.Address = mailbox.Address;
            this.RoutingType = mailbox.RoutingType;
            this.MailboxType = mailbox.MailboxType;
            this.Id = mailbox.Id;
        }
        static op_Implicit(smtpAddress: string): EmailAddress {
            return new EmailAddress(smtpAddress);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Name") {
                    this.name = reader.ReadElementValue();
                    return true;
                }
                if (localName === "EmailAddress") {
                    this.address = reader.ReadElementValue();
                    return true;
                }
                if (localName === "RoutingType") {
                    this.routingType = reader.ReadElementValue();
                    return true;
                }
                if (localName === "MailboxType") {
                    this.mailboxType = new Nullable<MailboxType>(reader.ReadElementValue<MailboxType>());
                    return true;
                }
                if (localName === "ItemId") {
                    this.id = new ItemId();
                    this.id.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Name")) {
                            if (!(a === "EmailAddress")) {
                                if (!(a === "RoutingType")) {
                                    if (!(a === "MailboxType")) {
                                        if (a === "ItemId") {
                                            this.id = new ItemId();
                                            this.id.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                        }
                                    }
                                    else {
                                        this.mailboxType = new Nullable<MailboxType>(jsonProperty.ReadEnumValue<MailboxType>(current));
                                    }
                                }
                                else {
                                    this.routingType = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.address = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.name = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Name", this.Name);
            writer.WriteElementValue(XmlNamespace.Types, "EmailAddress", this.Address);
            writer.WriteElementValue(XmlNamespace.Types, "RoutingType", this.RoutingType);
            writer.WriteElementValue(XmlNamespace.Types, "MailboxType", this.MailboxType);
            if (this.Id !== null) {
                this.Id.WriteToXml(writer, "ItemId");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Name", this.Name);
            jsonObject.Add("EmailAddress", this.Address);
            jsonObject.Add("RoutingType", this.RoutingType);
            jsonObject.Add("MailboxType", <Enum>this.MailboxType);
            if (this.Id !== null) {
                jsonObject.Add("ItemId", this.Id.InternalToJson(service));
            }
            return jsonObject;
        }
        GetSearchString(): string {
            return this.Address;
        }
        ToString(): string {
            if (NString.IsNullOrEmpty(this.Address)) {
                return NString.Empty;
            }
            var text: string;
            if (!NString.IsNullOrEmpty(this.RoutingType)) {
                text = this.RoutingType + ":" + this.Address;
            }
            else {
                text = this.Address;
            }
            if (!NString.IsNullOrEmpty(this.Name)) {
                return this.Name + " <" + text + ">";
            }
            return text;
        }
    }
    class Attendee extends EmailAddress {
        private responseType: Nullable<MeetingResponseType> = null;
        private lastResponseTime: Nullable<DateTime> = null;
        get ResponseType(): Nullable<MeetingResponseType> {
            return this.responseType;
        }
        get LastResponseTime(): Nullable<DateTime> {
            return this.lastResponseTime;
        }
        constructor();
        constructor(smtpAddress: string);
        constructor(name: string, smtpAddress: string);
        constructor(name: string, smtpAddress: string, routingType: string);
        constructor(mailbox: EmailAddress);
        constructor(smtpAddressOrNameOrMailbox?: any, smtpAddress?: string, routingType?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String)) {
                this.constructor_1(smtpAddressOrNameOrMailbox);
                return;
            }
            if (arguments.length === 2 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddress === null || smtpAddress.constructor === String)) {
                this.constructor_2(smtpAddressOrNameOrMailbox, smtpAddress);
                return;
            }
            if (arguments.length === 3 && (smtpAddressOrNameOrMailbox === null || smtpAddressOrNameOrMailbox.constructor === String) && (smtpAddress === null || smtpAddress.constructor === String) && (routingType === null || routingType.constructor === String)) {
                this.constructor_3(smtpAddressOrNameOrMailbox, smtpAddress, routingType);
                return;
            }
            this.constructor_4(smtpAddressOrNameOrMailbox);
        }
        private constructor_0(): void {
        }
        private constructor_1(smtpAddress: string): void {
            EwsUtilities.ValidateParam(smtpAddress, "smtpAddress");
        }
        private constructor_2(name: string, smtpAddress: string): void {
        }
        private constructor_3(name: string, smtpAddress: string, routingType: string): void {
        }
        private constructor_4(mailbox: EmailAddress): void {
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Mailbox") {
                    this.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "ResponseType") {
                    this.responseType = new Nullable<MeetingResponseType>(reader.ReadElementValue<MeetingResponseType>());
                    return true;
                }
                if (localName === "LastResponseTime") {
                    this.lastResponseTime = reader.ReadElementValueAsDateTime();
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(this.Namespace, "Mailbox");
            super.WriteElementsToXml(writer);
            writer.WriteEndElement();
        }
    }
    class AttendeeCollection extends ComplexPropertyCollection<Attendee>
    {
        constructor() {
            super();
        }
        Add(attendee: Attendee): void;
        Add(smtpAddress: string): void;
        Add(name: string, smtpAddress: string): void;
        Add(attendeeOrSmtpAddressOrName: any, smtpAddress?: string): void {
            if (arguments.length === 1 && (attendeeOrSmtpAddressOrName === null || attendeeOrSmtpAddressOrName instanceof Attendee)) {
                this.Add_0(attendeeOrSmtpAddressOrName);
                return;
            }
            if (arguments.length === 1 && (attendeeOrSmtpAddressOrName === null || attendeeOrSmtpAddressOrName.constructor === String)) {
                this.Add_1(attendeeOrSmtpAddressOrName);
                return;
            }
            this.Add_2(attendeeOrSmtpAddressOrName, smtpAddress);
        }
        private Add_0(attendee: Attendee): void {
            super.InternalAdd(attendee);
        }
        private Add_1(smtpAddress: string): Attendee {
            var attendee: Attendee = new Attendee(smtpAddress);
            super.InternalAdd(attendee);
            return attendee;
        }
        private Add_2(name: string, smtpAddress: string): Attendee {
            var attendee: Attendee = new Attendee(name, smtpAddress);
            super.InternalAdd(attendee);
            return attendee;
        }
        Clear(): void {
            super.InternalClear();
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            super.InternalRemoveAt(index);
        }
        Remove(attendee: Attendee): boolean {
            EwsUtilities.ValidateParam(attendee, "attendee");
            return super.InternalRemove(attendee);
        }
        CreateComplexProperty(xmlElementName: string): Attendee {
            if (xmlElementName === "Attendee") {
                return new Attendee();
            }
            return null;
        }
        CreateDefaultComplexProperty(): Attendee {
            return new Attendee();
        }
        GetCollectionItemXmlElementName(attendee: Attendee): string {
            return "Attendee";
        }
    }
    class ByteArrayArray extends ComplexProperty implements IJsonCollectionDeserializer {
        private static ItemXmlElementName: string = "Base64Binary";
        private content: List<number[]> = new List<number[]>();
        get Content(): number[][] {
            return this.content.ToArray();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (reader.LocalName === "Base64Binary") {
                this.content.Add(reader.ReadBase64ElementValue());
                return true;
            }
            return false;
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                this.content.Add(Convert.FromBase64String(((obj instanceof string) ? <string>obj : null)));
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: List_Enumerator<number[]> = this.content.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: number[] = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, "Base64Binary");
                    writer.WriteBase64ElementValue(current);
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<string> = new List<string>(this.content.Count);
            var enumerator: List_Enumerator<number[]> = this.content.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: number[] = enumerator.Current;
                    list.Add(Convert.ToBase64String(current));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list.ToArray();
        }
        constructor() {
            super();
        }
    }
    class ChangeHighlights extends ComplexProperty {
        private hasLocationChanged: boolean = false;
        private location: string = null;
        private hasStartTimeChanged: boolean = false;
        private start: DateTime = null;
        private hasEndTimeChanged: boolean = false;
        private end: DateTime = null;
        get HasLocationChanged(): boolean {
            return this.hasLocationChanged;
        }
        get Location(): string {
            return this.location;
        }
        get HasStartTimeChanged(): boolean {
            return this.hasStartTimeChanged;
        }
        get Start(): DateTime {
            return this.start;
        }
        get HasEndTimeChanged(): boolean {
            return this.hasEndTimeChanged;
        }
        get End(): DateTime {
            return this.end;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "HasLocationChanged":
                    this.hasLocationChanged = reader.ReadElementValue<boolean>();
                    return true;
                case "Location":
                    this.location = reader.ReadElementValue();
                    return true;
                case "HasStartTimeChanged":
                    this.hasStartTimeChanged = reader.ReadElementValue<boolean>();
                    return true;
                case "Start":
                    this.start = reader.ReadElementValueAsDateTime().Value;
                    return true;
                case "HasEndTimeChanged":
                    this.hasEndTimeChanged = reader.ReadElementValue<boolean>();
                    return true;
                case "End":
                    this.end = reader.ReadElementValueAsDateTime().Value;
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "HasLocationChanged":
                            this.hasLocationChanged = jsonProperty.ReadAsBool(current);
                            break;
                        case "Location":
                            this.location = jsonProperty.ReadAsString(current);
                            break;
                        case "HasStartTimeChanged":
                            this.hasStartTimeChanged = jsonProperty.ReadAsBool(current);
                            break;
                        case "Start":
                            this.start = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                            break;
                        case "HasEndTimeChanged":
                            this.hasEndTimeChanged = jsonProperty.ReadAsBool(current);
                            break;
                        case "End":
                            this.end = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class ClientApp extends ComplexProperty {
        Manifest: XmlDocument = null;
        Metadata: ClientAppMetadata = null;
        constructor() {
            super();
            this.Namespace = XmlNamespace.Types;
        }
        static ReadToXmlDocument(reader: EwsServiceXmlReader): SafeXmlDocument {
            var memoryStream: MemoryStream = new MemoryStream();
            var result: SafeXmlDocument;
            try {
                reader.ReadBase64ElementValue(memoryStream);
                memoryStream.Position = 0;
                var safeXmlDocument: SafeXmlDocument = new SafeXmlDocument();
                safeXmlDocument.Load(memoryStream);
                result = safeXmlDocument;
            }
            finally {
                if (memoryStream !== null) {
                    (<IDisposable>memoryStream).Dispose();
                }
            }
            return result;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Manifest") {
                    this.Manifest = ClientApp.ReadToXmlDocument(reader);
                    return true;
                }
                if (localName === "Metadata") {
                    this.Metadata = new ClientAppMetadata();
                    this.Metadata.LoadFromXml(reader, XmlNamespace.Types, "Metadata");
                    return true;
                }
            }
            return false;
        }
    }
    class ClientAppMetadata extends ComplexProperty {
        EndNodeUrl: string = null;
        ActionUrl: string = null;
        AppStatus: string = null;
        constructor() {
            super();
            this.Namespace = XmlNamespace.Types;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "EndNodeUrl") {
                    this.EndNodeUrl = reader.ReadElementValue<string>();
                    return true;
                }
                if (localName === "ActionUrl") {
                    this.ActionUrl = reader.ReadElementValue<string>();
                    return true;
                }
                if (localName === "AppStatus") {
                    this.AppStatus = reader.ReadElementValue<string>();
                    return true;
                }
            }
            return false;
        }
    }
    class ClientExtension extends ComplexProperty {
        Type: ExtensionType = 0;
        Scope: ExtensionInstallScope = 0;
        ManifestStream: Stream = null;
        MarketplaceAssetID: string = null;
        MarketplaceContentMarket: string = null;
        AppStatus: string = null;
        Etoken: string = null;
        IsAvailable: boolean = false;
        IsMandatory: boolean = false;
        IsEnabledByDefault: boolean = false;
        ProvidedTo: ClientExtensionProvidedTo = 0;
        SpecificUsers: StringList = null;
        constructor();
        constructor(type: ExtensionType, scope: ExtensionInstallScope, manifestStream: Stream, marketplaceAssetID: string, marketplaceContentMarket: string, isAvailable: boolean, isMandatory: boolean, isEnabledByDefault: boolean, providedTo: ClientExtensionProvidedTo, specificUsers: StringList, appStatus: string, etoken: string);
        constructor(type?: ExtensionType, scope?: ExtensionInstallScope, manifestStream?: Stream, marketplaceAssetID?: string, marketplaceContentMarket?: string, isAvailable?: boolean, isMandatory?: boolean, isEnabledByDefault?: boolean, providedTo?: ClientExtensionProvidedTo, specificUsers?: StringList, appStatus?: string, etoken?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(type, scope, manifestStream, marketplaceAssetID, marketplaceContentMarket, isAvailable, isMandatory, isEnabledByDefault, providedTo, specificUsers, appStatus, etoken);
        }
        private constructor_0(): void {
            this.Namespace = XmlNamespace.Types;
        }
        private constructor_1(type: ExtensionType, scope: ExtensionInstallScope, manifestStream: Stream, marketplaceAssetID: string, marketplaceContentMarket: string, isAvailable: boolean, isMandatory: boolean, isEnabledByDefault: boolean, providedTo: ClientExtensionProvidedTo, specificUsers: StringList, appStatus: string, etoken: string): void {
            this.constructor_0();
            this.Type = type;
            this.Scope = scope;
            this.ManifestStream = manifestStream;
            this.MarketplaceAssetID = marketplaceAssetID;
            this.MarketplaceContentMarket = marketplaceContentMarket;
            this.IsAvailable = isAvailable;
            this.IsMandatory = isMandatory;
            this.IsEnabledByDefault = isEnabledByDefault;
            this.ProvidedTo = providedTo;
            this.SpecificUsers = specificUsers;
            this.AppStatus = appStatus;
            this.Etoken = etoken;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            var value: string = reader.ReadAttributeValue("Type");
            if (!NString.IsNullOrEmpty(value)) {
                this.Type = reader.ReadAttributeValue<ExtensionType>("Type");
            }
            value = reader.ReadAttributeValue("Scope");
            if (!NString.IsNullOrEmpty(value)) {
                this.Scope = reader.ReadAttributeValue<ExtensionInstallScope>("Scope");
            }
            value = reader.ReadAttributeValue("MarketplaceAssetId");
            if (!NString.IsNullOrEmpty(value)) {
                this.MarketplaceAssetID = reader.ReadAttributeValue<string>("MarketplaceAssetId");
            }
            value = reader.ReadAttributeValue("MarketplaceContentMarket");
            if (!NString.IsNullOrEmpty(value)) {
                this.MarketplaceContentMarket = reader.ReadAttributeValue<string>("MarketplaceContentMarket");
            }
            value = reader.ReadAttributeValue("AppStatus");
            if (!NString.IsNullOrEmpty(value)) {
                this.AppStatus = reader.ReadAttributeValue<string>("AppStatus");
            }
            value = reader.ReadAttributeValue("Etoken");
            if (!NString.IsNullOrEmpty(value)) {
                this.Etoken = reader.ReadAttributeValue<string>("Etoken");
            }
            value = reader.ReadAttributeValue("IsAvailable");
            if (!NString.IsNullOrEmpty(value)) {
                this.IsAvailable = reader.ReadAttributeValue<boolean>("IsAvailable");
            }
            value = reader.ReadAttributeValue("IsMandatory");
            if (!NString.IsNullOrEmpty(value)) {
                this.IsMandatory = reader.ReadAttributeValue<boolean>("IsMandatory");
            }
            value = reader.ReadAttributeValue("IsEnabledByDefault");
            if (!NString.IsNullOrEmpty(value)) {
                this.IsEnabledByDefault = reader.ReadAttributeValue<boolean>("IsEnabledByDefault");
            }
            value = reader.ReadAttributeValue("ProvidedTo");
            if (!NString.IsNullOrEmpty(value)) {
                this.ProvidedTo = reader.ReadAttributeValue<ClientExtensionProvidedTo>("ProvidedTo");
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Type", this.Type);
            writer.WriteAttributeValue("Scope", this.Scope);
            writer.WriteAttributeValue("MarketplaceAssetId", this.MarketplaceAssetID);
            writer.WriteAttributeValue("MarketplaceContentMarket", this.MarketplaceContentMarket);
            writer.WriteAttributeValue("AppStatus", this.AppStatus);
            writer.WriteAttributeValue("Etoken", this.Etoken);
            writer.WriteAttributeValue("IsAvailable", this.IsAvailable);
            writer.WriteAttributeValue("IsMandatory", this.IsMandatory);
            writer.WriteAttributeValue("IsEnabledByDefault", this.IsEnabledByDefault);
            writer.WriteAttributeValue("ProvidedTo", this.ProvidedTo);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Manifest") {
                    this.ManifestStream = new MemoryStream();
                    reader.ReadBase64ElementValue(this.ManifestStream);
                    this.ManifestStream.Position = 0;
                    return true;
                }
                if (localName === "SpecificUsers") {
                    this.SpecificUsers = new StringList();
                    this.SpecificUsers.LoadFromXml(reader, XmlNamespace.Types, "SpecificUsers");
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.SpecificUsers !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "SpecificUsers");
                this.SpecificUsers.WriteElementsToXml(writer);
                writer.WriteEndElement();
            }
            if (this.ManifestStream !== null) {
                if (this.ManifestStream.CanSeek) {
                    this.ManifestStream.Position = 0;
                }
                writer.WriteStartElement(XmlNamespace.Types, "Manifest");
                writer.WriteBase64ElementValue(this.ManifestStream);
                writer.WriteEndElement();
            }
        }
    }
    class ClientAccessTokenRequest extends ComplexProperty {
        private id: string = null;
        private tokenType: ClientAccessTokenType = 0;
        private scope: string = null;
        get Id(): string {
            return this.id;
        }
        get TokenType(): ClientAccessTokenType {
            return this.tokenType;
        }
        get Scope(): string {
            return this.scope;
        }
        constructor(id: string, tokenType: ClientAccessTokenType);
        constructor(id: string, tokenType: ClientAccessTokenType, scope: string);
        constructor(id: string, tokenType: ClientAccessTokenType, scope?: string) {
            super();
            if (arguments.length === 2 && (id === null || id.constructor === String) && (tokenType === null || tokenType.constructor === Number)) {
                this.constructor_0(id, tokenType);
                return;
            }
            this.constructor_1(id, tokenType, scope);
        }
        private constructor_0(id: string, tokenType: ClientAccessTokenType): void {
            this.constructor_1(id, tokenType, null);
        }
        private constructor_1(id: string, tokenType: ClientAccessTokenType, scope: string): void {
            this.id = id;
            this.tokenType = tokenType;
            this.scope = scope;
        }
    }
    class CompleteName extends ComplexProperty {
        private title: string = null;
        private givenName: string = null;
        private middleName: string = null;
        private surname: string = null;
        private suffix: string = null;
        private initials: string = null;
        private fullName: string = null;
        private nickname: string = null;
        private yomiGivenName: string = null;
        private yomiSurname: string = null;
        get Title(): string {
            return this.title;
        }
        get GivenName(): string {
            return this.givenName;
        }
        get MiddleName(): string {
            return this.middleName;
        }
        get Surname(): string {
            return this.surname;
        }
        get Suffix(): string {
            return this.suffix;
        }
        get Initials(): string {
            return this.initials;
        }
        get FullName(): string {
            return this.fullName;
        }
        get NickName(): string {
            return this.nickname;
        }
        get YomiGivenName(): string {
            return this.yomiGivenName;
        }
        get YomiSurname(): string {
            return this.yomiSurname;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Title":
                    this.title = reader.ReadElementValue();
                    return true;
                case "FirstName":
                    this.givenName = reader.ReadElementValue();
                    return true;
                case "MiddleName":
                    this.middleName = reader.ReadElementValue();
                    return true;
                case "LastName":
                    this.surname = reader.ReadElementValue();
                    return true;
                case "Suffix":
                    this.suffix = reader.ReadElementValue();
                    return true;
                case "Initials":
                    this.initials = reader.ReadElementValue();
                    return true;
                case "FullName":
                    this.fullName = reader.ReadElementValue();
                    return true;
                case "Nickname":
                    this.nickname = reader.ReadElementValue();
                    return true;
                case "YomiFirstName":
                    this.yomiGivenName = reader.ReadElementValue();
                    return true;
                case "YomiLastName":
                    this.yomiSurname = reader.ReadElementValue();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "Title":
                            this.title = jsonProperty.ReadAsString(current);
                            break;
                        case "FirstName":
                            this.givenName = jsonProperty.ReadAsString(current);
                            break;
                        case "MiddleName":
                            this.middleName = jsonProperty.ReadAsString(current);
                            break;
                        case "LastName":
                            this.surname = jsonProperty.ReadAsString(current);
                            break;
                        case "Suffix":
                            this.suffix = jsonProperty.ReadAsString(current);
                            break;
                        case "Initials":
                            this.initials = jsonProperty.ReadAsString(current);
                            break;
                        case "FullName":
                            this.fullName = jsonProperty.ReadAsString(current);
                            break;
                        case "Nickname":
                            this.nickname = jsonProperty.ReadAsString(current);
                            break;
                        case "YomiFirstName":
                            this.yomiGivenName = jsonProperty.ReadAsString(current);
                            break;
                        case "YomiLastName":
                            this.yomiSurname = jsonProperty.ReadAsString(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Title", this.Title);
            writer.WriteElementValue(XmlNamespace.Types, "FirstName", this.GivenName);
            writer.WriteElementValue(XmlNamespace.Types, "MiddleName", this.MiddleName);
            writer.WriteElementValue(XmlNamespace.Types, "LastName", this.Surname);
            writer.WriteElementValue(XmlNamespace.Types, "Suffix", this.Suffix);
            writer.WriteElementValue(XmlNamespace.Types, "Initials", this.Initials);
            writer.WriteElementValue(XmlNamespace.Types, "FullName", this.FullName);
            writer.WriteElementValue(XmlNamespace.Types, "Nickname", this.NickName);
            writer.WriteElementValue(XmlNamespace.Types, "YomiFirstName", this.YomiGivenName);
            writer.WriteElementValue(XmlNamespace.Types, "YomiLastName", this.YomiSurname);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Title", this.Title);
            jsonObject.Add("FirstName", this.GivenName);
            jsonObject.Add("MiddleName", this.MiddleName);
            jsonObject.Add("LastName", this.Surname);
            jsonObject.Add("Suffix", this.Suffix);
            jsonObject.Add("Initials", this.Initials);
            jsonObject.Add("FullName", this.FullName);
            jsonObject.Add("Nickname", this.NickName);
            jsonObject.Add("YomiFirstName", this.YomiGivenName);
            jsonObject.Add("YomiLastName", this.YomiSurname);
            return jsonObject;
        }
        constructor() {
            super();
        }
    }
    class ContactEntity extends ExtractedEntity {
        PersonName: string = null;
        BusinessName: string = null;
        PhoneNumbers: ContactPhoneEntityCollection = null;
        Urls: StringList = null;
        EmailAddresses: StringList = null;
        Addresses: StringList = null;
        ContactString: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "PersonName":
                    this.PersonName = reader.ReadElementValue();
                    return true;
                case "BusinessName":
                    this.BusinessName = reader.ReadElementValue();
                    return true;
                case "PhoneNumbers":
                    this.PhoneNumbers = new ContactPhoneEntityCollection();
                    this.PhoneNumbers.LoadFromXml(reader, XmlNamespace.Types, "PhoneNumbers");
                    return true;
                case "Urls":
                    this.Urls = new StringList("Url");
                    this.Urls.LoadFromXml(reader, XmlNamespace.Types, "Urls");
                    return true;
                case "EmailAddresses":
                    this.EmailAddresses = new StringList("EmailAddress");
                    this.EmailAddresses.LoadFromXml(reader, XmlNamespace.Types, "EmailAddresses");
                    return true;
                case "Addresses":
                    this.Addresses = new StringList("Address");
                    this.Addresses.LoadFromXml(reader, XmlNamespace.Types, "Addresses");
                    return true;
                case "ContactString":
                    this.ContactString = reader.ReadElementValue();
                    return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class ContactEntityCollection extends ComplexPropertyCollection<ContactEntity>
    {
        constructor();
        constructor(collection: IEnumerable<ContactEntity>);
        constructor(collection?: IEnumerable<ContactEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<ContactEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<ContactEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): ContactEntity {
            return new ContactEntity();
        }
        CreateDefaultComplexProperty(): ContactEntity {
            return new ContactEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: ContactEntity): string {
            return "Contact";
        }
    }
    class ContactPhoneEntity extends ComplexProperty {
        OriginalPhoneString: string = null;
        PhoneString: string = null;
        Type: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "OriginalPhoneString") {
                    this.OriginalPhoneString = reader.ReadElementValue();
                    return true;
                }
                if (localName === "PhoneString") {
                    this.PhoneString = reader.ReadElementValue();
                    return true;
                }
                if (localName === "Type") {
                    this.Type = reader.ReadElementValue();
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class ContactPhoneEntityCollection extends ComplexPropertyCollection<ContactPhoneEntity>
    {
        constructor();
        constructor(collection: IEnumerable<ContactPhoneEntity>);
        constructor(collection?: IEnumerable<ContactPhoneEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<ContactPhoneEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<ContactPhoneEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): ContactPhoneEntity {
            return new ContactPhoneEntity();
        }
        CreateDefaultComplexProperty(): ContactPhoneEntity {
            return new ContactPhoneEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: ContactPhoneEntity): string {
            return "Phone";
        }
    }
    class ConversationNode extends ComplexProperty {
        private propertySet: PropertySet = null;
        InternetMessageId: string = null;
        ParentInternetMessageId: string = null;
        Items: List<Item> = null;
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "InternetMessageId") {
                    this.InternetMessageId = reader.ReadElementValue();
                    return true;
                }
                if (localName === "ParentInternetMessageId") {
                    this.ParentInternetMessageId = reader.ReadElementValue();
                    return true;
                }
                if (localName === "Items") {
                    this.Items = reader.ReadServiceObjectsCollectionFromXml<Item>(XmlNamespace.Types, "Items", this.GetObjectInstance, true, this.propertySet, false);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.InternetMessageId = jsonProperty.ReadAsString("ConversationIndex");
            if (jsonProperty.ContainsKey("ParentInternetMessageId")) {
                this.ParentInternetMessageId = jsonProperty.ReadAsString("ParentInternetMessageId");
            }
            if (jsonProperty.ContainsKey("Items")) {
                var ewsServiceJsonReader: EwsServiceJsonReader = new EwsServiceJsonReader(service);
                this.Items = ewsServiceJsonReader.ReadServiceObjectsCollectionFromJson<Item>(jsonProperty, "Items", this.GetObjectInstance, false, this.propertySet, false);
            }
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
        }
        GetXmlElementName(): string {
            return "ConversationNode";
        }
    }
    class ConversationNodeCollection extends ComplexPropertyCollection<ConversationNode> implements IJsonCollectionDeserializer {
        private propertySet: PropertySet = null;
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
        }
        CreateComplexProperty(xmlElementName: string): ConversationNode {
            return new ConversationNode(this.propertySet);
        }
        CreateDefaultComplexProperty(): ConversationNode {
            return new ConversationNode(this.propertySet);
        }
        GetCollectionItemXmlElementName(complexProperty: ConversationNode): string {
            return complexProperty.GetXmlElementName();
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject !== null) {
                    var conversationNode: ConversationNode = new ConversationNode(this.propertySet);
                    conversationNode.LoadFromJson(jsonObject, service);
                    super.InternalAdd(conversationNode);
                }
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
    }
    class ConversationRequest extends ComplexProperty implements ISelfValidate, IJsonSerializable {
        ConversationId: ConversationId = null;
        SyncState: string = null;
        constructor();
        constructor(conversationId: ConversationId, syncState: string);
        constructor(conversationId?: ConversationId, syncState?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(conversationId, syncState);
        }
        private constructor_0(): void {
        }
        private constructor_1(conversationId: ConversationId, syncState: string): void {
            this.ConversationId = conversationId;
            this.SyncState = syncState;
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            this.ConversationId.WriteToXml(writer);
            if (this.SyncState !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "SyncState", this.SyncState);
            }
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ConversationId", this.ConversationId.InternalToJson(service));
            if (!NString.IsNullOrEmpty(this.SyncState)) {
                jsonObject.Add("SyncState", this.SyncState);
            }
            return jsonObject;
        }
        InternalValidate(): void {
            EwsUtilities.ValidateParam(this.ConversationId, "ConversationId");
        }
    }
    class ConversationResponse extends ComplexProperty {
        private propertySet: PropertySet = null;
        ConversationId: ConversationId = null;
        SyncState: string = null;
        ConversationNodes: ConversationNodeCollection = null;
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "ConversationId") {
                    this.ConversationId = new ConversationId();
                    this.ConversationId.LoadFromXml(reader, "ConversationId");
                    return true;
                }
                if (localName === "SyncState") {
                    this.SyncState = reader.ReadElementValue();
                    return true;
                }
                if (localName === "ConversationNodes") {
                    this.ConversationNodes = new ConversationNodeCollection(this.propertySet);
                    this.ConversationNodes.LoadFromXml(reader, "ConversationNodes");
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.ConversationId = new ConversationId();
            this.ConversationId.LoadFromJson(jsonProperty.ReadAsJsonObject("ConversationId"), service);
            if (jsonProperty.ContainsKey("SyncState")) {
                this.SyncState = jsonProperty.ReadAsString("SyncState");
            }
            this.ConversationNodes = new ConversationNodeCollection(this.propertySet);
            (<IJsonCollectionDeserializer>this.ConversationNodes).CreateFromJsonCollection(jsonProperty.ReadAsArray("ConversationNodes"), service);
        }
    }
    class DelegatePermissions extends ComplexProperty {
        delegateFolderPermissions: Dictionary<string, DelegatePermissions_DelegateFolderPermission> = null;
        set CalendarFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("CalendarFolderPermissionLevel").PermissionLevel = value;
        }
        get CalendarFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("CalendarFolderPermissionLevel").PermissionLevel;
        }
        set TasksFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("TasksFolderPermissionLevel").PermissionLevel = value;
        }
        get TasksFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("TasksFolderPermissionLevel").PermissionLevel;
        }
        set InboxFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("InboxFolderPermissionLevel").PermissionLevel = value;
        }
        get InboxFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("InboxFolderPermissionLevel").PermissionLevel;
        }
        set ContactsFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("ContactsFolderPermissionLevel").PermissionLevel = value;
        }
        get ContactsFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("ContactsFolderPermissionLevel").PermissionLevel;
        }
        set NotesFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("NotesFolderPermissionLevel").PermissionLevel = value;
        }
        get NotesFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("NotesFolderPermissionLevel").PermissionLevel;
        }
        set JournalFolderPermissionLevel(value: DelegateFolderPermissionLevel) {
            this.delegateFolderPermissions.get_Item("JournalFolderPermissionLevel").PermissionLevel = value;
        }
        get JournalFolderPermissionLevel(): DelegateFolderPermissionLevel {
            return this.delegateFolderPermissions.get_Item("JournalFolderPermissionLevel").PermissionLevel;
        }
        constructor() {
            super();
            var dictionary: Dictionary<string, DelegatePermissions_DelegateFolderPermission> = new Dictionary<string, DelegatePermissions_DelegateFolderPermission>();
            dictionary.Add("CalendarFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            dictionary.Add("TasksFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            dictionary.Add("InboxFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            dictionary.Add("ContactsFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            dictionary.Add("NotesFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            dictionary.Add("JournalFolderPermissionLevel", new DelegatePermissions_DelegateFolderPermission());
            this.delegateFolderPermissions = dictionary;
        }
        Reset(): void {
            var enumerator: Dictionary_ValueCollection_Enumerator<string, DelegatePermissions_DelegateFolderPermission> = this.delegateFolderPermissions.Values.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DelegatePermissions_DelegateFolderPermission = enumerator.Current;
                    current.Reset();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var delegateFolderPermission: DelegatePermissions_DelegateFolderPermission = null;
            if ((() => {
                var _p0 = [
                    delegateFolderPermission
                ];
                var _r = this.delegateFolderPermissions.TryGetValue(reader.LocalName, _p0);
                delegateFolderPermission = _p0[0];
                return _r;
            })()) {
                delegateFolderPermission.Initialize(reader.ReadElementValue<DelegateFolderPermissionLevel>());
            }
            return delegateFolderPermission !== null;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var delegateFolderPermission: DelegatePermissions_DelegateFolderPermission = null;
                    if ((() => {
                        var _p0 = [
                            delegateFolderPermission
                        ];
                        var _r = this.delegateFolderPermissions.TryGetValue(current, _p0);
                        delegateFolderPermission = _p0[0];
                        return _r;
                    })()) {
                        delegateFolderPermission.Initialize(jsonProperty.ReadEnumValue<DelegateFolderPermissionLevel>(current));
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.WritePermissionToXml(writer, "CalendarFolderPermissionLevel");
            this.WritePermissionToXml(writer, "TasksFolderPermissionLevel");
            this.WritePermissionToXml(writer, "InboxFolderPermissionLevel");
            this.WritePermissionToXml(writer, "ContactsFolderPermissionLevel");
            this.WritePermissionToXml(writer, "NotesFolderPermissionLevel");
            this.WritePermissionToXml(writer, "JournalFolderPermissionLevel");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.WritePermissionToJson(jsonObject, "CalendarFolderPermissionLevel");
            this.WritePermissionToJson(jsonObject, "TasksFolderPermissionLevel");
            this.WritePermissionToJson(jsonObject, "InboxFolderPermissionLevel");
            this.WritePermissionToJson(jsonObject, "ContactsFolderPermissionLevel");
            this.WritePermissionToJson(jsonObject, "NotesFolderPermissionLevel");
            this.WritePermissionToJson(jsonObject, "JournalFolderPermissionLevel");
            return jsonObject;
        }
        WritePermissionToJson(jsonProperty: JsonObject, elementName: string): void {
            var permissionLevel: DelegateFolderPermissionLevel = this.delegateFolderPermissions.get_Item(elementName).PermissionLevel;
            if (permissionLevel !== DelegateFolderPermissionLevel.Custom) {
                jsonProperty.Add(elementName, permissionLevel);
            }
        }
        WritePermissionToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            var permissionLevel: DelegateFolderPermissionLevel = this.delegateFolderPermissions.get_Item(xmlElementName).PermissionLevel;
            if (permissionLevel !== DelegateFolderPermissionLevel.Custom) {
                writer.WriteElementValue(XmlNamespace.Types, xmlElementName, permissionLevel);
            }
        }
        ValidateAddDelegate(): void {
            if (Enumerable.Any<KeyValuePair<string, DelegatePermissions_DelegateFolderPermission>>(this.delegateFolderPermissions, (kvp: KeyValuePair<string, DelegatePermissions_DelegateFolderPermission>) => { return kvp.Value.PermissionLevel === DelegateFolderPermissionLevel.Custom; })) {
                throw new ServiceValidationException(Strings.CannotSetDelegateFolderPermissionLevelToCustom);
            }
        }
        ValidateUpdateDelegate(): void {
            if (Enumerable.Any<KeyValuePair<string, DelegatePermissions_DelegateFolderPermission>>(this.delegateFolderPermissions, (kvp: KeyValuePair<string, DelegatePermissions_DelegateFolderPermission>) => { return kvp.Value.PermissionLevel === DelegateFolderPermissionLevel.Custom && !kvp.Value.IsExistingPermissionLevelCustom; })) {
                throw new ServiceValidationException(Strings.CannotSetDelegateFolderPermissionLevelToCustom);
            }
        }
    }
    class DelegatePermissions_DelegateFolderPermission {
        PermissionLevel: DelegateFolderPermissionLevel = 0;
        IsExistingPermissionLevelCustom: boolean = false;
        Initialize(permissionLevel: DelegateFolderPermissionLevel): void {
            this.PermissionLevel = permissionLevel;
            this.IsExistingPermissionLevelCustom = (permissionLevel === DelegateFolderPermissionLevel.Custom);
        }
        Reset(): void {
            this.Initialize(DelegateFolderPermissionLevel.None);
        }
        constructor() {
            super();
        }
    }
    class DelegateUser extends ComplexProperty {
        private userId: UserId = new UserId();
        private permissions: DelegatePermissions = new DelegatePermissions();
        private receiveCopiesOfMeetingMessages: boolean = false;
        private viewPrivateItems: boolean = false;
        get UserId(): UserId {
            return this.userId;
        }
        get Permissions(): DelegatePermissions {
            return this.permissions;
        }
        set ReceiveCopiesOfMeetingMessages(value: boolean) {
            this.receiveCopiesOfMeetingMessages = value;
        }
        get ReceiveCopiesOfMeetingMessages(): boolean {
            return this.receiveCopiesOfMeetingMessages;
        }
        set ViewPrivateItems(value: boolean) {
            this.viewPrivateItems = value;
        }
        get ViewPrivateItems(): boolean {
            return this.viewPrivateItems;
        }
        constructor();
        constructor(primarySmtpAddress: string);
        constructor(standardUser: StandardUser);
        constructor(primarySmtpAddressOrStandardUser?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (primarySmtpAddressOrStandardUser === null || primarySmtpAddressOrStandardUser.constructor === String)) {
                this.constructor_1(primarySmtpAddressOrStandardUser);
                return;
            }
            this.constructor_2(primarySmtpAddressOrStandardUser);
        }
        private constructor_0(): void {
            this.receiveCopiesOfMeetingMessages = false;
            this.viewPrivateItems = false;
        }
        private constructor_1(primarySmtpAddress: string): void {
            this.constructor_0();
            this.userId.PrimarySmtpAddress = primarySmtpAddress;
        }
        private constructor_2(standardUser: StandardUser): void {
            this.constructor_0();
            this.userId.StandardUser = new Nullable<StandardUser>(standardUser);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "UserId") {
                    this.userId = new UserId();
                    this.userId.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "DelegatePermissions") {
                    this.permissions.Reset();
                    this.permissions.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "ReceiveCopiesOfMeetingMessages") {
                    this.receiveCopiesOfMeetingMessages = reader.ReadElementValue<boolean>();
                    return true;
                }
                if (localName === "ViewPrivateItems") {
                    this.viewPrivateItems = reader.ReadElementValue<boolean>();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "UserId")) {
                            if (!(a === "DelegatePermissions")) {
                                if (!(a === "ReceiveCopiesOfMeetingMessages")) {
                                    if (a === "ViewPrivateItems") {
                                        this.viewPrivateItems = jsonProperty.ReadAsBool(current);
                                    }
                                }
                                else {
                                    this.receiveCopiesOfMeetingMessages = jsonProperty.ReadAsBool(current);
                                }
                            }
                            else {
                                this.permissions.Reset();
                                this.permissions.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            }
                        }
                        else {
                            this.userId = new UserId();
                            this.userId.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.UserId.WriteToXml(writer, "UserId");
            this.Permissions.WriteToXml(writer, "DelegatePermissions");
            writer.WriteElementValue(XmlNamespace.Types, "ReceiveCopiesOfMeetingMessages", this.ReceiveCopiesOfMeetingMessages);
            writer.WriteElementValue(XmlNamespace.Types, "ViewPrivateItems", this.ViewPrivateItems);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserId", this.UserId.InternalToJson(service));
            jsonObject.Add("DelegatePermissions", this.Permissions.InternalToJson(service));
            jsonObject.Add("ReceiveCopiesOfMeetingMessages", this.ReceiveCopiesOfMeetingMessages);
            jsonObject.Add("ViewPrivateItems", this.ViewPrivateItems);
            return jsonObject;
        }
        InternalValidate(): void {
            if (this.UserId === null) {
                throw new ServiceValidationException(Strings.UserIdForDelegateUserNotSpecified);
            }
            if (!this.UserId.IsValid()) {
                throw new ServiceValidationException(Strings.DelegateUserHasInvalidUserId);
            }
        }
        ValidateAddDelegate(): void {
            this.permissions.ValidateAddDelegate();
        }
        ValidateUpdateDelegate(): void {
            this.permissions.ValidateUpdateDelegate();
        }
    }
    class DeletedOccurrenceInfo extends ComplexProperty {
        private originalStart: DateTime = null;
        get OriginalStart(): DateTime {
            return this.originalStart;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Start") {
                this.originalStart = reader.ReadElementValueAsDateTime().Value;
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            if (jsonProperty.ContainsKey("Start")) {
                this.originalStart = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString("Start")).Value;
            }
        }
    }
    class DeletedOccurrenceInfoCollection extends ComplexPropertyCollection<DeletedOccurrenceInfo>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): DeletedOccurrenceInfo {
            if (xmlElementName === "DeletedOccurrence") {
                return new DeletedOccurrenceInfo();
            }
            return null;
        }
        CreateDefaultComplexProperty(): DeletedOccurrenceInfo {
            return new DeletedOccurrenceInfo();
        }
        GetCollectionItemXmlElementName(complexProperty: DeletedOccurrenceInfo): string {
            return "Occurrence";
        }
    }
    class DictionaryEntryProperty<TKey> extends ComplexProperty {
        private key: TKey = null;
        set Key(value: TKey) {
            this.key = value;
        }
        get Key(): TKey {
            return this.key;
        }
        constructor();
        constructor(key: TKey);
        constructor(key?: TKey) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(key);
        }
        private constructor_0(): void {
        }
        private constructor_1(key: TKey): void {
            this.key = key;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.key = reader.ReadAttributeValue<TKey>("Key");
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Key", this.Key);
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, ownerDictionaryXmlElementName: string): boolean {
            return false;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            return false;
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            return false;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            return false;
        }
    }
    class DictionaryProperty<TKey, TEntry> extends ComplexProperty implements ICustomUpdateSerializer, IJsonCollectionDeserializer {
        private entries: Dictionary<TKey, TEntry> = new Dictionary<TKey, TEntry>();
        private removedEntries: Dictionary<TKey, TEntry> = new Dictionary<TKey, TEntry>();
        private addedEntries: List<TKey> = new List<TKey>();
        private modifiedEntries: List<TKey> = new List<TKey>();
        get Entries(): Dictionary<TKey, TEntry> {
            return this.entries;
        }
        private EntryChanged(complexProperty: ComplexProperty): void {
            var tEntry: TEntry = ((complexProperty instanceof TEntry) ? <TEntry>complexProperty : null);
            var key: TKey = tEntry.Key;
            if (!this.addedEntries.Contains(key) && !this.modifiedEntries.Contains(key)) {
                this.modifiedEntries.Add(key);
                this.Changed();
            }
        }
        private WriteUriToXml(writer: EwsServiceXmlWriter, key: TKey): void {
            writer.WriteStartElement(XmlNamespace.Types, "IndexedFieldURI");
            writer.WriteAttributeValue("FieldURI", this.GetFieldURI());
            writer.WriteAttributeValue("FieldIndex", this.GetFieldIndex(key));
            writer.WriteEndElement();
        }
        private WriteUriToJson(key: TKey): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter("DictionaryPropertyUri");
            jsonObject.Add("FieldURI", this.GetFieldURI());
            jsonObject.Add("FieldIndex", this.GetFieldIndex(key));
            return jsonObject;
        }
        GetFieldIndex(key: TKey): string {
            return key.ToString();
        }
        GetFieldURI(): string {
            return null;
        }
        CreateEntry(reader: EwsServiceXmlReader): TEntry {
            if (reader.LocalName === "Entry") {
                return this.CreateEntryInstance();
            }
            return null;
        }
        CreateEntryInstance(): TEntry {
            throw new NotSupportedException();
        }
        GetEntryXmlElementName(entry: TEntry): string {
            return "Entry";
        }
        ClearChangeLog(): void {
            this.addedEntries.Clear();
            this.removedEntries.Clear();
            this.modifiedEntries.Clear();
            var enumerator: Dictionary_ValueCollection_Enumerator<TKey, TEntry> = this.entries.Values.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TEntry = enumerator.Current;
                    current.ClearChangeLog();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalAdd(entry: TEntry): void {
            entry.OnChange.Add(this.EntryChanged);
            this.entries.Add(entry.Key, entry);
            this.addedEntries.Add(entry.Key);
            this.removedEntries.Remove(entry.Key);
            this.Changed();
        }
        InternalAddOrReplace(entry: TEntry): void {
            var tEntry: TEntry;
            if ((() => {
                var _p0 = [
                    tEntry
                ];
                var _r = this.entries.TryGetValue(entry.Key, _p0);
                tEntry = _p0[0];
                return _r;
            })()) {
                tEntry.OnChange.Remove(this.EntryChanged);
                entry.OnChange.Add(this.EntryChanged);
                if (!this.addedEntries.Contains(entry.Key) && !this.modifiedEntries.Contains(entry.Key)) {
                    this.modifiedEntries.Add(entry.Key);
                }
                this.Changed();
                return;
            }
            this.InternalAdd(entry);
        }
        InternalRemove(key: TKey): void {
            var tEntry: TEntry;
            if ((() => {
                var _p0 = [
                    tEntry
                ];
                var _r = this.entries.TryGetValue(key, _p0);
                tEntry = _p0[0];
                return _r;
            })()) {
                tEntry.OnChange.Remove(this.EntryChanged);
                this.entries.Remove(key);
                this.removedEntries.Add(key, tEntry);
                this.Changed();
            }
            this.addedEntries.Remove(key);
        }
        LoadFromXml(reader: EwsServiceXmlReader, localElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, localElementName);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        var tEntry: TEntry = this.CreateEntry(reader);
                        if (tEntry !== null) {
                            tEntry.LoadFromXml(reader, reader.LocalName);
                            this.InternalAdd(tEntry);
                        }
                        else {
                            reader.SkipCurrentElement();
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, localElementName));
            }
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject !== null) {
                    var entry: TEntry = this.CreateEntryInstance();
                    entry.LoadFromJson(jsonObject, service);
                    this.InternalAdd(entry);
                }
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            if (this.entries.Count > 0) {
                super.WriteToXml(writer, xmlNamespace, xmlElementName);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: Dictionary_Enumerator<TKey, TEntry> = this.entries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<TKey, TEntry> = enumerator.Current;
                    var value: TEntry = current.Value;
                    value.WriteToXml(writer, this.GetEntryXmlElementName(current.Value));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: Dictionary_Enumerator<TKey, TEntry> = this.entries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<TKey, TEntry> = enumerator.Current;
                    var arg_33_0: List<any> = list;
                    var value: TEntry = current.Value;
                    arg_33_0.Add(value.InternalToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list.ToArray();
        }
        Contains(key: TKey): boolean {
            return this.Entries.ContainsKey(key);
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition): boolean {
            var list: List<TEntry> = new List<TEntry>();
            var enumerator: List_Enumerator<TKey> = this.addedEntries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TKey = enumerator.Current;
                    list.Add(this.entries.get_Item(current));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<TKey> = this.modifiedEntries.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: TKey = enumerator2.Current;
                    list.Add(this.entries.get_Item(current2));
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            var enumerator3: List_Enumerator<TEntry> = list.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: TEntry = enumerator3.Current;
                    if (!current3.WriteSetUpdateToXml(writer, ewsObject, propertyDefinition.XmlElementName)) {
                        writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetSetFieldXmlElementName());
                        this.WriteUriToXml(writer, current3.Key);
                        writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetXmlElementName());
                        writer.WriteStartElement(XmlNamespace.Types, propertyDefinition.XmlElementName);
                        current3.WriteToXml(writer, this.GetEntryXmlElementName(current3));
                        writer.WriteEndElement();
                        writer.WriteEndElement();
                        writer.WriteEndElement();
                    }
                }
            }
            finally {
                (<IDisposable>enumerator3).Dispose();
            }
            var enumerator4: Dictionary_ValueCollection_Enumerator<TKey, TEntry> = this.removedEntries.Values.GetEnumerator();
            try {
                while (enumerator4.MoveNext()) {
                    var current4: TEntry = enumerator4.Current;
                    if (!current4.WriteDeleteUpdateToXml(writer, ewsObject)) {
                        writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetDeleteFieldXmlElementName());
                        this.WriteUriToXml(writer, current4.Key);
                        writer.WriteEndElement();
                    }
                }
            }
            finally {
                (<IDisposable>enumerator4).Dispose();
            }
            return true;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            var list: List<TEntry> = new List<TEntry>();
            var enumerator: List_Enumerator<TKey> = this.addedEntries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TKey = enumerator.Current;
                    list.Add(this.entries.get_Item(current));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<TKey> = this.modifiedEntries.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: TKey = enumerator2.Current;
                    list.Add(this.entries.get_Item(current2));
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            var enumerator3: List_Enumerator<TEntry> = list.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: TEntry = enumerator3.Current;
                    if (!current3.WriteSetUpdateToJson(service, ewsObject, propertyDefinition, updates)) {
                        var jsonObject: JsonObject = new JsonObject();
                        jsonObject.AddTypeParameter(ewsObject.GetSetFieldXmlElementName());
                        var jsonObject2: JsonObject = new JsonObject();
                        jsonObject2.AddTypeParameter("DictionaryPropertyUri");
                        jsonObject2.Add("FieldURI", this.GetFieldURI());
                        var arg_112_0: JsonObject = jsonObject2;
                        var arg_112_1: string = "FieldIndex";
                        var key: TKey = current3.Key;
                        arg_112_0.Add(arg_112_1, key.ToString());
                        jsonObject.Add("Path", jsonObject2);
                        var obj: any = current3.InternalToJson(service);
                        var jsonObject3: JsonObject = new JsonObject();
                        jsonObject3.AddTypeParameter(ewsObject.GetXmlElementName());
                        jsonObject3.Add(propertyDefinition.XmlElementName, NArray.ToEnumerable([
                            obj
                        ]));
                        jsonObject.Add(PropertyBag.GetPropertyUpdateItemName(ewsObject), jsonObject3);
                        updates.Add(jsonObject);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator3).Dispose();
            }
            var enumerator4: Dictionary_ValueCollection_Enumerator<TKey, TEntry> = this.removedEntries.Values.GetEnumerator();
            try {
                while (enumerator4.MoveNext()) {
                    var current4: TEntry = enumerator4.Current;
                    if (!current4.WriteDeleteUpdateToJson(service, ewsObject, updates)) {
                        var jsonObject4: JsonObject = new JsonObject();
                        jsonObject4.AddTypeParameter(ewsObject.GetDeleteFieldXmlElementName());
                        var jsonObject5: JsonObject = new JsonObject();
                        jsonObject5.AddTypeParameter("DictionaryPropertyUri");
                        jsonObject5.Add("FieldURI", this.GetFieldURI());
                        var arg_229_0: JsonObject = jsonObject5;
                        var arg_229_1: string = "FieldIndex";
                        var key2: TKey = current4.Key;
                        arg_229_0.Add(arg_229_1, key2.ToString());
                        jsonObject4.Add("Path", jsonObject5);
                        updates.Add(jsonObject4);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator4).Dispose();
            }
            return true;
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            return false;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            return false;
        }
        constructor() {
            super();
        }
    }
    class EmailAddressCollection extends ComplexPropertyCollection<EmailAddress>
    {
        private collectionItemXmlElementName: string = null;
        constructor();
        constructor(collectionItemXmlElementName: string);
        constructor(collectionItemXmlElementName?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(collectionItemXmlElementName);
        }
        private constructor_0(): void {
            this.constructor_1("Mailbox");
        }
        private constructor_1(collectionItemXmlElementName: string): void {
            this.collectionItemXmlElementName = collectionItemXmlElementName;
        }
        Add(emailAddress: EmailAddress): void;
        Add(smtpAddress: string): void;
        Add(name: string, smtpAddress: string): void;
        Add(emailAddressOrSmtpAddressOrName: any, smtpAddress?: string): void {
            if (arguments.length === 1 && (emailAddressOrSmtpAddressOrName === null || emailAddressOrSmtpAddressOrName instanceof EmailAddress)) {
                this.Add_0(emailAddressOrSmtpAddressOrName);
                return;
            }
            if (arguments.length === 1 && (emailAddressOrSmtpAddressOrName === null || emailAddressOrSmtpAddressOrName.constructor === String)) {
                this.Add_1(emailAddressOrSmtpAddressOrName);
                return;
            }
            this.Add_2(emailAddressOrSmtpAddressOrName, smtpAddress);
        }
        private Add_0(emailAddress: EmailAddress): void {
            super.InternalAdd(emailAddress);
        }
        AddRange(emailAddresses: IEnumerable<EmailAddress>): void;
        AddRange(smtpAddresses: IEnumerable<string>): void;
        AddRange(emailAddressesOrSmtpAddresses: any): void {
            if (arguments.length === 1) {
                this.AddRange_0(emailAddressesOrSmtpAddresses);
                return;
            }
            this.AddRange_1(emailAddressesOrSmtpAddresses);
        }
        private AddRange_0(emailAddresses: IEnumerable<EmailAddress>): void {
            var enumerator: IEnumerator<EmailAddress> = emailAddresses.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: EmailAddress = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        private Add_1(smtpAddress: string): EmailAddress {
            var emailAddress: EmailAddress = new EmailAddress(smtpAddress);
            this.Add(emailAddress);
            return emailAddress;
        }
        private AddRange_1(smtpAddresses: IEnumerable<string>): void {
            var enumerator: IEnumerator<string> = smtpAddresses.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        private Add_2(name: string, smtpAddress: string): EmailAddress {
            var emailAddress: EmailAddress = new EmailAddress(name, smtpAddress);
            this.Add(emailAddress);
            return emailAddress;
        }
        Clear(): void {
            super.InternalClear();
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            super.InternalRemoveAt(index);
        }
        Remove(emailAddress: EmailAddress): boolean {
            EwsUtilities.ValidateParam(emailAddress, "emailAddress");
            return super.InternalRemove(emailAddress);
        }
        CreateComplexProperty(xmlElementName: string): EmailAddress {
            if (xmlElementName === this.collectionItemXmlElementName) {
                return new EmailAddress();
            }
            return null;
        }
        CreateDefaultComplexProperty(): EmailAddress {
            return new EmailAddress();
        }
        GetCollectionItemXmlElementName(emailAddress: EmailAddress): string {
            return this.collectionItemXmlElementName;
        }
        ShouldWriteToRequest(): boolean {
            return true;
        }
    }
    class EmailAddressDictionary extends DictionaryProperty<EmailAddressKey, EmailAddressEntry>
    {
        get_Item(key: EmailAddressKey): EmailAddress {
            return this.Entries.get_Item(key).EmailAddress;
        }
        set_Item(key: EmailAddressKey, value: EmailAddress): void {
            if (value === null) {
                super.InternalRemove(key);
                return;
            }
            var emailAddressEntry: EmailAddressEntry;
            if ((() => {
                var _p0 = [
                    emailAddressEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                emailAddressEntry = _p0[0];
                return _r;
            })()) {
                emailAddressEntry.EmailAddress = value;
                this.Changed();
                return;
            }
            emailAddressEntry = new EmailAddressEntry(key, value);
            super.InternalAdd(emailAddressEntry);
        }
        GetFieldURI(): string {
            return "contacts:EmailAddress";
        }
        CreateEntryInstance(): EmailAddressEntry {
            return new EmailAddressEntry();
        }
        TryGetValue(key: EmailAddressKey, emailAddress: EmailAddress[]): boolean {
            var emailAddressEntry: EmailAddressEntry = null;
            if ((() => {
                var _p0 = [
                    emailAddressEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                emailAddressEntry = _p0[0];
                return _r;
            })()) {
                emailAddress[0] = emailAddressEntry.EmailAddress;
                return true;
            }
            emailAddress[0] = null;
            return false;
        }
        constructor() {
            super();
        }
    }
    class EmailAddressEntity extends ExtractedEntity {
        EmailAddress: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "EmailAddress") {
                this.EmailAddress = reader.ReadElementValue();
                return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class EmailAddressEntityCollection extends ComplexPropertyCollection<EmailAddressEntity>
    {
        constructor();
        constructor(collection: IEnumerable<EmailAddressEntity>);
        constructor(collection?: IEnumerable<EmailAddressEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<EmailAddressEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<EmailAddressEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): EmailAddressEntity {
            return new EmailAddressEntity();
        }
        CreateDefaultComplexProperty(): EmailAddressEntity {
            return new EmailAddressEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: EmailAddressEntity): string {
            return "EmailAddress";
        }
    }
    class EmailAddressEntry extends DictionaryEntryProperty<EmailAddressKey>
    {
        private emailAddress: EmailAddress = null;
        set EmailAddress(value: EmailAddress) {
            (() => {
                var _p0 = [
                    this.emailAddress
                ];
                var _r = this.SetFieldValue<EmailAddress>(_p0, value);
                this.emailAddress = _p0[0];
                return _r;
            })();
            if (this.emailAddress !== null) {
                this.emailAddress.OnChange.Add(this.EmailAddressChanged);
            }
        }
        get EmailAddress(): EmailAddress {
            return this.emailAddress;
        }
        constructor();
        constructor(key: EmailAddressKey, emailAddress: EmailAddress);
        constructor(key?: EmailAddressKey, emailAddress?: EmailAddress) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(key, emailAddress);
        }
        private constructor_0(): void {
            this.emailAddress = new EmailAddress();
            this.emailAddress.OnChange.Add(this.EmailAddressChanged);
        }
        private constructor_1(key: EmailAddressKey, emailAddress: EmailAddress): void {
            this.emailAddress = emailAddress;
            if (this.emailAddress !== null) {
                this.emailAddress.OnChange.Add(this.EmailAddressChanged);
            }
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            super.ReadAttributesFromXml(reader);
            this.EmailAddress.Name = reader.ReadAttributeValue<string>("Name");
            this.EmailAddress.RoutingType = reader.ReadAttributeValue<string>("RoutingType");
            var value: string = reader.ReadAttributeValue("MailboxType");
            if (!NString.IsNullOrEmpty(value)) {
                this.EmailAddress.MailboxType = new Nullable<MailboxType>(EwsUtilities.Parse<MailboxType>(value));
                return;
            }
            this.EmailAddress.MailboxType = null;
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.EmailAddress.Address = reader.ReadValue();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Key")) {
                            if (!(a === "Name")) {
                                if (!(a === "RoutingType")) {
                                    if (!(a === "MailboxType")) {
                                        if (a === "EmailAddress") {
                                            this.EmailAddress.Address = jsonProperty.ReadAsString(current);
                                        }
                                    }
                                    else {
                                        this.EmailAddress.MailboxType = new Nullable<MailboxType>(jsonProperty.ReadEnumValue<MailboxType>(current));
                                    }
                                }
                                else {
                                    this.EmailAddress.RoutingType = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.EmailAddress.Name = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.Key = jsonProperty.ReadEnumValue<EmailAddressKey>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            if (writer.Service.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                writer.WriteAttributeValue("Name", this.EmailAddress.Name);
                writer.WriteAttributeValue("RoutingType", this.EmailAddress.RoutingType);
                if (this.EmailAddress.MailboxType !== MailboxType.Unknown) {
                    writer.WriteAttributeValue("MailboxType", this.EmailAddress.MailboxType);
                }
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteValue(this.EmailAddress.Address, "EmailAddress");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Key", this.Key);
            jsonObject.Add("Name", this.EmailAddress.Name);
            jsonObject.Add("RoutingType", this.EmailAddress.RoutingType);
            if (this.EmailAddress.MailboxType !== null) {
                jsonObject.Add("MailboxType", this.EmailAddress.MailboxType.Value);
            }
            jsonObject.Add("EmailAddress", this.EmailAddress.Address);
            return jsonObject;
        }
        private EmailAddressChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
    }
    class EmailUserEntity extends ComplexProperty {
        Name: string = null;
        UserId: string = null;
        constructor() {
            super();
            this.Namespace = XmlNamespace.Types;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Name") {
                    this.Name = reader.ReadElementValue();
                    return true;
                }
                if (localName === "UserId") {
                    this.UserId = reader.ReadElementValue();
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class EmailUserEntityCollection extends ComplexPropertyCollection<EmailUserEntity>
    {
        constructor();
        constructor(collection: IEnumerable<EmailUserEntity>);
        constructor(collection?: IEnumerable<EmailUserEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<EmailUserEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<EmailUserEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): EmailUserEntity {
            return new EmailUserEntity();
        }
        CreateDefaultComplexProperty(): EmailUserEntity {
            return new EmailUserEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: EmailUserEntity): string {
            return "EmailUser";
        }
    }
    class EnhancedLocation extends ComplexProperty {
        private displayName: string = null;
        private annotation: string = null;
        private personaPostalAddress: PersonaPostalAddress = null;
        set DisplayName(value: string) {
            (() => {
                var _p0 = [
                    this.displayName
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.displayName = _p0[0];
                return _r;
            })();
        }
        get DisplayName(): string {
            return this.displayName;
        }
        set Annotation(value: string) {
            (() => {
                var _p0 = [
                    this.annotation
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.annotation = _p0[0];
                return _r;
            })();
        }
        get Annotation(): string {
            return this.annotation;
        }
        set PersonaPostalAddress(value: PersonaPostalAddress) {
            if (!NObject.GenericEquals(this.personaPostalAddress, value)) {
                if (this.personaPostalAddress !== null) {
                    this.personaPostalAddress.OnChange.Remove(this.PersonaPostalAddress_OnChange);
                }
                (() => {
                    var _p0 = [
                        this.personaPostalAddress
                    ];
                    var _r = this.SetFieldValue<PersonaPostalAddress>(_p0, value);
                    this.personaPostalAddress = _p0[0];
                    return _r;
                })();
                this.personaPostalAddress.OnChange.Add(this.PersonaPostalAddress_OnChange);
            }
        }
        get PersonaPostalAddress(): PersonaPostalAddress {
            return this.personaPostalAddress;
        }
        constructor();
        constructor(displayName: string);
        constructor(displayName: string, annotation: string);
        constructor(displayName: string, annotation: string, personaPostalAddress: PersonaPostalAddress);
        constructor(displayName?: string, annotation?: string, personaPostalAddress?: PersonaPostalAddress) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (displayName === null || displayName.constructor === String)) {
                this.constructor_1(displayName);
                return;
            }
            if (arguments.length === 2 && (displayName === null || displayName.constructor === String) && (annotation === null || annotation.constructor === String)) {
                this.constructor_2(displayName, annotation);
                return;
            }
            this.constructor_3(displayName, annotation, personaPostalAddress);
        }
        private constructor_0(): void {
        }
        private constructor_1(displayName: string): void {
            this.constructor_3(displayName, NString.Empty, new PersonaPostalAddress());
        }
        private constructor_2(displayName: string, annotation: string): void {
            this.constructor_3(displayName, annotation, new PersonaPostalAddress());
        }
        private constructor_3(displayName: string, annotation: string, personaPostalAddress: PersonaPostalAddress): void {
            this.constructor_0();
            this.displayName = displayName;
            this.annotation = annotation;
            this.personaPostalAddress = personaPostalAddress;
            this.personaPostalAddress.OnChange.Add(this.PersonaPostalAddress_OnChange);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DisplayName") {
                    this.displayName = reader.ReadValue<string>();
                    return true;
                }
                if (localName === "Annotation") {
                    this.annotation = reader.ReadValue<string>();
                    return true;
                }
                if (localName === "PostalAddress") {
                    this.personaPostalAddress = new PersonaPostalAddress();
                    this.personaPostalAddress.LoadFromXml(reader);
                    this.personaPostalAddress.OnChange.Add(this.PersonaPostalAddress_OnChange);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DisplayName")) {
                            if (!(a === "Annotation")) {
                                if (a === "PostalAddress") {
                                    this.personaPostalAddress = new PersonaPostalAddress();
                                    this.personaPostalAddress.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                    this.personaPostalAddress.OnChange.Add(this.PersonaPostalAddress_OnChange);
                                }
                            }
                            else {
                                this.annotation = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.displayName = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "DisplayName", this.displayName);
            writer.WriteElementValue(XmlNamespace.Types, "Annotation", this.annotation);
            this.personaPostalAddress.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("DisplayName", this.displayName);
            jsonObject.Add("Annotation", this.annotation);
            if (this.personaPostalAddress !== null) {
                jsonObject.Add("PostalAddress", this.personaPostalAddress.InternalToJson(service));
            }
            return jsonObject;
        }
        InternalValidate(): void {
            super.InternalValidate();
            EwsUtilities.ValidateParam(this.displayName, "DisplayName");
            EwsUtilities.ValidateParamAllowNull(this.annotation, "Annotation");
            EwsUtilities.ValidateParamAllowNull(this.personaPostalAddress, "PersonaPostalAddress");
        }
        private PersonaPostalAddress_OnChange(complexProperty: ComplexProperty): void {
            this.Changed();
        }
    }
    class EntityExtractionResult extends ComplexProperty {
        Addresses: AddressEntityCollection = null;
        MeetingSuggestions: MeetingSuggestionCollection = null;
        TaskSuggestions: TaskSuggestionCollection = null;
        EmailAddresses: EmailAddressEntityCollection = null;
        Contacts: ContactEntityCollection = null;
        Urls: UrlEntityCollection = null;
        PhoneNumbers: PhoneEntityCollection = null;
        constructor() {
            super();
            this.Namespace = XmlNamespace.Types;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Addresses":
                    this.Addresses = new AddressEntityCollection();
                    this.Addresses.LoadFromXml(reader, XmlNamespace.Types, "Addresses");
                    return true;
                case "MeetingSuggestions":
                    this.MeetingSuggestions = new MeetingSuggestionCollection();
                    this.MeetingSuggestions.LoadFromXml(reader, XmlNamespace.Types, "MeetingSuggestions");
                    return true;
                case "TaskSuggestions":
                    this.TaskSuggestions = new TaskSuggestionCollection();
                    this.TaskSuggestions.LoadFromXml(reader, XmlNamespace.Types, "TaskSuggestions");
                    return true;
                case "EmailAddresses":
                    this.EmailAddresses = new EmailAddressEntityCollection();
                    this.EmailAddresses.LoadFromXml(reader, XmlNamespace.Types, "EmailAddresses");
                    return true;
                case "Contacts":
                    this.Contacts = new ContactEntityCollection();
                    this.Contacts.LoadFromXml(reader, XmlNamespace.Types, "Contacts");
                    return true;
                case "Urls":
                    this.Urls = new UrlEntityCollection();
                    this.Urls.LoadFromXml(reader, XmlNamespace.Types, "Urls");
                    return true;
                case "PhoneNumbers":
                    this.PhoneNumbers = new PhoneEntityCollection();
                    this.PhoneNumbers.LoadFromXml(reader, XmlNamespace.Types, "PhoneNumbers");
                    return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class ExtendedProperty extends ComplexProperty {
        private propertyDefinition: ExtendedPropertyDefinition = null;
        private value: any = null;
        get PropertyDefinition(): ExtendedPropertyDefinition {
            return this.propertyDefinition;
        }
        set Value(value: any) {
            EwsUtilities.ValidateParam(value, "value");
            (() => {
                var _p0 = [
                    this.value
                ];
                var _r = this.SetFieldValue<any>(_p0, MapiTypeConverter.ChangeType(this.PropertyDefinition.MapiType, value));
                this.value = _p0[0];
                return _r;
            })();
        }
        get Value(): any {
            return this.value;
        }
        constructor();
        constructor(propertyDefinition: ExtendedPropertyDefinition);
        constructor(propertyDefinition?: ExtendedPropertyDefinition) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(propertyDefinition);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: ExtendedPropertyDefinition): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(propertyDefinition, "propertyDefinition");
            this.propertyDefinition = propertyDefinition;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "ExtendedFieldURI") {
                    this.propertyDefinition = new ExtendedPropertyDefinition();
                    this.propertyDefinition.LoadFromXml(reader);
                    return true;
                }
                if (localName === "Value") {
                    EwsUtilities.Assert(ExtendedPropertyDefinition.op_Inequality(this.PropertyDefinition, null), "ExtendedProperty.TryReadElementFromXml", "PropertyDefintion is missing");
                    var stringValue: string = reader.ReadElementValue();
                    this.value = MapiTypeConverter.ConvertToValue(this.PropertyDefinition.MapiType, stringValue);
                    return true;
                }
                if (localName === "Values") {
                    EwsUtilities.Assert(ExtendedPropertyDefinition.op_Inequality(this.PropertyDefinition, null), "ExtendedProperty.TryReadElementFromXml", "PropertyDefintion is missing");
                    var stringList: StringList = new StringList("Value");
                    stringList.LoadFromXml(reader, reader.LocalName);
                    this.value = MapiTypeConverter.ConvertToValue(this.PropertyDefinition.MapiType, stringList);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "ExtendedFieldURI")) {
                            if (!(a === "Value")) {
                                if (a === "Values") {
                                    EwsUtilities.Assert(ExtendedPropertyDefinition.op_Inequality(this.PropertyDefinition, null), "ExtendedProperty.TryReadElementFromXml", "PropertyDefintion is missing");
                                    var stringList: StringList = new StringList("Value");
                                    (<IJsonCollectionDeserializer>stringList).CreateFromJsonCollection(jsonProperty.ReadAsArray(current), service);
                                    this.value = MapiTypeConverter.ConvertToValue(this.PropertyDefinition.MapiType, stringList);
                                }
                            }
                            else {
                                EwsUtilities.Assert(ExtendedPropertyDefinition.op_Inequality(this.PropertyDefinition, null), "ExtendedProperty.TryReadElementFromXml", "PropertyDefintion is missing");
                                var stringValue: string = jsonProperty.ReadAsString(current);
                                this.value = MapiTypeConverter.ConvertToValue(this.PropertyDefinition.MapiType, stringValue);
                            }
                        }
                        else {
                            this.propertyDefinition = new ExtendedPropertyDefinition();
                            this.propertyDefinition.LoadFromJson(jsonProperty.ReadAsJsonObject(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.PropertyDefinition.WriteToXml(writer);
            if (MapiTypeConverter.IsArrayType(this.PropertyDefinition.MapiType)) {
                var array: Array = ((this.Value instanceof Array) ? <Array>this.Value : null);
                writer.WriteStartElement(XmlNamespace.Types, "Values");
                for (var i: number = array.GetLowerBound(0); i <= array.GetUpperBound(0); i = i + 1) {
                    writer.WriteElementValue(XmlNamespace.Types, "Value", MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, array.GetValue(i)));
                }
                writer.WriteEndElement();
                return;
            }
            writer.WriteElementValue(XmlNamespace.Types, "Value", MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, this.Value));
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var jsonPropertyDefinition: JsonObject = new JsonObject();
            this.PropertyDefinition.AddJsonProperties(jsonPropertyDefinition, service);
            jsonObject.Add("ExtendedFieldURI", jsonPropertyDefinition);
            if (MapiTypeConverter.IsArrayType(this.PropertyDefinition.MapiType)) {
                var list: List<any> = new List<any>();
                var enumerator: IEnumerator = (((this.Value instanceof Array) ? <Array>this.Value : null)).GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: any = enumerator.Current;
                        list.Add(MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, current));
                    }
                }
                finally {
                    var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                    if (disposable !== null) {
                        disposable.Dispose();
                    }
                }
                jsonObject.Add("Values", NArray.ToEnumerable(list.ToArray()));
            }
            else {
                jsonObject.Add("Value", MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, this.Value));
            }
            return jsonObject;
        }
        private GetStringValue(): string {
            if (!MapiTypeConverter.IsArrayType(this.PropertyDefinition.MapiType)) {
                return MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, this.Value);
            }
            var array: Array = ((this.Value instanceof Array) ? <Array>this.Value : null);
            if (array === null) {
                return NString.Empty;
            }
            var stringBuilder: StringBuilder = new StringBuilder();
            stringBuilder.Append("[");
            for (var i: number = array.GetLowerBound(0); i <= array.GetUpperBound(0); i = i + 1) {
                stringBuilder.Append(MapiTypeConverter.ConvertToString(this.PropertyDefinition.MapiType, array.GetValue(i)));
                stringBuilder.Append(",");
            }
            stringBuilder.Append("]");
            return stringBuilder.ToString();
        }
        Equals(obj: any): boolean {
            var extendedProperty: ExtendedProperty = ((obj instanceof ExtendedProperty) ? <ExtendedProperty>obj : null);
            return extendedProperty !== null && NObject.GenericEquals(extendedProperty.PropertyDefinition, this.PropertyDefinition) && this.GetStringValue() === extendedProperty.GetStringValue();
        }
        GetHashCode(): number {
            return ((ExtendedPropertyDefinition.op_Inequality(this.PropertyDefinition, null) ? this.PropertyDefinition.GetPrintableName() : NString.Empty) + this.GetStringValue()).GetHashCode();
        }
    }
    class ExtendedPropertyCollection extends ComplexPropertyCollection<ExtendedProperty> implements ICustomUpdateSerializer {
        CreateComplexProperty(xmlElementName: string): ExtendedProperty {
            return new ExtendedProperty();
        }
        CreateDefaultComplexProperty(): ExtendedProperty {
            return new ExtendedProperty();
        }
        GetCollectionItemXmlElementName(complexProperty: ExtendedProperty): string {
            return null;
        }
        LoadFromXml(reader: EwsServiceXmlReader, localElementName: string): void {
            var extendedProperty: ExtendedProperty = new ExtendedProperty();
            extendedProperty.LoadFromXml(reader, reader.LocalName);
            super.InternalAdd(extendedProperty);
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            var enumerator: IEnumerator<ExtendedProperty> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    current.WriteToXml(writer, "ExtendedProperty");
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<ExtendedProperty> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    list.Add(current.InternalToJson(service));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return list.ToArray();
        }
        private GetOrAddExtendedProperty(propertyDefinition: ExtendedPropertyDefinition): ExtendedProperty {
            var extendedProperty: ExtendedProperty;
            if (!(() => {
                var _p0 = [
                    extendedProperty
                ];
                var _r = this.TryGetProperty(propertyDefinition, _p0);
                extendedProperty = _p0[0];
                return _r;
            })()) {
                extendedProperty = new ExtendedProperty(propertyDefinition);
                super.InternalAdd(extendedProperty);
            }
            return extendedProperty;
        }
        SetExtendedProperty(propertyDefinition: ExtendedPropertyDefinition, value: any): void {
            var orAddExtendedProperty: ExtendedProperty = this.GetOrAddExtendedProperty(propertyDefinition);
            orAddExtendedProperty.Value = value;
        }
        RemoveExtendedProperty(propertyDefinition: ExtendedPropertyDefinition): boolean {
            EwsUtilities.ValidateParam(propertyDefinition, "propertyDefinition");
            var complexProperty: ExtendedProperty;
            return (() => {
                var _p0 = [
                    complexProperty
                ];
                var _r = this.TryGetProperty(propertyDefinition, _p0);
                complexProperty = _p0[0];
                return _r;
            })() && super.InternalRemove(complexProperty);
        }
        private TryGetProperty(propertyDefinition: ExtendedPropertyDefinition, extendedProperty: ExtendedProperty[]): boolean {
            extendedProperty[0] = this.Items.Find((prop: ExtendedProperty) => { return NObject.GenericEquals(prop.PropertyDefinition, propertyDefinition); });
            return extendedProperty[0] !== null;
        }
        TryGetValue<T>(propertyDefinition: ExtendedPropertyDefinition, propertyValue: T[]): boolean {
            var extendedProperty: ExtendedProperty;
            if (!(() => {
                var _p0 = [
                    extendedProperty
                ];
                var _r = this.TryGetProperty(propertyDefinition, _p0);
                extendedProperty = _p0[0];
                return _r;
            })()) {
                propertyValue[0] = null;
                return false;
            }
            if (!new Type("T").IsAssignableFrom(propertyDefinition.Type)) {
                var message: string = NString.Format(Strings.PropertyDefinitionTypeMismatch, EwsUtilities.GetPrintableTypeName(propertyDefinition.Type), EwsUtilities.GetPrintableTypeName(new Type("T")));
                throw new ArgumentException(message, "propertyDefinition");
            }
            propertyValue[0] = <T>(<any>extendedProperty.Value);
            return true;
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition): boolean {
            var list: List<ExtendedProperty> = new List<ExtendedProperty>();
            list.AddRange(this.AddedItems);
            list.AddRange(this.ModifiedItems);
            var enumerator: List_Enumerator<ExtendedProperty> = list.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetSetFieldXmlElementName());
                    current.PropertyDefinition.WriteToXml(writer);
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetXmlElementName());
                    current.WriteToXml(writer, "ExtendedProperty");
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<ExtendedProperty> = this.RemovedItems.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: ExtendedProperty = enumerator2.Current;
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetDeleteFieldXmlElementName());
                    current2.PropertyDefinition.WriteToXml(writer);
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            return true;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            var list: List<ExtendedProperty> = new List<ExtendedProperty>();
            list.AddRange(this.AddedItems);
            list.AddRange(this.ModifiedItems);
            var enumerator: List_Enumerator<ExtendedProperty> = list.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    updates.Add(PropertyBag.CreateJsonSetUpdate(current, service, ewsObject));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<ExtendedProperty> = this.RemovedItems.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: ExtendedProperty = enumerator2.Current;
                    updates.Add(PropertyBag.CreateJsonDeleteUpdate(current2.PropertyDefinition, service, ewsObject));
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            return true;
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            var enumerator: List_Enumerator<ExtendedProperty> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetDeleteFieldXmlElementName());
                    current.PropertyDefinition.WriteToXml(writer);
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return true;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            var enumerator: List_Enumerator<ExtendedProperty> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ExtendedProperty = enumerator.Current;
                    updates.Add(PropertyBag.CreateJsonDeleteUpdate(current.PropertyDefinition, service, ewsObject));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return true;
        }
        constructor() {
            super();
        }
    }
    class FileAttachment extends Attachment {
        private fileName: string = null;
        private contentStream: Stream = null;
        private content: number[] = null;
        private loadToStream: Stream = null;
        private isContactPhoto: boolean = false;
        set FileName(value: string) {
            super.ThrowIfThisIsNotNew();
            this.fileName = value;
            this.content = null;
            this.contentStream = null;
        }
        get FileName(): string {
            return this.fileName;
        }
        set ContentStream(value: Stream) {
            super.ThrowIfThisIsNotNew();
            this.contentStream = value;
            this.content = null;
            this.fileName = null;
        }
        get ContentStream(): Stream {
            return this.contentStream;
        }
        set Content(value: number[]) {
            super.ThrowIfThisIsNotNew();
            this.content = value;
            this.fileName = null;
            this.contentStream = null;
        }
        get Content(): number[] {
            return this.content;
        }
        set IsContactPhoto(value: boolean) {
            EwsUtilities.ValidatePropertyVersion(this.Service, ExchangeVersion.Exchange2010, "IsContactPhoto");
            super.ThrowIfThisIsNotNew();
            this.isContactPhoto = value;
        }
        get IsContactPhoto(): boolean {
            EwsUtilities.ValidatePropertyVersion(this.Service, ExchangeVersion.Exchange2010, "IsContactPhoto");
            return this.isContactPhoto;
        }
        constructor(owner: Item);
        constructor(service: ExchangeService);
        constructor(ownerOrService: any) {
            super(ownerOrService);
            if (arguments.length === 1 && (ownerOrService === null || ownerOrService instanceof Item)) {
                this.constructor_0(ownerOrService);
                return;
            }
            this.constructor_1(ownerOrService);
        }
        private constructor_0(owner: Item): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        GetXmlElementName(): string {
            return "FileAttachment";
        }
        Validate(attachmentIndex: number): void {
            if (NString.IsNullOrEmpty(this.fileName) && this.content === null && this.contentStream === null) {
                throw new ServiceValidationException(NString.Format(Strings.FileAttachmentContentIsNotSet, attachmentIndex));
            }
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag) {
                if (reader.LocalName === "IsContactPhoto") {
                    this.isContactPhoto = reader.ReadElementValue<boolean>();
                }
                else {
                    if (reader.LocalName === "Content") {
                        if (this.loadToStream !== null) {
                            reader.ReadBase64ElementValue(this.loadToStream);
                        }
                        else {
                            if (reader.Service.FileAttachmentContentHandler !== null) {
                                var outputStream: Stream = reader.Service.FileAttachmentContentHandler.GetOutputStream(this.Id);
                                if (outputStream !== null) {
                                    reader.ReadBase64ElementValue(outputStream);
                                }
                                else {
                                    this.content = reader.ReadBase64ElementValue();
                                }
                            }
                            else {
                                this.content = reader.ReadBase64ElementValue();
                            }
                        }
                        flag = true;
                    }
                }
            }
            return flag;
        }
        TryReadElementFromXmlToPatch(reader: EwsServiceXmlReader): boolean {
            return super.TryReadElementFromXml(reader);
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "IsContactPhoto")) {
                            if (a === "Content") {
                                if (this.loadToStream !== null) {
                                    jsonProperty.ReadAsBase64Content(current, this.loadToStream);
                                }
                                else {
                                    if (service.FileAttachmentContentHandler !== null) {
                                        var outputStream: Stream = service.FileAttachmentContentHandler.GetOutputStream(this.Id);
                                        if (outputStream !== null) {
                                            jsonProperty.ReadAsBase64Content(current, outputStream);
                                        }
                                        else {
                                            this.content = jsonProperty.ReadAsBase64Content(current);
                                        }
                                    }
                                    else {
                                        this.content = jsonProperty.ReadAsBase64Content(current);
                                    }
                                }
                            }
                        }
                        else {
                            this.isContactPhoto = jsonProperty.ReadAsBool(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var IL_A2: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        super.WriteElementsToXml(writer);
                        if (writer.Service.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                            writer.WriteElementValue(XmlNamespace.Types, "IsContactPhoto", this.isContactPhoto);
                        }
                        writer.WriteStartElement(XmlNamespace.Types, "Content");
                        if (!NString.IsNullOrEmpty(this.FileName)) {
                            var fileStream: FileStream = new FileStream(this.FileName, FileMode.Open, FileAccess.Read);
                            try {
                                writer.WriteBase64ElementValue(fileStream);
                                _goto = IL_A2;
                                continue _GOTO_LOOP;
                            }
                            finally {
                                if (fileStream !== null) {
                                    (<IDisposable>fileStream).Dispose();
                                }
                            }
                        }
                        if (this.ContentStream !== null) {
                            writer.WriteBase64ElementValue(this.ContentStream);
                        }
                        else {
                            if (this.Content !== null) {
                                writer.WriteBase64ElementValue(this.Content);
                            }
                            else {
                                EwsUtilities.Assert(false, "FileAttachment.WriteElementsToXml", "The attachment's content is not set.");
                            }
                        }
                        _goto = IL_A2;
                        continue _GOTO_LOOP;
                    case 1:
                        writer.WriteEndElement();
                        break _GOTO_LOOP;
                }
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            if (service.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                jsonObject.Add("IsContactPhoto", this.isContactPhoto);
            }
            if (!NString.IsNullOrEmpty(this.FileName)) {
                var fileStream: FileStream = new FileStream(this.FileName, FileMode.Open, FileAccess.Read);
                try {
                    jsonObject.AddBase64("Content", fileStream);
                    return jsonObject;
                }
                finally {
                    if (fileStream !== null) {
                        (<IDisposable>fileStream).Dispose();
                    }
                }
            }
            if (this.ContentStream !== null) {
                jsonObject.AddBase64("Content", this.ContentStream);
            }
            else {
                if (this.Content !== null) {
                    jsonObject.AddBase64("Content", this.Content);
                }
                else {
                    EwsUtilities.Assert(false, "FileAttachment.WriteElementsToXml", "The attachment's content is not set.");
                }
            }
            return jsonObject;
        }
        Load(stream: Stream): void;
        Load(fileName: string): void;
        Load(streamOrFileName: any): void {
            if (arguments.length === 1 && (streamOrFileName === null || streamOrFileName instanceof Stream)) {
                this.Load_0(streamOrFileName);
                return;
            }
            this.Load_1(streamOrFileName);
        }
        private Load_0(stream: Stream): void {
            this.loadToStream = stream;
            try {
                super.Load();
            }
            finally {
                this.loadToStream = null;
            }
        }
        private Load_1(fileName: string): void {
            this.loadToStream = new FileStream(fileName, FileMode.Create);
            try {
                super.Load();
            }
            finally {
                this.loadToStream.Dispose();
                this.loadToStream = null;
            }
            this.fileName = fileName;
            this.content = null;
            this.contentStream = null;
        }
    }
    class Flag extends ComplexProperty {
        private flagStatus: ItemFlagStatus = 0;
        private startDate: DateTime = null;
        private dueDate: DateTime = null;
        private completeDate: DateTime = null;
        set FlagStatus(value: ItemFlagStatus) {
            (() => {
                var _p0 = [
                    this.flagStatus
                ];
                var _r = this.SetFieldValue<ItemFlagStatus>(_p0, value);
                this.flagStatus = _p0[0];
                return _r;
            })();
        }
        get FlagStatus(): ItemFlagStatus {
            return this.flagStatus;
        }
        set StartDate(value: DateTime) {
            (() => {
                var _p0 = [
                    this.startDate
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.startDate = _p0[0];
                return _r;
            })();
        }
        get StartDate(): DateTime {
            return this.startDate;
        }
        set DueDate(value: DateTime) {
            (() => {
                var _p0 = [
                    this.dueDate
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.dueDate = _p0[0];
                return _r;
            })();
        }
        get DueDate(): DateTime {
            return this.dueDate;
        }
        set CompleteDate(value: DateTime) {
            (() => {
                var _p0 = [
                    this.completeDate
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.completeDate = _p0[0];
                return _r;
            })();
        }
        get CompleteDate(): DateTime {
            return this.completeDate;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "FlagStatus") {
                    this.flagStatus = reader.ReadElementValue<ItemFlagStatus>();
                    return true;
                }
                if (localName === "StartDate") {
                    this.startDate = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
                if (localName === "DueDate") {
                    this.dueDate = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
                if (localName === "CompleteDate") {
                    this.completeDate = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "FlagStatus")) {
                            if (!(a === "StartDate")) {
                                if (!(a === "DueDate")) {
                                    if (a === "CompleteDate") {
                                        this.completeDate = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                                    }
                                }
                                else {
                                    this.dueDate = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                                }
                            }
                            else {
                                this.startDate = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                            }
                        }
                        else {
                            this.flagStatus = jsonProperty.ReadEnumValue<ItemFlagStatus>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "FlagStatus", this.FlagStatus);
            if (this.FlagStatus === ItemFlagStatus.Flagged) {
                var arg_26_0: DateTime = this.StartDate;
                var arg_2D_0: DateTime = this.DueDate;
                writer.WriteElementValue(XmlNamespace.Types, "StartDate", this.StartDate);
                writer.WriteElementValue(XmlNamespace.Types, "DueDate", this.DueDate);
                return;
            }
            if (this.FlagStatus === ItemFlagStatus.Complete) {
                var arg_6C_0: DateTime = this.CompleteDate;
                writer.WriteElementValue(XmlNamespace.Types, "CompleteDate", this.CompleteDate);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("FlagStatus", this.FlagStatus);
            if (this.FlagStatus === ItemFlagStatus.Flagged) {
                var arg_2B_0: DateTime = this.StartDate;
                var arg_32_0: DateTime = this.DueDate;
                jsonObject.Add("StartDate", this.StartDate);
                jsonObject.Add("DueDate", this.DueDate);
            }
            else {
                if (this.FlagStatus === ItemFlagStatus.Complete) {
                    var arg_70_0: DateTime = this.CompleteDate;
                    jsonObject.Add("CompleteDate", this.CompleteDate);
                }
            }
            return jsonObject;
        }
        Validate(): void {
            EwsUtilities.ValidateParam(this.flagStatus, "FlagStatus");
        }
        constructor() {
            super();
        }
    }
    class FolderId extends ServiceId {
        private folderName: Nullable<WellKnownFolderName> = null;
        private mailbox: Mailbox = null;
        get FolderName(): Nullable<WellKnownFolderName> {
            return this.folderName;
        }
        get Mailbox(): Mailbox {
            return this.mailbox;
        }
        get IsValid(): boolean {
            if (this.FolderName !== null) {
                return this.Mailbox === null || this.Mailbox.IsValid;
            }
            return this.IsValid;
        }
        constructor();
        constructor(uniqueId: string);
        constructor(folderName: WellKnownFolderName);
        constructor(folderName: WellKnownFolderName, mailbox: Mailbox);
        constructor(uniqueIdOrFolderName?: any, mailbox?: Mailbox) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (uniqueIdOrFolderName === null || uniqueIdOrFolderName.constructor === String)) {
                this.constructor_1(uniqueIdOrFolderName);
                return;
            }
            if (arguments.length === 1 && (uniqueIdOrFolderName === null || uniqueIdOrFolderName.constructor === Number)) {
                this.constructor_2(uniqueIdOrFolderName);
                return;
            }
            this.constructor_3(uniqueIdOrFolderName, mailbox);
        }
        private constructor_0(): void {
        }
        private constructor_1(uniqueId: string): void {
        }
        private constructor_2(folderName: WellKnownFolderName): void {
            this.folderName = new Nullable<WellKnownFolderName>(folderName);
        }
        private constructor_3(folderName: WellKnownFolderName, mailbox: Mailbox): void {
            this.constructor_2(folderName);
            this.mailbox = mailbox;
        }
        GetXmlElementName(): string {
            if (!(this.FolderName !== null)) {
                return "FolderId";
            }
            return "DistinguishedFolderId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            if (this.FolderName !== null) {
                writer.WriteAttributeValue("Id", WellKnownFolderName[this.FolderName.Value].ToLowerInvariant());
                if (this.Mailbox !== null) {
                    this.Mailbox.WriteToXml(writer, "Mailbox");
                    return;
                }
            }
            else {
                super.WriteAttributesToXml(writer);
            }
        }
        InternalToJson(service: ExchangeService): any {
            if (this.FolderName !== null) {
                var jsonObject: JsonObject = new JsonObject();
                jsonObject.AddTypeParameter(this.GetXmlElementName());
                jsonObject.Add("Id", WellKnownFolderName[this.FolderName.Value].ToLowerInvariant());
                if (this.Mailbox !== null) {
                    jsonObject.Add("Mailbox", this.Mailbox.InternalToJson(service));
                }
                return jsonObject;
            }
            return super.InternalToJson(service);
        }
        Validate(version: ExchangeVersion): void {
            if (this.FolderName !== null) {
                EwsUtilities.ValidateEnumVersionValue(this.FolderName.Value, version);
            }
        }
        static op_Implicit(uniqueId: string): FolderId {
            return new FolderId(uniqueId);
        }
        static op_Implicit(folderName: WellKnownFolderName): FolderId {
            return new FolderId(folderName);
        }
        Equals(obj: any): boolean {
            if (NObject.ReferenceEquals(this, obj)) {
                return true;
            }
            var folderId: FolderId = ((obj instanceof FolderId) ? <FolderId>obj : null);
            if (folderId === null) {
                return false;
            }
            if (this.FolderName !== null) {
                if (folderId.FolderName !== null && NObject.GenericEquals(this.FolderName.Value, folderId.FolderName.Value)) {
                    if (this.Mailbox !== null) {
                        return NObject.GenericEquals(this.Mailbox, folderId.Mailbox);
                    }
                    if (folderId.Mailbox === null) {
                        return true;
                    }
                }
            }
            else {
                if (super.Equals(folderId)) {
                    return true;
                }
            }
            return false;
        }
        GetHashCode(): number {
            var num: number;
            if (this.FolderName !== null) {
                num = this.FolderName.Value;
                if (this.Mailbox !== null && this.Mailbox.IsValid) {
                    num = (num ^ this.Mailbox.GetHashCode());
                }
            }
            else {
                num = super.GetHashCode();
            }
            return num;
        }
        ToString(): string {
            if (!this.IsValid) {
                return NString.Empty;
            }
            if (!(this.FolderName !== null)) {
                return super.ToString();
            }
            if (this.Mailbox !== null && this.mailbox.IsValid) {
                return NString.Format("{0} ({1})", this.folderName.Value, this.Mailbox.ToString());
            }
            return WellKnownFolderName[this.FolderName.Value];
        }
    }
    class FolderIdCollection extends ComplexPropertyCollection<FolderId>
    {
        constructor();
        constructor(folderIds: IEnumerable<FolderId>);
        constructor(folderIds?: IEnumerable<FolderId>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(folderIds);
        }
        private constructor_0(): void {
        }
        private constructor_1(folderIds: IEnumerable<FolderId>): void {
            if (folderIds !== null) {
                EwsUtilities.ForEach<FolderId>(folderIds, (folderId: FolderId) => {
                    super.InternalAdd(folderId);
                });
            }
        }
        CreateComplexProperty(xmlElementName: string): FolderId {
            return new FolderId();
        }
        CreateDefaultComplexProperty(): FolderId {
            return new FolderId();
        }
        GetCollectionItemXmlElementName(complexProperty: FolderId): string {
            return complexProperty.GetXmlElementName();
        }
        Add(folderId: FolderId): void;
        Add(folderName: WellKnownFolderName): void;
        Add(folderIdOrFolderName: any): void {
            if (arguments.length === 1 && (folderIdOrFolderName === null || folderIdOrFolderName instanceof FolderId)) {
                this.Add_0(folderIdOrFolderName);
                return;
            }
            this.Add_1(folderIdOrFolderName);
        }
        private Add_0(folderId: FolderId): void {
            EwsUtilities.ValidateParam(folderId, "folderId");
            if (super.Contains(folderId)) {
                throw new ArgumentException(Strings.IdAlreadyInList, "folderId");
            }
            super.InternalAdd(folderId);
        }
        private Add_1(folderName: WellKnownFolderName): FolderId {
            if (super.Contains(folderName)) {
                throw new ArgumentException(Strings.IdAlreadyInList, "folderName");
            }
            var folderId: FolderId = new FolderId(folderName);
            super.InternalAdd(folderId);
            return folderId;
        }
        Clear(): void {
            super.InternalClear();
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            super.InternalRemoveAt(index);
        }
        Remove(folderId: FolderId): boolean;
        Remove(folderName: WellKnownFolderName): boolean;
        Remove(folderIdOrFolderName: any): boolean {
            if (arguments.length === 1 && (folderIdOrFolderName === null || folderIdOrFolderName instanceof FolderId)) {
                return this.Remove_0(folderIdOrFolderName);
            }
            return this.Remove_1(folderIdOrFolderName);
        }
        private Remove_0(folderId: FolderId): boolean {
            EwsUtilities.ValidateParam(folderId, "folderId");
            return super.InternalRemove(folderId);
        }
        private Remove_1(folderName: WellKnownFolderName): boolean {
            return super.InternalRemove(folderName);
        }
    }
    class UserId extends ComplexProperty {
        private sID: string = null;
        private primarySmtpAddress: string = null;
        private displayName: string = null;
        private standardUser: Nullable<StandardUser> = null;
        set SID(value: string) {
            (() => {
                var _p0 = [
                    this.sID
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.sID = _p0[0];
                return _r;
            })();
        }
        get SID(): string {
            return this.sID;
        }
        set PrimarySmtpAddress(value: string) {
            (() => {
                var _p0 = [
                    this.primarySmtpAddress
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.primarySmtpAddress = _p0[0];
                return _r;
            })();
        }
        get PrimarySmtpAddress(): string {
            return this.primarySmtpAddress;
        }
        set DisplayName(value: string) {
            (() => {
                var _p0 = [
                    this.displayName
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.displayName = _p0[0];
                return _r;
            })();
        }
        get DisplayName(): string {
            return this.displayName;
        }
        set StandardUser(value: Nullable<StandardUser>) {
            (() => {
                var _p0 = [
                    this.standardUser
                ];
                var _r = this.SetFieldValue<Nullable<StandardUser>>(_p0, value);
                this.standardUser = _p0[0];
                return _r;
            })();
        }
        get StandardUser(): Nullable<StandardUser> {
            return this.standardUser;
        }
        constructor();
        constructor(primarySmtpAddress: string);
        constructor(standardUser: StandardUser);
        constructor(primarySmtpAddressOrStandardUser?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (primarySmtpAddressOrStandardUser === null || primarySmtpAddressOrStandardUser.constructor === String)) {
                this.constructor_1(primarySmtpAddressOrStandardUser);
                return;
            }
            this.constructor_2(primarySmtpAddressOrStandardUser);
        }
        private constructor_0(): void {
        }
        private constructor_1(primarySmtpAddress: string): void {
            this.constructor_0();
            this.primarySmtpAddress = primarySmtpAddress;
        }
        private constructor_2(standardUser: StandardUser): void {
            this.constructor_0();
            this.standardUser = new Nullable<StandardUser>(standardUser);
        }
        IsValid(): boolean {
            return this.StandardUser !== null || !NString.IsNullOrEmpty(this.PrimarySmtpAddress) || !NString.IsNullOrEmpty(this.SID);
        }
        static op_Implicit(primarySmtpAddress: string): UserId {
            return new UserId(primarySmtpAddress);
        }
        static op_Implicit(standardUser: StandardUser): UserId {
            return new UserId(standardUser);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "SID") {
                    this.sID = reader.ReadValue();
                    return true;
                }
                if (localName === "PrimarySmtpAddress") {
                    this.primarySmtpAddress = reader.ReadValue();
                    return true;
                }
                if (localName === "DisplayName") {
                    this.displayName = reader.ReadValue();
                    return true;
                }
                if (localName === "DistinguishedUser") {
                    this.standardUser = new Nullable<StandardUser>(reader.ReadValue<StandardUser>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "SID")) {
                            if (!(a === "PrimarySmtpAddress")) {
                                if (!(a === "DisplayName")) {
                                    if (a === "DistinguishedUser") {
                                        this.standardUser = new Nullable<StandardUser>(jsonProperty.ReadEnumValue<StandardUser>(current));
                                    }
                                }
                                else {
                                    this.displayName = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.primarySmtpAddress = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.sID = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "SID", this.SID);
            writer.WriteElementValue(XmlNamespace.Types, "PrimarySmtpAddress", this.PrimarySmtpAddress);
            writer.WriteElementValue(XmlNamespace.Types, "DisplayName", this.DisplayName);
            writer.WriteElementValue(XmlNamespace.Types, "DistinguishedUser", this.StandardUser);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("SID", this.SID);
            jsonObject.Add("PrimarySmtpAddress", this.PrimarySmtpAddress);
            jsonObject.Add("DisplayName", this.DisplayName);
            if (this.StandardUser !== null) {
                jsonObject.Add("DistinguishedUser", this.StandardUser.Value);
            }
            return jsonObject;
        }
    }
    class LazyMember<T>
    {
        private lazyMember: T = null;
        private initializationDelegate: () => T = null;
        private lockObject: any = new any();
        private initialized: boolean = false;
        get Member(): T {
            if (!this.initialized) {
                var obj: any;
                Monitor.Enter(obj = this.lockObject);
                try {
                    if (!this.initialized) {
                        this.lazyMember = this.initializationDelegate();
                    }
                    this.initialized = true;
                }
                finally {
                    Monitor.Exit(obj);
                }
            }
            return this.lazyMember;
        }
        constructor(initializationDelegate: () => T) {
            super();
            this.initializationDelegate = initializationDelegate;
        }
    }
    class ServiceObjectInfo {
        private xmlElementNameToServiceObjectClassMap: Dictionary<string, Type> = null;
        private serviceObjectConstructorsWithServiceParam: Dictionary<Type, (srv: ExchangeService) => any> = null;
        private serviceObjectConstructorsWithAttachmentParam: Dictionary<Type, (itemAttachment: ItemAttachment, isNew: boolean) => any> = null;
        get XmlElementNameToServiceObjectClassMap(): Dictionary<string, Type> {
            return this.xmlElementNameToServiceObjectClassMap;
        }
        get ServiceObjectConstructorsWithServiceParam(): Dictionary<Type, (srv: ExchangeService) => any> {
            return this.serviceObjectConstructorsWithServiceParam;
        }
        get ServiceObjectConstructorsWithAttachmentParam(): Dictionary<Type, (itemAttachment: ItemAttachment, isNew: boolean) => any> {
            return this.serviceObjectConstructorsWithAttachmentParam;
        }
        constructor() {
            super();
            this.xmlElementNameToServiceObjectClassMap = new Dictionary<string, Type>();
            this.serviceObjectConstructorsWithServiceParam = new Dictionary<Type, (srv: ExchangeService) => any>();
            this.serviceObjectConstructorsWithAttachmentParam = new Dictionary<Type, (itemAttachment: ItemAttachment, isNew: boolean) => any>();
            this.InitializeServiceObjectClassMap();
        }
        private InitializeServiceObjectClassMap(): void {
            this.AddServiceObjectType("CalendarItem", new Type("Appointment"), (srv: ExchangeService) => { return new Appointment(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new Appointment(itemAttachment, isNew); });
            this.AddServiceObjectType("CalendarFolder", new Type("CalendarFolder"), (srv: ExchangeService) => { return new CalendarFolder(srv); }, null);
            this.AddServiceObjectType("Contact", new Type("Contact"), (srv: ExchangeService) => { return new Contact(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new Contact(itemAttachment); });
            this.AddServiceObjectType("ContactsFolder", new Type("ContactsFolder"), (srv: ExchangeService) => { return new ContactsFolder(srv); }, null);
            this.AddServiceObjectType("DistributionList", new Type("ContactGroup"), (srv: ExchangeService) => { return new ContactGroup(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new ContactGroup(itemAttachment); });
            this.AddServiceObjectType("Conversation", new Type("Conversation"), (srv: ExchangeService) => { return new Conversation(srv); }, null);
            this.AddServiceObjectType("Message", new Type("EmailMessage"), (srv: ExchangeService) => { return new EmailMessage(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new EmailMessage(itemAttachment); });
            this.AddServiceObjectType("Folder", new Type("Folder"), (srv: ExchangeService) => { return new Folder(srv); }, null);
            this.AddServiceObjectType("Item", new Type("Item"), (srv: ExchangeService) => { return new Item(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new Item(itemAttachment); });
            this.AddServiceObjectType("MeetingCancellation", new Type("MeetingCancellation"), (srv: ExchangeService) => { return new MeetingCancellation(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new MeetingCancellation(itemAttachment); });
            this.AddServiceObjectType("MeetingMessage", new Type("MeetingMessage"), (srv: ExchangeService) => { return new MeetingMessage(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new MeetingMessage(itemAttachment); });
            this.AddServiceObjectType("MeetingRequest", new Type("MeetingRequest"), (srv: ExchangeService) => { return new MeetingRequest(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new MeetingRequest(itemAttachment); });
            this.AddServiceObjectType("MeetingResponse", new Type("MeetingResponse"), (srv: ExchangeService) => { return new MeetingResponse(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new MeetingResponse(itemAttachment); });
            this.AddServiceObjectType("PostItem", new Type("PostItem"), (srv: ExchangeService) => { return new PostItem(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new PostItem(itemAttachment); });
            this.AddServiceObjectType("SearchFolder", new Type("SearchFolder"), (srv: ExchangeService) => { return new SearchFolder(srv); }, null);
            this.AddServiceObjectType("Task", new Type("Task"), (srv: ExchangeService) => { return new Task(srv); }, (itemAttachment: ItemAttachment, isNew: boolean) => { return new Task(itemAttachment); });
            this.AddServiceObjectType("TasksFolder", new Type("TasksFolder"), (srv: ExchangeService) => { return new TasksFolder(srv); }, null);
        }
        private AddServiceObjectType(xmlElementName: string, type: Type, createServiceObjectWithServiceParam: (srv: ExchangeService) => any, createServiceObjectWithAttachmentParam: (itemAttachment: ItemAttachment, isNew: boolean) => any): void {
            this.xmlElementNameToServiceObjectClassMap.Add(xmlElementName, type);
            this.serviceObjectConstructorsWithServiceParam.Add(type, createServiceObjectWithServiceParam);
            if (createServiceObjectWithAttachmentParam !== null) {
                this.serviceObjectConstructorsWithAttachmentParam.Add(type, createServiceObjectWithAttachmentParam);
            }
        }
    }
    class ServiceObject {
        private lockObject: any = new any();
        private service: ExchangeService = null;
        private propertyBag: PropertyBag = null;
        private xmlElementName: string = null;
        OnChange: NEvent<(serviceObject: ServiceObject) => void> = new NEvent<(serviceObject: ServiceObject) => void>();
        get PropertyBag(): PropertyBag {
            return this.propertyBag;
        }
        get Schema(): ServiceObjectSchema {
            return this.GetSchema();
        }
        get_Item(propertyDefinition: PropertyDefinitionBase): any {
            var propertyDefinition2: PropertyDefinition = ((propertyDefinition instanceof PropertyDefinition) ? <PropertyDefinition>propertyDefinition : null);
            if (propertyDefinition2 !== null) {
                return this.PropertyBag.get_Item(propertyDefinition2);
            }
            var extendedPropertyDefinition: ExtendedPropertyDefinition = ((propertyDefinition instanceof ExtendedPropertyDefinition) ? <ExtendedPropertyDefinition>propertyDefinition : null);
            if (!ExtendedPropertyDefinition.op_Inequality(extendedPropertyDefinition, null)) {
                throw new NotSupportedException(NString.Format(Strings.OperationNotSupportedForPropertyDefinitionType, propertyDefinition.GetType().Name));
            }
            var result: any;
            if ((() => {
                var _p0 = [
                    result
                ];
                var _r = this.TryGetExtendedProperty<any>(extendedPropertyDefinition, _p0);
                result = _p0[0];
                return _r;
            })()) {
                return result;
            }
            throw new ServiceObjectPropertyException(Strings.MustLoadOrAssignPropertyBeforeAccess, propertyDefinition);
        }
        set Service(value: ExchangeService) {
            this.service = value;
        }
        get Service(): ExchangeService {
            return this.service;
        }
        get IsNew(): boolean {
            var id: ServiceId = this.GetId();
            return id === null || !id.IsValid;
        }
        get IsDirty(): boolean {
            return this.PropertyBag.IsDirty;
        }
        Changed(): void {
            if (this.OnChange !== null) {
                this.OnChange(this);
            }
        }
        ThrowIfThisIsNew(): void {
            if (this.IsNew) {
                throw new InvalidOperationException(Strings.ServiceObjectDoesNotHaveId);
            }
        }
        ThrowIfThisIsNotNew(): void {
            if (!this.IsNew) {
                throw new InvalidOperationException(Strings.ServiceObjectAlreadyHasId);
            }
        }
        GetXmlElementNameOverride(): string {
            return null;
        }
        GetXmlElementName(): string {
            if (NString.IsNullOrEmpty(this.xmlElementName)) {
                this.xmlElementName = this.GetXmlElementNameOverride();
                if (NString.IsNullOrEmpty(this.xmlElementName)) {
                    var obj: any;
                    Monitor.Enter(obj = this.lockObject);
                    try {
                        var customAttributes: any[] = super.GetType().GetCustomAttributes(false);
                        for (var i: number = 0; i < customAttributes.length; i = i + 1) {
                            var attribute: Attribute = <Attribute>customAttributes[i];
                            var serviceObjectDefinitionAttribute: ServiceObjectDefinitionAttribute = ((attribute instanceof ServiceObjectDefinitionAttribute) ? <ServiceObjectDefinitionAttribute>attribute : null);
                            if (serviceObjectDefinitionAttribute !== null) {
                                this.xmlElementName = serviceObjectDefinitionAttribute.XmlElementName;
                            }
                        }
                    }
                    finally {
                        Monitor.Exit(obj);
                    }
                }
            }
            EwsUtilities.Assert(!NString.IsNullOrEmpty(this.xmlElementName), "EwsObject.GetXmlElementName", NString.Format("The class {0} does not have an associated XML element name.", super.GetType().Name));
            return this.xmlElementName;
        }
        GetChangeXmlElementName(): string {
            return "ItemChange";
        }
        GetSetFieldXmlElementName(): string {
            return "SetItemField";
        }
        GetDeleteFieldXmlElementName(): string {
            return "DeleteItemField";
        }
        GetIsTimeZoneHeaderRequired(isUpdateOperation: boolean): boolean {
            return false;
        }
        GetIsCustomDateTimeScopingRequired(): boolean {
            return false;
        }
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.ValidateParam(service, "service");
            EwsUtilities.ValidateServiceObjectVersion(this, service.RequestedServerVersion);
            this.service = service;
            this.propertyBag = new PropertyBag(this);
        }
        GetSchema(): ServiceObjectSchema {
            throw new NotSupportedException();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            throw new NotSupportedException();
        }
        LoadFromXml(reader: EwsServiceXmlReader, clearPropertyBag: boolean): void;
        LoadFromXml(reader: EwsServiceXmlReader, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): void;
        LoadFromXml(reader: EwsServiceXmlReader, clearPropertyBag: boolean, requestedPropertySet?: PropertySet, summaryPropertiesOnly?: boolean): void {
            if (arguments.length === 2 && (reader === null || reader instanceof EwsServiceXmlReader) && (clearPropertyBag === null || clearPropertyBag.constructor === Boolean)) {
                this.LoadFromXml_0(reader, clearPropertyBag);
                return;
            }
            this.LoadFromXml_1(reader, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
        }
        private LoadFromXml_0(reader: EwsServiceXmlReader, clearPropertyBag: boolean): void {
            this.PropertyBag.LoadFromXml(reader, clearPropertyBag, null, false);
        }
        Validate(): void {
            this.PropertyBag.Validate();
        }
        private LoadFromXml_1(reader: EwsServiceXmlReader, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): void {
            this.PropertyBag.LoadFromXml(reader, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
        }
        LoadFromJson(jsonServiceObject: JsonObject, service: ExchangeService, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): void;
        LoadFromJson(jsonObject: JsonObject, service: ExchangeService, clearPropertyBag: boolean): void;
        LoadFromJson(jsonServiceObjectOrJsonObject: JsonObject, service: ExchangeService, clearPropertyBag: boolean, requestedPropertySet?: PropertySet, summaryPropertiesOnly?: boolean): void {
            if (arguments.length === 5 && (jsonServiceObjectOrJsonObject === null || jsonServiceObjectOrJsonObject instanceof JsonObject) && (service === null || service instanceof ExchangeService) && (clearPropertyBag === null || clearPropertyBag.constructor === Boolean) && (requestedPropertySet === null || requestedPropertySet instanceof PropertySet) && (summaryPropertiesOnly === null || summaryPropertiesOnly.constructor === Boolean)) {
                this.LoadFromJson_0(jsonServiceObjectOrJsonObject, service, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
                return;
            }
            this.LoadFromJson_1(jsonServiceObjectOrJsonObject, service, clearPropertyBag);
        }
        private LoadFromJson_0(jsonServiceObject: JsonObject, service: ExchangeService, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): void {
            this.PropertyBag.LoadFromJson(jsonServiceObject, service, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
        }
        private LoadFromJson_1(jsonObject: JsonObject, service: ExchangeService, clearPropertyBag: boolean): void {
            this.PropertyBag.LoadFromJson(jsonObject, service, clearPropertyBag, null, false);
        }
        ClearChangeLog(): void {
            this.PropertyBag.ClearChangeLog();
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.PropertyBag.WriteToXml(writer);
        }
        ToJson(service: ExchangeService, isUpdateOperation: boolean): any {
            return this.PropertyBag.ToJson(service, isUpdateOperation);
        }
        WriteToXmlForUpdate(writer: EwsServiceXmlWriter): void {
            this.PropertyBag.WriteToXmlForUpdate(writer);
        }
        WriteToJsonForUpdate(service: ExchangeService): any {
            return this.PropertyBag.ToJson(service, true);
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new NotSupportedException();
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new NotSupportedException();
        }
        Load(propertySet: PropertySet): void;
        Load(): void;
        Load(propertySet?: PropertySet): void {
            if (arguments.length === 1 && (propertySet === null || propertySet instanceof PropertySet)) {
                this.Load_0(propertySet);
                return;
            }
            this.Load_1();
        }
        private Load_0(propertySet: PropertySet): void {
            this.InternalLoad(propertySet);
        }
        private Load_1(): void {
            this.InternalLoad(PropertySet.FirstClassProperties);
        }
        TryGetExtendedProperty<T>(propertyDefinition: ExtendedPropertyDefinition, propertyValue: T[]): boolean {
            var extendedProperties: ExtendedPropertyCollection = this.GetExtendedProperties();
            if (extendedProperties !== null && (() => {
                var _p0 = [
                    propertyValue[0]
                ];
                var _r = extendedProperties.TryGetValue<T>(propertyDefinition, _p0);
                propertyValue[0] = _p0[0];
                return _r;
            })()) {
                return true;
            }
            propertyValue[0] = null;
            return false;
        }
        TryGetProperty(propertyDefinition: PropertyDefinitionBase, propertyValue: any[]): boolean;
        TryGetProperty(propertyDefinition: PropertyDefinitionBase, propertyValue: T[]): boolean;
        TryGetProperty(propertyDefinition: PropertyDefinitionBase, propertyValue: any): boolean {
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (propertyValue === null || propertyValue instanceof Array)) {
                return this.TryGetProperty_0(propertyDefinition, propertyValue);
            }
            return this.TryGetProperty_1(propertyDefinition, propertyValue);
        }
        private TryGetProperty_0(propertyDefinition: PropertyDefinitionBase, propertyValue: any[]): boolean {
            return (() => {
                var _p0 = [
                    propertyValue[0]
                ];
                var _r = this.TryGetProperty<any>(propertyDefinition, _p0);
                propertyValue[0] = _p0[0];
                return _r;
            })();
        }
        private TryGetProperty_1<T>(propertyDefinition: PropertyDefinitionBase, propertyValue: T[]): boolean {
            var propertyDefinition2: PropertyDefinition = ((propertyDefinition instanceof PropertyDefinition) ? <PropertyDefinition>propertyDefinition : null);
            if (propertyDefinition2 !== null) {
                return (() => {
                    var _p0 = [
                        propertyValue[0]
                    ];
                    var _r = this.PropertyBag.TryGetProperty<T>(propertyDefinition2, _p0);
                    propertyValue[0] = _p0[0];
                    return _r;
                })();
            }
            var extendedPropertyDefinition: ExtendedPropertyDefinition = ((propertyDefinition instanceof ExtendedPropertyDefinition) ? <ExtendedPropertyDefinition>propertyDefinition : null);
            if (ExtendedPropertyDefinition.op_Inequality(extendedPropertyDefinition, null)) {
                return (() => {
                    var _p0 = [
                        propertyValue[0]
                    ];
                    var _r = this.TryGetExtendedProperty<T>(extendedPropertyDefinition, _p0);
                    propertyValue[0] = _p0[0];
                    return _r;
                })();
            }
            throw new NotSupportedException(NString.Format(Strings.OperationNotSupportedForPropertyDefinitionType, propertyDefinition.GetType().Name));
        }
        GetLoadedPropertyDefinitions(): Collection<PropertyDefinitionBase> {
            var collection: Collection<PropertyDefinitionBase> = new Collection<PropertyDefinitionBase>();
            var enumerator: Dictionary_KeyCollection_Enumerator<PropertyDefinition, any> = this.PropertyBag.Properties.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    collection.Add(current);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (this.GetExtendedProperties() !== null) {
                var enumerator2: IEnumerator<ExtendedProperty> = this.GetExtendedProperties().GetEnumerator();
                try {
                    while (enumerator2.MoveNext()) {
                        var current2: ExtendedProperty = enumerator2.Current;
                        collection.Add(current2.PropertyDefinition);
                    }
                }
                finally {
                    if (enumerator2 !== null) {
                        enumerator2.Dispose();
                    }
                }
            }
            return collection;
        }
        GetIdPropertyDefinition(): PropertyDefinition {
            return null;
        }
        GetId(): ServiceId {
            var idPropertyDefinition: PropertyDefinition = this.GetIdPropertyDefinition();
            var obj: any = null;
            if (idPropertyDefinition !== null) {
                (() => {
                    var _p0 = [
                        obj
                    ];
                    var _r = this.PropertyBag.TryGetValue(idPropertyDefinition, _p0);
                    obj = _p0[0];
                    return _r;
                })();
            }
            return <ServiceId>obj;
        }
        GetExtendedProperties(): ExtendedPropertyCollection {
            return null;
        }
    }
    class Folder extends ServiceObject {
        get Id(): FolderId {
            return <FolderId>this.PropertyBag.get_Item(this.GetIdPropertyDefinition());
        }
        get ParentFolderId(): FolderId {
            return <FolderId>this.PropertyBag.get_Item(FolderSchema.ParentFolderId);
        }
        get ChildFolderCount(): number {
            return <number>this.PropertyBag.get_Item(FolderSchema.ChildFolderCount);
        }
        set DisplayName(value: string) {
            this.PropertyBag.set_Item(FolderSchema.DisplayName, value);
        }
        get DisplayName(): string {
            return <string>this.PropertyBag.get_Item(FolderSchema.DisplayName);
        }
        set FolderClass(value: string) {
            this.PropertyBag.set_Item(FolderSchema.FolderClass, value);
        }
        get FolderClass(): string {
            return <string>this.PropertyBag.get_Item(FolderSchema.FolderClass);
        }
        get TotalCount(): number {
            return <number>this.PropertyBag.get_Item(FolderSchema.TotalCount);
        }
        get ExtendedProperties(): ExtendedPropertyCollection {
            return <ExtendedPropertyCollection>this.PropertyBag.get_Item(ServiceObjectSchema.ExtendedProperties);
        }
        get ManagedFolderInformation(): ManagedFolderInformation {
            return <ManagedFolderInformation>this.PropertyBag.get_Item(FolderSchema.ManagedFolderInformation);
        }
        get EffectiveRights(): EffectiveRights {
            return <EffectiveRights>this.PropertyBag.get_Item(FolderSchema.EffectiveRights);
        }
        get Permissions(): FolderPermissionCollection {
            return <FolderPermissionCollection>this.PropertyBag.get_Item(FolderSchema.Permissions);
        }
        get UnreadCount(): number {
            return <number>this.PropertyBag.get_Item(FolderSchema.UnreadCount);
        }
        set PolicyTag(value: PolicyTag) {
            this.PropertyBag.set_Item(FolderSchema.PolicyTag, value);
        }
        get PolicyTag(): PolicyTag {
            return <PolicyTag>this.PropertyBag.get_Item(FolderSchema.PolicyTag);
        }
        set ArchiveTag(value: ArchiveTag) {
            this.PropertyBag.set_Item(FolderSchema.ArchiveTag, value);
        }
        get ArchiveTag(): ArchiveTag {
            return <ArchiveTag>this.PropertyBag.get_Item(FolderSchema.ArchiveTag);
        }
        get WellKnownFolderName(): Nullable<WellKnownFolderName> {
            return <Nullable<WellKnownFolderName>>this.PropertyBag.get_Item(FolderSchema.WellKnownFolderName);
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        static Bind(service: ExchangeService, id: FolderId, propertySet: PropertySet): Folder;
        static Bind(service: ExchangeService, id: FolderId): Folder;
        static Bind(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): Folder;
        static Bind(service: ExchangeService, name: WellKnownFolderName): Folder;
        static Bind(service: ExchangeService, idOrName: any, propertySet?: PropertySet): Folder {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Folder.Bind_0(service, idOrName, propertySet);
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId)) {
                return Folder.Bind_1(service, idOrName);
            }
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName.constructor === Number) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Folder.Bind_2(service, idOrName, propertySet);
            }
            return Folder.Bind_3(service, idOrName);
        }
        private static Bind_0(service: ExchangeService, id: FolderId, propertySet: PropertySet): Folder {
            return service.BindToFolder<Folder>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: FolderId): Folder {
            return Folder.Bind(service, id, PropertySet.FirstClassProperties);
        }
        private static Bind_2(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): Folder {
            return Folder.Bind(service, new FolderId(name), propertySet);
        }
        private static Bind_3(service: ExchangeService, name: WellKnownFolderName): Folder {
            return Folder.Bind(service, new FolderId(name), PropertySet.FirstClassProperties);
        }
        Validate(): void {
            super.Validate();
            if (this.PropertyBag.Contains(FolderSchema.Permissions)) {
                this.Permissions.Validate();
            }
        }
        GetSchema(): ServiceObjectSchema {
            return FolderSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        GetChangeXmlElementName(): string {
            return "FolderChange";
        }
        GetSetFieldXmlElementName(): string {
            return "SetFolderField";
        }
        GetDeleteFieldXmlElementName(): string {
            return "DeleteFolderField";
        }
        InternalLoad(propertySet: PropertySet): void {
            super.ThrowIfThisIsNew();
            this.Service.LoadPropertiesForFolder(this, propertySet);
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            super.ThrowIfThisIsNew();
            this.Service.DeleteFolder(this.Id, deleteMode);
        }
        Delete(deleteMode: DeleteMode): void {
            this.InternalDelete(deleteMode, null, null);
        }
        Empty(deleteMode: DeleteMode, deleteSubFolders: boolean): void {
            super.ThrowIfThisIsNew();
            this.Service.EmptyFolder(this.Id, deleteMode, deleteSubFolders);
        }
        MarkAllItemsAsRead(suppressReadReceipts: boolean): void {
            super.ThrowIfThisIsNew();
            this.Service.MarkAllItemsAsRead(this.Id, true, suppressReadReceipts);
        }
        MarkAllItemsAsUnread(suppressReadReceipts: boolean): void {
            super.ThrowIfThisIsNew();
            this.Service.MarkAllItemsAsRead(this.Id, false, suppressReadReceipts);
        }
        Save(parentFolderId: FolderId): void;
        Save(parentFolderName: WellKnownFolderName): void;
        Save(parentFolderIdOrParentFolderName: any): void {
            if (arguments.length === 1 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId)) {
                this.Save_0(parentFolderIdOrParentFolderName);
                return;
            }
            this.Save_1(parentFolderIdOrParentFolderName);
        }
        private Save_0(parentFolderId: FolderId): void {
            super.ThrowIfThisIsNotNew();
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            if (this.IsDirty) {
                this.Service.CreateFolder(this, parentFolderId);
            }
        }
        private Save_1(parentFolderName: WellKnownFolderName): void {
            this.Save(new FolderId(parentFolderName));
        }
        Update(): void {
            if (this.IsDirty && this.PropertyBag.GetIsUpdateCallNecessary()) {
                this.Service.UpdateFolder(this);
            }
        }
        Copy(destinationFolderId: FolderId): Folder;
        Copy(destinationFolderName: WellKnownFolderName): Folder;
        Copy(destinationFolderIdOrDestinationFolderName: any): Folder {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Copy_0(destinationFolderIdOrDestinationFolderName);
            }
            return this.Copy_1(destinationFolderIdOrDestinationFolderName);
        }
        private Copy_0(destinationFolderId: FolderId): Folder {
            super.ThrowIfThisIsNew();
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.Service.CopyFolder(this.Id, destinationFolderId);
        }
        private Copy_1(destinationFolderName: WellKnownFolderName): Folder {
            return this.Copy(new FolderId(destinationFolderName));
        }
        Move(destinationFolderId: FolderId): Folder;
        Move(destinationFolderName: WellKnownFolderName): Folder;
        Move(destinationFolderIdOrDestinationFolderName: any): Folder {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Move_0(destinationFolderIdOrDestinationFolderName);
            }
            return this.Move_1(destinationFolderIdOrDestinationFolderName);
        }
        private Move_0(destinationFolderId: FolderId): Folder {
            super.ThrowIfThisIsNew();
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.Service.MoveFolder(this.Id, destinationFolderId);
        }
        private Move_1(destinationFolderName: WellKnownFolderName): Folder {
            return this.Move(new FolderId(destinationFolderName));
        }
        InternalFindItems(queryString: string, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        InternalFindItems(searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        InternalFindItems(queryStringOrSearchFilter: any, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>> {
            if (arguments.length === 3 && (queryStringOrSearchFilter === null || queryStringOrSearchFilter.constructor === String) && (view === null || view instanceof ViewBase) && (groupBy === null || groupBy instanceof Grouping)) {
                return this.InternalFindItems_0(queryStringOrSearchFilter, view, groupBy);
            }
            return this.InternalFindItems_1(queryStringOrSearchFilter, view, groupBy);
        }
        private InternalFindItems_0<TItem>(queryString: string, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>> {
            super.ThrowIfThisIsNew();
            return this.Service.FindItems<TItem>(NArray.ToEnumerable([
                this.Id
            ]), null, queryString, view, groupBy, ServiceErrorHandling.ThrowOnError);
        }
        private InternalFindItems_1<TItem>(searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>> {
            super.ThrowIfThisIsNew();
            return this.Service.FindItems<TItem>(NArray.ToEnumerable([
                this.Id
            ]), searchFilter, null, view, groupBy, ServiceErrorHandling.ThrowOnError);
        }
        FindItems(searchFilter: SearchFilter, view: ItemView): FindItemsResults<Item>;
        FindItems(queryString: string, view: ItemView): FindItemsResults<Item>;
        FindItems(view: ItemView): FindItemsResults<Item>;
        FindItems(searchFilter: SearchFilter, view: ItemView, groupBy: Grouping): FindItemsResults<Item>;
        FindItems(queryString: string, view: ItemView, groupBy: Grouping): FindItemsResults<Item>;
        FindItems(view: ItemView, groupBy: Grouping): FindItemsResults<Item>;
        FindItems(searchFilterOrQueryStringOrView: any, viewOrGroupBy?: any, groupBy?: Grouping): FindItemsResults<Item> {
            if (arguments.length === 2 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (viewOrGroupBy === null || viewOrGroupBy instanceof ItemView)) {
                return this.FindItems_0(searchFilterOrQueryStringOrView, viewOrGroupBy);
            }
            if (arguments.length === 2 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (viewOrGroupBy === null || viewOrGroupBy instanceof ItemView)) {
                return this.FindItems_1(searchFilterOrQueryStringOrView, viewOrGroupBy);
            }
            if (arguments.length === 1 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof ItemView)) {
                return this.FindItems_2(searchFilterOrQueryStringOrView);
            }
            if (arguments.length === 3 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (viewOrGroupBy === null || viewOrGroupBy instanceof ItemView) && (groupBy === null || groupBy instanceof Grouping)) {
                return this.FindItems_3(searchFilterOrQueryStringOrView, viewOrGroupBy, groupBy);
            }
            if (arguments.length === 3 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (viewOrGroupBy === null || viewOrGroupBy instanceof ItemView) && (groupBy === null || groupBy instanceof Grouping)) {
                return this.FindItems_4(searchFilterOrQueryStringOrView, viewOrGroupBy, groupBy);
            }
            return this.FindItems_5(searchFilterOrQueryStringOrView, viewOrGroupBy);
        }
        private FindItems_0(searchFilter: SearchFilter, view: ItemView): FindItemsResults<Item> {
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.InternalFindItems<Item>(searchFilter, view, null);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_1(queryString: string, view: ItemView): FindItemsResults<Item> {
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.InternalFindItems<Item>(queryString, view, null);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_2(view: ItemView): FindItemsResults<Item> {
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.InternalFindItems<Item>(null, view, null);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_3(searchFilter: SearchFilter, view: ItemView, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.InternalFindItems<Item>(searchFilter, view, groupBy);
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        private FindItems_4(queryString: string, view: ItemView, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.InternalFindItems<Item>(queryString, view, groupBy);
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        FindFolders(view: FolderView): FindFoldersResults;
        FindFolders(searchFilter: SearchFilter, view: FolderView): FindFoldersResults;
        FindFolders(viewOrSearchFilter: any, view?: FolderView): FindFoldersResults {
            if (arguments.length === 1 && (viewOrSearchFilter === null || viewOrSearchFilter instanceof FolderView)) {
                return this.FindFolders_0(viewOrSearchFilter);
            }
            return this.FindFolders_1(viewOrSearchFilter, view);
        }
        private FindFolders_0(view: FolderView): FindFoldersResults {
            super.ThrowIfThisIsNew();
            return this.Service.FindFolders(this.Id, view);
        }
        private FindFolders_1(searchFilter: SearchFilter, view: FolderView): FindFoldersResults {
            super.ThrowIfThisIsNew();
            return this.Service.FindFolders(this.Id, searchFilter, view);
        }
        private FindItems_5(view: ItemView, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            return this.FindItems(null, view, groupBy);
        }
        GetIdPropertyDefinition(): PropertyDefinition {
            return FolderSchema.Id;
        }
        SetExtendedProperty(extendedPropertyDefinition: ExtendedPropertyDefinition, value: any): void {
            this.ExtendedProperties.SetExtendedProperty(extendedPropertyDefinition, value);
        }
        RemoveExtendedProperty(extendedPropertyDefinition: ExtendedPropertyDefinition): boolean {
            return this.ExtendedProperties.RemoveExtendedProperty(extendedPropertyDefinition);
        }
        GetExtendedProperties(): ExtendedPropertyCollection {
            return this.ExtendedProperties;
        }
    }
    class CalendarFolder extends Folder {
        static Bind(service: ExchangeService, id: FolderId, propertySet: PropertySet): CalendarFolder;
        static Bind(service: ExchangeService, id: FolderId): CalendarFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): CalendarFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName): CalendarFolder;
        static Bind(service: ExchangeService, idOrName: any, propertySet?: PropertySet): CalendarFolder {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return CalendarFolder.Bind_0(service, idOrName, propertySet);
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId)) {
                return CalendarFolder.Bind_1(service, idOrName);
            }
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName.constructor === Number) && (propertySet === null || propertySet instanceof PropertySet)) {
                return CalendarFolder.Bind_2(service, idOrName, propertySet);
            }
            return CalendarFolder.Bind_3(service, idOrName);
        }
        private static Bind_0(service: ExchangeService, id: FolderId, propertySet: PropertySet): CalendarFolder {
            return service.BindToFolder<CalendarFolder>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: FolderId): CalendarFolder {
            return CalendarFolder.Bind(service, id, PropertySet.FirstClassProperties);
        }
        private static Bind_2(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): CalendarFolder {
            return CalendarFolder.Bind(service, new FolderId(name), propertySet);
        }
        private static Bind_3(service: ExchangeService, name: WellKnownFolderName): CalendarFolder {
            return CalendarFolder.Bind(service, new FolderId(name), PropertySet.FirstClassProperties);
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        FindAppointments(view: CalendarView): FindItemsResults<Appointment> {
            EwsUtilities.ValidateParam(view, "view");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Appointment>> = super.InternalFindItems<Appointment>(null, view, null);
            return serviceResponseCollection.get_Item(0).Results;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class ContactsFolder extends Folder {
        constructor(service: ExchangeService) {
            super(service);
        }
        static Bind(service: ExchangeService, id: FolderId, propertySet: PropertySet): ContactsFolder;
        static Bind(service: ExchangeService, id: FolderId): ContactsFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): ContactsFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName): ContactsFolder;
        static Bind(service: ExchangeService, idOrName: any, propertySet?: PropertySet): ContactsFolder {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return ContactsFolder.Bind_0(service, idOrName, propertySet);
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId)) {
                return ContactsFolder.Bind_1(service, idOrName);
            }
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName.constructor === Number) && (propertySet === null || propertySet instanceof PropertySet)) {
                return ContactsFolder.Bind_2(service, idOrName, propertySet);
            }
            return ContactsFolder.Bind_3(service, idOrName);
        }
        private static Bind_0(service: ExchangeService, id: FolderId, propertySet: PropertySet): ContactsFolder {
            return service.BindToFolder<ContactsFolder>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: FolderId): ContactsFolder {
            return ContactsFolder.Bind(service, id, PropertySet.FirstClassProperties);
        }
        private static Bind_2(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): ContactsFolder {
            return ContactsFolder.Bind(service, new FolderId(name), propertySet);
        }
        private static Bind_3(service: ExchangeService, name: WellKnownFolderName): ContactsFolder {
            return ContactsFolder.Bind(service, new FolderId(name), PropertySet.FirstClassProperties);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class SearchFolder extends Folder {
        get SearchParameters(): SearchFolderParameters {
            return <SearchFolderParameters>this.PropertyBag.get_Item(SearchFolderSchema.SearchParameters);
        }
        static Bind(service: ExchangeService, id: FolderId, propertySet: PropertySet): SearchFolder;
        static Bind(service: ExchangeService, id: FolderId): SearchFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): SearchFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName): SearchFolder;
        static Bind(service: ExchangeService, idOrName: any, propertySet?: PropertySet): SearchFolder {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return SearchFolder.Bind_0(service, idOrName, propertySet);
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId)) {
                return SearchFolder.Bind_1(service, idOrName);
            }
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName.constructor === Number) && (propertySet === null || propertySet instanceof PropertySet)) {
                return SearchFolder.Bind_2(service, idOrName, propertySet);
            }
            return SearchFolder.Bind_3(service, idOrName);
        }
        private static Bind_0(service: ExchangeService, id: FolderId, propertySet: PropertySet): SearchFolder {
            return service.BindToFolder<SearchFolder>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: FolderId): SearchFolder {
            return SearchFolder.Bind(service, id, PropertySet.FirstClassProperties);
        }
        private static Bind_2(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): SearchFolder {
            return SearchFolder.Bind(service, new FolderId(name), propertySet);
        }
        private static Bind_3(service: ExchangeService, name: WellKnownFolderName): SearchFolder {
            return SearchFolder.Bind(service, new FolderId(name), PropertySet.FirstClassProperties);
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetSchema(): ServiceObjectSchema {
            return SearchFolderSchema.Instance;
        }
        Validate(): void {
            super.Validate();
            if (this.SearchParameters !== null) {
                this.SearchParameters.Validate();
            }
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class TasksFolder extends Folder {
        constructor(service: ExchangeService) {
            super(service);
        }
        static Bind(service: ExchangeService, id: FolderId, propertySet: PropertySet): TasksFolder;
        static Bind(service: ExchangeService, id: FolderId): TasksFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): TasksFolder;
        static Bind(service: ExchangeService, name: WellKnownFolderName): TasksFolder;
        static Bind(service: ExchangeService, idOrName: any, propertySet?: PropertySet): TasksFolder {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return TasksFolder.Bind_0(service, idOrName, propertySet);
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName instanceof FolderId)) {
                return TasksFolder.Bind_1(service, idOrName);
            }
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (idOrName === null || idOrName.constructor === Number) && (propertySet === null || propertySet instanceof PropertySet)) {
                return TasksFolder.Bind_2(service, idOrName, propertySet);
            }
            return TasksFolder.Bind_3(service, idOrName);
        }
        private static Bind_0(service: ExchangeService, id: FolderId, propertySet: PropertySet): TasksFolder {
            return service.BindToFolder<TasksFolder>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: FolderId): TasksFolder {
            return TasksFolder.Bind(service, id, PropertySet.FirstClassProperties);
        }
        private static Bind_2(service: ExchangeService, name: WellKnownFolderName, propertySet: PropertySet): TasksFolder {
            return TasksFolder.Bind(service, new FolderId(name), propertySet);
        }
        private static Bind_3(service: ExchangeService, name: WellKnownFolderName): TasksFolder {
            return TasksFolder.Bind(service, new FolderId(name), PropertySet.FirstClassProperties);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class Item extends ServiceObject {
        private parentAttachment: ItemAttachment = null;
        get ParentAttachment(): ItemAttachment {
            return this.parentAttachment;
        }
        get RootItemId(): ItemId {
            if (this.IsAttachment && this.ParentAttachment.Owner !== null) {
                return this.ParentAttachment.Owner.RootItemId;
            }
            return this.Id;
        }
        get IsAttachment(): boolean {
            return this.parentAttachment !== null;
        }
        get IsNew(): boolean {
            if (this.IsAttachment) {
                return this.ParentAttachment.IsNew;
            }
            return this.IsNew;
        }
        get Id(): ItemId {
            return <ItemId>this.PropertyBag.get_Item(this.GetIdPropertyDefinition());
        }
        set MimeContent(value: MimeContent) {
            this.PropertyBag.set_Item(ItemSchema.MimeContent, value);
        }
        get MimeContent(): MimeContent {
            return <MimeContent>this.PropertyBag.get_Item(ItemSchema.MimeContent);
        }
        get ParentFolderId(): FolderId {
            return <FolderId>this.PropertyBag.get_Item(ItemSchema.ParentFolderId);
        }
        set Sensitivity(value: Sensitivity) {
            this.PropertyBag.set_Item(ItemSchema.Sensitivity, value);
        }
        get Sensitivity(): Sensitivity {
            return <Sensitivity>this.PropertyBag.get_Item(ItemSchema.Sensitivity);
        }
        get Attachments(): AttachmentCollection {
            return <AttachmentCollection>this.PropertyBag.get_Item(ItemSchema.Attachments);
        }
        get DateTimeReceived(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ItemSchema.DateTimeReceived);
        }
        get Size(): number {
            return <number>this.PropertyBag.get_Item(ItemSchema.Size);
        }
        set Categories(value: StringList) {
            this.PropertyBag.set_Item(ItemSchema.Categories, value);
        }
        get Categories(): StringList {
            return <StringList>this.PropertyBag.get_Item(ItemSchema.Categories);
        }
        set Culture(value: string) {
            this.PropertyBag.set_Item(ItemSchema.Culture, value);
        }
        get Culture(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.Culture);
        }
        set Importance(value: Importance) {
            this.PropertyBag.set_Item(ItemSchema.Importance, value);
        }
        get Importance(): Importance {
            return <Importance>this.PropertyBag.get_Item(ItemSchema.Importance);
        }
        set InReplyTo(value: string) {
            this.PropertyBag.set_Item(ItemSchema.InReplyTo, value);
        }
        get InReplyTo(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.InReplyTo);
        }
        get IsSubmitted(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsSubmitted);
        }
        get IsAssociated(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsAssociated);
        }
        get IsDraft(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsDraft);
        }
        get IsFromMe(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsFromMe);
        }
        get IsResend(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsResend);
        }
        get IsUnmodified(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsUnmodified);
        }
        get InternetMessageHeaders(): InternetMessageHeaderCollection {
            return <InternetMessageHeaderCollection>this.PropertyBag.get_Item(ItemSchema.InternetMessageHeaders);
        }
        get DateTimeSent(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ItemSchema.DateTimeSent);
        }
        get DateTimeCreated(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ItemSchema.DateTimeCreated);
        }
        get AllowedResponseActions(): ResponseActions {
            return <ResponseActions>this.PropertyBag.get_Item(ItemSchema.AllowedResponseActions);
        }
        set ReminderDueBy(value: DateTime) {
            this.PropertyBag.set_Item(ItemSchema.ReminderDueBy, value);
        }
        get ReminderDueBy(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ItemSchema.ReminderDueBy);
        }
        set IsReminderSet(value: boolean) {
            this.PropertyBag.set_Item(ItemSchema.IsReminderSet, value);
        }
        get IsReminderSet(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.IsReminderSet);
        }
        set ReminderMinutesBeforeStart(value: number) {
            this.PropertyBag.set_Item(ItemSchema.ReminderMinutesBeforeStart, value);
        }
        get ReminderMinutesBeforeStart(): number {
            return <number>this.PropertyBag.get_Item(ItemSchema.ReminderMinutesBeforeStart);
        }
        get DisplayCc(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.DisplayCc);
        }
        get DisplayTo(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.DisplayTo);
        }
        get HasAttachments(): boolean {
            return <boolean>this.PropertyBag.get_Item(ItemSchema.HasAttachments);
        }
        set Body(value: MessageBody) {
            this.PropertyBag.set_Item(ItemSchema.Body, value);
        }
        get Body(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ItemSchema.Body);
        }
        set ItemClass(value: string) {
            this.PropertyBag.set_Item(ItemSchema.ItemClass, value);
        }
        get ItemClass(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.ItemClass);
        }
        set Subject(value: string) {
            this.SetSubject(value);
        }
        get Subject(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.Subject);
        }
        get WebClientReadFormQueryString(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.WebClientReadFormQueryString);
        }
        get WebClientEditFormQueryString(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.WebClientEditFormQueryString);
        }
        get ExtendedProperties(): ExtendedPropertyCollection {
            return <ExtendedPropertyCollection>this.PropertyBag.get_Item(ServiceObjectSchema.ExtendedProperties);
        }
        get EffectiveRights(): EffectiveRights {
            return <EffectiveRights>this.PropertyBag.get_Item(ItemSchema.EffectiveRights);
        }
        get LastModifiedName(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.LastModifiedName);
        }
        get LastModifiedTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ItemSchema.LastModifiedTime);
        }
        get ConversationId(): ConversationId {
            return <ConversationId>this.PropertyBag.get_Item(ItemSchema.ConversationId);
        }
        get UniqueBody(): UniqueBody {
            return <UniqueBody>this.PropertyBag.get_Item(ItemSchema.UniqueBody);
        }
        get StoreEntryId(): number[] {
            return <number[]>this.PropertyBag.get_Item(ItemSchema.StoreEntryId);
        }
        get InstanceKey(): number[] {
            return <number[]>this.PropertyBag.get_Item(ItemSchema.InstanceKey);
        }
        set Flag(value: Flag) {
            this.PropertyBag.set_Item(ItemSchema.Flag, value);
        }
        get Flag(): Flag {
            return <Flag>this.PropertyBag.get_Item(ItemSchema.Flag);
        }
        get NormalizedBody(): NormalizedBody {
            return <NormalizedBody>this.PropertyBag.get_Item(ItemSchema.NormalizedBody);
        }
        get EntityExtractionResult(): EntityExtractionResult {
            return <EntityExtractionResult>this.PropertyBag.get_Item(ItemSchema.EntityExtractionResult);
        }
        set PolicyTag(value: PolicyTag) {
            this.PropertyBag.set_Item(ItemSchema.PolicyTag, value);
        }
        get PolicyTag(): PolicyTag {
            return <PolicyTag>this.PropertyBag.get_Item(ItemSchema.PolicyTag);
        }
        set ArchiveTag(value: ArchiveTag) {
            this.PropertyBag.set_Item(ItemSchema.ArchiveTag, value);
        }
        get ArchiveTag(): ArchiveTag {
            return <ArchiveTag>this.PropertyBag.get_Item(ItemSchema.ArchiveTag);
        }
        get RetentionDate(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(ItemSchema.RetentionDate);
        }
        get Preview(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.Preview);
        }
        get TextBody(): TextBody {
            return <TextBody>this.PropertyBag.get_Item(ItemSchema.TextBody);
        }
        get IconIndex(): IconIndex {
            return <IconIndex>this.PropertyBag.get_Item(ItemSchema.IconIndex);
        }
        get DefaultAffectedTaskOccurrences(): Nullable<AffectedTaskOccurrence> {
            return null;
        }
        get DefaultSendCancellationsMode(): Nullable<SendCancellationsMode> {
            return null;
        }
        get DefaultSendInvitationsMode(): Nullable<SendInvitationsMode> {
            return null;
        }
        get DefaultSendInvitationsOrCancellationsMode(): Nullable<SendInvitationsOrCancellationsMode> {
            return null;
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            super(serviceOrParentAttachment);
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
            this.constructor_0(parentAttachment.Service);
            EwsUtilities.Assert(parentAttachment !== null, "Item.ctor", "parentAttachment is null");
            this.parentAttachment = parentAttachment;
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): Item;
        static Bind(service: ExchangeService, id: ItemId): Item;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): Item {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Item.Bind_0(service, id, propertySet);
            }
            return Item.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): Item {
            return service.BindToItem<Item>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): Item {
            return Item.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return ItemSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        ThrowIfThisIsAttachment(): void {
            if (this.IsAttachment) {
                throw new InvalidOperationException(Strings.OperationDoesNotSupportAttachments);
            }
        }
        GetIdPropertyDefinition(): PropertyDefinition {
            return ItemSchema.Id;
        }
        InternalLoad(propertySet: PropertySet): void {
            super.ThrowIfThisIsNew();
            this.ThrowIfThisIsAttachment();
            this.Service.InternalLoadPropertiesForItems(NArray.ToEnumerable([
                this
            ]), propertySet, ServiceErrorHandling.ThrowOnError);
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void;
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipts: boolean): void;
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: any, affectedTaskOccurrences: any, suppressReadReceipts?: boolean): void {
            if (arguments.length === 3 && (deleteMode === null || deleteMode.constructor === Number) && (sendCancellationsMode === null || sendCancellationsMode instanceof Array) && (affectedTaskOccurrences === null || affectedTaskOccurrences instanceof Array)) {
                this.InternalDelete_0(deleteMode, sendCancellationsMode, affectedTaskOccurrences);
                return;
            }
            this.InternalDelete_1(deleteMode, sendCancellationsMode, affectedTaskOccurrences, suppressReadReceipts);
        }
        private InternalDelete_0(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            this.InternalDelete(deleteMode, sendCancellationsMode, affectedTaskOccurrences, false);
        }
        private InternalDelete_1(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipts: boolean): void {
            super.ThrowIfThisIsNew();
            this.ThrowIfThisIsAttachment();
            if (!(sendCancellationsMode !== null)) {
                sendCancellationsMode = this.DefaultSendCancellationsMode;
            }
            if (!(affectedTaskOccurrences !== null)) {
                affectedTaskOccurrences = this.DefaultAffectedTaskOccurrences;
            }
            this.Service.DeleteItem(this.Id, deleteMode, sendCancellationsMode, affectedTaskOccurrences, suppressReadReceipts);
        }
        InternalCreate(parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>, sendInvitationsMode: Nullable<SendInvitationsMode>): void {
            super.ThrowIfThisIsNotNew();
            this.ThrowIfThisIsAttachment();
            if (this.IsNew || this.IsDirty) {
                this.Service.CreateItem(this, parentFolderId, messageDisposition, (sendInvitationsMode !== null) ? sendInvitationsMode : this.DefaultSendInvitationsMode);
                this.Attachments.Save();
            }
        }
        InternalUpdate(parentFolderId: FolderId, conflictResolutionMode: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): Item;
        InternalUpdate(parentFolderId: FolderId, conflictResolutionMode: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): Item;
        InternalUpdate(parentFolderId: FolderId, conflictResolutionMode: ConflictResolutionMode, messageDisposition: any, sendInvitationsOrCancellationsMode: any, suppressReadReceipts?: boolean): Item {
            if (arguments.length === 4 && (parentFolderId === null || parentFolderId instanceof FolderId) && (conflictResolutionMode === null || conflictResolutionMode.constructor === Number) && (messageDisposition === null || messageDisposition instanceof Array) && (sendInvitationsOrCancellationsMode === null || sendInvitationsOrCancellationsMode instanceof Array)) {
                return this.InternalUpdate_0(parentFolderId, conflictResolutionMode, messageDisposition, sendInvitationsOrCancellationsMode);
            }
            return this.InternalUpdate_1(parentFolderId, conflictResolutionMode, messageDisposition, sendInvitationsOrCancellationsMode, suppressReadReceipts);
        }
        private InternalUpdate_0(parentFolderId: FolderId, conflictResolutionMode: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): Item {
            return this.InternalUpdate(parentFolderId, conflictResolutionMode, messageDisposition, sendInvitationsOrCancellationsMode, false);
        }
        private InternalUpdate_1(parentFolderId: FolderId, conflictResolutionMode: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): Item {
            super.ThrowIfThisIsNew();
            this.ThrowIfThisIsAttachment();
            var result: Item = null;
            if (this.IsDirty && this.PropertyBag.GetIsUpdateCallNecessary()) {
                result = this.Service.UpdateItem(this, parentFolderId, conflictResolutionMode, messageDisposition, (sendInvitationsOrCancellationsMode !== null) ? sendInvitationsOrCancellationsMode : this.DefaultSendInvitationsOrCancellationsMode, suppressReadReceipts);
            }
            if (this.HasUnprocessedAttachmentChanges()) {
                this.Attachments.Validate();
                this.Attachments.Save();
            }
            return result;
        }
        HasUnprocessedAttachmentChanges(): boolean {
            return this.Attachments.HasUnprocessedChanges();
        }
        Delete(deleteMode: DeleteMode): void;
        Delete(deleteMode: DeleteMode, suppressReadReceipts: boolean): void;
        Delete(deleteMode: DeleteMode, suppressReadReceipts?: boolean): void {
            if (arguments.length === 1 && (deleteMode === null || deleteMode.constructor === Number)) {
                this.Delete_0(deleteMode);
                return;
            }
            this.Delete_1(deleteMode, suppressReadReceipts);
        }
        private Delete_0(deleteMode: DeleteMode): void {
            this.Delete(deleteMode, false);
        }
        private Delete_1(deleteMode: DeleteMode, suppressReadReceipts: boolean): void {
            this.InternalDelete(deleteMode, null, null, suppressReadReceipts);
        }
        Save(parentFolderId: FolderId): void;
        Save(parentFolderName: WellKnownFolderName): void;
        Save(): void;
        Save(parentFolderIdOrParentFolderName?: any): void {
            if (arguments.length === 1 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId)) {
                this.Save_0(parentFolderIdOrParentFolderName);
                return;
            }
            if (arguments.length === 1 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName.constructor === Number)) {
                this.Save_1(parentFolderIdOrParentFolderName);
                return;
            }
            this.Save_2();
        }
        private Save_0(parentFolderId: FolderId): void {
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            this.InternalCreate(parentFolderId, new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null);
        }
        private Save_1(parentFolderName: WellKnownFolderName): void {
            this.InternalCreate(new FolderId(parentFolderName), new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null);
        }
        private Save_2(): void {
            this.InternalCreate(null, new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null);
        }
        Update(conflictResolutionMode: ConflictResolutionMode): void;
        Update(conflictResolutionMode: ConflictResolutionMode, suppressReadReceipts: boolean): void;
        Update(conflictResolutionMode: ConflictResolutionMode, suppressReadReceipts?: boolean): void {
            if (arguments.length === 1 && (conflictResolutionMode === null || conflictResolutionMode.constructor === Number)) {
                this.Update_0(conflictResolutionMode);
                return;
            }
            this.Update_1(conflictResolutionMode, suppressReadReceipts);
        }
        private Update_0(conflictResolutionMode: ConflictResolutionMode): void {
            this.Update(conflictResolutionMode, false);
        }
        private Update_1(conflictResolutionMode: ConflictResolutionMode, suppressReadReceipts: boolean): void {
            this.InternalUpdate(null, conflictResolutionMode, new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null, suppressReadReceipts);
        }
        Copy(destinationFolderId: FolderId): Item;
        Copy(destinationFolderName: WellKnownFolderName): Item;
        Copy(destinationFolderIdOrDestinationFolderName: any): Item {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Copy_0(destinationFolderIdOrDestinationFolderName);
            }
            return this.Copy_1(destinationFolderIdOrDestinationFolderName);
        }
        private Copy_0(destinationFolderId: FolderId): Item {
            super.ThrowIfThisIsNew();
            this.ThrowIfThisIsAttachment();
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.Service.CopyItem(this.Id, destinationFolderId);
        }
        private Copy_1(destinationFolderName: WellKnownFolderName): Item {
            return this.Copy(new FolderId(destinationFolderName));
        }
        Move(destinationFolderId: FolderId): Item;
        Move(destinationFolderName: WellKnownFolderName): Item;
        Move(destinationFolderIdOrDestinationFolderName: any): Item {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Move_0(destinationFolderIdOrDestinationFolderName);
            }
            return this.Move_1(destinationFolderIdOrDestinationFolderName);
        }
        private Move_0(destinationFolderId: FolderId): Item {
            super.ThrowIfThisIsNew();
            this.ThrowIfThisIsAttachment();
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.Service.MoveItem(this.Id, destinationFolderId);
        }
        private Move_1(destinationFolderName: WellKnownFolderName): Item {
            return this.Move(new FolderId(destinationFolderName));
        }
        SetExtendedProperty(extendedPropertyDefinition: ExtendedPropertyDefinition, value: any): void {
            this.ExtendedProperties.SetExtendedProperty(extendedPropertyDefinition, value);
        }
        RemoveExtendedProperty(extendedPropertyDefinition: ExtendedPropertyDefinition): boolean {
            return this.ExtendedProperties.RemoveExtendedProperty(extendedPropertyDefinition);
        }
        GetExtendedProperties(): ExtendedPropertyCollection {
            return this.ExtendedProperties;
        }
        Validate(): void {
            super.Validate();
            this.Attachments.Validate();
            var flag: Flag;
            if ((() => {
                var _p0 = [
                    flag
                ];
                var _r = super.TryGetProperty<Flag>(ItemSchema.Flag, _p0);
                flag = _p0[0];
                return _r;
            })() && flag !== null) {
                if (this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                    throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "Flag", ExchangeVersion.Exchange2013));
                }
                flag.Validate();
            }
        }
        GetIsTimeZoneHeaderRequired(isUpdateOperation: boolean): boolean {
            if (!isUpdateOperation && this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2010_SP2) {
                var enumerator: IEnumerator<ItemAttachment> = Enumerable.OfType<ItemAttachment>(this.Attachments).GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: ItemAttachment = enumerator.Current;
                        if (current.Item !== null && current.Item.GetIsTimeZoneHeaderRequired(false)) {
                            return true;
                        }
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
            return super.GetIsTimeZoneHeaderRequired(isUpdateOperation);
        }
        SetSubject(subject: string): void {
            this.PropertyBag.set_Item(ItemSchema.Subject, subject);
        }
    }
    interface ICalendarActionProvider {
        Accept(sendResponse: boolean): CalendarActionResults;
        AcceptTentatively(sendResponse: boolean): CalendarActionResults;
        Decline(sendResponse: boolean): CalendarActionResults;
        CreateAcceptMessage(tentative: boolean): AcceptMeetingInvitationMessage;
        CreateDeclineMessage(): DeclineMeetingInvitationMessage;
    }
    class Appointment extends Item implements ICalendarActionProvider {
        get DefaultSendCancellationsMode(): Nullable<SendCancellationsMode> {
            return new Nullable<SendCancellationsMode>(SendCancellationsMode.SendToAllAndSaveCopy);
        }
        get DefaultSendInvitationsMode(): Nullable<SendInvitationsMode> {
            return new Nullable<SendInvitationsMode>(SendInvitationsMode.SendToAllAndSaveCopy);
        }
        get DefaultSendInvitationsOrCancellationsMode(): Nullable<SendInvitationsOrCancellationsMode> {
            return new Nullable<SendInvitationsOrCancellationsMode>(SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);
        }
        set Start(value: DateTime) {
            this.PropertyBag.set_Item(AppointmentSchema.Start, value);
        }
        get Start(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.Start);
        }
        set End(value: DateTime) {
            this.PropertyBag.set_Item(AppointmentSchema.End, value);
        }
        get End(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.End);
        }
        get OriginalStart(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.OriginalStart);
        }
        set IsAllDayEvent(value: boolean) {
            this.PropertyBag.set_Item(AppointmentSchema.IsAllDayEvent, value);
        }
        get IsAllDayEvent(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsAllDayEvent);
        }
        set LegacyFreeBusyStatus(value: LegacyFreeBusyStatus) {
            this.PropertyBag.set_Item(AppointmentSchema.LegacyFreeBusyStatus, value);
        }
        get LegacyFreeBusyStatus(): LegacyFreeBusyStatus {
            return <LegacyFreeBusyStatus>this.PropertyBag.get_Item(AppointmentSchema.LegacyFreeBusyStatus);
        }
        set Location(value: string) {
            this.PropertyBag.set_Item(AppointmentSchema.Location, value);
        }
        get Location(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.Location);
        }
        get When(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.When);
        }
        get IsMeeting(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsMeeting);
        }
        get IsCancelled(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsCancelled);
        }
        get IsRecurring(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsRecurring);
        }
        get MeetingRequestWasSent(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.MeetingRequestWasSent);
        }
        set IsResponseRequested(value: boolean) {
            this.PropertyBag.set_Item(AppointmentSchema.IsResponseRequested, value);
        }
        get IsResponseRequested(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsResponseRequested);
        }
        get AppointmentType(): AppointmentType {
            return <AppointmentType>this.PropertyBag.get_Item(AppointmentSchema.AppointmentType);
        }
        get MyResponseType(): MeetingResponseType {
            return <MeetingResponseType>this.PropertyBag.get_Item(AppointmentSchema.MyResponseType);
        }
        get Organizer(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(AppointmentSchema.Organizer);
        }
        get RequiredAttendees(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.RequiredAttendees);
        }
        get OptionalAttendees(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.OptionalAttendees);
        }
        get Resources(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.Resources);
        }
        get ConflictingMeetingCount(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.ConflictingMeetingCount);
        }
        get AdjacentMeetingCount(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AdjacentMeetingCount);
        }
        get ConflictingMeetings(): ItemCollection<Appointment> {
            return <ItemCollection<Appointment>>this.PropertyBag.get_Item(AppointmentSchema.ConflictingMeetings);
        }
        get AdjacentMeetings(): ItemCollection<Appointment> {
            return <ItemCollection<Appointment>>this.PropertyBag.get_Item(AppointmentSchema.AdjacentMeetings);
        }
        get Duration(): TimeSpan {
            return <TimeSpan>this.PropertyBag.get_Item(AppointmentSchema.Duration);
        }
        get TimeZone(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.TimeZone);
        }
        get AppointmentReplyTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.AppointmentReplyTime);
        }
        get AppointmentSequenceNumber(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AppointmentSequenceNumber);
        }
        get AppointmentState(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AppointmentState);
        }
        set Recurrence(value: Recurrence) {
            if (value !== null && value.IsRegenerationPattern) {
                throw new ServiceLocalException(Strings.RegenerationPatternsOnlyValidForTasks);
            }
            this.PropertyBag.set_Item(AppointmentSchema.Recurrence, value);
        }
        get Recurrence(): Recurrence {
            return <Recurrence>this.PropertyBag.get_Item(AppointmentSchema.Recurrence);
        }
        get FirstOccurrence(): OccurrenceInfo {
            return <OccurrenceInfo>this.PropertyBag.get_Item(AppointmentSchema.FirstOccurrence);
        }
        get LastOccurrence(): OccurrenceInfo {
            return <OccurrenceInfo>this.PropertyBag.get_Item(AppointmentSchema.LastOccurrence);
        }
        get ModifiedOccurrences(): OccurrenceInfoCollection {
            return <OccurrenceInfoCollection>this.PropertyBag.get_Item(AppointmentSchema.ModifiedOccurrences);
        }
        get DeletedOccurrences(): DeletedOccurrenceInfoCollection {
            return <DeletedOccurrenceInfoCollection>this.PropertyBag.get_Item(AppointmentSchema.DeletedOccurrences);
        }
        set StartTimeZone(value: TimeZoneInfo) {
            this.PropertyBag.set_Item(AppointmentSchema.StartTimeZone, value);
        }
        get StartTimeZone(): TimeZoneInfo {
            return <TimeZoneInfo>this.PropertyBag.get_Item(AppointmentSchema.StartTimeZone);
        }
        set EndTimeZone(value: TimeZoneInfo) {
            this.PropertyBag.set_Item(AppointmentSchema.EndTimeZone, value);
        }
        get EndTimeZone(): TimeZoneInfo {
            return <TimeZoneInfo>this.PropertyBag.get_Item(AppointmentSchema.EndTimeZone);
        }
        set ConferenceType(value: number) {
            this.PropertyBag.set_Item(AppointmentSchema.ConferenceType, value);
        }
        get ConferenceType(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.ConferenceType);
        }
        set AllowNewTimeProposal(value: boolean) {
            this.PropertyBag.set_Item(AppointmentSchema.AllowNewTimeProposal, value);
        }
        get AllowNewTimeProposal(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.AllowNewTimeProposal);
        }
        set IsOnlineMeeting(value: boolean) {
            this.PropertyBag.set_Item(AppointmentSchema.IsOnlineMeeting, value);
        }
        get IsOnlineMeeting(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsOnlineMeeting);
        }
        set MeetingWorkspaceUrl(value: string) {
            this.PropertyBag.set_Item(AppointmentSchema.MeetingWorkspaceUrl, value);
        }
        get MeetingWorkspaceUrl(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.MeetingWorkspaceUrl);
        }
        set NetShowUrl(value: string) {
            this.PropertyBag.set_Item(AppointmentSchema.NetShowUrl, value);
        }
        get NetShowUrl(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.NetShowUrl);
        }
        set ICalUid(value: string) {
            this.PropertyBag.set_Item(AppointmentSchema.ICalUid, value);
        }
        get ICalUid(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.ICalUid);
        }
        get ICalRecurrenceId(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(AppointmentSchema.ICalRecurrenceId);
        }
        get ICalDateTimeStamp(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(AppointmentSchema.ICalDateTimeStamp);
        }
        set EnhancedLocation(value: EnhancedLocation) {
            this.PropertyBag.set_Item(AppointmentSchema.EnhancedLocation, value);
        }
        get EnhancedLocation(): EnhancedLocation {
            return <EnhancedLocation>this.PropertyBag.get_Item(AppointmentSchema.EnhancedLocation);
        }
        get JoinOnlineMeetingUrl(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.JoinOnlineMeetingUrl);
        }
        get OnlineMeetingSettings(): OnlineMeetingSettings {
            return <OnlineMeetingSettings>this.PropertyBag.get_Item(AppointmentSchema.OnlineMeetingSettings);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment, isNew: boolean);
        constructor(serviceOrParentAttachment: any, isNew?: boolean) {
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                super(serviceOrParentAttachment);
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            super(serviceOrParentAttachment);
            this.constructor_1(serviceOrParentAttachment, isNew);
        }
        private constructor_0(service: ExchangeService): void {
            if (service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                this.StartTimeZone = service.TimeZone;
            }
        }
        private constructor_1(parentAttachment: ItemAttachment, isNew: boolean): void {
            if (parentAttachment.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1 && isNew) {
                this.StartTimeZone = parentAttachment.Service.TimeZone;
            }
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): Appointment;
        static Bind(service: ExchangeService, id: ItemId): Appointment;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): Appointment {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Appointment.Bind_0(service, id, propertySet);
            }
            return Appointment.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): Appointment {
            return service.BindToItem<Appointment>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): Appointment {
            return Appointment.Bind(service, id, PropertySet.FirstClassProperties);
        }
        static BindToOccurrence(service: ExchangeService, recurringMasterId: ItemId, occurenceIndex: number): Appointment;
        static BindToOccurrence(service: ExchangeService, recurringMasterId: ItemId, occurenceIndex: number, propertySet: PropertySet): Appointment;
        static BindToOccurrence(service: ExchangeService, recurringMasterId: ItemId, occurenceIndex: number, propertySet?: PropertySet): Appointment {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (recurringMasterId === null || recurringMasterId instanceof ItemId) && (occurenceIndex === null || occurenceIndex.constructor === Number)) {
                return Appointment.BindToOccurrence_0(service, recurringMasterId, occurenceIndex);
            }
            return Appointment.BindToOccurrence_1(service, recurringMasterId, occurenceIndex, propertySet);
        }
        private static BindToOccurrence_0(service: ExchangeService, recurringMasterId: ItemId, occurenceIndex: number): Appointment {
            return Appointment.BindToOccurrence(service, recurringMasterId, occurenceIndex, PropertySet.FirstClassProperties);
        }
        private static BindToOccurrence_1(service: ExchangeService, recurringMasterId: ItemId, occurenceIndex: number, propertySet: PropertySet): Appointment {
            var id: AppointmentOccurrenceId = new AppointmentOccurrenceId(recurringMasterId.UniqueId, occurenceIndex);
            return Appointment.Bind(service, id, propertySet);
        }
        static BindToRecurringMaster(service: ExchangeService, occurrenceId: ItemId): Appointment;
        static BindToRecurringMaster(service: ExchangeService, occurrenceId: ItemId, propertySet: PropertySet): Appointment;
        static BindToRecurringMaster(service: ExchangeService, occurrenceId: ItemId, propertySet?: PropertySet): Appointment {
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (occurrenceId === null || occurrenceId instanceof ItemId)) {
                return Appointment.BindToRecurringMaster_0(service, occurrenceId);
            }
            return Appointment.BindToRecurringMaster_1(service, occurrenceId, propertySet);
        }
        private static BindToRecurringMaster_0(service: ExchangeService, occurrenceId: ItemId): Appointment {
            return Appointment.BindToRecurringMaster(service, occurrenceId, PropertySet.FirstClassProperties);
        }
        private static BindToRecurringMaster_1(service: ExchangeService, occurrenceId: ItemId, propertySet: PropertySet): Appointment {
            var id: RecurringAppointmentMasterId = new RecurringAppointmentMasterId(occurrenceId.UniqueId);
            return Appointment.Bind(service, id, propertySet);
        }
        GetSchema(): ServiceObjectSchema {
            return AppointmentSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        GetIsTimeZoneHeaderRequired(isUpdateOperation: boolean): boolean {
            if (isUpdateOperation) {
                return false;
            }
            var flag: boolean = this.PropertyBag.IsPropertyUpdated(AppointmentSchema.StartTimeZone);
            var flag2: boolean = this.PropertyBag.IsPropertyUpdated(AppointmentSchema.EndTimeZone);
            if (flag && flag2) {
                var timeZoneInfo: TimeZoneInfo;
                (() => {
                    var _p0 = [
                        timeZoneInfo
                    ];
                    var _r = this.PropertyBag.TryGetProperty<TimeZoneInfo>(AppointmentSchema.StartTimeZone, _p0);
                    timeZoneInfo = _p0[0];
                    return _r;
                })();
                var timeZoneInfo2: TimeZoneInfo;
                (() => {
                    var _p0 = [
                        timeZoneInfo2
                    ];
                    var _r = this.PropertyBag.TryGetProperty<TimeZoneInfo>(AppointmentSchema.EndTimeZone, _p0);
                    timeZoneInfo2 = _p0[0];
                    return _r;
                })();
                return timeZoneInfo === this.Service.TimeZone || timeZoneInfo2 === this.Service.TimeZone;
            }
            return true;
        }
        GetIsCustomDateTimeScopingRequired(): boolean {
            return true;
        }
        Validate(): void {
            super.Validate();
            if (this.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1 && !this.Service.Exchange2007CompatibilityMode && (this.PropertyBag.IsPropertyUpdated(AppointmentSchema.Start) || this.PropertyBag.IsPropertyUpdated(AppointmentSchema.End) || this.PropertyBag.IsPropertyUpdated(AppointmentSchema.IsAllDayEvent) || this.PropertyBag.IsPropertyUpdated(AppointmentSchema.Recurrence))) {
                if (!this.PropertyBag.Contains(AppointmentSchema.StartTimeZone)) {
                    throw new ServiceLocalException(Strings.StartTimeZoneRequired);
                }
                this.StartTimeZone = this.StartTimeZone;
            }
        }
        CreateReply(replyAll: boolean): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, replyAll ? ResponseMessageType.ReplyAll : ResponseMessageType.Reply);
        }
        Reply(bodyPrefix: MessageBody, replyAll: boolean): void {
            var responseMessage: ResponseMessage = this.CreateReply(replyAll);
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.SendAndSaveCopy();
        }
        CreateForward(): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, ResponseMessageType.Forward);
        }
        Forward(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void;
        Forward(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void;
        Forward(bodyPrefix: MessageBody, toRecipients: any): void {
            if (arguments.length === 2 && (bodyPrefix === null || bodyPrefix instanceof MessageBody) && (toRecipients === null || toRecipients instanceof Array)) {
                this.Forward_0(bodyPrefix, toRecipients);
                return;
            }
            this.Forward_1(bodyPrefix, toRecipients);
        }
        private Forward_0(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void {
            this.Forward(bodyPrefix, <IEnumerable<EmailAddress>>toRecipients);
        }
        private Forward_1(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void {
            var responseMessage: ResponseMessage = this.CreateForward();
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.ToRecipients.AddRange(toRecipients);
            responseMessage.SendAndSaveCopy();
        }
        Save(destinationFolderName: WellKnownFolderName, sendInvitationsMode: SendInvitationsMode): void;
        Save(destinationFolderId: FolderId, sendInvitationsMode: SendInvitationsMode): void;
        Save(sendInvitationsMode: SendInvitationsMode): void;
        Save(destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode: any, sendInvitationsMode?: SendInvitationsMode): void {
            if (arguments.length === 2 && (destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode === null || destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode.constructor === Number) && (sendInvitationsMode === null || sendInvitationsMode.constructor === Number)) {
                this.Save_0(destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode, sendInvitationsMode);
                return;
            }
            if (arguments.length === 2 && (destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode === null || destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode instanceof FolderId) && (sendInvitationsMode === null || sendInvitationsMode.constructor === Number)) {
                this.Save_1(destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode, sendInvitationsMode);
                return;
            }
            this.Save_2(destinationFolderNameOrDestinationFolderIdOrSendInvitationsMode);
        }
        private Save_0(destinationFolderName: WellKnownFolderName, sendInvitationsMode: SendInvitationsMode): void {
            super.InternalCreate(new FolderId(destinationFolderName), null, new Nullable<SendInvitationsMode>(sendInvitationsMode));
        }
        private Save_1(destinationFolderId: FolderId, sendInvitationsMode: SendInvitationsMode): void {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            super.InternalCreate(destinationFolderId, null, new Nullable<SendInvitationsMode>(sendInvitationsMode));
        }
        private Save_2(sendInvitationsMode: SendInvitationsMode): void {
            super.InternalCreate(null, null, new Nullable<SendInvitationsMode>(sendInvitationsMode));
        }
        Update(conflictResolutionMode: ConflictResolutionMode, sendInvitationsOrCancellationsMode: SendInvitationsOrCancellationsMode): void {
            super.InternalUpdate(null, conflictResolutionMode, null, new Nullable<SendInvitationsOrCancellationsMode>(sendInvitationsOrCancellationsMode));
        }
        Delete(deleteMode: DeleteMode, sendCancellationsMode: SendCancellationsMode): void {
            this.InternalDelete(deleteMode, new Nullable<SendCancellationsMode>(sendCancellationsMode), null);
        }
        CreateAcceptMessage(tentative: boolean): AcceptMeetingInvitationMessage {
            return new AcceptMeetingInvitationMessage(this, tentative);
        }
        CreateCancelMeetingMessage(): CancelMeetingMessage {
            return new CancelMeetingMessage(this);
        }
        CreateDeclineMessage(): DeclineMeetingInvitationMessage {
            return new DeclineMeetingInvitationMessage(this);
        }
        Accept(sendResponse: boolean): CalendarActionResults {
            return this.InternalAccept(false, sendResponse);
        }
        AcceptTentatively(sendResponse: boolean): CalendarActionResults {
            return this.InternalAccept(true, sendResponse);
        }
        InternalAccept(tentative: boolean, sendResponse: boolean): CalendarActionResults {
            var acceptMeetingInvitationMessage: AcceptMeetingInvitationMessage = this.CreateAcceptMessage(tentative);
            if (sendResponse) {
                return acceptMeetingInvitationMessage.SendAndSaveCopy();
            }
            return acceptMeetingInvitationMessage.Save();
        }
        CancelMeeting(): CalendarActionResults;
        CancelMeeting(cancellationMessageText: string): CalendarActionResults;
        CancelMeeting(cancellationMessageText?: string): CalendarActionResults {
            if (arguments.length === 0) {
                return this.CancelMeeting_0();
            }
            return this.CancelMeeting_1(cancellationMessageText);
        }
        private CancelMeeting_0(): CalendarActionResults {
            return this.CreateCancelMeetingMessage().SendAndSaveCopy();
        }
        private CancelMeeting_1(cancellationMessageText: string): CalendarActionResults {
            var cancelMeetingMessage: CancelMeetingMessage = this.CreateCancelMeetingMessage();
            cancelMeetingMessage.Body = cancellationMessageText;
            return cancelMeetingMessage.SendAndSaveCopy();
        }
        Decline(sendResponse: boolean): CalendarActionResults {
            var declineMeetingInvitationMessage: DeclineMeetingInvitationMessage = this.CreateDeclineMessage();
            if (sendResponse) {
                return declineMeetingInvitationMessage.SendAndSaveCopy();
            }
            return declineMeetingInvitationMessage.Save();
        }
    }
    class Contact extends Item {
        private static ContactPictureName: string = "ContactPicture.jpg";
        set FileAs(value: string) {
            this.PropertyBag.set_Item(ContactSchema.FileAs, value);
        }
        get FileAs(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.FileAs);
        }
        set FileAsMapping(value: FileAsMapping) {
            this.PropertyBag.set_Item(ContactSchema.FileAsMapping, value);
        }
        get FileAsMapping(): FileAsMapping {
            return <FileAsMapping>this.PropertyBag.get_Item(ContactSchema.FileAsMapping);
        }
        set DisplayName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.DisplayName, value);
        }
        get DisplayName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.DisplayName);
        }
        set GivenName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.GivenName, value);
        }
        get GivenName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.GivenName);
        }
        set Initials(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Initials, value);
        }
        get Initials(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Initials);
        }
        set MiddleName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.MiddleName, value);
        }
        get MiddleName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.MiddleName);
        }
        set NickName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.NickName, value);
        }
        get NickName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.NickName);
        }
        get CompleteName(): CompleteName {
            return <CompleteName>this.PropertyBag.get_Item(ContactSchema.CompleteName);
        }
        set CompanyName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.CompanyName, value);
        }
        get CompanyName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.CompanyName);
        }
        get EmailAddresses(): EmailAddressDictionary {
            return <EmailAddressDictionary>this.PropertyBag.get_Item(ContactSchema.EmailAddresses);
        }
        get PhysicalAddresses(): PhysicalAddressDictionary {
            return <PhysicalAddressDictionary>this.PropertyBag.get_Item(ContactSchema.PhysicalAddresses);
        }
        get PhoneNumbers(): PhoneNumberDictionary {
            return <PhoneNumberDictionary>this.PropertyBag.get_Item(ContactSchema.PhoneNumbers);
        }
        set AssistantName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.AssistantName, value);
        }
        get AssistantName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.AssistantName);
        }
        set Birthday(value: Nullable<DateTime>) {
            this.PropertyBag.set_Item(ContactSchema.Birthday, value);
        }
        get Birthday(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(ContactSchema.Birthday);
        }
        set BusinessHomePage(value: string) {
            this.PropertyBag.set_Item(ContactSchema.BusinessHomePage, value);
        }
        get BusinessHomePage(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.BusinessHomePage);
        }
        set Children(value: StringList) {
            this.PropertyBag.set_Item(ContactSchema.Children, value);
        }
        get Children(): StringList {
            return <StringList>this.PropertyBag.get_Item(ContactSchema.Children);
        }
        set Companies(value: StringList) {
            this.PropertyBag.set_Item(ContactSchema.Companies, value);
        }
        get Companies(): StringList {
            return <StringList>this.PropertyBag.get_Item(ContactSchema.Companies);
        }
        get ContactSource(): Nullable<ContactSource> {
            return <Nullable<ContactSource>>this.PropertyBag.get_Item(ContactSchema.ContactSource);
        }
        set Department(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Department, value);
        }
        get Department(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Department);
        }
        set Generation(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Generation, value);
        }
        get Generation(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Generation);
        }
        get ImAddresses(): ImAddressDictionary {
            return <ImAddressDictionary>this.PropertyBag.get_Item(ContactSchema.ImAddresses);
        }
        set JobTitle(value: string) {
            this.PropertyBag.set_Item(ContactSchema.JobTitle, value);
        }
        get JobTitle(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.JobTitle);
        }
        set Manager(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Manager, value);
        }
        get Manager(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Manager);
        }
        set Mileage(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Mileage, value);
        }
        get Mileage(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Mileage);
        }
        set OfficeLocation(value: string) {
            this.PropertyBag.set_Item(ContactSchema.OfficeLocation, value);
        }
        get OfficeLocation(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.OfficeLocation);
        }
        set PostalAddressIndex(value: Nullable<PhysicalAddressIndex>) {
            this.PropertyBag.set_Item(ContactSchema.PostalAddressIndex, value);
        }
        get PostalAddressIndex(): Nullable<PhysicalAddressIndex> {
            return <Nullable<PhysicalAddressIndex>>this.PropertyBag.get_Item(ContactSchema.PostalAddressIndex);
        }
        set Profession(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Profession, value);
        }
        get Profession(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Profession);
        }
        set SpouseName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.SpouseName, value);
        }
        get SpouseName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.SpouseName);
        }
        set Surname(value: string) {
            this.PropertyBag.set_Item(ContactSchema.Surname, value);
        }
        get Surname(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Surname);
        }
        set WeddingAnniversary(value: Nullable<DateTime>) {
            this.PropertyBag.set_Item(ContactSchema.WeddingAnniversary, value);
        }
        get WeddingAnniversary(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(ContactSchema.WeddingAnniversary);
        }
        get HasPicture(): boolean {
            return <boolean>this.PropertyBag.get_Item(ContactSchema.HasPicture);
        }
        get PhoneticFullName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.PhoneticFullName);
        }
        get PhoneticFirstName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.PhoneticFirstName);
        }
        get PhoneticLastName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.PhoneticLastName);
        }
        get Alias(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Alias);
        }
        get Notes(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.Notes);
        }
        get DirectoryPhoto(): number[] {
            return <number[]>this.PropertyBag.get_Item(ContactSchema.Photo);
        }
        get UserSMIMECertificate(): number[][] {
            var byteArrayArray: ByteArrayArray = <ByteArrayArray>this.PropertyBag.get_Item(ContactSchema.UserSMIMECertificate);
            return byteArrayArray.Content;
        }
        get MSExchangeCertificate(): number[][] {
            var byteArrayArray: ByteArrayArray = <ByteArrayArray>this.PropertyBag.get_Item(ContactSchema.MSExchangeCertificate);
            return byteArrayArray.Content;
        }
        get DirectoryId(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.DirectoryId);
        }
        get ManagerMailbox(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(ContactSchema.ManagerMailbox);
        }
        get DirectReports(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(ContactSchema.DirectReports);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            super(serviceOrParentAttachment);
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): Contact;
        static Bind(service: ExchangeService, id: ItemId): Contact;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): Contact {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Contact.Bind_0(service, id, propertySet);
            }
            return Contact.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): Contact {
            return service.BindToItem<Contact>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): Contact {
            return Contact.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return ContactSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        SetContactPicture(content: number[]): void;
        SetContactPicture(contentStream: Stream): void;
        SetContactPicture(fileName: string): void;
        SetContactPicture(contentOrContentStreamOrFileName: any): void {
            if (arguments.length === 1 && (contentOrContentStreamOrFileName === null || contentOrContentStreamOrFileName instanceof Array)) {
                this.SetContactPicture_0(contentOrContentStreamOrFileName);
                return;
            }
            if (arguments.length === 1 && (contentOrContentStreamOrFileName === null || contentOrContentStreamOrFileName instanceof Stream)) {
                this.SetContactPicture_1(contentOrContentStreamOrFileName);
                return;
            }
            this.SetContactPicture_2(contentOrContentStreamOrFileName);
        }
        private SetContactPicture_0(content: number[]): void {
            EwsUtilities.ValidateMethodVersion(this.Service, ExchangeVersion.Exchange2010, "SetContactPicture");
            this.InternalRemoveContactPicture();
            var fileAttachment: FileAttachment = this.Attachments.AddFileAttachment("ContactPicture.jpg", content);
            fileAttachment.IsContactPhoto = true;
        }
        private SetContactPicture_1(contentStream: Stream): void {
            EwsUtilities.ValidateMethodVersion(this.Service, ExchangeVersion.Exchange2010, "SetContactPicture");
            this.InternalRemoveContactPicture();
            var fileAttachment: FileAttachment = this.Attachments.AddFileAttachment("ContactPicture.jpg", contentStream);
            fileAttachment.IsContactPhoto = true;
        }
        private SetContactPicture_2(fileName: string): void {
            EwsUtilities.ValidateMethodVersion(this.Service, ExchangeVersion.Exchange2010, "SetContactPicture");
            this.InternalRemoveContactPicture();
            var fileAttachment: FileAttachment = this.Attachments.AddFileAttachment(Path.GetFileName(fileName), fileName);
            fileAttachment.IsContactPhoto = true;
        }
        GetContactPictureAttachment(): FileAttachment {
            EwsUtilities.ValidateMethodVersion(this.Service, ExchangeVersion.Exchange2010, "GetContactPictureAttachment");
            if (!this.PropertyBag.IsPropertyLoaded(ItemSchema.Attachments)) {
                throw new PropertyException(Strings.AttachmentCollectionNotLoaded);
            }
            var enumerator: IEnumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var fileAttachment: FileAttachment = <FileAttachment>enumerator.Current;
                    if (fileAttachment.IsContactPhoto) {
                        return fileAttachment;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return null;
        }
        private InternalRemoveContactPicture(): void {
            for (var i: number = this.Attachments.Count - 1; i >= 0; i = i - 1) {
                var fileAttachment: FileAttachment = ((this.Attachments.get_Item(i) instanceof FileAttachment) ? <FileAttachment>this.Attachments.get_Item(i) : null);
                if (fileAttachment !== null && fileAttachment.IsContactPhoto) {
                    this.Attachments.Remove(fileAttachment);
                }
            }
        }
        RemoveContactPicture(): void {
            EwsUtilities.ValidateMethodVersion(this.Service, ExchangeVersion.Exchange2010, "RemoveContactPicture");
            if (!this.PropertyBag.IsPropertyLoaded(ItemSchema.Attachments)) {
                throw new PropertyException(Strings.AttachmentCollectionNotLoaded);
            }
            this.InternalRemoveContactPicture();
        }
        Validate(): void {
            super.Validate();
            var obj: any;
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = super.TryGetProperty(ContactSchema.FileAsMapping, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                EwsUtilities.ValidateEnumVersionValue(<FileAsMapping>obj, this.Service.RequestedServerVersion);
            }
        }
    }
    class ContactGroup extends Item {
        get FileAs(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.FileAs);
        }
        set DisplayName(value: string) {
            this.PropertyBag.set_Item(ContactSchema.DisplayName, value);
        }
        get DisplayName(): string {
            return <string>this.PropertyBag.get_Item(ContactSchema.DisplayName);
        }
        get Members(): GroupMemberCollection {
            return <GroupMemberCollection>this.PropertyBag.get_Item(ContactGroupSchema.Members);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                super(serviceOrParentAttachment);
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            super(serviceOrParentAttachment);
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): ContactGroup;
        static Bind(service: ExchangeService, id: ItemId): ContactGroup;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): ContactGroup {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return ContactGroup.Bind_0(service, id, propertySet);
            }
            return ContactGroup.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): ContactGroup {
            return service.BindToItem<ContactGroup>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): ContactGroup {
            return ContactGroup.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return ContactGroupSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        SetSubject(subject: string): void {
            throw new ServiceObjectPropertyException(Strings.PropertyIsReadOnly, ItemSchema.Subject);
        }
    }
    class Conversation extends ServiceObject {
        get Id(): ConversationId {
            return <ConversationId>this.PropertyBag.get_Item(this.GetIdPropertyDefinition());
        }
        get Topic(): string {
            var empty: string = NString.Empty;
            if (this.PropertyBag.Contains(ConversationSchema.Topic)) {
                (() => {
                    var _p0 = [
                        empty
                    ];
                    var _r = this.PropertyBag.TryGetProperty<string>(ConversationSchema.Topic, _p0);
                    empty = _p0[0];
                    return _r;
                })();
            }
            return empty;
        }
        get UniqueRecipients(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.UniqueRecipients);
        }
        get GlobalUniqueRecipients(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.GlobalUniqueRecipients);
        }
        get UniqueUnreadSenders(): StringList {
            var result: StringList = null;
            if (this.PropertyBag.Contains(ConversationSchema.UniqueUnreadSenders)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<StringList>(ConversationSchema.UniqueUnreadSenders, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get GlobalUniqueUnreadSenders(): StringList {
            var result: StringList = null;
            if (this.PropertyBag.Contains(ConversationSchema.GlobalUniqueUnreadSenders)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<StringList>(ConversationSchema.GlobalUniqueUnreadSenders, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get UniqueSenders(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.UniqueSenders);
        }
        get GlobalUniqueSenders(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.GlobalUniqueSenders);
        }
        get LastDeliveryTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ConversationSchema.LastDeliveryTime);
        }
        get GlobalLastDeliveryTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ConversationSchema.GlobalLastDeliveryTime);
        }
        get Categories(): StringList {
            var result: StringList = null;
            if (this.PropertyBag.Contains(ConversationSchema.Categories)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<StringList>(ConversationSchema.Categories, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get GlobalCategories(): StringList {
            var result: StringList = null;
            if (this.PropertyBag.Contains(ConversationSchema.GlobalCategories)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<StringList>(ConversationSchema.GlobalCategories, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get FlagStatus(): ConversationFlagStatus {
            var result: ConversationFlagStatus = ConversationFlagStatus.NotFlagged;
            if (this.PropertyBag.Contains(ConversationSchema.FlagStatus)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<ConversationFlagStatus>(ConversationSchema.FlagStatus, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get GlobalFlagStatus(): ConversationFlagStatus {
            var result: ConversationFlagStatus = ConversationFlagStatus.NotFlagged;
            if (this.PropertyBag.Contains(ConversationSchema.GlobalFlagStatus)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<ConversationFlagStatus>(ConversationSchema.GlobalFlagStatus, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get HasAttachments(): boolean {
            return <boolean>this.PropertyBag.get_Item(ConversationSchema.HasAttachments);
        }
        get GlobalHasAttachments(): boolean {
            return <boolean>this.PropertyBag.get_Item(ConversationSchema.GlobalHasAttachments);
        }
        get MessageCount(): number {
            return <number>this.PropertyBag.get_Item(ConversationSchema.MessageCount);
        }
        get GlobalMessageCount(): number {
            return <number>this.PropertyBag.get_Item(ConversationSchema.GlobalMessageCount);
        }
        get UnreadCount(): number {
            var result: number = 0;
            if (this.PropertyBag.Contains(ConversationSchema.UnreadCount)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<number>(ConversationSchema.UnreadCount, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get GlobalUnreadCount(): number {
            var result: number = 0;
            if (this.PropertyBag.Contains(ConversationSchema.GlobalUnreadCount)) {
                (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = this.PropertyBag.TryGetProperty<number>(ConversationSchema.GlobalUnreadCount, _p0);
                    result = _p0[0];
                    return _r;
                })();
            }
            return result;
        }
        get Size(): number {
            return <number>this.PropertyBag.get_Item(ConversationSchema.Size);
        }
        get GlobalSize(): number {
            return <number>this.PropertyBag.get_Item(ConversationSchema.GlobalSize);
        }
        get ItemClasses(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.ItemClasses);
        }
        get GlobalItemClasses(): StringList {
            return <StringList>this.PropertyBag.get_Item(ConversationSchema.GlobalItemClasses);
        }
        get Importance(): Importance {
            return <Importance>this.PropertyBag.get_Item(ConversationSchema.Importance);
        }
        get GlobalImportance(): Importance {
            return <Importance>this.PropertyBag.get_Item(ConversationSchema.GlobalImportance);
        }
        get ItemIds(): ItemIdCollection {
            return <ItemIdCollection>this.PropertyBag.get_Item(ConversationSchema.ItemIds);
        }
        get GlobalItemIds(): ItemIdCollection {
            return <ItemIdCollection>this.PropertyBag.get_Item(ConversationSchema.GlobalItemIds);
        }
        get LastModifiedTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(ConversationSchema.LastModifiedTime);
        }
        get InstanceKey(): number[] {
            return <number[]>this.PropertyBag.get_Item(ConversationSchema.InstanceKey);
        }
        get Preview(): string {
            return <string>this.PropertyBag.get_Item(ConversationSchema.Preview);
        }
        get IconIndex(): IconIndex {
            return <IconIndex>this.PropertyBag.get_Item(ConversationSchema.IconIndex);
        }
        get GlobalIconIndex(): IconIndex {
            return <IconIndex>this.PropertyBag.get_Item(ConversationSchema.GlobalIconIndex);
        }
        get DraftItemIds(): ItemIdCollection {
            return <ItemIdCollection>this.PropertyBag.get_Item(ConversationSchema.DraftItemIds);
        }
        get HasIrm(): boolean {
            return <boolean>this.PropertyBag.get_Item(ConversationSchema.HasIrm);
        }
        get GlobalHasIrm(): boolean {
            return <boolean>this.PropertyBag.get_Item(ConversationSchema.GlobalHasIrm);
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetSchema(): ServiceObjectSchema {
            return ConversationSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        GetIdPropertyDefinition(): PropertyDefinition {
            return ConversationSchema.Id;
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new NotSupportedException();
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new NotSupportedException();
        }
        GetChangeXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetDeleteFieldXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetSetFieldXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetIsTimeZoneHeaderRequired(isUpdateOperation: boolean): boolean {
            throw new NotSupportedException();
        }
        GetExtendedProperties(): ExtendedPropertyCollection {
            throw new NotSupportedException();
        }
        EnableAlwaysCategorizeItems(categories: IEnumerable<string>, processSynchronously: boolean): void {
            this.Service.EnableAlwaysCategorizeItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), categories, processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        DisableAlwaysCategorizeItems(processSynchronously: boolean): void {
            this.Service.DisableAlwaysCategorizeItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        EnableAlwaysDeleteItems(processSynchronously: boolean): void {
            this.Service.EnableAlwaysDeleteItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        DisableAlwaysDeleteItems(processSynchronously: boolean): void {
            this.Service.DisableAlwaysDeleteItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        EnableAlwaysMoveItems(destinationFolderId: FolderId, processSynchronously: boolean): void {
            this.Service.EnableAlwaysMoveItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), destinationFolderId, processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        DisableAlwaysMoveItemsInConversation(processSynchronously: boolean): void {
            this.Service.DisableAlwaysMoveItemsInConversations(NArray.ToEnumerable([
                this.Id
            ]), processSynchronously).get_Item(0).ThrowIfNecessary();
        }
        DeleteItems(contextFolderId: FolderId, deleteMode: DeleteMode): void {
            this.Service.DeleteItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, deleteMode).get_Item(0).ThrowIfNecessary();
        }
        MoveItemsInConversation(contextFolderId: FolderId, destinationFolderId: FolderId): void {
            this.Service.MoveItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, destinationFolderId).get_Item(0).ThrowIfNecessary();
        }
        CopyItemsInConversation(contextFolderId: FolderId, destinationFolderId: FolderId): void {
            this.Service.CopyItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, destinationFolderId).get_Item(0).ThrowIfNecessary();
        }
        SetReadStateForItemsInConversation(contextFolderId: FolderId, isRead: boolean): void;
        SetReadStateForItemsInConversation(contextFolderId: FolderId, isRead: boolean, suppressReadReceipts: boolean): void;
        SetReadStateForItemsInConversation(contextFolderId: FolderId, isRead: boolean, suppressReadReceipts?: boolean): void {
            if (arguments.length === 2 && (contextFolderId === null || contextFolderId instanceof FolderId) && (isRead === null || isRead.constructor === Boolean)) {
                this.SetReadStateForItemsInConversation_0(contextFolderId, isRead);
                return;
            }
            this.SetReadStateForItemsInConversation_1(contextFolderId, isRead, suppressReadReceipts);
        }
        private SetReadStateForItemsInConversation_0(contextFolderId: FolderId, isRead: boolean): void {
            this.Service.SetReadStateForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, isRead).get_Item(0).ThrowIfNecessary();
        }
        private SetReadStateForItemsInConversation_1(contextFolderId: FolderId, isRead: boolean, suppressReadReceipts: boolean): void {
            this.Service.SetReadStateForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, isRead, suppressReadReceipts).get_Item(0).ThrowIfNecessary();
        }
        SetRetentionPolicyForItemsInConversation(contextFolderId: FolderId, retentionPolicyType: RetentionType, retentionPolicyTagId: Nullable<Guid>): void {
            this.Service.SetRetentionPolicyForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, retentionPolicyType, retentionPolicyTagId).get_Item(0).ThrowIfNecessary();
        }
        FlagItemsComplete(contextFolderId: FolderId, completeDate: Nullable<DateTime>): void {
            var flag: Flag = new Flag();
            flag.FlagStatus = ItemFlagStatus.Complete;
            var flag2: Flag = flag;
            if (completeDate !== null) {
                flag2.CompleteDate = completeDate.Value;
            }
            this.Service.SetFlagStatusForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, flag2).get_Item(0).ThrowIfNecessary();
        }
        ClearItemFlags(contextFolderId: FolderId): void {
            var flag: Flag = new Flag();
            flag.FlagStatus = ItemFlagStatus.NotFlagged;
            var flagStatus: Flag = flag;
            this.Service.SetFlagStatusForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, flagStatus).get_Item(0).ThrowIfNecessary();
        }
        FlagItems(contextFolderId: FolderId, startDate: Nullable<DateTime>, dueDate: Nullable<DateTime>): void {
            var flag: Flag = new Flag();
            flag.FlagStatus = ItemFlagStatus.Flagged;
            var flag2: Flag = flag;
            if (startDate !== null) {
                flag2.StartDate = startDate.Value;
            }
            if (dueDate !== null) {
                flag2.DueDate = dueDate.Value;
            }
            this.Service.SetFlagStatusForItemsInConversations(NArray.ToEnumerable([
                new KeyValuePair<ConversationId, Nullable<DateTime>>(this.Id, new Nullable<DateTime>(this.GlobalLastDeliveryTime))
            ]), contextFolderId, flag2).get_Item(0).ThrowIfNecessary();
        }
    }
    class EmailMessage extends Item {
        get ToRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.ToRecipients);
        }
        get BccRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.BccRecipients);
        }
        get CcRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.CcRecipients);
        }
        get ConversationTopic(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.ConversationTopic);
        }
        get ConversationIndex(): number[] {
            return <number[]>this.PropertyBag.get_Item(EmailMessageSchema.ConversationIndex);
        }
        set From(value: EmailAddress) {
            this.PropertyBag.set_Item(EmailMessageSchema.From, value);
        }
        get From(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.From);
        }
        set IsAssociated(value: boolean) {
            this.PropertyBag.set_Item(ItemSchema.IsAssociated, value);
        }
        get IsAssociated(): boolean {
            return this.IsAssociated;
        }
        set IsDeliveryReceiptRequested(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsDeliveryReceiptRequested, value);
        }
        get IsDeliveryReceiptRequested(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsDeliveryReceiptRequested);
        }
        set IsRead(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsRead, value);
        }
        get IsRead(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsRead);
        }
        set IsReadReceiptRequested(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsReadReceiptRequested, value);
        }
        get IsReadReceiptRequested(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsReadReceiptRequested);
        }
        set IsResponseRequested(value: Nullable<boolean>) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsResponseRequested, value);
        }
        get IsResponseRequested(): Nullable<boolean> {
            return <Nullable<boolean>>this.PropertyBag.get_Item(EmailMessageSchema.IsResponseRequested);
        }
        get InternetMessageId(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.InternetMessageId);
        }
        set References(value: string) {
            this.PropertyBag.set_Item(EmailMessageSchema.References, value);
        }
        get References(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.References);
        }
        get ReplyTo(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.ReplyTo);
        }
        set Sender(value: EmailAddress) {
            this.PropertyBag.set_Item(EmailMessageSchema.Sender, value);
        }
        get Sender(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.Sender);
        }
        get ReceivedBy(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.ReceivedBy);
        }
        get ReceivedRepresenting(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.ReceivedRepresenting);
        }
        get ApprovalRequestData(): ApprovalRequestData {
            return <ApprovalRequestData>this.PropertyBag.get_Item(EmailMessageSchema.ApprovalRequestData);
        }
        get VotingInformation(): VotingInformation {
            return <VotingInformation>this.PropertyBag.get_Item(EmailMessageSchema.VotingInformation);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                super(serviceOrParentAttachment);
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            super(serviceOrParentAttachment);
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): EmailMessage;
        static Bind(service: ExchangeService, id: ItemId): EmailMessage;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): EmailMessage {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return EmailMessage.Bind_0(service, id, propertySet);
            }
            return EmailMessage.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): EmailMessage {
            return service.BindToItem<EmailMessage>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): EmailMessage {
            return EmailMessage.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return EmailMessageSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        private InternalSend(parentFolderId: FolderId, messageDisposition: MessageDisposition): void {
            super.ThrowIfThisIsAttachment();
            if (this.IsNew) {
                if (this.Attachments.Count === 0 || messageDisposition === MessageDisposition.SaveOnly) {
                    super.InternalCreate(parentFolderId, new Nullable<MessageDisposition>(messageDisposition), null);
                    return;
                }
                super.InternalCreate(null, new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null);
                this.Service.SendItem(this, parentFolderId);
                return;
            }
            else {
                if (super.HasUnprocessedAttachmentChanges()) {
                    this.Attachments.Validate();
                    this.Attachments.Save();
                }
                if (this.PropertyBag.GetIsUpdateCallNecessary()) {
                    super.InternalUpdate(parentFolderId, ConflictResolutionMode.AutoResolve, new Nullable<MessageDisposition>(messageDisposition), null);
                    return;
                }
                this.Service.SendItem(this, parentFolderId);
                return;
            }
        }
        CreateReply(replyAll: boolean): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, replyAll ? ResponseMessageType.ReplyAll : ResponseMessageType.Reply);
        }
        CreateForward(): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, ResponseMessageType.Forward);
        }
        Reply(bodyPrefix: MessageBody, replyAll: boolean): void {
            var responseMessage: ResponseMessage = this.CreateReply(replyAll);
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.SendAndSaveCopy();
        }
        Forward(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void;
        Forward(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void;
        Forward(bodyPrefix: MessageBody, toRecipients: any): void {
            if (arguments.length === 2 && (bodyPrefix === null || bodyPrefix instanceof MessageBody) && (toRecipients === null || toRecipients instanceof Array)) {
                this.Forward_0(bodyPrefix, toRecipients);
                return;
            }
            this.Forward_1(bodyPrefix, toRecipients);
        }
        private Forward_0(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void {
            this.Forward(bodyPrefix, <IEnumerable<EmailAddress>>toRecipients);
        }
        private Forward_1(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void {
            var responseMessage: ResponseMessage = this.CreateForward();
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.ToRecipients.AddRange(toRecipients);
            responseMessage.SendAndSaveCopy();
        }
        Send(): void {
            this.InternalSend(null, MessageDisposition.SendOnly);
        }
        SendAndSaveCopy(destinationFolderId: FolderId): void;
        SendAndSaveCopy(destinationFolderName: WellKnownFolderName): void;
        SendAndSaveCopy(): void;
        SendAndSaveCopy(destinationFolderIdOrDestinationFolderName?: any): void {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                this.SendAndSaveCopy_0(destinationFolderIdOrDestinationFolderName);
                return;
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName.constructor === Number)) {
                this.SendAndSaveCopy_1(destinationFolderIdOrDestinationFolderName);
                return;
            }
            this.SendAndSaveCopy_2();
        }
        private SendAndSaveCopy_0(destinationFolderId: FolderId): void {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            this.InternalSend(destinationFolderId, MessageDisposition.SendAndSaveCopy);
        }
        private SendAndSaveCopy_1(destinationFolderName: WellKnownFolderName): void {
            this.InternalSend(new FolderId(destinationFolderName), MessageDisposition.SendAndSaveCopy);
        }
        private SendAndSaveCopy_2(): void {
            this.InternalSend(new FolderId(WellKnownFolderName.SentItems), MessageDisposition.SendAndSaveCopy);
        }
        SuppressReadReceipt(): void {
            super.ThrowIfThisIsNew();
            new SuppressReadReceipt(this).InternalCreate(null, null);
        }
    }
    class MeetingMessage extends EmailMessage {
        get AssociatedAppointmentId(): ItemId {
            return <ItemId>this.PropertyBag.get_Item(MeetingMessageSchema.AssociatedAppointmentId);
        }
        get IsDelegated(): boolean {
            return <boolean>this.PropertyBag.get_Item(MeetingMessageSchema.IsDelegated);
        }
        get IsOutOfDate(): boolean {
            return <boolean>this.PropertyBag.get_Item(MeetingMessageSchema.IsOutOfDate);
        }
        get HasBeenProcessed(): boolean {
            return <boolean>this.PropertyBag.get_Item(MeetingMessageSchema.HasBeenProcessed);
        }
        get IsOrganizer(): Nullable<boolean> {
            return <Nullable<boolean>>this.PropertyBag.get_Item(MeetingMessageSchema.IsOrganizer);
        }
        get ResponseType(): MeetingResponseType {
            return <MeetingResponseType>this.PropertyBag.get_Item(MeetingMessageSchema.ResponseType);
        }
        get ICalUid(): string {
            return <string>this.PropertyBag.get_Item(MeetingMessageSchema.ICalUid);
        }
        get ICalRecurrenceId(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(MeetingMessageSchema.ICalRecurrenceId);
        }
        get ICalDateTimeStamp(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(MeetingMessageSchema.ICalDateTimeStamp);
        }
        constructor(parentAttachment: ItemAttachment);
        constructor(service: ExchangeService);
        constructor(parentAttachmentOrService: any) {
            if (arguments.length === 1 && (parentAttachmentOrService === null || parentAttachmentOrService instanceof ItemAttachment)) {
                super(parentAttachmentOrService);
                this.constructor_0(parentAttachmentOrService);
                return;
            }
            super(parentAttachmentOrService);
            this.constructor_1(parentAttachmentOrService);
        }
        private constructor_0(parentAttachment: ItemAttachment): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingMessage;
        static Bind(service: ExchangeService, id: ItemId): MeetingMessage;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): MeetingMessage {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return MeetingMessage.Bind_0(service, id, propertySet);
            }
            return MeetingMessage.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingMessage {
            return service.BindToItem<MeetingMessage>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): MeetingMessage {
            return MeetingMessage.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return MeetingMessageSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class MeetingCancellation extends MeetingMessage {
        get Start(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingCancellationSchema.Start);
        }
        get End(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingCancellationSchema.End);
        }
        get Location(): string {
            return <string>this.PropertyBag.get_Item(MeetingCancellationSchema.Location);
        }
        get Recurrence(): Recurrence {
            return <Recurrence>this.PropertyBag.get_Item(AppointmentSchema.Recurrence);
        }
        get EnhancedLocation(): EnhancedLocation {
            return <EnhancedLocation>this.PropertyBag.get_Item(MeetingCancellationSchema.EnhancedLocation);
        }
        constructor(parentAttachment: ItemAttachment);
        constructor(service: ExchangeService);
        constructor(parentAttachmentOrService: any) {
            if (arguments.length === 1 && (parentAttachmentOrService === null || parentAttachmentOrService instanceof ItemAttachment)) {
                super(parentAttachmentOrService);
                this.constructor_0(parentAttachmentOrService);
                return;
            }
            super(parentAttachmentOrService);
            this.constructor_1(parentAttachmentOrService);
        }
        private constructor_0(parentAttachment: ItemAttachment): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingCancellation;
        static Bind(service: ExchangeService, id: ItemId): MeetingCancellation;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): MeetingCancellation {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return MeetingCancellation.Bind_0(service, id, propertySet);
            }
            return MeetingCancellation.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingCancellation {
            return service.BindToItem<MeetingCancellation>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): MeetingCancellation {
            return MeetingCancellation.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return MeetingCancellationSchema.Instance;
        }
        RemoveMeetingFromCalendar(): CalendarActionResults {
            return new CalendarActionResults(new RemoveFromCalendar(this).InternalCreate(null, null));
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class MeetingRequest extends MeetingMessage implements ICalendarActionProvider {
        get MeetingRequestType(): MeetingRequestType {
            return <MeetingRequestType>this.PropertyBag.get_Item(MeetingRequestSchema.MeetingRequestType);
        }
        get IntendedFreeBusyStatus(): LegacyFreeBusyStatus {
            return <LegacyFreeBusyStatus>this.PropertyBag.get_Item(MeetingRequestSchema.IntendedFreeBusyStatus);
        }
        get ChangeHighlights(): ChangeHighlights {
            return <ChangeHighlights>this.PropertyBag.get_Item(MeetingRequestSchema.ChangeHighlights);
        }
        get EnhancedLocation(): EnhancedLocation {
            return <EnhancedLocation>this.PropertyBag.get_Item(MeetingRequestSchema.EnhancedLocation);
        }
        get Start(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.Start);
        }
        get End(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.End);
        }
        get OriginalStart(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.OriginalStart);
        }
        get IsAllDayEvent(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsAllDayEvent);
        }
        get LegacyFreeBusyStatus(): LegacyFreeBusyStatus {
            return <LegacyFreeBusyStatus>this.PropertyBag.get_Item(AppointmentSchema.LegacyFreeBusyStatus);
        }
        get Location(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.Location);
        }
        get When(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.When);
        }
        get IsMeeting(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsMeeting);
        }
        get IsCancelled(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsCancelled);
        }
        get IsRecurring(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsRecurring);
        }
        get MeetingRequestWasSent(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.MeetingRequestWasSent);
        }
        get AppointmentType(): AppointmentType {
            return <AppointmentType>this.PropertyBag.get_Item(AppointmentSchema.AppointmentType);
        }
        get MyResponseType(): MeetingResponseType {
            return <MeetingResponseType>this.PropertyBag.get_Item(AppointmentSchema.MyResponseType);
        }
        get Organizer(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(AppointmentSchema.Organizer);
        }
        get RequiredAttendees(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.RequiredAttendees);
        }
        get OptionalAttendees(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.OptionalAttendees);
        }
        get Resources(): AttendeeCollection {
            return <AttendeeCollection>this.PropertyBag.get_Item(AppointmentSchema.Resources);
        }
        get ConflictingMeetingCount(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.ConflictingMeetingCount);
        }
        get AdjacentMeetingCount(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AdjacentMeetingCount);
        }
        get ConflictingMeetings(): ItemCollection<Appointment> {
            return <ItemCollection<Appointment>>this.PropertyBag.get_Item(AppointmentSchema.ConflictingMeetings);
        }
        get AdjacentMeetings(): ItemCollection<Appointment> {
            return <ItemCollection<Appointment>>this.PropertyBag.get_Item(AppointmentSchema.AdjacentMeetings);
        }
        get Duration(): TimeSpan {
            return <TimeSpan>this.PropertyBag.get_Item(AppointmentSchema.Duration);
        }
        get TimeZone(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.TimeZone);
        }
        get AppointmentReplyTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(AppointmentSchema.AppointmentReplyTime);
        }
        get AppointmentSequenceNumber(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AppointmentSequenceNumber);
        }
        get AppointmentState(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.AppointmentState);
        }
        get Recurrence(): Recurrence {
            return <Recurrence>this.PropertyBag.get_Item(AppointmentSchema.Recurrence);
        }
        get FirstOccurrence(): OccurrenceInfo {
            return <OccurrenceInfo>this.PropertyBag.get_Item(AppointmentSchema.FirstOccurrence);
        }
        get LastOccurrence(): OccurrenceInfo {
            return <OccurrenceInfo>this.PropertyBag.get_Item(AppointmentSchema.LastOccurrence);
        }
        get ModifiedOccurrences(): OccurrenceInfoCollection {
            return <OccurrenceInfoCollection>this.PropertyBag.get_Item(AppointmentSchema.ModifiedOccurrences);
        }
        get DeletedOccurrences(): DeletedOccurrenceInfoCollection {
            return <DeletedOccurrenceInfoCollection>this.PropertyBag.get_Item(AppointmentSchema.DeletedOccurrences);
        }
        get StartTimeZone(): TimeZoneInfo {
            return <TimeZoneInfo>this.PropertyBag.get_Item(AppointmentSchema.StartTimeZone);
        }
        get EndTimeZone(): TimeZoneInfo {
            return <TimeZoneInfo>this.PropertyBag.get_Item(AppointmentSchema.EndTimeZone);
        }
        get ConferenceType(): number {
            return <number>this.PropertyBag.get_Item(AppointmentSchema.ConferenceType);
        }
        get AllowNewTimeProposal(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.AllowNewTimeProposal);
        }
        get IsOnlineMeeting(): boolean {
            return <boolean>this.PropertyBag.get_Item(AppointmentSchema.IsOnlineMeeting);
        }
        get MeetingWorkspaceUrl(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.MeetingWorkspaceUrl);
        }
        get NetShowUrl(): string {
            return <string>this.PropertyBag.get_Item(AppointmentSchema.NetShowUrl);
        }
        constructor(parentAttachment: ItemAttachment);
        constructor(service: ExchangeService);
        constructor(parentAttachmentOrService: any) {
            if (arguments.length === 1 && (parentAttachmentOrService === null || parentAttachmentOrService instanceof ItemAttachment)) {
                super(parentAttachmentOrService);
                this.constructor_0(parentAttachmentOrService);
                return;
            }
            super(parentAttachmentOrService);
            this.constructor_1(parentAttachmentOrService);
        }
        private constructor_0(parentAttachment: ItemAttachment): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingRequest;
        static Bind(service: ExchangeService, id: ItemId): MeetingRequest;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): MeetingRequest {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return MeetingRequest.Bind_0(service, id, propertySet);
            }
            return MeetingRequest.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingRequest {
            return service.BindToItem<MeetingRequest>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): MeetingRequest {
            return MeetingRequest.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return MeetingRequestSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        CreateAcceptMessage(tentative: boolean): AcceptMeetingInvitationMessage {
            return new AcceptMeetingInvitationMessage(this, tentative);
        }
        CreateDeclineMessage(): DeclineMeetingInvitationMessage {
            return new DeclineMeetingInvitationMessage(this);
        }
        Accept(sendResponse: boolean): CalendarActionResults {
            return this.InternalAccept(false, sendResponse);
        }
        AcceptTentatively(sendResponse: boolean): CalendarActionResults {
            return this.InternalAccept(true, sendResponse);
        }
        InternalAccept(tentative: boolean, sendResponse: boolean): CalendarActionResults {
            var acceptMeetingInvitationMessage: AcceptMeetingInvitationMessage = this.CreateAcceptMessage(tentative);
            if (sendResponse) {
                return acceptMeetingInvitationMessage.SendAndSaveCopy();
            }
            return acceptMeetingInvitationMessage.Save();
        }
        Decline(sendResponse: boolean): CalendarActionResults {
            var declineMeetingInvitationMessage: DeclineMeetingInvitationMessage = this.CreateDeclineMessage();
            if (sendResponse) {
                return declineMeetingInvitationMessage.SendAndSaveCopy();
            }
            return declineMeetingInvitationMessage.Save();
        }
    }
    class MeetingResponse extends MeetingMessage {
        get Start(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingResponseSchema.Start);
        }
        get End(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingResponseSchema.End);
        }
        get Location(): string {
            return <string>this.PropertyBag.get_Item(MeetingResponseSchema.Location);
        }
        get Recurrence(): Recurrence {
            return <Recurrence>this.PropertyBag.get_Item(AppointmentSchema.Recurrence);
        }
        get ProposedStart(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingResponseSchema.ProposedStart);
        }
        get ProposedEnd(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(MeetingResponseSchema.ProposedEnd);
        }
        get EnhancedLocation(): EnhancedLocation {
            return <EnhancedLocation>this.PropertyBag.get_Item(MeetingResponseSchema.EnhancedLocation);
        }
        constructor(parentAttachment: ItemAttachment);
        constructor(service: ExchangeService);
        constructor(parentAttachmentOrService: any) {
            if (arguments.length === 1 && (parentAttachmentOrService === null || parentAttachmentOrService instanceof ItemAttachment)) {
                super(parentAttachmentOrService);
                this.constructor_0(parentAttachmentOrService);
                return;
            }
            super(parentAttachmentOrService);
            this.constructor_1(parentAttachmentOrService);
        }
        private constructor_0(parentAttachment: ItemAttachment): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingResponse;
        static Bind(service: ExchangeService, id: ItemId): MeetingResponse;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): MeetingResponse {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return MeetingResponse.Bind_0(service, id, propertySet);
            }
            return MeetingResponse.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): MeetingResponse {
            return service.BindToItem<MeetingResponse>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): MeetingResponse {
            return MeetingResponse.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return MeetingResponseSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class PostItem extends Item {
        get ConversationIndex(): number[] {
            return <number[]>this.PropertyBag.get_Item(EmailMessageSchema.ConversationIndex);
        }
        get ConversationTopic(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.ConversationTopic);
        }
        set From(value: EmailAddress) {
            this.PropertyBag.set_Item(EmailMessageSchema.From, value);
        }
        get From(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.From);
        }
        get InternetMessageId(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.InternetMessageId);
        }
        set IsRead(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsRead, value);
        }
        get IsRead(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsRead);
        }
        get PostedTime(): DateTime {
            return <DateTime>this.PropertyBag.get_Item(PostItemSchema.PostedTime);
        }
        set References(value: string) {
            this.PropertyBag.set_Item(EmailMessageSchema.References, value);
        }
        get References(): string {
            return <string>this.PropertyBag.get_Item(EmailMessageSchema.References);
        }
        set Sender(value: EmailAddress) {
            this.PropertyBag.set_Item(EmailMessageSchema.Sender, value);
        }
        get Sender(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.Sender);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                super(serviceOrParentAttachment);
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            super(serviceOrParentAttachment);
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): PostItem;
        static Bind(service: ExchangeService, id: ItemId): PostItem;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): PostItem {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return PostItem.Bind_0(service, id, propertySet);
            }
            return PostItem.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): PostItem {
            return service.BindToItem<PostItem>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): PostItem {
            return PostItem.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return PostItemSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        CreatePostReply(): PostReply {
            super.ThrowIfThisIsNew();
            return new PostReply(this);
        }
        PostReply(bodyPrefix: MessageBody): void {
            var postReply: PostReply = this.CreatePostReply();
            postReply.BodyPrefix = bodyPrefix;
            postReply.Save();
        }
        CreateReply(replyAll: boolean): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, replyAll ? ResponseMessageType.ReplyAll : ResponseMessageType.Reply);
        }
        Reply(bodyPrefix: MessageBody, replyAll: boolean): void {
            var responseMessage: ResponseMessage = this.CreateReply(replyAll);
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.SendAndSaveCopy();
        }
        CreateForward(): ResponseMessage {
            super.ThrowIfThisIsNew();
            return new ResponseMessage(this, ResponseMessageType.Forward);
        }
        Forward(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void;
        Forward(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void;
        Forward(bodyPrefix: MessageBody, toRecipients: any): void {
            if (arguments.length === 2 && (bodyPrefix === null || bodyPrefix instanceof MessageBody) && (toRecipients === null || toRecipients instanceof Array)) {
                this.Forward_0(bodyPrefix, toRecipients);
                return;
            }
            this.Forward_1(bodyPrefix, toRecipients);
        }
        private Forward_0(bodyPrefix: MessageBody, toRecipients: EmailAddress[]): void {
            this.Forward(bodyPrefix, <IEnumerable<EmailAddress>>toRecipients);
        }
        private Forward_1(bodyPrefix: MessageBody, toRecipients: IEnumerable<EmailAddress>): void {
            var responseMessage: ResponseMessage = this.CreateForward();
            responseMessage.BodyPrefix = bodyPrefix;
            responseMessage.ToRecipients.AddRange(toRecipients);
            responseMessage.SendAndSaveCopy();
        }
    }
    class Task extends Item {
        set ActualWork(value: Nullable<number>) {
            this.PropertyBag.set_Item(TaskSchema.ActualWork, value);
        }
        get ActualWork(): Nullable<number> {
            return <Nullable<number>>this.PropertyBag.get_Item(TaskSchema.ActualWork);
        }
        get AssignedTime(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(TaskSchema.AssignedTime);
        }
        set BillingInformation(value: string) {
            this.PropertyBag.set_Item(TaskSchema.BillingInformation, value);
        }
        get BillingInformation(): string {
            return <string>this.PropertyBag.get_Item(TaskSchema.BillingInformation);
        }
        get ChangeCount(): number {
            return <number>this.PropertyBag.get_Item(TaskSchema.ChangeCount);
        }
        set Companies(value: StringList) {
            this.PropertyBag.set_Item(TaskSchema.Companies, value);
        }
        get Companies(): StringList {
            return <StringList>this.PropertyBag.get_Item(TaskSchema.Companies);
        }
        set CompleteDate(value: Nullable<DateTime>) {
            this.PropertyBag.set_Item(TaskSchema.CompleteDate, value);
        }
        get CompleteDate(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(TaskSchema.CompleteDate);
        }
        set Contacts(value: StringList) {
            this.PropertyBag.set_Item(TaskSchema.Contacts, value);
        }
        get Contacts(): StringList {
            return <StringList>this.PropertyBag.get_Item(TaskSchema.Contacts);
        }
        get DelegationState(): TaskDelegationState {
            return <TaskDelegationState>this.PropertyBag.get_Item(TaskSchema.DelegationState);
        }
        get Delegator(): string {
            return <string>this.PropertyBag.get_Item(TaskSchema.Delegator);
        }
        set DueDate(value: Nullable<DateTime>) {
            this.PropertyBag.set_Item(TaskSchema.DueDate, value);
        }
        get DueDate(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(TaskSchema.DueDate);
        }
        get Mode(): TaskMode {
            return <TaskMode>this.PropertyBag.get_Item(TaskSchema.Mode);
        }
        get IsComplete(): boolean {
            return <boolean>this.PropertyBag.get_Item(TaskSchema.IsComplete);
        }
        get IsRecurring(): boolean {
            return <boolean>this.PropertyBag.get_Item(TaskSchema.IsRecurring);
        }
        get IsTeamTask(): boolean {
            return <boolean>this.PropertyBag.get_Item(TaskSchema.IsTeamTask);
        }
        set Mileage(value: string) {
            this.PropertyBag.set_Item(TaskSchema.Mileage, value);
        }
        get Mileage(): string {
            return <string>this.PropertyBag.get_Item(TaskSchema.Mileage);
        }
        get Owner(): string {
            return <string>this.PropertyBag.get_Item(TaskSchema.Owner);
        }
        set PercentComplete(value: number) {
            this.PropertyBag.set_Item(TaskSchema.PercentComplete, value);
        }
        get PercentComplete(): number {
            return <number>this.PropertyBag.get_Item(TaskSchema.PercentComplete);
        }
        set Recurrence(value: Recurrence) {
            this.PropertyBag.set_Item(TaskSchema.Recurrence, value);
        }
        get Recurrence(): Recurrence {
            return <Recurrence>this.PropertyBag.get_Item(TaskSchema.Recurrence);
        }
        set StartDate(value: Nullable<DateTime>) {
            this.PropertyBag.set_Item(TaskSchema.StartDate, value);
        }
        get StartDate(): Nullable<DateTime> {
            return <Nullable<DateTime>>this.PropertyBag.get_Item(TaskSchema.StartDate);
        }
        set Status(value: TaskStatus) {
            this.PropertyBag.set_Item(TaskSchema.Status, value);
        }
        get Status(): TaskStatus {
            return <TaskStatus>this.PropertyBag.get_Item(TaskSchema.Status);
        }
        get StatusDescription(): string {
            return <string>this.PropertyBag.get_Item(TaskSchema.StatusDescription);
        }
        set TotalWork(value: Nullable<number>) {
            this.PropertyBag.set_Item(TaskSchema.TotalWork, value);
        }
        get TotalWork(): Nullable<number> {
            return <Nullable<number>>this.PropertyBag.get_Item(TaskSchema.TotalWork);
        }
        get DefaultAffectedTaskOccurrences(): Nullable<AffectedTaskOccurrence> {
            return new Nullable<AffectedTaskOccurrence>(AffectedTaskOccurrence.AllOccurrences);
        }
        constructor(service: ExchangeService);
        constructor(parentAttachment: ItemAttachment);
        constructor(serviceOrParentAttachment: any) {
            if (arguments.length === 1 && (serviceOrParentAttachment === null || serviceOrParentAttachment instanceof ExchangeService)) {
                super(serviceOrParentAttachment);
                this.constructor_0(serviceOrParentAttachment);
                return;
            }
            super(serviceOrParentAttachment);
            this.constructor_1(serviceOrParentAttachment);
        }
        private constructor_0(service: ExchangeService): void {
        }
        private constructor_1(parentAttachment: ItemAttachment): void {
        }
        static Bind(service: ExchangeService, id: ItemId, propertySet: PropertySet): Task;
        static Bind(service: ExchangeService, id: ItemId): Task;
        static Bind(service: ExchangeService, id: ItemId, propertySet?: PropertySet): Task {
            if (arguments.length === 3 && (service === null || service instanceof ExchangeService) && (id === null || id instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return Task.Bind_0(service, id, propertySet);
            }
            return Task.Bind_1(service, id);
        }
        private static Bind_0(service: ExchangeService, id: ItemId, propertySet: PropertySet): Task {
            return service.BindToItem<Task>(id, propertySet);
        }
        private static Bind_1(service: ExchangeService, id: ItemId): Task {
            return Task.Bind(service, id, PropertySet.FirstClassProperties);
        }
        GetSchema(): ServiceObjectSchema {
            return TaskSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        GetIsTimeZoneHeaderRequired(isUpdateOperation: boolean): boolean {
            return true;
        }
        DeleteCurrentOccurrence(deleteMode: DeleteMode): void {
            this.InternalDelete(deleteMode, null, new Nullable<AffectedTaskOccurrence>(AffectedTaskOccurrence.SpecifiedOccurrenceOnly));
        }
        Update(conflictResolutionMode: ConflictResolutionMode): Task {
            return <Task>super.InternalUpdate(null, conflictResolutionMode, new Nullable<MessageDisposition>(MessageDisposition.SaveOnly), null);
        }
    }
    class EwsUtilities {
        static XSFalse: string = "false";
        static XSTrue: string = "true";
        static EwsTypesNamespacePrefix: string = "t";
        static EwsMessagesNamespacePrefix: string = "m";
        static EwsErrorsNamespacePrefix: string = "e";
        static EwsSoapNamespacePrefix: string = "soap";
        static EwsXmlSchemaInstanceNamespacePrefix: string = "xsi";
        static PassportSoapFaultNamespacePrefix: string = "psf";
        static WSTrustFebruary2005NamespacePrefix: string = "wst";
        static WSAddressingNamespacePrefix: string = "wsa";
        static AutodiscoverSoapNamespacePrefix: string = "a";
        static WSSecurityUtilityNamespacePrefix: string = "wsu";
        static WSSecuritySecExtNamespacePrefix: string = "wsse";
        static EwsTypesNamespace: string = "http://schemas.microsoft.com/exchange/services/2006/types";
        static EwsMessagesNamespace: string = "http://schemas.microsoft.com/exchange/services/2006/messages";
        static EwsErrorsNamespace: string = "http://schemas.microsoft.com/exchange/services/2006/errors";
        static EwsSoapNamespace: string = "http://schemas.xmlsoap.org/soap/envelope/";
        static EwsSoap12Namespace: string = "http://www.w3.org/2003/05/soap-envelope";
        static EwsXmlSchemaInstanceNamespace: string = "http://www.w3.org/2001/XMLSchema-instance";
        static PassportSoapFaultNamespace: string = "http://schemas.microsoft.com/Passport/SoapServices/SOAPFault";
        static WSTrustFebruary2005Namespace: string = "http://schemas.xmlsoap.org/ws/2005/02/trust";
        static WSAddressingNamespace: string = "http://www.w3.org/2005/08/addressing";
        static AutodiscoverSoapNamespace: string = "http://schemas.microsoft.com/exchange/2010/Autodiscover";
        static WSSecurityUtilityNamespace: string = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
        static WSSecuritySecExtNamespace: string = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
        static DomainRegex: string = "^[-a-zA-Z0-9_.]+$";
        private static serviceObjectInfo: LazyMember<ServiceObjectInfo> = new LazyMember<ServiceObjectInfo>(() => { return new ServiceObjectInfo(); });
        private static buildVersion: LazyMember<string> = new LazyMember<string>(() => {
            var versionInfo: FileVersionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
            return versionInfo.FileVersion;
        });
        private static enumVersionDictionaries: LazyMember<Dictionary<Type, Dictionary<Enum, ExchangeVersion>>> = new LazyMember<Dictionary<Type, Dictionary<Enum, ExchangeVersion>>>(() => {
            var dictionary: Dictionary<Type, Dictionary<Enum, ExchangeVersion>> = new Dictionary<Type, Dictionary<Enum, ExchangeVersion>>();
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumDict(new Type("Number")));
            return dictionary;
        });
        private static schemaToEnumDictionaries: LazyMember<Dictionary<Type, Dictionary<string, Enum>>> = new LazyMember<Dictionary<Type, Dictionary<string, Enum>>>(() => {
            var dictionary: Dictionary<Type, Dictionary<string, Enum>> = new Dictionary<Type, Dictionary<string, Enum>>();
            dictionary.Add(new Type("Number"), EwsUtilities.BuildSchemaToEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildSchemaToEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildSchemaToEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildSchemaToEnumDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildSchemaToEnumDict(new Type("Number")));
            return dictionary;
        });
        private static enumToSchemaDictionaries: LazyMember<Dictionary<Type, Dictionary<Enum, string>>> = new LazyMember<Dictionary<Type, Dictionary<Enum, string>>>(() => {
            var dictionary: Dictionary<Type, Dictionary<Enum, string>> = new Dictionary<Type, Dictionary<Enum, string>>();
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumToSchemaDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumToSchemaDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumToSchemaDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumToSchemaDict(new Type("Number")));
            dictionary.Add(new Type("Number"), EwsUtilities.BuildEnumToSchemaDict(new Type("Number")));
            return dictionary;
        });
        private static typeNameToShortNameMap: LazyMember<Dictionary<string, string>> = new LazyMember<Dictionary<string, string>>(() => {
            var dictionary: Dictionary<string, string> = new Dictionary<string, string>();
            dictionary.Add("Boolean", "bool");
            dictionary.Add("Int16", "short");
            dictionary.Add("Int32", "int");
            dictionary.Add("String", "string");
            return dictionary;
        });
        static get BuildVersion(): string {
            return EwsUtilities.buildVersion.Member;
        }
        static Assert(condition: boolean, caller: string, message: string): void {
        }
        static GetNamespacePrefix(xmlNamespace: XmlNamespace): string {
            switch (xmlNamespace) {
                case XmlNamespace.Messages:
                    return "m";
                case XmlNamespace.Types:
                    return "t";
                case XmlNamespace.Errors:
                    return "e";
                case XmlNamespace.Soap:
                case XmlNamespace.Soap12:
                    return "soap";
                case XmlNamespace.XmlSchemaInstance:
                    return "xsi";
                case XmlNamespace.PassportSoapFault:
                    return "psf";
                case XmlNamespace.WSTrustFebruary2005:
                    return "wst";
                case XmlNamespace.WSAddressing:
                    return "wsa";
                case XmlNamespace.Autodiscover:
                    return "a";
                default:
                    return NString.Empty;
            }
        }
        static GetNamespaceUri(xmlNamespace: XmlNamespace): string {
            switch (xmlNamespace) {
                case XmlNamespace.Messages:
                    return "http://schemas.microsoft.com/exchange/services/2006/messages";
                case XmlNamespace.Types:
                    return "http://schemas.microsoft.com/exchange/services/2006/types";
                case XmlNamespace.Errors:
                    return "http://schemas.microsoft.com/exchange/services/2006/errors";
                case XmlNamespace.Soap:
                    return "http://schemas.xmlsoap.org/soap/envelope/";
                case XmlNamespace.Soap12:
                    return "http://www.w3.org/2003/05/soap-envelope";
                case XmlNamespace.XmlSchemaInstance:
                    return "http://www.w3.org/2001/XMLSchema-instance";
                case XmlNamespace.PassportSoapFault:
                    return "http://schemas.microsoft.com/Passport/SoapServices/SOAPFault";
                case XmlNamespace.WSTrustFebruary2005:
                    return "http://schemas.xmlsoap.org/ws/2005/02/trust";
                case XmlNamespace.WSAddressing:
                    return "http://www.w3.org/2005/08/addressing";
                case XmlNamespace.Autodiscover:
                    return "http://schemas.microsoft.com/exchange/2010/Autodiscover";
                default:
                    return NString.Empty;
            }
        }
        static GetNamespaceFromUri(namespaceUri: string): XmlNamespace {
            switch (namespaceUri) {
                case "http://schemas.microsoft.com/exchange/services/2006/errors":
                    return XmlNamespace.Errors;
                case "http://schemas.microsoft.com/exchange/services/2006/types":
                    return XmlNamespace.Types;
                case "http://schemas.microsoft.com/exchange/services/2006/messages":
                    return XmlNamespace.Messages;
                case "http://schemas.xmlsoap.org/soap/envelope/":
                    return XmlNamespace.Soap;
                case "http://www.w3.org/2003/05/soap-envelope":
                    return XmlNamespace.Soap12;
                case "http://www.w3.org/2001/XMLSchema-instance":
                    return XmlNamespace.XmlSchemaInstance;
                case "http://schemas.microsoft.com/Passport/SoapServices/SOAPFault":
                    return XmlNamespace.PassportSoapFault;
                case "http://schemas.xmlsoap.org/ws/2005/02/trust":
                    return XmlNamespace.WSTrustFebruary2005;
                case "http://www.w3.org/2005/08/addressing":
                    return XmlNamespace.WSAddressing;
            }
            return XmlNamespace.NotSpecified;
        }
        static CreateEwsObjectFromXmlElementName<TServiceObject>(service: ExchangeService, xmlElementName: string): TServiceObject {
            var key: Type;
            if (!(() => {
                var _p0 = [
                    key
                ];
                var _r = EwsUtilities.serviceObjectInfo.Member.XmlElementNameToServiceObjectClassMap.TryGetValue(xmlElementName, _p0);
                key = _p0[0];
                return _r;
            })()) {
                return null;
            }
            var createServiceObjectWithServiceParam: (srv: ExchangeService) => any;
            if ((() => {
                var _p0 = [
                    createServiceObjectWithServiceParam
                ];
                var _r = EwsUtilities.serviceObjectInfo.Member.ServiceObjectConstructorsWithServiceParam.TryGetValue(key, _p0);
                createServiceObjectWithServiceParam = _p0[0];
                return _r;
            })()) {
                return <TServiceObject>(<any>createServiceObjectWithServiceParam(service));
            }
            throw new ArgumentException(Strings.NoAppropriateConstructorForItemClass);
        }
        static CreateItemFromItemClass(itemAttachment: ItemAttachment, itemClass: Type, isNew: boolean): Item {
            var createServiceObjectWithAttachmentParam: (itemAttachment: ItemAttachment, isNew: boolean) => any;
            if ((() => {
                var _p0 = [
                    createServiceObjectWithAttachmentParam
                ];
                var _r = EwsUtilities.serviceObjectInfo.Member.ServiceObjectConstructorsWithAttachmentParam.TryGetValue(itemClass, _p0);
                createServiceObjectWithAttachmentParam = _p0[0];
                return _r;
            })()) {
                return <Item>createServiceObjectWithAttachmentParam(itemAttachment, isNew);
            }
            throw new ArgumentException(Strings.NoAppropriateConstructorForItemClass);
        }
        static CreateItemFromXmlElementName(itemAttachment: ItemAttachment, xmlElementName: string): Item {
            var itemClass: Type;
            if ((() => {
                var _p0 = [
                    itemClass
                ];
                var _r = EwsUtilities.serviceObjectInfo.Member.XmlElementNameToServiceObjectClassMap.TryGetValue(xmlElementName, _p0);
                itemClass = _p0[0];
                return _r;
            })()) {
                return EwsUtilities.CreateItemFromItemClass(itemAttachment, itemClass, false);
            }
            return null;
        }
        static GetItemTypeFromXmlElementName(xmlElementName: string): Type {
            var result: Type = null;
            (() => {
                var _p0 = [
                    result
                ];
                var _r = EwsUtilities.serviceObjectInfo.Member.XmlElementNameToServiceObjectClassMap.TryGetValue(xmlElementName, _p0);
                result = _p0[0];
                return _r;
            })();
            return result;
        }
        static FindFirstItemOfType<TItem>(items: IEnumerable<Item>): TItem {
            var typeFromHandle: Type = new Type("TItem");
            var enumerator: IEnumerator<Item> = items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    if (Type.op_Equality(current.GetType(), typeFromHandle)) {
                        return <TItem>(<any>current);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return null;
        }
        private static WriteTraceStartElement(writer: XmlWriter, traceTag: string, includeVersion: boolean): void {
            writer.WriteStartElement("Trace");
            writer.WriteAttributeString("Tag", traceTag);
            writer.WriteAttributeString("Tid", NNumber.ToString(Thread.CurrentThread.ManagedThreadId));
            writer.WriteAttributeString("Time", DateTime.UtcNow.ToString("u", DateTimeFormatInfo.InvariantInfo));
            if (includeVersion) {
                writer.WriteAttributeString("Version", EwsUtilities.BuildVersion);
            }
        }
        static FormatLogMessage(entryKind: string, logEntry: string): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            var stringWriter: StringWriter = new StringWriter(stringBuilder);
            try {
                var xmlTextWriter: XmlTextWriter = new XmlTextWriter(stringWriter);
                try {
                    xmlTextWriter.set_Formatting(1);
                    EwsUtilities.WriteTraceStartElement(xmlTextWriter, entryKind, false);
                    xmlTextWriter.WriteWhitespace(Environment.NewLine);
                    xmlTextWriter.WriteValue(logEntry);
                    xmlTextWriter.WriteWhitespace(Environment.NewLine);
                    xmlTextWriter.WriteEndElement();
                    xmlTextWriter.WriteWhitespace(Environment.NewLine);
                }
                finally {
                    if (xmlTextWriter !== null) {
                        xmlTextWriter.Dispose();
                    }
                }
            }
            finally {
                if (stringWriter !== null) {
                    (<IDisposable>stringWriter).Dispose();
                }
            }
            return stringBuilder.ToString();
        }
        private static FormatHttpHeaders(sb: StringBuilder, headers: WebHeaderCollection): void;
        private static FormatHttpHeaders(headers: WebHeaderCollection): void;
        private static FormatHttpHeaders(sbOrHeaders: any, headers?: WebHeaderCollection): void {
            if (arguments.length === 2 && (sbOrHeaders === null || sbOrHeaders instanceof StringBuilder) && (headers === null || headers instanceof WebHeaderCollection)) {
                EwsUtilities.FormatHttpHeaders_0(sbOrHeaders, headers);
                return;
            }
            EwsUtilities.FormatHttpHeaders_1(sbOrHeaders);
        }
        private static FormatHttpHeaders_0(sb: StringBuilder, headers: WebHeaderCollection): void {
            var enumerator: IEnumerator = headers.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var text: string = <string>enumerator.Current;
                    sb.Append(NString.Format("{0}: {1}\n", text, headers.get_Item(text)));
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
        }
        static FormatHttpRequestHeaders(request: IEwsHttpWebRequest): string;
        static FormatHttpRequestHeaders(request: HttpWebRequest): string;
        static FormatHttpRequestHeaders(request: any): string {
            if (arguments.length === 1) {
                return EwsUtilities.FormatHttpRequestHeaders_0(request);
            }
            return EwsUtilities.FormatHttpRequestHeaders_1(request);
        }
        private static FormatHttpRequestHeaders_0(request: IEwsHttpWebRequest): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            stringBuilder.Append(NString.Format("{0} {1} HTTP/1.1\n", request.Method, request.RequestUri.AbsolutePath));
            EwsUtilities.FormatHttpHeaders(stringBuilder, request.Headers);
            stringBuilder.Append("\n");
            return stringBuilder.ToString();
        }
        static FormatHttpResponseHeaders(response: IEwsHttpWebResponse): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            stringBuilder.Append(NString.Format("HTTP/{0} {1} {2}\n", response.ProtocolVersion, <number>response.StatusCode, response.StatusDescription));
            stringBuilder.Append(EwsUtilities.FormatHttpHeaders(response.Headers));
            stringBuilder.Append("\n");
            return stringBuilder.ToString();
        }
        private static FormatHttpRequestHeaders_1(request: HttpWebRequest): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            stringBuilder.Append(NString.Format("{0} {1} HTTP/{2}\n", NString.ToUpperInvariant(request.Method), request.RequestUri.AbsolutePath, request.ProtocolVersion));
            stringBuilder.Append(EwsUtilities.FormatHttpHeaders(request.Headers));
            stringBuilder.Append("\n");
            return stringBuilder.ToString();
        }
        private static FormatHttpHeaders_1(headers: WebHeaderCollection): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            var enumerator: IEnumerator = headers.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var text: string = <string>enumerator.Current;
                    stringBuilder.Append(NString.Format("{0}: {1}\n", text, headers.get_Item(text)));
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
            return stringBuilder.ToString();
        }
        static FormatLogMessageWithXmlContent(entryKind: string, memoryStream: MemoryStream): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ConformanceLevel(1);
            xmlReaderSettings.set_IgnoreComments(true);
            xmlReaderSettings.set_IgnoreWhitespace(true);
            xmlReaderSettings.set_CloseInput(false);
            var position: number = memoryStream.Position;
            memoryStream.Position = 0;
            try {
                var xmlReader: XmlReader = XmlReader.Create(memoryStream, xmlReaderSettings);
                try {
                    var stringWriter: StringWriter = new StringWriter(stringBuilder);
                    try {
                        var xmlTextWriter: XmlTextWriter = new XmlTextWriter(stringWriter);
                        try {
                            xmlTextWriter.set_Formatting(1);
                            EwsUtilities.WriteTraceStartElement(xmlTextWriter, entryKind, true);
                            while (!xmlReader.get_EOF()) {
                                xmlTextWriter.WriteNode(xmlReader, true);
                            }
                            xmlTextWriter.WriteEndElement();
                            xmlTextWriter.WriteWhitespace(Environment.NewLine);
                        }
                        finally {
                            if (xmlTextWriter !== null) {
                                xmlTextWriter.Dispose();
                            }
                        }
                    }
                    finally {
                        if (stringWriter !== null) {
                            (<IDisposable>stringWriter).Dispose();
                        }
                    }
                }
                finally {
                    if (xmlReader !== null) {
                        xmlReader.Dispose();
                    }
                }
            }
            catch (ex_B1) {
                if (ex_B1 instanceof XmlException) {
                    stringBuilder.Length = 0;
                    memoryStream.Position = 0;
                    stringBuilder.Append(Encoding.UTF8.GetString(memoryStream.GetBuffer(), 0, <number>memoryStream.Length));
                }
                else
                    throw ex_B1;
            }
            memoryStream.Position = position;
            return stringBuilder.ToString();
        }
        static CopyStream(source: Stream, target: Stream): void {
            var memoryStream: MemoryStream = ((source instanceof MemoryStream) ? <MemoryStream>source : null);
            if (memoryStream !== null) {
                memoryStream.WriteTo(target);
                return;
            }
            var array: number[] = new Array<number>(4096);
            for (var _ai: number = 0; _ai < array.length; ++_ai)
                array[_ai] = 0;
            var count: number = array.length;
            for (var i: number = source.Read(array, 0, count); i > 0; i = source.Read(array, 0, count)) {
                target.Write(array, 0, i);
            }
        }
        static BoolToXSBool(value: boolean): string {
            if (!value) {
                return "false";
            }
            return "true";
        }
        static ParseEnumValueList<T>(list: IList<T>, value: string, separators: number[]): void {
            EwsUtilities.Assert(new Type("T").IsEnum, "EwsUtilities.ParseEnumValueList", "T is not an enum type.");
            var array: string[] = value.Split(separators);
            var array2: string[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var value2: string = array2[i];
                list.Add(<T>(<any>Enum.Parse(new Type("T"), value2, false)));
            }
        }
        static SerializeEnum(value: Enum): string {
            var dictionary: Dictionary<Enum, string>;
            var result: string;
            if ((() => {
                var _p0 = [
                    dictionary
                ];
                var _r = EwsUtilities.enumToSchemaDictionaries.Member.TryGetValue(value.GetType(), _p0);
                dictionary = _p0[0];
                return _r;
            })() && (() => {
                    var _p0 = [
                        result
                    ];
                    var _r = dictionary.TryGetValue(value, _p0);
                    result = _p0[0];
                    return _r;
                })()) {
                return result;
            }
            return value.ToString();
        }
        static Parse<T>(value: string): T {
            if (!new Type("T").IsEnum) {
                return <T>(<any>Convert.ChangeType(value, new Type("T"), CultureInfo.InvariantCulture));
            }
            var dictionary: Dictionary<string, Enum>;
            var $enum: Enum;
            if ((() => {
                var _p0 = [
                    dictionary
                ];
                var _r = EwsUtilities.schemaToEnumDictionaries.Member.TryGetValue(new Type("T"), _p0);
                dictionary = _p0[0];
                return _r;
            })() && (() => {
                    var _p0 = [
                        $enum
                    ];
                    var _r = dictionary.TryGetValue(value, _p0);
                    $enum = _p0[0];
                    return _r;
                })()) {
                return <T>(<any>$enum);
            }
            return <T>(<any>Enum.Parse(new Type("T"), value, false));
        }
        static ConvertTime(dateTime: DateTime, sourceTimeZone: TimeZoneInfo, destinationTimeZone: TimeZoneInfo): DateTime {
            var result: DateTime;
            try {
                result = TimeZoneInfo.ConvertTime(dateTime, sourceTimeZone, destinationTimeZone);
            }
            catch (innerException) {
                if (innerException instanceof ArgumentException) {
                    throw new TimeZoneConversionException(NString.Format(Strings.CannotConvertBetweenTimeZones, EwsUtilities.DateTimeToXSDateTime(dateTime), sourceTimeZone.DisplayName, destinationTimeZone.DisplayName), innerException);
                }
                else
                    throw innerException;
            }
            return result;
        }
        static ParseAsUnbiasedDatetimescopedToServicetimeZone(dateString: string, service: ExchangeService): DateTime {
            var dateTime: DateTime = DateTime.Parse(dateString, CultureInfo.InvariantCulture);
            if (service.TimeZone === TimeZoneInfo.Utc) {
                return new DateTime(dateTime.Ticks, DateTimeKind.Utc);
            }
            if (EwsUtilities.IsLocalTimeZone(service.TimeZone)) {
                return new DateTime(dateTime.Ticks, DateTimeKind.Local);
            }
            return new DateTime(dateTime.Ticks, DateTimeKind.Unspecified);
        }
        static IsLocalTimeZone(timeZone: TimeZoneInfo): boolean {
            return TimeZoneInfo.Local === timeZone || (TimeZoneInfo.Local.Id === timeZone.Id && TimeZoneInfo.Local.HasSameRules(timeZone));
        }
        static DateTimeToXSDate(date: DateTime): string {
            var format: string;
            switch (date.Kind) {
                case DateTimeKind.Unspecified:
                    format = "yyyy-MM-dd";
                    break;
                case DateTimeKind.Utc:
                    format = "yyyy-MM-ddZ";
                    break;
                default:
                    format = "yyyy-MM-ddzzz";
                    break;
            }
            return date.ToString(format, CultureInfo.InvariantCulture);
        }
        static DateTimeToXSDateTime(dateTime: DateTime): string {
            var text: string = "yyyy-MM-ddTHH:mm:ss.fff";
            switch (dateTime.Kind) {
                case DateTimeKind.Utc:
                    text = text + "Z";
                    break;
                case DateTimeKind.Local:
                    text = text + "zzz";
                    break;
            }
            return dateTime.ToString(text, CultureInfo.InvariantCulture);
        }
        static EwsToSystemDayOfWeek(dayOfTheWeek: DayOfTheWeek): DayOfWeek {
            if (dayOfTheWeek === DayOfTheWeek.Day || dayOfTheWeek === DayOfTheWeek.Weekday || dayOfTheWeek === DayOfTheWeek.WeekendDay) {
                throw new ArgumentException(NString.Format("Cannot convert {0} to System.DayOfWeek enum value", dayOfTheWeek), "dayOfTheWeek");
            }
            return <DayOfWeek>dayOfTheWeek;
        }
        static SystemToEwsDayOfTheWeek(dayOfWeek: DayOfWeek): DayOfTheWeek {
            return <DayOfTheWeek>dayOfWeek;
        }
        static TimeSpanToXSDuration(timeSpan: TimeSpan): string {
            var text: string = (timeSpan.TotalSeconds < 0.0) ? "-" : NString.Empty;
            return NString.Format("{0}P{1}DT{2}H{3}M{4}S", [
                text, Math.abs(timeSpan.Days), Math.abs(timeSpan.Hours), Math.abs(timeSpan.Minutes), Math.abs(timeSpan.Seconds) + "." + Math.abs(timeSpan.Milliseconds)
            ]);
        }
        static XSDurationToTimeSpan(xsDuration: string): TimeSpan {
            var regex: Regex = new Regex("(?<pos>-)?P((?<year>[0-9]+)Y)?((?<month>[0-9]+)M)?((?<day>[0-9]+)D)?(T((?<hour>[0-9]+)H)?((?<minute>[0-9]+)M)?((?<seconds>[0-9]+)(\\.(?<precision>[0-9]+))?S)?)?");
            var match: Match = regex.Match(xsDuration);
            if (!match.Success) {
                throw new ArgumentException(Strings.XsDurationCouldNotBeParsed);
            }
            var text: string = match.Result("${pos}");
            var flag: boolean = false;
            if (!NString.IsNullOrEmpty(text)) {
                flag = true;
            }
            text = match.Result("${year}");
            var num: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                num = NNumber.Parse(text);
            }
            text = match.Result("${month}");
            var num2: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                num2 = NNumber.Parse(text);
            }
            text = match.Result("${day}");
            var num3: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                num3 = NNumber.Parse(text);
            }
            text = match.Result("${hour}");
            var hours: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                hours = NNumber.Parse(text);
            }
            text = match.Result("${minute}");
            var minutes: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                minutes = NNumber.Parse(text);
            }
            text = match.Result("${seconds}");
            var seconds: number = 0;
            if (!NString.IsNullOrEmpty(text)) {
                seconds = NNumber.Parse(text);
            }
            var milliseconds: number = 0;
            text = match.Result("${precision}");
            if (text.length > 4) {
                text = NString.Substring(text, 0, 4);
            }
            if (!NString.IsNullOrEmpty(text)) {
                milliseconds = NNumber.Parse(text);
            }
            num3 = num3 + num * 365 + num2 * 30;
            var timeSpan: TimeSpan = new TimeSpan(num3, hours, minutes, seconds, milliseconds);
            if (flag) {
                timeSpan = -timeSpan;
            }
            return timeSpan;
        }
        static TimeSpanToXSTime(timeSpan: TimeSpan): string {
            return NString.Format("{0:00}:{1:00}:{2:00}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
        }
        static GetPrintableTypeName(type: Type): string {
            if (type.IsGenericType) {
                var value: string = NString.Substring(type.Name, 0, NString.IndexOf(type.Name, 96)/*'`'*/);
                var stringBuilder: StringBuilder = new StringBuilder(value);
                var value2: string[] = Enumerable.ToArray<string>(Enumerable.ToList<Type>(NArray.ToEnumerable(type.GetGenericArguments())).ConvertAll<string>((t: Type) => { return EwsUtilities.GetPrintableTypeName(t); }));
                stringBuilder.Append("<");
                stringBuilder.Append(NString.Join(",", value2));
                stringBuilder.Append(">");
                return stringBuilder.ToString();
            }
            if (type.IsArray) {
                var typeName: string = NString.Substring(type.Name, 0, NString.IndexOf(type.Name, 91)/*'['*/);
                var stringBuilder2: StringBuilder = new StringBuilder(EwsUtilities.GetSimplifiedTypeName(typeName));
                for (var i: number = 0; i < type.GetArrayRank(); i = i + 1) {
                    stringBuilder2.Append("[]");
                }
                return stringBuilder2.ToString();
            }
            return EwsUtilities.GetSimplifiedTypeName(type.Name);
        }
        private static GetSimplifiedTypeName(typeName: string): string {
            var result: string;
            if (!(() => {
                var _p0 = [
                    result
                ];
                var _r = EwsUtilities.typeNameToShortNameMap.Member.TryGetValue(typeName, _p0);
                result = _p0[0];
                return _r;
            })()) {
                return typeName;
            }
            return result;
        }
        static DomainFromEmailAddress(emailAddress: string): string {
            var array: string[] = emailAddress.Split([
                64
            ]/*'@'*/);
            if (array.length !== 2 || NString.IsNullOrEmpty(array[1])) {
                throw new FormatException(Strings.InvalidEmailAddress);
            }
            return array[1];
        }
        static ValidateParamAllowNull(param: any, paramName: string): void {
            var selfValidate: ISelfValidate = ((param instanceof ISelfValidate) ? <ISelfValidate>param : null);
            if (selfValidate !== null) {
                try {
                    selfValidate.Validate();
                }
                catch (innerException) {
                    if (innerException instanceof ServiceValidationException) {
                        throw new ArgumentException(Strings.ValidationFailed, paramName, innerException);
                    }
                    else
                        throw innerException;
                }
            }
            var serviceObject: ServiceObject = ((param instanceof ServiceObject) ? <ServiceObject>param : null);
            if (serviceObject !== null && serviceObject.IsNew) {
                throw new ArgumentException(Strings.ObjectDoesNotHaveId, paramName);
            }
        }
        static ValidateParam(param: any, paramName: string): void {
            var text: string = ((param instanceof string) ? <string>param : null);
            var flag: boolean;
            if (text !== null) {
                flag = !NString.IsNullOrEmpty(text);
            }
            else {
                flag = (param !== null);
            }
            if (!flag) {
                throw new ArgumentNullException(paramName);
            }
            EwsUtilities.ValidateParamAllowNull(param, paramName);
        }
        static ValidateParamCollection(collection: IEnumerable, paramName: string): void {
            EwsUtilities.ValidateParam(collection, paramName);
            var num: number = 0;
            var enumerator: IEnumerator = collection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: any = enumerator.Current;
                    try {
                        EwsUtilities.ValidateParam(current, NString.Format("collection[{0}]", num));
                    }
                    catch (innerException) {
                        if (innerException instanceof ArgumentException) {
                            throw new ArgumentException(NString.Format("The element at position {0} is invalid", num), paramName, innerException);
                        }
                        else
                            throw innerException;
                    }
                    num = num + 1;
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
            if (num === 0) {
                throw new ArgumentException(Strings.CollectionIsEmpty, paramName);
            }
        }
        static ValidateNonBlankStringParamAllowNull(param: string, paramName: string): void {
            if (param !== null) {
                if (param.length === EwsUtilities.CountMatchingChars(param, (c: number) => { return NChar.IsWhiteSpace(c); })) {
                    throw new ArgumentException(Strings.ArgumentIsBlankString, paramName);
                }
            }
        }
        static ValidateNonBlankStringParam(param: string, paramName: string): void {
            if (param === null) {
                throw new ArgumentNullException(paramName);
            }
            EwsUtilities.ValidateNonBlankStringParamAllowNull(param, paramName);
        }
        static ValidateEnumVersionValue(enumValue: Enum, requestVersion: ExchangeVersion): void {
            var type: Type = enumValue.GetType();
            var dictionary: Dictionary<Enum, ExchangeVersion> = EwsUtilities.enumVersionDictionaries.Member.get_Item(type);
            var exchangeVersion: ExchangeVersion = dictionary.get_Item(enumValue);
            if (requestVersion < exchangeVersion) {
                throw new ServiceVersionException(NString.Format(Strings.EnumValueIncompatibleWithRequestVersion, enumValue.ToString(), type.Name, exchangeVersion));
            }
        }
        static ValidateServiceObjectVersion(serviceObject: ServiceObject, requestVersion: ExchangeVersion): void {
            var minimumRequiredServerVersion: ExchangeVersion = serviceObject.GetMinimumRequiredServerVersion();
            if (requestVersion < minimumRequiredServerVersion) {
                throw new ServiceVersionException(NString.Format(Strings.ObjectTypeIncompatibleWithRequestVersion, serviceObject.GetType().Name, minimumRequiredServerVersion));
            }
        }
        static ValidatePropertyVersion(service: ExchangeService, minimumServerVersion: ExchangeVersion, propertyName: string): void {
            if (service.RequestedServerVersion < minimumServerVersion) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, propertyName, minimumServerVersion));
            }
        }
        static ValidateMethodVersion(service: ExchangeService, minimumServerVersion: ExchangeVersion, methodName: string): void {
            if (service.RequestedServerVersion < minimumServerVersion) {
                throw new ServiceVersionException(NString.Format(Strings.MethodIncompatibleWithRequestVersion, methodName, minimumServerVersion));
            }
        }
        static ValidateClassVersion(service: ExchangeService, minimumServerVersion: ExchangeVersion, className: string): void {
            if (service.RequestedServerVersion < minimumServerVersion) {
                throw new ServiceVersionException(NString.Format(Strings.ClassIncompatibleWithRequestVersion, className, minimumServerVersion));
            }
        }
        static ValidateDomainNameAllowNull(domainName: string, paramName: string): void {
            if (domainName !== null) {
                var regex: Regex = new Regex("^[-a-zA-Z0-9_.]+$");
                if (!regex.IsMatch(domainName)) {
                    throw new ArgumentException(NString.Format(Strings.InvalidDomainName, domainName), paramName);
                }
            }
        }
        private static GetEnumVersion(enumType: Type, enumName: string): ExchangeVersion {
            var member: MemberInfo[] = enumType.GetMember(enumName);
            EwsUtilities.Assert(MemberInfo.op_Inequality(member, null) && member.length > 0, "EwsUtilities.GetEnumVersion", NString.Concat([
                "Enum member ", enumName, " not found in ", enumType
            ]));
            var customAttributes: any[] = member[0].GetCustomAttributes(new Type("RequiredServerVersionAttribute"), false);
            if (customAttributes !== null && customAttributes.length > 0) {
                return (<RequiredServerVersionAttribute>customAttributes[0]).Version;
            }
            return ExchangeVersion.Exchange2007_SP1;
        }
        private static BuildEnumDict(enumType: Type): Dictionary<Enum, ExchangeVersion> {
            var dictionary: Dictionary<Enum, ExchangeVersion> = new Dictionary<Enum, ExchangeVersion>();
            var names: string[] = Enum.GetNames(enumType);
            var array: string[] = names;
            for (var i: number = 0; i < array.length; i = i + 1) {
                var text: string = array[i];
                var key: Enum = <Enum>Enum.Parse(enumType, text, false);
                var enumVersion: ExchangeVersion = EwsUtilities.GetEnumVersion(enumType, text);
                dictionary.Add(key, enumVersion);
            }
            return dictionary;
        }
        private static GetEnumSchemaName(enumType: Type, enumName: string): string {
            var member: MemberInfo[] = enumType.GetMember(enumName);
            EwsUtilities.Assert(MemberInfo.op_Inequality(member, null) && member.length > 0, "EwsUtilities.GetEnumSchemaName", NString.Concat([
                "Enum member ", enumName, " not found in ", enumType
            ]));
            var customAttributes: any[] = member[0].GetCustomAttributes(new Type("EwsEnumAttribute"), false);
            if (customAttributes !== null && customAttributes.length > 0) {
                return (<EwsEnumAttribute>customAttributes[0]).SchemaName;
            }
            return null;
        }
        private static BuildSchemaToEnumDict(enumType: Type): Dictionary<string, Enum> {
            var dictionary: Dictionary<string, Enum> = new Dictionary<string, Enum>();
            var names: string[] = Enum.GetNames(enumType);
            var array: string[] = names;
            for (var i: number = 0; i < array.length; i = i + 1) {
                var text: string = array[i];
                var value: Enum = <Enum>Enum.Parse(enumType, text, false);
                var enumSchemaName: string = EwsUtilities.GetEnumSchemaName(enumType, text);
                if (!NString.IsNullOrEmpty(enumSchemaName)) {
                    dictionary.Add(enumSchemaName, value);
                }
            }
            return dictionary;
        }
        private static BuildEnumToSchemaDict(enumType: Type): Dictionary<Enum, string> {
            var dictionary: Dictionary<Enum, string> = new Dictionary<Enum, string>();
            var names: string[] = Enum.GetNames(enumType);
            var array: string[] = names;
            for (var i: number = 0; i < array.length; i = i + 1) {
                var text: string = array[i];
                var key: Enum = <Enum>Enum.Parse(enumType, text, false);
                var enumSchemaName: string = EwsUtilities.GetEnumSchemaName(enumType, text);
                if (!NString.IsNullOrEmpty(enumSchemaName)) {
                    dictionary.Add(key, enumSchemaName);
                }
            }
            return dictionary;
        }
        static GetEnumeratedObjectCount(objects: IEnumerable): number {
            var num: number = 0;
            var enumerator: IEnumerator = objects.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var arg_11_0: any = enumerator.Current;
                    num = num + 1;
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
            return num;
        }
        static GetEnumeratedObjectAt(objects: IEnumerable, index: number): any {
            var num: number = 0;
            var enumerator: IEnumerator = objects.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: any = enumerator.Current;
                    if (num === index) {
                        return current;
                    }
                    num = num + 1;
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
            throw new ArgumentOutOfRangeException("index", Strings.IEnumerableDoesNotContainThatManyObject);
        }
        static CountMatchingChars(str: string, charPredicate: (obj: number) => boolean): number {
            var num: number = 0;
            for (var i: number = 0; i < str.length; i = i + 1) {
                var obj: number = str.charCodeAt(i);
                if (charPredicate(obj)) {
                    num = num + 1;
                }
            }
            return num;
        }
        static TrueForAll<T>(collection: IEnumerable<T>, predicate: (obj: T) => boolean): boolean {
            var enumerator: IEnumerator<T> = collection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: T = enumerator.Current;
                    if (!predicate(current)) {
                        return false;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return true;
        }
        static ForEach<T>(collection: IEnumerable<T>, action: (obj: T) => void): void {
            var enumerator: IEnumerator<T> = collection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: T = enumerator.Current;
                    action(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        constructor() {
            super();
        }
    }
    class FolderPermission extends ComplexProperty {
        private static defaultPermissions: LazyMember<Dictionary<FolderPermissionLevel, FolderPermission>> = new LazyMember<Dictionary<FolderPermissionLevel, FolderPermission>>(() => {
            var dictionary: Dictionary<FolderPermissionLevel, FolderPermission> = new Dictionary<FolderPermissionLevel, FolderPermission>();
            var folderPermission: FolderPermission = new FolderPermission();
            folderPermission.canCreateItems = false;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.None;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = false;
            folderPermission.readItems = FolderPermissionReadAccess.None;
            dictionary.Add(FolderPermissionLevel.None, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.None;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.None;
            dictionary.Add(FolderPermissionLevel.Contributor, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = false;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.None;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.Reviewer, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.Owned;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.NoneditingAuthor, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.Owned;
            folderPermission.editItems = PermissionScope.Owned;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.Author, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = true;
            folderPermission.deleteItems = PermissionScope.Owned;
            folderPermission.editItems = PermissionScope.Owned;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.PublishingAuthor, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.All;
            folderPermission.editItems = PermissionScope.All;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.Editor, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = true;
            folderPermission.deleteItems = PermissionScope.All;
            folderPermission.editItems = PermissionScope.All;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.PublishingEditor, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = true;
            folderPermission.canCreateSubFolders = true;
            folderPermission.deleteItems = PermissionScope.All;
            folderPermission.editItems = PermissionScope.All;
            folderPermission.isFolderContact = true;
            folderPermission.isFolderOwner = true;
            folderPermission.isFolderVisible = true;
            folderPermission.readItems = FolderPermissionReadAccess.FullDetails;
            dictionary.Add(FolderPermissionLevel.Owner, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = false;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.None;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = false;
            folderPermission.readItems = FolderPermissionReadAccess.TimeOnly;
            dictionary.Add(FolderPermissionLevel.FreeBusyTimeOnly, folderPermission);
            folderPermission = new FolderPermission();
            folderPermission.canCreateItems = false;
            folderPermission.canCreateSubFolders = false;
            folderPermission.deleteItems = PermissionScope.None;
            folderPermission.editItems = PermissionScope.None;
            folderPermission.isFolderContact = false;
            folderPermission.isFolderOwner = false;
            folderPermission.isFolderVisible = false;
            folderPermission.readItems = FolderPermissionReadAccess.TimeAndSubjectAndLocation;
            dictionary.Add(FolderPermissionLevel.FreeBusyTimeAndSubjectAndLocation, folderPermission);
            return dictionary;
        });
        private static levelVariants: LazyMember<List<FolderPermission>> = new LazyMember<List<FolderPermission>>(() => {
            var list: List<FolderPermission> = new List<FolderPermission>();
            var folderPermission: FolderPermission = FolderPermission.defaultPermissions.Member.get_Item(FolderPermissionLevel.None);
            var folderPermission2: FolderPermission = FolderPermission.defaultPermissions.Member.get_Item(FolderPermissionLevel.Owner);
            var folderPermission3: FolderPermission = folderPermission.Clone();
            folderPermission3.isFolderVisible = true;
            list.Add(folderPermission3);
            folderPermission3 = folderPermission.Clone();
            folderPermission3.isFolderContact = true;
            list.Add(folderPermission3);
            folderPermission3 = folderPermission.Clone();
            folderPermission3.isFolderContact = true;
            folderPermission3.isFolderVisible = true;
            list.Add(folderPermission3);
            folderPermission3 = folderPermission2.Clone();
            folderPermission3.isFolderContact = false;
            list.Add(folderPermission3);
            return list;
        });
        private userId: UserId = null;
        private canCreateItems: boolean = false;
        private canCreateSubFolders: boolean = false;
        private isFolderOwner: boolean = false;
        private isFolderVisible: boolean = false;
        private isFolderContact: boolean = false;
        private editItems: PermissionScope = 0;
        private deleteItems: PermissionScope = 0;
        private readItems: FolderPermissionReadAccess = 0;
        private permissionLevel: FolderPermissionLevel = 0;
        set UserId(value: UserId) {
            if (this.userId !== null) {
                this.userId.OnChange.Remove(this.PropertyChanged);
            }
            (() => {
                var _p0 = [
                    this.userId
                ];
                var _r = this.SetFieldValue<UserId>(_p0, value);
                this.userId = _p0[0];
                return _r;
            })();
            if (this.userId !== null) {
                this.userId.OnChange.Add(this.PropertyChanged);
            }
        }
        get UserId(): UserId {
            return this.userId;
        }
        set CanCreateItems(value: boolean) {
            (() => {
                var _p0 = [
                    this.canCreateItems
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.canCreateItems = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get CanCreateItems(): boolean {
            return this.canCreateItems;
        }
        set CanCreateSubFolders(value: boolean) {
            (() => {
                var _p0 = [
                    this.canCreateSubFolders
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.canCreateSubFolders = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get CanCreateSubFolders(): boolean {
            return this.canCreateSubFolders;
        }
        set IsFolderOwner(value: boolean) {
            (() => {
                var _p0 = [
                    this.isFolderOwner
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isFolderOwner = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get IsFolderOwner(): boolean {
            return this.isFolderOwner;
        }
        set IsFolderVisible(value: boolean) {
            (() => {
                var _p0 = [
                    this.isFolderVisible
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isFolderVisible = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get IsFolderVisible(): boolean {
            return this.isFolderVisible;
        }
        set IsFolderContact(value: boolean) {
            (() => {
                var _p0 = [
                    this.isFolderContact
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isFolderContact = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get IsFolderContact(): boolean {
            return this.isFolderContact;
        }
        set EditItems(value: PermissionScope) {
            (() => {
                var _p0 = [
                    this.editItems
                ];
                var _r = this.SetFieldValue<PermissionScope>(_p0, value);
                this.editItems = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get EditItems(): PermissionScope {
            return this.editItems;
        }
        set DeleteItems(value: PermissionScope) {
            (() => {
                var _p0 = [
                    this.deleteItems
                ];
                var _r = this.SetFieldValue<PermissionScope>(_p0, value);
                this.deleteItems = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get DeleteItems(): PermissionScope {
            return this.deleteItems;
        }
        set ReadItems(value: FolderPermissionReadAccess) {
            (() => {
                var _p0 = [
                    this.readItems
                ];
                var _r = this.SetFieldValue<FolderPermissionReadAccess>(_p0, value);
                this.readItems = _p0[0];
                return _r;
            })();
            this.AdjustPermissionLevel();
        }
        get ReadItems(): FolderPermissionReadAccess {
            return this.readItems;
        }
        set PermissionLevel(value: FolderPermissionLevel) {
            if (this.permissionLevel !== value) {
                if (value === FolderPermissionLevel.Custom) {
                    throw new ServiceLocalException(Strings.CannotSetPermissionLevelToCustom);
                }
                this.AssignIndividualPermissions(FolderPermission.defaultPermissions.Member.get_Item(value));
                (() => {
                    var _p0 = [
                        this.permissionLevel
                    ];
                    var _r = this.SetFieldValue<FolderPermissionLevel>(_p0, value);
                    this.permissionLevel = _p0[0];
                    return _r;
                })();
            }
        }
        get PermissionLevel(): FolderPermissionLevel {
            return this.permissionLevel;
        }
        get DisplayPermissionLevel(): FolderPermissionLevel {
            if (this.permissionLevel === FolderPermissionLevel.Custom) {
                var enumerator: List_Enumerator<FolderPermission> = FolderPermission.levelVariants.Member.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: FolderPermission = enumerator.Current;
                        if (this.IsEqualTo(current)) {
                            return current.PermissionLevel;
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
            return this.permissionLevel;
        }
        private IsEqualTo(permission: FolderPermission): boolean {
            return this.CanCreateItems === permission.CanCreateItems && this.CanCreateSubFolders === permission.CanCreateSubFolders && this.IsFolderContact === permission.IsFolderContact && this.IsFolderVisible === permission.IsFolderVisible && this.IsFolderOwner === permission.IsFolderOwner && this.EditItems === permission.EditItems && this.DeleteItems === permission.DeleteItems && this.ReadItems === permission.ReadItems;
        }
        private Clone(): FolderPermission {
            return <FolderPermission>super.MemberwiseClone();
        }
        private AdjustPermissionLevel(): void {
            var enumerator: Dictionary_Enumerator<FolderPermissionLevel, FolderPermission> = FolderPermission.defaultPermissions.Member.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<FolderPermissionLevel, FolderPermission> = enumerator.Current;
                    if (this.IsEqualTo(current.Value)) {
                        this.permissionLevel = current.Key;
                        return;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            this.permissionLevel = FolderPermissionLevel.Custom;
        }
        private AssignIndividualPermissions(permission: FolderPermission): void {
            this.canCreateItems = permission.CanCreateItems;
            this.canCreateSubFolders = permission.CanCreateSubFolders;
            this.isFolderContact = permission.IsFolderContact;
            this.isFolderOwner = permission.IsFolderOwner;
            this.isFolderVisible = permission.IsFolderVisible;
            this.editItems = permission.EditItems;
            this.deleteItems = permission.DeleteItems;
            this.readItems = permission.ReadItems;
        }
        constructor();
        constructor(userId: UserId, permissionLevel: FolderPermissionLevel);
        constructor(primarySmtpAddress: string, permissionLevel: FolderPermissionLevel);
        constructor(standardUser: StandardUser, permissionLevel: FolderPermissionLevel);
        constructor(userIdOrPrimarySmtpAddressOrStandardUser?: any, permissionLevel?: FolderPermissionLevel) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (userIdOrPrimarySmtpAddressOrStandardUser === null || userIdOrPrimarySmtpAddressOrStandardUser instanceof UserId) && (permissionLevel === null || permissionLevel.constructor === Number)) {
                this.constructor_1(userIdOrPrimarySmtpAddressOrStandardUser, permissionLevel);
                return;
            }
            if (arguments.length === 2 && (userIdOrPrimarySmtpAddressOrStandardUser === null || userIdOrPrimarySmtpAddressOrStandardUser.constructor === String) && (permissionLevel === null || permissionLevel.constructor === Number)) {
                this.constructor_2(userIdOrPrimarySmtpAddressOrStandardUser, permissionLevel);
                return;
            }
            this.constructor_3(userIdOrPrimarySmtpAddressOrStandardUser, permissionLevel);
        }
        private constructor_0(): void {
            this.UserId = new UserId();
        }
        private constructor_1(userId: UserId, permissionLevel: FolderPermissionLevel): void {
            EwsUtilities.ValidateParam(userId, "userId");
            this.userId = userId;
            this.PermissionLevel = permissionLevel;
        }
        private constructor_2(primarySmtpAddress: string, permissionLevel: FolderPermissionLevel): void {
            this.userId = new UserId(primarySmtpAddress);
            this.PermissionLevel = permissionLevel;
        }
        private constructor_3(standardUser: StandardUser, permissionLevel: FolderPermissionLevel): void {
            this.userId = new UserId(standardUser);
            this.PermissionLevel = permissionLevel;
        }
        Validate(isCalendarFolder: boolean, permissionIndex: number): void {
            if (!this.UserId.IsValid()) {
                throw new ServiceValidationException(NString.Format(Strings.FolderPermissionHasInvalidUserId, permissionIndex));
            }
            if (!isCalendarFolder) {
                if (this.readItems === FolderPermissionReadAccess.TimeAndSubjectAndLocation || this.readItems === FolderPermissionReadAccess.TimeOnly) {
                    throw new ServiceLocalException(NString.Format(Strings.ReadAccessInvalidForNonCalendarFolder, this.readItems));
                }
                if (this.permissionLevel === FolderPermissionLevel.FreeBusyTimeAndSubjectAndLocation || this.permissionLevel === FolderPermissionLevel.FreeBusyTimeOnly) {
                    throw new ServiceLocalException(NString.Format(Strings.PermissionLevelInvalidForNonCalendarFolder, this.permissionLevel));
                }
            }
        }
        private PropertyChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "UserId":
                    this.UserId = new UserId();
                    this.UserId.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "CanCreateItems":
                    this.canCreateItems = reader.ReadValue<boolean>();
                    return true;
                case "CanCreateSubFolders":
                    this.canCreateSubFolders = reader.ReadValue<boolean>();
                    return true;
                case "IsFolderOwner":
                    this.isFolderOwner = reader.ReadValue<boolean>();
                    return true;
                case "IsFolderVisible":
                    this.isFolderVisible = reader.ReadValue<boolean>();
                    return true;
                case "IsFolderContact":
                    this.isFolderContact = reader.ReadValue<boolean>();
                    return true;
                case "EditItems":
                    this.editItems = reader.ReadValue<PermissionScope>();
                    return true;
                case "DeleteItems":
                    this.deleteItems = reader.ReadValue<PermissionScope>();
                    return true;
                case "ReadItems":
                    this.readItems = reader.ReadValue<FolderPermissionReadAccess>();
                    return true;
                case "PermissionLevel":
                case "CalendarPermissionLevel":
                    this.permissionLevel = reader.ReadValue<FolderPermissionLevel>();
                    return true;
            }
            return false;
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            super.LoadFromXml(reader, xmlNamespace, xmlElementName);
            this.AdjustPermissionLevel();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "UserId":
                            this.UserId = new UserId();
                            this.UserId.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "CanCreateItems":
                            this.canCreateItems = jsonProperty.ReadAsBool(current);
                            break;
                        case "CanCreateSubFolders":
                            this.canCreateSubFolders = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsFolderOwner":
                            this.isFolderOwner = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsFolderVisible":
                            this.isFolderVisible = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsFolderContact":
                            this.isFolderContact = jsonProperty.ReadAsBool(current);
                            break;
                        case "EditItems":
                            this.editItems = jsonProperty.ReadEnumValue<PermissionScope>(current);
                            break;
                        case "DeleteItems":
                            this.deleteItems = jsonProperty.ReadEnumValue<PermissionScope>(current);
                            break;
                        case "ReadItems":
                            this.readItems = jsonProperty.ReadEnumValue<FolderPermissionReadAccess>(current);
                            break;
                        case "PermissionLevel":
                        case "CalendarPermissionLevel":
                            this.permissionLevel = jsonProperty.ReadEnumValue<FolderPermissionLevel>(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            this.AdjustPermissionLevel();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter, isCalendarFolder: boolean): void {
            if (this.UserId !== null) {
                this.UserId.WriteToXml(writer, "UserId");
            }
            if (this.PermissionLevel === FolderPermissionLevel.Custom) {
                writer.WriteElementValue(XmlNamespace.Types, "CanCreateItems", this.CanCreateItems);
                writer.WriteElementValue(XmlNamespace.Types, "CanCreateSubFolders", this.CanCreateSubFolders);
                writer.WriteElementValue(XmlNamespace.Types, "IsFolderOwner", this.IsFolderOwner);
                writer.WriteElementValue(XmlNamespace.Types, "IsFolderVisible", this.IsFolderVisible);
                writer.WriteElementValue(XmlNamespace.Types, "IsFolderContact", this.IsFolderContact);
                writer.WriteElementValue(XmlNamespace.Types, "EditItems", this.EditItems);
                writer.WriteElementValue(XmlNamespace.Types, "DeleteItems", this.DeleteItems);
                writer.WriteElementValue(XmlNamespace.Types, "ReadItems", this.ReadItems);
            }
            writer.WriteElementValue(XmlNamespace.Types, isCalendarFolder ? "CalendarPermissionLevel" : "PermissionLevel", this.PermissionLevel);
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string, isCalendarFolder: boolean): void {
            writer.WriteStartElement(this.Namespace, xmlElementName);
            this.WriteAttributesToXml(writer);
            this.WriteElementsToXml(writer, isCalendarFolder);
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService, isCalendarFolder: boolean): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserId", this.UserId.InternalToJson(service));
            if (this.PermissionLevel === FolderPermissionLevel.Custom) {
                jsonObject.Add("CanCreateItems", this.CanCreateItems);
                jsonObject.Add("CanCreateSubFolders", this.CanCreateSubFolders);
                jsonObject.Add("IsFolderOwner", this.IsFolderOwner);
                jsonObject.Add("IsFolderVisible", this.IsFolderVisible);
                jsonObject.Add("IsFolderContact", this.IsFolderContact);
                jsonObject.Add("EditItems", this.EditItems);
                jsonObject.Add("DeleteItems", this.DeleteItems);
                jsonObject.Add("ReadItems", this.ReadItems);
            }
            jsonObject.Add(isCalendarFolder ? "CalendarPermissionLevel" : "PermissionLevel", this.PermissionLevel);
            jsonObject.AddTypeParameter(isCalendarFolder ? "CalendarPermission" : "Permission");
            return jsonObject;
        }
    }
    class FolderPermissionCollection extends ComplexPropertyCollection<FolderPermission>
    {
        private isCalendarFolder: boolean = false;
        private unknownEntries: Collection<string> = new Collection<string>();
        private get InnerCollectionXmlElementName(): string {
            if (!this.isCalendarFolder) {
                return "Permissions";
            }
            return "CalendarPermissions";
        }
        private get CollectionItemXmlElementName(): string {
            if (!this.isCalendarFolder) {
                return "Permission";
            }
            return "CalendarPermission";
        }
        get UnknownEntries(): Collection<string> {
            return this.unknownEntries;
        }
        constructor(owner: Folder) {
            super();
            this.isCalendarFolder = (owner instanceof CalendarFolder);
        }
        GetCollectionItemXmlElementName(complexProperty: FolderPermission): string {
            return this.CollectionItemXmlElementName;
        }
        LoadFromXml(reader: EwsServiceXmlReader, localElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, localElementName);
            reader.ReadStartElement(XmlNamespace.Types, this.InnerCollectionXmlElementName);
            super.LoadFromXml(reader, this.InnerCollectionXmlElementName);
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, this.InnerCollectionXmlElementName);
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Types, "UnknownEntries")) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "UnknownEntry")) {
                        this.unknownEntries.Add(reader.ReadElementValue());
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, "UnknownEntries"));
            }
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var array: any[] = jsonProperty.ReadAsArray(this.InnerCollectionXmlElementName);
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var obj: any = array2[i];
                var folderPermission: FolderPermission = new FolderPermission();
                folderPermission.LoadFromJson(((obj instanceof JsonObject) ? <JsonObject>obj : null), service);
                super.InternalAdd(folderPermission);
            }
            var array3: any[] = jsonProperty.ReadAsArray("UnknownEntries");
            var array4: any[] = array3;
            for (var j: number = 0; j < array4.length; j = j + 1) {
                var obj2: any = array4[j];
                this.unknownEntries.Add(((obj2 instanceof string) ? <string>obj2 : null));
            }
        }
        Validate(): void {
            for (var i: number = 0; i < this.Items.Count; i = i + 1) {
                var folderPermission: FolderPermission = this.Items.get_Item(i);
                folderPermission.Validate(this.isCalendarFolder, i);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.InnerCollectionXmlElementName);
            var enumerator: IEnumerator<FolderPermission> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: FolderPermission = enumerator.Current;
                    current.WriteToXml(writer, this.GetCollectionItemXmlElementName(current), this.isCalendarFolder);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<FolderPermission> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: FolderPermission = enumerator.Current;
                    list.Add(current.InternalToJson(service, this.isCalendarFolder));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            jsonObject.AddTypeParameter(this.InnerCollectionXmlElementName);
            jsonObject.Add(this.InnerCollectionXmlElementName, NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        CreateComplexProperty(xmlElementName: string): FolderPermission {
            return new FolderPermission();
        }
        CreateDefaultComplexProperty(): FolderPermission {
            return new FolderPermission();
        }
        Add(permission: FolderPermission): void {
            super.InternalAdd(permission);
        }
        AddRange(permissions: IEnumerable<FolderPermission>): void {
            EwsUtilities.ValidateParam(permissions, "permissions");
            var enumerator: IEnumerator<FolderPermission> = permissions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: FolderPermission = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        Clear(): void {
            super.InternalClear();
        }
        Remove(permission: FolderPermission): boolean {
            return super.InternalRemove(permission);
        }
        RemoveAt(index: number): void {
            super.InternalRemoveAt(index);
        }
    }
    class ItemAttachment extends Attachment {
        private item: Item = null;
        set Item(value: Item) {
            super.ThrowIfThisIsNotNew();
            if (this.item !== null) {
                this.item.OnChange.Remove(this.ItemChanged);
            }
            this.item = value;
            if (this.item !== null) {
                this.item.OnChange.Add(this.ItemChanged);
            }
        }
        get Item(): Item {
            return this.item;
        }
        constructor(owner: Item);
        constructor(service: ExchangeService);
        constructor(ownerOrService: any) {
            super(ownerOrService);
            if (arguments.length === 1 && (ownerOrService === null || ownerOrService instanceof Item)) {
                this.constructor_0(ownerOrService);
                return;
            }
            this.constructor_1(ownerOrService);
        }
        private constructor_0(owner: Item): void {
        }
        private constructor_1(service: ExchangeService): void {
        }
        private ItemChanged(serviceObject: ServiceObject): void {
            if (this.Owner !== null) {
                this.Owner.PropertyBag.Changed();
            }
        }
        GetXmlElementName(): string {
            return "ItemAttachment";
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag) {
                this.item = EwsUtilities.CreateItemFromXmlElementName(this, reader.LocalName);
                if (this.item !== null) {
                    this.item.LoadFromXml(reader, true);
                }
            }
            return flag;
        }
        TryReadElementFromXmlToPatch(reader: EwsServiceXmlReader): boolean {
            super.TryReadElementFromXml(reader);
            reader.Read();
            var itemTypeFromXmlElementName: Type = EwsUtilities.GetItemTypeFromXmlElementName(reader.LocalName);
            if (Type.op_Equality(itemTypeFromXmlElementName, null)) {
                return false;
            }
            if (this.item === null || Type.op_Inequality(this.item.GetType(), itemTypeFromXmlElementName)) {
                throw new ServiceLocalException(Strings.AttachmentItemTypeMismatch);
            }
            this.item.LoadFromXml(reader, false);
            return true;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            if (jsonProperty.ContainsKey("Item")) {
                var jsonObject: JsonObject = jsonProperty.ReadAsJsonObject("Item");
                if (jsonObject !== null) {
                    this.item = EwsUtilities.CreateItemFromXmlElementName(this, jsonObject.ReadTypeString());
                    if (this.item !== null) {
                        this.item.LoadFromJson(jsonObject, service, true);
                    }
                }
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            this.Item.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            jsonObject.Add("Item", ((this.item.ToJson(service, false) instanceof JsonObject) ? <JsonObject>this.item.ToJson(service, false) : null));
            return jsonObject;
        }
        Validate(attachmentIndex: number): void {
            if (NString.IsNullOrEmpty(this.Name)) {
                throw new ServiceValidationException(NString.Format(Strings.ItemAttachmentMustBeNamed, attachmentIndex));
            }
            this.Item.Attachments.Validate();
        }
        Load(additionalProperties: PropertyDefinitionBase[]): void;
        Load(additionalProperties: IEnumerable<PropertyDefinitionBase>): void;
        Load(bodyType: BodyType, additionalProperties: PropertyDefinitionBase[]): void;
        Load(bodyType: BodyType, additionalProperties: IEnumerable<PropertyDefinitionBase>): void;
        Load(additionalPropertiesOrBodyType: any, additionalProperties?: any): void {
            if (arguments.length === 1 && (additionalPropertiesOrBodyType === null || additionalPropertiesOrBodyType instanceof Array)) {
                this.Load_0(additionalPropertiesOrBodyType);
                return;
            }
            if (arguments.length === 1) {
                this.Load_1(additionalPropertiesOrBodyType);
                return;
            }
            if (arguments.length === 2 && (additionalPropertiesOrBodyType === null || additionalPropertiesOrBodyType.constructor === Number) && (additionalProperties === null || additionalProperties instanceof Array)) {
                this.Load_2(additionalPropertiesOrBodyType, additionalProperties);
                return;
            }
            this.Load_3(additionalPropertiesOrBodyType, additionalProperties);
        }
        private Load_0(additionalProperties: PropertyDefinitionBase[]): void {
            super.InternalLoad(null, NArray.ToEnumerable(additionalProperties));
        }
        private Load_1(additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            super.InternalLoad(null, additionalProperties);
        }
        private Load_2(bodyType: BodyType, additionalProperties: PropertyDefinitionBase[]): void {
            super.InternalLoad(new Nullable<BodyType>(bodyType), NArray.ToEnumerable(additionalProperties));
        }
        private Load_3(bodyType: BodyType, additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            super.InternalLoad(new Nullable<BodyType>(bodyType), additionalProperties);
        }
    }
    class ItemAttachment<TItem> extends ItemAttachment {
        set Item(value: TItem) {
            this.Item = value;
        }
        get Item(): TItem {
            return <TItem>(<any>this.Item);
        }
        constructor(owner: Item) {
            super(owner);
        }
    }
    class GroupMember extends ComplexProperty {
        private addressInformation: EmailAddress = null;
        private status: MemberStatus = 0;
        private key: string = null;
        get Key(): string {
            return this.key;
        }
        set AddressInformation(value: EmailAddress) {
            if (this.addressInformation !== null) {
                this.addressInformation.OnChange.Remove(this.AddressInformationChanged);
            }
            this.addressInformation = value;
            if (this.addressInformation !== null) {
                this.addressInformation.OnChange.Add(this.AddressInformationChanged);
            }
        }
        get AddressInformation(): EmailAddress {
            return this.addressInformation;
        }
        get Status(): MemberStatus {
            return this.status;
        }
        constructor();
        constructor(smtpAddress: string);
        constructor(address: string, routingType: string, mailboxType: MailboxType);
        constructor(smtpAddress: string, mailboxType: MailboxType);
        constructor(name: string, address: string, routingType: string);
        constructor(name: string, smtpAddress: string);
        constructor(contactGroupId: ItemId);
        constructor(contactId: ItemId, addressToLink: string);
        constructor(addressInformation: EmailAddress);
        constructor(member: GroupMember);
        constructor(contact: Contact, emailAddressKey: EmailAddressKey);
        constructor(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember?: any, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey?: any, mailboxTypeOrRoutingType?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember.constructor === String)) {
                this.constructor_1(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember);
                return;
            }
            if (arguments.length === 3 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember.constructor === String) && (routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey === null || routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey.constructor === String) && (mailboxTypeOrRoutingType === null || mailboxTypeOrRoutingType.constructor === Number)) {
                this.constructor_2(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey, mailboxTypeOrRoutingType);
                return;
            }
            if (arguments.length === 2 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember.constructor === String) && (routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey === null || routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey.constructor === Number)) {
                this.constructor_3(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey);
                return;
            }
            if (arguments.length === 3 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember.constructor === String) && (routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey === null || routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey.constructor === String) && (mailboxTypeOrRoutingType === null || mailboxTypeOrRoutingType.constructor === String)) {
                this.constructor_4(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey, mailboxTypeOrRoutingType);
                return;
            }
            if (arguments.length === 2 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember.constructor === String) && (routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey === null || routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey.constructor === String)) {
                this.constructor_5(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey);
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember instanceof ItemId)) {
                this.constructor_6(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember);
                return;
            }
            if (arguments.length === 2 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember instanceof ItemId) && (routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey === null || routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey.constructor === String)) {
                this.constructor_7(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey);
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember instanceof EmailAddress)) {
                this.constructor_8(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember);
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember === null || smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember instanceof GroupMember)) {
                this.constructor_9(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember);
                return;
            }
            this.constructor_10(smtpAddressOrAddressOrNameOrContactGroupIdOrContactIdOrAddressInformationOrMember, routingTypeOrMailboxTypeOrAddressOrSmtpAddressOrAddressToLinkOrEmailAddressKey);
        }
        private constructor_0(): void {
            this.key = null;
            this.status = MemberStatus.Unrecognized;
        }
        private constructor_1(smtpAddress: string): void {
            this.constructor_0();
            this.AddressInformation = new EmailAddress(smtpAddress);
        }
        private constructor_2(address: string, routingType: string, mailboxType: MailboxType): void {
            this.constructor_0();
            switch (mailboxType) {
                case MailboxType.OneOff:
                case MailboxType.Mailbox:
                case MailboxType.PublicFolder:
                case MailboxType.PublicGroup:
                case MailboxType.Contact:
                    this.AddressInformation = new EmailAddress(null, address, routingType, mailboxType);
                    return;
            }
            throw new ServiceLocalException(Strings.InvalidMailboxType);
        }
        private constructor_3(smtpAddress: string, mailboxType: MailboxType): void {
            this.constructor_2(smtpAddress, "SMTP", mailboxType);
        }
        private constructor_4(name: string, address: string, routingType: string): void {
            this.constructor_0();
            this.AddressInformation = new EmailAddress(name, address, routingType, MailboxType.OneOff);
        }
        private constructor_5(name: string, smtpAddress: string): void {
            this.constructor_4(name, smtpAddress, "SMTP");
        }
        private constructor_6(contactGroupId: ItemId): void {
            this.constructor_0();
            this.AddressInformation = new EmailAddress(null, null, null, MailboxType.ContactGroup, contactGroupId);
        }
        private constructor_7(contactId: ItemId, addressToLink: string): void {
            this.constructor_0();
            this.AddressInformation = new EmailAddress(null, addressToLink, null, MailboxType.Contact, contactId);
        }
        private constructor_8(addressInformation: EmailAddress): void {
            this.constructor_0();
            this.AddressInformation = new EmailAddress(addressInformation);
        }
        private constructor_9(member: GroupMember): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(member, "member");
            this.AddressInformation = new EmailAddress(member.AddressInformation);
        }
        private constructor_10(contact: Contact, emailAddressKey: EmailAddressKey): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(contact, "contact");
            var mailbox: EmailAddress = contact.EmailAddresses.get_Item(emailAddressKey);
            this.AddressInformation = new EmailAddress(mailbox);
            this.addressInformation.Id = contact.Id;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.key = reader.ReadAttributeValue<string>("Key");
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Status") {
                    this.status = EwsUtilities.Parse<MemberStatus>(reader.ReadElementValue());
                    return true;
                }
                if (localName === "Mailbox") {
                    this.AddressInformation = new EmailAddress();
                    this.AddressInformation.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Status")) {
                            if (a === "Mailbox") {
                                this.AddressInformation = new EmailAddress();
                                this.AddressInformation.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            }
                        }
                        else {
                            this.status = jsonProperty.ReadEnumValue<MemberStatus>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Key", this.key);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.AddressInformation.WriteToXml(writer, XmlNamespace.Types, "Mailbox");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Key", this.key);
            jsonObject.Add("Mailbox", this.AddressInformation.InternalToJson(service));
            return jsonObject;
        }
        private AddressInformationChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
    }
    class GroupMemberCollection extends ComplexPropertyCollection<GroupMember> implements ICustomUpdateSerializer {
        private collectionIsCleared: boolean = false;
        Find(key: string): GroupMember {
            EwsUtilities.ValidateParam(key, "key");
            var enumerator: List_Enumerator<GroupMember> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: GroupMember = enumerator.Current;
                    if (current.Key === key) {
                        return current;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return null;
        }
        Clear(): void {
            super.InternalClear();
            this.collectionIsCleared = true;
        }
        Add(member: GroupMember): void {
            EwsUtilities.ValidateParam(member, "member");
            EwsUtilities.Assert(member.Key === null, "GroupMemberCollection.Add", "member.Key is not null.");
            EwsUtilities.Assert(!super.Contains(member), "GroupMemberCollection.Add", "The member is already in the collection");
            super.InternalAdd(member);
        }
        AddRange(members: IEnumerable<GroupMember>): void {
            EwsUtilities.ValidateParam(members, "members");
            var enumerator: IEnumerator<GroupMember> = members.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: GroupMember = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        AddContactGroup(contactGroupId: ItemId): void {
            this.Add(new GroupMember(contactGroupId));
        }
        AddPersonalContact(contactId: ItemId, addressToLink: string): void;
        AddPersonalContact(contactId: ItemId): void;
        AddPersonalContact(contactId: ItemId, addressToLink?: string): void {
            if (arguments.length === 2 && (contactId === null || contactId instanceof ItemId) && (addressToLink === null || addressToLink.constructor === String)) {
                this.AddPersonalContact_0(contactId, addressToLink);
                return;
            }
            this.AddPersonalContact_1(contactId);
        }
        private AddPersonalContact_0(contactId: ItemId, addressToLink: string): void {
            this.Add(new GroupMember(contactId, addressToLink));
        }
        private AddPersonalContact_1(contactId: ItemId): void {
            this.AddPersonalContact(contactId, null);
        }
        AddDirectoryUser(smtpAddress: string): void;
        AddDirectoryUser(address: string, routingType: string): void;
        AddDirectoryUser(smtpAddressOrAddress: string, routingType?: string): void {
            if (arguments.length === 1 && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String)) {
                this.AddDirectoryUser_0(smtpAddressOrAddress);
                return;
            }
            this.AddDirectoryUser_1(smtpAddressOrAddress, routingType);
        }
        private AddDirectoryUser_0(smtpAddress: string): void {
            this.AddDirectoryUser(smtpAddress, "SMTP");
        }
        private AddDirectoryUser_1(address: string, routingType: string): void {
            this.Add(new GroupMember(address, routingType, MailboxType.Mailbox));
        }
        AddDirectoryContact(smtpAddress: string): void;
        AddDirectoryContact(address: string, routingType: string): void;
        AddDirectoryContact(smtpAddressOrAddress: string, routingType?: string): void {
            if (arguments.length === 1 && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String)) {
                this.AddDirectoryContact_0(smtpAddressOrAddress);
                return;
            }
            this.AddDirectoryContact_1(smtpAddressOrAddress, routingType);
        }
        private AddDirectoryContact_0(smtpAddress: string): void {
            this.AddDirectoryContact(smtpAddress, "SMTP");
        }
        private AddDirectoryContact_1(address: string, routingType: string): void {
            this.Add(new GroupMember(address, routingType, MailboxType.Contact));
        }
        AddPublicGroup(smtpAddress: string): void {
            this.Add(new GroupMember(smtpAddress, "SMTP", MailboxType.PublicGroup));
        }
        AddDirectoryPublicFolder(smtpAddress: string): void {
            this.Add(new GroupMember(smtpAddress, "SMTP", MailboxType.PublicFolder));
        }
        AddOneOff(displayName: string, address: string, routingType: string): void;
        AddOneOff(displayName: string, smtpAddress: string): void;
        AddOneOff(displayName: string, addressOrSmtpAddress: string, routingType?: string): void {
            if (arguments.length === 3 && (displayName === null || displayName.constructor === String) && (addressOrSmtpAddress === null || addressOrSmtpAddress.constructor === String) && (routingType === null || routingType.constructor === String)) {
                this.AddOneOff_0(displayName, addressOrSmtpAddress, routingType);
                return;
            }
            this.AddOneOff_1(displayName, addressOrSmtpAddress);
        }
        private AddOneOff_0(displayName: string, address: string, routingType: string): void {
            this.Add(new GroupMember(displayName, address, routingType));
        }
        private AddOneOff_1(displayName: string, smtpAddress: string): void {
            this.AddOneOff(displayName, smtpAddress, "SMTP");
        }
        AddContactEmailAddress(contact: Contact, emailAddressKey: EmailAddressKey): void {
            this.Add(new GroupMember(contact, emailAddressKey));
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            super.InternalRemoveAt(index);
        }
        Remove(member: GroupMember): boolean {
            return super.InternalRemove(member);
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ownerObject: ServiceObject, propertyDefinition: PropertyDefinition): boolean {
            if (this.collectionIsCleared) {
                if (this.AddedItems.Count === 0) {
                    this.WriteDeleteMembersCollectionToXml(writer);
                }
                else {
                    this.WriteSetOrAppendMembersToXml(writer, this.AddedItems, true);
                }
            }
            else {
                this.WriteSetOrAppendMembersToXml(writer, this.AddedItems, false);
                this.WriteDeleteMembersToXml(writer, this.ModifiedItems);
                this.WriteSetOrAppendMembersToXml(writer, this.ModifiedItems, false);
                this.WriteDeleteMembersToXml(writer, this.RemovedItems);
            }
            return true;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            throw new NotImplementedException();
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            return false;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            return false;
        }
        CreateComplexProperty(xmlElementName: string): GroupMember {
            return new GroupMember();
        }
        CreateDefaultComplexProperty(): GroupMember {
            return new GroupMember();
        }
        ClearChangeLog(): void {
            super.ClearChangeLog();
            this.collectionIsCleared = false;
        }
        GetCollectionItemXmlElementName(member: GroupMember): string {
            return "Member";
        }
        private WriteDeleteMembersCollectionToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "DeleteItemField");
            ContactGroupSchema.Members.WriteToXml(writer);
            writer.WriteEndElement();
        }
        private WriteDeleteMembersToXml(writer: EwsServiceXmlWriter, members: List<GroupMember>): void {
            if (members.Count !== 0) {
                var groupMemberPropertyDefinition: GroupMemberPropertyDefinition = new GroupMemberPropertyDefinition();
                var enumerator: List_Enumerator<GroupMember> = members.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: GroupMember = enumerator.Current;
                        writer.WriteStartElement(XmlNamespace.Types, "DeleteItemField");
                        groupMemberPropertyDefinition.Key = current.Key;
                        groupMemberPropertyDefinition.WriteToXml(writer);
                        writer.WriteEndElement();
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
        }
        private WriteSetOrAppendMembersToXml(writer: EwsServiceXmlWriter, members: List<GroupMember>, setMode: boolean): void {
            if (members.Count !== 0) {
                writer.WriteStartElement(XmlNamespace.Types, setMode ? "SetItemField" : "AppendToItemField");
                ContactGroupSchema.Members.WriteToXml(writer);
                writer.WriteStartElement(XmlNamespace.Types, "DistributionList");
                writer.WriteStartElement(XmlNamespace.Types, "Members");
                var enumerator: List_Enumerator<GroupMember> = members.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: GroupMember = enumerator.Current;
                        current.WriteToXml(writer, "Member");
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            var enumerator: List_Enumerator<GroupMember> = this.ModifiedItems.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: GroupMember = enumerator.Current;
                    if (NString.IsNullOrEmpty(current.Key)) {
                        throw new ServiceValidationException(Strings.ContactGroupMemberCannotBeUpdatedWithoutBeingLoadedFirst);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        constructor() {
            super();
        }
    }
    class HighlightTerm extends ComplexProperty {
        private scope: string = null;
        private value: string = null;
        get Scope(): string {
            return this.scope;
        }
        get Value(): string {
            return this.value;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Scope") {
                    this.scope = reader.ReadElementValue();
                    return true;
                }
                if (localName === "Value") {
                    this.value = reader.ReadElementValue();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            if (jsonProperty.ContainsKey("Scope")) {
                this.scope = jsonProperty.ReadAsString("Scope");
            }
            if (jsonProperty.ContainsKey("Value")) {
                this.value = jsonProperty.ReadAsString("Value");
            }
        }
    }
    class ImAddressDictionary extends DictionaryProperty<ImAddressKey, ImAddressEntry>
    {
        get_Item(key: ImAddressKey): string {
            return this.Entries.get_Item(key).ImAddress;
        }
        set_Item(key: ImAddressKey, value: string): void {
            if (value === null) {
                super.InternalRemove(key);
                return;
            }
            var imAddressEntry: ImAddressEntry;
            if ((() => {
                var _p0 = [
                    imAddressEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                imAddressEntry = _p0[0];
                return _r;
            })()) {
                imAddressEntry.ImAddress = value;
                this.Changed();
                return;
            }
            imAddressEntry = new ImAddressEntry(key, value);
            super.InternalAdd(imAddressEntry);
        }
        GetFieldURI(): string {
            return "contacts:ImAddress";
        }
        CreateEntryInstance(): ImAddressEntry {
            return new ImAddressEntry();
        }
        TryGetValue(key: ImAddressKey, imAddress: string[]): boolean {
            var imAddressEntry: ImAddressEntry = null;
            if ((() => {
                var _p0 = [
                    imAddressEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                imAddressEntry = _p0[0];
                return _r;
            })()) {
                imAddress[0] = imAddressEntry.ImAddress;
                return true;
            }
            imAddress[0] = null;
            return false;
        }
        constructor() {
            super();
        }
    }
    class ImAddressEntry extends DictionaryEntryProperty<ImAddressKey>
    {
        private imAddress: string = null;
        set ImAddress(value: string) {
            (() => {
                var _p0 = [
                    this.imAddress
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.imAddress = _p0[0];
                return _r;
            })();
        }
        get ImAddress(): string {
            return this.imAddress;
        }
        constructor();
        constructor(key: ImAddressKey, imAddress: string);
        constructor(key?: ImAddressKey, imAddress?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(key, imAddress);
        }
        private constructor_0(): void {
        }
        private constructor_1(key: ImAddressKey, imAddress: string): void {
            this.imAddress = imAddress;
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.imAddress = reader.ReadValue();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteValue(this.ImAddress, "ImAddress");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Key", this.Key);
            jsonObject.Add("ImAddress", this.ImAddress);
            return jsonObject;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.Key = jsonProperty.ReadEnumValue<ImAddressKey>("Key");
            this.ImAddress = jsonProperty.ReadAsString("ImAddress");
        }
    }
    class InternetMessageHeader extends ComplexProperty {
        private name: string = null;
        private value: string = null;
        set Name(value: string) {
            (() => {
                var _p0 = [
                    this.name
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.name = _p0[0];
                return _r;
            })();
        }
        get Name(): string {
            return this.name;
        }
        set Value(value: string) {
            (() => {
                var _p0 = [
                    this.value
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.value = _p0[0];
                return _r;
            })();
        }
        get Value(): string {
            return this.value;
        }
        constructor() {
            super();
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.name = reader.ReadAttributeValue("HeaderName");
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.value = reader.ReadValue();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "HeaderName")) {
                            if (a === "Value") {
                                this.value = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.name = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("HeaderName", this.Name);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteValue(this.Value, this.Name);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("HeaderName", this.Name);
            jsonObject.Add("Value", this.Value);
            return jsonObject;
        }
        ToString(): string {
            return NString.Format("{0}={1}", this.Name, this.Value);
        }
    }
    class InternetMessageHeaderCollection extends ComplexPropertyCollection<InternetMessageHeader>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): InternetMessageHeader {
            return new InternetMessageHeader();
        }
        CreateDefaultComplexProperty(): InternetMessageHeader {
            return new InternetMessageHeader();
        }
        GetCollectionItemXmlElementName(complexProperty: InternetMessageHeader): string {
            return "InternetMessageHeader";
        }
        Find(name: string): InternetMessageHeader {
            var enumerator: IEnumerator<InternetMessageHeader> = super.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: InternetMessageHeader = enumerator.Current;
                    if (NString.Compare(name, current.Name, StringComparison.OrdinalIgnoreCase) === 0) {
                        return current;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return null;
        }
    }
    class ItemCollection<TItem> extends ComplexProperty implements IEnumerable<TItem>, IJsonCollectionDeserializer {
        private items: List<TItem> = new List<TItem>();
        get Count(): number {
            return this.items.Count;
        }
        get_Item(index: number): TItem {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.items.get_Item(index);
        }
        constructor() {
            super();
        }
        LoadFromXml(reader: EwsServiceXmlReader, localElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, localElementName);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var tItem: TItem = ((EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(reader.Service, reader.LocalName) instanceof TItem) ? <TItem>EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(reader.Service, reader.LocalName) : null);
                        if (tItem === null) {
                            reader.SkipCurrentElement();
                        }
                        else {
                            tItem.LoadFromXml(reader, true);
                            this.items.Add(tItem);
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, localElementName));
            }
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                var item: TItem = ((EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, jsonObject.ReadTypeString()) instanceof TItem) ? <TItem>EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, jsonObject.ReadTypeString()) : null);
                item.LoadFromJson(jsonObject, service, true);
                this.items.Add(item);
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        GetEnumerator(): IEnumerator<TItem> {
            return this.items.GetEnumerator();
        }
    }
    class ItemIdCollection extends ComplexPropertyCollection<ItemId>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): ItemId {
            return new ItemId();
        }
        CreateDefaultComplexProperty(): ItemId {
            return new ItemId();
        }
        GetCollectionItemXmlElementName(complexProperty: ItemId): string {
            return complexProperty.GetXmlElementName();
        }
    }
    class ConversationId extends ServiceId {
        constructor();
        constructor(uniqueId: string);
        constructor(uniqueId?: string) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(uniqueId);
            this.constructor_1(uniqueId);
        }
        private constructor_0(): void {
        }
        static op_Implicit(uniqueId: string): ConversationId {
            return new ConversationId(uniqueId);
        }
        static op_Implicit(conversationId: ConversationId): string {
            if (conversationId === null) {
                throw new ArgumentNullException("conversationId");
            }
            if (NString.IsNullOrEmpty(conversationId.UniqueId)) {
                return NString.Empty;
            }
            return conversationId.UniqueId;
        }
        GetXmlElementName(): string {
            return "ConversationId";
        }
        GetJsonTypeName(): string {
            return "ItemId";
        }
        private constructor_1(uniqueId: string): void {
        }
        ToString(): string {
            return this.UniqueId;
        }
    }
    class UniqueBody extends ComplexProperty {
        private bodyType: BodyType = 0;
        private text: string = null;
        private isTruncated: boolean = false;
        get BodyType(): BodyType {
            return this.bodyType;
        }
        get Text(): string {
            return this.text;
        }
        get IsTruncated(): boolean {
            return this.isTruncated;
        }
        constructor() {
            super();
        }
        static op_Implicit(messageBody: UniqueBody): string {
            EwsUtilities.ValidateParam(messageBody, "messageBody");
            return messageBody.Text;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.bodyType = reader.ReadAttributeValue<BodyType>("BodyType");
            var value: string = reader.ReadAttributeValue("IsTruncated");
            if (!NString.IsNullOrEmpty(value)) {
                this.isTruncated = NBoolean.Parse(value);
            }
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.text = reader.ReadValue();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "BodyType")) {
                            if (!(a === "IsTruncated")) {
                                if (a === "Value") {
                                    this.text = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.isTruncated = jsonProperty.ReadAsBool(current);
                            }
                        }
                        else {
                            this.bodyType = jsonProperty.ReadEnumValue<BodyType>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("BodyType", this.BodyType);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.Text)) {
                writer.WriteValue(this.Text, "UniqueBody");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("BodyType", this.BodyType);
            jsonObject.Add("IsTruncated", this.IsTruncated);
            if (!NString.IsNullOrEmpty(this.Text)) {
                jsonObject.Add("Value", this.Text);
            }
            return jsonObject;
        }
        ToString(): string {
            if (this.Text !== null) {
                return this.Text;
            }
            return NString.Empty;
        }
    }
    enum LobbyBypass {
        Disabled,
        EnabledForGatewayParticipants
    }
    enum OnlineMeetingAccessLevel {
        Locked,
        Invited,
        Internal,
        Everyone
    }
    enum Presenters {
        Disabled,
        Internal,
        Everyone
    }
    class OnlineMeetingSettings extends ComplexProperty {
        private lobbyBypass: LobbyBypass = 0;
        private accessLevel: OnlineMeetingAccessLevel = 0;
        private presenters: Presenters = 0;
        set LobbyBypass(value: LobbyBypass) {
            (() => {
                var _p0 = [
                    this.lobbyBypass
                ];
                var _r = this.SetFieldValue<LobbyBypass>(_p0, value);
                this.lobbyBypass = _p0[0];
                return _r;
            })();
        }
        get LobbyBypass(): LobbyBypass {
            return this.lobbyBypass;
        }
        set AccessLevel(value: OnlineMeetingAccessLevel) {
            (() => {
                var _p0 = [
                    this.accessLevel
                ];
                var _r = this.SetFieldValue<OnlineMeetingAccessLevel>(_p0, value);
                this.accessLevel = _p0[0];
                return _r;
            })();
        }
        get AccessLevel(): OnlineMeetingAccessLevel {
            return this.accessLevel;
        }
        set Presenters(value: Presenters) {
            (() => {
                var _p0 = [
                    this.presenters
                ];
                var _r = this.SetFieldValue<Presenters>(_p0, value);
                this.presenters = _p0[0];
                return _r;
            })();
        }
        get Presenters(): Presenters {
            return this.presenters;
        }
        constructor();
        constructor(lobbyBypass: LobbyBypass, accessLevel: OnlineMeetingAccessLevel, presenters: Presenters);
        constructor(onlineMeetingSettings: OnlineMeetingSettings);
        constructor(lobbyBypassOrOnlineMeetingSettings?: any, accessLevel?: OnlineMeetingAccessLevel, presenters?: Presenters) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 3 && (lobbyBypassOrOnlineMeetingSettings === null || lobbyBypassOrOnlineMeetingSettings.constructor === Number) && (accessLevel === null || accessLevel.constructor === Number) && (presenters === null || presenters.constructor === Number)) {
                this.constructor_1(lobbyBypassOrOnlineMeetingSettings, accessLevel, presenters);
                return;
            }
            this.constructor_2(lobbyBypassOrOnlineMeetingSettings);
        }
        private constructor_0(): void {
        }
        private constructor_1(lobbyBypass: LobbyBypass, accessLevel: OnlineMeetingAccessLevel, presenters: Presenters): void {
            this.lobbyBypass = lobbyBypass;
            this.accessLevel = accessLevel;
            this.presenters = presenters;
        }
        private constructor_2(onlineMeetingSettings: OnlineMeetingSettings): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(onlineMeetingSettings, "OnlineMeetingSettings");
            this.LobbyBypass = onlineMeetingSettings.LobbyBypass;
            this.AccessLevel = onlineMeetingSettings.AccessLevel;
            this.Presenters = onlineMeetingSettings.Presenters;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "LobbyBypass") {
                    this.lobbyBypass = reader.ReadElementValue<LobbyBypass>();
                    return true;
                }
                if (localName === "AccessLevel") {
                    this.accessLevel = reader.ReadElementValue<OnlineMeetingAccessLevel>();
                    return true;
                }
                if (localName === "Presenters") {
                    this.presenters = reader.ReadElementValue<Presenters>();
                    return true;
                }
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "LobbyBypass", this.LobbyBypass);
            writer.WriteElementValue(XmlNamespace.Types, "AccessLevel", this.AccessLevel);
            writer.WriteElementValue(XmlNamespace.Types, "Presenters", this.Presenters);
        }
    }
    class Mailbox extends ComplexProperty implements ISearchStringProvider {
        get IsValid(): boolean {
            return !NString.IsNullOrEmpty(this.Address);
        }
        Address: string = null;
        RoutingType: string = null;
        constructor();
        constructor(smtpAddress: string);
        constructor(address: string, routingType: string);
        constructor(smtpAddressOrAddress?: string, routingType?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (smtpAddressOrAddress === null || smtpAddressOrAddress.constructor === String)) {
                this.constructor_1(smtpAddressOrAddress);
                return;
            }
            this.constructor_2(smtpAddressOrAddress, routingType);
        }
        private constructor_0(): void {
        }
        private constructor_1(smtpAddress: string): void {
            this.constructor_0();
            this.Address = smtpAddress;
        }
        private constructor_2(address: string, routingType: string): void {
            this.constructor_1(address);
            this.RoutingType = routingType;
        }
        static op_Implicit(smtpAddress: string): Mailbox {
            return new Mailbox(smtpAddress);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "EmailAddress") {
                    this.Address = reader.ReadElementValue();
                    return true;
                }
                if (localName === "RoutingType") {
                    this.RoutingType = reader.ReadElementValue();
                    return true;
                }
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "EmailAddress", this.Address);
            writer.WriteElementValue(XmlNamespace.Types, "RoutingType", this.RoutingType);
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            if (jsonProperty.ContainsKey("EmailAddress")) {
                this.Address = jsonProperty.ReadAsString("EmailAddress");
            }
            if (jsonProperty.ContainsKey("RoutingType")) {
                this.RoutingType = jsonProperty.ReadAsString("RoutingType");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("EmailAddress", this.Address);
            jsonObject.Add("RoutingType", this.RoutingType);
            return jsonObject;
        }
        GetSearchString(): string {
            return this.Address;
        }
        InternalValidate(): void {
            super.InternalValidate();
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.Address, "address");
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.RoutingType, "routingType");
        }
        Equals(obj: any): boolean {
            if (NObject.ReferenceEquals(this, obj)) {
                return true;
            }
            var mailbox: Mailbox = ((obj instanceof Mailbox) ? <Mailbox>obj : null);
            return mailbox !== null && ((this.Address === null && mailbox.Address === null) || (this.Address !== null && this.Address === mailbox.Address)) && ((this.RoutingType === null && mailbox.RoutingType === null) || (this.RoutingType !== null && this.RoutingType === mailbox.RoutingType));
        }
        GetHashCode(): number {
            if (!NString.IsNullOrEmpty(this.Address)) {
                var num: number = NString.GetHashCode(this.Address);
                if (!NString.IsNullOrEmpty(this.RoutingType)) {
                    num = (num ^ NString.GetHashCode(this.RoutingType));
                }
                return num;
            }
            return super.GetHashCode();
        }
        ToString(): string {
            if (!this.IsValid) {
                return NString.Empty;
            }
            if (!NString.IsNullOrEmpty(this.RoutingType)) {
                return this.RoutingType + ":" + this.Address;
            }
            return this.Address;
        }
    }
    class ManagedFolderInformation extends ComplexProperty {
        private canDelete: Nullable<boolean> = null;
        private canRenameOrMove: Nullable<boolean> = null;
        private mustDisplayComment: Nullable<boolean> = null;
        private hasQuota: Nullable<boolean> = null;
        private isManagedFoldersRoot: Nullable<boolean> = null;
        private managedFolderId: string = null;
        private comment: string = null;
        private storageQuota: Nullable<number> = null;
        private folderSize: Nullable<number> = null;
        private homePage: string = null;
        get CanDelete(): Nullable<boolean> {
            return this.canDelete;
        }
        get CanRenameOrMove(): Nullable<boolean> {
            return this.canRenameOrMove;
        }
        get MustDisplayComment(): Nullable<boolean> {
            return this.mustDisplayComment;
        }
        get HasQuota(): Nullable<boolean> {
            return this.hasQuota;
        }
        get IsManagedFoldersRoot(): Nullable<boolean> {
            return this.isManagedFoldersRoot;
        }
        get ManagedFolderId(): string {
            return this.managedFolderId;
        }
        get Comment(): string {
            return this.comment;
        }
        get StorageQuota(): Nullable<number> {
            return this.storageQuota;
        }
        get FolderSize(): Nullable<number> {
            return this.folderSize;
        }
        get HomePage(): string {
            return this.homePage;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "CanDelete":
                    this.canDelete = new Nullable<boolean>(reader.ReadValue<boolean>());
                    return true;
                case "CanRenameOrMove":
                    this.canRenameOrMove = new Nullable<boolean>(reader.ReadValue<boolean>());
                    return true;
                case "MustDisplayComment":
                    this.mustDisplayComment = new Nullable<boolean>(reader.ReadValue<boolean>());
                    return true;
                case "HasQuota":
                    this.hasQuota = new Nullable<boolean>(reader.ReadValue<boolean>());
                    return true;
                case "IsManagedFoldersRoot":
                    this.isManagedFoldersRoot = new Nullable<boolean>(reader.ReadValue<boolean>());
                    return true;
                case "ManagedFolderId":
                    this.managedFolderId = reader.ReadValue();
                    return true;
                case "Comment":
                    (() => {
                        var _p0 = [
                            this.comment
                        ];
                        var _r = reader.TryReadValue(_p0);
                        this.comment = _p0[0];
                        return _r;
                    })();
                    return true;
                case "StorageQuota":
                    this.storageQuota = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "FolderSize":
                    this.folderSize = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "HomePage":
                    (() => {
                        var _p0 = [
                            this.homePage
                        ];
                        var _r = reader.TryReadValue(_p0);
                        this.homePage = _p0[0];
                        return _r;
                    })();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "CanDelete":
                            this.canDelete = new Nullable<boolean>(jsonProperty.ReadAsBool(current));
                            break;
                        case "CanRenameOrMove":
                            this.canRenameOrMove = new Nullable<boolean>(jsonProperty.ReadAsBool(current));
                            break;
                        case "MustDisplayComment":
                            this.mustDisplayComment = new Nullable<boolean>(jsonProperty.ReadAsBool(current));
                            break;
                        case "HasQuota":
                            this.hasQuota = new Nullable<boolean>(jsonProperty.ReadAsBool(current));
                            break;
                        case "IsManagedFoldersRoot":
                            this.isManagedFoldersRoot = new Nullable<boolean>(jsonProperty.ReadAsBool(current));
                            break;
                        case "ManagedFolderId":
                            this.managedFolderId = jsonProperty.ReadAsString(current);
                            break;
                        case "Comment":
                            {
                                var text: string = jsonProperty.ReadAsString(current);
                                if (text !== null) {
                                    this.comment = text;
                                }
                                break;
                            }
                        case "StorageQuota":
                            this.storageQuota = new Nullable<number>(jsonProperty.ReadAsInt(current));
                            break;
                        case "FolderSize":
                            this.folderSize = new Nullable<number>(jsonProperty.ReadAsInt(current));
                            break;
                        case "HomePage":
                            {
                                var text2: string = jsonProperty.ReadAsString(current);
                                if (text2 !== null) {
                                    this.homePage = text2;
                                }
                                break;
                            }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class MeetingSuggestion extends ExtractedEntity {
        Attendees: EmailUserEntityCollection = null;
        Location: string = null;
        Subject: string = null;
        MeetingString: string = null;
        StartTime: Nullable<DateTime> = null;
        EndTime: Nullable<DateTime> = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Attendees":
                    this.Attendees = new EmailUserEntityCollection();
                    this.Attendees.LoadFromXml(reader, XmlNamespace.Types, "Attendees");
                    return true;
                case "Location":
                    this.Location = reader.ReadElementValue();
                    return true;
                case "Subject":
                    this.Subject = reader.ReadElementValue();
                    return true;
                case "MeetingString":
                    this.MeetingString = reader.ReadElementValue();
                    return true;
                case "StartTime":
                    this.StartTime = reader.ReadElementValueAsDateTime();
                    return true;
                case "EndTime":
                    this.EndTime = reader.ReadElementValueAsDateTime();
                    return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class MeetingSuggestionCollection extends ComplexPropertyCollection<MeetingSuggestion>
    {
        constructor();
        constructor(collection: IEnumerable<MeetingSuggestion>);
        constructor(collection?: IEnumerable<MeetingSuggestion>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<MeetingSuggestion>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<MeetingSuggestion>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): MeetingSuggestion {
            return new MeetingSuggestion();
        }
        CreateDefaultComplexProperty(): MeetingSuggestion {
            return new MeetingSuggestion();
        }
        GetCollectionItemXmlElementName(complexProperty: MeetingSuggestion): string {
            return "MeetingSuggestion";
        }
    }
    class MeetingTimeZone extends ComplexProperty {
        private name: string = null;
        private baseOffset: Nullable<TimeSpan> = null;
        private standard: TimeChange = null;
        private daylight: TimeChange = null;
        set Name(value: string) {
            (() => {
                var _p0 = [
                    this.name
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.name = _p0[0];
                return _r;
            })();
        }
        get Name(): string {
            return this.name;
        }
        set BaseOffset(value: Nullable<TimeSpan>) {
            (() => {
                var _p0 = [
                    this.baseOffset
                ];
                var _r = this.SetFieldValue<Nullable<TimeSpan>>(_p0, value);
                this.baseOffset = _p0[0];
                return _r;
            })();
        }
        get BaseOffset(): Nullable<TimeSpan> {
            return this.baseOffset;
        }
        set Standard(value: TimeChange) {
            (() => {
                var _p0 = [
                    this.standard
                ];
                var _r = this.SetFieldValue<TimeChange>(_p0, value);
                this.standard = _p0[0];
                return _r;
            })();
        }
        get Standard(): TimeChange {
            return this.standard;
        }
        set Daylight(value: TimeChange) {
            (() => {
                var _p0 = [
                    this.daylight
                ];
                var _r = this.SetFieldValue<TimeChange>(_p0, value);
                this.daylight = _p0[0];
                return _r;
            })();
        }
        get Daylight(): TimeChange {
            return this.daylight;
        }
        constructor(timeZone: TimeZoneInfo);
        constructor();
        constructor(name: string);
        constructor(timeZoneOrName?: any) {
            super();
            if (arguments.length === 1 && (timeZoneOrName === null || timeZoneOrName instanceof TimeZoneInfo)) {
                this.constructor_0(timeZoneOrName);
                return;
            }
            if (arguments.length === 0) {
                this.constructor_1();
                return;
            }
            this.constructor_2(timeZoneOrName);
        }
        private constructor_0(timeZone: TimeZoneInfo): void {
            this.Name = timeZone.Id;
        }
        private constructor_1(): void {
        }
        private constructor_2(name: string): void {
            this.constructor_1();
            this.name = name;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "BaseOffset") {
                    this.baseOffset = new Nullable<TimeSpan>(EwsUtilities.XSDurationToTimeSpan(reader.ReadElementValue()));
                    return true;
                }
                if (localName === "Standard") {
                    this.standard = new TimeChange();
                    this.standard.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "Daylight") {
                    this.daylight = new TimeChange();
                    this.daylight.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.name = reader.ReadAttributeValue("TimeZoneName");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "BaseOffset")) {
                            if (!(a === "Standard")) {
                                if (!(a === "Daylight")) {
                                    if (a === "TimeZoneName") {
                                        this.name = jsonProperty.ReadAsString(current);
                                    }
                                }
                                else {
                                    this.daylight = new TimeChange();
                                    this.daylight.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                }
                            }
                            else {
                                this.standard = new TimeChange();
                                this.standard.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            }
                        }
                        else {
                            this.baseOffset = new Nullable<TimeSpan>(EwsUtilities.XSDurationToTimeSpan(jsonProperty.ReadAsString(current)));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("TimeZoneName", this.Name);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.BaseOffset !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "BaseOffset", EwsUtilities.TimeSpanToXSDuration(this.BaseOffset.Value));
            }
            if (this.Standard !== null) {
                this.Standard.WriteToXml(writer, "Standard");
            }
            if (this.Daylight !== null) {
                this.Daylight.WriteToXml(writer, "Daylight");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.BaseOffset !== null) {
                jsonObject.Add("BaseOffset", EwsUtilities.TimeSpanToXSDuration(this.BaseOffset.Value));
            }
            if (this.Standard !== null) {
                jsonObject.Add("Standard", this.Standard.InternalToJson(service));
            }
            if (this.Daylight !== null) {
                jsonObject.Add("Daylight", this.Daylight.InternalToJson(service));
            }
            jsonObject.Add("TimeZoneName", this.Name);
            return jsonObject;
        }
        ToTimeZoneInfo(): TimeZoneInfo {
            if (NString.IsNullOrEmpty(this.Name)) {
                return null;
            }
            var result: TimeZoneInfo = null;
            try {
                result = TimeZoneInfo.FindSystemTimeZoneById(this.Name);
            }
            catch (ex_1F) {
                if (ex_1F instanceof TimeZoneNotFoundException) {
                }
                else
                    throw ex_1F;
            }
            return result;
        }
    }
    class MessageBody extends ComplexProperty {
        private bodyType: BodyType = 0;
        private text: string = null;
        set BodyType(value: BodyType) {
            (() => {
                var _p0 = [
                    this.bodyType
                ];
                var _r = this.SetFieldValue<BodyType>(_p0, value);
                this.bodyType = _p0[0];
                return _r;
            })();
        }
        get BodyType(): BodyType {
            return this.bodyType;
        }
        set Text(value: string) {
            (() => {
                var _p0 = [
                    this.text
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.text = _p0[0];
                return _r;
            })();
        }
        get Text(): string {
            return this.text;
        }
        constructor();
        constructor(bodyType: BodyType, text: string);
        constructor(text: string);
        constructor(bodyTypeOrText?: any, text?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (bodyTypeOrText === null || bodyTypeOrText.constructor === Number) && (text === null || text.constructor === String)) {
                this.constructor_1(bodyTypeOrText, text);
                return;
            }
            this.constructor_2(bodyTypeOrText);
        }
        private constructor_0(): void {
        }
        private constructor_1(bodyType: BodyType, text: string): void {
            this.constructor_0();
            this.bodyType = bodyType;
            this.text = text;
        }
        private constructor_2(text: string): void {
            this.constructor_1(BodyType.HTML, text);
        }
        static op_Implicit(textBody: string): MessageBody {
            return new MessageBody(BodyType.HTML, textBody);
        }
        static op_Implicit(messageBody: MessageBody): string {
            EwsUtilities.ValidateParam(messageBody, "messageBody");
            return messageBody.Text;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.bodyType = reader.ReadAttributeValue<BodyType>("BodyType");
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.text = reader.ReadValue();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "BodyType")) {
                            if (a === "Value") {
                                this.text = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.bodyType = jsonProperty.ReadEnumValue<BodyType>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("BodyType", this.BodyType);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.Text)) {
                writer.WriteValue(this.Text, "Body");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("BodyType", this.BodyType);
            if (!NString.IsNullOrEmpty(this.Text)) {
                jsonObject.Add("Value", this.Text);
            }
            return jsonObject;
        }
        ToString(): string {
            if (this.Text !== null) {
                return this.Text;
            }
            return NString.Empty;
        }
    }
    class MimeContent extends ComplexProperty {
        private characterSet: string = null;
        private content: number[] = null;
        set CharacterSet(value: string) {
            (() => {
                var _p0 = [
                    this.characterSet
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.characterSet = _p0[0];
                return _r;
            })();
        }
        get CharacterSet(): string {
            return this.characterSet;
        }
        set Content(value: number[]) {
            (() => {
                var _p0 = [
                    this.content
                ];
                var _r = this.SetFieldValue<number[]>(_p0, value);
                this.content = _p0[0];
                return _r;
            })();
        }
        get Content(): number[] {
            return this.content;
        }
        constructor();
        constructor(characterSet: string, content: number[]);
        constructor(characterSet?: string, content?: number[]) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(characterSet, content);
        }
        private constructor_0(): void {
        }
        private constructor_1(characterSet: string, content: number[]): void {
            this.constructor_0();
            this.characterSet = characterSet;
            this.content = content;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.characterSet = reader.ReadAttributeValue<string>("CharacterSet");
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.content = Convert.FromBase64String(reader.ReadValue());
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "CharacterSet")) {
                            if (a === "Value") {
                                this.content = jsonProperty.ReadAsBase64Content(current);
                            }
                        }
                        else {
                            this.characterSet = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("CharacterSet", this.CharacterSet);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.Content !== null && this.Content.length > 0) {
                writer.WriteBase64ElementValue(this.Content);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ChangeKey", this.CharacterSet);
            if (this.Content !== null && this.Content.length > 0) {
                jsonObject.AddBase64("Value", this.Content);
            }
            return jsonObject;
        }
        ToString(): string {
            if (this.Content === null) {
                return NString.Empty;
            }
            var result: string;
            try {
                var name: string = NString.IsNullOrEmpty(this.CharacterSet) ? Encoding.UTF8.EncodingName : this.CharacterSet;
                var encoding: Encoding = Encoding.GetEncoding(name);
                result = encoding.GetString(this.Content);
            }
            catch (ex_44) {
                if (ex_44 instanceof ArgumentException) {
                    result = Convert.ToBase64String(this.Content);
                }
                else
                    throw ex_44;
            }
            return result;
        }
    }
    class NormalizedBody extends ComplexProperty {
        private bodyType: BodyType = 0;
        private text: string = null;
        private isTruncated: boolean = false;
        set BodyType(value: BodyType) {
            this.bodyType = value;
        }
        get BodyType(): BodyType {
            return this.bodyType;
        }
        set Text(value: string) {
            this.text = value;
        }
        get Text(): string {
            return this.text;
        }
        set IsTruncated(value: boolean) {
            this.isTruncated = value;
        }
        get IsTruncated(): boolean {
            return this.isTruncated;
        }
        constructor() {
            super();
        }
        static op_Implicit(messageBody: NormalizedBody): string {
            EwsUtilities.ValidateParam(messageBody, "messageBody");
            return messageBody.Text;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.bodyType = reader.ReadAttributeValue<BodyType>("BodyType");
            var value: string = reader.ReadAttributeValue("IsTruncated");
            if (!NString.IsNullOrEmpty(value)) {
                this.isTruncated = NBoolean.Parse(value);
            }
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.text = reader.ReadValue();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "BodyType")) {
                            if (!(a === "IsTruncated")) {
                                if (a === "Value") {
                                    this.text = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.isTruncated = jsonProperty.ReadAsBool(current);
                            }
                        }
                        else {
                            this.bodyType = jsonProperty.ReadEnumValue<BodyType>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("BodyType", this.BodyType);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.Text)) {
                writer.WriteValue(this.Text, "NormalizedBody");
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("BodyType", this.BodyType);
            jsonObject.Add("IsTruncated", this.IsTruncated);
            if (!NString.IsNullOrEmpty(this.Text)) {
                jsonObject.Add("Value", this.Text);
            }
            return jsonObject;
        }
        ToString(): string {
            if (this.Text !== null) {
                return this.Text;
            }
            return NString.Empty;
        }
    }
    class OccurrenceInfo extends ComplexProperty {
        private itemId: ItemId = null;
        private start: DateTime = null;
        private end: DateTime = null;
        private originalStart: DateTime = null;
        get ItemId(): ItemId {
            return this.itemId;
        }
        get Start(): DateTime {
            return this.start;
        }
        get End(): DateTime {
            return this.end;
        }
        get OriginalStart(): DateTime {
            return this.originalStart;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "ItemId") {
                    this.itemId = new ItemId();
                    this.itemId.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "Start") {
                    this.start = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
                if (localName === "End") {
                    this.end = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
                if (localName === "OriginalStart") {
                    this.originalStart = reader.ReadElementValueAsDateTime().Value;
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "ItemId")) {
                            if (!(a === "Start")) {
                                if (!(a === "End")) {
                                    if (a === "OriginalStart") {
                                        this.originalStart = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                                    }
                                }
                                else {
                                    this.end = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                                }
                            }
                            else {
                                this.start = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current)).Value;
                            }
                        }
                        else {
                            this.itemId = new ItemId();
                            this.itemId.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class OccurrenceInfoCollection extends ComplexPropertyCollection<OccurrenceInfo>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): OccurrenceInfo {
            if (xmlElementName === "Occurrence") {
                return new OccurrenceInfo();
            }
            return null;
        }
        CreateDefaultComplexProperty(): OccurrenceInfo {
            return new OccurrenceInfo();
        }
        GetCollectionItemXmlElementName(complexProperty: OccurrenceInfo): string {
            return "Occurrence";
        }
    }
    class PersonaPostalAddress extends ComplexProperty {
        private street: string = null;
        private city: string = null;
        private state: string = null;
        private country: string = null;
        private postalCode: string = null;
        private postOfficeBox: string = null;
        private type: string = null;
        private latitude: Nullable<number> = null;
        private longitude: Nullable<number> = null;
        private accuracy: Nullable<number> = null;
        private altitude: Nullable<number> = null;
        private altitudeAccuracy: Nullable<number> = null;
        private formattedAddress: string = null;
        private uri: string = null;
        private source: LocationSource = 0;
        set Street(value: string) {
            (() => {
                var _p0 = [
                    this.street
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.street = _p0[0];
                return _r;
            })();
        }
        get Street(): string {
            return this.street;
        }
        set City(value: string) {
            (() => {
                var _p0 = [
                    this.city
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.city = _p0[0];
                return _r;
            })();
        }
        get City(): string {
            return this.city;
        }
        set State(value: string) {
            (() => {
                var _p0 = [
                    this.state
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.state = _p0[0];
                return _r;
            })();
        }
        get State(): string {
            return this.state;
        }
        set Country(value: string) {
            (() => {
                var _p0 = [
                    this.country
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.country = _p0[0];
                return _r;
            })();
        }
        get Country(): string {
            return this.country;
        }
        set PostalCode(value: string) {
            (() => {
                var _p0 = [
                    this.postalCode
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.postalCode = _p0[0];
                return _r;
            })();
        }
        get PostalCode(): string {
            return this.postalCode;
        }
        set PostOfficeBox(value: string) {
            (() => {
                var _p0 = [
                    this.postOfficeBox
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.postOfficeBox = _p0[0];
                return _r;
            })();
        }
        get PostOfficeBox(): string {
            return this.postOfficeBox;
        }
        set Type(value: string) {
            (() => {
                var _p0 = [
                    this.type
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.type = _p0[0];
                return _r;
            })();
        }
        get Type(): string {
            return this.type;
        }
        set Source(value: LocationSource) {
            (() => {
                var _p0 = [
                    this.source
                ];
                var _r = this.SetFieldValue<LocationSource>(_p0, value);
                this.source = _p0[0];
                return _r;
            })();
        }
        get Source(): LocationSource {
            return this.source;
        }
        set Uri(value: string) {
            (() => {
                var _p0 = [
                    this.uri
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.uri = _p0[0];
                return _r;
            })();
        }
        get Uri(): string {
            return this.uri;
        }
        set Latitude(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.latitude
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.latitude = _p0[0];
                return _r;
            })();
        }
        get Latitude(): Nullable<number> {
            return this.latitude;
        }
        set Longitude(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.longitude
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.longitude = _p0[0];
                return _r;
            })();
        }
        get Longitude(): Nullable<number> {
            return this.longitude;
        }
        set Accuracy(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.accuracy
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.accuracy = _p0[0];
                return _r;
            })();
        }
        get Accuracy(): Nullable<number> {
            return this.accuracy;
        }
        set Altitude(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.altitude
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.altitude = _p0[0];
                return _r;
            })();
        }
        get Altitude(): Nullable<number> {
            return this.altitude;
        }
        set AltitudeAccuracy(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.altitudeAccuracy
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.altitudeAccuracy = _p0[0];
                return _r;
            })();
        }
        get AltitudeAccuracy(): Nullable<number> {
            return this.altitudeAccuracy;
        }
        set FormattedAddress(value: string) {
            (() => {
                var _p0 = [
                    this.formattedAddress
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.formattedAddress = _p0[0];
                return _r;
            })();
        }
        get FormattedAddress(): string {
            return this.formattedAddress;
        }
        constructor();
        constructor(street: string, city: string, state: string, country: string, postalCode: string, postOfficeBox: string, locationSource: LocationSource, locationUri: string, formattedAddress: string, latitude: number, longitude: number, accuracy: number, altitude: number, altitudeAccuracy: number);
        constructor(street?: string, city?: string, state?: string, country?: string, postalCode?: string, postOfficeBox?: string, locationSource?: LocationSource, locationUri?: string, formattedAddress?: string, latitude?: number, longitude?: number, accuracy?: number, altitude?: number, altitudeAccuracy?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(street, city, state, country, postalCode, postOfficeBox, locationSource, locationUri, formattedAddress, latitude, longitude, accuracy, altitude, altitudeAccuracy);
        }
        private constructor_0(): void {
        }
        private constructor_1(street: string, city: string, state: string, country: string, postalCode: string, postOfficeBox: string, locationSource: LocationSource, locationUri: string, formattedAddress: string, latitude: number, longitude: number, accuracy: number, altitude: number, altitudeAccuracy: number): void {
            this.constructor_0();
            this.street = street;
            this.city = city;
            this.state = state;
            this.country = country;
            this.postalCode = postalCode;
            this.postOfficeBox = postOfficeBox;
            this.latitude = new Nullable<number>(latitude);
            this.longitude = new Nullable<number>(longitude);
            this.source = locationSource;
            this.uri = locationUri;
            this.formattedAddress = formattedAddress;
            this.accuracy = new Nullable<number>(accuracy);
            this.altitude = new Nullable<number>(altitude);
            this.altitudeAccuracy = new Nullable<number>(altitudeAccuracy);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Street":
                    this.street = reader.ReadValue<string>();
                    return true;
                case "City":
                    this.city = reader.ReadValue<string>();
                    return true;
                case "State":
                    this.state = reader.ReadValue<string>();
                    return true;
                case "Country":
                    this.country = reader.ReadValue<string>();
                    return true;
                case "PostalCode":
                    this.postalCode = reader.ReadValue<string>();
                    return true;
                case "PostOfficeBox":
                    this.postOfficeBox = reader.ReadValue<string>();
                    return true;
                case "Type":
                    this.type = reader.ReadValue<string>();
                    return true;
                case "Latitude":
                    this.latitude = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "Longitude":
                    this.longitude = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "Accuracy":
                    this.accuracy = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "Altitude":
                    this.altitude = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "AltitudeAccuracy":
                    this.altitudeAccuracy = new Nullable<number>(reader.ReadValue<number>());
                    return true;
                case "FormattedAddress":
                    this.formattedAddress = reader.ReadValue<string>();
                    return true;
                case "LocationUri":
                    this.uri = reader.ReadValue<string>();
                    return true;
                case "LocationSource":
                    this.source = reader.ReadValue<LocationSource>();
                    return true;
            }
            return false;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            do {
                reader.Read();
                if (reader.NodeType === 1) {
                    this.TryReadElementFromXml(reader);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "PostalAddress"));
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "Street":
                            this.street = jsonProperty.ReadAsString(current);
                            break;
                        case "City":
                            this.city = jsonProperty.ReadAsString(current);
                            break;
                        case "Country":
                            this.country = jsonProperty.ReadAsString(current);
                            break;
                        case "PostalCode":
                            this.postalCode = jsonProperty.ReadAsString(current);
                            break;
                        case "PostOfficeBox":
                            this.postOfficeBox = jsonProperty.ReadAsString(current);
                            break;
                        case "Type":
                            this.type = jsonProperty.ReadAsString(current);
                            break;
                        case "Latitude":
                            this.latitude = new Nullable<number>(jsonProperty.ReadAsDouble(current));
                            break;
                        case "Longitude":
                            this.longitude = new Nullable<number>(jsonProperty.ReadAsDouble(current));
                            break;
                        case "Accuracy":
                            this.accuracy = new Nullable<number>(jsonProperty.ReadAsDouble(current));
                            break;
                        case "Altitude":
                            this.altitude = new Nullable<number>(jsonProperty.ReadAsDouble(current));
                            break;
                        case "AltitudeAccuracy":
                            this.altitudeAccuracy = new Nullable<number>(jsonProperty.ReadAsDouble(current));
                            break;
                        case "FormattedAddress":
                            this.formattedAddress = jsonProperty.ReadAsString(current);
                            break;
                        case "LocationUri":
                            this.uri = jsonProperty.ReadAsString(current);
                            break;
                        case "LocationSource":
                            this.source = jsonProperty.ReadEnumValue<LocationSource>(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Street", this.street);
            writer.WriteElementValue(XmlNamespace.Types, "City", this.city);
            writer.WriteElementValue(XmlNamespace.Types, "State", this.state);
            writer.WriteElementValue(XmlNamespace.Types, "Country", this.country);
            writer.WriteElementValue(XmlNamespace.Types, "PostalCode", this.postalCode);
            writer.WriteElementValue(XmlNamespace.Types, "PostOfficeBox", this.postOfficeBox);
            writer.WriteElementValue(XmlNamespace.Types, "Type", this.type);
            writer.WriteElementValue(XmlNamespace.Types, "Latitude", this.latitude);
            writer.WriteElementValue(XmlNamespace.Types, "Longitude", this.longitude);
            writer.WriteElementValue(XmlNamespace.Types, "Accuracy", this.accuracy);
            writer.WriteElementValue(XmlNamespace.Types, "Altitude", this.altitude);
            writer.WriteElementValue(XmlNamespace.Types, "AltitudeAccuracy", this.altitudeAccuracy);
            writer.WriteElementValue(XmlNamespace.Types, "FormattedAddress", this.formattedAddress);
            writer.WriteElementValue(XmlNamespace.Types, "LocationUri", this.uri);
            writer.WriteElementValue(XmlNamespace.Types, "LocationSource", this.source);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Street", this.street);
            jsonObject.Add("City", this.city);
            jsonObject.Add("Country", this.country);
            jsonObject.Add("PostalCode", this.postalCode);
            jsonObject.Add("PostOfficeBox", this.postOfficeBox);
            jsonObject.Add("Type", this.type);
            jsonObject.Add("Latitude", this.latitude);
            jsonObject.Add("Longitude", this.longitude);
            jsonObject.Add("Accuracy", this.accuracy);
            jsonObject.Add("Altitude", this.altitude);
            jsonObject.Add("AltitudeAccuracy", this.altitudeAccuracy);
            jsonObject.Add("FormattedAddress", this.formattedAddress);
            jsonObject.Add("LocationUri", this.uri);
            jsonObject.Add("LocationSource", this.source);
            return jsonObject;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "PostalAddress");
            this.WriteElementsToXml(writer);
            writer.WriteEndElement();
        }
    }
    class PhoneEntity extends ExtractedEntity {
        OriginalPhoneString: string = null;
        PhoneString: string = null;
        Type: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "OriginalPhoneString") {
                    this.OriginalPhoneString = reader.ReadElementValue();
                    return true;
                }
                if (localName === "PhoneString") {
                    this.PhoneString = reader.ReadElementValue();
                    return true;
                }
                if (localName === "Type") {
                    this.Type = reader.ReadElementValue();
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class PhoneEntityCollection extends ComplexPropertyCollection<PhoneEntity>
    {
        constructor();
        constructor(collection: IEnumerable<PhoneEntity>);
        constructor(collection?: IEnumerable<PhoneEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<PhoneEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<PhoneEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): PhoneEntity {
            return new PhoneEntity();
        }
        CreateDefaultComplexProperty(): PhoneEntity {
            return new PhoneEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: PhoneEntity): string {
            return "Phone";
        }
    }
    class PhoneNumberDictionary extends DictionaryProperty<PhoneNumberKey, PhoneNumberEntry>
    {
        get_Item(key: PhoneNumberKey): string {
            return this.Entries.get_Item(key).PhoneNumber;
        }
        set_Item(key: PhoneNumberKey, value: string): void {
            if (value === null) {
                super.InternalRemove(key);
                return;
            }
            var phoneNumberEntry: PhoneNumberEntry;
            if ((() => {
                var _p0 = [
                    phoneNumberEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                phoneNumberEntry = _p0[0];
                return _r;
            })()) {
                phoneNumberEntry.PhoneNumber = value;
                this.Changed();
                return;
            }
            phoneNumberEntry = new PhoneNumberEntry(key, value);
            super.InternalAdd(phoneNumberEntry);
        }
        GetFieldURI(): string {
            return "contacts:PhoneNumber";
        }
        CreateEntryInstance(): PhoneNumberEntry {
            return new PhoneNumberEntry();
        }
        TryGetValue(key: PhoneNumberKey, phoneNumber: string[]): boolean {
            var phoneNumberEntry: PhoneNumberEntry = null;
            if ((() => {
                var _p0 = [
                    phoneNumberEntry
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                phoneNumberEntry = _p0[0];
                return _r;
            })()) {
                phoneNumber[0] = phoneNumberEntry.PhoneNumber;
                return true;
            }
            phoneNumber[0] = null;
            return false;
        }
        constructor() {
            super();
        }
    }
    class PhoneNumberEntry extends DictionaryEntryProperty<PhoneNumberKey>
    {
        private phoneNumber: string = null;
        set PhoneNumber(value: string) {
            (() => {
                var _p0 = [
                    this.phoneNumber
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.phoneNumber = _p0[0];
                return _r;
            })();
        }
        get PhoneNumber(): string {
            return this.phoneNumber;
        }
        constructor();
        constructor(key: PhoneNumberKey, phoneNumber: string);
        constructor(key?: PhoneNumberKey, phoneNumber?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(key, phoneNumber);
        }
        private constructor_0(): void {
        }
        private constructor_1(key: PhoneNumberKey, phoneNumber: string): void {
            this.phoneNumber = phoneNumber;
        }
        ReadTextValueFromXml(reader: EwsServiceXmlReader): void {
            this.phoneNumber = reader.ReadValue();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteValue(this.PhoneNumber, "PhoneNumber");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Key", this.Key);
            jsonObject.Add("PhoneNumber", this.PhoneNumber);
            return jsonObject;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.Key = jsonProperty.ReadEnumValue<PhoneNumberKey>("Key");
            this.PhoneNumber = jsonProperty.ReadAsString("PhoneNumber");
        }
    }
    class PhysicalAddressDictionary extends DictionaryProperty<PhysicalAddressKey, PhysicalAddressEntry>
    {
        get_Item(key: PhysicalAddressKey): PhysicalAddressEntry {
            return this.Entries.get_Item(key);
        }
        set_Item(key: PhysicalAddressKey, value: PhysicalAddressEntry): void {
            if (value === null) {
                super.InternalRemove(key);
                return;
            }
            value.Key = key;
            super.InternalAddOrReplace(value);
        }
        CreateEntryInstance(): PhysicalAddressEntry {
            return new PhysicalAddressEntry();
        }
        TryGetValue(key: PhysicalAddressKey, physicalAddress: PhysicalAddressEntry[]): boolean {
            return (() => {
                var _p0 = [
                    physicalAddress[0]
                ];
                var _r = this.Entries.TryGetValue(key, _p0);
                physicalAddress[0] = _p0[0];
                return _r;
            })();
        }
        constructor() {
            super();
        }
    }
    class PhysicalAddressEntry extends DictionaryEntryProperty<PhysicalAddressKey>
    {
        propertyBag: SimplePropertyBag<string> = null;
        set Street(value: string) {
            this.propertyBag.set_Item("Street", value);
        }
        get Street(): string {
            return <string>this.propertyBag.get_Item("Street");
        }
        set City(value: string) {
            this.propertyBag.set_Item("City", value);
        }
        get City(): string {
            return <string>this.propertyBag.get_Item("City");
        }
        set State(value: string) {
            this.propertyBag.set_Item("State", value);
        }
        get State(): string {
            return <string>this.propertyBag.get_Item("State");
        }
        set CountryOrRegion(value: string) {
            this.propertyBag.set_Item("CountryOrRegion", value);
        }
        get CountryOrRegion(): string {
            return <string>this.propertyBag.get_Item("CountryOrRegion");
        }
        set PostalCode(value: string) {
            this.propertyBag.set_Item("PostalCode", value);
        }
        get PostalCode(): string {
            return <string>this.propertyBag.get_Item("PostalCode");
        }
        constructor() {
            super();
            this.propertyBag = new SimplePropertyBag<string>();
            this.propertyBag.OnChange.Add(this.PropertyBagChanged);
        }
        ClearChangeLog(): void {
            this.propertyBag.ClearChangeLog();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (PhysicalAddressEntry_PhysicalAddressSchema.XmlElementNames.Contains(reader.LocalName)) {
                this.propertyBag.set_Item(reader.LocalName, reader.ReadElementValue());
                return true;
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: List_Enumerator<string> = PhysicalAddressEntry_PhysicalAddressSchema.XmlElementNames.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    writer.WriteElementValue(XmlNamespace.Types, current, this.propertyBag.get_Item(current));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteSetUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, ownerDictionaryXmlElementName: string): boolean {
            var list: List<string> = new List<string>();
            var enumerator: IEnumerator<string> = this.propertyBag.AddedItems.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    list.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            var enumerator2: IEnumerator<string> = this.propertyBag.ModifiedItems.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: string = enumerator2.Current;
                    list.Add(current2);
                }
            }
            finally {
                if (enumerator2 !== null) {
                    enumerator2.Dispose();
                }
            }
            var enumerator3: List_Enumerator<string> = list.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: string = enumerator3.Current;
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetSetFieldXmlElementName());
                    writer.WriteStartElement(XmlNamespace.Types, "IndexedFieldURI");
                    writer.WriteAttributeValue("FieldURI", PhysicalAddressEntry.GetFieldUri(current3));
                    writer.WriteAttributeValue("FieldIndex", PhysicalAddressKey[this.Key]);
                    writer.WriteEndElement();
                    writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetXmlElementName());
                    writer.WriteStartElement(XmlNamespace.Types, ownerDictionaryXmlElementName);
                    writer.WriteStartElement(XmlNamespace.Types, "Entry");
                    this.WriteAttributesToXml(writer);
                    writer.WriteElementValue(XmlNamespace.Types, current3, this.propertyBag.get_Item(current3));
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator3).Dispose();
            }
            var enumerator4: IEnumerator<string> = this.propertyBag.RemovedItems.GetEnumerator();
            try {
                while (enumerator4.MoveNext()) {
                    var current4: string = enumerator4.Current;
                    this.InternalWriteDeleteFieldToXml(writer, ewsObject, current4);
                }
            }
            finally {
                if (enumerator4 !== null) {
                    enumerator4.Dispose();
                }
            }
            return true;
        }
        WriteSetUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, propertyDefinition: PropertyDefinition, updates: List<JsonObject>): boolean {
            var list: List<string> = new List<string>();
            list.AddRange(this.propertyBag.AddedItems);
            list.AddRange(this.propertyBag.ModifiedItems);
            var enumerator: List_Enumerator<string> = list.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var jsonObject: JsonObject = new JsonObject();
                    jsonObject.AddTypeParameter(ewsObject.GetSetFieldXmlElementName());
                    var jsonObject2: JsonObject = new JsonObject();
                    jsonObject2.AddTypeParameter("DictionaryPropertyUri");
                    jsonObject2.Add("FieldURI", PhysicalAddressEntry.GetFieldUri(current));
                    jsonObject2.Add("FieldIndex", PhysicalAddressKey[this.Key]);
                    jsonObject.Add("Path", jsonObject2);
                    var jsonObject3: JsonObject = new JsonObject();
                    jsonObject3.Add("Key", this.Key);
                    jsonObject3.Add(current, this.propertyBag.get_Item(current));
                    var jsonObject4: JsonObject = new JsonObject();
                    jsonObject4.AddTypeParameter(ewsObject.GetXmlElementName());
                    jsonObject4.Add(propertyDefinition.XmlElementName, NArray.ToEnumerable([
                        jsonObject3
                    ]));
                    jsonObject.Add(PropertyBag.GetPropertyUpdateItemName(ewsObject), jsonObject4);
                    updates.Add(jsonObject);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: IEnumerator<string> = this.propertyBag.RemovedItems.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: string = enumerator2.Current;
                    this.InternalWriteDeleteUpdateToJson(ewsObject, current2, updates);
                }
            }
            finally {
                if (enumerator2 !== null) {
                    enumerator2.Dispose();
                }
            }
            return true;
        }
        WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject): boolean {
            var enumerator: List_Enumerator<string> = PhysicalAddressEntry_PhysicalAddressSchema.XmlElementNames.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    this.InternalWriteDeleteFieldToXml(writer, ewsObject, current);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return true;
        }
        WriteDeleteUpdateToJson(service: ExchangeService, ewsObject: ServiceObject, updates: List<JsonObject>): boolean {
            var enumerator: List_Enumerator<string> = PhysicalAddressEntry_PhysicalAddressSchema.XmlElementNames.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    this.InternalWriteDeleteUpdateToJson(ewsObject, current, updates);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return true;
        }
        InternalWriteDeleteUpdateToJson(ewsObject: ServiceObject, propertyName: string, updates: List<JsonObject>): void {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(ewsObject.GetDeleteFieldXmlElementName());
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.AddTypeParameter("DictionaryPropertyUri");
            jsonObject2.Add("FieldURI", PhysicalAddressEntry.GetFieldUri(propertyName));
            jsonObject2.Add("FieldIndex", PhysicalAddressKey[this.Key]);
            jsonObject.Add("Path", jsonObject2);
            updates.Add(jsonObject);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Key", this.Key);
            jsonObject.Add("Street", this.Street);
            jsonObject.Add("City", this.City);
            jsonObject.Add("State", this.State);
            jsonObject.Add("CountryOrRegion", this.CountryOrRegion);
            jsonObject.Add("PostalCode", this.PostalCode);
            return jsonObject;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.Key = jsonProperty.ReadEnumValue<PhysicalAddressKey>("Key");
            this.Street = jsonProperty.ReadAsString("Street");
            this.City = jsonProperty.ReadAsString("City");
            this.State = jsonProperty.ReadAsString("State");
            this.Street = jsonProperty.ReadAsString("Street");
            this.CountryOrRegion = jsonProperty.ReadAsString("CountryOrRegion");
            this.PostalCode = jsonProperty.ReadAsString("PostalCode");
        }
        static GetFieldUri(xmlElementName: string): string {
            return "contacts:PhysicalAddress:" + xmlElementName;
        }
        PropertyBagChanged(): void {
            this.Changed();
        }
        InternalWriteDeleteFieldToXml(writer: EwsServiceXmlWriter, ewsObject: ServiceObject, fieldXmlElementName: string): void {
            writer.WriteStartElement(XmlNamespace.Types, ewsObject.GetDeleteFieldXmlElementName());
            writer.WriteStartElement(XmlNamespace.Types, "IndexedFieldURI");
            writer.WriteAttributeValue("FieldURI", PhysicalAddressEntry.GetFieldUri(fieldXmlElementName));
            writer.WriteAttributeValue("FieldIndex", PhysicalAddressKey[this.Key]);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
    class PhysicalAddressEntry_PhysicalAddressSchema {
        static Street: string = "Street";
        static City: string = "City";
        static State: string = "State";
        static CountryOrRegion: string = "CountryOrRegion";
        static PostalCode: string = "PostalCode";
        private static xmlElementNames: LazyMember<List<string>> = new LazyMember<List<string>>(() => {
            var list: List<string> = new List<string>();
            list.Add("Street");
            list.Add("City");
            list.Add("State");
            list.Add("CountryOrRegion");
            list.Add("PostalCode");
            return list;
        });
        static get XmlElementNames(): List<string> {
            return PhysicalAddressEntry_PhysicalAddressSchema.xmlElementNames.Member;
        }
        constructor() {
            super();
        }
    }
    class PolicyTag extends RetentionTagBase {
        constructor();
        constructor(isExplicit: boolean, retentionId: Guid);
        constructor(isExplicit?: boolean, retentionId?: Guid) {
            if (arguments.length === 0) {
                super("PolicyTag");
                this.constructor_0();
                return;
            }
            super("PolicyTag");
            this.constructor_1(isExplicit, retentionId);
        }
        private constructor_0(): void {
        }
        private constructor_1(isExplicit: boolean, retentionId: Guid): void {
            this.constructor_0();
            this.IsExplicit = isExplicit;
            this.RetentionId = retentionId;
        }
    }
    class RecurringAppointmentMasterId extends ItemId {
        constructor(occurrenceId: string) {
            super(occurrenceId);
        }
        GetXmlElementName(): string {
            return "RecurringMasterItemId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("OccurrenceId", this.UniqueId);
            writer.WriteAttributeValue("ChangeKey", this.ChangeKey);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetXmlElementName());
            jsonObject.Add("OccurrenceId", this.UniqueId);
            jsonObject.Add("ChangeKey", this.ChangeKey);
            return jsonObject;
        }
    }
    class SearchFolderParameters extends ComplexProperty {
        private traversal: SearchFolderTraversal = 0;
        private rootFolderIds: FolderIdCollection = new FolderIdCollection();
        private searchFilter: SearchFilter = null;
        set Traversal(value: SearchFolderTraversal) {
            (() => {
                var _p0 = [
                    this.traversal
                ];
                var _r = this.SetFieldValue<SearchFolderTraversal>(_p0, value);
                this.traversal = _p0[0];
                return _r;
            })();
        }
        get Traversal(): SearchFolderTraversal {
            return this.traversal;
        }
        get RootFolderIds(): FolderIdCollection {
            return this.rootFolderIds;
        }
        set SearchFilter(value: SearchFilter) {
            if (this.searchFilter !== null) {
                this.searchFilter.OnChange.Remove(this.PropertyChanged);
            }
            (() => {
                var _p0 = [
                    this.searchFilter
                ];
                var _r = this.SetFieldValue<SearchFilter>(_p0, value);
                this.searchFilter = _p0[0];
                return _r;
            })();
            if (this.searchFilter !== null) {
                this.searchFilter.OnChange.Add(this.PropertyChanged);
            }
        }
        get SearchFilter(): SearchFilter {
            return this.searchFilter;
        }
        constructor() {
            super();
            this.rootFolderIds.OnChange.Add(this.PropertyChanged);
        }
        private PropertyChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "BaseFolderIds") {
                    this.RootFolderIds.InternalClear();
                    this.RootFolderIds.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "Restriction") {
                    reader.Read();
                    this.searchFilter = SearchFilter.LoadFromXml(reader);
                    return true;
                }
            }
            return false;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.Traversal = reader.ReadAttributeValue<SearchFolderTraversal>("Traversal");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "BaseFolderIds")) {
                            if (!(a === "Restriction")) {
                                if (a === "Traversal") {
                                    this.Traversal = jsonProperty.ReadEnumValue<SearchFolderTraversal>(current);
                                }
                            }
                            else {
                                var jsonObject: JsonObject = jsonProperty.ReadAsJsonObject(current);
                                this.searchFilter = SearchFilter.LoadSearchFilterFromJson(jsonObject.ReadAsJsonObject("Item"), service);
                            }
                        }
                        else {
                            this.RootFolderIds.InternalClear();
                            (<IJsonCollectionDeserializer>this.RootFolderIds).CreateFromJsonCollection(jsonProperty.ReadAsArray(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Traversal", this.Traversal);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.SearchFilter !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "Restriction");
                this.SearchFilter.WriteToXml(writer);
                writer.WriteEndElement();
            }
            this.RootFolderIds.WriteToXml(writer, "BaseFolderIds");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Traversal", this.Traversal);
            jsonObject.Add("BaseFolderIds", this.RootFolderIds.InternalToJson(service));
            if (this.SearchFilter !== null) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("Item", this.SearchFilter.InternalToJson(service));
                jsonObject.Add("Restriction", jsonObject2);
            }
            return jsonObject;
        }
        Validate(): void {
            if (this.RootFolderIds.Count === 0) {
                throw new ServiceValidationException(Strings.SearchParametersRootFolderIdsEmpty);
            }
            if (this.SearchFilter !== null) {
                this.SearchFilter.InternalValidate();
            }
        }
    }
    class StringList extends ComplexProperty implements IEnumerable<string>, IJsonCollectionDeserializer {
        private items: List<string> = new List<string>();
        private itemXmlElementName: string = "String";
        get Count(): number {
            return this.items.Count;
        }
        get_Item(index: number): string {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.items.get_Item(index);
        }
        set_Item(index: number, value: string): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            if (this.items.get_Item(index) !== value) {
                this.items.set_Item(index, value);
                this.Changed();
            }
        }
        constructor();
        constructor(strings: IEnumerable<string>);
        constructor(itemXmlElementName: string);
        constructor(stringsOrItemXmlElementName?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1) {
                this.constructor_1(stringsOrItemXmlElementName);
                return;
            }
            this.constructor_2(stringsOrItemXmlElementName);
        }
        private constructor_0(): void {
        }
        private constructor_1(strings: IEnumerable<string>): void {
            this.AddRange(strings);
        }
        private constructor_2(itemXmlElementName: string): void {
            this.itemXmlElementName = itemXmlElementName;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (reader.LocalName === this.itemXmlElementName) {
                this.Add(reader.ReadValue());
                return true;
            }
            return false;
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                this.Add(((obj instanceof string) ? <string>obj : null));
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: IEnumerator<string> = this.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, this.itemXmlElementName);
                    writer.WriteValue(current, this.itemXmlElementName);
                    writer.WriteEndElement();
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        InternalToJson(service: ExchangeService): any {
            return new List<string>(this).ToArray();
        }
        Add(s: string): void {
            this.items.Add(s);
            this.Changed();
        }
        AddRange(strings: IEnumerable<string>): void {
            var flag: boolean = false;
            var enumerator: IEnumerator<string> = strings.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    if (!this.Contains(current)) {
                        this.items.Add(current);
                        flag = true;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            if (flag) {
                this.Changed();
            }
        }
        Contains(s: string): boolean {
            return this.items.Contains(s);
        }
        Remove(s: string): boolean {
            var flag: boolean = this.items.Remove(s);
            if (flag) {
                this.Changed();
            }
            return flag;
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            this.items.RemoveAt(index);
            this.Changed();
        }
        Clear(): void {
            this.items.Clear();
            this.Changed();
        }
        ToString(): string {
            return NString.Join(",", this.items.ToArray());
        }
        GetEnumerator(): IEnumerator<string> {
            return this.items.GetEnumerator();
        }
        Equals(obj: any): boolean {
            var stringList: StringList = ((obj instanceof StringList) ? <StringList>obj : null);
            return stringList !== null && this.ToString() === stringList.ToString();
        }
        GetHashCode(): number {
            return NString.GetHashCode(this.ToString());
        }
    }
    class TaskSuggestion extends ExtractedEntity {
        TaskString: string = null;
        Assignees: EmailUserEntityCollection = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "TaskString") {
                    this.TaskString = reader.ReadElementValue();
                    return true;
                }
                if (localName === "Assignees") {
                    this.Assignees = new EmailUserEntityCollection();
                    this.Assignees.LoadFromXml(reader, XmlNamespace.Types, "Assignees");
                    return true;
                }
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class TaskSuggestionCollection extends ComplexPropertyCollection<TaskSuggestion>
    {
        constructor();
        constructor(collection: IEnumerable<TaskSuggestion>);
        constructor(collection?: IEnumerable<TaskSuggestion>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<TaskSuggestion>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<TaskSuggestion>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): TaskSuggestion {
            return new TaskSuggestion();
        }
        CreateDefaultComplexProperty(): TaskSuggestion {
            return new TaskSuggestion();
        }
        GetCollectionItemXmlElementName(complexProperty: TaskSuggestion): string {
            return "TaskSuggestion";
        }
    }
    class TimeChange extends ComplexProperty {
        private timeZoneName: string = null;
        private offset: Nullable<TimeSpan> = null;
        private time: Time = null;
        private absoluteDate: Nullable<DateTime> = null;
        private recurrence: TimeChangeRecurrence = null;
        set TimeZoneName(value: string) {
            (() => {
                var _p0 = [
                    this.timeZoneName
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.timeZoneName = _p0[0];
                return _r;
            })();
        }
        get TimeZoneName(): string {
            return this.timeZoneName;
        }
        set Offset(value: Nullable<TimeSpan>) {
            (() => {
                var _p0 = [
                    this.offset
                ];
                var _r = this.SetFieldValue<Nullable<TimeSpan>>(_p0, value);
                this.offset = _p0[0];
                return _r;
            })();
        }
        get Offset(): Nullable<TimeSpan> {
            return this.offset;
        }
        set Time(value: Time) {
            (() => {
                var _p0 = [
                    this.time
                ];
                var _r = this.SetFieldValue<Time>(_p0, value);
                this.time = _p0[0];
                return _r;
            })();
        }
        get Time(): Time {
            return this.time;
        }
        set AbsoluteDate(value: Nullable<DateTime>) {
            (() => {
                var _p0 = [
                    this.absoluteDate
                ];
                var _r = this.SetFieldValue<Nullable<DateTime>>(_p0, value);
                this.absoluteDate = _p0[0];
                return _r;
            })();
            if (this.absoluteDate !== null) {
                this.recurrence = null;
            }
        }
        get AbsoluteDate(): Nullable<DateTime> {
            return this.absoluteDate;
        }
        set Recurrence(value: TimeChangeRecurrence) {
            (() => {
                var _p0 = [
                    this.recurrence
                ];
                var _r = this.SetFieldValue<TimeChangeRecurrence>(_p0, value);
                this.recurrence = _p0[0];
                return _r;
            })();
            if (this.recurrence !== null) {
                this.absoluteDate = null;
            }
        }
        get Recurrence(): TimeChangeRecurrence {
            return this.recurrence;
        }
        constructor();
        constructor(offset: TimeSpan);
        constructor(offset: TimeSpan, time: Time);
        constructor(offset?: TimeSpan, time?: Time) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (offset === null || offset instanceof TimeSpan)) {
                this.constructor_1(offset);
                return;
            }
            this.constructor_2(offset, time);
        }
        private constructor_0(): void {
        }
        private constructor_1(offset: TimeSpan): void {
            this.constructor_0();
            this.offset = new Nullable<TimeSpan>(offset);
        }
        private constructor_2(offset: TimeSpan, time: Time): void {
            this.constructor_1(offset);
            this.time = time;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Offset") {
                    this.offset = new Nullable<TimeSpan>(EwsUtilities.XSDurationToTimeSpan(reader.ReadElementValue()));
                    return true;
                }
                if (localName === "RelativeYearlyRecurrence") {
                    this.Recurrence = new TimeChangeRecurrence();
                    this.Recurrence.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "AbsoluteDate") {
                    this.absoluteDate = new Nullable<DateTime>(new DateTime(DateTime.Parse(reader.ReadElementValue()).ToUniversalTime().Ticks, DateTimeKind.Unspecified));
                    return true;
                }
                if (localName === "Time") {
                    this.time = new Time(DateTime.Parse(reader.ReadElementValue()));
                    return true;
                }
            }
            return false;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.timeZoneName = reader.ReadAttributeValue("TimeZoneName");
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("TimeZoneName", this.TimeZoneName);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.Offset !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "Offset", EwsUtilities.TimeSpanToXSDuration(this.Offset.Value));
            }
            if (this.Recurrence !== null) {
                this.Recurrence.WriteToXml(writer, "RelativeYearlyRecurrence");
            }
            if (this.AbsoluteDate !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "AbsoluteDate", EwsUtilities.DateTimeToXSDate(new DateTime(this.AbsoluteDate.Value.Ticks, DateTimeKind.Unspecified)));
            }
            if (this.Time !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "Time", this.Time.ToXSTime());
            }
        }
    }
    class TimeChangeRecurrence extends ComplexProperty {
        private dayOfTheWeek: Nullable<DayOfTheWeek> = null;
        private dayOfTheWeekIndex: Nullable<DayOfTheWeekIndex> = null;
        private month: Nullable<Month> = null;
        set DayOfTheWeekIndex(value: Nullable<DayOfTheWeekIndex>) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeekIndex
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeekIndex>>(_p0, value);
                this.dayOfTheWeekIndex = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeekIndex(): Nullable<DayOfTheWeekIndex> {
            return this.dayOfTheWeekIndex;
        }
        set DayOfTheWeek(value: Nullable<DayOfTheWeek>) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeek
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeek>>(_p0, value);
                this.dayOfTheWeek = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeek(): Nullable<DayOfTheWeek> {
            return this.dayOfTheWeek;
        }
        set Month(value: Nullable<Month>) {
            (() => {
                var _p0 = [
                    this.month
                ];
                var _r = this.SetFieldValue<Nullable<Month>>(_p0, value);
                this.month = _p0[0];
                return _r;
            })();
        }
        get Month(): Nullable<Month> {
            return this.month;
        }
        constructor();
        constructor(dayOfTheWeekIndex: DayOfTheWeekIndex, dayOfTheWeek: DayOfTheWeek, month: Month);
        constructor(dayOfTheWeekIndex?: DayOfTheWeekIndex, dayOfTheWeek?: DayOfTheWeek, month?: Month) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(dayOfTheWeekIndex, dayOfTheWeek, month);
        }
        private constructor_0(): void {
        }
        private constructor_1(dayOfTheWeekIndex: DayOfTheWeekIndex, dayOfTheWeek: DayOfTheWeek, month: Month): void {
            this.constructor_0();
            this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(dayOfTheWeekIndex);
            this.dayOfTheWeek = new Nullable<DayOfTheWeek>(dayOfTheWeek);
            this.month = new Nullable<Month>(month);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.DayOfTheWeek !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "DaysOfWeek", this.DayOfTheWeek.Value);
            }
            if (this.dayOfTheWeekIndex !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "DayOfWeekIndex", this.DayOfTheWeekIndex.Value);
            }
            if (this.Month !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "Month", this.Month.Value);
            }
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DaysOfWeek") {
                    this.dayOfTheWeek = new Nullable<DayOfTheWeek>(reader.ReadElementValue<DayOfTheWeek>());
                    return true;
                }
                if (localName === "DayOfWeekIndex") {
                    this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(reader.ReadElementValue<DayOfTheWeekIndex>());
                    return true;
                }
                if (localName === "Month") {
                    this.month = new Nullable<Month>(reader.ReadElementValue<Month>());
                    return true;
                }
            }
            return false;
        }
    }
    class UserConfigurationDictionary extends ComplexProperty implements IJsonCollectionDeserializer {
        private dictionary: Dictionary<any, any> = null;
        private isDirty: boolean = false;
        get_Item(key: any): any {
            return this.dictionary.get_Item(key);
        }
        set_Item(key: any, value: any): void {
            this.ValidateEntry(key, value);
            this.dictionary.set_Item(key, value);
            this.Changed();
        }
        get Count(): number {
            return this.dictionary.Count;
        }
        set IsDirty(value: boolean) {
            this.isDirty = value;
        }
        get IsDirty(): boolean {
            return this.isDirty;
        }
        constructor() {
            super();
            this.dictionary = new Dictionary<any, any>();
        }
        Add(key: any, value: any): void {
            this.ValidateEntry(key, value);
            this.dictionary.Add(key, value);
            this.Changed();
        }
        ContainsKey(key: any): boolean {
            return this.dictionary.ContainsKey(key);
        }
        Remove(key: any): boolean {
            var flag: boolean = this.dictionary.Remove(key);
            if (flag) {
                this.Changed();
            }
            return flag;
        }
        TryGetValue(key: any, value: any[]): boolean {
            return (() => {
                var _p0 = [
                    value[0]
                ];
                var _r = this.dictionary.TryGetValue(key, _p0);
                value[0] = _p0[0];
                return _r;
            })();
        }
        Clear(): void {
            if (this.dictionary.Count !== 0) {
                this.dictionary.Clear();
                this.Changed();
            }
        }
        GetEnumerator(): IEnumerator {
            return this.dictionary.GetEnumerator();
        }
        Changed(): void {
            super.Changed();
            this.isDirty = true;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            EwsUtilities.Assert(writer !== null, "UserConfigurationDictionary.WriteElementsToXml", "writer is null");
            var enumerator: Dictionary_Enumerator<any, any> = this.dictionary.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<any, any> = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, "DictionaryEntry");
                    this.WriteObjectToXml(writer, "DictionaryKey", current.Key);
                    this.WriteObjectToXml(writer, "DictionaryValue", current.Value);
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: Dictionary_Enumerator<any, any> = this.dictionary.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<any, any> = enumerator.Current;
                    var jsonObject: JsonObject = new JsonObject();
                    jsonObject.Add("DictionaryKey", this.GetJsonObject(current.Key, service));
                    jsonObject.Add("DictionaryValue", this.GetJsonObject(current.Value, service));
                    list.Add(jsonObject);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list.ToArray();
        }
        private static GetTypeCode(service: ExchangeServiceBase, dictionaryObject: any, dictionaryObjectType: UserConfigurationDictionaryObjectType[], valueAsString: string[]): void {
            var typeCode: TypeCode = Type.GetTypeCode(dictionaryObject.GetType());
            switch (typeCode) {
                case TypeCode.Boolean:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.Boolean;
                    valueAsString[0] = EwsUtilities.BoolToXSBool(<boolean>dictionaryObject);
                    return;
                case TypeCode.Char:
                case TypeCode.SByte:
                case TypeCode.Int16:
                case TypeCode.UInt16:
                    break;
                case TypeCode.Byte:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.Byte;
                    valueAsString[0] = NNumber.ToString(<number>dictionaryObject);
                    return;
                case TypeCode.Int32:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.Integer32;
                    valueAsString[0] = NNumber.ToString(<number>dictionaryObject);
                    return;
                case TypeCode.UInt32:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.UnsignedInteger32;
                    valueAsString[0] = NNumber.ToString(<number>dictionaryObject);
                    return;
                case TypeCode.Int64:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.Integer64;
                    valueAsString[0] = NNumber.ToString(<number>dictionaryObject);
                    return;
                case TypeCode.UInt64:
                    dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.UnsignedInteger64;
                    valueAsString[0] = NNumber.ToString(<number>dictionaryObject);
                    return;
                default:
                    switch (typeCode) {
                        case TypeCode.DateTime:
                            dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.DateTime;
                            valueAsString[0] = service.ConvertDateTimeToUniversalDateTimeString(<DateTime>dictionaryObject);
                            return;
                        case TypeCode.String:
                            dictionaryObjectType[0] = UserConfigurationDictionaryObjectType.String;
                            valueAsString[0] = <string>dictionaryObject;
                            return;
                    }
                    break;
            }
            EwsUtilities.Assert(false, "UserConfigurationDictionary.WriteObjectValueToXml", "Unsupported type: " + dictionaryObject.GetType().ToString());
        }
        private static GetObjectType(type: string): UserConfigurationDictionaryObjectType {
            return <UserConfigurationDictionaryObjectType>Enum.Parse(new Type("Number"), type, false);
        }
        private GetJsonObject(dictionaryObject: any, service: ExchangeService): JsonObject {
            var userConfigurationDictionaryObjectType: UserConfigurationDictionaryObjectType = UserConfigurationDictionaryObjectType.String;
            if (dictionaryObject === null) {
                return null;
            }
            var array: string[];
            if (dictionaryObject instanceof string[]) {
                userConfigurationDictionaryObjectType = UserConfigurationDictionaryObjectType.StringArray;
                array = (((dictionaryObject instanceof string[]) ? <string[]>dictionaryObject : null));
            }
            else {
                if (dictionaryObject instanceof number[]) {
                    userConfigurationDictionaryObjectType = UserConfigurationDictionaryObjectType.ByteArray;
                    array = [
                        Convert.ToBase64String(((dictionaryObject instanceof number[]) ? <number[]>dictionaryObject : null))
                    ];
                }
                else {
                    array = new Array<string>(1);
                    for (var _ai: number = 0; _ai < array.length; ++_ai)
                        array[_ai] = null;
                    (() => {
                        var _p0 = [
                            userConfigurationDictionaryObjectType
                        ];
                        var _p1 = [
                            array[0]
                        ];
                        var _r = UserConfigurationDictionary.GetTypeCode(service, dictionaryObject, _p0, _p1);
                        userConfigurationDictionaryObjectType = _p0[0];
                        array[0] = _p1[0];
                        return _r;
                    })();
                }
            }
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Type", userConfigurationDictionaryObjectType);
            jsonObject.Add("Value", NArray.ToEnumerable(array));
            return jsonObject;
        }
        private WriteObjectToXml(writer: EwsServiceXmlWriter, xmlElementName: string, dictionaryObject: any): void {
            EwsUtilities.Assert(writer !== null, "UserConfigurationDictionary.WriteObjectToXml", "writer is null");
            EwsUtilities.Assert(xmlElementName !== null, "UserConfigurationDictionary.WriteObjectToXml", "xmlElementName is null");
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            if (dictionaryObject === null) {
                EwsUtilities.Assert(xmlElementName !== "DictionaryKey", "UserConfigurationDictionary.WriteObjectToXml", "Key is null");
                writer.WriteAttributeValue("xsi", "nil", "true");
            }
            else {
                this.WriteObjectValueToXml(writer, dictionaryObject);
            }
            writer.WriteEndElement();
        }
        private WriteObjectValueToXml(writer: EwsServiceXmlWriter, dictionaryObject: any): void {
            EwsUtilities.Assert(writer !== null, "UserConfigurationDictionary.WriteObjectValueToXml", "writer is null");
            EwsUtilities.Assert(dictionaryObject !== null, "UserConfigurationDictionary.WriteObjectValueToXml", "dictionaryObject is null");
            var array: string[] = ((dictionaryObject instanceof string[]) ? <string[]>dictionaryObject : null);
            if (array !== null) {
                this.WriteEntryTypeToXml(writer, UserConfigurationDictionaryObjectType.StringArray);
                var array2: string[] = array;
                for (var i: number = 0; i < array2.length; i = i + 1) {
                    var value: string = array2[i];
                    this.WriteEntryValueToXml(writer, value);
                }
                return;
            }
            var dictionaryObjectType: UserConfigurationDictionaryObjectType = UserConfigurationDictionaryObjectType.String;
            var value2: string = null;
            var array3: number[] = ((dictionaryObject instanceof number[]) ? <number[]>dictionaryObject : null);
            if (array3 !== null) {
                dictionaryObjectType = UserConfigurationDictionaryObjectType.ByteArray;
                value2 = Convert.ToBase64String(array3);
            }
            else {
                (() => {
                    var _p0 = [
                        dictionaryObjectType
                    ];
                    var _p1 = [
                        value2
                    ];
                    var _r = UserConfigurationDictionary.GetTypeCode(writer.Service, dictionaryObject, _p0, _p1);
                    dictionaryObjectType = _p0[0];
                    value2 = _p1[0];
                    return _r;
                })();
            }
            this.WriteEntryTypeToXml(writer, dictionaryObjectType);
            this.WriteEntryValueToXml(writer, value2);
        }
        private WriteEntryTypeToXml(writer: EwsServiceXmlWriter, dictionaryObjectType: UserConfigurationDictionaryObjectType): void {
            writer.WriteStartElement(XmlNamespace.Types, "Type");
            writer.WriteValue(UserConfigurationDictionaryObjectType[dictionaryObjectType], "Type");
            writer.WriteEndElement();
        }
        private WriteEntryValueToXml(writer: EwsServiceXmlWriter, value: string): void {
            writer.WriteStartElement(XmlNamespace.Types, "Value");
            if (value !== null) {
                writer.WriteValue(value, "Value");
            }
            writer.WriteEndElement();
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            super.LoadFromXml(reader, xmlNamespace, xmlElementName);
            this.isDirty = false;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            reader.EnsureCurrentNodeIsStartElement(this.Namespace, "DictionaryEntry");
            this.LoadEntry(reader);
            return true;
        }
        private LoadEntry(reader: EwsServiceXmlReader): void {
            EwsUtilities.Assert(reader !== null, "UserConfigurationDictionary.LoadEntry", "reader is null");
            var value: any = null;
            reader.ReadStartElement(this.Namespace, "DictionaryKey");
            var dictionaryObject: any = this.GetDictionaryObject(reader);
            reader.ReadStartElement(this.Namespace, "DictionaryValue");
            var text: string = reader.ReadAttributeValue(XmlNamespace.XmlSchemaInstance, "nil");
            var flag: boolean = text === null || !Convert.ToBoolean(text);
            if (flag) {
                value = this.GetDictionaryObject(reader);
            }
            this.dictionary.Add(dictionaryObject, value);
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                var dictionaryObject: any = this.GetDictionaryObject(jsonObject.ReadAsJsonObject("DictionaryKey"), service);
                var dictionaryObject2: any = this.GetDictionaryObject(jsonObject.ReadAsJsonObject("DictionaryValue"), service);
                this.dictionary.Add(dictionaryObject, dictionaryObject2);
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        private GetDictionaryObject(jsonObject: JsonObject, service: ExchangeService): any;
        private GetDictionaryObject(reader: EwsServiceXmlReader): any;
        private GetDictionaryObject(jsonObjectOrReader: any, service?: ExchangeService): any {
            if (arguments.length === 2 && (jsonObjectOrReader === null || jsonObjectOrReader instanceof JsonObject) && (service === null || service instanceof ExchangeService)) {
                return this.GetDictionaryObject_0(jsonObjectOrReader, service);
            }
            return this.GetDictionaryObject_1(jsonObjectOrReader);
        }
        private GetDictionaryObject_0(jsonObject: JsonObject, service: ExchangeService): any {
            if (jsonObject === null) {
                return null;
            }
            var objectType: UserConfigurationDictionaryObjectType = UserConfigurationDictionary.GetObjectType(jsonObject.ReadAsString("Type"));
            var objectValue: List<string> = this.GetObjectValue(jsonObject.ReadAsArray("Value"));
            return this.ConstructObject(objectType, objectValue, service);
        }
        private GetObjectValue(valueArray: any[]): List<string>;
        private GetObjectValue(reader: EwsServiceXmlReader, type: UserConfigurationDictionaryObjectType): List<string>;
        private GetObjectValue(valueArrayOrReader: any, type?: UserConfigurationDictionaryObjectType): List<string> {
            if (arguments.length === 1 && (valueArrayOrReader === null || valueArrayOrReader instanceof Array)) {
                return this.GetObjectValue_0(valueArrayOrReader);
            }
            return this.GetObjectValue_1(valueArrayOrReader, type);
        }
        private GetObjectValue_0(valueArray: any[]): List<string> {
            var list: List<string> = new List<string>();
            for (var i: number = 0; i < valueArray.length; i = i + 1) {
                var obj: any = valueArray[i];
                list.Add(((obj instanceof string) ? <string>obj : null));
            }
            return list;
        }
        private GetDictionaryObject_1(reader: EwsServiceXmlReader): any {
            EwsUtilities.Assert(reader !== null, "UserConfigurationDictionary.LoadFromXml", "reader is null");
            var objectType: UserConfigurationDictionaryObjectType = this.GetObjectType(reader);
            var objectValue: List<string> = this.GetObjectValue(reader, objectType);
            return this.ConstructObject(objectType, objectValue, reader.Service);
        }
        private GetObjectValue_1(reader: EwsServiceXmlReader, type: UserConfigurationDictionaryObjectType): List<string> {
            EwsUtilities.Assert(reader !== null, "UserConfigurationDictionary.LoadFromXml", "reader is null");
            var list: List<string> = new List<string>();
            reader.ReadStartElement(this.Namespace, "Value");
            do {
                var item: string = null;
                if (reader.IsEmptyElement) {
                    if (type === UserConfigurationDictionaryObjectType.String || type === UserConfigurationDictionaryObjectType.StringArray) {
                        item = NString.Empty;
                    }
                    else {
                        EwsUtilities.Assert(false, "UserConfigurationDictionary.GetObjectValue", "Empty element passed for type: " + UserConfigurationDictionaryObjectType[type]);
                    }
                }
                else {
                    item = reader.ReadElementValue();
                }
                list.Add(item);
                reader.Read();
            }
            while (reader.IsStartElement(this.Namespace, "Value"));
            return list;
        }
        private GetObjectType(reader: EwsServiceXmlReader): UserConfigurationDictionaryObjectType {
            EwsUtilities.Assert(reader !== null, "UserConfigurationDictionary.LoadFromXml", "reader is null");
            reader.ReadStartElement(this.Namespace, "Type");
            var type: string = reader.ReadElementValue();
            return UserConfigurationDictionary.GetObjectType(type);
        }
        private ConstructObject(type: UserConfigurationDictionaryObjectType, value: List<string>, service: ExchangeService): any {
            EwsUtilities.Assert(value !== null, "UserConfigurationDictionary.ConstructObject", "value is null");
            EwsUtilities.Assert(value.Count === 1 || type === UserConfigurationDictionaryObjectType.StringArray, "UserConfigurationDictionary.ConstructObject", "value is array but type is not StringArray");
            var result: any = null;
            switch (type) {
                case UserConfigurationDictionaryObjectType.DateTime:
                    {
                        var dateTime: Nullable<DateTime> = service.ConvertUniversalDateTimeStringToLocalDateTime(value.get_Item(0));
                        if (dateTime !== null) {
                            result = dateTime.Value;
                        }
                        else {
                            EwsUtilities.Assert(false, "UserConfigurationDictionary.ConstructObject", "DateTime is null");
                        }
                        break;
                    }
                case UserConfigurationDictionaryObjectType.Boolean:
                    result = NBoolean.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.Byte:
                    result = NNumber.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.String:
                    result = value.get_Item(0);
                    break;
                case UserConfigurationDictionaryObjectType.Integer32:
                    result = NNumber.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.UnsignedInteger32:
                    result = NNumber.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.Integer64:
                    result = NNumber.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.UnsignedInteger64:
                    result = NNumber.Parse(value.get_Item(0));
                    break;
                case UserConfigurationDictionaryObjectType.StringArray:
                    result = value.ToArray();
                    break;
                case UserConfigurationDictionaryObjectType.ByteArray:
                    result = Convert.FromBase64String(value.get_Item(0));
                    break;
                default:
                    EwsUtilities.Assert(false, "UserConfigurationDictionary.ConstructObject", "Type not recognized: " + UserConfigurationDictionaryObjectType[type]);
                    break;
            }
            return result;
        }
        private ValidateEntry(key: any, value: any): void {
            this.ValidateObject(key);
            this.ValidateObject(value);
        }
        private ValidateObject(dictionaryObject: any): void {
            if (dictionaryObject !== null) {
                var array: Array = ((dictionaryObject instanceof Array) ? <Array>dictionaryObject : null);
                if (array !== null) {
                    this.ValidateArrayObject(array);
                    return;
                }
                this.ValidateObjectType(dictionaryObject.GetType());
            }
        }
        private ValidateArrayObject(dictionaryObjectAsArray: Array): void {
            if (dictionaryObjectAsArray instanceof string[]) {
                if (dictionaryObjectAsArray.Length > 0) {
                    var enumerator: IEnumerator = dictionaryObjectAsArray.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            if (enumerator.Current === null) {
                                throw new ServiceLocalException(Strings.NullStringArrayElementInvalid);
                            }
                        }
                        return;
                    }
                    finally {
                        var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                        if (disposable !== null) {
                            disposable.Dispose();
                        }
                    }
                }
                throw new ServiceLocalException(Strings.ZeroLengthArrayInvalid);
            }
            if (!(dictionaryObjectAsArray instanceof number[])) {
                throw new ServiceLocalException(NString.Format(Strings.ObjectTypeNotSupported, dictionaryObjectAsArray.GetType()));
            }
            if (dictionaryObjectAsArray.Length <= 0) {
                throw new ServiceLocalException(Strings.ZeroLengthArrayInvalid);
            }
        }
        private ValidateObjectType(type: Type): void {
            var IL_52: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        var flag: boolean = false;
                        var typeCode: TypeCode = Type.GetTypeCode(type);
                        switch (typeCode) {
                            case TypeCode.Boolean:
                            case TypeCode.Byte:
                            case TypeCode.Int32:
                            case TypeCode.UInt32:
                            case TypeCode.Int64:
                            case TypeCode.UInt64:
                                break;
                            case TypeCode.Char:
                            case TypeCode.SByte:
                            case TypeCode.Int16:
                            case TypeCode.UInt16:
                                _goto = IL_52;
                                continue _GOTO_LOOP;
                            default:
                                switch (typeCode) {
                                    case TypeCode.DateTime:
                                    case TypeCode.String:
                                        break;
                                    case <TypeCode>17:
                                        _goto = IL_52;
                                        continue _GOTO_LOOP;
                                    default:
                                        _goto = IL_52;
                                        continue _GOTO_LOOP;
                                }
                                break;
                        }
                        flag = true;
                        _goto = IL_52;
                        continue _GOTO_LOOP;
                    case 1:
                        if (!flag) {
                            throw new ServiceLocalException(NString.Format(Strings.ObjectTypeNotSupported, type));
                        }
                        break _GOTO_LOOP;
                }
            }
        }
    }
    class VotingInformation extends ComplexProperty {
        private userOptions: Collection<VotingOptionData> = new Collection<VotingOptionData>();
        private votingResponse: string = null;
        get UserOptions(): Collection<VotingOptionData> {
            return this.userOptions;
        }
        get VotingResponse(): string {
            return this.votingResponse;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "UserOptions") {
                    if (!reader.IsEmptyElement) {
                        do {
                            reader.Read();
                            if (reader.IsStartElement(XmlNamespace.Types, "VotingOptionData")) {
                                var votingOptionData: VotingOptionData = new VotingOptionData();
                                votingOptionData.LoadFromXml(reader, reader.LocalName);
                                this.userOptions.Add(votingOptionData);
                            }
                        }
                        while (!reader.IsEndElement(XmlNamespace.Types, "UserOptions"));
                    }
                    return true;
                }
                if (localName === "VotingResponse") {
                    this.votingResponse = reader.ReadElementValue<string>();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "UserOptions")) {
                            if (a === "VotingResponse") {
                                this.votingResponse = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            var array: any[] = jsonProperty.ReadAsArray("UserOptions");
                            if (array !== null) {
                                var array2: any[] = array;
                                for (var i: number = 0; i < array2.length; i = i + 1) {
                                    var obj: any = array2[i];
                                    var jsonProperty2: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                    var votingOptionData: VotingOptionData = new VotingOptionData();
                                    votingOptionData.LoadFromJson(jsonProperty2, service);
                                    this.userOptions.Add(votingOptionData);
                                }
                            }
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class VotingOptionData extends ComplexProperty {
        private displayName: string = null;
        private sendPrompt: SendPrompt = 0;
        get DisplayName(): string {
            return this.displayName;
        }
        get SendPrompt(): SendPrompt {
            return this.sendPrompt;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DisplayName") {
                    this.displayName = reader.ReadElementValue<string>();
                    return true;
                }
                if (localName === "SendPrompt") {
                    this.sendPrompt = reader.ReadElementValue<SendPrompt>();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DisplayName")) {
                            if (a === "SendPrompt") {
                                this.sendPrompt = jsonProperty.ReadEnumValue<SendPrompt>(current);
                            }
                        }
                        else {
                            this.displayName = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class Rule extends ComplexProperty {
        private ruleId: string = null;
        private displayName: string = null;
        private priority: number = 0;
        private isEnabled: boolean = false;
        private isNotSupported: boolean = false;
        private isInError: boolean = false;
        private conditions: RulePredicates = null;
        private actions: RuleActions = null;
        private exceptions: RulePredicates = null;
        set Id(value: string) {
            (() => {
                var _p0 = [
                    this.ruleId
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.ruleId = _p0[0];
                return _r;
            })();
        }
        get Id(): string {
            return this.ruleId;
        }
        set DisplayName(value: string) {
            (() => {
                var _p0 = [
                    this.displayName
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.displayName = _p0[0];
                return _r;
            })();
        }
        get DisplayName(): string {
            return this.displayName;
        }
        set Priority(value: number) {
            (() => {
                var _p0 = [
                    this.priority
                ];
                var _r = this.SetFieldValue<number>(_p0, value);
                this.priority = _p0[0];
                return _r;
            })();
        }
        get Priority(): number {
            return this.priority;
        }
        set IsEnabled(value: boolean) {
            (() => {
                var _p0 = [
                    this.isEnabled
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isEnabled = _p0[0];
                return _r;
            })();
        }
        get IsEnabled(): boolean {
            return this.isEnabled;
        }
        get IsNotSupported(): boolean {
            return this.isNotSupported;
        }
        set IsInError(value: boolean) {
            (() => {
                var _p0 = [
                    this.isInError
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isInError = _p0[0];
                return _r;
            })();
        }
        get IsInError(): boolean {
            return this.isInError;
        }
        get Conditions(): RulePredicates {
            return this.conditions;
        }
        get Actions(): RuleActions {
            return this.actions;
        }
        get Exceptions(): RulePredicates {
            return this.exceptions;
        }
        constructor() {
            super();
            this.priority = 1;
            this.isEnabled = true;
            this.conditions = new RulePredicates();
            this.actions = new RuleActions();
            this.exceptions = new RulePredicates();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "DisplayName":
                    this.displayName = reader.ReadElementValue();
                    return true;
                case "RuleId":
                    this.ruleId = reader.ReadElementValue();
                    return true;
                case "Priority":
                    this.priority = reader.ReadElementValue<number>();
                    return true;
                case "IsEnabled":
                    this.isEnabled = reader.ReadElementValue<boolean>();
                    return true;
                case "IsNotSupported":
                    this.isNotSupported = reader.ReadElementValue<boolean>();
                    return true;
                case "IsInError":
                    this.isInError = reader.ReadElementValue<boolean>();
                    return true;
                case "Conditions":
                    this.conditions.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "Actions":
                    this.actions.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "Exceptions":
                    this.exceptions.LoadFromXml(reader, reader.LocalName);
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "DisplayName":
                            this.displayName = jsonProperty.ReadAsString(current);
                            break;
                        case "RuleId":
                            this.ruleId = jsonProperty.ReadAsString(current);
                            break;
                        case "Priority":
                            this.priority = jsonProperty.ReadAsInt(current);
                            break;
                        case "IsEnabled":
                            this.isEnabled = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsNotSupported":
                            this.isNotSupported = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsInError":
                            this.isInError = jsonProperty.ReadAsBool(current);
                            break;
                        case "Conditions":
                            this.conditions.LoadFromJson(jsonProperty, service);
                            break;
                        case "Actions":
                            this.actions.LoadFromJson(jsonProperty, service);
                            break;
                        case "Exceptions":
                            this.exceptions.LoadFromJson(jsonProperty, service);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.Id)) {
                writer.WriteElementValue(XmlNamespace.Types, "RuleId", this.Id);
            }
            writer.WriteElementValue(XmlNamespace.Types, "DisplayName", this.DisplayName);
            writer.WriteElementValue(XmlNamespace.Types, "Priority", this.Priority);
            writer.WriteElementValue(XmlNamespace.Types, "IsEnabled", this.IsEnabled);
            writer.WriteElementValue(XmlNamespace.Types, "IsInError", this.IsInError);
            this.Conditions.WriteToXml(writer, "Conditions");
            this.Exceptions.WriteToXml(writer, "Exceptions");
            this.Actions.WriteToXml(writer, "Actions");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (!NString.IsNullOrEmpty(this.Id)) {
                jsonObject.Add("RuleId", this.Id);
            }
            jsonObject.Add("DisplayName", this.DisplayName);
            jsonObject.Add("Priority", this.Priority);
            jsonObject.Add("IsEnabled", this.IsEnabled);
            jsonObject.Add("IsInError", this.IsInError);
            jsonObject.Add("Conditions", this.Conditions.InternalToJson(service));
            jsonObject.Add("Exceptions", this.Exceptions.InternalToJson(service));
            jsonObject.Add("Actions", this.Actions.InternalToJson(service));
            return jsonObject;
        }
        InternalValidate(): void {
            super.InternalValidate();
            EwsUtilities.ValidateParam(this.displayName, "DisplayName");
            EwsUtilities.ValidateParam(this.conditions, "Conditions");
            EwsUtilities.ValidateParam(this.exceptions, "Exceptions");
            EwsUtilities.ValidateParam(this.actions, "Actions");
        }
    }
    class RuleCollection extends ComplexProperty implements IEnumerable<Rule>, IJsonCollectionDeserializer {
        private outlookRuleBlobExists: boolean = false;
        private rules: List<Rule> = null;
        set OutlookRuleBlobExists(value: boolean) {
            this.outlookRuleBlobExists = value;
        }
        get OutlookRuleBlobExists(): boolean {
            return this.outlookRuleBlobExists;
        }
        get Count(): number {
            return this.rules.Count;
        }
        get_Item(index: number): Rule {
            if (index < 0 || index >= this.rules.Count) {
                throw new ArgumentOutOfRangeException("Index");
            }
            return this.rules.get_Item(index);
        }
        constructor() {
            super();
            this.rules = new List<Rule>();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (reader.IsStartElement(XmlNamespace.Types, "Rule")) {
                var rule: Rule = new Rule();
                rule.LoadFromXml(reader, "Rule");
                this.rules.Add(rule);
                return true;
            }
            return false;
        }
        CreateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonCollection.length; i = i + 1) {
                var obj: any = jsonCollection[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject !== null) {
                    var rule: Rule = new Rule();
                    rule.LoadFromJson(jsonObject, service);
                    this.rules.Add(rule);
                }
            }
        }
        UpdateFromJsonCollection(jsonCollection: any[], service: ExchangeService): void {
            throw new NotImplementedException();
        }
        GetEnumerator(): IEnumerator<Rule> {
            return this.rules.GetEnumerator();
        }
    }
    class RuleActions extends ComplexProperty {
        private static MobileType: string = "MOBILE";
        private assignCategories: StringList = null;
        private copyToFolder: FolderId = null;
        private delete: boolean = false;
        private forwardAsAttachmentToRecipients: EmailAddressCollection = null;
        private forwardToRecipients: EmailAddressCollection = null;
        private markImportance: Nullable<Importance> = null;
        private markAsRead: boolean = false;
        private moveToFolder: FolderId = null;
        private permanentDelete: boolean = false;
        private redirectToRecipients: EmailAddressCollection = null;
        private sendSMSAlertToRecipients: Collection<MobilePhone> = null;
        private serverReplyWithMessage: ItemId = null;
        private stopProcessingRules: boolean = false;
        get AssignCategories(): StringList {
            return this.assignCategories;
        }
        set CopyToFolder(value: FolderId) {
            (() => {
                var _p0 = [
                    this.copyToFolder
                ];
                var _r = this.SetFieldValue<FolderId>(_p0, value);
                this.copyToFolder = _p0[0];
                return _r;
            })();
        }
        get CopyToFolder(): FolderId {
            return this.copyToFolder;
        }
        set Delete(value: boolean) {
            (() => {
                var _p0 = [
                    this.delete
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.delete = _p0[0];
                return _r;
            })();
        }
        get Delete(): boolean {
            return this.delete;
        }
        get ForwardAsAttachmentToRecipients(): EmailAddressCollection {
            return this.forwardAsAttachmentToRecipients;
        }
        get ForwardToRecipients(): EmailAddressCollection {
            return this.forwardToRecipients;
        }
        set MarkImportance(value: Nullable<Importance>) {
            (() => {
                var _p0 = [
                    this.markImportance
                ];
                var _r = this.SetFieldValue<Nullable<Importance>>(_p0, value);
                this.markImportance = _p0[0];
                return _r;
            })();
        }
        get MarkImportance(): Nullable<Importance> {
            return this.markImportance;
        }
        set MarkAsRead(value: boolean) {
            (() => {
                var _p0 = [
                    this.markAsRead
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.markAsRead = _p0[0];
                return _r;
            })();
        }
        get MarkAsRead(): boolean {
            return this.markAsRead;
        }
        set MoveToFolder(value: FolderId) {
            (() => {
                var _p0 = [
                    this.moveToFolder
                ];
                var _r = this.SetFieldValue<FolderId>(_p0, value);
                this.moveToFolder = _p0[0];
                return _r;
            })();
        }
        get MoveToFolder(): FolderId {
            return this.moveToFolder;
        }
        set PermanentDelete(value: boolean) {
            (() => {
                var _p0 = [
                    this.permanentDelete
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.permanentDelete = _p0[0];
                return _r;
            })();
        }
        get PermanentDelete(): boolean {
            return this.permanentDelete;
        }
        get RedirectToRecipients(): EmailAddressCollection {
            return this.redirectToRecipients;
        }
        get SendSMSAlertToRecipients(): Collection<MobilePhone> {
            return this.sendSMSAlertToRecipients;
        }
        set ServerReplyWithMessage(value: ItemId) {
            (() => {
                var _p0 = [
                    this.serverReplyWithMessage
                ];
                var _r = this.SetFieldValue<ItemId>(_p0, value);
                this.serverReplyWithMessage = _p0[0];
                return _r;
            })();
        }
        get ServerReplyWithMessage(): ItemId {
            return this.serverReplyWithMessage;
        }
        set StopProcessingRules(value: boolean) {
            (() => {
                var _p0 = [
                    this.stopProcessingRules
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.stopProcessingRules = _p0[0];
                return _r;
            })();
        }
        get StopProcessingRules(): boolean {
            return this.stopProcessingRules;
        }
        constructor() {
            super();
            this.assignCategories = new StringList();
            this.forwardAsAttachmentToRecipients = new EmailAddressCollection("Address");
            this.forwardToRecipients = new EmailAddressCollection("Address");
            this.redirectToRecipients = new EmailAddressCollection("Address");
            this.sendSMSAlertToRecipients = new Collection<MobilePhone>();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "AssignCategories":
                    this.assignCategories.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "CopyToFolder":
                    reader.ReadStartElement(XmlNamespace.NotSpecified, "FolderId");
                    this.copyToFolder = new FolderId();
                    this.copyToFolder.LoadFromXml(reader, "FolderId");
                    reader.ReadEndElement(XmlNamespace.NotSpecified, "CopyToFolder");
                    return true;
                case "Delete":
                    this.delete = reader.ReadElementValue<boolean>();
                    return true;
                case "ForwardAsAttachmentToRecipients":
                    this.forwardAsAttachmentToRecipients.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ForwardToRecipients":
                    this.forwardToRecipients.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "MarkImportance":
                    this.markImportance = new Nullable<Importance>(reader.ReadElementValue<Importance>());
                    return true;
                case "MarkAsRead":
                    this.markAsRead = reader.ReadElementValue<boolean>();
                    return true;
                case "MoveToFolder":
                    reader.ReadStartElement(XmlNamespace.NotSpecified, "FolderId");
                    this.moveToFolder = new FolderId();
                    this.moveToFolder.LoadFromXml(reader, "FolderId");
                    reader.ReadEndElement(XmlNamespace.NotSpecified, "MoveToFolder");
                    return true;
                case "PermanentDelete":
                    this.permanentDelete = reader.ReadElementValue<boolean>();
                    return true;
                case "RedirectToRecipients":
                    this.redirectToRecipients.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "SendSMSAlertToRecipients":
                    {
                        var emailAddressCollection: EmailAddressCollection = new EmailAddressCollection("Address");
                        emailAddressCollection.LoadFromXml(reader, reader.LocalName);
                        this.sendSMSAlertToRecipients = RuleActions.ConvertSMSRecipientsFromEmailAddressCollectionToMobilePhoneCollection(emailAddressCollection);
                        return true;
                    }
                case "ServerReplyWithMessage":
                    this.serverReplyWithMessage = new ItemId();
                    this.serverReplyWithMessage.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "StopProcessingRules":
                    this.stopProcessingRules = reader.ReadElementValue<boolean>();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "AssignCategories":
                            this.assignCategories.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "CopyToFolder":
                            this.copyToFolder = new FolderId();
                            this.copyToFolder.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "Delete":
                            this.delete = jsonProperty.ReadAsBool(current);
                            break;
                        case "ForwardAsAttachmentToRecipients":
                            this.forwardAsAttachmentToRecipients.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "ForwardToRecipients":
                            this.forwardToRecipients.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "MarkImportance":
                            this.markImportance = new Nullable<Importance>(jsonProperty.ReadEnumValue<Importance>(current));
                            break;
                        case "MarkAsRead":
                            this.markAsRead = jsonProperty.ReadAsBool(current);
                            break;
                        case "MoveToFolder":
                            this.moveToFolder = new FolderId();
                            this.moveToFolder.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "PermanentDelete":
                            this.permanentDelete = jsonProperty.ReadAsBool(current);
                            break;
                        case "RedirectToRecipients":
                            this.redirectToRecipients.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "SendSMSAlertToRecipients":
                            {
                                var emailAddressCollection: EmailAddressCollection = new EmailAddressCollection("Address");
                                emailAddressCollection.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                this.sendSMSAlertToRecipients = RuleActions.ConvertSMSRecipientsFromEmailAddressCollectionToMobilePhoneCollection(emailAddressCollection);
                                break;
                            }
                        case "ServerReplyWithMessage":
                            this.serverReplyWithMessage = new ItemId();
                            this.serverReplyWithMessage.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            break;
                        case "StopProcessingRules":
                            this.stopProcessingRules = jsonProperty.ReadAsBool(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.AssignCategories.Count > 0) {
                this.AssignCategories.WriteToXml(writer, "AssignCategories");
            }
            if (this.CopyToFolder !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "CopyToFolder");
                this.CopyToFolder.WriteToXml(writer);
                writer.WriteEndElement();
            }
            if (this.Delete) {
                writer.WriteElementValue(XmlNamespace.Types, "Delete", this.Delete);
            }
            if (this.ForwardAsAttachmentToRecipients.Count > 0) {
                this.ForwardAsAttachmentToRecipients.WriteToXml(writer, "ForwardAsAttachmentToRecipients");
            }
            if (this.ForwardToRecipients.Count > 0) {
                this.ForwardToRecipients.WriteToXml(writer, "ForwardToRecipients");
            }
            if (this.MarkImportance !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "MarkImportance", this.MarkImportance.Value);
            }
            if (this.MarkAsRead) {
                writer.WriteElementValue(XmlNamespace.Types, "MarkAsRead", this.MarkAsRead);
            }
            if (this.MoveToFolder !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "MoveToFolder");
                this.MoveToFolder.WriteToXml(writer);
                writer.WriteEndElement();
            }
            if (this.PermanentDelete) {
                writer.WriteElementValue(XmlNamespace.Types, "PermanentDelete", this.PermanentDelete);
            }
            if (this.RedirectToRecipients.Count > 0) {
                this.RedirectToRecipients.WriteToXml(writer, "RedirectToRecipients");
            }
            if (this.SendSMSAlertToRecipients.Count > 0) {
                var emailAddressCollection: EmailAddressCollection = RuleActions.ConvertSMSRecipientsFromMobilePhoneCollectionToEmailAddressCollection(this.SendSMSAlertToRecipients);
                emailAddressCollection.WriteToXml(writer, "SendSMSAlertToRecipients");
            }
            if (this.ServerReplyWithMessage !== null) {
                this.ServerReplyWithMessage.WriteToXml(writer, "ServerReplyWithMessage");
            }
            if (this.StopProcessingRules) {
                writer.WriteElementValue(XmlNamespace.Types, "StopProcessingRules", this.StopProcessingRules);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.AssignCategories.Count > 0) {
                jsonObject.Add("AssignCategories", this.AssignCategories.InternalToJson(service));
            }
            if (this.CopyToFolder !== null) {
                jsonObject.Add("CopyToFolder", this.CopyToFolder.InternalToJson(service));
            }
            if (this.Delete) {
                jsonObject.Add("Delete", this.Delete);
            }
            if (this.ForwardAsAttachmentToRecipients.Count > 0) {
                jsonObject.Add("ForwardAsAttachmentToRecipients", this.ForwardAsAttachmentToRecipients.InternalToJson(service));
            }
            if (this.ForwardToRecipients.Count > 0) {
                jsonObject.Add("ForwardToRecipients", this.ForwardToRecipients.InternalToJson(service));
            }
            if (this.MarkImportance !== null) {
                jsonObject.Add("MarkImportance", this.MarkImportance.Value);
            }
            if (this.MarkAsRead) {
                jsonObject.Add("MarkAsRead", this.MarkAsRead);
            }
            if (this.MoveToFolder !== null) {
                jsonObject.Add("MoveToFolder", this.MoveToFolder.InternalToJson(service));
            }
            if (this.PermanentDelete) {
                jsonObject.Add("PermanentDelete", this.PermanentDelete);
            }
            if (this.RedirectToRecipients.Count > 0) {
                jsonObject.Add("RedirectToRecipients", this.RedirectToRecipients.InternalToJson(service));
            }
            if (this.SendSMSAlertToRecipients.Count > 0) {
                var emailAddressCollection: EmailAddressCollection = RuleActions.ConvertSMSRecipientsFromMobilePhoneCollectionToEmailAddressCollection(this.SendSMSAlertToRecipients);
                jsonObject.Add("SendSMSAlertToRecipients", emailAddressCollection.InternalToJson(service));
            }
            if (this.ServerReplyWithMessage !== null) {
                jsonObject.Add("ServerReplyWithMessage", this.ServerReplyWithMessage.InternalToJson(service));
            }
            if (this.StopProcessingRules) {
                jsonObject.Add("StopProcessingRules", this.StopProcessingRules);
            }
            return jsonObject;
        }
        InternalValidate(): void {
            super.InternalValidate();
            EwsUtilities.ValidateParam(this.forwardAsAttachmentToRecipients, "ForwardAsAttachmentToRecipients");
            EwsUtilities.ValidateParam(this.forwardToRecipients, "ForwardToRecipients");
            EwsUtilities.ValidateParam(this.redirectToRecipients, "RedirectToRecipients");
            var enumerator: IEnumerator<MobilePhone> = this.sendSMSAlertToRecipients.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: MobilePhone = enumerator.Current;
                    EwsUtilities.ValidateParam(current, "SendSMSAlertToRecipient");
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        private static ConvertSMSRecipientsFromEmailAddressCollectionToMobilePhoneCollection(emailCollection: EmailAddressCollection): Collection<MobilePhone> {
            var collection: Collection<MobilePhone> = new Collection<MobilePhone>();
            var enumerator: IEnumerator<EmailAddress> = emailCollection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: EmailAddress = enumerator.Current;
                    collection.Add(new MobilePhone(current.Name, current.Address));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return collection;
        }
        private static ConvertSMSRecipientsFromMobilePhoneCollectionToEmailAddressCollection(recipientCollection: Collection<MobilePhone>): EmailAddressCollection {
            var emailAddressCollection: EmailAddressCollection = new EmailAddressCollection("Address");
            var enumerator: IEnumerator<MobilePhone> = recipientCollection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: MobilePhone = enumerator.Current;
                    var emailAddress: EmailAddress = new EmailAddress(current.Name, current.PhoneNumber, "MOBILE");
                    emailAddressCollection.Add(emailAddress);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return emailAddressCollection;
        }
    }
    class RulePredicates extends ComplexProperty {
        private categories: StringList = null;
        private containsBodyStrings: StringList = null;
        private containsHeaderStrings: StringList = null;
        private containsRecipientStrings: StringList = null;
        private containsSenderStrings: StringList = null;
        private containsSubjectOrBodyStrings: StringList = null;
        private containsSubjectStrings: StringList = null;
        private flaggedForAction: Nullable<FlaggedForAction> = null;
        private fromAddresses: EmailAddressCollection = null;
        private fromConnectedAccounts: StringList = null;
        private hasAttachments: boolean = false;
        private importance: Nullable<Importance> = null;
        private isApprovalRequest: boolean = false;
        private isAutomaticForward: boolean = false;
        private isAutomaticReply: boolean = false;
        private isEncrypted: boolean = false;
        private isMeetingRequest: boolean = false;
        private isMeetingResponse: boolean = false;
        private isNonDeliveryReport: boolean = false;
        private isPermissionControlled: boolean = false;
        private isSigned: boolean = false;
        private isVoicemail: boolean = false;
        private isReadReceipt: boolean = false;
        private itemClasses: StringList = null;
        private messageClassifications: StringList = null;
        private notSentToMe: boolean = false;
        private sentCcMe: boolean = false;
        private sentOnlyToMe: boolean = false;
        private sentToAddresses: EmailAddressCollection = null;
        private sentToMe: boolean = false;
        private sentToOrCcMe: boolean = false;
        private sensitivity: Nullable<Sensitivity> = null;
        private withinDateRange: RulePredicateDateRange = null;
        private withinSizeRange: RulePredicateSizeRange = null;
        get Categories(): StringList {
            return this.categories;
        }
        get ContainsBodyStrings(): StringList {
            return this.containsBodyStrings;
        }
        get ContainsHeaderStrings(): StringList {
            return this.containsHeaderStrings;
        }
        get ContainsRecipientStrings(): StringList {
            return this.containsRecipientStrings;
        }
        get ContainsSenderStrings(): StringList {
            return this.containsSenderStrings;
        }
        get ContainsSubjectOrBodyStrings(): StringList {
            return this.containsSubjectOrBodyStrings;
        }
        get ContainsSubjectStrings(): StringList {
            return this.containsSubjectStrings;
        }
        set FlaggedForAction(value: Nullable<FlaggedForAction>) {
            (() => {
                var _p0 = [
                    this.flaggedForAction
                ];
                var _r = this.SetFieldValue<Nullable<FlaggedForAction>>(_p0, value);
                this.flaggedForAction = _p0[0];
                return _r;
            })();
        }
        get FlaggedForAction(): Nullable<FlaggedForAction> {
            return this.flaggedForAction;
        }
        get FromAddresses(): EmailAddressCollection {
            return this.fromAddresses;
        }
        set HasAttachments(value: boolean) {
            (() => {
                var _p0 = [
                    this.hasAttachments
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.hasAttachments = _p0[0];
                return _r;
            })();
        }
        get HasAttachments(): boolean {
            return this.hasAttachments;
        }
        set Importance(value: Nullable<Importance>) {
            (() => {
                var _p0 = [
                    this.importance
                ];
                var _r = this.SetFieldValue<Nullable<Importance>>(_p0, value);
                this.importance = _p0[0];
                return _r;
            })();
        }
        get Importance(): Nullable<Importance> {
            return this.importance;
        }
        set IsApprovalRequest(value: boolean) {
            (() => {
                var _p0 = [
                    this.isApprovalRequest
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isApprovalRequest = _p0[0];
                return _r;
            })();
        }
        get IsApprovalRequest(): boolean {
            return this.isApprovalRequest;
        }
        set IsAutomaticForward(value: boolean) {
            (() => {
                var _p0 = [
                    this.isAutomaticForward
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isAutomaticForward = _p0[0];
                return _r;
            })();
        }
        get IsAutomaticForward(): boolean {
            return this.isAutomaticForward;
        }
        set IsAutomaticReply(value: boolean) {
            (() => {
                var _p0 = [
                    this.isAutomaticReply
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isAutomaticReply = _p0[0];
                return _r;
            })();
        }
        get IsAutomaticReply(): boolean {
            return this.isAutomaticReply;
        }
        set IsEncrypted(value: boolean) {
            (() => {
                var _p0 = [
                    this.isEncrypted
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isEncrypted = _p0[0];
                return _r;
            })();
        }
        get IsEncrypted(): boolean {
            return this.isEncrypted;
        }
        set IsMeetingRequest(value: boolean) {
            (() => {
                var _p0 = [
                    this.isMeetingRequest
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isMeetingRequest = _p0[0];
                return _r;
            })();
        }
        get IsMeetingRequest(): boolean {
            return this.isMeetingRequest;
        }
        set IsMeetingResponse(value: boolean) {
            (() => {
                var _p0 = [
                    this.isMeetingResponse
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isMeetingResponse = _p0[0];
                return _r;
            })();
        }
        get IsMeetingResponse(): boolean {
            return this.isMeetingResponse;
        }
        set IsNonDeliveryReport(value: boolean) {
            (() => {
                var _p0 = [
                    this.isNonDeliveryReport
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isNonDeliveryReport = _p0[0];
                return _r;
            })();
        }
        get IsNonDeliveryReport(): boolean {
            return this.isNonDeliveryReport;
        }
        set IsPermissionControlled(value: boolean) {
            (() => {
                var _p0 = [
                    this.isPermissionControlled
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isPermissionControlled = _p0[0];
                return _r;
            })();
        }
        get IsPermissionControlled(): boolean {
            return this.isPermissionControlled;
        }
        set IsSigned(value: boolean) {
            (() => {
                var _p0 = [
                    this.isSigned
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isSigned = _p0[0];
                return _r;
            })();
        }
        get IsSigned(): boolean {
            return this.isSigned;
        }
        set IsVoicemail(value: boolean) {
            (() => {
                var _p0 = [
                    this.isVoicemail
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isVoicemail = _p0[0];
                return _r;
            })();
        }
        get IsVoicemail(): boolean {
            return this.isVoicemail;
        }
        set IsReadReceipt(value: boolean) {
            (() => {
                var _p0 = [
                    this.isReadReceipt
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.isReadReceipt = _p0[0];
                return _r;
            })();
        }
        get IsReadReceipt(): boolean {
            return this.isReadReceipt;
        }
        get FromConnectedAccounts(): StringList {
            return this.fromConnectedAccounts;
        }
        get ItemClasses(): StringList {
            return this.itemClasses;
        }
        get MessageClassifications(): StringList {
            return this.messageClassifications;
        }
        set NotSentToMe(value: boolean) {
            (() => {
                var _p0 = [
                    this.notSentToMe
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.notSentToMe = _p0[0];
                return _r;
            })();
        }
        get NotSentToMe(): boolean {
            return this.notSentToMe;
        }
        set SentCcMe(value: boolean) {
            (() => {
                var _p0 = [
                    this.sentCcMe
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.sentCcMe = _p0[0];
                return _r;
            })();
        }
        get SentCcMe(): boolean {
            return this.sentCcMe;
        }
        set SentOnlyToMe(value: boolean) {
            (() => {
                var _p0 = [
                    this.sentOnlyToMe
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.sentOnlyToMe = _p0[0];
                return _r;
            })();
        }
        get SentOnlyToMe(): boolean {
            return this.sentOnlyToMe;
        }
        get SentToAddresses(): EmailAddressCollection {
            return this.sentToAddresses;
        }
        set SentToMe(value: boolean) {
            (() => {
                var _p0 = [
                    this.sentToMe
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.sentToMe = _p0[0];
                return _r;
            })();
        }
        get SentToMe(): boolean {
            return this.sentToMe;
        }
        set SentToOrCcMe(value: boolean) {
            (() => {
                var _p0 = [
                    this.sentToOrCcMe
                ];
                var _r = this.SetFieldValue<boolean>(_p0, value);
                this.sentToOrCcMe = _p0[0];
                return _r;
            })();
        }
        get SentToOrCcMe(): boolean {
            return this.sentToOrCcMe;
        }
        set Sensitivity(value: Nullable<Sensitivity>) {
            (() => {
                var _p0 = [
                    this.sensitivity
                ];
                var _r = this.SetFieldValue<Nullable<Sensitivity>>(_p0, value);
                this.sensitivity = _p0[0];
                return _r;
            })();
        }
        get Sensitivity(): Nullable<Sensitivity> {
            return this.sensitivity;
        }
        get WithinDateRange(): RulePredicateDateRange {
            return this.withinDateRange;
        }
        get WithinSizeRange(): RulePredicateSizeRange {
            return this.withinSizeRange;
        }
        constructor() {
            super();
            this.categories = new StringList();
            this.containsBodyStrings = new StringList();
            this.containsHeaderStrings = new StringList();
            this.containsRecipientStrings = new StringList();
            this.containsSenderStrings = new StringList();
            this.containsSubjectOrBodyStrings = new StringList();
            this.containsSubjectStrings = new StringList();
            this.fromAddresses = new EmailAddressCollection("Address");
            this.fromConnectedAccounts = new StringList();
            this.itemClasses = new StringList();
            this.messageClassifications = new StringList();
            this.sentToAddresses = new EmailAddressCollection("Address");
            this.withinDateRange = new RulePredicateDateRange();
            this.withinSizeRange = new RulePredicateSizeRange();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Categories":
                    this.categories.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsBodyStrings":
                    this.containsBodyStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsHeaderStrings":
                    this.containsHeaderStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsRecipientStrings":
                    this.containsRecipientStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsSenderStrings":
                    this.containsSenderStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsSubjectOrBodyStrings":
                    this.containsSubjectOrBodyStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "ContainsSubjectStrings":
                    this.containsSubjectStrings.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "FlaggedForAction":
                    this.flaggedForAction = new Nullable<FlaggedForAction>(reader.ReadElementValue<FlaggedForAction>());
                    return true;
                case "FromAddresses":
                    this.fromAddresses.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "FromConnectedAccounts":
                    this.fromConnectedAccounts.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "HasAttachments":
                    this.hasAttachments = reader.ReadElementValue<boolean>();
                    return true;
                case "Importance":
                    this.importance = new Nullable<Importance>(reader.ReadElementValue<Importance>());
                    return true;
                case "IsApprovalRequest":
                    this.isApprovalRequest = reader.ReadElementValue<boolean>();
                    return true;
                case "IsAutomaticForward":
                    this.isAutomaticForward = reader.ReadElementValue<boolean>();
                    return true;
                case "IsAutomaticReply":
                    this.isAutomaticReply = reader.ReadElementValue<boolean>();
                    return true;
                case "IsEncrypted":
                    this.isEncrypted = reader.ReadElementValue<boolean>();
                    return true;
                case "IsMeetingRequest":
                    this.isMeetingRequest = reader.ReadElementValue<boolean>();
                    return true;
                case "IsMeetingResponse":
                    this.isMeetingResponse = reader.ReadElementValue<boolean>();
                    return true;
                case "IsNDR":
                    this.isNonDeliveryReport = reader.ReadElementValue<boolean>();
                    return true;
                case "IsPermissionControlled":
                    this.isPermissionControlled = reader.ReadElementValue<boolean>();
                    return true;
                case "IsSigned":
                    this.isSigned = reader.ReadElementValue<boolean>();
                    return true;
                case "IsVoicemail":
                    this.isVoicemail = reader.ReadElementValue<boolean>();
                    return true;
                case "IsReadReceipt":
                    this.isReadReceipt = reader.ReadElementValue<boolean>();
                    return true;
                case "ItemClasses":
                    this.itemClasses.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "MessageClassifications":
                    this.messageClassifications.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "NotSentToMe":
                    this.notSentToMe = reader.ReadElementValue<boolean>();
                    return true;
                case "SentCcMe":
                    this.sentCcMe = reader.ReadElementValue<boolean>();
                    return true;
                case "SentOnlyToMe":
                    this.sentOnlyToMe = reader.ReadElementValue<boolean>();
                    return true;
                case "SentToAddresses":
                    this.sentToAddresses.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "SentToMe":
                    this.sentToMe = reader.ReadElementValue<boolean>();
                    return true;
                case "SentToOrCcMe":
                    this.sentToOrCcMe = reader.ReadElementValue<boolean>();
                    return true;
                case "Sensitivity":
                    this.sensitivity = new Nullable<Sensitivity>(reader.ReadElementValue<Sensitivity>());
                    return true;
                case "WithinDateRange":
                    this.withinDateRange.LoadFromXml(reader, reader.LocalName);
                    return true;
                case "WithinSizeRange":
                    this.withinSizeRange.LoadFromXml(reader, reader.LocalName);
                    return true;
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.Categories.Count > 0) {
                this.Categories.WriteToXml(writer, "Categories");
            }
            if (this.ContainsBodyStrings.Count > 0) {
                this.ContainsBodyStrings.WriteToXml(writer, "ContainsBodyStrings");
            }
            if (this.ContainsHeaderStrings.Count > 0) {
                this.ContainsHeaderStrings.WriteToXml(writer, "ContainsHeaderStrings");
            }
            if (this.ContainsRecipientStrings.Count > 0) {
                this.ContainsRecipientStrings.WriteToXml(writer, "ContainsRecipientStrings");
            }
            if (this.ContainsSenderStrings.Count > 0) {
                this.ContainsSenderStrings.WriteToXml(writer, "ContainsSenderStrings");
            }
            if (this.ContainsSubjectOrBodyStrings.Count > 0) {
                this.ContainsSubjectOrBodyStrings.WriteToXml(writer, "ContainsSubjectOrBodyStrings");
            }
            if (this.ContainsSubjectStrings.Count > 0) {
                this.ContainsSubjectStrings.WriteToXml(writer, "ContainsSubjectStrings");
            }
            if (this.FlaggedForAction !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "FlaggedForAction", this.FlaggedForAction.Value);
            }
            if (this.FromAddresses.Count > 0) {
                this.FromAddresses.WriteToXml(writer, "FromAddresses");
            }
            if (this.FromConnectedAccounts.Count > 0) {
                this.FromConnectedAccounts.WriteToXml(writer, "FromConnectedAccounts");
            }
            if (this.HasAttachments) {
                writer.WriteElementValue(XmlNamespace.Types, "HasAttachments", this.HasAttachments);
            }
            if (this.Importance !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "Importance", this.Importance.Value);
            }
            if (this.IsApprovalRequest) {
                writer.WriteElementValue(XmlNamespace.Types, "IsApprovalRequest", this.IsApprovalRequest);
            }
            if (this.IsAutomaticForward) {
                writer.WriteElementValue(XmlNamespace.Types, "IsAutomaticForward", this.IsAutomaticForward);
            }
            if (this.IsAutomaticReply) {
                writer.WriteElementValue(XmlNamespace.Types, "IsAutomaticReply", this.IsAutomaticReply);
            }
            if (this.IsEncrypted) {
                writer.WriteElementValue(XmlNamespace.Types, "IsEncrypted", this.IsEncrypted);
            }
            if (this.IsMeetingRequest) {
                writer.WriteElementValue(XmlNamespace.Types, "IsMeetingRequest", this.IsMeetingRequest);
            }
            if (this.IsMeetingResponse) {
                writer.WriteElementValue(XmlNamespace.Types, "IsMeetingResponse", this.IsMeetingResponse);
            }
            if (this.IsNonDeliveryReport) {
                writer.WriteElementValue(XmlNamespace.Types, "IsNDR", this.IsNonDeliveryReport);
            }
            if (this.IsPermissionControlled) {
                writer.WriteElementValue(XmlNamespace.Types, "IsPermissionControlled", this.IsPermissionControlled);
            }
            if (this.isReadReceipt) {
                writer.WriteElementValue(XmlNamespace.Types, "IsReadReceipt", this.IsReadReceipt);
            }
            if (this.IsSigned) {
                writer.WriteElementValue(XmlNamespace.Types, "IsSigned", this.IsSigned);
            }
            if (this.IsVoicemail) {
                writer.WriteElementValue(XmlNamespace.Types, "IsVoicemail", this.IsVoicemail);
            }
            if (this.ItemClasses.Count > 0) {
                this.ItemClasses.WriteToXml(writer, "ItemClasses");
            }
            if (this.MessageClassifications.Count > 0) {
                this.MessageClassifications.WriteToXml(writer, "MessageClassifications");
            }
            if (this.NotSentToMe) {
                writer.WriteElementValue(XmlNamespace.Types, "NotSentToMe", this.NotSentToMe);
            }
            if (this.SentCcMe) {
                writer.WriteElementValue(XmlNamespace.Types, "SentCcMe", this.SentCcMe);
            }
            if (this.SentOnlyToMe) {
                writer.WriteElementValue(XmlNamespace.Types, "SentOnlyToMe", this.SentOnlyToMe);
            }
            if (this.SentToAddresses.Count > 0) {
                this.SentToAddresses.WriteToXml(writer, "SentToAddresses");
            }
            if (this.SentToMe) {
                writer.WriteElementValue(XmlNamespace.Types, "SentToMe", this.SentToMe);
            }
            if (this.SentToOrCcMe) {
                writer.WriteElementValue(XmlNamespace.Types, "SentToOrCcMe", this.SentToOrCcMe);
            }
            if (this.Sensitivity !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "Sensitivity", this.Sensitivity.Value);
            }
            if (this.WithinDateRange.Start !== null || this.WithinDateRange.End !== null) {
                this.WithinDateRange.WriteToXml(writer, "WithinDateRange");
            }
            if (this.WithinSizeRange.MaximumSize !== null || this.WithinSizeRange.MinimumSize !== null) {
                this.WithinSizeRange.WriteToXml(writer, "WithinSizeRange");
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            EwsUtilities.ValidateParam(this.fromAddresses, "FromAddresses");
            EwsUtilities.ValidateParam(this.sentToAddresses, "SentToAddresses");
            EwsUtilities.ValidateParam(this.withinDateRange, "WithinDateRange");
            EwsUtilities.ValidateParam(this.withinSizeRange, "WithinSizeRange");
        }
    }
    class RulePredicateDateRange extends ComplexProperty {
        private start: Nullable<DateTime> = null;
        private end: Nullable<DateTime> = null;
        set Start(value: Nullable<DateTime>) {
            (() => {
                var _p0 = [
                    this.start
                ];
                var _r = this.SetFieldValue<Nullable<DateTime>>(_p0, value);
                this.start = _p0[0];
                return _r;
            })();
        }
        get Start(): Nullable<DateTime> {
            return this.start;
        }
        set End(value: Nullable<DateTime>) {
            (() => {
                var _p0 = [
                    this.end
                ];
                var _r = this.SetFieldValue<Nullable<DateTime>>(_p0, value);
                this.end = _p0[0];
                return _r;
            })();
        }
        get End(): Nullable<DateTime> {
            return this.end;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "StartDateTime") {
                    this.start = reader.ReadElementValueAsDateTime();
                    return true;
                }
                if (localName === "EndDateTime") {
                    this.end = reader.ReadElementValueAsDateTime();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "StartDateTime")) {
                            if (a === "EndDateTime") {
                                this.end = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current));
                            }
                        }
                        else {
                            this.start = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonProperty.ReadAsString(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.Start !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "StartDateTime", this.Start.Value);
            }
            if (this.End !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "EndDateTime", this.End.Value);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.Start !== null) {
                jsonObject.Add("StartDateTime", service.ConvertDateTimeToUniversalDateTimeString(this.Start.Value));
            }
            if (this.End !== null) {
                jsonObject.Add("EndDateTime", service.ConvertDateTimeToUniversalDateTimeString(this.End.Value));
            }
            return jsonObject;
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (this.start !== null && this.end !== null && DateTime.op_GreaterThan(this.start.Value, this.end.Value)) {
                throw new ServiceValidationException("Start date time cannot be bigger than end date time.");
            }
        }
    }
    class RulePredicateSizeRange extends ComplexProperty {
        private minimumSize: Nullable<number> = null;
        private maximumSize: Nullable<number> = null;
        set MinimumSize(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.minimumSize
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.minimumSize = _p0[0];
                return _r;
            })();
        }
        get MinimumSize(): Nullable<number> {
            return this.minimumSize;
        }
        set MaximumSize(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.maximumSize
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.maximumSize = _p0[0];
                return _r;
            })();
        }
        get MaximumSize(): Nullable<number> {
            return this.maximumSize;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "MinimumSize") {
                    this.minimumSize = new Nullable<number>(reader.ReadElementValue<number>());
                    return true;
                }
                if (localName === "MaximumSize") {
                    this.maximumSize = new Nullable<number>(reader.ReadElementValue<number>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "MinimumSize")) {
                            if (a === "MaximumSize") {
                                this.maximumSize = new Nullable<number>(jsonProperty.ReadAsInt(current));
                            }
                        }
                        else {
                            this.minimumSize = new Nullable<number>(jsonProperty.ReadAsInt(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.MinimumSize !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "MinimumSize", this.MinimumSize.Value);
            }
            if (this.MaximumSize !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "MaximumSize", this.MaximumSize.Value);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.MinimumSize !== null) {
                jsonObject.Add("MinimumSize", this.MinimumSize.Value);
            }
            if (this.MaximumSize !== null) {
                jsonObject.Add("MaximumSize", this.MaximumSize.Value);
            }
            return jsonObject;
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (this.minimumSize !== null && this.maximumSize !== null && this.minimumSize.Value > this.maximumSize.Value) {
                throw new ServiceValidationException("MinimumSize cannot be larger than MaximumSize.");
            }
        }
    }
    class RuleOperation extends ComplexProperty {
        XmlElementName: string = null;
        constructor() {
            super();
        }
    }
    class CreateRuleOperation extends RuleOperation {
        private rule: Rule = null;
        set Rule(value: Rule) {
            (() => {
                var _p0 = [
                    this.rule
                ];
                var _r = this.SetFieldValue<Rule>(_p0, value);
                this.rule = _p0[0];
                return _r;
            })();
        }
        get Rule(): Rule {
            return this.rule;
        }
        get XmlElementName(): string {
            return "CreateRuleOperation";
        }
        constructor();
        constructor(rule: Rule);
        constructor(rule?: Rule) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(rule);
        }
        private constructor_0(): void {
        }
        private constructor_1(rule: Rule): void {
            this.rule = rule;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.Rule.WriteToXml(writer, "Rule");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Rule", this.Rule.InternalToJson(service));
            return jsonObject;
        }
        InternalValidate(): void {
            EwsUtilities.ValidateParam(this.rule, "Rule");
        }
    }
    class DeleteRuleOperation extends RuleOperation {
        private ruleId: string = null;
        set RuleId(value: string) {
            (() => {
                var _p0 = [
                    this.ruleId
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.ruleId = _p0[0];
                return _r;
            })();
        }
        get RuleId(): string {
            return this.ruleId;
        }
        get XmlElementName(): string {
            return "DeleteRuleOperation";
        }
        constructor();
        constructor(ruleId: string);
        constructor(ruleId?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(ruleId);
        }
        private constructor_0(): void {
        }
        private constructor_1(ruleId: string): void {
            this.ruleId = ruleId;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "RuleId", this.RuleId);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("RuleId", this.RuleId);
            return jsonObject;
        }
        InternalValidate(): void {
            EwsUtilities.ValidateParam(this.ruleId, "RuleId");
        }
    }
    class SetClientExtensionAction extends ComplexProperty {
        private setClientExtensionActionId: SetClientExtensionActionId = 0;
        private extensionId: string = null;
        private clientExtension: ClientExtension = null;
        constructor(setClientExtensionActionId: SetClientExtensionActionId, extensionId: string, clientExtension: ClientExtension) {
            super();
            this.Namespace = XmlNamespace.Types;
            this.setClientExtensionActionId = setClientExtensionActionId;
            this.extensionId = extensionId;
            this.clientExtension = clientExtension;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("ActionId", this.setClientExtensionActionId);
            if (!NString.IsNullOrEmpty(this.extensionId)) {
                writer.WriteAttributeValue("ExtensionId", this.extensionId);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.clientExtension !== null) {
                this.clientExtension.WriteToXml(writer, XmlNamespace.Types, "ClientExtension");
            }
        }
    }
    class SetRuleOperation extends RuleOperation {
        private rule: Rule = null;
        set Rule(value: Rule) {
            (() => {
                var _p0 = [
                    this.rule
                ];
                var _r = this.SetFieldValue<Rule>(_p0, value);
                this.rule = _p0[0];
                return _r;
            })();
        }
        get Rule(): Rule {
            return this.rule;
        }
        get XmlElementName(): string {
            return "SetRuleOperation";
        }
        constructor();
        constructor(rule: Rule);
        constructor(rule?: Rule) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(rule);
        }
        private constructor_0(): void {
        }
        private constructor_1(rule: Rule): void {
            this.rule = rule;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Rule") {
                this.rule = new Rule();
                this.rule.LoadFromXml(reader, reader.LocalName);
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "Rule") {
                        this.rule = new Rule();
                        this.rule.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.Rule.WriteToXml(writer, "Rule");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Rule", this.Rule.InternalToJson(service));
            return jsonObject;
        }
        InternalValidate(): void {
            EwsUtilities.ValidateParam(this.rule, "Rule");
        }
    }
    class RuleOperationError extends ComplexProperty implements IEnumerable<RuleError>
    {
        private operationIndex: number = 0;
        private operation: RuleOperation = null;
        private ruleErrors: RuleErrorCollection = null;
        get Operation(): RuleOperation {
            return this.operation;
        }
        get Count(): number {
            return this.ruleErrors.Count;
        }
        get_Item(index: number): RuleError {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index");
            }
            return this.ruleErrors.get_Item(index);
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "OperationIndex") {
                    this.operationIndex = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "ValidationErrors") {
                    this.ruleErrors = new RuleErrorCollection();
                    this.ruleErrors.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            if (jsonProperty.ContainsKey("OperationIndex")) {
                this.operationIndex = jsonProperty.ReadAsInt("OperationIndex");
            }
            if (jsonProperty.ContainsKey("ValidationErrors")) {
                this.ruleErrors = new RuleErrorCollection();
                (<IJsonCollectionDeserializer>this.ruleErrors).CreateFromJsonCollection(jsonProperty.ReadAsArray("ValidationErrors"), service);
            }
        }
        SetOperationByIndex(operations: IEnumerator<RuleOperation>): void {
            operations.Reset();
            for (var i: number = 0; i <= this.operationIndex; i = i + 1) {
                operations.MoveNext();
            }
            this.operation = operations.Current;
        }
        GetEnumerator(): IEnumerator<RuleError> {
            return this.ruleErrors.GetEnumerator();
        }
    }
    class RuleOperationErrorCollection extends ComplexPropertyCollection<RuleOperationError>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): RuleOperationError {
            if (xmlElementName === "RuleOperationError") {
                return new RuleOperationError();
            }
            return null;
        }
        CreateDefaultComplexProperty(): RuleOperationError {
            return new RuleOperationError();
        }
        GetCollectionItemXmlElementName(operationError: RuleOperationError): string {
            return "RuleOperationError";
        }
    }
    class RuleError extends ComplexProperty {
        private ruleProperty: RuleProperty = 0;
        private errorCode: RuleErrorCode = 0;
        private errorMessage: string = null;
        private value: string = null;
        get RuleProperty(): RuleProperty {
            return this.ruleProperty;
        }
        get ErrorCode(): RuleErrorCode {
            return this.errorCode;
        }
        get ErrorMessage(): string {
            return this.errorMessage;
        }
        get Value(): string {
            return this.value;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "FieldURI") {
                    this.ruleProperty = reader.ReadElementValue<RuleProperty>();
                    return true;
                }
                if (localName === "ErrorCode") {
                    this.errorCode = reader.ReadElementValue<RuleErrorCode>();
                    return true;
                }
                if (localName === "ErrorMessage") {
                    this.errorMessage = reader.ReadElementValue();
                    return true;
                }
                if (localName === "FieldValue") {
                    this.value = reader.ReadElementValue();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            if (jsonProperty.ContainsKey("FieldURI")) {
                this.ruleProperty = jsonProperty.ReadEnumValue<RuleProperty>("FieldURI");
            }
            if (jsonProperty.ContainsKey("ErrorCode")) {
                this.errorCode = jsonProperty.ReadEnumValue<RuleErrorCode>("ErrorCode");
            }
            if (jsonProperty.ContainsKey("ErrorMessage")) {
                this.errorMessage = jsonProperty.ReadAsString("ErrorMessage");
            }
            if (jsonProperty.ContainsKey("FieldValue")) {
                this.value = jsonProperty.ReadAsString("FieldValue");
            }
        }
    }
    class RuleErrorCollection extends ComplexPropertyCollection<RuleError>
    {
        constructor() {
            super();
        }
        CreateComplexProperty(xmlElementName: string): RuleError {
            if (xmlElementName === "Error") {
                return new RuleError();
            }
            return null;
        }
        CreateDefaultComplexProperty(): RuleError {
            return new RuleError();
        }
        GetCollectionItemXmlElementName(ruleValidationError: RuleError): string {
            return "Error";
        }
    }
    class TextBody extends MessageBody {
        constructor();
        constructor(text: string);
        constructor(text?: string) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(BodyType.Text, text);
            this.constructor_1(text);
        }
        private constructor_0(): void {
        }
        private constructor_1(text: string): void {
        }
        static op_Implicit(textBody: string): TextBody {
            return new TextBody(textBody);
        }
    }
    class UrlEntity extends ExtractedEntity {
        Url: string = null;
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Url") {
                this.Url = reader.ReadElementValue();
                return true;
            }
            return super.TryReadElementFromXml(reader);
        }
    }
    class UrlEntityCollection extends ComplexPropertyCollection<UrlEntity>
    {
        constructor();
        constructor(collection: IEnumerable<UrlEntity>);
        constructor(collection?: IEnumerable<UrlEntity>) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super();
            this.constructor_1(collection);
        }
        private constructor_0(): void {
        }
        private constructor_1(collection: IEnumerable<UrlEntity>): void {
            if (collection !== null) {
                EwsUtilities.ForEach<UrlEntity>(collection, super.InternalAdd);
            }
        }
        CreateComplexProperty(xmlElementName: string): UrlEntity {
            return new UrlEntity();
        }
        CreateDefaultComplexProperty(): UrlEntity {
            return new UrlEntity();
        }
        GetCollectionItemXmlElementName(complexProperty: UrlEntity): string {
            return "Url";
        }
    }
    class CalendarEvent extends ComplexProperty {
        private startTime: DateTime = null;
        private endTime: DateTime = null;
        private freeBusyStatus: LegacyFreeBusyStatus = 0;
        private details: CalendarEventDetails = null;
        get StartTime(): DateTime {
            return this.startTime;
        }
        get EndTime(): DateTime {
            return this.endTime;
        }
        get FreeBusyStatus(): LegacyFreeBusyStatus {
            return this.freeBusyStatus;
        }
        get Details(): CalendarEventDetails {
            return this.details;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "StartTime") {
                    this.startTime = reader.ReadElementValueAsUnbiasedDateTimeScopedToServiceTimeZone();
                    return true;
                }
                if (localName === "EndTime") {
                    this.endTime = reader.ReadElementValueAsUnbiasedDateTimeScopedToServiceTimeZone();
                    return true;
                }
                if (localName === "BusyType") {
                    this.freeBusyStatus = reader.ReadElementValue<LegacyFreeBusyStatus>();
                    return true;
                }
                if (localName === "CalendarEventDetails") {
                    this.details = new CalendarEventDetails();
                    this.details.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "StartTime")) {
                            if (!(a === "EndTime")) {
                                if (!(a === "BusyType")) {
                                    if (a === "CalendarEventDetails") {
                                        this.details = new CalendarEventDetails();
                                        this.details.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                    }
                                }
                                else {
                                    this.freeBusyStatus = jsonProperty.ReadEnumValue<LegacyFreeBusyStatus>(current);
                                }
                            }
                            else {
                                this.endTime = EwsUtilities.ParseAsUnbiasedDatetimescopedToServicetimeZone(jsonProperty.ReadAsString(current), service);
                            }
                        }
                        else {
                            this.startTime = EwsUtilities.ParseAsUnbiasedDatetimescopedToServicetimeZone(jsonProperty.ReadAsString(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class CalendarEventDetails extends ComplexProperty {
        private storeId: string = null;
        private subject: string = null;
        private location: string = null;
        private isMeeting: boolean = false;
        private isRecurring: boolean = false;
        private isException: boolean = false;
        private isReminderSet: boolean = false;
        private isPrivate: boolean = false;
        get StoreId(): string {
            return this.storeId;
        }
        get Subject(): string {
            return this.subject;
        }
        get Location(): string {
            return this.location;
        }
        get IsMeeting(): boolean {
            return this.isMeeting;
        }
        get IsRecurring(): boolean {
            return this.isRecurring;
        }
        get IsException(): boolean {
            return this.isException;
        }
        get IsReminderSet(): boolean {
            return this.isReminderSet;
        }
        get IsPrivate(): boolean {
            return this.isPrivate;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "ID":
                    this.storeId = reader.ReadElementValue();
                    return true;
                case "Subject":
                    this.subject = reader.ReadElementValue();
                    return true;
                case "Location":
                    this.location = reader.ReadElementValue();
                    return true;
                case "IsMeeting":
                    this.isMeeting = reader.ReadElementValue<boolean>();
                    return true;
                case "IsRecurring":
                    this.isRecurring = reader.ReadElementValue<boolean>();
                    return true;
                case "IsException":
                    this.isException = reader.ReadElementValue<boolean>();
                    return true;
                case "IsReminderSet":
                    this.isReminderSet = reader.ReadElementValue<boolean>();
                    return true;
                case "IsPrivate":
                    this.isPrivate = reader.ReadElementValue<boolean>();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "ID":
                            this.storeId = jsonProperty.ReadAsString(current);
                            break;
                        case "Subject":
                            this.subject = jsonProperty.ReadAsString(current);
                            break;
                        case "Location":
                            this.location = jsonProperty.ReadAsString(current);
                            break;
                        case "IsMeeting":
                            this.isMeeting = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsRecurring":
                            this.isRecurring = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsException":
                            this.isException = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsReminderSet":
                            this.isReminderSet = jsonProperty.ReadAsBool(current);
                            break;
                        case "IsPrivate":
                            this.isPrivate = jsonProperty.ReadAsBool(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class Conflict extends ComplexProperty {
        private conflictType: ConflictType = 0;
        private numberOfMembers: number = 0;
        private numberOfMembersAvailable: number = 0;
        private numberOfMembersWithConflict: number = 0;
        private numberOfMembersWithNoData: number = 0;
        private freeBusyStatus: LegacyFreeBusyStatus = 0;
        get ConflictType(): ConflictType {
            return this.conflictType;
        }
        get NumberOfMembers(): number {
            return this.numberOfMembers;
        }
        get NumberOfMembersAvailable(): number {
            return this.numberOfMembersAvailable;
        }
        get NumberOfMembersWithConflict(): number {
            return this.numberOfMembersWithConflict;
        }
        get NumberOfMembersWithNoData(): number {
            return this.numberOfMembersWithNoData;
        }
        get FreeBusyStatus(): LegacyFreeBusyStatus {
            return this.freeBusyStatus;
        }
        constructor(conflictType: ConflictType) {
            super();
            this.conflictType = conflictType;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "NumberOfMembers") {
                    this.numberOfMembers = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "NumberOfMembersAvailable") {
                    this.numberOfMembersAvailable = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "NumberOfMembersWithConflict") {
                    this.numberOfMembersWithConflict = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "NumberOfMembersWithNoData") {
                    this.numberOfMembersWithNoData = reader.ReadElementValue<number>();
                    return true;
                }
                if (localName === "BusyType") {
                    this.freeBusyStatus = reader.ReadElementValue<LegacyFreeBusyStatus>();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "NumberOfMembers")) {
                            if (!(a === "NumberOfMembersAvailable")) {
                                if (!(a === "NumberOfMembersWithConflict")) {
                                    if (!(a === "NumberOfMembersWithNoData")) {
                                        if (a === "BusyType") {
                                            this.freeBusyStatus = jsonProperty.ReadEnumValue<LegacyFreeBusyStatus>(current);
                                        }
                                    }
                                    else {
                                        this.numberOfMembersWithNoData = jsonProperty.ReadAsInt(current);
                                    }
                                }
                                else {
                                    this.numberOfMembersWithConflict = jsonProperty.ReadAsInt(current);
                                }
                            }
                            else {
                                this.numberOfMembersAvailable = jsonProperty.ReadAsInt(current);
                            }
                        }
                        else {
                            this.numberOfMembers = jsonProperty.ReadAsInt(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class OofSettings extends ComplexProperty implements ISelfValidate {
        private state: OofState = 0;
        private externalAudience: OofExternalAudience = 0;
        private allowExternalOof: OofExternalAudience = 0;
        private duration: TimeWindow = null;
        private internalReply: OofReply = null;
        private externalReply: OofReply = null;
        set State(value: OofState) {
            this.state = value;
        }
        get State(): OofState {
            return this.state;
        }
        set ExternalAudience(value: OofExternalAudience) {
            this.externalAudience = value;
        }
        get ExternalAudience(): OofExternalAudience {
            return this.externalAudience;
        }
        set Duration(value: TimeWindow) {
            this.duration = value;
        }
        get Duration(): TimeWindow {
            return this.duration;
        }
        set InternalReply(value: OofReply) {
            this.internalReply = value;
        }
        get InternalReply(): OofReply {
            return this.internalReply;
        }
        set ExternalReply(value: OofReply) {
            this.externalReply = value;
        }
        get ExternalReply(): OofReply {
            return this.externalReply;
        }
        set AllowExternalOof(value: OofExternalAudience) {
            this.allowExternalOof = value;
        }
        get AllowExternalOof(): OofExternalAudience {
            return this.allowExternalOof;
        }
        private SerializeOofReply(oofReply: OofReply, writer: EwsServiceXmlWriter, xmlElementName: string): void {
            if (oofReply !== null) {
                oofReply.WriteToXml(writer, xmlElementName);
                return;
            }
            OofReply.WriteEmptyReplyToXml(writer, xmlElementName);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "OofState") {
                    this.state = reader.ReadValue<OofState>();
                    return true;
                }
                if (localName === "ExternalAudience") {
                    this.externalAudience = reader.ReadValue<OofExternalAudience>();
                    return true;
                }
                if (localName === "Duration") {
                    this.duration = new TimeWindow();
                    this.duration.LoadFromXml(reader);
                    return true;
                }
                if (localName === "InternalReply") {
                    this.internalReply = new OofReply();
                    this.internalReply.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "ExternalReply") {
                    this.externalReply = new OofReply();
                    this.externalReply.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "OofState")) {
                            if (!(a === "ExternalAudience")) {
                                if (!(a === "Duration")) {
                                    if (!(a === "InternalReply")) {
                                        if (a === "ExternalReply") {
                                            this.externalReply = new OofReply();
                                            this.externalReply.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                        }
                                    }
                                    else {
                                        this.internalReply = new OofReply();
                                        this.internalReply.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                    }
                                }
                                else {
                                    this.duration = new TimeWindow();
                                    this.duration.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                }
                            }
                            else {
                                this.externalAudience = jsonProperty.ReadEnumValue<OofExternalAudience>(current);
                            }
                        }
                        else {
                            this.state = jsonProperty.ReadEnumValue<OofState>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "OofState", this.State);
            writer.WriteElementValue(XmlNamespace.Types, "ExternalAudience", this.ExternalAudience);
            if (this.Duration !== null && this.State === OofState.Scheduled) {
                this.Duration.WriteToXml(writer, "Duration");
            }
            this.SerializeOofReply(this.InternalReply, writer, "InternalReply");
            this.SerializeOofReply(this.ExternalReply, writer, "ExternalReply");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("OofState", this.State);
            jsonObject.Add("ExternalAudience", this.ExternalAudience);
            if (this.Duration !== null && this.State === OofState.Scheduled) {
                jsonObject.Add("Duration", this.Duration.InternalToJson(service));
            }
            if (this.InternalReply !== null) {
                jsonObject.Add("InternalReply", this.InternalReply.InternalToJson(service));
            }
            if (this.ExternalReply !== null) {
                jsonObject.Add("ExternalReply", this.ExternalReply.InternalToJson(service));
            }
            return jsonObject;
        }
        Validate(): void {
            if (this.State === OofState.Scheduled) {
                if (this.Duration === null) {
                    throw new ArgumentException(Strings.DurationMustBeSpecifiedWhenScheduled);
                }
                EwsUtilities.ValidateParam(this.Duration, "Duration");
            }
        }
        constructor() {
            super();
        }
    }
    class Suggestion extends ComplexProperty {
        private date: DateTime = null;
        private quality: SuggestionQuality = 0;
        private timeSuggestions: Collection<TimeSuggestion> = new Collection<TimeSuggestion>();
        get Date(): DateTime {
            return this.date;
        }
        get Quality(): SuggestionQuality {
            return this.quality;
        }
        get TimeSuggestions(): Collection<TimeSuggestion> {
            return this.timeSuggestions;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Date") {
                    var dateTime: DateTime = DateTime.Parse(reader.ReadElementValue(), CultureInfo.InvariantCulture);
                    if (dateTime.Kind !== DateTimeKind.Unspecified) {
                        this.date = new DateTime(dateTime.Ticks, DateTimeKind.Unspecified);
                    }
                    else {
                        this.date = dateTime;
                    }
                    return true;
                }
                if (localName === "DayQuality") {
                    this.quality = reader.ReadElementValue<SuggestionQuality>();
                    return true;
                }
                if (localName === "SuggestionArray") {
                    if (!reader.IsEmptyElement) {
                        do {
                            reader.Read();
                            if (reader.IsStartElement(XmlNamespace.Types, "Suggestion")) {
                                var timeSuggestion: TimeSuggestion = new TimeSuggestion();
                                timeSuggestion.LoadFromXml(reader, reader.LocalName);
                                this.timeSuggestions.Add(timeSuggestion);
                            }
                        }
                        while (!reader.IsEndElement(XmlNamespace.Types, "SuggestionArray"));
                    }
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.date = DateTime.Parse(jsonProperty.ReadAsString("Date"));
            this.quality = jsonProperty.ReadEnumValue<SuggestionQuality>("DayQuality");
            var array: any[] = jsonProperty.ReadAsArray("SuggestionArray");
            for (var i: number = 0; i < array.length; i = i + 1) {
                var obj: any = array[i];
                var timeSuggestion: TimeSuggestion = new TimeSuggestion();
                timeSuggestion.LoadFromJson(((obj instanceof JsonObject) ? <JsonObject>obj : null), service);
                this.timeSuggestions.Add(timeSuggestion);
            }
        }
    }
    class TimeSuggestion extends ComplexProperty {
        private meetingTime: DateTime = null;
        private isWorkTime: boolean = false;
        private quality: SuggestionQuality = 0;
        private conflicts: Collection<Conflict> = new Collection<Conflict>();
        get MeetingTime(): DateTime {
            return this.meetingTime;
        }
        get IsWorkTime(): boolean {
            return this.isWorkTime;
        }
        get Quality(): SuggestionQuality {
            return this.quality;
        }
        get Conflicts(): Collection<Conflict> {
            return this.conflicts;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "MeetingTime") {
                    this.meetingTime = reader.ReadElementValueAsUnbiasedDateTimeScopedToServiceTimeZone();
                    return true;
                }
                if (localName === "IsWorkTime") {
                    this.isWorkTime = reader.ReadElementValue<boolean>();
                    return true;
                }
                if (localName === "SuggestionQuality") {
                    this.quality = reader.ReadElementValue<SuggestionQuality>();
                    return true;
                }
                if (localName === "AttendeeConflictDataArray") {
                    if (!reader.IsEmptyElement) {
                        do {
                            var IL_126: number = 1;
                            var _goto: number = 0;
                            _GOTO_LOOP:
                            while (true) {
                                switch (_goto) {
                                    default:
                                        reader.Read();
                                        if (reader.IsStartElement()) {
                                            var conflict: Conflict = null;
                                            var localName2: string;
                                            if ((localName2 = reader.LocalName) === null) {
                                                EwsUtilities.Assert(false, "TimeSuggestion.TryReadElementFromXml", NString.Format("The {0} element name does not map to any AttendeeConflict descendant.", reader.LocalName));
                                                conflict.LoadFromXml(reader, reader.LocalName);
                                                this.conflicts.Add(conflict);
                                                _goto = IL_126;
                                                continue _GOTO_LOOP;
                                            }
                                            if (!(localName2 === "UnknownAttendeeConflictData")) {
                                                if (!(localName2 === "TooBigGroupAttendeeConflictData")) {
                                                    if (!(localName2 === "IndividualAttendeeConflictData")) {
                                                        if (!(localName2 === "GroupAttendeeConflictData")) {
                                                            EwsUtilities.Assert(false, "TimeSuggestion.TryReadElementFromXml", NString.Format("The {0} element name does not map to any AttendeeConflict descendant.", reader.LocalName));
                                                            conflict.LoadFromXml(reader, reader.LocalName);
                                                            this.conflicts.Add(conflict);
                                                            _goto = IL_126;
                                                            continue _GOTO_LOOP;
                                                        }
                                                        conflict = new Conflict(ConflictType.GroupConflict);
                                                    }
                                                    else {
                                                        conflict = new Conflict(ConflictType.IndividualAttendeeConflict);
                                                    }
                                                }
                                                else {
                                                    conflict = new Conflict(ConflictType.GroupTooBigConflict);
                                                }
                                            }
                                            else {
                                                conflict = new Conflict(ConflictType.UnknownAttendeeConflict);
                                            }
                                            conflict.LoadFromXml(reader, reader.LocalName);
                                            this.conflicts.Add(conflict);
                                            _goto = IL_126;
                                            continue _GOTO_LOOP;
                                        }
                                        _goto = IL_126;
                                        continue _GOTO_LOOP;
                                    case 1:
                                        break _GOTO_LOOP;
                                }
                            }
                        }
                        while (!reader.IsEndElement(XmlNamespace.Types, "AttendeeConflictDataArray"));
                    }
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "MeetingTime")) {
                            if (!(a === "IsWorkTime")) {
                                if (!(a === "SuggestionQuality")) {
                                    if (a === "AttendeeConflictDataArray") {
                                        var array: any[] = jsonProperty.ReadAsArray(current);
                                        var array2: any[] = array;
                                        for (var i: number = 0; i < array2.length; i = i + 1) {
                                            var IL_163: number = 1;
                                            var _goto: number = 0;
                                            _GOTO_LOOP:
                                            while (true) {
                                                switch (_goto) {
                                                    default:
                                                        var obj: any = array2[i];
                                                        var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                                        if (jsonObject !== null) {
                                                            var conflict: Conflict = null;
                                                            var a2: string;
                                                            if ((a2 = jsonObject.ReadTypeString()) === null) {
                                                                EwsUtilities.Assert(false, "TimeSuggestion.TryReadElementFromJson", NString.Format("The {0} element name does not map to any AttendeeConflict descendant.", jsonObject.ReadTypeString()));
                                                                conflict.LoadFromJson(jsonObject, service);
                                                                this.conflicts.Add(conflict);
                                                                _goto = IL_163;
                                                                continue _GOTO_LOOP;
                                                            }
                                                            if (!(a2 === "UnknownAttendeeConflictData")) {
                                                                if (!(a2 === "TooBigGroupAttendeeConflictData")) {
                                                                    if (!(a2 === "IndividualAttendeeConflictData")) {
                                                                        if (!(a2 === "GroupAttendeeConflictData")) {
                                                                            EwsUtilities.Assert(false, "TimeSuggestion.TryReadElementFromJson", NString.Format("The {0} element name does not map to any AttendeeConflict descendant.", jsonObject.ReadTypeString()));
                                                                            conflict.LoadFromJson(jsonObject, service);
                                                                            this.conflicts.Add(conflict);
                                                                            _goto = IL_163;
                                                                            continue _GOTO_LOOP;
                                                                        }
                                                                        conflict = new Conflict(ConflictType.GroupConflict);
                                                                    }
                                                                    else {
                                                                        conflict = new Conflict(ConflictType.IndividualAttendeeConflict);
                                                                    }
                                                                }
                                                                else {
                                                                    conflict = new Conflict(ConflictType.GroupTooBigConflict);
                                                                }
                                                            }
                                                            else {
                                                                conflict = new Conflict(ConflictType.UnknownAttendeeConflict);
                                                            }
                                                            conflict.LoadFromJson(jsonObject, service);
                                                            this.conflicts.Add(conflict);
                                                            _goto = IL_163;
                                                            continue _GOTO_LOOP;
                                                        }
                                                        _goto = IL_163;
                                                        continue _GOTO_LOOP;
                                                    case 1:
                                                        break _GOTO_LOOP;
                                                }
                                            }
                                        }
                                    }
                                }
                                else {
                                    this.quality = jsonProperty.ReadEnumValue<SuggestionQuality>(current);
                                }
                            }
                            else {
                                this.isWorkTime = jsonProperty.ReadAsBool(current);
                            }
                        }
                        else {
                            this.meetingTime = EwsUtilities.ParseAsUnbiasedDatetimescopedToServicetimeZone(jsonProperty.ReadAsString(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class WorkingHours extends ComplexProperty {
        private timeZone: TimeZoneInfo = null;
        private daysOfTheWeek: Collection<DayOfTheWeek> = new Collection<DayOfTheWeek>();
        private startTime: TimeSpan = null;
        private endTime: TimeSpan = null;
        get TimeZone(): TimeZoneInfo {
            return this.timeZone;
        }
        get DaysOfTheWeek(): Collection<DayOfTheWeek> {
            return this.daysOfTheWeek;
        }
        get StartTime(): TimeSpan {
            return this.startTime;
        }
        get EndTime(): TimeSpan {
            return this.endTime;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "TimeZone") {
                    var legacyAvailabilityTimeZone: LegacyAvailabilityTimeZone = new LegacyAvailabilityTimeZone();
                    legacyAvailabilityTimeZone.LoadFromXml(reader, reader.LocalName);
                    this.timeZone = legacyAvailabilityTimeZone.ToTimeZoneInfo();
                    return true;
                }
                if (localName === "WorkingPeriodArray") {
                    var list: List<WorkingPeriod> = new List<WorkingPeriod>();
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "WorkingPeriod")) {
                            var workingPeriod: WorkingPeriod = new WorkingPeriod();
                            workingPeriod.LoadFromXml(reader, reader.LocalName);
                            list.Add(workingPeriod);
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "WorkingPeriodArray"));
                    this.startTime = list.get_Item(0).StartTime;
                    this.endTime = list.get_Item(0).EndTime;
                    var enumerator: List_Enumerator<WorkingPeriod> = list.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var arg_C7_0: WorkingPeriod = enumerator.Current;
                            var enumerator2: IEnumerator<DayOfTheWeek> = list.get_Item(0).DaysOfWeek.GetEnumerator();
                            try {
                                while (enumerator2.MoveNext()) {
                                    var current: DayOfTheWeek = enumerator2.Current;
                                    if (!this.daysOfTheWeek.Contains(current)) {
                                        this.daysOfTheWeek.Add(current);
                                    }
                                }
                            }
                            finally {
                                if (enumerator2 !== null) {
                                    enumerator2.Dispose();
                                }
                            }
                        }
                    }
                    finally {
                        (<IDisposable>enumerator).Dispose();
                    }
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "TimeZone")) {
                            if (a === "WorkingPeriodArray") {
                                var list: List<WorkingPeriod> = new List<WorkingPeriod>();
                                var array: any[] = jsonProperty.ReadAsArray(current);
                                var array2: any[] = array;
                                for (var i: number = 0; i < array2.length; i = i + 1) {
                                    var obj: any = array2[i];
                                    var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                    if (jsonObject !== null) {
                                        var workingPeriod: WorkingPeriod = new WorkingPeriod();
                                        workingPeriod.LoadFromJson(jsonObject, service);
                                        list.Add(workingPeriod);
                                    }
                                }
                                this.startTime = list.get_Item(0).StartTime;
                                this.endTime = list.get_Item(0).EndTime;
                                var enumerator2: List_Enumerator<WorkingPeriod> = list.GetEnumerator();
                                try {
                                    while (enumerator2.MoveNext()) {
                                        var arg_EF_0: WorkingPeriod = enumerator2.Current;
                                        var enumerator3: IEnumerator<DayOfTheWeek> = list.get_Item(0).DaysOfWeek.GetEnumerator();
                                        try {
                                            while (enumerator3.MoveNext()) {
                                                var current2: DayOfTheWeek = enumerator3.Current;
                                                if (!this.daysOfTheWeek.Contains(current2)) {
                                                    this.daysOfTheWeek.Add(current2);
                                                }
                                            }
                                        }
                                        finally {
                                            if (enumerator3 !== null) {
                                                enumerator3.Dispose();
                                            }
                                        }
                                    }
                                }
                                finally {
                                    (<IDisposable>enumerator2).Dispose();
                                }
                            }
                        }
                        else {
                            var legacyAvailabilityTimeZone: LegacyAvailabilityTimeZone = new LegacyAvailabilityTimeZone();
                            legacyAvailabilityTimeZone.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            this.timeZone = legacyAvailabilityTimeZone.ToTimeZoneInfo();
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class WorkingPeriod extends ComplexProperty {
        private daysOfWeek: Collection<DayOfTheWeek> = new Collection<DayOfTheWeek>();
        private startTime: TimeSpan = null;
        private endTime: TimeSpan = null;
        get DaysOfWeek(): Collection<DayOfTheWeek> {
            return this.daysOfWeek;
        }
        get StartTime(): TimeSpan {
            return this.startTime;
        }
        get EndTime(): TimeSpan {
            return this.endTime;
        }
        constructor() {
            super();
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DayOfWeek") {
                    EwsUtilities.ParseEnumValueList<DayOfTheWeek>(this.daysOfWeek, reader.ReadElementValue(), [
                        32
                    ]/*' '*/);
                    return true;
                }
                if (localName === "StartTimeInMinutes") {
                    this.startTime = TimeSpan.FromMinutes(<number>reader.ReadElementValue<number>());
                    return true;
                }
                if (localName === "EndTimeInMinutes") {
                    this.endTime = TimeSpan.FromMinutes(<number>reader.ReadElementValue<number>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DayOfWeek")) {
                            if (!(a === "StartTimeInMinutes")) {
                                if (a === "EndTimeInMinutes") {
                                    this.endTime = TimeSpan.FromMinutes(<number>jsonProperty.ReadAsInt(current));
                                }
                            }
                            else {
                                this.startTime = TimeSpan.FromMinutes(<number>jsonProperty.ReadAsInt(current));
                            }
                        }
                        else {
                            EwsUtilities.ParseEnumValueList<DayOfTheWeek>(this.daysOfWeek, jsonProperty.ReadAsString(current), [
                                32
                            ]/*' '*/);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class DayOfTheWeekCollection extends ComplexProperty implements IEnumerable<DayOfTheWeek>
    {
        private items: List<DayOfTheWeek> = new List<DayOfTheWeek>();
        get_Item(index: number): DayOfTheWeek {
            return this.items.get_Item(index);
        }
        get Count(): number {
            return this.items.Count;
        }
        constructor() {
            super();
        }
        private ToString(separator: string): string;
        private ToString(): string;
        private ToString(separator?: string): string {
            if (arguments.length === 1 && (separator === null || separator.constructor === String)) {
                return this.ToString_0(separator);
            }
            return this.ToString_1();
        }
        private ToString_0(separator: string): string {
            if (this.Count === 0) {
                return NString.Empty;
            }
            var array: string[] = new Array<string>(this.Count);
            for (var i: number = 0; i < this.Count; i = i + 1) {
                array[i] = this.get_Item(i).ToString();
            }
            return NString.Join(separator, array);
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, xmlElementName);
            EwsUtilities.ParseEnumValueList<DayOfTheWeek>(this.items, reader.ReadElementValue(), [
                32
            ]/*' '*/);
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            throw new InvalidOperationException();
        }
        LoadFromJsonValue(jsonValue: string): void {
            EwsUtilities.ParseEnumValueList<DayOfTheWeek>(this.items, jsonValue, [
                32
            ]/*' '*/);
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            var value: string = this.ToString(" ");
            if (!NString.IsNullOrEmpty(value)) {
                writer.WriteElementValue(XmlNamespace.Types, "DaysOfWeek", value);
            }
        }
        InternalToJson(service: ExchangeService): any {
            return this.ToString(" ");
        }
        private ToString_1(): string {
            return this.ToString(",");
        }
        Add(dayOfTheWeek: DayOfTheWeek): void {
            if (!this.items.Contains(dayOfTheWeek)) {
                this.items.Add(dayOfTheWeek);
                this.Changed();
            }
        }
        AddRange(daysOfTheWeek: IEnumerable<DayOfTheWeek>): void {
            var enumerator: IEnumerator<DayOfTheWeek> = daysOfTheWeek.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DayOfTheWeek = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        Clear(): void {
            if (this.Count > 0) {
                this.items.Clear();
                this.Changed();
            }
        }
        Remove(dayOfTheWeek: DayOfTheWeek): boolean {
            var flag: boolean = this.items.Remove(dayOfTheWeek);
            if (flag) {
                this.Changed();
            }
            return flag;
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            this.items.RemoveAt(index);
            this.Changed();
        }
        GetEnumerator(): IEnumerator<DayOfTheWeek> {
            return this.items.GetEnumerator();
        }
    }
    class Recurrence extends ComplexProperty {
        startDate: Nullable<DateTime> = null;
        numberOfOccurrences: Nullable<number> = null;
        endDate: Nullable<DateTime> = null;
        XmlElementName: string = null;
        get IsRegenerationPattern(): boolean {
            return false;
        }
        set StartDate(value: DateTime) {
            this.startDate = new Nullable<DateTime>(value);
        }
        get StartDate(): DateTime {
            return this.GetFieldValueOrThrowIfNull<DateTime>(this.startDate, "StartDate");
        }
        get HasEnd(): boolean {
            return this.numberOfOccurrences !== null || this.endDate !== null;
        }
        set NumberOfOccurrences(value: Nullable<number>) {
            if (value < 1) {
                throw new ArgumentException(Strings.NumberOfOccurrencesMustBeGreaterThanZero);
            }
            (() => {
                var _p0 = [
                    this.numberOfOccurrences
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.numberOfOccurrences = _p0[0];
                return _r;
            })();
            this.endDate = null;
        }
        get NumberOfOccurrences(): Nullable<number> {
            return this.numberOfOccurrences;
        }
        set EndDate(value: Nullable<DateTime>) {
            (() => {
                var _p0 = [
                    this.endDate
                ];
                var _r = this.SetFieldValue<Nullable<DateTime>>(_p0, value);
                this.endDate = _p0[0];
                return _r;
            })();
            this.numberOfOccurrences = null;
        }
        get EndDate(): Nullable<DateTime> {
            return this.endDate;
        }
        constructor();
        constructor(startDate: DateTime);
        constructor(startDate?: DateTime) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime): void {
            this.constructor_0();
            this.startDate = new Nullable<DateTime>(startDate);
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.XmlElementName);
            this.InternalWritePropertiesToXml(writer);
            writer.WriteEndElement();
            var recurrenceRange: RecurrenceRange;
            if (!this.HasEnd) {
                recurrenceRange = new NoEndRecurrenceRange(this.StartDate);
            }
            else {
                if (this.NumberOfOccurrences !== null) {
                    recurrenceRange = new NumberedRecurrenceRange(this.StartDate, this.NumberOfOccurrences);
                }
                else {
                    recurrenceRange = new EndDateRecurrenceRange(this.StartDate, this.EndDate.Value);
                }
            }
            recurrenceRange.WriteToXml(writer, recurrenceRange.XmlElementName);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("RecurrencePattern", this.PatternToJson(service));
            jsonObject.Add("RecurrenceRange", this.RangeToJson(service));
            return jsonObject;
        }
        RangeToJson(service: ExchangeService): any {
            var recurrenceRange: RecurrenceRange;
            if (!this.HasEnd) {
                recurrenceRange = new NoEndRecurrenceRange(this.StartDate);
            }
            else {
                if (this.NumberOfOccurrences !== null) {
                    recurrenceRange = new NumberedRecurrenceRange(this.StartDate, this.NumberOfOccurrences);
                }
                else {
                    recurrenceRange = new EndDateRecurrenceRange(this.StartDate, this.EndDate.Value);
                }
            }
            return recurrenceRange.InternalToJson(service);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            throw new NotSupportedException();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
        }
        GetFieldValueOrThrowIfNull<T>(value: Nullable<T>, name: string): T {
            if (value !== null) {
                return value.Value;
            }
            throw new ServiceValidationException(NString.Format(Strings.PropertyValueMustBeSpecifiedForRecurrencePattern, name));
        }
        NeverEnds(): void {
            this.numberOfOccurrences = null;
            this.endDate = null;
            this.Changed();
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (!(this.startDate !== null)) {
                throw new ServiceValidationException(Strings.RecurrencePatternMustHaveStartDate);
            }
        }
        IsSame(otherRecurrence: Recurrence): boolean {
            if (otherRecurrence === null) {
                return false;
            }
            var memoryStream: MemoryStream = new MemoryStream();
            var a: string;
            try {
                (<JsonObject>this.InternalToJson(null)).SerializeToJson(memoryStream);
                memoryStream.Position = 0;
                var streamReader: StreamReader = new StreamReader(memoryStream);
                try {
                    a = streamReader.ReadToEnd();
                }
                finally {
                    if (streamReader !== null) {
                        (<IDisposable>streamReader).Dispose();
                    }
                }
            }
            finally {
                if (memoryStream !== null) {
                    (<IDisposable>memoryStream).Dispose();
                }
            }
            var memoryStream2: MemoryStream = new MemoryStream();
            var b: string;
            try {
                (<JsonObject>otherRecurrence.InternalToJson(null)).SerializeToJson(memoryStream2);
                memoryStream2.Position = 0;
                var streamReader2: StreamReader = new StreamReader(memoryStream2);
                try {
                    b = streamReader2.ReadToEnd();
                }
                finally {
                    if (streamReader2 !== null) {
                        (<IDisposable>streamReader2).Dispose();
                    }
                }
            }
            finally {
                if (memoryStream2 !== null) {
                    (<IDisposable>memoryStream2).Dispose();
                }
            }
            return NString.Equals(a, b, StringComparison.Ordinal);
        }
    }
    class Recurrence_IntervalPattern extends Recurrence {
        private interval: number = 1;
        set Interval(value: number) {
            if (value < 1) {
                throw new ArgumentOutOfRangeException("value", Strings.IntervalMustBeGreaterOrEqualToOne);
            }
            (() => {
                var _p0 = [
                    this.interval
                ];
                var _r = this.SetFieldValue<number>(_p0, value);
                this.interval = _p0[0];
                return _r;
            })();
        }
        get Interval(): number {
            return this.interval;
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
            if (interval < 1) {
                throw new ArgumentOutOfRangeException("interval", Strings.IntervalMustBeGreaterOrEqualToOne);
            }
            this.Interval = interval;
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "Interval", this.Interval);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.XmlElementName);
            jsonObject.Add("Interval", this.Interval);
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "Interval") {
                this.interval = reader.ReadElementValue<number>();
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "Interval") {
                        this.interval = jsonProperty.ReadAsInt(current);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class Recurrence_YearlyRegenerationPattern extends Recurrence_IntervalPattern {
        get XmlElementName(): string {
            return "YearlyRegeneration";
        }
        get IsRegenerationPattern(): boolean {
            return true;
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate, interval);
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
        }
    }
    class Recurrence_YearlyPattern extends Recurrence {
        private month: Nullable<Month> = null;
        private dayOfMonth: Nullable<number> = null;
        get XmlElementName(): string {
            return "AbsoluteYearlyRecurrence";
        }
        set Month(value: Month) {
            (() => {
                var _p0 = [
                    this.month
                ];
                var _r = this.SetFieldValue<Nullable<Month>>(_p0, new Nullable<Month>(value));
                this.month = _p0[0];
                return _r;
            })();
        }
        get Month(): Month {
            return super.GetFieldValueOrThrowIfNull<Month>(this.month, "Month");
        }
        set DayOfMonth(value: number) {
            if (value < 1 || value > 31) {
                throw new ArgumentOutOfRangeException("DayOfMonth", Strings.DayOfMonthMustBeBetween1And31);
            }
            (() => {
                var _p0 = [
                    this.dayOfMonth
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, new Nullable<number>(value));
                this.dayOfMonth = _p0[0];
                return _r;
            })();
        }
        get DayOfMonth(): number {
            return super.GetFieldValueOrThrowIfNull<number>(this.dayOfMonth, "DayOfMonth");
        }
        constructor();
        constructor(startDate: DateTime, month: Month, dayOfMonth: number);
        constructor(startDate?: DateTime, month?: Month, dayOfMonth?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, month, dayOfMonth);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, month: Month, dayOfMonth: number): void {
            this.Month = month;
            this.DayOfMonth = dayOfMonth;
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DayOfMonth", this.DayOfMonth);
            writer.WriteElementValue(XmlNamespace.Types, "Month", this.Month);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.XmlElementName);
            jsonObject.Add("DayOfMonth", this.DayOfMonth);
            jsonObject.Add("Month", this.Month);
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DayOfMonth") {
                    this.dayOfMonth = new Nullable<number>(reader.ReadElementValue<number>());
                    return true;
                }
                if (localName === "Month") {
                    this.month = new Nullable<Month>(reader.ReadElementValue<Month>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DayOfMonth")) {
                            if (a === "Month") {
                                this.month = new Nullable<Month>(jsonProperty.ReadEnumValue<Month>(current));
                            }
                        }
                        else {
                            this.dayOfMonth = new Nullable<number>(jsonProperty.ReadAsInt(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (!(this.month !== null)) {
                throw new ServiceValidationException(Strings.MonthMustBeSpecifiedForRecurrencePattern);
            }
            if (!(this.dayOfMonth !== null)) {
                throw new ServiceValidationException(Strings.DayOfMonthMustBeSpecifiedForRecurrencePattern);
            }
        }
    }
    class Recurrence_WeeklyRegenerationPattern extends Recurrence_IntervalPattern {
        get XmlElementName(): string {
            return "WeeklyRegeneration";
        }
        get IsRegenerationPattern(): boolean {
            return true;
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate, interval);
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
        }
    }
    class Recurrence_WeeklyPattern extends Recurrence_IntervalPattern {
        private daysOfTheWeek: DayOfTheWeekCollection = new DayOfTheWeekCollection();
        private firstDayOfWeek: Nullable<DayOfWeek> = null;
        get XmlElementName(): string {
            return "WeeklyRecurrence";
        }
        get DaysOfTheWeek(): DayOfTheWeekCollection {
            return this.daysOfTheWeek;
        }
        set FirstDayOfWeek(value: DayOfWeek) {
            (() => {
                var _p0 = [
                    this.firstDayOfWeek
                ];
                var _r = this.SetFieldValue<Nullable<DayOfWeek>>(_p0, new Nullable<DayOfWeek>(value));
                this.firstDayOfWeek = _p0[0];
                return _r;
            })();
        }
        get FirstDayOfWeek(): DayOfWeek {
            return super.GetFieldValueOrThrowIfNull<DayOfWeek>(this.firstDayOfWeek, "FirstDayOfWeek");
        }
        constructor();
        constructor(startDate: DateTime, interval: number, daysOfTheWeek: DayOfTheWeek[]);
        constructor(startDate?: DateTime, interval?: number, daysOfTheWeek?: DayOfTheWeek[]) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, interval, daysOfTheWeek);
        }
        private constructor_0(): void {
            this.daysOfTheWeek.OnChange.Add(this.DaysOfTheWeekChanged);
        }
        private constructor_1(startDate: DateTime, interval: number, daysOfTheWeek: DayOfTheWeek[]): void {
            this.daysOfTheWeek.AddRange(NArray.ToEnumerable(daysOfTheWeek));
        }
        private DaysOfTheWeekChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            this.DaysOfTheWeek.WriteToXml(writer, "DaysOfWeek");
            if (this.firstDayOfWeek !== null) {
                EwsUtilities.ValidatePropertyVersion(<ExchangeService>writer.Service, ExchangeVersion.Exchange2010_SP1, "FirstDayOfWeek");
                writer.WriteElementValue(XmlNamespace.Types, "FirstDayOfWeek", this.firstDayOfWeek.Value);
            }
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = super.PatternToJson(service);
            jsonObject.Add("DayOfWeek", this.DaysOfTheWeek.InternalToJson(service));
            if (this.firstDayOfWeek !== null) {
                EwsUtilities.ValidatePropertyVersion(service, ExchangeVersion.Exchange2010_SP1, "FirstDayOfWeek");
                jsonObject.Add("FirstDayOfWeek", this.firstDayOfWeek.Value);
            }
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DaysOfWeek") {
                    this.DaysOfTheWeek.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "FirstDayOfWeek") {
                    this.FirstDayOfWeek = reader.ReadElementValue<DayOfWeek>(XmlNamespace.Types, "FirstDayOfWeek");
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DaysOfWeek")) {
                            if (a === "FirstDayOfWeek") {
                                this.FirstDayOfWeek = jsonProperty.ReadEnumValue<DayOfWeek>(current);
                            }
                        }
                        else {
                            this.DaysOfTheWeek.LoadFromJsonValue(jsonProperty.ReadAsString(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (this.DaysOfTheWeek.Count === 0) {
                throw new ServiceValidationException(Strings.DaysOfTheWeekNotSpecified);
            }
        }
    }
    class Recurrence_RelativeYearlyPattern extends Recurrence {
        private dayOfTheWeek: Nullable<DayOfTheWeek> = null;
        private dayOfTheWeekIndex: Nullable<DayOfTheWeekIndex> = null;
        private month: Nullable<Month> = null;
        get XmlElementName(): string {
            return "RelativeYearlyRecurrence";
        }
        set DayOfTheWeekIndex(value: DayOfTheWeekIndex) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeekIndex
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeekIndex>>(_p0, new Nullable<DayOfTheWeekIndex>(value));
                this.dayOfTheWeekIndex = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeekIndex(): DayOfTheWeekIndex {
            return super.GetFieldValueOrThrowIfNull<DayOfTheWeekIndex>(this.dayOfTheWeekIndex, "DayOfTheWeekIndex");
        }
        set DayOfTheWeek(value: DayOfTheWeek) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeek
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeek>>(_p0, new Nullable<DayOfTheWeek>(value));
                this.dayOfTheWeek = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeek(): DayOfTheWeek {
            return super.GetFieldValueOrThrowIfNull<DayOfTheWeek>(this.dayOfTheWeek, "DayOfTheWeek");
        }
        set Month(value: Month) {
            (() => {
                var _p0 = [
                    this.month
                ];
                var _r = this.SetFieldValue<Nullable<Month>>(_p0, new Nullable<Month>(value));
                this.month = _p0[0];
                return _r;
            })();
        }
        get Month(): Month {
            return super.GetFieldValueOrThrowIfNull<Month>(this.month, "Month");
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DaysOfWeek", this.DayOfTheWeek);
            writer.WriteElementValue(XmlNamespace.Types, "DayOfWeekIndex", this.DayOfTheWeekIndex);
            writer.WriteElementValue(XmlNamespace.Types, "Month", this.Month);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.XmlElementName);
            jsonObject.Add("DaysOfWeek", this.DayOfTheWeek);
            jsonObject.Add("DayOfWeekIndex", this.DayOfTheWeekIndex);
            jsonObject.Add("Month", this.Month);
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DaysOfWeek") {
                    this.dayOfTheWeek = new Nullable<DayOfTheWeek>(reader.ReadElementValue<DayOfTheWeek>());
                    return true;
                }
                if (localName === "DayOfWeekIndex") {
                    this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(reader.ReadElementValue<DayOfTheWeekIndex>());
                    return true;
                }
                if (localName === "Month") {
                    this.month = new Nullable<Month>(reader.ReadElementValue<Month>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DaysOfWeek")) {
                            if (!(a === "DayOfWeekIndex")) {
                                if (a === "Month") {
                                    this.month = new Nullable<Month>(jsonProperty.ReadEnumValue<Month>(current));
                                }
                            }
                            else {
                                this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(jsonProperty.ReadEnumValue<DayOfTheWeekIndex>(current));
                            }
                        }
                        else {
                            this.dayOfTheWeek = new Nullable<DayOfTheWeek>(jsonProperty.ReadEnumValue<DayOfTheWeek>(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        constructor();
        constructor(startDate: DateTime, month: Month, dayOfTheWeek: DayOfTheWeek, dayOfTheWeekIndex: DayOfTheWeekIndex);
        constructor(startDate?: DateTime, month?: Month, dayOfTheWeek?: DayOfTheWeek, dayOfTheWeekIndex?: DayOfTheWeekIndex) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, month, dayOfTheWeek, dayOfTheWeekIndex);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, month: Month, dayOfTheWeek: DayOfTheWeek, dayOfTheWeekIndex: DayOfTheWeekIndex): void {
            this.Month = month;
            this.DayOfTheWeek = dayOfTheWeek;
            this.DayOfTheWeekIndex = dayOfTheWeekIndex;
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (!(this.dayOfTheWeekIndex !== null)) {
                throw new ServiceValidationException(Strings.DayOfWeekIndexMustBeSpecifiedForRecurrencePattern);
            }
            if (!(this.dayOfTheWeek !== null)) {
                throw new ServiceValidationException(Strings.DayOfTheWeekMustBeSpecifiedForRecurrencePattern);
            }
            if (!(this.month !== null)) {
                throw new ServiceValidationException(Strings.MonthMustBeSpecifiedForRecurrencePattern);
            }
        }
    }
    class Recurrence_RelativeMonthlyPattern extends Recurrence_IntervalPattern {
        private dayOfTheWeek: Nullable<DayOfTheWeek> = null;
        private dayOfTheWeekIndex: Nullable<DayOfTheWeekIndex> = null;
        get XmlElementName(): string {
            return "RelativeMonthlyRecurrence";
        }
        set DayOfTheWeekIndex(value: DayOfTheWeekIndex) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeekIndex
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeekIndex>>(_p0, new Nullable<DayOfTheWeekIndex>(value));
                this.dayOfTheWeekIndex = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeekIndex(): DayOfTheWeekIndex {
            return super.GetFieldValueOrThrowIfNull<DayOfTheWeekIndex>(this.dayOfTheWeekIndex, "DayOfTheWeekIndex");
        }
        set DayOfTheWeek(value: DayOfTheWeek) {
            (() => {
                var _p0 = [
                    this.dayOfTheWeek
                ];
                var _r = this.SetFieldValue<Nullable<DayOfTheWeek>>(_p0, new Nullable<DayOfTheWeek>(value));
                this.dayOfTheWeek = _p0[0];
                return _r;
            })();
        }
        get DayOfTheWeek(): DayOfTheWeek {
            return super.GetFieldValueOrThrowIfNull<DayOfTheWeek>(this.dayOfTheWeek, "DayOfTheWeek");
        }
        constructor();
        constructor(startDate: DateTime, interval: number, dayOfTheWeek: DayOfTheWeek, dayOfTheWeekIndex: DayOfTheWeekIndex);
        constructor(startDate?: DateTime, interval?: number, dayOfTheWeek?: DayOfTheWeek, dayOfTheWeekIndex?: DayOfTheWeekIndex) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, interval, dayOfTheWeek, dayOfTheWeekIndex);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number, dayOfTheWeek: DayOfTheWeek, dayOfTheWeekIndex: DayOfTheWeekIndex): void {
            this.DayOfTheWeek = dayOfTheWeek;
            this.DayOfTheWeekIndex = dayOfTheWeekIndex;
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DaysOfWeek", this.DayOfTheWeek);
            writer.WriteElementValue(XmlNamespace.Types, "DayOfWeekIndex", this.DayOfTheWeekIndex);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = super.PatternToJson(service);
            jsonObject.Add("DaysOfWeek", this.DayOfTheWeek);
            jsonObject.Add("DayOfWeekIndex", this.DayOfTheWeekIndex);
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DaysOfWeek") {
                    this.dayOfTheWeek = new Nullable<DayOfTheWeek>(reader.ReadElementValue<DayOfTheWeek>());
                    return true;
                }
                if (localName === "DayOfWeekIndex") {
                    this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(reader.ReadElementValue<DayOfTheWeekIndex>());
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "DaysOfWeek")) {
                            if (a === "DayOfWeekIndex") {
                                this.dayOfTheWeekIndex = new Nullable<DayOfTheWeekIndex>(jsonProperty.ReadEnumValue<DayOfTheWeekIndex>(current));
                            }
                        }
                        else {
                            this.dayOfTheWeek = new Nullable<DayOfTheWeek>(jsonProperty.ReadEnumValue<DayOfTheWeek>(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (!(this.dayOfTheWeek !== null)) {
                throw new ServiceValidationException(Strings.DayOfTheWeekMustBeSpecifiedForRecurrencePattern);
            }
            if (!(this.dayOfTheWeekIndex !== null)) {
                throw new ServiceValidationException(Strings.DayOfWeekIndexMustBeSpecifiedForRecurrencePattern);
            }
        }
    }
    class Recurrence_MonthlyRegenerationPattern extends Recurrence_IntervalPattern {
        get XmlElementName(): string {
            return "MonthlyRegeneration";
        }
        get IsRegenerationPattern(): boolean {
            return true;
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate, interval);
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
        }
    }
    class Recurrence_MonthlyPattern extends Recurrence_IntervalPattern {
        private dayOfMonth: Nullable<number> = null;
        get XmlElementName(): string {
            return "AbsoluteMonthlyRecurrence";
        }
        set DayOfMonth(value: number) {
            if (value < 1 || value > 31) {
                throw new ArgumentOutOfRangeException("DayOfMonth", Strings.DayOfMonthMustBeBetween1And31);
            }
            (() => {
                var _p0 = [
                    this.dayOfMonth
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, new Nullable<number>(value));
                this.dayOfMonth = _p0[0];
                return _r;
            })();
        }
        get DayOfMonth(): number {
            return super.GetFieldValueOrThrowIfNull<number>(this.dayOfMonth, "DayOfMonth");
        }
        constructor();
        constructor(startDate: DateTime, interval: number, dayOfMonth: number);
        constructor(startDate?: DateTime, interval?: number, dayOfMonth?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, interval, dayOfMonth);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number, dayOfMonth: number): void {
            this.DayOfMonth = dayOfMonth;
        }
        InternalWritePropertiesToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWritePropertiesToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DayOfMonth", this.DayOfMonth);
        }
        PatternToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = super.PatternToJson(service);
            jsonObject.Add("DayOfMonth", this.DayOfMonth);
            return jsonObject;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "DayOfMonth") {
                this.dayOfMonth = new Nullable<number>(reader.ReadElementValue<number>());
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "DayOfMonth") {
                        this.dayOfMonth = new Nullable<number>(jsonProperty.ReadAsInt(current));
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (!(this.dayOfMonth !== null)) {
                throw new ServiceValidationException(Strings.DayOfMonthMustBeBetween1And31);
            }
        }
    }
    class Recurrence_DailyRegenerationPattern extends Recurrence_IntervalPattern {
        get XmlElementName(): string {
            return "DailyRegeneration";
        }
        get IsRegenerationPattern(): boolean {
            return true;
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate, interval);
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
        }
    }
    class Recurrence_DailyPattern extends Recurrence_IntervalPattern {
        get XmlElementName(): string {
            return "DailyRecurrence";
        }
        constructor();
        constructor(startDate: DateTime, interval: number);
        constructor(startDate?: DateTime, interval?: number) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate, interval);
            this.constructor_1(startDate, interval);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, interval: number): void {
        }
    }
    class RecurrenceRange extends ComplexProperty {
        private startDate: DateTime = null;
        private recurrence: Recurrence = null;
        XmlElementName: string = null;
        set Recurrence(value: Recurrence) {
            this.recurrence = value;
        }
        get Recurrence(): Recurrence {
            return this.recurrence;
        }
        set StartDate(value: DateTime) {
            (() => {
                var _p0 = [
                    this.startDate
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.startDate = _p0[0];
                return _r;
            })();
        }
        get StartDate(): DateTime {
            return this.startDate;
        }
        constructor();
        constructor(startDate: DateTime);
        constructor(startDate?: DateTime) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime): void {
            this.constructor_0();
            this.startDate = startDate;
        }
        Changed(): void {
            if (this.Recurrence !== null) {
                this.Recurrence.Changed();
            }
        }
        SetupRecurrence(recurrence: Recurrence): void {
            recurrence.StartDate = this.StartDate;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "StartDate", EwsUtilities.DateTimeToXSDate(this.StartDate));
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.AddPropertiesToJson(jsonObject, service);
            return jsonObject;
        }
        AddPropertiesToJson(jsonProperty: JsonObject, service: ExchangeService): void {
            jsonProperty.AddTypeParameter(this.XmlElementName);
            jsonProperty.Add("StartDate", EwsUtilities.DateTimeToXSDate(this.StartDate));
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) === null || !(localName === "StartDate")) {
                return false;
            }
            var dateTime: Nullable<DateTime> = reader.ReadElementValueAsUnspecifiedDate();
            if (dateTime !== null) {
                this.startDate = dateTime.Value;
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "StartDate") {
                        var dateTime: Nullable<DateTime> = service.ConvertStartDateToUnspecifiedDateTime(jsonProperty.ReadAsString(current));
                        if (dateTime !== null) {
                            this.startDate = dateTime.Value;
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class EndDateRecurrenceRange extends RecurrenceRange {
        private endDate: DateTime = null;
        get XmlElementName(): string {
            return "EndDateRecurrence";
        }
        set EndDate(value: DateTime) {
            (() => {
                var _p0 = [
                    this.endDate
                ];
                var _r = this.SetFieldValue<DateTime>(_p0, value);
                this.endDate = _p0[0];
                return _r;
            })();
        }
        get EndDate(): DateTime {
            return this.endDate;
        }
        constructor();
        constructor(startDate: DateTime, endDate: DateTime);
        constructor(startDate?: DateTime, endDate?: DateTime) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, endDate);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, endDate: DateTime): void {
            this.endDate = endDate;
        }
        SetupRecurrence(recurrence: Recurrence): void {
            super.SetupRecurrence(recurrence);
            recurrence.EndDate = new Nullable<DateTime>(this.EndDate);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "EndDate", EwsUtilities.DateTimeToXSDate(this.EndDate));
        }
        AddPropertiesToJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.AddPropertiesToJson(jsonProperty, service);
            jsonProperty.Add("EndDate", EwsUtilities.DateTimeToXSDate(this.EndDate));
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "EndDate") {
                this.endDate = reader.ReadElementValueAsDateTime().Value;
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "EndDate") {
                        this.endDate = service.ConvertStartDateToUnspecifiedDateTime(jsonProperty.ReadAsString(current)).Value;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class NoEndRecurrenceRange extends RecurrenceRange {
        get XmlElementName(): string {
            return "NoEndRecurrence";
        }
        constructor();
        constructor(startDate: DateTime);
        constructor(startDate?: DateTime) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(startDate);
            this.constructor_1(startDate);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime): void {
        }
        SetupRecurrence(recurrence: Recurrence): void {
            super.SetupRecurrence(recurrence);
            recurrence.NeverEnds();
        }
    }
    class NumberedRecurrenceRange extends RecurrenceRange {
        private numberOfOccurrences: Nullable<number> = null;
        get XmlElementName(): string {
            return "NumberedRecurrence";
        }
        set NumberOfOccurrences(value: Nullable<number>) {
            (() => {
                var _p0 = [
                    this.numberOfOccurrences
                ];
                var _r = this.SetFieldValue<Nullable<number>>(_p0, value);
                this.numberOfOccurrences = _p0[0];
                return _r;
            })();
        }
        get NumberOfOccurrences(): Nullable<number> {
            return this.numberOfOccurrences;
        }
        constructor();
        constructor(startDate: DateTime, numberOfOccurrences: Nullable<number>);
        constructor(startDate?: DateTime, numberOfOccurrences?: Nullable<number>) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startDate, numberOfOccurrences);
        }
        private constructor_0(): void {
        }
        private constructor_1(startDate: DateTime, numberOfOccurrences: Nullable<number>): void {
            this.numberOfOccurrences = numberOfOccurrences;
        }
        SetupRecurrence(recurrence: Recurrence): void {
            super.SetupRecurrence(recurrence);
            recurrence.NumberOfOccurrences = this.NumberOfOccurrences;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            if (this.NumberOfOccurrences !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "NumberOfOccurrences", this.NumberOfOccurrences);
            }
        }
        AddPropertiesToJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.AddPropertiesToJson(jsonProperty, service);
            jsonProperty.Add("NumberOfOccurrences", this.NumberOfOccurrences);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "NumberOfOccurrences") {
                this.numberOfOccurrences = new Nullable<number>(reader.ReadElementValue<number>());
                return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "NumberOfOccurrences") {
                        this.numberOfOccurrences = new Nullable<number>(jsonProperty.ReadAsInt(current));
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class TimeZoneTransition extends ComplexProperty {
        private static PeriodTarget: string = "Period";
        private static GroupTarget: string = "Group";
        private timeZoneDefinition: TimeZoneDefinition = null;
        private targetPeriod: TimeZonePeriod = null;
        private targetGroup: TimeZoneTransitionGroup = null;
        get TargetPeriod(): TimeZonePeriod {
            return this.targetPeriod;
        }
        get TargetGroup(): TimeZoneTransitionGroup {
            return this.targetGroup;
        }
        static Create(timeZoneDefinition: TimeZoneDefinition, xmlElementName: string): TimeZoneTransition {
            if (xmlElementName !== null) {
                if (xmlElementName === "AbsoluteDateTransition") {
                    return new AbsoluteDateTransition(timeZoneDefinition);
                }
                if (xmlElementName === "RecurringDayTransition") {
                    return new RelativeDayOfMonthTransition(timeZoneDefinition);
                }
                if (xmlElementName === "RecurringDateTransition") {
                    return new AbsoluteDayOfMonthTransition(timeZoneDefinition);
                }
                if (xmlElementName === "Transition") {
                    return new TimeZoneTransition(timeZoneDefinition);
                }
            }
            throw new ServiceLocalException(NString.Format(Strings.UnknownTimeZonePeriodTransitionType, xmlElementName));
        }
        static CreateTimeZoneTransition(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod, transitionTime: TimeZoneInfo_TransitionTime): TimeZoneTransition {
            var timeZoneTransition: TimeZoneTransition;
            if (transitionTime.IsFixedDateRule) {
                timeZoneTransition = new AbsoluteDayOfMonthTransition(timeZoneDefinition, targetPeriod);
            }
            else {
                timeZoneTransition = new RelativeDayOfMonthTransition(timeZoneDefinition, targetPeriod);
            }
            timeZoneTransition.InitializeFromTransitionTime(transitionTime);
            return timeZoneTransition;
        }
        GetXmlElementName(): string {
            return "Transition";
        }
        CreateTransitionTime(): TimeZoneInfo_TransitionTime {
            throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
        }
        InitializeFromTransitionTime(transitionTime: TimeZoneInfo_TransitionTime): void {
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null && localName === "To") {
                var IL_AF: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            var text: string = reader.ReadAttributeValue("Kind");
                            var text2: string = reader.ReadElementValue();
                            var a: string;
                            if ((a = text) !== null) {
                                if (!(a === "Period")) {
                                    if (!(a === "Group")) {
                                        _goto = IL_AF;
                                        continue _GOTO_LOOP;
                                    }
                                    if (!(() => {
                                        var _p0 = [
                                            this.targetGroup
                                        ];
                                        var _r = this.timeZoneDefinition.TransitionGroups.TryGetValue(text2, _p0);
                                        this.targetGroup = _p0[0];
                                        return _r;
                                    })()) {
                                        throw new ServiceLocalException(NString.Format(Strings.TransitionGroupNotFound, text2));
                                    }
                                }
                                else {
                                    if (!(() => {
                                        var _p0 = [
                                            this.targetPeriod
                                        ];
                                        var _r = this.timeZoneDefinition.Periods.TryGetValue(text2, _p0);
                                        this.targetPeriod = _p0[0];
                                        return _r;
                                    })()) {
                                        throw new ServiceLocalException(NString.Format(Strings.PeriodNotFound, text2));
                                    }
                                }
                                return true;
                            }
                            _goto = IL_AF;
                            continue _GOTO_LOOP;
                        case 1:
                            throw new ServiceLocalException(Strings.UnsupportedTimeZonePeriodTransitionTarget);
                    }
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "To") {
                        var text: string = jsonProperty.ReadAsJsonObject(current).ReadAsString("Kind");
                        var text2: string = jsonProperty.ReadAsJsonObject(current).ReadAsString("Value");
                        var a2: string;
                        if ((a2 = text) !== null) {
                            if (!(a2 === "Period")) {
                                if (a2 === "Group") {
                                    if (!(() => {
                                        var _p0 = [
                                            this.targetGroup
                                        ];
                                        var _r = this.timeZoneDefinition.TransitionGroups.TryGetValue(text2, _p0);
                                        this.targetGroup = _p0[0];
                                        return _r;
                                    })()) {
                                        throw new ServiceLocalException(NString.Format(Strings.TransitionGroupNotFound, text2));
                                    }
                                    continue;
                                }
                            }
                            else {
                                if (!(() => {
                                    var _p0 = [
                                        this.targetPeriod
                                    ];
                                    var _r = this.timeZoneDefinition.Periods.TryGetValue(text2, _p0);
                                    this.targetPeriod = _p0[0];
                                    return _r;
                                })()) {
                                    throw new ServiceLocalException(NString.Format(Strings.PeriodNotFound, text2));
                                }
                                continue;
                            }
                        }
                        throw new ServiceLocalException(Strings.UnsupportedTimeZonePeriodTransitionTarget);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject.Add("To", jsonObject2);
            if (this.targetPeriod !== null) {
                jsonObject2.Add("Kind", "Period");
                jsonObject2.Add("Value", this.targetPeriod.Id);
            }
            else {
                jsonObject2.Add("Kind", "Group");
                jsonObject2.Add("Value", this.targetGroup.Id);
            }
            return jsonObject;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "To");
            if (this.targetPeriod !== null) {
                writer.WriteAttributeValue("Kind", "Period");
                writer.WriteValue(this.targetPeriod.Id, "To");
            }
            else {
                writer.WriteAttributeValue("Kind", "Group");
                writer.WriteValue(this.targetGroup.Id, "To");
            }
            writer.WriteEndElement();
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            this.LoadFromXml(reader, this.GetXmlElementName());
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, this.GetXmlElementName());
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetGroup: TimeZoneTransitionGroup);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetGroupOrTargetPeriod?: any) {
            super();
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            if (arguments.length === 2 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition) && (targetGroupOrTargetPeriod === null || targetGroupOrTargetPeriod instanceof TimeZoneTransitionGroup)) {
                this.constructor_1(timeZoneDefinition, targetGroupOrTargetPeriod);
                return;
            }
            this.constructor_2(timeZoneDefinition, targetGroupOrTargetPeriod);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
            this.timeZoneDefinition = timeZoneDefinition;
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, targetGroup: TimeZoneTransitionGroup): void {
            this.constructor_0(timeZoneDefinition);
            this.targetGroup = targetGroup;
        }
        private constructor_2(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod): void {
            this.constructor_0(timeZoneDefinition);
            this.targetPeriod = targetPeriod;
        }
    }
    class AbsoluteDateTransition extends TimeZoneTransition {
        private dateTime: DateTime = null;
        set DateTime(value: DateTime) {
            this.dateTime = value;
        }
        get DateTime(): DateTime {
            return this.dateTime;
        }
        InitializeFromTransitionTime(transitionTime: TimeZoneInfo_TransitionTime): void {
            throw new ServiceLocalException(Strings.UnsupportedTimeZonePeriodTransitionTarget);
        }
        GetXmlElementName(): string {
            return "AbsoluteDateTransition";
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag && reader.LocalName === "DateTime") {
                this.dateTime = DateTime.Parse(reader.ReadElementValue(), CultureInfo.InvariantCulture);
                flag = true;
            }
            return flag;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DateTime", this.dateTime);
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetGroup: TimeZoneTransitionGroup);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetGroup?: TimeZoneTransitionGroup) {
            super(timeZoneDefinition);
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            this.constructor_1(timeZoneDefinition, targetGroup);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, targetGroup: TimeZoneTransitionGroup): void {
        }
    }
    class AbsoluteMonthTransition extends TimeZoneTransition {
        private timeOffset: TimeSpan = null;
        private month: number = 0;
        get TimeOffset(): TimeSpan {
            return this.timeOffset;
        }
        get Month(): number {
            return this.month;
        }
        InitializeFromTransitionTime(transitionTime: TimeZoneInfo_TransitionTime): void {
            super.InitializeFromTransitionTime(transitionTime);
            this.timeOffset = transitionTime.TimeOfDay.TimeOfDay;
            this.month = transitionTime.Month;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "TimeOffset") {
                    this.timeOffset = EwsUtilities.XSDurationToTimeSpan(reader.ReadElementValue());
                    return true;
                }
                if (localName === "Month") {
                    this.month = reader.ReadElementValue<number>();
                    EwsUtilities.Assert(this.month > 0 && this.month <= 12, "AbsoluteMonthTransition.TryReadElementFromXml", "month is not in the valid 1 - 12 range.");
                    return true;
                }
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "TimeOffset", EwsUtilities.TimeSpanToXSDuration(this.timeOffset));
            writer.WriteElementValue(XmlNamespace.Types, "Month", this.month);
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod?: TimeZonePeriod) {
            super(timeZoneDefinition);
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            this.constructor_1(timeZoneDefinition, targetPeriod);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod): void {
        }
    }
    class AbsoluteDayOfMonthTransition extends AbsoluteMonthTransition {
        private dayOfMonth: number = 0;
        get DayOfMonth(): number {
            return this.dayOfMonth;
        }
        GetXmlElementName(): string {
            return "RecurringDateTransition";
        }
        CreateTransitionTime(): TimeZoneInfo_TransitionTime {
            return TimeZoneInfo_TransitionTime.CreateFixedDateRule(new DateTime(this.TimeOffset.Ticks), this.Month, this.DayOfMonth);
        }
        InitializeFromTransitionTime(transitionTime: TimeZoneInfo_TransitionTime): void {
            super.InitializeFromTransitionTime(transitionTime);
            this.dayOfMonth = transitionTime.Day;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            if (reader.LocalName === "Day") {
                this.dayOfMonth = reader.ReadElementValue<number>();
                EwsUtilities.Assert(this.dayOfMonth > 0 && this.dayOfMonth <= 31, "AbsoluteDayOfMonthTransition.TryReadElementFromXml", "dayOfMonth is not in the valid 1 - 31 range.");
                return true;
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "Day", this.dayOfMonth);
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod?: TimeZonePeriod) {
            super(timeZoneDefinition);
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            this.constructor_1(timeZoneDefinition, targetPeriod);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod): void {
        }
    }
    class RelativeDayOfMonthTransition extends AbsoluteMonthTransition {
        private dayOfTheWeek: DayOfTheWeek = 0;
        private weekIndex: number = 0;
        get DayOfTheWeek(): DayOfTheWeek {
            return this.dayOfTheWeek;
        }
        get WeekIndex(): number {
            return this.weekIndex;
        }
        GetXmlElementName(): string {
            return "RecurringDayTransition";
        }
        CreateTransitionTime(): TimeZoneInfo_TransitionTime {
            return TimeZoneInfo_TransitionTime.CreateFloatingDateRule(new DateTime(this.TimeOffset.Ticks), this.Month, (this.WeekIndex === -1) ? 5 : this.WeekIndex, EwsUtilities.EwsToSystemDayOfWeek(this.DayOfTheWeek));
        }
        InitializeFromTransitionTime(transitionTime: TimeZoneInfo_TransitionTime): void {
            super.InitializeFromTransitionTime(transitionTime);
            this.dayOfTheWeek = EwsUtilities.SystemToEwsDayOfTheWeek(transitionTime.DayOfWeek);
            this.weekIndex = ((transitionTime.Week === 5) ? -1 : transitionTime.Week);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            if (super.TryReadElementFromXml(reader)) {
                return true;
            }
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "DayOfWeek") {
                    this.dayOfTheWeek = reader.ReadElementValue<DayOfTheWeek>();
                    return true;
                }
                if (localName === "Occurrence") {
                    this.weekIndex = reader.ReadElementValue<number>();
                    return true;
                }
            }
            return false;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteElementValue(XmlNamespace.Types, "DayOfWeek", this.dayOfTheWeek);
            writer.WriteElementValue(XmlNamespace.Types, "Occurrence", this.weekIndex);
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod);
        constructor(timeZoneDefinition: TimeZoneDefinition, targetPeriod?: TimeZonePeriod) {
            super(timeZoneDefinition);
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            this.constructor_1(timeZoneDefinition, targetPeriod);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, targetPeriod: TimeZonePeriod): void {
        }
    }
    class TimeZoneDefinition extends ComplexProperty {
        private static NoIdPrefix: string = "NoId_";
        private name: string = null;
        private id: string = null;
        private periods: Dictionary<string, TimeZonePeriod> = new Dictionary<string, TimeZonePeriod>();
        private transitionGroups: Dictionary<string, TimeZoneTransitionGroup> = new Dictionary<string, TimeZoneTransitionGroup>();
        private transitions: List<TimeZoneTransition> = new List<TimeZoneTransition>();
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        get Periods(): Dictionary<string, TimeZonePeriod> {
            return this.periods;
        }
        get TransitionGroups(): Dictionary<string, TimeZoneTransitionGroup> {
            return this.transitionGroups;
        }
        private CompareTransitions(x: TimeZoneTransition, y: TimeZoneTransition): number {
            if (x === y) {
                return 0;
            }
            if (Type.op_Equality(x.GetType(), new Type("TimeZoneTransition"))) {
                return -1;
            }
            if (Type.op_Equality(y.GetType(), new Type("TimeZoneTransition"))) {
                return 1;
            }
            var absoluteDateTransition: AbsoluteDateTransition = <AbsoluteDateTransition>x;
            var absoluteDateTransition2: AbsoluteDateTransition = <AbsoluteDateTransition>y;
            return DateTime.Compare(absoluteDateTransition.DateTime, absoluteDateTransition2.DateTime);
        }
        constructor();
        constructor(timeZoneInfo: TimeZoneInfo);
        constructor(timeZoneInfo?: TimeZoneInfo) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(timeZoneInfo);
        }
        private constructor_0(): void {
        }
        private constructor_1(timeZoneInfo: TimeZoneInfo): void {
            this.constructor_0();
            this.Id = timeZoneInfo.Id;
            this.Name = timeZoneInfo.DisplayName;
            var timeZonePeriod: TimeZonePeriod = new TimeZonePeriod();
            timeZonePeriod.Id = "Std";
            timeZonePeriod.Name = "Standard";
            timeZonePeriod.Bias = -timeZoneInfo.BaseUtcOffset;
            this.periods.Add(timeZonePeriod.Id, timeZonePeriod);
            var adjustmentRules: TimeZoneInfo_AdjustmentRule[] = timeZoneInfo.GetAdjustmentRules();
            var item: TimeZoneTransition = new TimeZoneTransition(this, timeZonePeriod);
            if (adjustmentRules.length === 0) {
                var timeZoneTransitionGroup: TimeZoneTransitionGroup = new TimeZoneTransitionGroup(this, "0");
                timeZoneTransitionGroup.Transitions.Add(item);
                this.transitionGroups.Add(timeZoneTransitionGroup.Id, timeZoneTransitionGroup);
                var item2: TimeZoneTransition = new TimeZoneTransition(this, timeZoneTransitionGroup);
                this.transitions.Add(item2);
                return;
            }
            for (var i: number = 0; i < adjustmentRules.length; i = i + 1) {
                var timeZoneTransitionGroup2: TimeZoneTransitionGroup = new TimeZoneTransitionGroup(this, NNumber.ToString(this.transitionGroups.Count));
                timeZoneTransitionGroup2.InitializeFromAdjustmentRule(adjustmentRules[i], timeZonePeriod);
                this.transitionGroups.Add(timeZoneTransitionGroup2.Id, timeZoneTransitionGroup2);
                var item4: TimeZoneTransition;
                if (i === 0) {
                    if (DateTime.op_GreaterThan(adjustmentRules[i].DateStart, DateTime.MinValue.Date)) {
                        var item3: TimeZoneTransition = new TimeZoneTransition(this, this.CreateTransitionGroupToPeriod(timeZonePeriod));
                        this.transitions.Add(item3);
                        var absoluteDateTransition: AbsoluteDateTransition = new AbsoluteDateTransition(this, timeZoneTransitionGroup2);
                        absoluteDateTransition.DateTime = adjustmentRules[i].DateStart;
                        item4 = absoluteDateTransition;
                    }
                    else {
                        item4 = new TimeZoneTransition(this, timeZoneTransitionGroup2);
                    }
                }
                else {
                    var absoluteDateTransition2: AbsoluteDateTransition = new AbsoluteDateTransition(this, timeZoneTransitionGroup2);
                    absoluteDateTransition2.DateTime = adjustmentRules[i].DateStart;
                    item4 = absoluteDateTransition2;
                }
                this.transitions.Add(item4);
            }
            var dateEnd: DateTime = adjustmentRules[adjustmentRules.length - 1].DateEnd;
            if (DateTime.op_LessThan(dateEnd, DateTime.MaxValue.Date)) {
                var absoluteDateTransition3: AbsoluteDateTransition = new AbsoluteDateTransition(this, this.CreateTransitionGroupToPeriod(timeZonePeriod));
                absoluteDateTransition3.DateTime = dateEnd.AddDays(1.0);
                this.transitions.Add(absoluteDateTransition3);
            }
        }
        private CreateTransitionGroupToPeriod(timeZonePeriod: TimeZonePeriod): TimeZoneTransitionGroup {
            var item: TimeZoneTransition = new TimeZoneTransition(this, timeZonePeriod);
            var timeZoneTransitionGroup: TimeZoneTransitionGroup = new TimeZoneTransitionGroup(this, NNumber.ToString(this.transitionGroups.Count));
            timeZoneTransitionGroup.Transitions.Add(item);
            this.transitionGroups.Add(timeZoneTransitionGroup.Id, timeZoneTransitionGroup);
            return timeZoneTransitionGroup;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.name = reader.ReadAttributeValue("Name");
            this.id = reader.ReadAttributeValue("Id");
            if (NString.IsNullOrEmpty(this.id)) {
                var text: string = NString.IsNullOrEmpty(this.Name) ? NString.Empty : this.Name;
                this.Id = "NoId_" + NNumber.ToString(Math.abs(NString.GetHashCode(text)));
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            if (writer.Service.RequestedServerVersion !== ExchangeVersion.Exchange2007_SP1) {
                writer.WriteAttributeValue("Name", this.name);
            }
            writer.WriteAttributeValue("Id", this.id);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Periods") {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "Period")) {
                            var timeZonePeriod: TimeZonePeriod = new TimeZonePeriod();
                            timeZonePeriod.LoadFromXml(reader);
                            this.periods.Add(timeZonePeriod.Id, timeZonePeriod);
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "Periods"));
                    return true;
                }
                if (localName === "TransitionsGroups") {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "TransitionsGroup")) {
                            var timeZoneTransitionGroup: TimeZoneTransitionGroup = new TimeZoneTransitionGroup(this);
                            timeZoneTransitionGroup.LoadFromXml(reader);
                            this.transitionGroups.Add(timeZoneTransitionGroup.Id, timeZoneTransitionGroup);
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "TransitionsGroups"));
                    return true;
                }
                if (localName === "Transitions") {
                    do {
                        reader.Read();
                        if (reader.IsStartElement()) {
                            var timeZoneTransition: TimeZoneTransition = TimeZoneTransition.Create(this, reader.LocalName);
                            timeZoneTransition.LoadFromXml(reader);
                            this.transitions.Add(timeZoneTransition);
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "Transitions"));
                    return true;
                }
            }
            return false;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            this.LoadFromXml(reader, "TimeZoneDefinition");
            this.transitions.Sort(this.CompareTransitions);
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Name")) {
                            if (!(a === "Id")) {
                                if (!(a === "Periods")) {
                                    if (!(a === "TransitionsGroups")) {
                                        if (a === "Transitions") {
                                            var jsonObject: JsonObject = jsonProperty.ReadAsJsonObject(current);
                                            var array: any[] = jsonObject.ReadAsArray("Transition");
                                            for (var i: number = 0; i < array.length; i = i + 1) {
                                                var obj: any = array[i];
                                                var jsonObject2: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                                var timeZoneTransition: TimeZoneTransition = TimeZoneTransition.Create(this, jsonObject2.ReadTypeString());
                                                timeZoneTransition.LoadFromJson(jsonObject2, service);
                                                this.transitions.Add(timeZoneTransition);
                                            }
                                        }
                                    }
                                    else {
                                        var array2: any[] = jsonProperty.ReadAsArray(current);
                                        for (var j: number = 0; j < array2.length; j = j + 1) {
                                            var obj2: any = array2[j];
                                            var timeZoneTransitionGroup: TimeZoneTransitionGroup = new TimeZoneTransitionGroup(this);
                                            timeZoneTransitionGroup.LoadFromJson(((obj2 instanceof JsonObject) ? <JsonObject>obj2 : null), service);
                                            this.transitionGroups.Add(timeZoneTransitionGroup.Id, timeZoneTransitionGroup);
                                        }
                                    }
                                }
                                else {
                                    var array3: any[] = jsonProperty.ReadAsArray(current);
                                    for (var k: number = 0; k < array3.length; k = k + 1) {
                                        var obj3: any = array3[k];
                                        var timeZonePeriod: TimeZonePeriod = new TimeZonePeriod();
                                        timeZonePeriod.LoadFromJson(((obj3 instanceof JsonObject) ? <JsonObject>obj3 : null), service);
                                        this.periods.Add(timeZonePeriod.Id, timeZonePeriod);
                                    }
                                }
                            }
                            else {
                                this.id = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.name = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (NString.IsNullOrEmpty(this.id)) {
                var text: string = NString.IsNullOrEmpty(this.Name) ? NString.Empty : this.Name;
                this.Id = "NoId_" + NNumber.ToString(Math.abs(NString.GetHashCode(text)));
            }
            this.transitions.Sort(this.CompareTransitions);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (writer.Service.RequestedServerVersion !== ExchangeVersion.Exchange2007_SP1) {
                if (this.periods.Count > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "Periods");
                    var enumerator: Dictionary_Enumerator<string, TimeZonePeriod> = this.periods.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var current: KeyValuePair<string, TimeZonePeriod> = enumerator.Current;
                            current.Value.WriteToXml(writer);
                        }
                    }
                    finally {
                        (<IDisposable>enumerator).Dispose();
                    }
                    writer.WriteEndElement();
                }
                if (this.transitionGroups.Count > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "TransitionsGroups");
                    var enumerator2: Dictionary_Enumerator<string, TimeZoneTransitionGroup> = this.transitionGroups.GetEnumerator();
                    try {
                        while (enumerator2.MoveNext()) {
                            var current2: KeyValuePair<string, TimeZoneTransitionGroup> = enumerator2.Current;
                            current2.Value.WriteToXml(writer);
                        }
                    }
                    finally {
                        (<IDisposable>enumerator2).Dispose();
                    }
                    writer.WriteEndElement();
                }
                if (this.transitions.Count > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "Transitions");
                    var enumerator3: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
                    try {
                        while (enumerator3.MoveNext()) {
                            var current3: TimeZoneTransition = enumerator3.Current;
                            current3.WriteToXml(writer);
                        }
                    }
                    finally {
                        (<IDisposable>enumerator3).Dispose();
                    }
                    writer.WriteEndElement();
                }
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Id", this.id);
            if (service.RequestedServerVersion !== ExchangeVersion.Exchange2007_SP1) {
                jsonObject.Add("Name", this.name);
                if (this.periods.Count > 0) {
                    var list: List<any> = new List<any>();
                    var enumerator: Dictionary_Enumerator<string, TimeZonePeriod> = this.periods.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var current: KeyValuePair<string, TimeZonePeriod> = enumerator.Current;
                            list.Add(current.Value.InternalToJson(service));
                        }
                    }
                    finally {
                        (<IDisposable>enumerator).Dispose();
                    }
                    jsonObject.Add("Periods", NArray.ToEnumerable(list.ToArray()));
                }
                if (this.transitionGroups.Count > 0) {
                    var list2: List<any> = new List<any>();
                    var enumerator2: Dictionary_Enumerator<string, TimeZoneTransitionGroup> = this.transitionGroups.GetEnumerator();
                    try {
                        while (enumerator2.MoveNext()) {
                            var current2: KeyValuePair<string, TimeZoneTransitionGroup> = enumerator2.Current;
                            list2.Add(current2.Value.InternalToJson(service));
                        }
                    }
                    finally {
                        (<IDisposable>enumerator2).Dispose();
                    }
                    jsonObject.Add("TransitionsGroups", NArray.ToEnumerable(list2.ToArray()));
                }
                if (this.transitions.Count > 0) {
                    var jsonObject2: JsonObject = new JsonObject();
                    var list3: List<any> = new List<any>();
                    var enumerator3: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
                    try {
                        while (enumerator3.MoveNext()) {
                            var current3: TimeZoneTransition = enumerator3.Current;
                            list3.Add(current3.InternalToJson(service));
                        }
                    }
                    finally {
                        (<IDisposable>enumerator3).Dispose();
                    }
                    jsonObject2.Add("Transition", NArray.ToEnumerable(list3.ToArray()));
                    jsonObject.Add("Transitions", jsonObject2);
                }
            }
            return jsonObject;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, "TimeZoneDefinition");
        }
        Validate(): void {
            if (this.periods.Count < 1 || this.transitions.Count < 1 || this.transitionGroups.Count < 1 || this.transitionGroups.Count !== this.transitions.Count) {
                throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
            }
            if (Type.op_Inequality(this.transitions.get_Item(0).GetType(), new Type("TimeZoneTransition"))) {
                throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
            }
            var enumerator: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TimeZoneTransition = enumerator.Current;
                    var type: Type = current.GetType();
                    if (Type.op_Inequality(type, new Type("TimeZoneTransition")) && Type.op_Inequality(type, new Type("AbsoluteDateTransition"))) {
                        throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
                    }
                    if (current.TargetGroup === null) {
                        throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: Dictionary_ValueCollection_Enumerator<string, TimeZoneTransitionGroup> = this.transitionGroups.Values.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: TimeZoneTransitionGroup = enumerator2.Current;
                    current2.Validate();
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
        }
        ToTimeZoneInfo(): TimeZoneInfo {
            this.Validate();
            var customTimeZoneCreationParams: TimeZoneTransitionGroup_CustomTimeZoneCreateParams = this.transitions.get_Item(this.transitions.Count - 1).TargetGroup.GetCustomTimeZoneCreationParams();
            var list: List<TimeZoneInfo_AdjustmentRule> = new List<TimeZoneInfo_AdjustmentRule>();
            var startDate: DateTime = DateTime.MinValue;
            for (var i: number = 0; i < this.transitions.Count; i = i + 1) {
                var dateTime: DateTime;
                var endDate: DateTime;
                if (i < this.transitions.Count - 1) {
                    dateTime = (((this.transitions.get_Item(i + 1) instanceof AbsoluteDateTransition) ? <AbsoluteDateTransition>this.transitions.get_Item(i + 1) : null)).DateTime;
                    endDate = dateTime.AddDays(-1.0);
                }
                else {
                    dateTime = DateTime.MaxValue;
                    endDate = dateTime;
                }
                var adjustmentRule: TimeZoneInfo_AdjustmentRule = this.transitions.get_Item(i).TargetGroup.CreateAdjustmentRule(startDate, endDate);
                if (adjustmentRule !== null) {
                    list.Add(adjustmentRule);
                }
                startDate = dateTime;
            }
            var result: TimeZoneInfo;
            if (list.Count === 0) {
                result = TimeZoneInfo.CreateCustomTimeZone(this.Id, customTimeZoneCreationParams.BaseOffsetToUtc, this.Name, customTimeZoneCreationParams.StandardDisplayName);
            }
            else {
                result = TimeZoneInfo.CreateCustomTimeZone(this.Id, customTimeZoneCreationParams.BaseOffsetToUtc, this.Name, customTimeZoneCreationParams.StandardDisplayName, customTimeZoneCreationParams.DaylightDisplayName, list.ToArray());
            }
            return result;
        }
    }
    class TimeZonePeriod extends ComplexProperty {
        static StandardPeriodId: string = "Std";
        static StandardPeriodName: string = "Standard";
        static DaylightPeriodId: string = "Dlt";
        static DaylightPeriodName: string = "Daylight";
        private bias: TimeSpan = null;
        private name: string = null;
        private id: string = null;
        get IsStandardPeriod(): boolean {
            return NString.Compare(this.name, "Standard", StringComparison.OrdinalIgnoreCase) === 0;
        }
        set Bias(value: TimeSpan) {
            this.bias = value;
        }
        get Bias(): TimeSpan {
            return this.bias;
        }
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.id = reader.ReadAttributeValue("Id");
            this.name = reader.ReadAttributeValue("Name");
            this.bias = EwsUtilities.XSDurationToTimeSpan(reader.ReadAttributeValue("Bias"));
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Bias", EwsUtilities.TimeSpanToXSDuration(this.bias));
            writer.WriteAttributeValue("Name", this.name);
            writer.WriteAttributeValue("Id", this.id);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Bias", EwsUtilities.TimeSpanToXSDuration(this.bias));
            jsonObject.Add("Name", this.name);
            jsonObject.Add("Id", this.id);
            return jsonObject;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            this.LoadFromXml(reader, "Period");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Id")) {
                            if (!(a === "Name")) {
                                if (a === "Bias") {
                                    this.bias = EwsUtilities.XSDurationToTimeSpan(jsonProperty.ReadAsString(current));
                                }
                            }
                            else {
                                this.name = jsonProperty.ReadAsString(current);
                            }
                        }
                        else {
                            this.id = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, "Period");
        }
        constructor() {
            super();
        }
    }
    class TimeZoneTransitionGroup extends ComplexProperty {
        timeZoneDefinition: TimeZoneDefinition = null;
        id: string = null;
        transitions: List<TimeZoneTransition> = new List<TimeZoneTransition>();
        transitionToStandard: TimeZoneTransition = null;
        transitionToDaylight: TimeZoneTransition = null;
        get SupportsDaylight(): boolean {
            return this.transitions.Count === 2;
        }
        get TransitionToDaylight(): TimeZoneTransition {
            this.InitializeTransitions();
            return this.transitionToDaylight;
        }
        get TransitionToStandard(): TimeZoneTransition {
            this.InitializeTransitions();
            return this.transitionToStandard;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        get Transitions(): List<TimeZoneTransition> {
            return this.transitions;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            this.LoadFromXml(reader, "TransitionsGroup");
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, "TransitionsGroup");
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.id = reader.ReadAttributeValue("Id");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Id")) {
                            if (a === "Transition") {
                                var array: any[] = jsonProperty.ReadAsArray(current);
                                for (var i: number = 0; i < array.length; i = i + 1) {
                                    var obj: any = array[i];
                                    var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                    var timeZoneTransition: TimeZoneTransition = TimeZoneTransition.Create(this.timeZoneDefinition, jsonObject.ReadTypeString());
                                    timeZoneTransition.LoadFromJson(jsonObject, service);
                                    this.transitions.Add(timeZoneTransition);
                                }
                            }
                        }
                        else {
                            this.id = jsonProperty.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Id", this.id);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            reader.EnsureCurrentNodeIsStartElement();
            var timeZoneTransition: TimeZoneTransition = TimeZoneTransition.Create(this.timeZoneDefinition, reader.LocalName);
            timeZoneTransition.LoadFromXml(reader);
            EwsUtilities.Assert(timeZoneTransition.TargetPeriod !== null, "TimeZoneTransitionGroup.TryReadElementFromXml", "The transition's target period is null.");
            this.transitions.Add(timeZoneTransition);
            return true;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TimeZoneTransition = enumerator.Current;
                    current.WriteToXml(writer);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Id", this.id);
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TimeZoneTransition = enumerator.Current;
                    list.Add(current.InternalToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("Transitions", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        InitializeFromAdjustmentRule(adjustmentRule: TimeZoneInfo_AdjustmentRule, standardPeriod: TimeZonePeriod): void {
            var timeZonePeriod: TimeZonePeriod = new TimeZonePeriod();
            timeZonePeriod.Id = NString.Format("{0}/{1}", "Dlt", adjustmentRule.DateStart.Year);
            timeZonePeriod.Name = "Daylight";
            timeZonePeriod.Bias = TimeSpan.op_Subtraction(standardPeriod.Bias, adjustmentRule.DaylightDelta);
            this.timeZoneDefinition.Periods.Add(timeZonePeriod.Id, timeZonePeriod);
            this.transitionToDaylight = TimeZoneTransition.CreateTimeZoneTransition(this.timeZoneDefinition, timeZonePeriod, adjustmentRule.DaylightTransitionStart);
            this.transitionToStandard = TimeZoneTransition.CreateTimeZoneTransition(this.timeZoneDefinition, standardPeriod, adjustmentRule.DaylightTransitionEnd);
            this.transitions.Add(this.transitionToDaylight);
            this.transitions.Add(this.transitionToStandard);
        }
        Validate(): void {
            if (this.transitions.Count < 1 || this.transitions.Count > 2) {
                throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
            }
            if (this.transitions.Count === 1 && Type.op_Inequality(this.transitions.get_Item(0).GetType(), new Type("TimeZoneTransition"))) {
                throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
            }
            if (this.transitions.Count === 2) {
                var enumerator: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: TimeZoneTransition = enumerator.Current;
                        if (Type.op_Equality(current.GetType(), new Type("TimeZoneTransition"))) {
                            throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
            var enumerator2: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: TimeZoneTransition = enumerator2.Current;
                    if (current2.TargetPeriod === null) {
                        throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
        }
        InitializeTransitions(): void {
            if (this.transitionToStandard === null) {
                var enumerator: List_Enumerator<TimeZoneTransition> = this.transitions.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: TimeZoneTransition = enumerator.Current;
                        if (current.TargetPeriod.IsStandardPeriod || this.transitions.Count === 1) {
                            this.transitionToStandard = current;
                        }
                        else {
                            this.transitionToDaylight = current;
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
            if (this.transitionToStandard === null) {
                throw new ServiceLocalException(Strings.InvalidOrUnsupportedTimeZoneDefinition);
            }
        }
        GetCustomTimeZoneCreationParams(): TimeZoneTransitionGroup_CustomTimeZoneCreateParams {
            var customTimeZoneCreateParams: TimeZoneTransitionGroup_CustomTimeZoneCreateParams = new TimeZoneTransitionGroup_CustomTimeZoneCreateParams();
            if (this.TransitionToDaylight !== null) {
                customTimeZoneCreateParams.DaylightDisplayName = this.TransitionToDaylight.TargetPeriod.Name;
            }
            customTimeZoneCreateParams.StandardDisplayName = this.TransitionToStandard.TargetPeriod.Name;
            customTimeZoneCreateParams.BaseOffsetToUtc = -this.TransitionToStandard.TargetPeriod.Bias;
            return customTimeZoneCreateParams;
        }
        GetDaylightDelta(): TimeSpan {
            if (this.SupportsDaylight) {
                return TimeSpan.op_Subtraction(this.TransitionToStandard.TargetPeriod.Bias, this.TransitionToDaylight.TargetPeriod.Bias);
            }
            return TimeSpan.Zero;
        }
        CreateAdjustmentRule(startDate: DateTime, endDate: DateTime): TimeZoneInfo_AdjustmentRule {
            if (this.transitions.Count === 1) {
                return null;
            }
            return TimeZoneInfo_AdjustmentRule.CreateAdjustmentRule(startDate.Date, endDate.Date, this.GetDaylightDelta(), this.TransitionToDaylight.CreateTransitionTime(), this.TransitionToStandard.CreateTransitionTime());
        }
        constructor(timeZoneDefinition: TimeZoneDefinition);
        constructor(timeZoneDefinition: TimeZoneDefinition, id: string);
        constructor(timeZoneDefinition: TimeZoneDefinition, id?: string) {
            super();
            if (arguments.length === 1 && (timeZoneDefinition === null || timeZoneDefinition instanceof TimeZoneDefinition)) {
                this.constructor_0(timeZoneDefinition);
                return;
            }
            this.constructor_1(timeZoneDefinition, id);
        }
        private constructor_0(timeZoneDefinition: TimeZoneDefinition): void {
            this.timeZoneDefinition = timeZoneDefinition;
        }
        private constructor_1(timeZoneDefinition: TimeZoneDefinition, id: string): void {
            this.constructor_0(timeZoneDefinition);
            this.id = id;
        }
    }
    class TimeZoneTransitionGroup_CustomTimeZoneCreateParams {
        private baseOffsetToUtc: TimeSpan = null;
        private standardDisplayName: string = null;
        private daylightDisplayName: string = null;
        set BaseOffsetToUtc(value: TimeSpan) {
            this.baseOffsetToUtc = value;
        }
        get BaseOffsetToUtc(): TimeSpan {
            return this.baseOffsetToUtc;
        }
        set StandardDisplayName(value: string) {
            this.standardDisplayName = value;
        }
        get StandardDisplayName(): string {
            return this.standardDisplayName;
        }
        set DaylightDisplayName(value: string) {
            this.daylightDisplayName = value;
        }
        get DaylightDisplayName(): string {
            return this.daylightDisplayName;
        }
        get HasDaylightPeriod(): boolean {
            return !NString.IsNullOrEmpty(this.daylightDisplayName);
        }
        constructor() {
            super();
        }
    }
    interface IEwsHttpWebRequest {
        Accept: string;
        AllowAutoRedirect: boolean;
        ClientCertificates: X509CertificateCollection;
        ContentType: string;
        CookieContainer: CookieContainer;
        Credentials: ICredentials;
        Headers: WebHeaderCollection;
        Method: string;
        PreAuthenticate: boolean;
        Proxy: IWebProxy;
        RequestUri: Uri;
        Timeout: number;
        UseDefaultCredentials: boolean;
        UserAgent: string;
        KeepAlive: boolean;
        ConnectionGroupName: string;
        Abort(): void;
        BeginGetRequestStream(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult;
        BeginGetResponse(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult;
        EndGetRequestStream(asyncResult: IAsyncResult): Stream;
        EndGetResponse(asyncResult: IAsyncResult): IEwsHttpWebResponse;
        GetRequestStream(): Stream;
        GetResponse(): IEwsHttpWebResponse;
    }
    class EwsHttpWebRequest implements IEwsHttpWebRequest {
        private request: HttpWebRequest = null;
        set Accept(value: string) {
            this.request.Accept = value;
        }
        get Accept(): string {
            return this.request.Accept;
        }
        set AllowAutoRedirect(value: boolean) {
            this.request.AllowAutoRedirect = value;
        }
        get AllowAutoRedirect(): boolean {
            return this.request.AllowAutoRedirect;
        }
        set ClientCertificates(value: X509CertificateCollection) {
            this.request.ClientCertificates = value;
        }
        get ClientCertificates(): X509CertificateCollection {
            return this.request.ClientCertificates;
        }
        set ContentType(value: string) {
            this.request.ContentType = value;
        }
        get ContentType(): string {
            return this.request.ContentType;
        }
        set CookieContainer(value: CookieContainer) {
            this.request.CookieContainer = value;
        }
        get CookieContainer(): CookieContainer {
            return this.request.CookieContainer;
        }
        set Credentials(value: ICredentials) {
            this.request.Credentials = value;
        }
        get Credentials(): ICredentials {
            return this.request.Credentials;
        }
        set Headers(value: WebHeaderCollection) {
            this.request.Headers = value;
        }
        get Headers(): WebHeaderCollection {
            return this.request.Headers;
        }
        set Method(value: string) {
            this.request.Method = value;
        }
        get Method(): string {
            return this.request.Method;
        }
        set Proxy(value: IWebProxy) {
            this.request.Proxy = value;
        }
        get Proxy(): IWebProxy {
            return this.request.Proxy;
        }
        set PreAuthenticate(value: boolean) {
            this.request.PreAuthenticate = value;
        }
        get PreAuthenticate(): boolean {
            return this.request.PreAuthenticate;
        }
        get RequestUri(): Uri {
            return this.request.RequestUri;
        }
        set Timeout(value: number) {
            this.request.Timeout = value;
        }
        get Timeout(): number {
            return this.request.Timeout;
        }
        set UseDefaultCredentials(value: boolean) {
            this.request.UseDefaultCredentials = value;
        }
        get UseDefaultCredentials(): boolean {
            return this.request.UseDefaultCredentials;
        }
        set UserAgent(value: string) {
            this.request.UserAgent = value;
        }
        get UserAgent(): string {
            return this.request.UserAgent;
        }
        set KeepAlive(value: boolean) {
            this.request.KeepAlive = value;
        }
        get KeepAlive(): boolean {
            return this.request.KeepAlive;
        }
        set ConnectionGroupName(value: string) {
            this.request.ConnectionGroupName = value;
        }
        get ConnectionGroupName(): string {
            return this.request.ConnectionGroupName;
        }
        constructor(uri: Uri) {
            super();
            this.request = <HttpWebRequest>WebRequest.Create(uri);
        }
        Abort(): void {
            this.request.Abort();
        }
        BeginGetRequestStream(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            return this.request.BeginGetRequestStream(callback, state);
        }
        BeginGetResponse(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            return this.request.BeginGetResponse(callback, state);
        }
        EndGetRequestStream(asyncResult: IAsyncResult): Stream {
            return this.request.EndGetRequestStream(asyncResult);
        }
        EndGetResponse(asyncResult: IAsyncResult): IEwsHttpWebResponse {
            return new EwsHttpWebResponse(<HttpWebResponse>this.request.EndGetResponse(asyncResult));
        }
        GetRequestStream(): Stream {
            return this.request.GetRequestStream();
        }
        GetResponse(): IEwsHttpWebResponse {
            return new EwsHttpWebResponse(((this.request.GetResponse() instanceof HttpWebResponse) ? <HttpWebResponse>this.request.GetResponse() : null));
        }
    }
    interface IEwsHttpWebRequestFactory {
        CreateRequest(uri: Uri): IEwsHttpWebRequest;
        CreateExceptionResponse(exception: WebException): IEwsHttpWebResponse;
    }
    class EwsHttpWebRequestFactory implements IEwsHttpWebRequestFactory {
        CreateRequest(uri: Uri): IEwsHttpWebRequest {
            return new EwsHttpWebRequest(uri);
        }
        CreateExceptionResponse(exception: WebException): IEwsHttpWebResponse {
            EwsUtilities.ValidateParam(exception, "exception");
            if (exception.Response === null) {
                throw new InvalidOperationException("The exception does not contain response.");
            }
            return new EwsHttpWebResponse(((exception.Response instanceof HttpWebResponse) ? <HttpWebResponse>exception.Response : null));
        }
        constructor() {
            super();
        }
    }
    interface IEwsHttpWebResponse extends IDisposable {
        ContentEncoding: string;
        ContentType: string;
        Headers: WebHeaderCollection;
        ResponseUri: Uri;
        StatusCode: HttpStatusCode;
        StatusDescription: string;
        ProtocolVersion: Version;
        Close(): void;
        GetResponseStream(): Stream;
    }
    class EwsHttpWebResponse implements IEwsHttpWebResponse, IDisposable {
        private response: HttpWebResponse = null;
        get ContentEncoding(): string {
            return this.response.ContentEncoding;
        }
        get ContentType(): string {
            return this.response.ContentType;
        }
        get Headers(): WebHeaderCollection {
            return this.response.Headers;
        }
        get ResponseUri(): Uri {
            return this.response.ResponseUri;
        }
        get StatusCode(): HttpStatusCode {
            return this.response.StatusCode;
        }
        get StatusDescription(): string {
            return this.response.StatusDescription;
        }
        get ProtocolVersion(): Version {
            return this.response.ProtocolVersion;
        }
        constructor(response: HttpWebResponse) {
            super();
            this.response = response;
        }
        Close(): void {
            this.response.Close();
        }
        GetResponseStream(): Stream {
            return this.response.GetResponseStream();
        }
        Dispose(): void {
            this.response.Close();
        }
    }
    class EwsXmlReader {
        private static ReadWriteBufferSize: number = 4096;
        private prevNodeType: XmlNodeType = null;
        private xmlReader: XmlReader = null;
        get HasAttributes(): boolean {
            return this.xmlReader.get_AttributeCount() > 0;
        }
        get IsEmptyElement(): boolean {
            return this.xmlReader.get_IsEmptyElement();
        }
        get LocalName(): string {
            return this.xmlReader.get_LocalName();
        }
        get NamespacePrefix(): string {
            return this.xmlReader.get_Prefix();
        }
        get NamespaceUri(): string {
            return this.xmlReader.get_NamespaceURI();
        }
        get NodeType(): XmlNodeType {
            return this.xmlReader.get_NodeType();
        }
        get PrevNodeType(): XmlNodeType {
            return this.prevNodeType;
        }
        constructor(stream: Stream) {
            super();
            this.xmlReader = this.InitializeXmlReader(stream);
        }
        InitializeXmlReader(stream: Stream): XmlReader {
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ConformanceLevel(0);
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_IgnoreComments(true);
            xmlReaderSettings.set_IgnoreProcessingInstructions(true);
            xmlReaderSettings.set_IgnoreWhitespace(true);
            xmlReaderSettings.set_XmlResolver(null);
            var xmlReaderSettings2: XmlReaderSettings = xmlReaderSettings;
            var xmlTextReader: XmlTextReader = SafeXmlFactory.CreateSafeXmlTextReader(stream);
            xmlTextReader.set_Normalization(false);
            return XmlReader.Create(xmlTextReader, xmlReaderSettings2);
        }
        private static FormatElementName(namespacePrefix: string, localElementName: string): string {
            if (!NString.IsNullOrEmpty(namespacePrefix)) {
                return namespacePrefix + ":" + localElementName;
            }
            return localElementName;
        }
        private InternalReadElement(xmlNamespace: XmlNamespace, localName: string, nodeType: XmlNodeType): void;
        private InternalReadElement(namespacePrefix: string, localName: string, nodeType: XmlNodeType): void;
        private InternalReadElement(xmlNamespaceOrNamespacePrefix: any, localName: string, nodeType: XmlNodeType): void {
            if (arguments.length === 3 && (xmlNamespaceOrNamespacePrefix === null || xmlNamespaceOrNamespacePrefix.constructor === Number) && (localName === null || localName.constructor === String) && (nodeType === null || nodeType instanceof XmlNodeType)) {
                this.InternalReadElement_0(xmlNamespaceOrNamespacePrefix, localName, nodeType);
                return;
            }
            this.InternalReadElement_1(xmlNamespaceOrNamespacePrefix, localName, nodeType);
        }
        private InternalReadElement_0(xmlNamespace: XmlNamespace, localName: string, nodeType: XmlNodeType): void {
            if (xmlNamespace === XmlNamespace.NotSpecified) {
                this.InternalReadElement(NString.Empty, localName, nodeType);
                return;
            }
            this.Read(nodeType);
            if (this.LocalName !== localName || this.NamespaceUri !== EwsUtilities.GetNamespaceUri(xmlNamespace)) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.UnexpectedElement, [
                    EwsUtilities.GetNamespacePrefix(xmlNamespace), localName, nodeType, this.xmlReader.get_Name(), this.NodeType
                ]));
            }
        }
        private InternalReadElement_1(namespacePrefix: string, localName: string, nodeType: XmlNodeType): void {
            this.Read(nodeType);
            if (this.LocalName !== localName || this.NamespacePrefix !== namespacePrefix) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.UnexpectedElement, [
                    namespacePrefix, localName, nodeType, this.xmlReader.get_Name(), this.NodeType
                ]));
            }
        }
        Read(): void;
        Read(nodeType: XmlNodeType): void;
        Read(nodeType?: XmlNodeType): void {
            if (arguments.length === 0) {
                this.Read_0();
                return;
            }
            this.Read_1(nodeType);
        }
        private Read_0(): void {
            this.prevNodeType = this.xmlReader.get_NodeType();
            if (!this.xmlReader.Read()) {
                throw new ServiceXmlDeserializationException(Strings.UnexpectedEndOfXmlDocument);
            }
        }
        private Read_1(nodeType: XmlNodeType): void {
            this.Read();
            if (this.NodeType !== nodeType) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.UnexpectedElementType, nodeType, this.NodeType));
            }
        }
        ReadAttributeValue(xmlNamespace: XmlNamespace, attributeName: string): string;
        ReadAttributeValue(attributeName: string): string;
        ReadAttributeValue(attributeName: string): string;
        ReadAttributeValue(xmlNamespaceOrAttributeName: any, attributeName?: string): string {
            if (arguments.length === 2 && (xmlNamespaceOrAttributeName === null || xmlNamespaceOrAttributeName.constructor === Number) && (attributeName === null || attributeName.constructor === String)) {
                return this.ReadAttributeValue_0(xmlNamespaceOrAttributeName, attributeName);
            }
            if (arguments.length === 1 && (xmlNamespaceOrAttributeName === null || xmlNamespaceOrAttributeName.constructor === String)) {
                return this.ReadAttributeValue_1(xmlNamespaceOrAttributeName);
            }
            return this.ReadAttributeValue_2(xmlNamespaceOrAttributeName);
        }
        private ReadAttributeValue_0(xmlNamespace: XmlNamespace, attributeName: string): string {
            if (xmlNamespace === XmlNamespace.NotSpecified) {
                return this.ReadAttributeValue(attributeName);
            }
            return this.xmlReader.GetAttribute(attributeName, EwsUtilities.GetNamespaceUri(xmlNamespace));
        }
        private ReadAttributeValue_1(attributeName: string): string {
            return this.xmlReader.GetAttribute(attributeName);
        }
        private ReadAttributeValue_2<T>(attributeName: string): T {
            return EwsUtilities.Parse<T>(this.ReadAttributeValue(attributeName));
        }
        ReadNullableAttributeValue<T>(attributeName: string): Nullable<T> {
            var text: string = this.ReadAttributeValue(attributeName);
            if (text === null) {
                return null;
            }
            return new Nullable<T>(EwsUtilities.Parse<T>(text));
        }
        ReadElementValue(namespacePrefix: string, localName: string): string;
        ReadElementValue(xmlNamespace: XmlNamespace, localName: string): string;
        ReadElementValue(): string;
        ReadElementValue(xmlNamespace: XmlNamespace, localName: string): string;
        ReadElementValue(): string;
        ReadElementValue(namespacePrefixOrXmlNamespace?: any, localName?: string): string {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (localName === null || localName.constructor === String)) {
                return this.ReadElementValue_0(namespacePrefixOrXmlNamespace, localName);
            }
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === Number) && (localName === null || localName.constructor === String)) {
                return this.ReadElementValue_1(namespacePrefixOrXmlNamespace, localName);
            }
            if (arguments.length === 0) {
                return this.ReadElementValue_2();
            }
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === Number) && (localName === null || localName.constructor === String)) {
                return this.ReadElementValue_3(namespacePrefixOrXmlNamespace, localName);
            }
            return this.ReadElementValue_4();
        }
        private ReadElementValue_0(namespacePrefix: string, localName: string): string {
            if (!this.IsStartElement(namespacePrefix, localName)) {
                this.ReadStartElement(namespacePrefix, localName);
            }
            var result: string = null;
            if (!this.IsEmptyElement) {
                result = this.ReadValue();
            }
            return result;
        }
        private ReadElementValue_1(xmlNamespace: XmlNamespace, localName: string): string {
            if (!this.IsStartElement(xmlNamespace, localName)) {
                this.ReadStartElement(xmlNamespace, localName);
            }
            var result: string = null;
            if (!this.IsEmptyElement) {
                result = this.ReadValue();
            }
            return result;
        }
        private ReadElementValue_2(): string {
            this.EnsureCurrentNodeIsStartElement();
            return this.ReadElementValue(this.NamespacePrefix, this.LocalName);
        }
        private ReadElementValue_3<T>(xmlNamespace: XmlNamespace, localName: string): T {
            if (!this.IsStartElement(xmlNamespace, localName)) {
                this.ReadStartElement(xmlNamespace, localName);
            }
            var result: T = null;
            if (!this.IsEmptyElement) {
                result = this.ReadValue<T>();
            }
            return result;
        }
        private ReadElementValue_4<T>(): T {
            this.EnsureCurrentNodeIsStartElement();
            var arg_0C_0: string = this.NamespacePrefix;
            var arg_13_0: string = this.LocalName;
            var result: T = null;
            if (!this.IsEmptyElement) {
                result = this.ReadValue<T>();
            }
            return result;
        }
        ReadValue(): string;
        ReadValue(): string;
        ReadValue(): string {
            if (arguments.length === 0) {
                return this.ReadValue_0();
            }
            return this.ReadValue_1();
        }
        private ReadValue_0(): string {
            return this.xmlReader.ReadString();
        }
        TryReadValue(value: string[]): boolean {
            if (this.IsEmptyElement) {
                return false;
            }
            this.Read();
            if (this.NodeType === 3) {
                value[0] = this.xmlReader.get_Value();
                return true;
            }
            return false;
        }
        private ReadValue_1<T>(): T {
            return EwsUtilities.Parse<T>(this.ReadValue());
        }
        ReadBase64ElementValue(): number[];
        ReadBase64ElementValue(outputStream: Stream): number[];
        ReadBase64ElementValue(outputStream?: Stream): number[] {
            if (arguments.length === 0) {
                return this.ReadBase64ElementValue_0();
            }
            return this.ReadBase64ElementValue_1(outputStream);
        }
        private ReadBase64ElementValue_0(): number[] {
            this.EnsureCurrentNodeIsStartElement();
            var array: number[] = new Array<number>(4096);
            for (var _ai: number = 0; _ai < array.length; ++_ai)
                array[_ai] = 0;
            var memoryStream: MemoryStream = new MemoryStream();
            var result: number[];
            try {
                var num: number;
                do {
                    num = this.xmlReader.ReadElementContentAsBase64(array, 0, 4096);
                    if (num > 0) {
                        memoryStream.Write(array, 0, num);
                    }
                }
                while (num > 0);
                result = ((memoryStream.Length === <number>memoryStream.Capacity) ? memoryStream.GetBuffer() : memoryStream.ToArray());
            }
            finally {
                if (memoryStream !== null) {
                    (<IDisposable>memoryStream).Dispose();
                }
            }
            return result;
        }
        private ReadBase64ElementValue_1(outputStream: Stream): void {
            this.EnsureCurrentNodeIsStartElement();
            var array: number[] = new Array<number>(4096);
            for (var _ai: number = 0; _ai < array.length; ++_ai)
                array[_ai] = 0;
            var num: number;
            do {
                num = this.xmlReader.ReadElementContentAsBase64(array, 0, 4096);
                if (num > 0) {
                    outputStream.Write(array, 0, num);
                }
            }
            while (num > 0);
            outputStream.Flush();
        }
        ReadStartElement(namespacePrefix: string, localName: string): void;
        ReadStartElement(xmlNamespace: XmlNamespace, localName: string): void;
        ReadStartElement(namespacePrefixOrXmlNamespace: any, localName: string): void {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (localName === null || localName.constructor === String)) {
                this.ReadStartElement_0(namespacePrefixOrXmlNamespace, localName);
                return;
            }
            this.ReadStartElement_1(namespacePrefixOrXmlNamespace, localName);
        }
        private ReadStartElement_0(namespacePrefix: string, localName: string): void {
            this.InternalReadElement(namespacePrefix, localName, 1);
        }
        private ReadStartElement_1(xmlNamespace: XmlNamespace, localName: string): void {
            this.InternalReadElement(xmlNamespace, localName, 1);
        }
        ReadEndElement(namespacePrefix: string, elementName: string): void;
        ReadEndElement(xmlNamespace: XmlNamespace, localName: string): void;
        ReadEndElement(namespacePrefixOrXmlNamespace: any, elementNameOrLocalName: string): void {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (elementNameOrLocalName === null || elementNameOrLocalName.constructor === String)) {
                this.ReadEndElement_0(namespacePrefixOrXmlNamespace, elementNameOrLocalName);
                return;
            }
            this.ReadEndElement_1(namespacePrefixOrXmlNamespace, elementNameOrLocalName);
        }
        private ReadEndElement_0(namespacePrefix: string, elementName: string): void {
            this.InternalReadElement(namespacePrefix, elementName, 15);
        }
        private ReadEndElement_1(xmlNamespace: XmlNamespace, localName: string): void {
            this.InternalReadElement(xmlNamespace, localName, 15);
        }
        ReadEndElementIfNecessary(xmlNamespace: XmlNamespace, localName: string): void {
            if ((!this.IsStartElement(xmlNamespace, localName) || !this.IsEmptyElement) && !this.IsEndElement(xmlNamespace, localName)) {
                this.ReadEndElement(xmlNamespace, localName);
            }
        }
        IsStartElement(namespacePrefix: string, localName: string): boolean;
        IsStartElement(xmlNamespace: XmlNamespace, localName: string): boolean;
        IsStartElement(): boolean;
        IsStartElement(namespacePrefixOrXmlNamespace?: any, localName?: string): boolean {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (localName === null || localName.constructor === String)) {
                return this.IsStartElement_0(namespacePrefixOrXmlNamespace, localName);
            }
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === Number) && (localName === null || localName.constructor === String)) {
                return this.IsStartElement_1(namespacePrefixOrXmlNamespace, localName);
            }
            return this.IsStartElement_2();
        }
        private IsStartElement_0(namespacePrefix: string, localName: string): boolean {
            var b: string = EwsXmlReader.FormatElementName(namespacePrefix, localName);
            return this.NodeType === 1 && this.xmlReader.get_Name() === b;
        }
        private IsStartElement_1(xmlNamespace: XmlNamespace, localName: string): boolean {
            return this.LocalName === localName && this.IsStartElement() && (this.NamespacePrefix === EwsUtilities.GetNamespacePrefix(xmlNamespace) || this.NamespaceUri === EwsUtilities.GetNamespaceUri(xmlNamespace));
        }
        private IsStartElement_2(): boolean {
            return this.NodeType === 1;
        }
        IsEndElement(namespacePrefix: string, localName: string): boolean;
        IsEndElement(xmlNamespace: XmlNamespace, localName: string): boolean;
        IsEndElement(namespacePrefixOrXmlNamespace: any, localName: string): boolean {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (localName === null || localName.constructor === String)) {
                return this.IsEndElement_0(namespacePrefixOrXmlNamespace, localName);
            }
            return this.IsEndElement_1(namespacePrefixOrXmlNamespace, localName);
        }
        private IsEndElement_0(namespacePrefix: string, localName: string): boolean {
            var b: string = EwsXmlReader.FormatElementName(namespacePrefix, localName);
            return this.NodeType === 15 && this.xmlReader.get_Name() === b;
        }
        private IsEndElement_1(xmlNamespace: XmlNamespace, localName: string): boolean {
            return this.LocalName === localName && this.NodeType === 15 && (this.NamespacePrefix === EwsUtilities.GetNamespacePrefix(xmlNamespace) || this.NamespaceUri === EwsUtilities.GetNamespaceUri(xmlNamespace));
        }
        SkipElement(namespacePrefix: string, localName: string): void;
        SkipElement(xmlNamespace: XmlNamespace, localName: string): void;
        SkipElement(namespacePrefixOrXmlNamespace: any, localName: string): void {
            if (arguments.length === 2 && (namespacePrefixOrXmlNamespace === null || namespacePrefixOrXmlNamespace.constructor === String) && (localName === null || localName.constructor === String)) {
                this.SkipElement_0(namespacePrefixOrXmlNamespace, localName);
                return;
            }
            this.SkipElement_1(namespacePrefixOrXmlNamespace, localName);
        }
        private SkipElement_0(namespacePrefix: string, localName: string): void {
            if (!this.IsEndElement(namespacePrefix, localName)) {
                if (!this.IsStartElement(namespacePrefix, localName)) {
                    this.ReadStartElement(namespacePrefix, localName);
                }
                if (!this.IsEmptyElement) {
                    do {
                        this.Read();
                    }
                    while (!this.IsEndElement(namespacePrefix, localName));
                }
            }
        }
        private SkipElement_1(xmlNamespace: XmlNamespace, localName: string): void {
            if (!this.IsEndElement(xmlNamespace, localName)) {
                if (!this.IsStartElement(xmlNamespace, localName)) {
                    this.ReadStartElement(xmlNamespace, localName);
                }
                if (!this.IsEmptyElement) {
                    do {
                        this.Read();
                    }
                    while (!this.IsEndElement(xmlNamespace, localName));
                }
            }
        }
        SkipCurrentElement(): void {
            this.SkipElement(this.NamespacePrefix, this.LocalName);
        }
        EnsureCurrentNodeIsStartElement(xmlNamespace: XmlNamespace, localName: string): void;
        EnsureCurrentNodeIsStartElement(): void;
        EnsureCurrentNodeIsStartElement(xmlNamespace?: XmlNamespace, localName?: string): void {
            if (arguments.length === 2 && (xmlNamespace === null || xmlNamespace.constructor === Number) && (localName === null || localName.constructor === String)) {
                this.EnsureCurrentNodeIsStartElement_0(xmlNamespace, localName);
                return;
            }
            this.EnsureCurrentNodeIsStartElement_1();
        }
        private EnsureCurrentNodeIsStartElement_0(xmlNamespace: XmlNamespace, localName: string): void {
            if (!this.IsStartElement(xmlNamespace, localName)) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.ElementNotFound, localName, xmlNamespace));
            }
        }
        private EnsureCurrentNodeIsStartElement_1(): void {
            if (this.NodeType !== 1) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.ExpectedStartElement, this.xmlReader.get_Name(), this.NodeType));
            }
        }
        EnsureCurrentNodeIsEndElement(xmlNamespace: XmlNamespace, localName: string): void {
            if (!this.IsEndElement(xmlNamespace, localName) && (!this.IsStartElement(xmlNamespace, localName) || !this.IsEmptyElement)) {
                throw new ServiceXmlDeserializationException(NString.Format(Strings.ElementNotFound, localName, xmlNamespace));
            }
        }
        ReadOuterXml(): string {
            if (!this.IsStartElement()) {
                throw new ServiceXmlDeserializationException(Strings.CurrentPositionNotElementStart);
            }
            return this.xmlReader.ReadOuterXml();
        }
        ReadInnerXml(): string {
            if (!this.IsStartElement()) {
                throw new ServiceXmlDeserializationException(Strings.CurrentPositionNotElementStart);
            }
            return this.xmlReader.ReadInnerXml();
        }
        GetXmlReaderForNode(): XmlReader {
            return this.xmlReader.ReadSubtree();
        }
        ReadToDescendant(xmlNamespace: XmlNamespace, localName: string): void {
            this.xmlReader.ReadToDescendant(localName, EwsUtilities.GetNamespaceUri(xmlNamespace));
        }
    }
    class EwsServiceXmlReader extends EwsXmlReader {
        private service: ExchangeService = null;
        get Service(): ExchangeService {
            return this.service;
        }
        constructor(stream: Stream, service: ExchangeService) {
            super(stream);
            this.service = service;
        }
        private ConvertStringToDateTime(dateTimeString: string): Nullable<DateTime> {
            return this.Service.ConvertUniversalDateTimeStringToLocalDateTime(dateTimeString);
        }
        private ConvertStringToUnspecifiedDate(dateTimeString: string): Nullable<DateTime> {
            return this.Service.ConvertStartDateToUnspecifiedDateTime(dateTimeString);
        }
        ReadElementValueAsDateTime(): Nullable<DateTime>;
        ReadElementValueAsDateTime(xmlNamespace: XmlNamespace, localName: string): Nullable<DateTime>;
        ReadElementValueAsDateTime(xmlNamespace?: XmlNamespace, localName?: string): Nullable<DateTime> {
            if (arguments.length === 0) {
                return this.ReadElementValueAsDateTime_0();
            }
            return this.ReadElementValueAsDateTime_1(xmlNamespace, localName);
        }
        private ReadElementValueAsDateTime_0(): Nullable<DateTime> {
            return this.ConvertStringToDateTime(super.ReadElementValue());
        }
        ReadElementValueAsUnspecifiedDate(): Nullable<DateTime> {
            return this.ConvertStringToUnspecifiedDate(super.ReadElementValue());
        }
        ReadElementValueAsUnbiasedDateTimeScopedToServiceTimeZone(): DateTime {
            var dateString: string = super.ReadElementValue();
            return EwsUtilities.ParseAsUnbiasedDatetimescopedToServicetimeZone(dateString, this.Service);
        }
        private ReadElementValueAsDateTime_1(xmlNamespace: XmlNamespace, localName: string): Nullable<DateTime> {
            return this.ConvertStringToDateTime(super.ReadElementValue(xmlNamespace, localName));
        }
        ReadServiceObjectsCollectionFromXml(collectionXmlNamespace: XmlNamespace, collectionXmlElementName: string, getObjectInstanceDelegate: (service: ExchangeService, xmlElementName: string) => TServiceObject, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): List<TServiceObject>;
        ReadServiceObjectsCollectionFromXml(collectionXmlElementName: string, getObjectInstanceDelegate: (service: ExchangeService, xmlElementName: string) => TServiceObject, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): List<TServiceObject>;
        ReadServiceObjectsCollectionFromXml(collectionXmlNamespaceOrCollectionXmlElementName: any, collectionXmlElementNameOrGetObjectInstanceDelegate: any, getObjectInstanceDelegateOrClearPropertyBag: any, clearPropertyBagOrRequestedPropertySet: any, requestedPropertySetOrSummaryPropertiesOnly: any, summaryPropertiesOnly?: boolean): List<TServiceObject> {
            if (arguments.length === 6 && (collectionXmlNamespaceOrCollectionXmlElementName === null || collectionXmlNamespaceOrCollectionXmlElementName.constructor === Number) && (collectionXmlElementNameOrGetObjectInstanceDelegate === null || collectionXmlElementNameOrGetObjectInstanceDelegate.constructor === String) && (clearPropertyBagOrRequestedPropertySet === null || clearPropertyBagOrRequestedPropertySet.constructor === Boolean) && (requestedPropertySetOrSummaryPropertiesOnly === null || requestedPropertySetOrSummaryPropertiesOnly instanceof PropertySet) && (summaryPropertiesOnly === null || summaryPropertiesOnly.constructor === Boolean)) {
                return this.ReadServiceObjectsCollectionFromXml_0(collectionXmlNamespaceOrCollectionXmlElementName, collectionXmlElementNameOrGetObjectInstanceDelegate, getObjectInstanceDelegateOrClearPropertyBag, clearPropertyBagOrRequestedPropertySet, requestedPropertySetOrSummaryPropertiesOnly, summaryPropertiesOnly);
            }
            return this.ReadServiceObjectsCollectionFromXml_1(collectionXmlNamespaceOrCollectionXmlElementName, collectionXmlElementNameOrGetObjectInstanceDelegate, getObjectInstanceDelegateOrClearPropertyBag, clearPropertyBagOrRequestedPropertySet, requestedPropertySetOrSummaryPropertiesOnly);
        }
        private ReadServiceObjectsCollectionFromXml_0<TServiceObject>(collectionXmlNamespace: XmlNamespace, collectionXmlElementName: string, getObjectInstanceDelegate: (service: ExchangeService, xmlElementName: string) => TServiceObject, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): List<TServiceObject> {
            var list: List<TServiceObject> = new List<TServiceObject>();
            var tServiceObject: TServiceObject = null;
            if (!super.IsStartElement(collectionXmlNamespace, collectionXmlElementName)) {
                super.ReadStartElement(collectionXmlNamespace, collectionXmlElementName);
            }
            if (!this.IsEmptyElement) {
                while (true) {
                    super.Read();
                    if (super.IsStartElement()) {
                        tServiceObject = getObjectInstanceDelegate(this.Service, this.LocalName);
                        if (tServiceObject === null) {
                            super.SkipCurrentElement();
                        }
                        else {
                            if (NString.Compare(this.LocalName, tServiceObject.GetXmlElementName(), StringComparison.Ordinal) !== 0) {
                                break;
                            }
                            tServiceObject.LoadFromXml(this, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
                            list.Add(tServiceObject);
                        }
                    }
                    if (super.IsEndElement(collectionXmlNamespace, collectionXmlElementName)) {
                        return list;
                    }
                }
                throw new ServiceLocalException(NString.Format("The type of the object in the store ({0}) does not match that of the local object ({1}).", this.LocalName, tServiceObject.GetXmlElementName()));
            }
            return list;
        }
        private ReadServiceObjectsCollectionFromXml_1<TServiceObject>(collectionXmlElementName: string, getObjectInstanceDelegate: (service: ExchangeService, xmlElementName: string) => TServiceObject, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): List<TServiceObject> {
            return this.ReadServiceObjectsCollectionFromXml<TServiceObject>(XmlNamespace.Messages, collectionXmlElementName, getObjectInstanceDelegate, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
        }
    }
    class EwsServiceMultiResponseXmlReader extends EwsServiceXmlReader {
        constructor(stream: Stream, service: ExchangeService) {
            super(stream, service);
        }
        static Create(stream: Stream, service: ExchangeService): EwsServiceMultiResponseXmlReader {
            return new EwsServiceMultiResponseXmlReader(stream, service);
        }
        private static CreateXmlReader(stream: Stream): XmlReader {
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ConformanceLevel(0);
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_IgnoreComments(true);
            xmlReaderSettings.set_IgnoreProcessingInstructions(true);
            xmlReaderSettings.set_IgnoreWhitespace(true);
            xmlReaderSettings.set_XmlResolver(null);
            var xmlReaderSettings2: XmlReaderSettings = xmlReaderSettings;
            return XmlReader.Create(stream, xmlReaderSettings2);
        }
        InitializeXmlReader(stream: Stream): XmlReader {
            return EwsServiceMultiResponseXmlReader.CreateXmlReader(stream);
        }
    }
    class EwsServiceJsonReader {
        Service: ExchangeService = null;
        constructor(service: ExchangeService) {
            super();
            this.Service = service;
        }
        ReadServiceObjectsCollectionFromJson<TServiceObject>(jsonResponse: JsonObject, collectionJsonElementName: string, getObjectInstanceDelegate: (service: ExchangeService, xmlElementName: string) => TServiceObject, clearPropertyBag: boolean, requestedPropertySet: PropertySet, summaryPropertiesOnly: boolean): List<TServiceObject> {
            var list: List<TServiceObject> = new List<TServiceObject>();
            var tServiceObject: TServiceObject = null;
            var array: any[] = jsonResponse.ReadAsArray(collectionJsonElementName);
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var obj: any = array2[i];
                var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                if (jsonObject !== null) {
                    tServiceObject = getObjectInstanceDelegate(this.Service, jsonObject.ReadTypeString());
                    if (tServiceObject !== null) {
                        if (NString.Compare(jsonObject.ReadTypeString(), tServiceObject.GetXmlElementName(), StringComparison.Ordinal) !== 0) {
                            throw new ServiceLocalException(NString.Format("The type of the object in the store ({0}) does not match that of the local object ({1}).", jsonObject.ReadTypeString(), tServiceObject.GetXmlElementName()));
                        }
                        tServiceObject.LoadFromJson(jsonObject, this.Service, clearPropertyBag, requestedPropertySet, summaryPropertiesOnly);
                        list.Add(tServiceObject);
                    }
                }
            }
            return list;
        }
    }
    class EwsServiceXmlWriter implements IDisposable {
        private static BufferSize: number = 4096;
        private static utf8Encoding: Encoding = new UTF8Encoding(false);
        private isDisposed: boolean = false;
        private service: ExchangeServiceBase = null;
        private xmlWriter: XmlWriter = null;
        private isTimeZoneHeaderEmitted: boolean = false;
        private requireWSSecurityUtilityNamespace: boolean = false;
        get InternalWriter(): XmlWriter {
            return this.xmlWriter;
        }
        get Service(): ExchangeServiceBase {
            return this.service;
        }
        set IsTimeZoneHeaderEmitted(value: boolean) {
            this.isTimeZoneHeaderEmitted = value;
        }
        get IsTimeZoneHeaderEmitted(): boolean {
            return this.isTimeZoneHeaderEmitted;
        }
        set RequireWSSecurityUtilityNamespace(value: boolean) {
            this.requireWSSecurityUtilityNamespace = value;
        }
        get RequireWSSecurityUtilityNamespace(): boolean {
            return this.requireWSSecurityUtilityNamespace;
        }
        constructor(service: ExchangeServiceBase, stream: Stream) {
            super();
            this.service = service;
            var xmlWriterSettings: XmlWriterSettings = new XmlWriterSettings();
            xmlWriterSettings.set_Indent(true);
            xmlWriterSettings.set_Encoding(EwsServiceXmlWriter.utf8Encoding);
            this.xmlWriter = XmlWriter.Create(stream, xmlWriterSettings);
        }
        TryConvertObjectToString(value: any, strValue: string[]): boolean {
            strValue[0] = null;
            var result: boolean = true;
            if (value !== null) {
                var convertible: IConvertible = ((value instanceof IConvertible) ? <IConvertible>value : null);
                if (value.GetType().IsEnum) {
                    strValue[0] = EwsUtilities.SerializeEnum(<Enum>value);
                }
                else {
                    if (convertible !== null) {
                        var typeCode: TypeCode = convertible.GetTypeCode();
                        if (typeCode !== TypeCode.Boolean) {
                            if (typeCode !== TypeCode.DateTime) {
                                strValue[0] = convertible.ToString(CultureInfo.InvariantCulture);
                            }
                            else {
                                strValue[0] = this.Service.ConvertDateTimeToUniversalDateTimeString(<DateTime>value);
                            }
                        }
                        else {
                            strValue[0] = EwsUtilities.BoolToXSBool(<boolean>value);
                        }
                    }
                    else {
                        var formattable: IFormattable = ((value instanceof IFormattable) ? <IFormattable>value : null);
                        if (formattable !== null) {
                            strValue[0] = formattable.ToString(null, null);
                        }
                        else {
                            if (value instanceof ISearchStringProvider) {
                                var searchStringProvider: ISearchStringProvider = ((value instanceof ISearchStringProvider) ? <ISearchStringProvider>value : null);
                                strValue[0] = searchStringProvider.GetSearchString();
                            }
                            else {
                                if (value instanceof number[]) {
                                    strValue[0] = Convert.ToBase64String(<number[]>value);
                                }
                                else {
                                    result = false;
                                }
                            }
                        }
                    }
                }
            }
            return result;
        }
        Dispose(): void {
            if (!this.isDisposed) {
                this.xmlWriter.Close();
                this.isDisposed = true;
            }
        }
        Flush(): void {
            this.xmlWriter.Flush();
        }
        WriteStartElement(xmlNamespace: XmlNamespace, localName: string): void {
            this.xmlWriter.WriteStartElement(EwsUtilities.GetNamespacePrefix(xmlNamespace), localName, EwsUtilities.GetNamespaceUri(xmlNamespace));
        }
        WriteEndElement(): void {
            this.xmlWriter.WriteEndElement();
        }
        WriteAttributeValue(localName: string, value: any): void;
        WriteAttributeValue(localName: string, alwaysWriteEmptyString: boolean, value: any): void;
        WriteAttributeValue(namespacePrefix: string, localName: string, value: any): void;
        WriteAttributeValue(localNameOrNamespacePrefix: string, valueOrAlwaysWriteEmptyStringOrLocalName: any, value?: any): void {
            if (arguments.length === 2 && (localNameOrNamespacePrefix === null || localNameOrNamespacePrefix.constructor === String) && (valueOrAlwaysWriteEmptyStringOrLocalName === null || valueOrAlwaysWriteEmptyStringOrLocalName.constructor === Object)) {
                this.WriteAttributeValue_0(localNameOrNamespacePrefix, valueOrAlwaysWriteEmptyStringOrLocalName);
                return;
            }
            if (arguments.length === 3 && (localNameOrNamespacePrefix === null || localNameOrNamespacePrefix.constructor === String) && (valueOrAlwaysWriteEmptyStringOrLocalName === null || valueOrAlwaysWriteEmptyStringOrLocalName.constructor === Boolean) && (value === null || value.constructor === Object)) {
                this.WriteAttributeValue_1(localNameOrNamespacePrefix, valueOrAlwaysWriteEmptyStringOrLocalName, value);
                return;
            }
            this.WriteAttributeValue_2(localNameOrNamespacePrefix, valueOrAlwaysWriteEmptyStringOrLocalName, value);
        }
        private WriteAttributeValue_0(localName: string, value: any): void {
            this.WriteAttributeValue(localName, false, value);
        }
        private WriteAttributeValue_1(localName: string, alwaysWriteEmptyString: boolean, value: any): void {
            var text: string;
            if (!(() => {
                var _p0 = [
                    text
                ];
                var _r = this.TryConvertObjectToString(value, _p0);
                text = _p0[0];
                return _r;
            })()) {
                throw new ServiceXmlSerializationException(NString.Format(Strings.AttributeValueCannotBeSerialized, value.GetType().Name, localName));
            }
            if (text !== null && (alwaysWriteEmptyString || text.length !== 0)) {
                this.WriteAttributeString(localName, text);
                return;
            }
        }
        private WriteAttributeValue_2(namespacePrefix: string, localName: string, value: any): void {
            var text: string;
            if (!(() => {
                var _p0 = [
                    text
                ];
                var _r = this.TryConvertObjectToString(value, _p0);
                text = _p0[0];
                return _r;
            })()) {
                throw new ServiceXmlSerializationException(NString.Format(Strings.AttributeValueCannotBeSerialized, value.GetType().Name, localName));
            }
            if (!NString.IsNullOrEmpty(text)) {
                this.WriteAttributeString(namespacePrefix, localName, text);
                return;
            }
        }
        WriteAttributeString(localName: string, stringValue: string): void;
        WriteAttributeString(namespacePrefix: string, localName: string, stringValue: string): void;
        WriteAttributeString(localNameOrNamespacePrefix: string, stringValueOrLocalName: string, stringValue?: string): void {
            if (arguments.length === 2 && (localNameOrNamespacePrefix === null || localNameOrNamespacePrefix.constructor === String) && (stringValueOrLocalName === null || stringValueOrLocalName.constructor === String)) {
                this.WriteAttributeString_0(localNameOrNamespacePrefix, stringValueOrLocalName);
                return;
            }
            this.WriteAttributeString_1(localNameOrNamespacePrefix, stringValueOrLocalName, stringValue);
        }
        private WriteAttributeString_0(localName: string, stringValue: string): void {
            try {
                this.xmlWriter.WriteAttributeString(localName, stringValue);
            }
            catch (innerException) {
                if (innerException instanceof ArgumentException) {
                    throw new ServiceXmlSerializationException(NString.Format(Strings.InvalidAttributeValue, stringValue, localName), innerException);
                }
                else
                    throw innerException;
            }
        }
        private WriteAttributeString_1(namespacePrefix: string, localName: string, stringValue: string): void {
            try {
                this.xmlWriter.WriteAttributeString(namespacePrefix, localName, null, stringValue);
            }
            catch (innerException) {
                if (innerException instanceof ArgumentException) {
                    throw new ServiceXmlSerializationException(NString.Format(Strings.InvalidAttributeValue, stringValue, localName), innerException);
                }
                else
                    throw innerException;
            }
        }
        WriteValue(value: string, name: string): void {
            try {
                this.xmlWriter.WriteValue(value);
            }
            catch (innerException) {
                if (innerException instanceof ArgumentException) {
                    throw new ServiceXmlSerializationException(NString.Format(Strings.InvalidElementStringValue, value, name), innerException);
                }
                else
                    throw innerException;
            }
        }
        WriteElementValue(xmlNamespace: XmlNamespace, localName: string, displayName: string, value: any): void;
        WriteElementValue(xmlNamespace: XmlNamespace, localName: string, value: any): void;
        WriteElementValue(xmlNamespace: XmlNamespace, localName: string, displayNameOrValue: any, value?: any): void {
            if (arguments.length === 4 && (xmlNamespace === null || xmlNamespace.constructor === Number) && (localName === null || localName.constructor === String) && (displayNameOrValue === null || displayNameOrValue.constructor === String) && (value === null || value.constructor === Object)) {
                this.WriteElementValue_0(xmlNamespace, localName, displayNameOrValue, value);
                return;
            }
            this.WriteElementValue_1(xmlNamespace, localName, displayNameOrValue);
        }
        private WriteElementValue_0(xmlNamespace: XmlNamespace, localName: string, displayName: string, value: any): void {
            var text: string;
            if (!(() => {
                var _p0 = [
                    text
                ];
                var _r = this.TryConvertObjectToString(value, _p0);
                text = _p0[0];
                return _r;
            })()) {
                throw new ServiceXmlSerializationException(NString.Format(Strings.ElementValueCannotBeSerialized, value.GetType().Name, localName));
            }
            if (text !== null) {
                this.WriteStartElement(xmlNamespace, localName);
                this.WriteValue(text, displayName);
                this.WriteEndElement();
                return;
            }
        }
        WriteNode(xmlNode: XmlNode): void {
            if (xmlNode !== null) {
                xmlNode.WriteTo(this.xmlWriter);
            }
        }
        private WriteElementValue_1(xmlNamespace: XmlNamespace, localName: string, value: any): void {
            this.WriteElementValue(xmlNamespace, localName, localName, value);
        }
        WriteBase64ElementValue(buffer: number[]): void;
        WriteBase64ElementValue(stream: Stream): void;
        WriteBase64ElementValue(bufferOrStream: any): void {
            if (arguments.length === 1 && (bufferOrStream === null || bufferOrStream instanceof Array)) {
                this.WriteBase64ElementValue_0(bufferOrStream);
                return;
            }
            this.WriteBase64ElementValue_1(bufferOrStream);
        }
        private WriteBase64ElementValue_0(buffer: number[]): void {
            this.xmlWriter.WriteBase64(buffer, 0, buffer.length);
        }
        private WriteBase64ElementValue_1(stream: Stream): void {
            var array: number[] = new Array<number>(4096);
            for (var _ai: number = 0; _ai < array.length; ++_ai)
                array[_ai] = 0;
            var binaryReader: BinaryReader = new BinaryReader(stream);
            try {
                var num: number;
                do {
                    num = binaryReader.Read(array, 0, 4096);
                    if (num > 0) {
                        this.xmlWriter.WriteBase64(array, 0, num);
                    }
                }
                while (num > 0);
            }
            finally {
                if (binaryReader !== null) {
                    (<IDisposable>binaryReader).Dispose();
                }
            }
        }
    }
    class ExchangeServerInfo {
        private majorVersion: number = 0;
        private minorVersion: number = 0;
        private majorBuildNumber: number = 0;
        private minorBuildNumber: number = 0;
        private versionString: string = null;
        set MajorVersion(value: number) {
            this.majorVersion = value;
        }
        get MajorVersion(): number {
            return this.majorVersion;
        }
        set MinorVersion(value: number) {
            this.minorVersion = value;
        }
        get MinorVersion(): number {
            return this.minorVersion;
        }
        set MajorBuildNumber(value: number) {
            this.majorBuildNumber = value;
        }
        get MajorBuildNumber(): number {
            return this.majorBuildNumber;
        }
        set MinorBuildNumber(value: number) {
            this.minorBuildNumber = value;
        }
        get MinorBuildNumber(): number {
            return this.minorBuildNumber;
        }
        set VersionString(value: string) {
            this.versionString = value;
        }
        get VersionString(): string {
            return this.versionString;
        }
        constructor() {
            super();
        }
        static Parse(reader: EwsServiceXmlReader): ExchangeServerInfo;
        static Parse(jsonObject: JsonObject): ExchangeServerInfo;
        static Parse(readerOrJsonObject: any): ExchangeServerInfo {
            if (arguments.length === 1 && (readerOrJsonObject === null || readerOrJsonObject instanceof EwsServiceXmlReader)) {
                return ExchangeServerInfo.Parse_0(readerOrJsonObject);
            }
            return ExchangeServerInfo.Parse_1(readerOrJsonObject);
        }
        private static Parse_0(reader: EwsServiceXmlReader): ExchangeServerInfo {
            EwsUtilities.Assert(reader.HasAttributes, "ExchangeServerVersion.Parse", "Current element doesn't have attributes");
            var exchangeServerInfo: ExchangeServerInfo = new ExchangeServerInfo();
            exchangeServerInfo.MajorVersion = reader.ReadAttributeValue<number>("MajorVersion");
            exchangeServerInfo.MinorVersion = reader.ReadAttributeValue<number>("MinorVersion");
            exchangeServerInfo.MajorBuildNumber = reader.ReadAttributeValue<number>("MajorBuildNumber");
            exchangeServerInfo.MinorBuildNumber = reader.ReadAttributeValue<number>("MinorBuildNumber");
            exchangeServerInfo.VersionString = reader.ReadAttributeValue("Version");
            return exchangeServerInfo;
        }
        private static Parse_1(jsonObject: JsonObject): ExchangeServerInfo {
            var exchangeServerInfo: ExchangeServerInfo = new ExchangeServerInfo();
            exchangeServerInfo.MajorVersion = jsonObject.ReadAsInt("MajorVersion");
            exchangeServerInfo.MinorVersion = jsonObject.ReadAsInt("MinorVersion");
            exchangeServerInfo.MajorBuildNumber = jsonObject.ReadAsInt("MajorBuildNumber");
            exchangeServerInfo.MinorBuildNumber = jsonObject.ReadAsInt("MinorBuildNumber");
            exchangeServerInfo.VersionString = jsonObject.ReadAsString("Version");
            return exchangeServerInfo;
        }
        ToString(): string {
            return NString.Format("{0:d}.{1:d2}.{2:d4}.{3:d3}", [
                this.MajorVersion, this.MinorVersion, this.MajorBuildNumber, this.MinorBuildNumber
            ]);
        }
    }
    class ExchangeService extends ExchangeServiceBase {
        static TargetServerVersionHeaderName: string = "X-EWS-TargetVersion";
        url: Uri = null;
        preferredCulture: CultureInfo = null;
        dateTimePrecision: DateTimePrecision = 0;
        impersonatedUserId: ImpersonatedUserId = null;
        privilegedUserId: PrivilegedUserId = null;
        managementRoles: ManagementRoles = null;
        fileAttachmentContentHandler: IFileAttachmentContentHandler = null;
        unifiedMessaging: UnifiedMessaging = null;
        enableScpLookup: boolean = true;
        renderingMode: ExchangeService_RenderingMode = 0;
        traceEnablePrettyPrinting: boolean = true;
        targetServerVersion: string = null;
        exchange2007CompatibilityMode: boolean = false;
        set Url(value: Uri) {
            this.url = value;
        }
        get Url(): Uri {
            return this.url;
        }
        set ImpersonatedUserId(value: ImpersonatedUserId) {
            this.impersonatedUserId = value;
        }
        get ImpersonatedUserId(): ImpersonatedUserId {
            return this.impersonatedUserId;
        }
        set PrivilegedUserId(value: PrivilegedUserId) {
            this.privilegedUserId = value;
        }
        get PrivilegedUserId(): PrivilegedUserId {
            return this.privilegedUserId;
        }
        set ManagementRoles(value: ManagementRoles) {
            this.managementRoles = value;
        }
        get ManagementRoles(): ManagementRoles {
            return this.managementRoles;
        }
        set PreferredCulture(value: CultureInfo) {
            this.preferredCulture = value;
        }
        get PreferredCulture(): CultureInfo {
            return this.preferredCulture;
        }
        set DateTimePrecision(value: DateTimePrecision) {
            this.dateTimePrecision = value;
        }
        get DateTimePrecision(): DateTimePrecision {
            return this.dateTimePrecision;
        }
        set FileAttachmentContentHandler(value: IFileAttachmentContentHandler) {
            this.fileAttachmentContentHandler = value;
        }
        get FileAttachmentContentHandler(): IFileAttachmentContentHandler {
            return this.fileAttachmentContentHandler;
        }
        get TimeZone(): TimeZoneInfo {
            return this.TimeZone;
        }
        get UnifiedMessaging(): UnifiedMessaging {
            if (this.unifiedMessaging === null) {
                this.unifiedMessaging = new UnifiedMessaging(this);
            }
            return this.unifiedMessaging;
        }
        set EnableScpLookup(value: boolean) {
            this.enableScpLookup = value;
        }
        get EnableScpLookup(): boolean {
            return this.enableScpLookup;
        }
        set Exchange2007CompatibilityMode(value: boolean) {
            this.exchange2007CompatibilityMode = value;
        }
        get Exchange2007CompatibilityMode(): boolean {
            return this.exchange2007CompatibilityMode;
        }
        set RenderingMethod(value: ExchangeService_RenderingMode) {
            this.renderingMode = value;
        }
        get RenderingMethod(): ExchangeService_RenderingMode {
            return this.renderingMode;
        }
        set TraceEnablePrettyPrinting(value: boolean) {
            this.traceEnablePrettyPrinting = value;
        }
        get TraceEnablePrettyPrinting(): boolean {
            return this.traceEnablePrettyPrinting;
        }
        set TargetServerVersion(value: string) {
            ExchangeService.ValidateTargetVersion(value);
            this.targetServerVersion = value;
        }
        get TargetServerVersion(): string {
            return this.targetServerVersion;
        }
        InternalCreateResponseObject(responseObject: ServiceObject, parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>): List<Item> {
            var createResponseObjectRequest: CreateResponseObjectRequest = new CreateResponseObjectRequest(this, ServiceErrorHandling.ThrowOnError);
            createResponseObjectRequest.ParentFolderId = parentFolderId;
            createResponseObjectRequest.Items = [
                responseObject
            ];
            createResponseObjectRequest.MessageDisposition = messageDisposition;
            var serviceResponseCollection: ServiceResponseCollection<CreateResponseObjectResponse> = createResponseObjectRequest.Execute();
            return serviceResponseCollection.get_Item(0).Items;
        }
        CreateFolder(folder: Folder, parentFolderId: FolderId): void {
            var createFolderRequest: CreateFolderRequest = new CreateFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            createFolderRequest.Folders = [
                folder
            ];
            createFolderRequest.ParentFolderId = parentFolderId;
            createFolderRequest.Execute();
        }
        UpdateFolder(folder: Folder): void {
            var updateFolderRequest: UpdateFolderRequest = new UpdateFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            updateFolderRequest.Folders.Add(folder);
            updateFolderRequest.Execute();
        }
        CopyFolder(folderId: FolderId, destinationFolderId: FolderId): Folder {
            var copyFolderRequest: CopyFolderRequest = new CopyFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            copyFolderRequest.DestinationFolderId = destinationFolderId;
            copyFolderRequest.FolderIds.Add(folderId);
            var serviceResponseCollection: ServiceResponseCollection<MoveCopyFolderResponse> = copyFolderRequest.Execute();
            return serviceResponseCollection.get_Item(0).Folder;
        }
        MoveFolder(folderId: FolderId, destinationFolderId: FolderId): Folder {
            var moveFolderRequest: MoveFolderRequest = new MoveFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            moveFolderRequest.DestinationFolderId = destinationFolderId;
            moveFolderRequest.FolderIds.Add(folderId);
            var serviceResponseCollection: ServiceResponseCollection<MoveCopyFolderResponse> = moveFolderRequest.Execute();
            return serviceResponseCollection.get_Item(0).Folder;
        }
        InternalFindFolders(parentFolderIds: IEnumerable<FolderId>, searchFilter: SearchFilter, view: FolderView, errorHandlingMode: ServiceErrorHandling): ServiceResponseCollection<FindFolderResponse> {
            var findFolderRequest: FindFolderRequest = new FindFolderRequest(this, errorHandlingMode);
            findFolderRequest.ParentFolderIds.AddRange(parentFolderIds);
            findFolderRequest.SearchFilter = searchFilter;
            findFolderRequest.View = view;
            return findFolderRequest.Execute();
        }
        FindFolders(parentFolderId: FolderId, searchFilter: SearchFilter, view: FolderView): FindFoldersResults;
        FindFolders(parentFolderId: FolderId, view: FolderView): FindFoldersResults;
        FindFolders(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: FolderView): FindFoldersResults;
        FindFolders(parentFolderName: WellKnownFolderName, view: FolderView): FindFoldersResults;
        FindFolders(parentFolderIdOrParentFolderName: any, searchFilterOrView: any, view?: FolderView): FindFoldersResults {
            if (arguments.length === 3 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrView === null || searchFilterOrView instanceof SearchFilter) && (view === null || view instanceof FolderView)) {
                return this.FindFolders_0(parentFolderIdOrParentFolderName, searchFilterOrView, view);
            }
            if (arguments.length === 2 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrView === null || searchFilterOrView instanceof FolderView)) {
                return this.FindFolders_1(parentFolderIdOrParentFolderName, searchFilterOrView);
            }
            if (arguments.length === 3 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName.constructor === Number) && (searchFilterOrView === null || searchFilterOrView instanceof SearchFilter) && (view === null || view instanceof FolderView)) {
                return this.FindFolders_2(parentFolderIdOrParentFolderName, searchFilterOrView, view);
            }
            return this.FindFolders_3(parentFolderIdOrParentFolderName, searchFilterOrView);
        }
        private FindFolders_0(parentFolderId: FolderId, searchFilter: SearchFilter, view: FolderView): FindFoldersResults {
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var serviceResponseCollection: ServiceResponseCollection<FindFolderResponse> = this.InternalFindFolders(NArray.ToEnumerable([
                parentFolderId
            ]), searchFilter, view, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindFolders_1(parentFolderId: FolderId, view: FolderView): FindFoldersResults {
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            EwsUtilities.ValidateParam(view, "view");
            var serviceResponseCollection: ServiceResponseCollection<FindFolderResponse> = this.InternalFindFolders(NArray.ToEnumerable([
                parentFolderId
            ]), null, view, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindFolders_2(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: FolderView): FindFoldersResults {
            return this.FindFolders(new FolderId(parentFolderName), searchFilter, view);
        }
        private FindFolders_3(parentFolderName: WellKnownFolderName, view: FolderView): FindFoldersResults {
            return this.FindFolders(new FolderId(parentFolderName), view);
        }
        LoadPropertiesForFolder(folder: Folder, propertySet: PropertySet): void {
            EwsUtilities.ValidateParam(folder, "folder");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            var getFolderRequestForLoad: GetFolderRequestForLoad = new GetFolderRequestForLoad(this, ServiceErrorHandling.ThrowOnError);
            getFolderRequestForLoad.FolderIds.Add(folder);
            getFolderRequestForLoad.PropertySet = propertySet;
            getFolderRequestForLoad.Execute();
        }
        BindToFolder(folderId: FolderId, propertySet: PropertySet): Folder;
        BindToFolder(folderId: FolderId, propertySet: PropertySet): Folder;
        BindToFolder(folderId: FolderId, propertySet: PropertySet): Folder {
            if (arguments.length === 2 && (folderId === null || folderId instanceof FolderId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return this.BindToFolder_0(folderId, propertySet);
            }
            return this.BindToFolder_1(folderId, propertySet);
        }
        private BindToFolder_0(folderId: FolderId, propertySet: PropertySet): Folder {
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            var getFolderRequest: GetFolderRequest = new GetFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            getFolderRequest.FolderIds.Add(folderId);
            getFolderRequest.PropertySet = propertySet;
            var serviceResponseCollection: ServiceResponseCollection<GetFolderResponse> = getFolderRequest.Execute();
            return serviceResponseCollection.get_Item(0).Folder;
        }
        private BindToFolder_1<TFolder>(folderId: FolderId, propertySet: PropertySet): TFolder {
            var folder: Folder = this.BindToFolder(folderId, propertySet);
            if (folder instanceof TFolder) {
                return <TFolder>(<any>folder);
            }
            throw new ServiceLocalException(NString.Format(Strings.FolderTypeNotCompatible, folder.GetType().Name, new Type("TFolder").Name));
        }
        DeleteFolder(folderId: FolderId, deleteMode: DeleteMode): void {
            EwsUtilities.ValidateParam(folderId, "folderId");
            var deleteFolderRequest: DeleteFolderRequest = new DeleteFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            deleteFolderRequest.FolderIds.Add(folderId);
            deleteFolderRequest.DeleteMode = deleteMode;
            deleteFolderRequest.Execute();
        }
        EmptyFolder(folderId: FolderId, deleteMode: DeleteMode, deleteSubFolders: boolean): void {
            EwsUtilities.ValidateParam(folderId, "folderId");
            var emptyFolderRequest: EmptyFolderRequest = new EmptyFolderRequest(this, ServiceErrorHandling.ThrowOnError);
            emptyFolderRequest.FolderIds.Add(folderId);
            emptyFolderRequest.DeleteMode = deleteMode;
            emptyFolderRequest.DeleteSubFolders = deleteSubFolders;
            emptyFolderRequest.Execute();
        }
        MarkAllItemsAsRead(folderId: FolderId, readFlag: boolean, suppressReadReceipts: boolean): void {
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "MarkAllItemsAsRead");
            var markAllItemsAsReadRequest: MarkAllItemsAsReadRequest = new MarkAllItemsAsReadRequest(this, ServiceErrorHandling.ThrowOnError);
            markAllItemsAsReadRequest.FolderIds.Add(folderId);
            markAllItemsAsReadRequest.ReadFlag = readFlag;
            markAllItemsAsReadRequest.SuppressReadReceipts = suppressReadReceipts;
            markAllItemsAsReadRequest.Execute();
        }
        InternalCreateItems(items: IEnumerable<Item>, parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>, sendInvitationsMode: Nullable<SendInvitationsMode>, errorHandling: ServiceErrorHandling): ServiceResponseCollection<ServiceResponse> {
            var createItemRequest: CreateItemRequest = new CreateItemRequest(this, errorHandling);
            createItemRequest.ParentFolderId = parentFolderId;
            createItemRequest.Items = items;
            createItemRequest.MessageDisposition = messageDisposition;
            createItemRequest.SendInvitationsMode = sendInvitationsMode;
            return createItemRequest.Execute();
        }
        CreateItems(items: IEnumerable<Item>, parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>, sendInvitationsMode: Nullable<SendInvitationsMode>): ServiceResponseCollection<ServiceResponse> {
            if (!EwsUtilities.TrueForAll<Item>(items, (item: Item) => { return item.IsNew; })) {
                throw new ServiceValidationException(Strings.CreateItemsDoesNotHandleExistingItems);
            }
            if (!EwsUtilities.TrueForAll<Item>(items, (item: Item) => { return !item.HasUnprocessedAttachmentChanges(); })) {
                throw new ServiceValidationException(Strings.CreateItemsDoesNotAllowAttachments);
            }
            return this.InternalCreateItems(items, parentFolderId, messageDisposition, sendInvitationsMode, ServiceErrorHandling.ReturnErrors);
        }
        CreateItem(item: Item, parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>, sendInvitationsMode: Nullable<SendInvitationsMode>): void {
            this.InternalCreateItems(NArray.ToEnumerable([
                item
            ]), parentFolderId, messageDisposition, sendInvitationsMode, ServiceErrorHandling.ThrowOnError);
        }
        InternalUpdateItems(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, errorHandling: ServiceErrorHandling, suppressReadReceipt: boolean): ServiceResponseCollection<UpdateItemResponse> {
            var updateItemRequest: UpdateItemRequest = new UpdateItemRequest(this, errorHandling);
            updateItemRequest.Items.AddRange(items);
            updateItemRequest.SavedItemsDestinationFolder = savedItemsDestinationFolderId;
            updateItemRequest.MessageDisposition = messageDisposition;
            updateItemRequest.ConflictResolutionMode = conflictResolution;
            updateItemRequest.SendInvitationsOrCancellationsMode = sendInvitationsOrCancellationsMode;
            updateItemRequest.SuppressReadReceipts = suppressReadReceipt;
            return updateItemRequest.Execute();
        }
        UpdateItems(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): ServiceResponseCollection<UpdateItemResponse>;
        UpdateItems(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): ServiceResponseCollection<UpdateItemResponse>;
        UpdateItems(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: any, sendInvitationsOrCancellationsMode: any, suppressReadReceipts?: boolean): ServiceResponseCollection<UpdateItemResponse> {
            if (arguments.length === 5 && (savedItemsDestinationFolderId === null || savedItemsDestinationFolderId instanceof FolderId) && (conflictResolution === null || conflictResolution.constructor === Number) && (messageDisposition === null || messageDisposition instanceof Array) && (sendInvitationsOrCancellationsMode === null || sendInvitationsOrCancellationsMode instanceof Array)) {
                return this.UpdateItems_0(items, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode);
            }
            return this.UpdateItems_1(items, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, suppressReadReceipts);
        }
        private UpdateItems_0(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): ServiceResponseCollection<UpdateItemResponse> {
            return this.UpdateItems(items, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, false);
        }
        private UpdateItems_1(items: IEnumerable<Item>, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): ServiceResponseCollection<UpdateItemResponse> {
            if (!EwsUtilities.TrueForAll<Item>(items, (item: Item) => { return !item.IsNew && item.IsDirty; })) {
                throw new ServiceValidationException(Strings.UpdateItemsDoesNotSupportNewOrUnchangedItems);
            }
            if (!EwsUtilities.TrueForAll<Item>(items, (item: Item) => { return !item.HasUnprocessedAttachmentChanges(); })) {
                throw new ServiceValidationException(Strings.UpdateItemsDoesNotAllowAttachments);
            }
            return this.InternalUpdateItems(items, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, ServiceErrorHandling.ReturnErrors, suppressReadReceipts);
        }
        UpdateItem(item: Item, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): Item;
        UpdateItem(item: Item, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): Item;
        UpdateItem(item: Item, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: any, sendInvitationsOrCancellationsMode: any, suppressReadReceipts?: boolean): Item {
            if (arguments.length === 5 && (item === null || item instanceof Item) && (savedItemsDestinationFolderId === null || savedItemsDestinationFolderId instanceof FolderId) && (conflictResolution === null || conflictResolution.constructor === Number) && (messageDisposition === null || messageDisposition instanceof Array) && (sendInvitationsOrCancellationsMode === null || sendInvitationsOrCancellationsMode instanceof Array)) {
                return this.UpdateItem_0(item, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode);
            }
            return this.UpdateItem_1(item, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, suppressReadReceipts);
        }
        private UpdateItem_0(item: Item, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>): Item {
            return this.UpdateItem(item, savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, false);
        }
        private UpdateItem_1(item: Item, savedItemsDestinationFolderId: FolderId, conflictResolution: ConflictResolutionMode, messageDisposition: Nullable<MessageDisposition>, sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode>, suppressReadReceipts: boolean): Item {
            var serviceResponseCollection: ServiceResponseCollection<UpdateItemResponse> = this.InternalUpdateItems(NArray.ToEnumerable([
                item
            ]), savedItemsDestinationFolderId, conflictResolution, messageDisposition, sendInvitationsOrCancellationsMode, ServiceErrorHandling.ThrowOnError, suppressReadReceipts);
            return serviceResponseCollection.get_Item(0).ReturnedItem;
        }
        SendItem(item: Item, savedCopyDestinationFolderId: FolderId): void {
            var sendItemRequest: SendItemRequest = new SendItemRequest(this, ServiceErrorHandling.ThrowOnError);
            sendItemRequest.Items = [
                item
            ];
            sendItemRequest.SavedCopyDestinationFolderId = savedCopyDestinationFolderId;
            sendItemRequest.Execute();
        }
        InternalCopyItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: Nullable<boolean>, errorHandling: ServiceErrorHandling): ServiceResponseCollection<MoveCopyItemResponse> {
            var copyItemRequest: CopyItemRequest = new CopyItemRequest(this, errorHandling);
            copyItemRequest.ItemIds.AddRange(itemIds);
            copyItemRequest.DestinationFolderId = destinationFolderId;
            copyItemRequest.ReturnNewItemIds = returnNewItemIds;
            return copyItemRequest.Execute();
        }
        CopyItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId): ServiceResponseCollection<MoveCopyItemResponse>;
        CopyItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: boolean): ServiceResponseCollection<MoveCopyItemResponse>;
        CopyItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds?: boolean): ServiceResponseCollection<MoveCopyItemResponse> {
            if (arguments.length === 2 && (destinationFolderId === null || destinationFolderId instanceof FolderId)) {
                return this.CopyItems_0(itemIds, destinationFolderId);
            }
            return this.CopyItems_1(itemIds, destinationFolderId, returnNewItemIds);
        }
        private CopyItems_0(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId): ServiceResponseCollection<MoveCopyItemResponse> {
            return this.InternalCopyItems(itemIds, destinationFolderId, null, ServiceErrorHandling.ReturnErrors);
        }
        private CopyItems_1(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: boolean): ServiceResponseCollection<MoveCopyItemResponse> {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "CopyItems");
            return this.InternalCopyItems(itemIds, destinationFolderId, new Nullable<boolean>(returnNewItemIds), ServiceErrorHandling.ReturnErrors);
        }
        CopyItem(itemId: ItemId, destinationFolderId: FolderId): Item {
            return this.InternalCopyItems(NArray.ToEnumerable([
                itemId
            ]), destinationFolderId, null, ServiceErrorHandling.ThrowOnError).get_Item(0).Item;
        }
        InternalMoveItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: Nullable<boolean>, errorHandling: ServiceErrorHandling): ServiceResponseCollection<MoveCopyItemResponse> {
            var moveItemRequest: MoveItemRequest = new MoveItemRequest(this, errorHandling);
            moveItemRequest.ItemIds.AddRange(itemIds);
            moveItemRequest.DestinationFolderId = destinationFolderId;
            moveItemRequest.ReturnNewItemIds = returnNewItemIds;
            return moveItemRequest.Execute();
        }
        MoveItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId): ServiceResponseCollection<MoveCopyItemResponse>;
        MoveItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: boolean): ServiceResponseCollection<MoveCopyItemResponse>;
        MoveItems(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds?: boolean): ServiceResponseCollection<MoveCopyItemResponse> {
            if (arguments.length === 2 && (destinationFolderId === null || destinationFolderId instanceof FolderId)) {
                return this.MoveItems_0(itemIds, destinationFolderId);
            }
            return this.MoveItems_1(itemIds, destinationFolderId, returnNewItemIds);
        }
        private MoveItems_0(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId): ServiceResponseCollection<MoveCopyItemResponse> {
            return this.InternalMoveItems(itemIds, destinationFolderId, null, ServiceErrorHandling.ReturnErrors);
        }
        private MoveItems_1(itemIds: IEnumerable<ItemId>, destinationFolderId: FolderId, returnNewItemIds: boolean): ServiceResponseCollection<MoveCopyItemResponse> {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "MoveItems");
            return this.InternalMoveItems(itemIds, destinationFolderId, new Nullable<boolean>(returnNewItemIds), ServiceErrorHandling.ReturnErrors);
        }
        MoveItem(itemId: ItemId, destinationFolderId: FolderId): Item {
            return this.InternalMoveItems(NArray.ToEnumerable([
                itemId
            ]), destinationFolderId, null, ServiceErrorHandling.ThrowOnError).get_Item(0).Item;
        }
        ArchiveItems(itemIds: IEnumerable<ItemId>, sourceFolderId: FolderId): ServiceResponseCollection<ArchiveItemResponse> {
            var archiveItemRequest: ArchiveItemRequest = new ArchiveItemRequest(this, ServiceErrorHandling.ReturnErrors);
            archiveItemRequest.Ids.AddRange(itemIds);
            archiveItemRequest.SourceFolderId = sourceFolderId;
            return archiveItemRequest.Execute();
        }
        FindItems(parentFolderIds: IEnumerable<FolderId>, searchFilter: SearchFilter, queryString: string, view: ViewBase, groupBy: Grouping, errorHandlingMode: ServiceErrorHandling): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, queryString: string, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, queryString: string, returnHighlightTerms: boolean, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, queryString: string, returnHighlightTerms: boolean, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderName: WellKnownFolderName, queryString: string, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderName: WellKnownFolderName, view: ViewBase): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, queryString: string, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderName: WellKnownFolderName, queryString: string, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>>;
        FindItems(parentFolderIdsOrParentFolderIdOrParentFolderName: any, searchFilterOrQueryStringOrView: any, queryStringOrViewOrReturnHighlightTermsOrGroupBy?: any, viewOrGroupBy?: any, groupBy?: Grouping, errorHandlingMode?: ServiceErrorHandling): ServiceResponseCollection<FindItemResponse<TItem>> {
            if (arguments.length === 6 && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy.constructor === String) && (viewOrGroupBy === null || viewOrGroupBy instanceof ViewBase) && (groupBy === null || groupBy instanceof Grouping) && (errorHandlingMode === null || errorHandlingMode.constructor === Number)) {
                return this.FindItems_0(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy, groupBy, errorHandlingMode);
            }
            if (arguments.length === 3 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase)) {
                return this.FindItems_1(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy);
            }
            if (arguments.length === 4 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy.constructor === Boolean) && (viewOrGroupBy === null || viewOrGroupBy instanceof ViewBase)) {
                return this.FindItems_2(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
            }
            if (arguments.length === 5 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy.constructor === Boolean) && (viewOrGroupBy === null || viewOrGroupBy instanceof ViewBase) && (groupBy === null || groupBy instanceof Grouping)) {
                return this.FindItems_3(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy, groupBy);
            }
            if (arguments.length === 3 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase)) {
                return this.FindItems_4(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy);
            }
            if (arguments.length === 2 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof ViewBase)) {
                return this.FindItems_5(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView);
            }
            if (arguments.length === 3 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName.constructor === Number) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase)) {
                return this.FindItems_6(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy);
            }
            if (arguments.length === 3 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName.constructor === Number) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase)) {
                return this.FindItems_7(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy);
            }
            if (arguments.length === 2 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName.constructor === Number) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof ViewBase)) {
                return this.FindItems_8(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView);
            }
            if (arguments.length === 4 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase) && (viewOrGroupBy === null || viewOrGroupBy instanceof Grouping)) {
                return this.FindItems_9(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
            }
            if (arguments.length === 4 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase) && (viewOrGroupBy === null || viewOrGroupBy instanceof Grouping)) {
                return this.FindItems_10(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
            }
            if (arguments.length === 3 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof ViewBase) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof Grouping)) {
                return this.FindItems_11(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy);
            }
            if (arguments.length === 4 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName instanceof FolderId) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView instanceof SearchFilter) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase) && (viewOrGroupBy === null || viewOrGroupBy instanceof Grouping)) {
                return this.FindItems_12(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
            }
            if (arguments.length === 4 && (parentFolderIdsOrParentFolderIdOrParentFolderName === null || parentFolderIdsOrParentFolderIdOrParentFolderName.constructor === Number) && (searchFilterOrQueryStringOrView === null || searchFilterOrQueryStringOrView.constructor === String) && (queryStringOrViewOrReturnHighlightTermsOrGroupBy === null || queryStringOrViewOrReturnHighlightTermsOrGroupBy instanceof ViewBase) && (viewOrGroupBy === null || viewOrGroupBy instanceof Grouping)) {
                return this.FindItems_13(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
            }
            return this.FindItems_14(parentFolderIdsOrParentFolderIdOrParentFolderName, searchFilterOrQueryStringOrView, queryStringOrViewOrReturnHighlightTermsOrGroupBy, viewOrGroupBy);
        }
        private FindItems_0<TItem>(parentFolderIds: IEnumerable<FolderId>, searchFilter: SearchFilter, queryString: string, view: ViewBase, groupBy: Grouping, errorHandlingMode: ServiceErrorHandling): ServiceResponseCollection<FindItemResponse<TItem>> {
            EwsUtilities.ValidateParamCollection(parentFolderIds, "parentFolderIds");
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(groupBy, "groupBy");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var findItemRequest: FindItemRequest<TItem> = new FindItemRequest<TItem>(this, errorHandlingMode);
            findItemRequest.ParentFolderIds.AddRange(parentFolderIds);
            findItemRequest.SearchFilter = searchFilter;
            findItemRequest.QueryString = queryString;
            findItemRequest.View = view;
            findItemRequest.GroupBy = groupBy;
            return findItemRequest.Execute();
        }
        private FindItems_1(parentFolderId: FolderId, queryString: string, view: ViewBase): FindItemsResults<Item> {
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), null, queryString, view, null, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_2(parentFolderId: FolderId, queryString: string, returnHighlightTerms: boolean, view: ViewBase): FindItemsResults<Item> {
            var array: FolderId[] = [
                parentFolderId
            ];
            EwsUtilities.ValidateParamCollection(NArray.ToEnumerable(array), "parentFolderIds");
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParamAllowNull(returnHighlightTerms, "returnHighlightTerms");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "FindItems");
            var findItemRequest: FindItemRequest<Item> = new FindItemRequest<Item>(this, ServiceErrorHandling.ThrowOnError);
            findItemRequest.ParentFolderIds.AddRange(NArray.ToEnumerable(array));
            findItemRequest.QueryString = queryString;
            findItemRequest.ReturnHighlightTerms = returnHighlightTerms;
            findItemRequest.View = view;
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = findItemRequest.Execute();
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_3(parentFolderId: FolderId, queryString: string, returnHighlightTerms: boolean, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            var array: FolderId[] = [
                parentFolderId
            ];
            EwsUtilities.ValidateParamCollection(NArray.ToEnumerable(array), "parentFolderIds");
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParamAllowNull(returnHighlightTerms, "returnHighlightTerms");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "FindItems");
            var findItemRequest: FindItemRequest<Item> = new FindItemRequest<Item>(this, ServiceErrorHandling.ThrowOnError);
            findItemRequest.ParentFolderIds.AddRange(NArray.ToEnumerable(array));
            findItemRequest.QueryString = queryString;
            findItemRequest.ReturnHighlightTerms = returnHighlightTerms;
            findItemRequest.View = view;
            findItemRequest.GroupBy = groupBy;
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = findItemRequest.Execute();
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        private FindItems_4(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase): FindItemsResults<Item> {
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), searchFilter, null, view, null, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_5(parentFolderId: FolderId, view: ViewBase): FindItemsResults<Item> {
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), null, null, view, null, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindItems_6(parentFolderName: WellKnownFolderName, queryString: string, view: ViewBase): FindItemsResults<Item> {
            return this.FindItems(new FolderId(parentFolderName), queryString, view);
        }
        private FindItems_7(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: ViewBase): FindItemsResults<Item> {
            return this.FindItems(new FolderId(parentFolderName), searchFilter, view);
        }
        private FindItems_8(parentFolderName: WellKnownFolderName, view: ViewBase): FindItemsResults<Item> {
            return this.FindItems(new FolderId(parentFolderName), null, view);
        }
        private FindItems_9(parentFolderId: FolderId, queryString: string, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), null, queryString, view, groupBy, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        private FindItems_10(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            EwsUtilities.ValidateParamAllowNull(searchFilter, "searchFilter");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), searchFilter, null, view, groupBy, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        private FindItems_11(parentFolderId: FolderId, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Item>> = this.FindItems<Item>(NArray.ToEnumerable([
                parentFolderId
            ]), null, null, view, groupBy, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).GroupedFindResults;
        }
        private FindItems_12<TItem>(parentFolderId: FolderId, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): ServiceResponseCollection<FindItemResponse<TItem>> {
            return this.FindItems<TItem>(NArray.ToEnumerable([
                parentFolderId
            ]), searchFilter, null, view, groupBy, ServiceErrorHandling.ThrowOnError);
        }
        private FindItems_13(parentFolderName: WellKnownFolderName, queryString: string, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            EwsUtilities.ValidateParam(groupBy, "groupBy");
            return this.FindItems(new FolderId(parentFolderName), queryString, view, groupBy);
        }
        private FindItems_14(parentFolderName: WellKnownFolderName, searchFilter: SearchFilter, view: ViewBase, groupBy: Grouping): GroupedFindItemsResults<Item> {
            return this.FindItems(new FolderId(parentFolderName), searchFilter, view, groupBy);
        }
        FindAppointments(parentFolderId: FolderId, calendarView: CalendarView): FindItemsResults<Appointment>;
        FindAppointments(parentFolderName: WellKnownFolderName, calendarView: CalendarView): FindItemsResults<Appointment>;
        FindAppointments(parentFolderIdOrParentFolderName: any, calendarView: CalendarView): FindItemsResults<Appointment> {
            if (arguments.length === 2 && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId) && (calendarView === null || calendarView instanceof CalendarView)) {
                return this.FindAppointments_0(parentFolderIdOrParentFolderName, calendarView);
            }
            return this.FindAppointments_1(parentFolderIdOrParentFolderName, calendarView);
        }
        private FindAppointments_0(parentFolderId: FolderId, calendarView: CalendarView): FindItemsResults<Appointment> {
            var serviceResponseCollection: ServiceResponseCollection<FindItemResponse<Appointment>> = this.FindItems<Appointment>(NArray.ToEnumerable([
                parentFolderId
            ]), null, null, calendarView, null, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Results;
        }
        private FindAppointments_1(parentFolderName: WellKnownFolderName, calendarView: CalendarView): FindItemsResults<Appointment> {
            return this.FindAppointments(new FolderId(parentFolderName), calendarView);
        }
        LoadPropertiesForItems(items: IEnumerable<Item>, propertySet: PropertySet): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParamCollection(items, "items");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            return this.InternalLoadPropertiesForItems(items, propertySet, ServiceErrorHandling.ReturnErrors);
        }
        InternalLoadPropertiesForItems(items: IEnumerable<Item>, propertySet: PropertySet, errorHandling: ServiceErrorHandling): ServiceResponseCollection<ServiceResponse> {
            var getItemRequestForLoad: GetItemRequestForLoad = new GetItemRequestForLoad(this, errorHandling);
            getItemRequestForLoad.ItemIds.AddRange(items);
            getItemRequestForLoad.PropertySet = propertySet;
            return getItemRequestForLoad.Execute();
        }
        InternalBindToItems(itemIds: IEnumerable<ItemId>, propertySet: PropertySet, errorHandling: ServiceErrorHandling): ServiceResponseCollection<GetItemResponse> {
            var getItemRequest: GetItemRequest = new GetItemRequest(this, errorHandling);
            getItemRequest.ItemIds.AddRange(itemIds);
            getItemRequest.PropertySet = propertySet;
            return getItemRequest.Execute();
        }
        BindToItems(itemIds: IEnumerable<ItemId>, propertySet: PropertySet): ServiceResponseCollection<GetItemResponse> {
            EwsUtilities.ValidateParamCollection(itemIds, "itemIds");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            return this.InternalBindToItems(itemIds, propertySet, ServiceErrorHandling.ReturnErrors);
        }
        BindToItem(itemId: ItemId, propertySet: PropertySet): Item;
        BindToItem(itemId: ItemId, propertySet: PropertySet): Item;
        BindToItem(itemId: ItemId, propertySet: PropertySet): Item {
            if (arguments.length === 2 && (itemId === null || itemId instanceof ItemId) && (propertySet === null || propertySet instanceof PropertySet)) {
                return this.BindToItem_0(itemId, propertySet);
            }
            return this.BindToItem_1(itemId, propertySet);
        }
        private BindToItem_0(itemId: ItemId, propertySet: PropertySet): Item {
            EwsUtilities.ValidateParam(itemId, "itemId");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            var serviceResponseCollection: ServiceResponseCollection<GetItemResponse> = this.InternalBindToItems(NArray.ToEnumerable([
                itemId
            ]), propertySet, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).Item;
        }
        private BindToItem_1<TItem>(itemId: ItemId, propertySet: PropertySet): TItem {
            var item: Item = this.BindToItem(itemId, propertySet);
            if (item instanceof TItem) {
                return <TItem>(<any>item);
            }
            throw new ServiceLocalException(NString.Format(Strings.ItemTypeNotCompatible, item.GetType().Name, new Type("TItem").Name));
        }
        InternalDeleteItems(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, errorHandling: ServiceErrorHandling, suppressReadReceipts: boolean): ServiceResponseCollection<ServiceResponse> {
            var deleteItemRequest: DeleteItemRequest = new DeleteItemRequest(this, errorHandling);
            deleteItemRequest.ItemIds.AddRange(itemIds);
            deleteItemRequest.DeleteMode = deleteMode;
            deleteItemRequest.SendCancellationsMode = sendCancellationsMode;
            deleteItemRequest.AffectedTaskOccurrences = affectedTaskOccurrences;
            deleteItemRequest.SuppressReadReceipts = suppressReadReceipts;
            return deleteItemRequest.Execute();
        }
        DeleteItems(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): ServiceResponseCollection<ServiceResponse>;
        DeleteItems(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipt: boolean): ServiceResponseCollection<ServiceResponse>;
        DeleteItems(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: any, affectedTaskOccurrences: any, suppressReadReceipt?: boolean): ServiceResponseCollection<ServiceResponse> {
            if (arguments.length === 4 && (deleteMode === null || deleteMode.constructor === Number) && (sendCancellationsMode === null || sendCancellationsMode instanceof Array) && (affectedTaskOccurrences === null || affectedTaskOccurrences instanceof Array)) {
                return this.DeleteItems_0(itemIds, deleteMode, sendCancellationsMode, affectedTaskOccurrences);
            }
            return this.DeleteItems_1(itemIds, deleteMode, sendCancellationsMode, affectedTaskOccurrences, suppressReadReceipt);
        }
        private DeleteItems_0(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): ServiceResponseCollection<ServiceResponse> {
            return this.DeleteItems(itemIds, deleteMode, sendCancellationsMode, affectedTaskOccurrences, false);
        }
        private DeleteItems_1(itemIds: IEnumerable<ItemId>, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipt: boolean): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParamCollection(itemIds, "itemIds");
            return this.InternalDeleteItems(itemIds, deleteMode, sendCancellationsMode, affectedTaskOccurrences, ServiceErrorHandling.ReturnErrors, suppressReadReceipt);
        }
        DeleteItem(itemId: ItemId, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void;
        DeleteItem(itemId: ItemId, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipts: boolean): void;
        DeleteItem(itemId: ItemId, deleteMode: DeleteMode, sendCancellationsMode: any, affectedTaskOccurrences: any, suppressReadReceipts?: boolean): void {
            if (arguments.length === 4 && (itemId === null || itemId instanceof ItemId) && (deleteMode === null || deleteMode.constructor === Number) && (sendCancellationsMode === null || sendCancellationsMode instanceof Array) && (affectedTaskOccurrences === null || affectedTaskOccurrences instanceof Array)) {
                this.DeleteItem_0(itemId, deleteMode, sendCancellationsMode, affectedTaskOccurrences);
                return;
            }
            this.DeleteItem_1(itemId, deleteMode, sendCancellationsMode, affectedTaskOccurrences, suppressReadReceipts);
        }
        private DeleteItem_0(itemId: ItemId, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            this.DeleteItem(itemId, deleteMode, sendCancellationsMode, affectedTaskOccurrences, false);
        }
        private DeleteItem_1(itemId: ItemId, deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>, suppressReadReceipts: boolean): void {
            EwsUtilities.ValidateParam(itemId, "itemId");
            this.InternalDeleteItems(NArray.ToEnumerable([
                itemId
            ]), deleteMode, sendCancellationsMode, affectedTaskOccurrences, ServiceErrorHandling.ThrowOnError, suppressReadReceipts);
        }
        MarkAsJunk(itemIds: IEnumerable<ItemId>, isJunk: boolean, moveItem: boolean): ServiceResponseCollection<MarkAsJunkResponse> {
            var markAsJunkRequest: MarkAsJunkRequest = new MarkAsJunkRequest(this, ServiceErrorHandling.ReturnErrors);
            markAsJunkRequest.ItemIds.AddRange(itemIds);
            markAsJunkRequest.IsJunk = isJunk;
            markAsJunkRequest.MoveItem = moveItem;
            return markAsJunkRequest.Execute();
        }
        InternalGetAttachments(attachments: IEnumerable<Attachment>, bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>, errorHandling: ServiceErrorHandling): ServiceResponseCollection<GetAttachmentResponse> {
            var getAttachmentRequest: GetAttachmentRequest = new GetAttachmentRequest(this, errorHandling);
            getAttachmentRequest.Attachments.AddRange(attachments);
            getAttachmentRequest.BodyType = bodyType;
            if (additionalProperties !== null) {
                getAttachmentRequest.AdditionalProperties.AddRange(additionalProperties);
            }
            return getAttachmentRequest.Execute();
        }
        GetAttachments(attachments: Attachment[], bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): ServiceResponseCollection<GetAttachmentResponse>;
        GetAttachments(attachmentIds: string[], bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): ServiceResponseCollection<GetAttachmentResponse>;
        GetAttachments(attachmentsOrAttachmentIds: any, bodyType: any, additionalProperties: IEnumerable<PropertyDefinitionBase>): ServiceResponseCollection<GetAttachmentResponse> {
            if (arguments.length === 3 && (attachmentsOrAttachmentIds === null || attachmentsOrAttachmentIds instanceof Array) && (bodyType === null || bodyType instanceof Array)) {
                return this.GetAttachments_0(attachmentsOrAttachmentIds, bodyType, additionalProperties);
            }
            return this.GetAttachments_1(attachmentsOrAttachmentIds, bodyType, additionalProperties);
        }
        private GetAttachments_0(attachments: Attachment[], bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): ServiceResponseCollection<GetAttachmentResponse> {
            return this.InternalGetAttachments(NArray.ToEnumerable(attachments), bodyType, additionalProperties, ServiceErrorHandling.ReturnErrors);
        }
        private GetAttachments_1(attachmentIds: string[], bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): ServiceResponseCollection<GetAttachmentResponse> {
            var getAttachmentRequest: GetAttachmentRequest = new GetAttachmentRequest(this, ServiceErrorHandling.ReturnErrors);
            getAttachmentRequest.AttachmentIds.AddRange(NArray.ToEnumerable(attachmentIds));
            getAttachmentRequest.BodyType = bodyType;
            if (additionalProperties !== null) {
                getAttachmentRequest.AdditionalProperties.AddRange(additionalProperties);
            }
            return getAttachmentRequest.Execute();
        }
        GetAttachment(attachment: Attachment, bodyType: Nullable<BodyType>, additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            this.InternalGetAttachments(NArray.ToEnumerable([
                attachment
            ]), bodyType, additionalProperties, ServiceErrorHandling.ThrowOnError);
        }
        CreateAttachments(parentItemId: string, attachments: IEnumerable<Attachment>): ServiceResponseCollection<CreateAttachmentResponse> {
            var createAttachmentRequest: CreateAttachmentRequest = new CreateAttachmentRequest(this, ServiceErrorHandling.ReturnErrors);
            createAttachmentRequest.ParentItemId = parentItemId;
            createAttachmentRequest.Attachments.AddRange(attachments);
            return createAttachmentRequest.Execute();
        }
        DeleteAttachments(attachments: IEnumerable<Attachment>): ServiceResponseCollection<DeleteAttachmentResponse> {
            var deleteAttachmentRequest: DeleteAttachmentRequest = new DeleteAttachmentRequest(this, ServiceErrorHandling.ReturnErrors);
            deleteAttachmentRequest.Attachments.AddRange(attachments);
            return deleteAttachmentRequest.Execute();
        }
        ResolveName(nameToResolve: string): NameResolutionCollection;
        ResolveName(nameToResolve: string, parentFolderIds: IEnumerable<FolderId>, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean): NameResolutionCollection;
        ResolveName(nameToResolve: string, parentFolderIds: IEnumerable<FolderId>, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean, contactDataPropertySet: PropertySet): NameResolutionCollection;
        ResolveName(nameToResolve: string, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean, contactDataPropertySet: PropertySet): NameResolutionCollection;
        ResolveName(nameToResolve: string, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean): NameResolutionCollection;
        ResolveName(nameToResolve: string, parentFolderIdsOrSearchScope?: any, searchScopeOrReturnContactDetails?: any, returnContactDetailsOrContactDataPropertySet?: any, contactDataPropertySet?: PropertySet): NameResolutionCollection {
            if (arguments.length === 1 && (nameToResolve === null || nameToResolve.constructor === String)) {
                return this.ResolveName_0(nameToResolve);
            }
            if (arguments.length === 4 && (nameToResolve === null || nameToResolve.constructor === String) && (searchScopeOrReturnContactDetails === null || searchScopeOrReturnContactDetails.constructor === Number) && (returnContactDetailsOrContactDataPropertySet === null || returnContactDetailsOrContactDataPropertySet.constructor === Boolean)) {
                return this.ResolveName_1(nameToResolve, parentFolderIdsOrSearchScope, searchScopeOrReturnContactDetails, returnContactDetailsOrContactDataPropertySet);
            }
            if (arguments.length === 5 && (nameToResolve === null || nameToResolve.constructor === String) && (searchScopeOrReturnContactDetails === null || searchScopeOrReturnContactDetails.constructor === Number) && (returnContactDetailsOrContactDataPropertySet === null || returnContactDetailsOrContactDataPropertySet.constructor === Boolean) && (contactDataPropertySet === null || contactDataPropertySet instanceof PropertySet)) {
                return this.ResolveName_2(nameToResolve, parentFolderIdsOrSearchScope, searchScopeOrReturnContactDetails, returnContactDetailsOrContactDataPropertySet, contactDataPropertySet);
            }
            if (arguments.length === 4 && (nameToResolve === null || nameToResolve.constructor === String) && (parentFolderIdsOrSearchScope === null || parentFolderIdsOrSearchScope.constructor === Number) && (searchScopeOrReturnContactDetails === null || searchScopeOrReturnContactDetails.constructor === Boolean) && (returnContactDetailsOrContactDataPropertySet === null || returnContactDetailsOrContactDataPropertySet instanceof PropertySet)) {
                return this.ResolveName_3(nameToResolve, parentFolderIdsOrSearchScope, searchScopeOrReturnContactDetails, returnContactDetailsOrContactDataPropertySet);
            }
            return this.ResolveName_4(nameToResolve, parentFolderIdsOrSearchScope, searchScopeOrReturnContactDetails);
        }
        private ResolveName_0(nameToResolve: string): NameResolutionCollection {
            return this.ResolveName(nameToResolve, ResolveNameSearchLocation.ContactsThenDirectory, false);
        }
        private ResolveName_1(nameToResolve: string, parentFolderIds: IEnumerable<FolderId>, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean): NameResolutionCollection {
            return this.ResolveName(nameToResolve, parentFolderIds, searchScope, returnContactDetails, null);
        }
        private ResolveName_2(nameToResolve: string, parentFolderIds: IEnumerable<FolderId>, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean, contactDataPropertySet: PropertySet): NameResolutionCollection {
            if (contactDataPropertySet !== null) {
                EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "ResolveName");
            }
            EwsUtilities.ValidateParam(nameToResolve, "nameToResolve");
            if (parentFolderIds !== null) {
                EwsUtilities.ValidateParamCollection(parentFolderIds, "parentFolderIds");
            }
            var resolveNamesRequest: ResolveNamesRequest = new ResolveNamesRequest(this);
            resolveNamesRequest.NameToResolve = nameToResolve;
            resolveNamesRequest.ReturnFullContactData = returnContactDetails;
            resolveNamesRequest.ParentFolderIds.AddRange(parentFolderIds);
            resolveNamesRequest.SearchLocation = searchScope;
            resolveNamesRequest.ContactDataPropertySet = contactDataPropertySet;
            return resolveNamesRequest.Execute().get_Item(0).Resolutions;
        }
        private ResolveName_3(nameToResolve: string, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean, contactDataPropertySet: PropertySet): NameResolutionCollection {
            return this.ResolveName(nameToResolve, null, searchScope, returnContactDetails, contactDataPropertySet);
        }
        private ResolveName_4(nameToResolve: string, searchScope: ResolveNameSearchLocation, returnContactDetails: boolean): NameResolutionCollection {
            return this.ResolveName(nameToResolve, null, searchScope, returnContactDetails);
        }
        ExpandGroup(emailAddress: EmailAddress): ExpandGroupResults;
        ExpandGroup(groupId: ItemId): ExpandGroupResults;
        ExpandGroup(smtpAddress: string): ExpandGroupResults;
        ExpandGroup(address: string, routingType: string): ExpandGroupResults;
        ExpandGroup(emailAddressOrGroupIdOrSmtpAddressOrAddress: any, routingType?: string): ExpandGroupResults {
            if (arguments.length === 1 && (emailAddressOrGroupIdOrSmtpAddressOrAddress === null || emailAddressOrGroupIdOrSmtpAddressOrAddress instanceof EmailAddress)) {
                return this.ExpandGroup_0(emailAddressOrGroupIdOrSmtpAddressOrAddress);
            }
            if (arguments.length === 1 && (emailAddressOrGroupIdOrSmtpAddressOrAddress === null || emailAddressOrGroupIdOrSmtpAddressOrAddress instanceof ItemId)) {
                return this.ExpandGroup_1(emailAddressOrGroupIdOrSmtpAddressOrAddress);
            }
            if (arguments.length === 1 && (emailAddressOrGroupIdOrSmtpAddressOrAddress === null || emailAddressOrGroupIdOrSmtpAddressOrAddress.constructor === String)) {
                return this.ExpandGroup_2(emailAddressOrGroupIdOrSmtpAddressOrAddress);
            }
            return this.ExpandGroup_3(emailAddressOrGroupIdOrSmtpAddressOrAddress, routingType);
        }
        private ExpandGroup_0(emailAddress: EmailAddress): ExpandGroupResults {
            EwsUtilities.ValidateParam(emailAddress, "emailAddress");
            var expandGroupRequest: ExpandGroupRequest = new ExpandGroupRequest(this);
            expandGroupRequest.EmailAddress = emailAddress;
            return expandGroupRequest.Execute().get_Item(0).Members;
        }
        private ExpandGroup_1(groupId: ItemId): ExpandGroupResults {
            EwsUtilities.ValidateParam(groupId, "groupId");
            var emailAddress: EmailAddress = new EmailAddress();
            emailAddress.Id = groupId;
            return this.ExpandGroup(emailAddress);
        }
        private ExpandGroup_2(smtpAddress: string): ExpandGroupResults {
            EwsUtilities.ValidateParam(smtpAddress, "smtpAddress");
            return this.ExpandGroup(new EmailAddress(smtpAddress));
        }
        private ExpandGroup_3(address: string, routingType: string): ExpandGroupResults {
            EwsUtilities.ValidateParam(address, "address");
            EwsUtilities.ValidateParam(routingType, "routingType");
            var emailAddress: EmailAddress = new EmailAddress(address);
            emailAddress.RoutingType = routingType;
            return this.ExpandGroup(emailAddress);
        }
        GetPasswordExpirationDate(mailboxSmtpAddress: string): Nullable<DateTime> {
            var getPasswordExpirationDateRequest: GetPasswordExpirationDateRequest = new GetPasswordExpirationDateRequest(this);
            getPasswordExpirationDateRequest.MailboxSmtpAddress = mailboxSmtpAddress;
            return getPasswordExpirationDateRequest.Execute().PasswordExpirationDate;
        }
        SubscribeToPullNotifications(folderIds: IEnumerable<FolderId>, timeout: number, watermark: string, eventTypes: EventType[]): PullSubscription {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPullNotificationsRequest(folderIds, timeout, watermark, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToPullNotifications(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, timeout: number, watermark: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPullNotificationsRequest(folderIds, timeout, watermark, eventTypes).BeginExecute(callback, state);
        }
        SubscribeToPullNotificationsOnAllFolders(timeout: number, watermark: string, eventTypes: EventType[]): PullSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "SubscribeToPullNotificationsOnAllFolders");
            return this.BuildSubscribeToPullNotificationsRequest(null, timeout, watermark, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToPullNotificationsOnAllFolders(callback: (ar: IAsyncResult) => void, state: any, timeout: number, watermark: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "BeginSubscribeToPullNotificationsOnAllFolders");
            return this.BuildSubscribeToPullNotificationsRequest(null, timeout, watermark, eventTypes).BeginExecute(callback, state);
        }
        EndSubscribeToPullNotifications(asyncResult: IAsyncResult): PullSubscription {
            var subscribeToPullNotificationsRequest: SubscribeToPullNotificationsRequest = AsyncRequestResult.ExtractServiceRequest<SubscribeToPullNotificationsRequest>(this, asyncResult);
            return subscribeToPullNotificationsRequest.EndExecute(asyncResult).get_Item(0).Subscription;
        }
        BuildSubscribeToPullNotificationsRequest(folderIds: IEnumerable<FolderId>, timeout: number, watermark: string, eventTypes: EventType[]): SubscribeToPullNotificationsRequest {
            if (timeout < 1 || timeout > 1440) {
                throw new ArgumentOutOfRangeException("timeout", Strings.TimeoutMustBeBetween1And1440);
            }
            EwsUtilities.ValidateParamCollection(NArray.ToEnumerable(eventTypes), "eventTypes");
            var subscribeToPullNotificationsRequest: SubscribeToPullNotificationsRequest = new SubscribeToPullNotificationsRequest(this);
            if (folderIds !== null) {
                subscribeToPullNotificationsRequest.FolderIds.AddRange(folderIds);
            }
            subscribeToPullNotificationsRequest.Timeout = timeout;
            subscribeToPullNotificationsRequest.EventTypes.AddRange(NArray.ToEnumerable(eventTypes));
            subscribeToPullNotificationsRequest.Watermark = watermark;
            return subscribeToPullNotificationsRequest;
        }
        Unsubscribe(subscriptionId: string): void {
            this.BuildUnsubscribeRequest(subscriptionId).Execute();
        }
        BeginUnsubscribe(callback: (ar: IAsyncResult) => void, state: any, subscriptionId: string): IAsyncResult {
            return this.BuildUnsubscribeRequest(subscriptionId).BeginExecute(callback, state);
        }
        EndUnsubscribe(asyncResult: IAsyncResult): void {
            var unsubscribeRequest: UnsubscribeRequest = AsyncRequestResult.ExtractServiceRequest<UnsubscribeRequest>(this, asyncResult);
            unsubscribeRequest.EndExecute(asyncResult);
        }
        BuildUnsubscribeRequest(subscriptionId: string): UnsubscribeRequest {
            EwsUtilities.ValidateParam(subscriptionId, "subscriptionId");
            var unsubscribeRequest: UnsubscribeRequest = new UnsubscribeRequest(this);
            unsubscribeRequest.SubscriptionId = subscriptionId;
            return unsubscribeRequest;
        }
        GetEvents(subscriptionId: string, watermark: string): GetEventsResults {
            return this.BuildGetEventsRequest(subscriptionId, watermark).Execute().get_Item(0).Results;
        }
        BeginGetEvents(callback: (ar: IAsyncResult) => void, state: any, subscriptionId: string, watermark: string): IAsyncResult {
            return this.BuildGetEventsRequest(subscriptionId, watermark).BeginExecute(callback, state);
        }
        EndGetEvents(asyncResult: IAsyncResult): GetEventsResults {
            var getEventsRequest: GetEventsRequest = AsyncRequestResult.ExtractServiceRequest<GetEventsRequest>(this, asyncResult);
            return getEventsRequest.EndExecute(asyncResult).get_Item(0).Results;
        }
        BuildGetEventsRequest(subscriptionId: string, watermark: string): GetEventsRequest {
            EwsUtilities.ValidateParam(subscriptionId, "subscriptionId");
            EwsUtilities.ValidateParam(watermark, "watermark");
            var getEventsRequest: GetEventsRequest = new GetEventsRequest(this);
            getEventsRequest.SubscriptionId = subscriptionId;
            getEventsRequest.Watermark = watermark;
            return getEventsRequest;
        }
        SubscribeToPushNotifications(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): PushSubscription;
        SubscribeToPushNotifications(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): PushSubscription;
        SubscribeToPushNotifications(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypesOrCallerData: any, eventTypes?: EventType[]): PushSubscription {
            if (arguments.length === 5 && (url === null || url instanceof Uri) && (frequency === null || frequency.constructor === Number) && (watermark === null || watermark.constructor === String) && (eventTypesOrCallerData === null || eventTypesOrCallerData instanceof Array)) {
                return this.SubscribeToPushNotifications_0(folderIds, url, frequency, watermark, eventTypesOrCallerData);
            }
            return this.SubscribeToPushNotifications_1(folderIds, url, frequency, watermark, eventTypesOrCallerData, eventTypes);
        }
        private SubscribeToPushNotifications_0(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): PushSubscription {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPushNotificationsRequest(folderIds, url, frequency, watermark, null, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToPushNotifications(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): IAsyncResult;
        BeginSubscribeToPushNotifications(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): IAsyncResult;
        BeginSubscribeToPushNotifications(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypesOrCallerData: any, eventTypes?: EventType[]): IAsyncResult {
            if (arguments.length === 7 && (state === null || state.constructor === Object) && (url === null || url instanceof Uri) && (frequency === null || frequency.constructor === Number) && (watermark === null || watermark.constructor === String) && (eventTypesOrCallerData === null || eventTypesOrCallerData instanceof Array)) {
                return this.BeginSubscribeToPushNotifications_0(callback, state, folderIds, url, frequency, watermark, eventTypesOrCallerData);
            }
            return this.BeginSubscribeToPushNotifications_1(callback, state, folderIds, url, frequency, watermark, eventTypesOrCallerData, eventTypes);
        }
        private BeginSubscribeToPushNotifications_0(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPushNotificationsRequest(folderIds, url, frequency, watermark, null, eventTypes).BeginExecute(callback, state);
        }
        SubscribeToPushNotificationsOnAllFolders(url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): PushSubscription;
        SubscribeToPushNotificationsOnAllFolders(url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): PushSubscription;
        SubscribeToPushNotificationsOnAllFolders(url: Uri, frequency: number, watermark: string, eventTypesOrCallerData: any, eventTypes?: EventType[]): PushSubscription {
            if (arguments.length === 4 && (url === null || url instanceof Uri) && (frequency === null || frequency.constructor === Number) && (watermark === null || watermark.constructor === String) && (eventTypesOrCallerData === null || eventTypesOrCallerData instanceof Array)) {
                return this.SubscribeToPushNotificationsOnAllFolders_0(url, frequency, watermark, eventTypesOrCallerData);
            }
            return this.SubscribeToPushNotificationsOnAllFolders_1(url, frequency, watermark, eventTypesOrCallerData, eventTypes);
        }
        private SubscribeToPushNotificationsOnAllFolders_0(url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): PushSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "SubscribeToPushNotificationsOnAllFolders");
            return this.BuildSubscribeToPushNotificationsRequest(null, url, frequency, watermark, null, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToPushNotificationsOnAllFolders(callback: (ar: IAsyncResult) => void, state: any, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): IAsyncResult;
        BeginSubscribeToPushNotificationsOnAllFolders(callback: (ar: IAsyncResult) => void, state: any, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): IAsyncResult;
        BeginSubscribeToPushNotificationsOnAllFolders(callback: (ar: IAsyncResult) => void, state: any, url: Uri, frequency: number, watermark: string, eventTypesOrCallerData: any, eventTypes?: EventType[]): IAsyncResult {
            if (arguments.length === 6 && (state === null || state.constructor === Object) && (url === null || url instanceof Uri) && (frequency === null || frequency.constructor === Number) && (watermark === null || watermark.constructor === String) && (eventTypesOrCallerData === null || eventTypesOrCallerData instanceof Array)) {
                return this.BeginSubscribeToPushNotificationsOnAllFolders_0(callback, state, url, frequency, watermark, eventTypesOrCallerData);
            }
            return this.BeginSubscribeToPushNotificationsOnAllFolders_1(callback, state, url, frequency, watermark, eventTypesOrCallerData, eventTypes);
        }
        private BeginSubscribeToPushNotificationsOnAllFolders_0(callback: (ar: IAsyncResult) => void, state: any, url: Uri, frequency: number, watermark: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "BeginSubscribeToPushNotificationsOnAllFolders");
            return this.BuildSubscribeToPushNotificationsRequest(null, url, frequency, watermark, null, eventTypes).BeginExecute(callback, state);
        }
        private SubscribeToPushNotifications_1(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): PushSubscription {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPushNotificationsRequest(folderIds, url, frequency, watermark, callerData, eventTypes).Execute().get_Item(0).Subscription;
        }
        private BeginSubscribeToPushNotifications_1(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToPushNotificationsRequest(folderIds, url, frequency, watermark, callerData, eventTypes).BeginExecute(callback, state);
        }
        private SubscribeToPushNotificationsOnAllFolders_1(url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): PushSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "SubscribeToPushNotificationsOnAllFolders");
            return this.BuildSubscribeToPushNotificationsRequest(null, url, frequency, watermark, callerData, eventTypes).Execute().get_Item(0).Subscription;
        }
        private BeginSubscribeToPushNotificationsOnAllFolders_1(callback: (ar: IAsyncResult) => void, state: any, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010, "BeginSubscribeToPushNotificationsOnAllFolders");
            return this.BuildSubscribeToPushNotificationsRequest(null, url, frequency, watermark, callerData, eventTypes).BeginExecute(callback, state);
        }
        EndSubscribeToPushNotifications(asyncResult: IAsyncResult): PushSubscription {
            var subscribeToPushNotificationsRequest: SubscribeToPushNotificationsRequest = AsyncRequestResult.ExtractServiceRequest<SubscribeToPushNotificationsRequest>(this, asyncResult);
            return subscribeToPushNotificationsRequest.EndExecute(asyncResult).get_Item(0).Subscription;
        }
        SetTeamMailbox(emailAddress: EmailAddress, sharePointSiteUrl: Uri, state: TeamMailboxLifecycleState): void {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "SetTeamMailbox");
            if (emailAddress === null) {
                throw new ArgumentNullException("emailAddress");
            }
            if (Uri.op_Equality(sharePointSiteUrl, null)) {
                throw new ArgumentNullException("sharePointSiteUrl");
            }
            var setTeamMailboxRequest: SetTeamMailboxRequest = new SetTeamMailboxRequest(this, emailAddress, sharePointSiteUrl, state);
            setTeamMailboxRequest.Execute();
        }
        UnpinTeamMailbox(emailAddress: EmailAddress): void {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "UnpinTeamMailbox");
            if (emailAddress === null) {
                throw new ArgumentNullException("emailAddress");
            }
            var unpinTeamMailboxRequest: UnpinTeamMailboxRequest = new UnpinTeamMailboxRequest(this, emailAddress);
            unpinTeamMailboxRequest.Execute();
        }
        BuildSubscribeToPushNotificationsRequest(folderIds: IEnumerable<FolderId>, url: Uri, frequency: number, watermark: string, callerData: string, eventTypes: EventType[]): SubscribeToPushNotificationsRequest {
            EwsUtilities.ValidateParam(url, "url");
            if (frequency < 1 || frequency > 1440) {
                throw new ArgumentOutOfRangeException("frequency", Strings.FrequencyMustBeBetween1And1440);
            }
            EwsUtilities.ValidateParamCollection(NArray.ToEnumerable(eventTypes), "eventTypes");
            var subscribeToPushNotificationsRequest: SubscribeToPushNotificationsRequest = new SubscribeToPushNotificationsRequest(this);
            if (folderIds !== null) {
                subscribeToPushNotificationsRequest.FolderIds.AddRange(folderIds);
            }
            subscribeToPushNotificationsRequest.Url = url;
            subscribeToPushNotificationsRequest.Frequency = frequency;
            subscribeToPushNotificationsRequest.EventTypes.AddRange(NArray.ToEnumerable(eventTypes));
            subscribeToPushNotificationsRequest.Watermark = watermark;
            subscribeToPushNotificationsRequest.CallerData = callerData;
            return subscribeToPushNotificationsRequest;
        }
        SubscribeToStreamingNotifications(folderIds: IEnumerable<FolderId>, eventTypes: EventType[]): StreamingSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "SubscribeToStreamingNotifications");
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToStreamingNotificationsRequest(folderIds, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToStreamingNotifications(callback: (ar: IAsyncResult) => void, state: any, folderIds: IEnumerable<FolderId>, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "BeginSubscribeToStreamingNotifications");
            EwsUtilities.ValidateParamCollection(folderIds, "folderIds");
            return this.BuildSubscribeToStreamingNotificationsRequest(folderIds, eventTypes).BeginExecute(callback, state);
        }
        SubscribeToStreamingNotificationsOnAllFolders(eventTypes: EventType[]): StreamingSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "SubscribeToStreamingNotificationsOnAllFolders");
            return this.BuildSubscribeToStreamingNotificationsRequest(null, eventTypes).Execute().get_Item(0).Subscription;
        }
        BeginSubscribeToStreamingNotificationsOnAllFolders(callback: (ar: IAsyncResult) => void, state: any, eventTypes: EventType[]): IAsyncResult {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "BeginSubscribeToStreamingNotificationsOnAllFolders");
            return this.BuildSubscribeToStreamingNotificationsRequest(null, eventTypes).BeginExecute(callback, state);
        }
        EndSubscribeToStreamingNotifications(asyncResult: IAsyncResult): StreamingSubscription {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "EndSubscribeToStreamingNotifications");
            var subscribeToStreamingNotificationsRequest: SubscribeToStreamingNotificationsRequest = AsyncRequestResult.ExtractServiceRequest<SubscribeToStreamingNotificationsRequest>(this, asyncResult);
            return subscribeToStreamingNotificationsRequest.EndExecute(asyncResult).get_Item(0).Subscription;
        }
        BuildSubscribeToStreamingNotificationsRequest(folderIds: IEnumerable<FolderId>, eventTypes: EventType[]): SubscribeToStreamingNotificationsRequest {
            EwsUtilities.ValidateParamCollection(NArray.ToEnumerable(eventTypes), "eventTypes");
            var subscribeToStreamingNotificationsRequest: SubscribeToStreamingNotificationsRequest = new SubscribeToStreamingNotificationsRequest(this);
            if (folderIds !== null) {
                subscribeToStreamingNotificationsRequest.FolderIds.AddRange(folderIds);
            }
            subscribeToStreamingNotificationsRequest.EventTypes.AddRange(NArray.ToEnumerable(eventTypes));
            return subscribeToStreamingNotificationsRequest;
        }
        SyncFolderItems(syncFolderId: FolderId, propertySet: PropertySet, ignoredItemIds: IEnumerable<ItemId>, maxChangesReturned: number, syncScope: SyncFolderItemsScope, syncState: string): ChangeCollection<ItemChange> {
            return this.BuildSyncFolderItemsRequest(syncFolderId, propertySet, ignoredItemIds, maxChangesReturned, syncScope, syncState).Execute().get_Item(0).Changes;
        }
        BeginSyncFolderItems(callback: (ar: IAsyncResult) => void, state: any, syncFolderId: FolderId, propertySet: PropertySet, ignoredItemIds: IEnumerable<ItemId>, maxChangesReturned: number, syncScope: SyncFolderItemsScope, syncState: string): IAsyncResult {
            return this.BuildSyncFolderItemsRequest(syncFolderId, propertySet, ignoredItemIds, maxChangesReturned, syncScope, syncState).BeginExecute(callback, state);
        }
        EndSyncFolderItems(asyncResult: IAsyncResult): ChangeCollection<ItemChange> {
            var syncFolderItemsRequest: SyncFolderItemsRequest = AsyncRequestResult.ExtractServiceRequest<SyncFolderItemsRequest>(this, asyncResult);
            return syncFolderItemsRequest.EndExecute(asyncResult).get_Item(0).Changes;
        }
        BuildSyncFolderItemsRequest(syncFolderId: FolderId, propertySet: PropertySet, ignoredItemIds: IEnumerable<ItemId>, maxChangesReturned: number, syncScope: SyncFolderItemsScope, syncState: string): SyncFolderItemsRequest {
            EwsUtilities.ValidateParam(syncFolderId, "syncFolderId");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            var syncFolderItemsRequest: SyncFolderItemsRequest = new SyncFolderItemsRequest(this);
            syncFolderItemsRequest.SyncFolderId = syncFolderId;
            syncFolderItemsRequest.PropertySet = propertySet;
            if (ignoredItemIds !== null) {
                syncFolderItemsRequest.IgnoredItemIds.AddRange(ignoredItemIds);
            }
            syncFolderItemsRequest.MaxChangesReturned = maxChangesReturned;
            syncFolderItemsRequest.SyncScope = syncScope;
            syncFolderItemsRequest.SyncState = syncState;
            return syncFolderItemsRequest;
        }
        SyncFolderHierarchy(syncFolderId: FolderId, propertySet: PropertySet, syncState: string): ChangeCollection<FolderChange>;
        SyncFolderHierarchy(propertySet: PropertySet, syncState: string): ChangeCollection<FolderChange>;
        SyncFolderHierarchy(syncFolderIdOrPropertySet: any, propertySetOrSyncState: any, syncState?: string): ChangeCollection<FolderChange> {
            if (arguments.length === 3 && (syncFolderIdOrPropertySet === null || syncFolderIdOrPropertySet instanceof FolderId) && (propertySetOrSyncState === null || propertySetOrSyncState instanceof PropertySet) && (syncState === null || syncState.constructor === String)) {
                return this.SyncFolderHierarchy_0(syncFolderIdOrPropertySet, propertySetOrSyncState, syncState);
            }
            return this.SyncFolderHierarchy_1(syncFolderIdOrPropertySet, propertySetOrSyncState);
        }
        private SyncFolderHierarchy_0(syncFolderId: FolderId, propertySet: PropertySet, syncState: string): ChangeCollection<FolderChange> {
            return this.BuildSyncFolderHierarchyRequest(syncFolderId, propertySet, syncState).Execute().get_Item(0).Changes;
        }
        BeginSyncFolderHierarchy(callback: (ar: IAsyncResult) => void, state: any, syncFolderId: FolderId, propertySet: PropertySet, syncState: string): IAsyncResult;
        BeginSyncFolderHierarchy(callback: (ar: IAsyncResult) => void, state: any, propertySet: PropertySet, syncState: string): IAsyncResult;
        BeginSyncFolderHierarchy(callback: (ar: IAsyncResult) => void, state: any, syncFolderIdOrPropertySet: any, propertySetOrSyncState: any, syncState?: string): IAsyncResult {
            if (arguments.length === 5 && (state === null || state.constructor === Object) && (syncFolderIdOrPropertySet === null || syncFolderIdOrPropertySet instanceof FolderId) && (propertySetOrSyncState === null || propertySetOrSyncState instanceof PropertySet) && (syncState === null || syncState.constructor === String)) {
                return this.BeginSyncFolderHierarchy_0(callback, state, syncFolderIdOrPropertySet, propertySetOrSyncState, syncState);
            }
            return this.BeginSyncFolderHierarchy_1(callback, state, syncFolderIdOrPropertySet, propertySetOrSyncState);
        }
        private BeginSyncFolderHierarchy_0(callback: (ar: IAsyncResult) => void, state: any, syncFolderId: FolderId, propertySet: PropertySet, syncState: string): IAsyncResult {
            return this.BuildSyncFolderHierarchyRequest(syncFolderId, propertySet, syncState).BeginExecute(callback, state);
        }
        private SyncFolderHierarchy_1(propertySet: PropertySet, syncState: string): ChangeCollection<FolderChange> {
            return this.SyncFolderHierarchy(null, propertySet, syncState);
        }
        private BeginSyncFolderHierarchy_1(callback: (ar: IAsyncResult) => void, state: any, propertySet: PropertySet, syncState: string): IAsyncResult {
            return this.BeginSyncFolderHierarchy(callback, state, null, propertySet, syncState);
        }
        EndSyncFolderHierarchy(asyncResult: IAsyncResult): ChangeCollection<FolderChange> {
            var syncFolderHierarchyRequest: SyncFolderHierarchyRequest = AsyncRequestResult.ExtractServiceRequest<SyncFolderHierarchyRequest>(this, asyncResult);
            return syncFolderHierarchyRequest.EndExecute(asyncResult).get_Item(0).Changes;
        }
        BuildSyncFolderHierarchyRequest(syncFolderId: FolderId, propertySet: PropertySet, syncState: string): SyncFolderHierarchyRequest {
            EwsUtilities.ValidateParamAllowNull(syncFolderId, "syncFolderId");
            EwsUtilities.ValidateParam(propertySet, "propertySet");
            var syncFolderHierarchyRequest: SyncFolderHierarchyRequest = new SyncFolderHierarchyRequest(this);
            syncFolderHierarchyRequest.PropertySet = propertySet;
            syncFolderHierarchyRequest.SyncFolderId = syncFolderId;
            syncFolderHierarchyRequest.SyncState = syncState;
            return syncFolderHierarchyRequest;
        }
        GetUserOofSettings(smtpAddress: string): OofSettings {
            EwsUtilities.ValidateParam(smtpAddress, "smtpAddress");
            var getUserOofSettingsRequest: GetUserOofSettingsRequest = new GetUserOofSettingsRequest(this);
            getUserOofSettingsRequest.SmtpAddress = smtpAddress;
            return getUserOofSettingsRequest.Execute().OofSettings;
        }
        SetUserOofSettings(smtpAddress: string, oofSettings: OofSettings): void {
            EwsUtilities.ValidateParam(smtpAddress, "smtpAddress");
            EwsUtilities.ValidateParam(oofSettings, "oofSettings");
            var setUserOofSettingsRequest: SetUserOofSettingsRequest = new SetUserOofSettingsRequest(this);
            setUserOofSettingsRequest.SmtpAddress = smtpAddress;
            setUserOofSettingsRequest.OofSettings = oofSettings;
            setUserOofSettingsRequest.Execute();
        }
        GetUserAvailability(attendees: IEnumerable<AttendeeInfo>, timeWindow: TimeWindow, requestedData: AvailabilityData, options: AvailabilityOptions): GetUserAvailabilityResults;
        GetUserAvailability(attendees: IEnumerable<AttendeeInfo>, timeWindow: TimeWindow, requestedData: AvailabilityData): GetUserAvailabilityResults;
        GetUserAvailability(attendees: IEnumerable<AttendeeInfo>, timeWindow: TimeWindow, requestedData: AvailabilityData, options?: AvailabilityOptions): GetUserAvailabilityResults {
            if (arguments.length === 4 && (timeWindow === null || timeWindow instanceof TimeWindow) && (requestedData === null || requestedData.constructor === Number) && (options === null || options instanceof AvailabilityOptions)) {
                return this.GetUserAvailability_0(attendees, timeWindow, requestedData, options);
            }
            return this.GetUserAvailability_1(attendees, timeWindow, requestedData);
        }
        private GetUserAvailability_0(attendees: IEnumerable<AttendeeInfo>, timeWindow: TimeWindow, requestedData: AvailabilityData, options: AvailabilityOptions): GetUserAvailabilityResults {
            EwsUtilities.ValidateParamCollection(attendees, "attendees");
            EwsUtilities.ValidateParam(timeWindow, "timeWindow");
            EwsUtilities.ValidateParam(options, "options");
            var getUserAvailabilityRequest: GetUserAvailabilityRequest = new GetUserAvailabilityRequest(this);
            getUserAvailabilityRequest.Attendees = attendees;
            getUserAvailabilityRequest.TimeWindow = timeWindow;
            getUserAvailabilityRequest.RequestedData = requestedData;
            getUserAvailabilityRequest.Options = options;
            return getUserAvailabilityRequest.Execute();
        }
        private GetUserAvailability_1(attendees: IEnumerable<AttendeeInfo>, timeWindow: TimeWindow, requestedData: AvailabilityData): GetUserAvailabilityResults {
            return this.GetUserAvailability(attendees, timeWindow, requestedData, new AvailabilityOptions());
        }
        GetRoomLists(): EmailAddressCollection {
            var getRoomListsRequest: GetRoomListsRequest = new GetRoomListsRequest(this);
            return getRoomListsRequest.Execute().RoomLists;
        }
        GetRooms(emailAddress: EmailAddress): Collection<EmailAddress> {
            EwsUtilities.ValidateParam(emailAddress, "emailAddress");
            var getRoomsRequest: GetRoomsRequest = new GetRoomsRequest(this);
            getRoomsRequest.RoomList = emailAddress;
            return getRoomsRequest.Execute().Rooms;
        }
        FindConversation(view: ViewBase, folderId: FolderId): ICollection<Conversation>;
        FindConversation(view: ViewBase, folderId: FolderId, queryString: string): ICollection<Conversation>;
        FindConversation(view: ViewBase, folderId: FolderId, queryString: string, returnHighlightTerms: boolean): ICollection<Conversation>;
        FindConversation(view: ViewBase, folderId: FolderId, queryString: string, returnHighlightTerms: boolean, mailboxScope: Nullable<MailboxSearchLocation>): ICollection<Conversation>;
        FindConversation(view: ViewBase, folderId: FolderId, queryString?: string, returnHighlightTerms?: boolean, mailboxScope?: Nullable<MailboxSearchLocation>): ICollection<Conversation> {
            if (arguments.length === 2 && (view === null || view instanceof ViewBase) && (folderId === null || folderId instanceof FolderId)) {
                return this.FindConversation_0(view, folderId);
            }
            if (arguments.length === 3 && (view === null || view instanceof ViewBase) && (folderId === null || folderId instanceof FolderId) && (queryString === null || queryString.constructor === String)) {
                return this.FindConversation_1(view, folderId, queryString);
            }
            if (arguments.length === 4 && (view === null || view instanceof ViewBase) && (folderId === null || folderId instanceof FolderId) && (queryString === null || queryString.constructor === String) && (returnHighlightTerms === null || returnHighlightTerms.constructor === Boolean)) {
                return this.FindConversation_2(view, folderId, queryString, returnHighlightTerms);
            }
            return this.FindConversation_3(view, folderId, queryString, returnHighlightTerms, mailboxScope);
        }
        private FindConversation_0(view: ViewBase, folderId: FolderId): ICollection<Conversation> {
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "FindConversation");
            var findConversationRequest: FindConversationRequest = new FindConversationRequest(this);
            findConversationRequest.View = view;
            findConversationRequest.FolderId = new FolderIdWrapper(folderId);
            return findConversationRequest.Execute().Conversations;
        }
        private FindConversation_1(view: ViewBase, folderId: FolderId, queryString: string): ICollection<Conversation> {
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "FindConversation");
            var findConversationRequest: FindConversationRequest = new FindConversationRequest(this);
            findConversationRequest.View = view;
            findConversationRequest.FolderId = new FolderIdWrapper(folderId);
            findConversationRequest.QueryString = queryString;
            return findConversationRequest.Execute().Conversations;
        }
        private FindConversation_2(view: ViewBase, folderId: FolderId, queryString: string, returnHighlightTerms: boolean): FindConversationResults {
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParam(returnHighlightTerms, "returnHighlightTerms");
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "FindConversation");
            var findConversationRequest: FindConversationRequest = new FindConversationRequest(this);
            findConversationRequest.View = view;
            findConversationRequest.FolderId = new FolderIdWrapper(folderId);
            findConversationRequest.QueryString = queryString;
            findConversationRequest.ReturnHighlightTerms = returnHighlightTerms;
            return findConversationRequest.Execute().Results;
        }
        private FindConversation_3(view: ViewBase, folderId: FolderId, queryString: string, returnHighlightTerms: boolean, mailboxScope: Nullable<MailboxSearchLocation>): FindConversationResults {
            EwsUtilities.ValidateParam(view, "view");
            EwsUtilities.ValidateParamAllowNull(queryString, "queryString");
            EwsUtilities.ValidateParam(returnHighlightTerms, "returnHighlightTerms");
            EwsUtilities.ValidateParam(folderId, "folderId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "FindConversation");
            var findConversationRequest: FindConversationRequest = new FindConversationRequest(this);
            findConversationRequest.View = view;
            findConversationRequest.FolderId = new FolderIdWrapper(folderId);
            findConversationRequest.QueryString = queryString;
            findConversationRequest.ReturnHighlightTerms = returnHighlightTerms;
            findConversationRequest.MailboxScope = mailboxScope;
            return findConversationRequest.Execute().Results;
        }
        InternalGetConversationItems(conversations: IEnumerable<ConversationRequest>, propertySet: PropertySet, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>, mailboxScope: Nullable<MailboxSearchLocation>, maxItemsToReturn: Nullable<number>, errorHandling: ServiceErrorHandling): ServiceResponseCollection<GetConversationItemsResponse> {
            EwsUtilities.ValidateParam(conversations, "conversations");
            EwsUtilities.ValidateParam(propertySet, "itemProperties");
            EwsUtilities.ValidateParamAllowNull(foldersToIgnore, "foldersToIgnore");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "GetConversationItems");
            var getConversationItemsRequest: GetConversationItemsRequest = new GetConversationItemsRequest(this, errorHandling);
            getConversationItemsRequest.ItemProperties = propertySet;
            getConversationItemsRequest.FoldersToIgnore = new FolderIdCollection(foldersToIgnore);
            getConversationItemsRequest.SortOrder = sortOrder;
            getConversationItemsRequest.MailboxScope = mailboxScope;
            getConversationItemsRequest.MaxItemsToReturn = maxItemsToReturn;
            getConversationItemsRequest.Conversations = Enumerable.ToList<ConversationRequest>(conversations);
            return getConversationItemsRequest.Execute();
        }
        GetConversationItems(conversations: IEnumerable<ConversationRequest>, propertySet: PropertySet, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>): ServiceResponseCollection<GetConversationItemsResponse>;
        GetConversationItems(conversationId: ConversationId, propertySet: PropertySet, syncState: string, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>): ServiceResponseCollection<GetConversationItemsResponse>;
        GetConversationItems(conversations: IEnumerable<ConversationRequest>, propertySet: PropertySet, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>, mailboxScope: Nullable<MailboxSearchLocation>): ServiceResponseCollection<GetConversationItemsResponse>;
        GetConversationItems(conversationsOrConversationId: any, propertySet: PropertySet, foldersToIgnoreOrSyncState: any, sortOrderOrFoldersToIgnore: any, sortOrderOrMailboxScope?: any): ServiceResponseCollection<GetConversationItemsResponse> {
            if (arguments.length === 4 && (propertySet === null || propertySet instanceof PropertySet) && (sortOrderOrFoldersToIgnore === null || sortOrderOrFoldersToIgnore instanceof Array)) {
                return this.GetConversationItems_0(conversationsOrConversationId, propertySet, foldersToIgnoreOrSyncState, sortOrderOrFoldersToIgnore);
            }
            if (arguments.length === 5 && (conversationsOrConversationId === null || conversationsOrConversationId instanceof ConversationId) && (propertySet === null || propertySet instanceof PropertySet) && (foldersToIgnoreOrSyncState === null || foldersToIgnoreOrSyncState.constructor === String) && (sortOrderOrMailboxScope === null || sortOrderOrMailboxScope instanceof Array)) {
                return this.GetConversationItems_1(conversationsOrConversationId, propertySet, foldersToIgnoreOrSyncState, sortOrderOrFoldersToIgnore, sortOrderOrMailboxScope);
            }
            return this.GetConversationItems_2(conversationsOrConversationId, propertySet, foldersToIgnoreOrSyncState, sortOrderOrFoldersToIgnore, sortOrderOrMailboxScope);
        }
        private GetConversationItems_0(conversations: IEnumerable<ConversationRequest>, propertySet: PropertySet, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>): ServiceResponseCollection<GetConversationItemsResponse> {
            return this.InternalGetConversationItems(conversations, propertySet, foldersToIgnore, null, null, null, ServiceErrorHandling.ReturnErrors);
        }
        private GetConversationItems_1(conversationId: ConversationId, propertySet: PropertySet, syncState: string, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>): ConversationResponse {
            var list: List<ConversationRequest> = new List<ConversationRequest>();
            list.Add(new ConversationRequest(conversationId, syncState));
            return this.InternalGetConversationItems(list, propertySet, foldersToIgnore, sortOrder, null, null, ServiceErrorHandling.ThrowOnError).get_Item(0).Conversation;
        }
        private GetConversationItems_2(conversations: IEnumerable<ConversationRequest>, propertySet: PropertySet, foldersToIgnore: IEnumerable<FolderId>, sortOrder: Nullable<ConversationSortOrder>, mailboxScope: Nullable<MailboxSearchLocation>): ServiceResponseCollection<GetConversationItemsResponse> {
            return this.InternalGetConversationItems(conversations, propertySet, foldersToIgnore, null, mailboxScope, null, ServiceErrorHandling.ReturnErrors);
        }
        ApplyConversationAction(actionType: ConversationActionType, conversationIds: IEnumerable<ConversationId>, processRightAway: boolean, categories: StringList, enableAlwaysDelete: boolean, destinationFolderId: FolderId, errorHandlingMode: ServiceErrorHandling): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.Assert(actionType === ConversationActionType.AlwaysCategorize || actionType === ConversationActionType.AlwaysMove || actionType === ConversationActionType.AlwaysDelete, "ApplyConversationAction", "Invalic actionType");
            EwsUtilities.ValidateParam(conversationIds, "conversationId");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "ApplyConversationAction");
            var applyConversationActionRequest: ApplyConversationActionRequest = new ApplyConversationActionRequest(this, errorHandlingMode);
            var conversationAction: ConversationAction = new ConversationAction();
            var enumerator: IEnumerator<ConversationId> = conversationIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ConversationId = enumerator.Current;
                    conversationAction.Action = actionType;
                    conversationAction.ConversationId = current;
                    conversationAction.ProcessRightAway = processRightAway;
                    conversationAction.Categories = categories;
                    conversationAction.EnableAlwaysDelete = enableAlwaysDelete;
                    conversationAction.DestinationFolderId = ((destinationFolderId !== null) ? new FolderIdWrapper(destinationFolderId) : null);
                    applyConversationActionRequest.ConversationActions.Add(conversationAction);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return applyConversationActionRequest.Execute();
        }
        ApplyConversationOneTimeAction(actionType: ConversationActionType, idTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, destinationFolderId: FolderId, deleteType: Nullable<DeleteMode>, isRead: Nullable<boolean>, retentionPolicyType: Nullable<RetentionType>, retentionPolicyTagId: Nullable<Guid>, flag: Flag, suppressReadReceipts: Nullable<boolean>, errorHandlingMode: ServiceErrorHandling): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.Assert(actionType === ConversationActionType.Move || actionType === ConversationActionType.Delete || actionType === ConversationActionType.SetReadState || actionType === ConversationActionType.SetRetentionPolicy || actionType === ConversationActionType.Copy || actionType === ConversationActionType.Flag, "ApplyConversationOneTimeAction", "Invalid actionType");
            EwsUtilities.ValidateParamCollection(idTimePairs, "idTimePairs");
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2010_SP1, "ApplyConversationAction");
            var applyConversationActionRequest: ApplyConversationActionRequest = new ApplyConversationActionRequest(this, errorHandlingMode);
            var enumerator: IEnumerator<KeyValuePair<ConversationId, Nullable<DateTime>>> = idTimePairs.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<ConversationId, Nullable<DateTime>> = enumerator.Current;
                    var conversationAction: ConversationAction = new ConversationAction();
                    conversationAction.Action = actionType;
                    conversationAction.ConversationId = current.Key;
                    conversationAction.ContextFolderId = ((contextFolderId !== null) ? new FolderIdWrapper(contextFolderId) : null);
                    conversationAction.DestinationFolderId = ((destinationFolderId !== null) ? new FolderIdWrapper(destinationFolderId) : null);
                    conversationAction.ConversationLastSyncTime = current.Value;
                    conversationAction.IsRead = isRead;
                    conversationAction.DeleteType = deleteType;
                    conversationAction.RetentionPolicyType = retentionPolicyType;
                    conversationAction.RetentionPolicyTagId = retentionPolicyTagId;
                    conversationAction.Flag = flag;
                    conversationAction.SuppressReadReceipts = suppressReadReceipts;
                    applyConversationActionRequest.ConversationActions.Add(conversationAction);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return applyConversationActionRequest.Execute();
        }
        EnableAlwaysCategorizeItemsInConversations(conversationId: IEnumerable<ConversationId>, categories: IEnumerable<string>, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParamCollection(categories, "categories");
            return this.ApplyConversationAction(ConversationActionType.AlwaysCategorize, conversationId, processSynchronously, new StringList(categories), false, null, ServiceErrorHandling.ReturnErrors);
        }
        DisableAlwaysCategorizeItemsInConversations(conversationId: IEnumerable<ConversationId>, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationAction(ConversationActionType.AlwaysCategorize, conversationId, processSynchronously, null, false, null, ServiceErrorHandling.ReturnErrors);
        }
        EnableAlwaysDeleteItemsInConversations(conversationId: IEnumerable<ConversationId>, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationAction(ConversationActionType.AlwaysDelete, conversationId, processSynchronously, null, true, null, ServiceErrorHandling.ReturnErrors);
        }
        DisableAlwaysDeleteItemsInConversations(conversationId: IEnumerable<ConversationId>, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationAction(ConversationActionType.AlwaysDelete, conversationId, processSynchronously, null, false, null, ServiceErrorHandling.ReturnErrors);
        }
        EnableAlwaysMoveItemsInConversations(conversationId: IEnumerable<ConversationId>, destinationFolderId: FolderId, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.ApplyConversationAction(ConversationActionType.AlwaysMove, conversationId, processSynchronously, null, false, destinationFolderId, ServiceErrorHandling.ReturnErrors);
        }
        DisableAlwaysMoveItemsInConversations(conversationIds: IEnumerable<ConversationId>, processSynchronously: boolean): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationAction(ConversationActionType.AlwaysMove, conversationIds, processSynchronously, null, false, null, ServiceErrorHandling.ReturnErrors);
        }
        MoveItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, destinationFolderId: FolderId): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.ApplyConversationOneTimeAction(ConversationActionType.Move, idLastSyncTimePairs, contextFolderId, destinationFolderId, null, null, null, null, null, null, ServiceErrorHandling.ReturnErrors);
        }
        CopyItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, destinationFolderId: FolderId): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.ApplyConversationOneTimeAction(ConversationActionType.Copy, idLastSyncTimePairs, contextFolderId, destinationFolderId, null, null, null, null, null, null, ServiceErrorHandling.ReturnErrors);
        }
        DeleteItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, deleteMode: DeleteMode): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationOneTimeAction(ConversationActionType.Delete, idLastSyncTimePairs, contextFolderId, null, new Nullable<DeleteMode>(deleteMode), null, null, null, null, null, ServiceErrorHandling.ReturnErrors);
        }
        SetReadStateForItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, isRead: boolean): ServiceResponseCollection<ServiceResponse>;
        SetReadStateForItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, isRead: boolean, suppressReadReceipts: boolean): ServiceResponseCollection<ServiceResponse>;
        SetReadStateForItemsInConversations(idLastSyncTimePairs: any, contextFolderId: FolderId, isRead: boolean, suppressReadReceipts?: boolean): ServiceResponseCollection<ServiceResponse> {
            if (arguments.length === 3 && (contextFolderId === null || contextFolderId instanceof FolderId) && (isRead === null || isRead.constructor === Boolean)) {
                return this.SetReadStateForItemsInConversations_0(idLastSyncTimePairs, contextFolderId, isRead);
            }
            return this.SetReadStateForItemsInConversations_1(idLastSyncTimePairs, contextFolderId, isRead, suppressReadReceipts);
        }
        private SetReadStateForItemsInConversations_0(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, isRead: boolean): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationOneTimeAction(ConversationActionType.SetReadState, idLastSyncTimePairs, contextFolderId, null, null, new Nullable<boolean>(isRead), null, null, null, null, ServiceErrorHandling.ReturnErrors);
        }
        private SetReadStateForItemsInConversations_1(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, isRead: boolean, suppressReadReceipts: boolean): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "SetReadStateForItemsInConversations");
            return this.ApplyConversationOneTimeAction(ConversationActionType.SetReadState, idLastSyncTimePairs, contextFolderId, null, null, new Nullable<boolean>(isRead), null, null, null, new Nullable<boolean>(suppressReadReceipts), ServiceErrorHandling.ReturnErrors);
        }
        SetRetentionPolicyForItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, retentionPolicyType: RetentionType, retentionPolicyTagId: Nullable<Guid>): ServiceResponseCollection<ServiceResponse> {
            return this.ApplyConversationOneTimeAction(ConversationActionType.SetRetentionPolicy, idLastSyncTimePairs, contextFolderId, null, null, null, new Nullable<RetentionType>(retentionPolicyType), retentionPolicyTagId, null, null, ServiceErrorHandling.ReturnErrors);
        }
        SetFlagStatusForItemsInConversations(idLastSyncTimePairs: IEnumerable<KeyValuePair<ConversationId, Nullable<DateTime>>>, contextFolderId: FolderId, flagStatus: Flag): ServiceResponseCollection<ServiceResponse> {
            EwsUtilities.ValidateMethodVersion(this, ExchangeVersion.Exchange2013, "SetFlagStatusForItemsInConversations");
            return this.ApplyConversationOneTimeAction(ConversationActionType.Flag, idLastSyncTimePairs, contextFolderId, null, null, null, null, null, flagStatus, null, ServiceErrorHandling.ReturnErrors);
        }
        InternalConvertIds(ids: IEnumerable<AlternateIdBase>, destinationFormat: IdFormat, errorHandling: ServiceErrorHandling): ServiceResponseCollection<ConvertIdResponse> {
            EwsUtilities.ValidateParamCollection(ids, "ids");
            var convertIdRequest: ConvertIdRequest = new ConvertIdRequest(this, errorHandling);
            convertIdRequest.Ids.AddRange(ids);
            convertIdRequest.DestinationFormat = destinationFormat;
            return convertIdRequest.Execute();
        }
        ConvertIds(ids: IEnumerable<AlternateIdBase>, destinationFormat: IdFormat): ServiceResponseCollection<ConvertIdResponse> {
            EwsUtilities.ValidateParamCollection(ids, "ids");
            return this.InternalConvertIds(ids, destinationFormat, ServiceErrorHandling.ReturnErrors);
        }
        ConvertId(id: AlternateIdBase, destinationFormat: IdFormat): AlternateIdBase {
            EwsUtilities.ValidateParam(id, "id");
            var serviceResponseCollection: ServiceResponseCollection<ConvertIdResponse> = this.InternalConvertIds(NArray.ToEnumerable([
                id
            ]), destinationFormat, ServiceErrorHandling.ThrowOnError);
            return serviceResponseCollection.get_Item(0).ConvertedId;
        }
        AddDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: DelegateUser[]): Collection<DelegateUserResponse>;
        AddDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: IEnumerable<DelegateUser>): Collection<DelegateUserResponse>;
        AddDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: any, delegateUsers: any): Collection<DelegateUserResponse> {
            if (arguments.length === 3 && (mailbox === null || mailbox instanceof Mailbox) && (meetingRequestsDeliveryScope === null || meetingRequestsDeliveryScope instanceof Array) && (delegateUsers === null || delegateUsers instanceof Array)) {
                return this.AddDelegates_0(mailbox, meetingRequestsDeliveryScope, delegateUsers);
            }
            return this.AddDelegates_1(mailbox, meetingRequestsDeliveryScope, delegateUsers);
        }
        private AddDelegates_0(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: DelegateUser[]): Collection<DelegateUserResponse> {
            return this.AddDelegates(mailbox, meetingRequestsDeliveryScope, <IEnumerable<DelegateUser>>delegateUsers);
        }
        private AddDelegates_1(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: IEnumerable<DelegateUser>): Collection<DelegateUserResponse> {
            EwsUtilities.ValidateParam(mailbox, "mailbox");
            EwsUtilities.ValidateParamCollection(delegateUsers, "delegateUsers");
            var addDelegateRequest: AddDelegateRequest = new AddDelegateRequest(this);
            addDelegateRequest.Mailbox = mailbox;
            addDelegateRequest.DelegateUsers.AddRange(delegateUsers);
            addDelegateRequest.MeetingRequestsDeliveryScope = meetingRequestsDeliveryScope;
            var delegateManagementResponse: DelegateManagementResponse = addDelegateRequest.Execute();
            return delegateManagementResponse.DelegateUserResponses;
        }
        UpdateDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: DelegateUser[]): Collection<DelegateUserResponse>;
        UpdateDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: IEnumerable<DelegateUser>): Collection<DelegateUserResponse>;
        UpdateDelegates(mailbox: Mailbox, meetingRequestsDeliveryScope: any, delegateUsers: any): Collection<DelegateUserResponse> {
            if (arguments.length === 3 && (mailbox === null || mailbox instanceof Mailbox) && (meetingRequestsDeliveryScope === null || meetingRequestsDeliveryScope instanceof Array) && (delegateUsers === null || delegateUsers instanceof Array)) {
                return this.UpdateDelegates_0(mailbox, meetingRequestsDeliveryScope, delegateUsers);
            }
            return this.UpdateDelegates_1(mailbox, meetingRequestsDeliveryScope, delegateUsers);
        }
        private UpdateDelegates_0(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: DelegateUser[]): Collection<DelegateUserResponse> {
            return this.UpdateDelegates(mailbox, meetingRequestsDeliveryScope, <IEnumerable<DelegateUser>>delegateUsers);
        }
        private UpdateDelegates_1(mailbox: Mailbox, meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope>, delegateUsers: IEnumerable<DelegateUser>): Collection<DelegateUserResponse> {
            EwsUtilities.ValidateParam(mailbox, "mailbox");
            EwsUtilities.ValidateParamCollection(delegateUsers, "delegateUsers");
            var updateDelegateRequest: UpdateDelegateRequest = new UpdateDelegateRequest(this);
            updateDelegateRequest.Mailbox = mailbox;
            updateDelegateRequest.DelegateUsers.AddRange(delegateUsers);
            updateDelegateRequest.MeetingRequestsDeliveryScope = meetingRequestsDeliveryScope;
            var delegateManagementResponse: DelegateManagementResponse = updateDelegateRequest.Execute();
            return delegateManagementResponse.DelegateUserResponses;
        }
        RemoveDelegates(mailbox: Mailbox, userIds: UserId[]): Collection<DelegateUserResponse>;
        RemoveDelegates(mailbox: Mailbox, userIds: IEnumerable<UserId>): Collection<DelegateUserResponse>;
        RemoveDelegates(mailbox: Mailbox, userIds: any): Collection<DelegateUserResponse> {
            if (arguments.length === 2 && (mailbox === null || mailbox instanceof Mailbox) && (userIds === null || userIds instanceof Array)) {
                return this.RemoveDelegates_0(mailbox, userIds);
            }
            return this.RemoveDelegates_1(mailbox, userIds);
        }
        private RemoveDelegates_0(mailbox: Mailbox, userIds: UserId[]): Collection<DelegateUserResponse> {
            return this.RemoveDelegates(mailbox, <IEnumerable<UserId>>userIds);
        }
        private RemoveDelegates_1(mailbox: Mailbox, userIds: IEnumerable<UserId>): Collection<DelegateUserResponse> {
            EwsUtilities.ValidateParam(mailbox, "mailbox");
            EwsUtilities.ValidateParamCollection(userIds, "userIds");
            var removeDelegateRequest: RemoveDelegateRequest = new RemoveDelegateRequest(this);
            removeDelegateRequest.Mailbox = mailbox;
            removeDelegateRequest.UserIds.AddRange(userIds);
            var delegateManagementResponse: DelegateManagementResponse = removeDelegateRequest.Execute();
            return delegateManagementResponse.DelegateUserResponses;
        }
        GetDelegates(mailbox: Mailbox, includePermissions: boolean, userIds: UserId[]): DelegateInformation;
        GetDelegates(mailbox: Mailbox, includePermissions: boolean, userIds: IEnumerable<UserId>): DelegateInformation;
        GetDelegates(mailbox: Mailbox, includePermissions: boolean, userIds: any): DelegateInformation {
            if (arguments.length === 3 && (mailbox === null || mailbox instanceof Mailbox) && (includePermissions === null || includePermissions.constructor === Boolean) && (userIds === null || userIds instanceof Array)) {
                return this.GetDelegates_0(mailbox, includePermissions, userIds);
            }
            return this.GetDelegates_1(mailbox, includePermissions, userIds);
        }
        private GetDelegates_0(mailbox: Mailbox, includePermissions: boolean, userIds: UserId[]): DelegateInformation {
            return this.GetDelegates(mailbox, includePermissions, <IEnumerable<UserId>>userIds);
        }
        private GetDelegates_1(mailbox: Mailbox, includePermissions: boolean, userIds: IEnumerable<UserId>): DelegateInformation {
            EwsUtilities.ValidateParam(mailbox, "mailbox");
            var getDelegateRequest: GetDelegateRequest = new GetDelegateRequest(this);
            getDelegateRequest.Mailbox = mailbox;
            getDelegateRequest.UserIds.AddRange(userIds);
            getDelegateRequest.IncludePermissions = includePermissions;
            var getDelegateResponse: GetDelegateResponse = getDelegateRequest.Execute();
            return new DelegateInformation(getDelegateResponse.DelegateUserResponses, getDelegateResponse.MeetingRequestsDeliveryScope);
        }
        CreateUserConfiguration(userConfiguration: UserConfiguration): void {
            EwsUtilities.ValidateParam(userConfiguration, "userConfiguration");
            var createUserConfigurationRequest: CreateUserConfigurationRequest = new CreateUserConfigurationRequest(this);
            createUserConfigurationRequest.UserConfiguration = userConfiguration;
            createUserConfigurationRequest.Execute();
        }
        DeleteUserConfiguration(name: string, parentFolderId: FolderId): void {
            EwsUtilities.ValidateParam(name, "name");
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            var deleteUserConfigurationRequest: DeleteUserConfigurationRequest = new DeleteUserConfigurationRequest(this);
            deleteUserConfigurationRequest.Name = name;
            deleteUserConfigurationRequest.ParentFolderId = parentFolderId;
            deleteUserConfigurationRequest.Execute();
        }
        GetUserConfiguration(name: string, parentFolderId: FolderId, properties: UserConfigurationProperties): UserConfiguration {
            EwsUtilities.ValidateParam(name, "name");
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            var getUserConfigurationRequest: GetUserConfigurationRequest = new GetUserConfigurationRequest(this);
            getUserConfigurationRequest.Name = name;
            getUserConfigurationRequest.ParentFolderId = parentFolderId;
            getUserConfigurationRequest.Properties = properties;
            return getUserConfigurationRequest.Execute().get_Item(0).UserConfiguration;
        }
        LoadPropertiesForUserConfiguration(userConfiguration: UserConfiguration, properties: UserConfigurationProperties): void {
            EwsUtilities.Assert(userConfiguration !== null, "ExchangeService.LoadPropertiesForUserConfiguration", "userConfiguration is null");
            var getUserConfigurationRequest: GetUserConfigurationRequest = new GetUserConfigurationRequest(this);
            getUserConfigurationRequest.UserConfiguration = userConfiguration;
            getUserConfigurationRequest.Properties = properties;
            getUserConfigurationRequest.Execute();
        }
        UpdateUserConfiguration(userConfiguration: UserConfiguration): void {
            EwsUtilities.ValidateParam(userConfiguration, "userConfiguration");
            var updateUserConfigurationRequest: UpdateUserConfigurationRequest = new UpdateUserConfigurationRequest(this);
            updateUserConfigurationRequest.UserConfiguration = userConfiguration;
            updateUserConfigurationRequest.Execute();
        }
        GetInboxRules(): RuleCollection;
        GetInboxRules(mailboxSmtpAddress: string): RuleCollection;
        GetInboxRules(mailboxSmtpAddress?: string): RuleCollection {
            if (arguments.length === 0) {
                return this.GetInboxRules_0();
            }
            return this.GetInboxRules_1(mailboxSmtpAddress);
        }
        private GetInboxRules_0(): RuleCollection {
            var getInboxRulesRequest: GetInboxRulesRequest = new GetInboxRulesRequest(this);
            return getInboxRulesRequest.Execute().Rules;
        }
        private GetInboxRules_1(mailboxSmtpAddress: string): RuleCollection {
            EwsUtilities.ValidateParam(mailboxSmtpAddress, "MailboxSmtpAddress");
            var getInboxRulesRequest: GetInboxRulesRequest = new GetInboxRulesRequest(this);
            getInboxRulesRequest.MailboxSmtpAddress = mailboxSmtpAddress;
            return getInboxRulesRequest.Execute().Rules;
        }
        UpdateInboxRules(operations: IEnumerable<RuleOperation>, removeOutlookRuleBlob: boolean): void;
        UpdateInboxRules(operations: IEnumerable<RuleOperation>, removeOutlookRuleBlob: boolean, mailboxSmtpAddress: string): void;
        UpdateInboxRules(operations: IEnumerable<RuleOperation>, removeOutlookRuleBlob: boolean, mailboxSmtpAddress?: string): void {
            if (arguments.length === 2 && (removeOutlookRuleBlob === null || removeOutlookRuleBlob.constructor === Boolean)) {
                this.UpdateInboxRules_0(operations, removeOutlookRuleBlob);
                return;
            }
            this.UpdateInboxRules_1(operations, removeOutlookRuleBlob, mailboxSmtpAddress);
        }
        private UpdateInboxRules_0(operations: IEnumerable<RuleOperation>, removeOutlookRuleBlob: boolean): void {
            var updateInboxRulesRequest: UpdateInboxRulesRequest = new UpdateInboxRulesRequest(this);
            updateInboxRulesRequest.InboxRuleOperations = operations;
            updateInboxRulesRequest.RemoveOutlookRuleBlob = removeOutlookRuleBlob;
            updateInboxRulesRequest.Execute();
        }
        private UpdateInboxRules_1(operations: IEnumerable<RuleOperation>, removeOutlookRuleBlob: boolean, mailboxSmtpAddress: string): void {
            var updateInboxRulesRequest: UpdateInboxRulesRequest = new UpdateInboxRulesRequest(this);
            updateInboxRulesRequest.InboxRuleOperations = operations;
            updateInboxRulesRequest.RemoveOutlookRuleBlob = removeOutlookRuleBlob;
            updateInboxRulesRequest.MailboxSmtpAddress = mailboxSmtpAddress;
            updateInboxRulesRequest.Execute();
        }
        GetDiscoverySearchConfiguration(searchId: string, expandGroupMembership: boolean, inPlaceHoldConfigurationOnly: boolean): GetDiscoverySearchConfigurationResponse {
            var getDiscoverySearchConfigurationRequest: GetDiscoverySearchConfigurationRequest = new GetDiscoverySearchConfigurationRequest(this);
            getDiscoverySearchConfigurationRequest.SearchId = searchId;
            getDiscoverySearchConfigurationRequest.ExpandGroupMembership = expandGroupMembership;
            getDiscoverySearchConfigurationRequest.InPlaceHoldConfigurationOnly = inPlaceHoldConfigurationOnly;
            return getDiscoverySearchConfigurationRequest.Execute();
        }
        GetSearchableMailboxes(searchFilter: string, expandGroupMembership: boolean): GetSearchableMailboxesResponse {
            var getSearchableMailboxesRequest: GetSearchableMailboxesRequest = new GetSearchableMailboxesRequest(this);
            getSearchableMailboxesRequest.SearchFilter = searchFilter;
            getSearchableMailboxesRequest.ExpandGroupMembership = expandGroupMembership;
            return getSearchableMailboxesRequest.Execute();
        }
        SearchMailboxes(mailboxQueries: IEnumerable<MailboxQuery>, resultType: SearchResultType): ServiceResponseCollection<SearchMailboxesResponse>;
        SearchMailboxes(mailboxQueries: IEnumerable<MailboxQuery>, resultType: SearchResultType, sortByProperty: string, sortOrder: SortDirection, pageSize: number, pageDirection: SearchPageDirection, pageItemReference: string): ServiceResponseCollection<SearchMailboxesResponse>;
        SearchMailboxes(searchParameters: SearchMailboxesParameters): ServiceResponseCollection<SearchMailboxesResponse>;
        SearchMailboxes(mailboxQueriesOrSearchParameters: any, resultType?: SearchResultType, sortByProperty?: string, sortOrder?: SortDirection, pageSize?: number, pageDirection?: SearchPageDirection, pageItemReference?: string): ServiceResponseCollection<SearchMailboxesResponse> {
            if (arguments.length === 2 && (resultType === null || resultType.constructor === Number)) {
                return this.SearchMailboxes_0(mailboxQueriesOrSearchParameters, resultType);
            }
            if (arguments.length === 7 && (resultType === null || resultType.constructor === Number) && (sortByProperty === null || sortByProperty.constructor === String) && (sortOrder === null || sortOrder.constructor === Number) && (pageSize === null || pageSize.constructor === Number) && (pageDirection === null || pageDirection.constructor === Number) && (pageItemReference === null || pageItemReference.constructor === String)) {
                return this.SearchMailboxes_1(mailboxQueriesOrSearchParameters, resultType, sortByProperty, sortOrder, pageSize, pageDirection, pageItemReference);
            }
            return this.SearchMailboxes_2(mailboxQueriesOrSearchParameters);
        }
        private SearchMailboxes_0(mailboxQueries: IEnumerable<MailboxQuery>, resultType: SearchResultType): ServiceResponseCollection<SearchMailboxesResponse> {
            var searchMailboxesRequest: SearchMailboxesRequest = new SearchMailboxesRequest(this, ServiceErrorHandling.ReturnErrors);
            if (mailboxQueries !== null) {
                searchMailboxesRequest.SearchQueries.AddRange(mailboxQueries);
            }
            searchMailboxesRequest.ResultType = resultType;
            return searchMailboxesRequest.Execute();
        }
        private SearchMailboxes_1(mailboxQueries: IEnumerable<MailboxQuery>, resultType: SearchResultType, sortByProperty: string, sortOrder: SortDirection, pageSize: number, pageDirection: SearchPageDirection, pageItemReference: string): ServiceResponseCollection<SearchMailboxesResponse> {
            var searchMailboxesRequest: SearchMailboxesRequest = new SearchMailboxesRequest(this, ServiceErrorHandling.ReturnErrors);
            if (mailboxQueries !== null) {
                searchMailboxesRequest.SearchQueries.AddRange(mailboxQueries);
            }
            searchMailboxesRequest.ResultType = resultType;
            searchMailboxesRequest.SortByProperty = sortByProperty;
            searchMailboxesRequest.SortOrder = sortOrder;
            searchMailboxesRequest.PageSize = pageSize;
            searchMailboxesRequest.PageDirection = pageDirection;
            searchMailboxesRequest.PageItemReference = pageItemReference;
            return searchMailboxesRequest.Execute();
        }
        private SearchMailboxes_2(searchParameters: SearchMailboxesParameters): ServiceResponseCollection<SearchMailboxesResponse> {
            EwsUtilities.ValidateParam(searchParameters, "searchParameters");
            EwsUtilities.ValidateParam(searchParameters.SearchQueries, "searchParameters.SearchQueries");
            var searchMailboxesRequest: SearchMailboxesRequest = this.CreateSearchMailboxesRequest(searchParameters);
            return searchMailboxesRequest.Execute();
        }
        BeginSearchMailboxes(callback: (ar: IAsyncResult) => void, state: any, searchParameters: SearchMailboxesParameters): IAsyncResult {
            EwsUtilities.ValidateParam(searchParameters, "searchParameters");
            EwsUtilities.ValidateParam(searchParameters.SearchQueries, "searchParameters.SearchQueries");
            var searchMailboxesRequest: SearchMailboxesRequest = this.CreateSearchMailboxesRequest(searchParameters);
            return searchMailboxesRequest.BeginExecute(callback, state);
        }
        EndSearchMailboxes(asyncResult: IAsyncResult): ServiceResponseCollection<SearchMailboxesResponse> {
            var searchMailboxesRequest: SearchMailboxesRequest = AsyncRequestResult.ExtractServiceRequest<SearchMailboxesRequest>(this, asyncResult);
            return searchMailboxesRequest.EndExecute(asyncResult);
        }
        SetHoldOnMailboxes(holdId: string, actionType: HoldAction, query: string, mailboxes: string[]): SetHoldOnMailboxesResponse;
        SetHoldOnMailboxes(holdId: string, actionType: HoldAction, query: string, inPlaceHoldIdentity: string): SetHoldOnMailboxesResponse;
        SetHoldOnMailboxes(holdId: string, actionType: HoldAction, query: string, inPlaceHoldIdentity: string, itemHoldPeriod: string): SetHoldOnMailboxesResponse;
        SetHoldOnMailboxes(parameters: SetHoldOnMailboxesParameters): SetHoldOnMailboxesResponse;
        SetHoldOnMailboxes(holdIdOrParameters: any, actionType?: HoldAction, query?: string, mailboxesOrInPlaceHoldIdentity?: any, itemHoldPeriod?: string): SetHoldOnMailboxesResponse {
            if (arguments.length === 4 && (holdIdOrParameters === null || holdIdOrParameters.constructor === String) && (actionType === null || actionType.constructor === Number) && (query === null || query.constructor === String) && (mailboxesOrInPlaceHoldIdentity === null || mailboxesOrInPlaceHoldIdentity instanceof Array)) {
                return this.SetHoldOnMailboxes_0(holdIdOrParameters, actionType, query, mailboxesOrInPlaceHoldIdentity);
            }
            if (arguments.length === 4 && (holdIdOrParameters === null || holdIdOrParameters.constructor === String) && (actionType === null || actionType.constructor === Number) && (query === null || query.constructor === String) && (mailboxesOrInPlaceHoldIdentity === null || mailboxesOrInPlaceHoldIdentity.constructor === String)) {
                return this.SetHoldOnMailboxes_1(holdIdOrParameters, actionType, query, mailboxesOrInPlaceHoldIdentity);
            }
            if (arguments.length === 5 && (holdIdOrParameters === null || holdIdOrParameters.constructor === String) && (actionType === null || actionType.constructor === Number) && (query === null || query.constructor === String) && (mailboxesOrInPlaceHoldIdentity === null || mailboxesOrInPlaceHoldIdentity.constructor === String) && (itemHoldPeriod === null || itemHoldPeriod.constructor === String)) {
                return this.SetHoldOnMailboxes_2(holdIdOrParameters, actionType, query, mailboxesOrInPlaceHoldIdentity, itemHoldPeriod);
            }
            return this.SetHoldOnMailboxes_3(holdIdOrParameters);
        }
        private SetHoldOnMailboxes_0(holdId: string, actionType: HoldAction, query: string, mailboxes: string[]): SetHoldOnMailboxesResponse {
            var setHoldOnMailboxesRequest: SetHoldOnMailboxesRequest = new SetHoldOnMailboxesRequest(this);
            setHoldOnMailboxesRequest.HoldId = holdId;
            setHoldOnMailboxesRequest.ActionType = actionType;
            setHoldOnMailboxesRequest.Query = query;
            setHoldOnMailboxesRequest.Mailboxes = mailboxes;
            setHoldOnMailboxesRequest.InPlaceHoldIdentity = null;
            return setHoldOnMailboxesRequest.Execute();
        }
        private SetHoldOnMailboxes_1(holdId: string, actionType: HoldAction, query: string, inPlaceHoldIdentity: string): SetHoldOnMailboxesResponse {
            return this.SetHoldOnMailboxes(holdId, actionType, query, inPlaceHoldIdentity, null);
        }
        private SetHoldOnMailboxes_2(holdId: string, actionType: HoldAction, query: string, inPlaceHoldIdentity: string, itemHoldPeriod: string): SetHoldOnMailboxesResponse {
            var setHoldOnMailboxesRequest: SetHoldOnMailboxesRequest = new SetHoldOnMailboxesRequest(this);
            setHoldOnMailboxesRequest.HoldId = holdId;
            setHoldOnMailboxesRequest.ActionType = actionType;
            setHoldOnMailboxesRequest.Query = query;
            setHoldOnMailboxesRequest.Mailboxes = null;
            setHoldOnMailboxesRequest.InPlaceHoldIdentity = inPlaceHoldIdentity;
            setHoldOnMailboxesRequest.ItemHoldPeriod = itemHoldPeriod;
            return setHoldOnMailboxesRequest.Execute();
        }
        private SetHoldOnMailboxes_3(parameters: SetHoldOnMailboxesParameters): SetHoldOnMailboxesResponse {
            EwsUtilities.ValidateParam(parameters, "parameters");
            var setHoldOnMailboxesRequest: SetHoldOnMailboxesRequest = new SetHoldOnMailboxesRequest(this);
            setHoldOnMailboxesRequest.HoldId = parameters.HoldId;
            setHoldOnMailboxesRequest.ActionType = parameters.ActionType;
            setHoldOnMailboxesRequest.Query = parameters.Query;
            setHoldOnMailboxesRequest.Mailboxes = parameters.Mailboxes;
            setHoldOnMailboxesRequest.Language = parameters.Language;
            setHoldOnMailboxesRequest.InPlaceHoldIdentity = parameters.InPlaceHoldIdentity;
            return setHoldOnMailboxesRequest.Execute();
        }
        GetHoldOnMailboxes(holdId: string): GetHoldOnMailboxesResponse {
            var getHoldOnMailboxesRequest: GetHoldOnMailboxesRequest = new GetHoldOnMailboxesRequest(this);
            getHoldOnMailboxesRequest.HoldId = holdId;
            return getHoldOnMailboxesRequest.Execute();
        }
        GetNonIndexableItemDetails(mailboxes: string[]): GetNonIndexableItemDetailsResponse;
        GetNonIndexableItemDetails(mailboxes: string[], pageSize: Nullable<number>, pageItemReference: string, pageDirection: Nullable<SearchPageDirection>): GetNonIndexableItemDetailsResponse;
        GetNonIndexableItemDetails(parameters: GetNonIndexableItemDetailsParameters): GetNonIndexableItemDetailsResponse;
        GetNonIndexableItemDetails(mailboxesOrParameters: any, pageSize?: Nullable<number>, pageItemReference?: string, pageDirection?: Nullable<SearchPageDirection>): GetNonIndexableItemDetailsResponse {
            if (arguments.length === 1 && (mailboxesOrParameters === null || mailboxesOrParameters instanceof Array)) {
                return this.GetNonIndexableItemDetails_0(mailboxesOrParameters);
            }
            if (arguments.length === 4 && (mailboxesOrParameters === null || mailboxesOrParameters instanceof Array) && (pageSize === null || pageSize instanceof Array) && (pageItemReference === null || pageItemReference.constructor === String) && (pageDirection === null || pageDirection instanceof Array)) {
                return this.GetNonIndexableItemDetails_1(mailboxesOrParameters, pageSize, pageItemReference, pageDirection);
            }
            return this.GetNonIndexableItemDetails_2(mailboxesOrParameters);
        }
        private GetNonIndexableItemDetails_0(mailboxes: string[]): GetNonIndexableItemDetailsResponse {
            return this.GetNonIndexableItemDetails(mailboxes, null, null, null);
        }
        private GetNonIndexableItemDetails_1(mailboxes: string[], pageSize: Nullable<number>, pageItemReference: string, pageDirection: Nullable<SearchPageDirection>): GetNonIndexableItemDetailsResponse {
            var getNonIndexableItemDetailsParameters: GetNonIndexableItemDetailsParameters = new GetNonIndexableItemDetailsParameters();
            getNonIndexableItemDetailsParameters.Mailboxes = mailboxes;
            getNonIndexableItemDetailsParameters.PageSize = pageSize;
            getNonIndexableItemDetailsParameters.PageItemReference = pageItemReference;
            getNonIndexableItemDetailsParameters.PageDirection = pageDirection;
            getNonIndexableItemDetailsParameters.SearchArchiveOnly = false;
            var parameters: GetNonIndexableItemDetailsParameters = getNonIndexableItemDetailsParameters;
            return this.GetNonIndexableItemDetails(parameters);
        }
        private GetNonIndexableItemDetails_2(parameters: GetNonIndexableItemDetailsParameters): GetNonIndexableItemDetailsResponse {
            var getNonIndexableItemDetailsRequest: GetNonIndexableItemDetailsRequest = this.CreateGetNonIndexableItemDetailsRequest(parameters);
            return getNonIndexableItemDetailsRequest.Execute();
        }
        BeginGetNonIndexableItemDetails(callback: (ar: IAsyncResult) => void, state: any, parameters: GetNonIndexableItemDetailsParameters): IAsyncResult {
            var getNonIndexableItemDetailsRequest: GetNonIndexableItemDetailsRequest = this.CreateGetNonIndexableItemDetailsRequest(parameters);
            return getNonIndexableItemDetailsRequest.BeginExecute(callback, state);
        }
        EndGetNonIndexableItemDetails(asyncResult: IAsyncResult): GetNonIndexableItemDetailsResponse {
            var getNonIndexableItemDetailsRequest: GetNonIndexableItemDetailsRequest = AsyncRequestResult.ExtractServiceRequest<GetNonIndexableItemDetailsRequest>(this, asyncResult);
            return <GetNonIndexableItemDetailsResponse>getNonIndexableItemDetailsRequest.EndInternalExecute(asyncResult);
        }
        GetNonIndexableItemStatistics(mailboxes: string[]): GetNonIndexableItemStatisticsResponse;
        GetNonIndexableItemStatistics(parameters: GetNonIndexableItemStatisticsParameters): GetNonIndexableItemStatisticsResponse;
        GetNonIndexableItemStatistics(mailboxesOrParameters: any): GetNonIndexableItemStatisticsResponse {
            if (arguments.length === 1 && (mailboxesOrParameters === null || mailboxesOrParameters instanceof Array)) {
                return this.GetNonIndexableItemStatistics_0(mailboxesOrParameters);
            }
            return this.GetNonIndexableItemStatistics_1(mailboxesOrParameters);
        }
        private GetNonIndexableItemStatistics_0(mailboxes: string[]): GetNonIndexableItemStatisticsResponse {
            var getNonIndexableItemStatisticsParameters: GetNonIndexableItemStatisticsParameters = new GetNonIndexableItemStatisticsParameters();
            getNonIndexableItemStatisticsParameters.Mailboxes = mailboxes;
            getNonIndexableItemStatisticsParameters.SearchArchiveOnly = false;
            var parameters: GetNonIndexableItemStatisticsParameters = getNonIndexableItemStatisticsParameters;
            return this.GetNonIndexableItemStatistics(parameters);
        }
        private GetNonIndexableItemStatistics_1(parameters: GetNonIndexableItemStatisticsParameters): GetNonIndexableItemStatisticsResponse {
            var getNonIndexableItemStatisticsRequest: GetNonIndexableItemStatisticsRequest = this.CreateGetNonIndexableItemStatisticsRequest(parameters);
            return getNonIndexableItemStatisticsRequest.Execute();
        }
        BeginGetNonIndexableItemStatistics(callback: (ar: IAsyncResult) => void, state: any, parameters: GetNonIndexableItemStatisticsParameters): IAsyncResult {
            var getNonIndexableItemStatisticsRequest: GetNonIndexableItemStatisticsRequest = this.CreateGetNonIndexableItemStatisticsRequest(parameters);
            return getNonIndexableItemStatisticsRequest.BeginExecute(callback, state);
        }
        EndGetNonIndexableItemStatistics(asyncResult: IAsyncResult): GetNonIndexableItemStatisticsResponse {
            var getNonIndexableItemStatisticsRequest: GetNonIndexableItemStatisticsRequest = AsyncRequestResult.ExtractServiceRequest<GetNonIndexableItemStatisticsRequest>(this, asyncResult);
            return <GetNonIndexableItemStatisticsResponse>getNonIndexableItemStatisticsRequest.EndInternalExecute(asyncResult);
        }
        CreateGetNonIndexableItemDetailsRequest(parameters: GetNonIndexableItemDetailsParameters): GetNonIndexableItemDetailsRequest {
            EwsUtilities.ValidateParam(parameters, "parameters");
            EwsUtilities.ValidateParam(parameters.Mailboxes, "parameters.Mailboxes");
            var getNonIndexableItemDetailsRequest: GetNonIndexableItemDetailsRequest = new GetNonIndexableItemDetailsRequest(this);
            getNonIndexableItemDetailsRequest.Mailboxes = parameters.Mailboxes;
            getNonIndexableItemDetailsRequest.PageSize = parameters.PageSize;
            getNonIndexableItemDetailsRequest.PageItemReference = parameters.PageItemReference;
            getNonIndexableItemDetailsRequest.PageDirection = parameters.PageDirection;
            getNonIndexableItemDetailsRequest.SearchArchiveOnly = parameters.SearchArchiveOnly;
            return getNonIndexableItemDetailsRequest;
        }
        CreateGetNonIndexableItemStatisticsRequest(parameters: GetNonIndexableItemStatisticsParameters): GetNonIndexableItemStatisticsRequest {
            EwsUtilities.ValidateParam(parameters, "parameters");
            EwsUtilities.ValidateParam(parameters.Mailboxes, "parameters.Mailboxes");
            var getNonIndexableItemStatisticsRequest: GetNonIndexableItemStatisticsRequest = new GetNonIndexableItemStatisticsRequest(this);
            getNonIndexableItemStatisticsRequest.Mailboxes = parameters.Mailboxes;
            getNonIndexableItemStatisticsRequest.SearchArchiveOnly = parameters.SearchArchiveOnly;
            return getNonIndexableItemStatisticsRequest;
        }
        CreateSearchMailboxesRequest(searchParameters: SearchMailboxesParameters): SearchMailboxesRequest {
            var searchMailboxesRequest: SearchMailboxesRequest = new SearchMailboxesRequest(this, ServiceErrorHandling.ReturnErrors);
            searchMailboxesRequest.SearchQueries.AddRange(NArray.ToEnumerable(searchParameters.SearchQueries));
            searchMailboxesRequest.ResultType = searchParameters.ResultType;
            searchMailboxesRequest.PreviewItemResponseShape = searchParameters.PreviewItemResponseShape;
            searchMailboxesRequest.SortByProperty = searchParameters.SortBy;
            searchMailboxesRequest.SortOrder = searchParameters.SortOrder;
            searchMailboxesRequest.Language = searchParameters.Language;
            searchMailboxesRequest.PerformDeduplication = searchParameters.PerformDeduplication;
            searchMailboxesRequest.PageSize = searchParameters.PageSize;
            searchMailboxesRequest.PageDirection = searchParameters.PageDirection;
            searchMailboxesRequest.PageItemReference = searchParameters.PageItemReference;
            return searchMailboxesRequest;
        }
        GetUserRetentionPolicyTags(): GetUserRetentionPolicyTagsResponse {
            var getUserRetentionPolicyTagsRequest: GetUserRetentionPolicyTagsRequest = new GetUserRetentionPolicyTagsRequest(this);
            return getUserRetentionPolicyTagsRequest.Execute();
        }
        DefaultAutodiscoverRedirectionUrlValidationCallback(redirectionUrl: string): boolean {
            throw new AutodiscoverLocalException(NString.Format(Strings.AutodiscoverRedirectBlocked, redirectionUrl));
        }
        AutodiscoverUrl(emailAddress: string): void;
        AutodiscoverUrl(emailAddress: string, validateRedirectionUrlCallback: (redirectionUrl: string) => boolean): void;
        AutodiscoverUrl(emailAddress: string, validateRedirectionUrlCallback?: (redirectionUrl: string) => boolean): void {
            if (arguments.length === 1 && (emailAddress === null || emailAddress.constructor === String)) {
                this.AutodiscoverUrl_0(emailAddress);
                return;
            }
            this.AutodiscoverUrl_1(emailAddress, validateRedirectionUrlCallback);
        }
        private AutodiscoverUrl_0(emailAddress: string): void {
            this.AutodiscoverUrl(emailAddress, this.DefaultAutodiscoverRedirectionUrlValidationCallback);
        }
        private AutodiscoverUrl_1(emailAddress: string, validateRedirectionUrlCallback: (redirectionUrl: string) => boolean): void {
            var autodiscoverUrl: Uri;
            if (this.RequestedServerVersion > ExchangeVersion.Exchange2007_SP1) {
                try {
                    autodiscoverUrl = this.GetAutodiscoverUrl(emailAddress, this.RequestedServerVersion, validateRedirectionUrlCallback);
                    this.Url = this.AdjustServiceUriFromCredentials(autodiscoverUrl);
                    return;
                }
                catch (ex) {
                    if (ex instanceof AutodiscoverLocalException) {
                        super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service call failed with error '{0}'. Will try legacy service", ex.Message));
                    }
                    else
                        if (ex instanceof ServiceRemoteException) {
                            if (ex2 instanceof AccountIsLockedException) {
                                throw ex;
                            }
                            super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service call failed with error '{0}'. Will try legacy service", ex2.Message));
                        }
                        else
                            throw ex;
                }
            }
            autodiscoverUrl = this.GetAutodiscoverUrl(emailAddress, ExchangeVersion.Exchange2007_SP1, validateRedirectionUrlCallback);
            this.Url = this.AdjustServiceUriFromCredentials(autodiscoverUrl);
        }
        AdjustServiceUriFromCredentials(uri: Uri): Uri {
            if (this.Credentials === null) {
                return uri;
            }
            return this.Credentials.AdjustUrl(uri);
        }
        GetAutodiscoverUrl(emailAddress: string, requestedServerVersion: ExchangeVersion, validateRedirectionUrlCallback: (redirectionUrl: string) => boolean): Uri {
            var autodiscoverService: AutodiscoverService = new AutodiscoverService(this, requestedServerVersion);
            autodiscoverService.RedirectionUrlValidationCallback = validateRedirectionUrlCallback;
            autodiscoverService.EnableScpLookup = this.EnableScpLookup;
            var autodiscoverService2: AutodiscoverService = autodiscoverService;
            var userSettings: GetUserSettingsResponse = autodiscoverService2.GetUserSettings(emailAddress, [
                UserSettingName.InternalEwsUrl, UserSettingName.ExternalEwsUrl
            ]);
            switch (userSettings.ErrorCode) {
                case AutodiscoverErrorCode.NoError:
                    return this.GetEwsUrlFromResponse(userSettings, autodiscoverService2.IsExternal.GetValueOrDefault(true));
                case AutodiscoverErrorCode.InvalidUser:
                    throw new ServiceRemoteException(NString.Format(Strings.InvalidUser, emailAddress));
                case AutodiscoverErrorCode.InvalidRequest:
                    throw new ServiceRemoteException(NString.Format(Strings.InvalidAutodiscoverRequest, userSettings.ErrorMessage));
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No EWS Url returned for user {0}, error code is {1}", emailAddress, userSettings.ErrorCode));
            throw new ServiceRemoteException(userSettings.ErrorMessage);
        }
        GetEwsUrlFromResponse(response: GetUserSettingsResponse, isExternal: boolean): Uri {
            var text: string;
            if (isExternal && (() => {
                var _p0 = [
                    text
                ];
                var _r = response.TryGetSettingValue<string>(UserSettingName.ExternalEwsUrl, _p0);
                text = _p0[0];
                return _r;
            })() && !NString.IsNullOrEmpty(text)) {
                return new Uri(text);
            }
            if (((() => {
                var _p0 = [
                    text
                ];
                var _r = response.TryGetSettingValue<string>(UserSettingName.InternalEwsUrl, _p0);
                text = _p0[0];
                return _r;
            })() || (() => {
                    var _p0 = [
                        text
                    ];
                    var _r = response.TryGetSettingValue<string>(UserSettingName.ExternalEwsUrl, _p0);
                    text = _p0[0];
                    return _r;
                })()) && !NString.IsNullOrEmpty(text)) {
                return new Uri(text);
            }
            throw new AutodiscoverLocalException(Strings.AutodiscoverDidNotReturnEwsUrl);
        }
        GetClientAccessToken(idAndTypes: IEnumerable<KeyValuePair<string, ClientAccessTokenType>>): ServiceResponseCollection<GetClientAccessTokenResponse>;
        GetClientAccessToken(tokenRequests: ClientAccessTokenRequest[]): ServiceResponseCollection<GetClientAccessTokenResponse>;
        GetClientAccessToken(idAndTypesOrTokenRequests: any): ServiceResponseCollection<GetClientAccessTokenResponse> {
            if (arguments.length === 1) {
                return this.GetClientAccessToken_0(idAndTypesOrTokenRequests);
            }
            return this.GetClientAccessToken_1(idAndTypesOrTokenRequests);
        }
        private GetClientAccessToken_0(idAndTypes: IEnumerable<KeyValuePair<string, ClientAccessTokenType>>): ServiceResponseCollection<GetClientAccessTokenResponse> {
            new GetClientAccessTokenRequest(this, ServiceErrorHandling.ReturnErrors);
            var list: List<ClientAccessTokenRequest> = new List<ClientAccessTokenRequest>();
            var enumerator: IEnumerator<KeyValuePair<string, ClientAccessTokenType>> = idAndTypes.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<string, ClientAccessTokenType> = enumerator.Current;
                    var item: ClientAccessTokenRequest = new ClientAccessTokenRequest(current.Key, current.Value);
                    list.Add(item);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return this.GetClientAccessToken(list.ToArray());
        }
        private GetClientAccessToken_1(tokenRequests: ClientAccessTokenRequest[]): ServiceResponseCollection<GetClientAccessTokenResponse> {
            var getClientAccessTokenRequest: GetClientAccessTokenRequest = new GetClientAccessTokenRequest(this, ServiceErrorHandling.ReturnErrors);
            getClientAccessTokenRequest.TokenRequests = tokenRequests;
            return getClientAccessTokenRequest.Execute();
        }
        GetAppManifests(): Collection<XmlDocument>;
        GetAppManifests(apiVersionSupported: string, schemaVersionSupported: string): Collection<XmlDocument>;
        GetAppManifests(apiVersionSupported?: string, schemaVersionSupported?: string): Collection<XmlDocument> {
            if (arguments.length === 0) {
                return this.GetAppManifests_0();
            }
            return this.GetAppManifests_1(apiVersionSupported, schemaVersionSupported);
        }
        private GetAppManifests_0(): Collection<XmlDocument> {
            var getAppManifestsRequest: GetAppManifestsRequest = new GetAppManifestsRequest(this);
            return getAppManifestsRequest.Execute().Manifests;
        }
        private GetAppManifests_1(apiVersionSupported: string, schemaVersionSupported: string): Collection<ClientApp> {
            var getAppManifestsRequest: GetAppManifestsRequest = new GetAppManifestsRequest(this);
            getAppManifestsRequest.ApiVersionSupported = apiVersionSupported;
            getAppManifestsRequest.SchemaVersionSupported = schemaVersionSupported;
            return getAppManifestsRequest.Execute().Apps;
        }
        InstallApp(manifestStream: Stream): void {
            EwsUtilities.ValidateParam(manifestStream, "manifestStream");
            var installAppRequest: InstallAppRequest = new InstallAppRequest(this, manifestStream);
            installAppRequest.Execute();
        }
        UninstallApp(id: string): void {
            EwsUtilities.ValidateParam(id, "id");
            var uninstallAppRequest: UninstallAppRequest = new UninstallAppRequest(this, id);
            uninstallAppRequest.Execute();
        }
        DisableApp(id: string, disableReason: DisableReasonType): void {
            EwsUtilities.ValidateParam(id, "id");
            EwsUtilities.ValidateParam(disableReason, "disableReason");
            var disableAppRequest: DisableAppRequest = new DisableAppRequest(this, id, disableReason);
            disableAppRequest.Execute();
        }
        GetAppMarketplaceUrl(): string;
        GetAppMarketplaceUrl(apiVersionSupported: string, schemaVersionSupported: string): string;
        GetAppMarketplaceUrl(apiVersionSupported?: string, schemaVersionSupported?: string): string {
            if (arguments.length === 0) {
                return this.GetAppMarketplaceUrl_0();
            }
            return this.GetAppMarketplaceUrl_1(apiVersionSupported, schemaVersionSupported);
        }
        private GetAppMarketplaceUrl_0(): string {
            return this.GetAppMarketplaceUrl(null, null);
        }
        private GetAppMarketplaceUrl_1(apiVersionSupported: string, schemaVersionSupported: string): string {
            var getAppMarketplaceUrlRequest: GetAppMarketplaceUrlRequest = new GetAppMarketplaceUrlRequest(this);
            getAppMarketplaceUrlRequest.ApiVersionSupported = apiVersionSupported;
            getAppMarketplaceUrlRequest.SchemaVersionSupported = schemaVersionSupported;
            return getAppMarketplaceUrlRequest.Execute().AppMarketplaceUrl;
        }
        GetClientExtension(requestedExtensionIds: StringList, shouldReturnEnabledOnly: boolean, isUserScope: boolean, userId: string, userEnabledExtensionIds: StringList, userDisabledExtensionIds: StringList, isDebug: boolean): GetClientExtensionResponse {
            var getClientExtensionRequest: GetClientExtensionRequest = new GetClientExtensionRequest(this, requestedExtensionIds, shouldReturnEnabledOnly, isUserScope, userId, userEnabledExtensionIds, userDisabledExtensionIds, isDebug);
            return getClientExtensionRequest.Execute();
        }
        GetEncryptionConfiguration(): GetEncryptionConfigurationResponse {
            var getEncryptionConfigurationRequest: GetEncryptionConfigurationRequest = new GetEncryptionConfigurationRequest(this);
            return getEncryptionConfigurationRequest.Execute();
        }
        SetEncryptionConfiguration(imageBase64: string, emailText: string, portalText: string, disclaimerText: string): void {
            var setEncryptionConfigurationRequest: SetEncryptionConfigurationRequest = new SetEncryptionConfigurationRequest(this, imageBase64, emailText, portalText, disclaimerText);
            setEncryptionConfigurationRequest.Execute();
        }
        SetClientExtension(actions: List<SetClientExtensionAction>): void {
            var setClientExtensionRequest: SetClientExtensionRequest = new SetClientExtensionRequest(this, actions);
            setClientExtensionRequest.Execute();
        }
        ExecuteDiagnosticMethod(verb: string, parameter: XmlNode): XmlDocument {
            var executeDiagnosticMethodRequest: ExecuteDiagnosticMethodRequest = new ExecuteDiagnosticMethodRequest(this);
            executeDiagnosticMethodRequest.Verb = verb;
            executeDiagnosticMethodRequest.Parameter = parameter;
            return executeDiagnosticMethodRequest.Execute().get_Item(0).ReturnValue;
        }
        Validate(): void {
            super.Validate();
            if (Uri.op_Equality(this.Url, null)) {
                throw new ServiceLocalException(Strings.ServiceUrlMustBeSet);
            }
            if (this.PrivilegedUserId !== null && this.ImpersonatedUserId !== null) {
                throw new ServiceLocalException(Strings.CannotSetBothImpersonatedAndPrivilegedUser);
            }
        }
        static ValidateTargetVersion(version: string): void {
            if (NString.IsNullOrEmpty(version)) {
                throw new ArgumentException("Target version must not be empty.");
            }
            var array: string[] = NString.Trim(version).Split([
                59
            ]/*';'*/);
            switch (array.length) {
                case 1:
                    break;
                case 2:
                    {
                        var text: string = NString.Trim(array[1]);
                        var array2: string[] = text.Split([
                            61
                        ]/*'='*/);
                        if (array2.length !== 2 || !(NString.Trim(array2[0]) === "minimum") || !ExchangeService.IsMajorMinor(NString.Trim(array2[1]))) {
                            throw new ArgumentException("Target version must match X.Y or Exchange20XX.");
                        }
                        break;
                    }
                default:
                    throw new ArgumentException("Target version should have the form.");
            }
            var versionPart: string = NString.Trim(array[0]);
            if (NString.StartsWith(array[0], "Exchange20")) {
                return;
            }
            if (ExchangeService.IsMajorMinor(versionPart)) {
                return;
            }
            throw new ArgumentException("Target version must match X.Y or Exchange20XX.");
        }
        static IsMajorMinor(versionPart: string): boolean {
            var array: string[] = versionPart.Split([
                46
            ]/*'.'*/);
            if (array.length !== 2) {
                return false;
            }
            var array2: string[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var text: string = array2[i];
                var text2: string = text;
                for (var j: number = 0; j < text2.length; j = j + 1) {
                    var c: number = text2.charCodeAt(j);
                    if (!NChar.IsDigit(c)) {
                        return false;
                    }
                }
            }
            return true;
        }
        constructor();
        constructor(timeZone: TimeZoneInfo);
        constructor(requestedServerVersion: ExchangeVersion);
        constructor(requestedServerVersion: ExchangeVersion, timeZone: TimeZoneInfo);
        constructor(targetServerVersion: string);
        constructor(targetServerVersion: string, timeZone: TimeZoneInfo);
        constructor(timeZoneOrRequestedServerVersionOrTargetServerVersion?: any, timeZone?: TimeZoneInfo) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (timeZoneOrRequestedServerVersionOrTargetServerVersion === null || timeZoneOrRequestedServerVersionOrTargetServerVersion instanceof TimeZoneInfo)) {
                this.constructor_1(timeZoneOrRequestedServerVersionOrTargetServerVersion);
                return;
            }
            if (arguments.length === 1 && (timeZoneOrRequestedServerVersionOrTargetServerVersion === null || timeZoneOrRequestedServerVersionOrTargetServerVersion.constructor === Number)) {
                this.constructor_2(timeZoneOrRequestedServerVersionOrTargetServerVersion);
                return;
            }
            if (arguments.length === 2 && (timeZoneOrRequestedServerVersionOrTargetServerVersion === null || timeZoneOrRequestedServerVersionOrTargetServerVersion.constructor === Number) && (timeZone === null || timeZone instanceof TimeZoneInfo)) {
                this.constructor_3(timeZoneOrRequestedServerVersionOrTargetServerVersion, timeZone);
                return;
            }
            if (arguments.length === 1 && (timeZoneOrRequestedServerVersionOrTargetServerVersion === null || timeZoneOrRequestedServerVersionOrTargetServerVersion.constructor === String)) {
                this.constructor_4(timeZoneOrRequestedServerVersionOrTargetServerVersion);
                return;
            }
            this.constructor_5(timeZoneOrRequestedServerVersionOrTargetServerVersion, timeZone);
        }
        private constructor_0(): void {
        }
        private constructor_1(timeZone: TimeZoneInfo): void {
        }
        private constructor_2(requestedServerVersion: ExchangeVersion): void {
        }
        private constructor_3(requestedServerVersion: ExchangeVersion, timeZone: TimeZoneInfo): void {
        }
        private constructor_4(targetServerVersion: string): void {
            ExchangeService.ValidateTargetVersion(targetServerVersion);
            this.TargetServerVersion = targetServerVersion;
        }
        private constructor_5(targetServerVersion: string, timeZone: TimeZoneInfo): void {
            ExchangeService.ValidateTargetVersion(targetServerVersion);
            this.TargetServerVersion = targetServerVersion;
        }
        PrepareHttpWebRequest(methodName: string): IEwsHttpWebRequest {
            var uri: Uri = this.Url;
            if (this.RenderingMethod === ExchangeService_RenderingMode.JSON) {
                uri = new Uri(uri, NString.Format("{0}/{1}{2}", uri.AbsolutePath, methodName, uri.Query));
            }
            else {
                uri = this.AdjustServiceUriFromCredentials(uri);
            }
            var ewsHttpWebRequest: IEwsHttpWebRequest = super.PrepareHttpWebRequestForUrl(uri, this.AcceptGzipEncoding, true);
            if (!NString.IsNullOrEmpty(this.TargetServerVersion)) {
                ewsHttpWebRequest.Headers.Set("X-EWS-TargetVersion", this.TargetServerVersion);
            }
            return ewsHttpWebRequest;
        }
        SetContentType(request: IEwsHttpWebRequest): void {
            if (this.renderingMode === ExchangeService_RenderingMode.Xml) {
                request.ContentType = "text/xml; charset=utf-8";
                request.Accept = "text/xml";
                return;
            }
            if (this.renderingMode === ExchangeService_RenderingMode.JSON) {
                request.ContentType = "application/json; charset=utf-8";
                request.Accept = "application/json";
                return;
            }
            super.SetContentType(request);
        }
        ProcessHttpErrorResponse(httpWebResponse: IEwsHttpWebResponse, webException: WebException): void {
            super.InternalProcessHttpErrorResponse(httpWebResponse, webException, TraceFlags.EwsResponseHttpHeaders, TraceFlags.EwsResponse);
        }
    }
    enum ExchangeService_RenderingMode {
        Xml,
        JSON
    }
    class JsonNames {
        static Events: string = "Events";
        static NotificationType: string = "NotificationType";
        static OldFolderId: string = "OldFolderId";
        static OldItemId: string = "OldItemId";
        static PathToExtendedFieldType: string = "ExtendedPropertyUri";
        static PathToIndexedFieldType: string = "DictionaryPropertyUri";
        static PathToUnindexedFieldType: string = "PropertyUri";
        static Path: string = "Path";
        static RecurrencePattern: string = "RecurrencePattern";
        static RecurrenceRange: string = "RecurrenceRange";
        constructor() {
            super();
        }
    }
    class JsonObject extends Dictionary<string, any>
    {
        private static TypeAttribute: string = "__type";
        private static JsonTypeNamespace: string = "Exchange";
        static JsonValueString: string = "Value";
        private static ValidateObject(entry: any): void {
            if (entry !== null && !(entry instanceof JsonObject) && !(entry instanceof Enum) && !(entry.constructor === Boolean) && !(entry.constructor === String) && !(entry.constructor === Number) && !(entry.constructor === Number) && !(entry.constructor === Number) && !(entry.constructor === Number) && !(entry instanceof DateTime) && !entry.GetType().IsArray) {
                throw new InvalidOperationException(NString.Format("Object [{0}] in the array is not serializable to JSON", entry));
            }
        }
        constructor() {
            super();
        }
        Add(name: string, value: JsonObject): void;
        Add(name: string, value: string): void;
        Add(name: string, value: Enum): void;
        Add(name: string, value: boolean): void;
        Add(name: string, value: number): void;
        Add(name: string, value: number): void;
        Add(name: string, value: number): void;
        Add(name: string, value: number): void;
        Add(name: string, value: any): void;
        Add(name: string, value: IEnumerable<any>): void;
        Add(name: string, value: any): void {
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value instanceof JsonObject)) {
                this.Add_0(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === String)) {
                this.Add_1(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value instanceof Enum)) {
                this.Add_2(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Boolean)) {
                this.Add_3(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Number)) {
                this.Add_4(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Number)) {
                this.Add_5(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Number)) {
                this.Add_6(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Number)) {
                this.Add_7(name, value);
                return;
            }
            if (arguments.length === 2 && (name === null || name.constructor === String) && (value === null || value.constructor === Object)) {
                this.Add_8(name, value);
                return;
            }
            this.Add_9(name, value);
        }
        private Add_0(name: string, value: JsonObject): void {
            this.InternalAdd(name, value);
        }
        private Add_1(name: string, value: string): void {
            if (value !== null) {
                this.InternalAdd(name, value);
            }
        }
        private Add_2(name: string, value: Enum): void {
            if (value !== null) {
                this.InternalAdd(name, value.ToString());
            }
        }
        private Add_3(name: string, value: boolean): void {
            this.InternalAdd(name, value);
        }
        private Add_4(name: string, value: number): void {
            this.InternalAdd(name, value);
        }
        private Add_5(name: string, value: number): void {
            this.InternalAdd(name, value);
        }
        private Add_6(name: string, value: number): void {
            this.InternalAdd(name, value);
        }
        private Add_7(name: string, value: number): void {
            this.InternalAdd(name, value);
        }
        private Add_8(name: string, value: any): void {
            JsonObject.ValidateObject(value);
            this.InternalAdd(name, value);
        }
        private InternalAdd(name: string, value: any): void {
            super.Add(name, value);
        }
        AddTypeParameter(typeName: string): void {
            this.InternalAdd("__type", NString.Format("{0}:#{1}", typeName, "Exchange"));
        }
        private Add_9(name: string, value: IEnumerable<any>): void {
            var array: any[] = Enumerable.ToArray<any>(value);
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var entry: any = array2[i];
                JsonObject.ValidateObject(entry);
            }
            this.InternalAdd(name, array);
        }
        AddBase64(key: string, stream: Stream): void;
        AddBase64(key: string, buffer: number[]): void;
        AddBase64(key: string, buffer: number[], offset: number, count: number): void;
        AddBase64(key: string, streamOrBuffer: any, offset?: number, count?: number): void {
            if (arguments.length === 2 && (key === null || key.constructor === String) && (streamOrBuffer === null || streamOrBuffer instanceof Stream)) {
                this.AddBase64_0(key, streamOrBuffer);
                return;
            }
            if (arguments.length === 2 && (key === null || key.constructor === String) && (streamOrBuffer === null || streamOrBuffer instanceof Array)) {
                this.AddBase64_1(key, streamOrBuffer);
                return;
            }
            this.AddBase64_2(key, streamOrBuffer, offset, count);
        }
        private AddBase64_0(key: string, stream: Stream): void {
            var memoryStream: MemoryStream = new MemoryStream();
            try {
                var array: number[] = new Array<number>(4096);
                for (var _ai: number = 0; _ai < array.length; ++_ai)
                    array[_ai] = 0;
                var count: number;
                while ((count = stream.Read(array, 0, array.length)) !== 0) {
                    memoryStream.Write(array, 0, count);
                }
                this.AddBase64(key, memoryStream.GetBuffer(), 0, <number>memoryStream.Length);
            }
            finally {
                if (memoryStream !== null) {
                    (<IDisposable>memoryStream).Dispose();
                }
            }
        }
        private AddBase64_1(key: string, buffer: number[]): void {
            this.AddBase64(key, buffer, 0, buffer.length);
        }
        private AddBase64_2(key: string, buffer: number[], offset: number, count: number): void {
            this.InternalAdd(key, Convert.ToBase64String(buffer, offset, count));
        }
        SerializeToJson(stream: Stream): void;
        SerializeToJson(stream: Stream, prettyPrint: boolean): void;
        SerializeToJson(stream: Stream, prettyPrint?: boolean): void {
            if (arguments.length === 1 && (stream === null || stream instanceof Stream)) {
                this.SerializeToJson_0(stream);
                return;
            }
            this.SerializeToJson_1(stream, prettyPrint);
        }
        private SerializeToJson_0(stream: Stream): void {
            this.SerializeToJson(stream, false);
        }
        private SerializeToJson_1(stream: Stream, prettyPrint: boolean): void {
            var jsonWriter: JsonWriter = new JsonWriter(stream, prettyPrint);
            try {
                this.WriteValue(jsonWriter, this);
                jsonWriter.Flush();
            }
            finally {
                if (jsonWriter !== null) {
                    (<IDisposable>jsonWriter).Dispose();
                }
            }
        }
        private WriteKeyValuePair(writer: JsonWriter, key: string, value: any): void {
            writer.WriteKey(key);
            this.WriteValue(writer, value);
        }
        private WriteValue(writer: JsonWriter, value: any): void {
            if (value === null) {
                writer.WriteNullValue();
                return;
            }
            if (value.constructor === String) {
                writer.WriteValue(<string>value);
                return;
            }
            if (value.GetType().IsEnum) {
                writer.WriteValue(<Enum>value);
                return;
            }
            if (value.constructor === Number) {
                writer.WriteValue(<number>value);
                return;
            }
            if (value.constructor === Number) {
                writer.WriteValue(<number>value);
                return;
            }
            if (value.constructor === Number) {
                writer.WriteValue(<number>value);
                return;
            }
            if (value.constructor === Number) {
                writer.WriteValue(<number>value);
                return;
            }
            if (value.constructor === Boolean) {
                writer.WriteValue(<boolean>value);
                return;
            }
            if (value instanceof DateTime) {
                writer.WriteValue(<DateTime>value);
                return;
            }
            if (value instanceof JsonObject) {
                writer.PushObjectClosure();
                var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
                if (jsonObject.ContainsKey("__type")) {
                    this.WriteKeyValuePair(writer, "__type", jsonObject.get_Item("__type"));
                }
                var enumerator: Dictionary_Enumerator<string, any> = jsonObject.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: KeyValuePair<string, any> = enumerator.Current;
                        if (current.Key !== "__type") {
                            this.WriteKeyValuePair(writer, current.Key, current.Value);
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                writer.PopClosure();
                return;
            }
            if (value.GetType().IsArray) {
                writer.PushArrayClosure();
                var enumerator2: IEnumerator = (<Array>value).GetEnumerator();
                try {
                    while (enumerator2.MoveNext()) {
                        var current2: any = enumerator2.Current;
                        this.WriteValue(writer, current2);
                    }
                }
                finally {
                    var disposable: IDisposable = ((enumerator2 instanceof IDisposable) ? <IDisposable>enumerator2 : null);
                    if (disposable !== null) {
                        disposable.Dispose();
                    }
                }
                writer.PopClosure();
                return;
            }
            throw new InvalidOperationException(NString.Format("Object [{0}] is not JSON serializable", value));
        }
        ReadAsInt(key: string): number {
            if (!super.ContainsKey(key)) {
                throw new ServiceJsonDeserializationException();
            }
            var obj: any = super.get_Item(key);
            if (!(obj.constructor === Number)) {
                throw new ServiceJsonDeserializationException();
            }
            return <number>(<number>obj);
        }
        ReadAsDouble(key: string): number {
            if (!super.ContainsKey(key)) {
                throw new ServiceJsonDeserializationException();
            }
            var obj: any = super.get_Item(key);
            if (!(obj.constructor === Number)) {
                throw new ServiceJsonDeserializationException();
            }
            return <number>(<number>obj);
        }
        ReadAsString(key: string): string {
            if (!super.ContainsKey(key)) {
                throw new ServiceJsonDeserializationException();
            }
            var obj: any = super.get_Item(key);
            if (obj !== null && !(obj.constructor === String)) {
                throw new ServiceJsonDeserializationException();
            }
            return ((obj instanceof string) ? <string>obj : null);
        }
        ReadAsJsonObject(key: string): JsonObject {
            if (!super.ContainsKey(key)) {
                throw new ServiceJsonDeserializationException();
            }
            var obj: any = super.get_Item(key);
            if (obj !== null && !(obj instanceof JsonObject)) {
                throw new ServiceJsonDeserializationException();
            }
            return ((obj instanceof JsonObject) ? <JsonObject>obj : null);
        }
        ReadAsArray(key: string): any[] {
            if (!super.ContainsKey(key)) {
                return new Array<any>(0);
            }
            var obj: any = super.get_Item(key);
            if (obj !== null && !(obj instanceof any[])) {
                throw new ServiceJsonDeserializationException();
            }
            return ((obj instanceof any[]) ? <any[]>obj : null);
        }
        HasTypeProperty(): boolean {
            return super.ContainsKey("__type");
        }
        ReadTypeString(): string {
            if (!this.HasTypeProperty()) {
                throw new ServiceJsonDeserializationException();
            }
            var text: string = this.ReadAsString("__type");
            return NString.Substring(text, 0, NString.IndexOf(text, NString.Format(":#{0}", "Exchange")));
        }
        ReadEnumValue<T>(key: string): T {
            return EwsUtilities.Parse<T>(this.ReadAsString(key));
        }
        ReadAsBool(key: string): boolean {
            if (!super.ContainsKey(key)) {
                throw new ServiceJsonDeserializationException();
            }
            var obj: any = super.get_Item(key);
            if (!(obj.constructor === Boolean)) {
                throw new ServiceJsonDeserializationException();
            }
            return <boolean>obj;
        }
        ReadAsBase64Content(key: string, stream: Stream): void;
        ReadAsBase64Content(key: string): void;
        ReadAsBase64Content(key: string, stream?: Stream): void {
            if (arguments.length === 2 && (key === null || key.constructor === String) && (stream === null || stream instanceof Stream)) {
                this.ReadAsBase64Content_0(key, stream);
                return;
            }
            this.ReadAsBase64Content_1(key);
        }
        private ReadAsBase64Content_0(key: string, stream: Stream): void {
            var array: number[] = this.ReadAsBase64Content(key);
            stream.Write(array, 0, array.length);
        }
        private ReadAsBase64Content_1(key: string): number[] {
            var s: string = this.ReadAsString(key);
            return Convert.FromBase64String(s);
        }
    }
    class JsonParser {
        private tokenizer: JsonTokenizer = null;
        constructor(inputStream: Stream) {
            super();
            this.tokenizer = new JsonTokenizer(inputStream);
        }
        Parse(): JsonObject {
            return this.ParseObject();
        }
        private ParseObject(): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            var text: string;
            (() => {
                var _p0 = [
                    text
                ];
                var _r = this.ReadAndValidateToken(_p0, [
                    JsonTokenType.ObjectOpen
                ]);
                text = _p0[0];
                return _r;
            })();
            while (this.tokenizer.Peek() !== JsonTokenType.ObjectClose) {
                this.ParseKeyValuePair(jsonObject);
                if (this.tokenizer.Peek() !== JsonTokenType.Comma) {
                    break;
                }
                (() => {
                    var _p0 = [
                        text
                    ];
                    var _r = this.ReadAndValidateToken(_p0, [
                        JsonTokenType.Comma
                    ]);
                    text = _p0[0];
                    return _r;
                })();
            }
            (() => {
                var _p0 = [
                    text
                ];
                var _r = this.ReadAndValidateToken(_p0, [
                    JsonTokenType.ObjectClose
                ]);
                text = _p0[0];
                return _r;
            })();
            return jsonObject;
        }
        private ParseKeyValuePair(jsonObject: JsonObject): void {
            var expectedTokenTypes: JsonTokenType[] = new Array<JsonTokenType>(1);
            for (var _ai: number = 0; _ai < expectedTokenTypes.length; ++_ai)
                expectedTokenTypes[_ai] = 0;
            var text: string;
            (() => {
                var _p0 = [
                    text
                ];
                var _r = this.ReadAndValidateToken(_p0, expectedTokenTypes);
                text = _p0[0];
                return _r;
            })();
            var text2: string;
            (() => {
                var _p0 = [
                    text2
                ];
                var _r = this.ReadAndValidateToken(_p0, [
                    JsonTokenType.Colon
                ]);
                text2 = _p0[0];
                return _r;
            })();
            text = this.UnescapeString(text);
            jsonObject.Add(text, this.ParseValue());
        }
        private ParseValue(): any {
            switch (this.tokenizer.Peek()) {
                case JsonTokenType.String:
                    {
                        var expectedTokenTypes: JsonTokenType[] = new Array<JsonTokenType>(1);
                        for (var _ai: number = 0; _ai < expectedTokenTypes.length; ++_ai)
                            expectedTokenTypes[_ai] = 0;
                        var text: string;
                        (() => {
                            var _p0 = [
                                text
                            ];
                            var _r = this.ReadAndValidateToken(_p0, expectedTokenTypes);
                            text = _p0[0];
                            return _r;
                        })();
                        return this.UnescapeString(text);
                    }
                case JsonTokenType.Number:
                    {
                        var text: string;
                        (() => {
                            var _p0 = [
                                text
                            ];
                            var _r = this.ReadAndValidateToken(_p0, [
                                JsonTokenType.Number
                            ]);
                            text = _p0[0];
                            return _r;
                        })();
                        return this.ParseNumber(text);
                    }
                case JsonTokenType.Boolean:
                    {
                        var text: string;
                        (() => {
                            var _p0 = [
                                text
                            ];
                            var _r = this.ReadAndValidateToken(_p0, [
                                JsonTokenType.Boolean
                            ]);
                            text = _p0[0];
                            return _r;
                        })();
                        return NBoolean.Parse(text);
                    }
                case JsonTokenType.Null:
                    {
                        var text: string;
                        (() => {
                            var _p0 = [
                                text
                            ];
                            var _r = this.ReadAndValidateToken(_p0, [
                                JsonTokenType.Null
                            ]);
                            text = _p0[0];
                            return _r;
                        })();
                        return null;
                    }
                case JsonTokenType.ObjectOpen:
                    return this.ParseObject();
                case JsonTokenType.ArrayOpen:
                    return this.ParseArray();
            }
            throw new ServiceJsonDeserializationException();
        }
        private ParseNumber(valueToken: string): any {
            if (Regex.IsMatch(valueToken, "^-?\\d+$")) {
                return NNumber.Parse(valueToken, CultureInfo.InvariantCulture);
            }
            return NNumber.Parse(valueToken, CultureInfo.InvariantCulture);
        }
        private ParseArray(): any[] {
            var list: List<any> = new List<any>();
            var text: string;
            (() => {
                var _p0 = [
                    text
                ];
                var _r = this.ReadAndValidateToken(_p0, [
                    JsonTokenType.ArrayOpen
                ]);
                text = _p0[0];
                return _r;
            })();
            while (this.tokenizer.Peek() !== JsonTokenType.ArrayClose) {
                list.Add(this.ParseValue());
                if (this.tokenizer.Peek() !== JsonTokenType.Comma) {
                    break;
                }
                (() => {
                    var _p0 = [
                        text
                    ];
                    var _r = this.ReadAndValidateToken(_p0, [
                        JsonTokenType.Comma
                    ]);
                    text = _p0[0];
                    return _r;
                })();
            }
            (() => {
                var _p0 = [
                    text
                ];
                var _r = this.ReadAndValidateToken(_p0, [
                    JsonTokenType.ArrayClose
                ]);
                text = _p0[0];
                return _r;
            })();
            return list.ToArray();
        }
        private UnescapeString(value: string): string {
            var text: string = NString.Substring(value, 1, value.length - 2);
            if (Enumerable.Contains<number>(text, 92)/*'\'*/) {
                if (NString.Contains(text, "\\\\")) {
                    text = NString.Replace(text, "\\\\", "\\");
                }
                if (NString.Contains(text, "\\\"")) {
                    text = NString.Replace(text, "\\\"", "\"");
                }
                if (NString.Contains(text, "\\/")) {
                    text = NString.Replace(text, "\\/", "/");
                }
                if (NString.Contains(text, "\\b")) {
                    text = NString.Replace(text, "\\b", "\b");
                }
                if (NString.Contains(text, "\\f")) {
                    text = NString.Replace(text, "\\f", "\f");
                }
                if (NString.Contains(text, "\\n")) {
                    text = NString.Replace(text, "\\n", "\n");
                }
                if (NString.Contains(text, "\\r")) {
                    text = NString.Replace(text, "\\r", "\r");
                }
                if (NString.Contains(text, "\\t")) {
                    text = NString.Replace(text, "\\t", "\t");
                }
                if (NString.Contains(text, "\\u")) {
                    var matchCollection: MatchCollection = Regex.Matches(text, "\\\\u([\\da-fA-F]{4})");
                    var enumerator: IEnumerator = matchCollection.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var match: Match = <Match>enumerator.Current;
                            if (match.Success) {
                                var utf: number = NNumber.Parse(NString.Substring(match.Value, 2), NumberStyles.HexNumber);
                                var newValue: string = NChar.ConvertFromUtf32(utf);
                                text = NString.Replace(text, match.Value, newValue);
                            }
                        }
                    }
                    finally {
                        var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                        if (disposable !== null) {
                            disposable.Dispose();
                        }
                    }
                }
            }
            return text;
        }
        private ReadAndValidateToken(token: string[], expectedTokenTypes: JsonTokenType[]): JsonTokenType {
            var jsonTokenType: JsonTokenType = (() => {
                var _p0 = [
                    token[0]
                ];
                var _r = this.tokenizer.NextToken(_p0);
                token[0] = _p0[0];
                return _r;
            })();
            for (var i: number = 0; i < expectedTokenTypes.length; i = i + 1) {
                var jsonTokenType2: JsonTokenType = expectedTokenTypes[i];
                if (jsonTokenType === jsonTokenType2) {
                    return jsonTokenType;
                }
            }
            throw new ServiceJsonDeserializationException();
        }
    }
    enum JsonTokenType {
        String,
        Number,
        Boolean,
        Null,
        ObjectOpen,
        ObjectClose,
        ArrayOpen,
        ArrayClose,
        Colon,
        Comma,
        EndOfFile
    }
    class JsonTokenizer {
        private static JsonStringRegExCode: string = "\"([^\\\\\"]|\\\\\"|\\\\\\\\|\\\\/|\\\\b|\\\\f|\\\\n|\\\\r|\\\\t|\\\\u[\\da-fA-F]{4})*\"";
        private static JsonNumberRegExCode: string = "-?\\d+(.\\d+)?([eE][+-]?\\d+)?";
        private static JsonBooleanRegExCode: string = "(true|false)";
        private static JsonNullRegExCode: string = "null";
        private static JsonOpenObjectRegExCode: string = "\\{";
        private static JsonCloseObjectRegExCode: string = "\\}";
        private static JsonOpenArrayRegExCode: string = "\\[";
        private static JsonCloseArrayRegExCode: string = "\\]";
        private static JsonColonRegExCode: string = "\\:";
        private static JsonCommaRegExCode: string = "\\,";
        private static jsonStringRegEx: Regex = null;
        private static jsonNumberRegEx: Regex = null;
        private static jsonBooleanRegEx: Regex = null;
        private static jsonNullRegEx: Regex = null;
        private static jsonOpenObjectRegEx: Regex = null;
        private static jsonCloseObjectRegEx: Regex = null;
        private static jsonOpenArrayRegEx: Regex = null;
        private static jsonCloseArrayRegEx: Regex = null;
        private static jsonColonRegEx: Regex = null;
        private static jsonCommaRegEx: Regex = null;
        private static whitespaceRegEx: Regex = null;
        private static tokenDictionary: Dictionary<JsonTokenType, Regex> = null;
        private static fullTokenizerRegex: Regex = null;
        private currentMatch: Match = null;
        private nextTokenType: JsonTokenType = 0;
        private nextToken: string = null;
        private nextTokenPeeked: boolean = false;
        static JsonTokenizer_cctor(): void {
            JsonTokenizer.jsonStringRegEx = new Regex("\"([^\\\\\"]|\\\\\"|\\\\\\\\|\\\\/|\\\\b|\\\\f|\\\\n|\\\\r|\\\\t|\\\\u[\\da-fA-F]{4})*\"", RegexOptions.Compiled);
            JsonTokenizer.jsonNumberRegEx = new Regex("-?\\d+(.\\d+)?([eE][+-]?\\d+)?", RegexOptions.Compiled);
            JsonTokenizer.jsonBooleanRegEx = new Regex("(true|false)", RegexOptions.Compiled);
            JsonTokenizer.jsonNullRegEx = new Regex("null", RegexOptions.Compiled);
            JsonTokenizer.jsonOpenObjectRegEx = new Regex("\\{", RegexOptions.Compiled);
            JsonTokenizer.jsonCloseObjectRegEx = new Regex("\\}", RegexOptions.Compiled);
            JsonTokenizer.jsonOpenArrayRegEx = new Regex("\\[", RegexOptions.Compiled);
            JsonTokenizer.jsonCloseArrayRegEx = new Regex("\\]", RegexOptions.Compiled);
            JsonTokenizer.jsonColonRegEx = new Regex("\\:", RegexOptions.Compiled);
            JsonTokenizer.jsonCommaRegEx = new Regex("\\,", RegexOptions.Compiled);
            JsonTokenizer.whitespaceRegEx = new Regex("\\s");
            JsonTokenizer.tokenDictionary = new Dictionary<JsonTokenType, Regex>();
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.Number, JsonTokenizer.jsonNumberRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.Boolean, JsonTokenizer.jsonBooleanRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.Null, JsonTokenizer.jsonNullRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.ObjectOpen, JsonTokenizer.jsonOpenObjectRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.ObjectClose, JsonTokenizer.jsonCloseObjectRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.ArrayOpen, JsonTokenizer.jsonOpenArrayRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.ArrayClose, JsonTokenizer.jsonCloseArrayRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.Colon, JsonTokenizer.jsonColonRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.Comma, JsonTokenizer.jsonCommaRegEx);
            JsonTokenizer.tokenDictionary.Add(JsonTokenType.String, JsonTokenizer.jsonStringRegEx);
            var stringBuilder: StringBuilder = new StringBuilder();
            var flag: boolean = true;
            var enumerator: Dictionary_ValueCollection_Enumerator<JsonTokenType, Regex> = JsonTokenizer.tokenDictionary.Values.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Regex = enumerator.Current;
                    if (flag) {
                        flag = false;
                    }
                    else {
                        stringBuilder.Append("|");
                    }
                    stringBuilder.Append("(");
                    stringBuilder.Append(current.ToString());
                    stringBuilder.Append(")");
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            JsonTokenizer.fullTokenizerRegex = new Regex(stringBuilder.ToString(), RegexOptions.Compiled);
        }
        constructor(input: Stream) {
            super();
            var streamReader: StreamReader = new StreamReader(input);
            var input2: string = streamReader.ReadToEnd();
            this.currentMatch = JsonTokenizer.fullTokenizerRegex.Match(input2);
        }
        Peek(): JsonTokenType {
            if (!this.nextTokenPeeked) {
                this.nextTokenType = (() => {
                    var _p0 = [
                        this.nextToken
                    ];
                    var _r = this.NextToken(_p0);
                    this.nextToken = _p0[0];
                    return _r;
                })();
                this.nextTokenPeeked = true;
            }
            return this.nextTokenType;
        }
        NextToken(token: string[]): JsonTokenType {
            if (this.nextTokenPeeked) {
                token[0] = this.nextToken;
                this.nextTokenPeeked = false;
                return this.nextTokenType;
            }
            token[0] = this.currentMatch.Value;
            while (token[0].Trim().length === 0) {
                this.AdvanceRegExMatch();
                token[0] = this.currentMatch.Value;
            }
            var enumerator: Dictionary_Enumerator<JsonTokenType, Regex> = JsonTokenizer.tokenDictionary.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<JsonTokenType, Regex> = enumerator.Current;
                    var match: Match = current.Value.Match(token[0]);
                    if (match.Success && match.Index === 0 && match.Length === token[0].length) {
                        this.AdvanceRegExMatch();
                        return current.Key;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            throw new ServiceJsonDeserializationException();
        }
        private AdvanceRegExMatch(): void {
            this.currentMatch = this.currentMatch.NextMatch();
        }
    }
    class JsonWriter extends TextWriter {
        private static Indentation: string = "  ";
        private outStream: Stream = null;
        private shouldCloseStream: boolean = false;
        private prettyPrint: boolean = false;
        private writingStringValue: boolean = false;
        private smallBuffer: number[] = new Array<number>(10);
        private singleCharBuffer: number[] = new Array<number>(1);
        private closures: Stack<number> = new Stack<number>();
        private closureHasMembers: Stack<boolean> = new Stack<boolean>();
        get Encoding(): Encoding {
            return Encoding.UTF8;
        }
        set ShouldCloseStream(value: boolean) {
            this.shouldCloseStream = value;
        }
        get ShouldCloseStream(): boolean {
            return this.shouldCloseStream;
        }
        constructor(outStream: Stream, prettyPrint: boolean) {
            super();
            this.outStream = outStream;
            this.prettyPrint = prettyPrint;
            this.shouldCloseStream = false;
        }
        Dispose(disposing: boolean): void {
            if (this.shouldCloseStream) {
                this.outStream.Flush();
                this.outStream.Dispose();
            }
            super.Dispose(disposing);
        }
        Write(value: number): void {
            if (value === 13/*'\r'*/ && this.writingStringValue) {
                this.WriteInternal(92)/*'\'*/;
                this.WriteInternal(114)/*'r'*/;
                return;
            }
            if (value === 10/*'\n'*/ && this.writingStringValue) {
                this.WriteInternal(92)/*'\'*/;
                this.WriteInternal(110)/*'n'*/;
                return;
            }
            if (value === 9/*'\t'*/ && this.writingStringValue) {
                this.WriteInternal(92)/*'\'*/;
                this.WriteInternal(116)/*'t'*/;
                return;
            }
            if (value === 34/*'"'*/ || value === 92/*'\'*/) {
                this.WriteInternal(92)/*'\'*/;
            }
            this.WriteInternal(value);
        }
        PushObjectClosure(): void {
            this.AddingValue();
            this.closures.Push(125)/*'}'*/;
            this.closureHasMembers.Push(false);
            this.WriteInternal(123)/*'{'*/;
            this.WriteIndentation();
        }
        PushArrayClosure(): void {
            this.AddingValue();
            this.closures.Push(93)/*']'*/;
            this.closureHasMembers.Push(false);
            this.WriteInternal(91)/*'['*/;
            this.WriteIndentation();
        }
        PopClosure(): void {
            var value: number = this.closures.Pop();
            this.closureHasMembers.Pop();
            this.WriteIndentation();
            this.WriteInternal(value);
        }
        WriteQuote(): void {
            this.WriteInternal(34)/*'"'*/;
        }
        WriteKey(key: string): void {
            if (this.closureHasMembers.Peek()) {
                this.WriteInternal(44)/*','*/;
                this.WriteIndentation();
            }
            this.WriteQuote();
            this.Write(key);
            this.WriteQuote();
            if (this.prettyPrint) {
                this.Write(" : ");
                return;
            }
            this.WriteInternal(58)/*':'*/;
        }
        WriteValue(value: string): void;
        WriteValue(value: boolean): void;
        WriteValue(value: number): void;
        WriteValue(value: number): void;
        WriteValue(value: Enum): void;
        WriteValue(value: DateTime): void;
        WriteValue(value: number): void;
        WriteValue(value: number): void;
        WriteValue(value: any): void {
            if (arguments.length === 1 && (value === null || value.constructor === String)) {
                this.WriteValue_0(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value.constructor === Boolean)) {
                this.WriteValue_1(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value.constructor === Number)) {
                this.WriteValue_2(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value.constructor === Number)) {
                this.WriteValue_3(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value instanceof Enum)) {
                this.WriteValue_4(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value instanceof DateTime)) {
                this.WriteValue_5(value);
                return;
            }
            if (arguments.length === 1 && (value === null || value.constructor === Number)) {
                this.WriteValue_6(value);
                return;
            }
            this.WriteValue_7(value);
        }
        private WriteValue_0(value: string): void {
            this.AddingValue();
            this.WriteQuote();
            this.writingStringValue = true;
            this.Write(value);
            this.writingStringValue = false;
            this.WriteQuote();
        }
        private WriteValue_1(value: boolean): void {
            this.AddingValue();
            this.Write(NString.ToLowerInvariant(NBoolean.ToString(value)));
        }
        private WriteValue_2(value: number): void {
            this.AddingValue();
            this.Write(value);
        }
        private WriteValue_3(value: number): void {
            this.AddingValue();
            this.Write(value);
        }
        private WriteValue_4(value: Enum): void {
            this.WriteValue(EwsUtilities.SerializeEnum(value));
        }
        private WriteValue_5(value: DateTime): void {
            this.WriteValue(EwsUtilities.DateTimeToXSDateTime(value));
        }
        private WriteValue_6(value: number): void {
            this.AddingValue();
            this.Write(value);
        }
        private WriteValue_7(value: number): void {
            this.AddingValue();
            this.Write(value);
        }
        WriteNullValue(): void {
            this.AddingValue();
            this.Write("null");
        }
        private WriteInternal(value: number): void {
            this.singleCharBuffer[0] = value;
            var bytes: number = this.Encoding.GetBytes(this.singleCharBuffer, 0, 1, this.smallBuffer, 0);
            this.outStream.Write(this.smallBuffer, 0, bytes);
        }
        private WriteIndentation(): void {
            if (this.prettyPrint) {
                this.WriteInternal(13)/*'\r'*/;
                this.WriteInternal(10)/*'\n'*/;
                for (var i: number = this.closures.Count - 1; i >= 0; i = i - 1) {
                    this.Write("  ");
                }
            }
        }
        private AddingValue(): void {
            if (this.closures.Count > 0) {
                if (this.closures.Peek() === 93/*']'*/ && this.closureHasMembers.Peek()) {
                    this.WriteInternal(44)/*','*/;
                    this.WriteIndentation();
                }
                if (!this.closureHasMembers.Peek()) {
                    this.closureHasMembers.Pop();
                    this.closureHasMembers.Push(true);
                }
            }
        }
    }
    class PropertyBag {
        private owner: ServiceObject = null;
        private isDirty: boolean = false;
        private loading: boolean = false;
        private onlySummaryPropertiesRequested: boolean = false;
        private loadedProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private properties: Dictionary<PropertyDefinition, any> = new Dictionary<PropertyDefinition, any>();
        private deletedProperties: Dictionary<PropertyDefinition, any> = new Dictionary<PropertyDefinition, any>();
        private modifiedProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private addedProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private requestedPropertySet: PropertySet = null;
        get Properties(): Dictionary<PropertyDefinition, any> {
            return this.properties;
        }
        get Owner(): ServiceObject {
            return this.owner;
        }
        get IsDirty(): boolean {
            var num: number = this.modifiedProperties.Count + this.deletedProperties.Count + this.addedProperties.Count;
            return num > 0 || this.isDirty;
        }
        get_Item(propertyDefinition: PropertyDefinition): any {
            var ex: ServiceLocalException;
            var propertyValueOrException: any = (() => {
                var _p0 = [
                    ex
                ];
                var _r = this.GetPropertyValueOrException(propertyDefinition, _p0);
                ex = _p0[0];
                return _r;
            })();
            if (ex === null) {
                return propertyValueOrException;
            }
            throw ex;
        }
        set_Item(propertyDefinition: PropertyDefinition, value: any): void {
            if (propertyDefinition.Version > this.Owner.Service.RequestedServerVersion) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, propertyDefinition.Name, propertyDefinition.Version));
            }
            if (!this.loading) {
                if (this.Owner.IsNew && !propertyDefinition.HasFlag(PropertyDefinitionFlags.CanSet, new Nullable<ExchangeVersion>(this.Owner.Service.RequestedServerVersion))) {
                    throw new ServiceObjectPropertyException(Strings.PropertyIsReadOnly, propertyDefinition);
                }
                if (!this.Owner.IsNew) {
                    var item: Item = ((this.Owner instanceof Item) ? <Item>this.Owner : null);
                    if (item !== null && item.IsAttachment) {
                        throw new ServiceObjectPropertyException(Strings.ItemAttachmentCannotBeUpdated, propertyDefinition);
                    }
                    if (value === null && !propertyDefinition.HasFlag(PropertyDefinitionFlags.CanDelete)) {
                        throw new ServiceObjectPropertyException(Strings.PropertyCannotBeDeleted, propertyDefinition);
                    }
                    if (!propertyDefinition.HasFlag(PropertyDefinitionFlags.CanUpdate)) {
                        throw new ServiceObjectPropertyException(Strings.PropertyCannotBeUpdated, propertyDefinition);
                    }
                }
            }
            if (value === null) {
                this.DeleteProperty(propertyDefinition);
                return;
            }
            var obj: any;
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = this.properties.TryGetValue(propertyDefinition, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                var complexProperty: ComplexProperty = ((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null);
                if (complexProperty !== null) {
                    complexProperty.OnChange.Remove(this.PropertyChanged);
                }
            }
            if (this.deletedProperties.Remove(propertyDefinition)) {
                PropertyBag.AddToChangeList(propertyDefinition, this.modifiedProperties);
            }
            else {
                if (!this.properties.ContainsKey(propertyDefinition)) {
                    PropertyBag.AddToChangeList(propertyDefinition, this.addedProperties);
                }
                else {
                    if (!this.modifiedProperties.Contains(propertyDefinition)) {
                        PropertyBag.AddToChangeList(propertyDefinition, this.modifiedProperties);
                    }
                }
            }
            this.InitComplexProperty(((value instanceof ComplexProperty) ? <ComplexProperty>value : null));
            this.properties.set_Item(propertyDefinition, value);
            this.Changed();
        }
        constructor(owner: ServiceObject) {
            super();
            EwsUtilities.Assert(owner !== null, "PropertyBag.ctor", "owner is null");
            this.owner = owner;
        }
        static AddToChangeList(propertyDefinition: PropertyDefinition, changeList: List<PropertyDefinition>): void {
            if (!changeList.Contains(propertyDefinition)) {
                changeList.Add(propertyDefinition);
            }
        }
        static CreateJsonSetUpdate(propertyDefinition: PropertyDefinition, service: ExchangeService, serviceObject: ServiceObject, propertyBag: PropertyBag): JsonObject;
        static CreateJsonSetUpdate(value: ExtendedProperty, service: ExchangeService, serviceObject: ServiceObject): JsonObject;
        static CreateJsonSetUpdate(propertyDefinitionOrValue: any, service: ExchangeService, serviceObject: ServiceObject, propertyBag?: PropertyBag): JsonObject {
            if (arguments.length === 4 && (propertyDefinitionOrValue === null || propertyDefinitionOrValue instanceof PropertyDefinition) && (service === null || service instanceof ExchangeService) && (serviceObject === null || serviceObject instanceof ServiceObject) && (propertyBag === null || propertyBag instanceof PropertyBag)) {
                return PropertyBag.CreateJsonSetUpdate_0(propertyDefinitionOrValue, service, serviceObject, propertyBag);
            }
            return PropertyBag.CreateJsonSetUpdate_1(propertyDefinitionOrValue, service, serviceObject);
        }
        private static CreateJsonSetUpdate_0(propertyDefinition: PropertyDefinition, service: ExchangeService, serviceObject: ServiceObject, propertyBag: PropertyBag): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(serviceObject.GetSetFieldXmlElementName());
            jsonObject.Add("Path", (<IJsonSerializable>propertyDefinition).ToJson(service));
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.AddTypeParameter(serviceObject.GetXmlElementName());
            propertyDefinition.WriteJsonValue(jsonObject2, propertyBag, service, true);
            jsonObject.Add(PropertyBag.GetPropertyUpdateItemName(serviceObject), jsonObject2);
            return jsonObject;
        }
        private static CreateJsonSetUpdate_1(value: ExtendedProperty, service: ExchangeService, serviceObject: ServiceObject): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(serviceObject.GetSetFieldXmlElementName());
            jsonObject.Add("Path", (<IJsonSerializable>value.PropertyDefinition).ToJson(service));
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.AddTypeParameter(serviceObject.GetXmlElementName());
            jsonObject2.Add("ExtendedProperty", NArray.ToEnumerable([
                value.InternalToJson(service)
            ]));
            jsonObject.Add(PropertyBag.GetPropertyUpdateItemName(serviceObject), jsonObject2);
            return jsonObject;
        }
        static CreateJsonDeleteUpdate(propertyDefinition: PropertyDefinitionBase, service: ExchangeService, serviceObject: ServiceObject): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(serviceObject.GetDeleteFieldXmlElementName());
            jsonObject.Add("PropertyPath", (<IJsonSerializable>propertyDefinition).ToJson(service));
            return jsonObject;
        }
        static GetPropertyUpdateItemName(serviceObject: ServiceObject): string {
            if (!(serviceObject instanceof Folder)) {
                return "Item";
            }
            return "Folder";
        }
        IsPropertyLoaded(propertyDefinition: PropertyDefinition): boolean {
            return this.loadedProperties.Contains(propertyDefinition) || this.IsRequestedProperty(propertyDefinition);
        }
        private IsRequestedProperty(propertyDefinition: PropertyDefinition): boolean {
            if (this.requestedPropertySet === null) {
                return false;
            }
            if (this.requestedPropertySet.BasePropertySet === BasePropertySet.FirstClassProperties) {
                var list: List<PropertyDefinition> = this.onlySummaryPropertiesRequested ? this.Owner.Schema.FirstClassSummaryProperties : this.Owner.Schema.FirstClassProperties;
                return list.Contains(propertyDefinition) || this.requestedPropertySet.Contains(propertyDefinition);
            }
            return this.requestedPropertySet.Contains(propertyDefinition);
        }
        IsPropertyUpdated(propertyDefinition: PropertyDefinition): boolean {
            return this.modifiedProperties.Contains(propertyDefinition) || this.addedProperties.Contains(propertyDefinition);
        }
        TryGetProperty(propertyDefinition: PropertyDefinition, propertyValue: any[]): boolean;
        TryGetProperty(propertyDefinition: PropertyDefinition, propertyValue: T[]): boolean;
        TryGetProperty(propertyDefinition: PropertyDefinition, propertyValue: any): boolean {
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinition) && (propertyValue === null || propertyValue instanceof Array)) {
                return this.TryGetProperty_0(propertyDefinition, propertyValue);
            }
            return this.TryGetProperty_1(propertyDefinition, propertyValue);
        }
        private TryGetProperty_0(propertyDefinition: PropertyDefinition, propertyValue: any[]): boolean {
            var ex: ServiceLocalException;
            propertyValue[0] = (() => {
                var _p0 = [
                    ex
                ];
                var _r = this.GetPropertyValueOrException(propertyDefinition, _p0);
                ex = _p0[0];
                return _r;
            })();
            return ex === null;
        }
        private TryGetProperty_1<T>(propertyDefinition: PropertyDefinition, propertyValue: T[]): boolean {
            if (!new Type("T").IsAssignableFrom(propertyDefinition.Type)) {
                var message: string = NString.Format(Strings.PropertyDefinitionTypeMismatch, EwsUtilities.GetPrintableTypeName(propertyDefinition.Type), EwsUtilities.GetPrintableTypeName(new Type("T")));
                throw new ArgumentException(message, "propertyDefinition");
            }
            var obj: any;
            var flag: boolean = (() => {
                var _p0 = [
                    obj
                ];
                var _r = this.TryGetProperty(propertyDefinition, _p0);
                obj = _p0[0];
                return _r;
            })();
            propertyValue[0] = (flag ? (<T>(<any>obj)) : null);
            return flag;
        }
        private GetPropertyValueOrException(propertyDefinition: PropertyDefinition, exception: ServiceLocalException[]): any {
            var obj: any = null;
            exception[0] = null;
            if (propertyDefinition.Version > this.Owner.Service.RequestedServerVersion) {
                exception[0] = new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, propertyDefinition.Name, propertyDefinition.Version));
                return null;
            }
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = this.TryGetValue(propertyDefinition, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                return obj;
            }
            if (propertyDefinition.HasFlag(PropertyDefinitionFlags.AutoInstantiateOnRead)) {
                var complexPropertyDefinitionBase: ComplexPropertyDefinitionBase = ((propertyDefinition instanceof ComplexPropertyDefinitionBase) ? <ComplexPropertyDefinitionBase>propertyDefinition : null);
                EwsUtilities.Assert(complexPropertyDefinitionBase !== null, "PropertyBag.get_this[]", "propertyDefinition is marked with AutoInstantiateOnRead but is not a descendant of ComplexPropertyDefinitionBase");
                obj = complexPropertyDefinitionBase.CreatePropertyInstance(this.Owner);
                if (obj !== null) {
                    this.InitComplexProperty(((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null));
                    this.properties.set_Item(propertyDefinition, obj);
                }
            }
            else {
                if (propertyDefinition !== this.Owner.GetIdPropertyDefinition()) {
                    if (!this.IsPropertyLoaded(propertyDefinition)) {
                        exception[0] = new ServiceObjectPropertyException(Strings.MustLoadOrAssignPropertyBeforeAccess, propertyDefinition);
                        return null;
                    }
                    if (!propertyDefinition.IsNullable) {
                        var message: string = this.IsRequestedProperty(propertyDefinition) ? Strings.ValuePropertyNotLoaded : Strings.ValuePropertyNotAssigned;
                        exception[0] = new ServiceObjectPropertyException(message, propertyDefinition);
                    }
                }
            }
            return obj;
        }
        Changed(): void {
            this.isDirty = true;
            this.Owner.Changed();
        }
        Contains(propertyDefinition: PropertyDefinition): boolean {
            return this.properties.ContainsKey(propertyDefinition);
        }
        TryGetValue(propertyDefinition: PropertyDefinition, propertyValue: any[]): boolean {
            return (() => {
                var _p0 = [
                    propertyValue[0]
                ];
                var _r = this.properties.TryGetValue(propertyDefinition, _p0);
                propertyValue[0] = _p0[0];
                return _r;
            })();
        }
        PropertyChanged(complexProperty: ComplexProperty): void {
            var enumerator: Dictionary_Enumerator<PropertyDefinition, any> = this.properties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<PropertyDefinition, any> = enumerator.Current;
                    if (current.Value === complexProperty && !this.deletedProperties.ContainsKey(current.Key)) {
                        PropertyBag.AddToChangeList(current.Key, this.modifiedProperties);
                        this.Changed();
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        DeleteProperty(propertyDefinition: PropertyDefinition): void {
            if (!this.deletedProperties.ContainsKey(propertyDefinition)) {
                var obj: any;
                (() => {
                    var _p0 = [
                        obj
                    ];
                    var _r = this.properties.TryGetValue(propertyDefinition, _p0);
                    obj = _p0[0];
                    return _r;
                })();
                this.properties.Remove(propertyDefinition);
                this.modifiedProperties.Remove(propertyDefinition);
                this.deletedProperties.Add(propertyDefinition, obj);
                var complexProperty: ComplexProperty = ((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null);
                if (complexProperty !== null) {
                    complexProperty.OnChange.Remove(this.PropertyChanged);
                }
            }
        }
        Clear(): void {
            this.ClearChangeLog();
            this.properties.Clear();
            this.loadedProperties.Clear();
            this.requestedPropertySet = null;
        }
        ClearChangeLog(): void {
            this.deletedProperties.Clear();
            this.modifiedProperties.Clear();
            this.addedProperties.Clear();
            var enumerator: Dictionary_Enumerator<PropertyDefinition, any> = this.properties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<PropertyDefinition, any> = enumerator.Current;
                    var complexProperty: ComplexProperty = ((current.Value instanceof ComplexProperty) ? <ComplexProperty>current.Value : null);
                    if (complexProperty !== null) {
                        complexProperty.ClearChangeLog();
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            this.isDirty = false;
        }
        LoadFromXml(reader: EwsServiceXmlReader, clear: boolean, requestedPropertySet: PropertySet, onlySummaryPropertiesRequested: boolean): void {
            if (clear) {
                this.Clear();
            }
            this.loading = true;
            this.requestedPropertySet = requestedPropertySet;
            this.onlySummaryPropertiesRequested = onlySummaryPropertiesRequested;
            try {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var propertyDefinition: PropertyDefinition;
                        if ((() => {
                            var _p0 = [
                                propertyDefinition
                            ];
                            var _r = this.Owner.Schema.TryGetPropertyDefinition(reader.LocalName, _p0);
                            propertyDefinition = _p0[0];
                            return _r;
                        })()) {
                            propertyDefinition.LoadPropertyValueFromXml(reader, this);
                            this.loadedProperties.Add(propertyDefinition);
                        }
                        else {
                            reader.SkipCurrentElement();
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, this.Owner.GetXmlElementName()));
                this.ClearChangeLog();
            }
            finally {
                this.loading = false;
            }
        }
        LoadFromJson(jsonServiceObject: JsonObject, service: ExchangeService, clear: boolean, requestedPropertySet: PropertySet, onlySummaryPropertiesRequested: boolean): void {
            if (clear) {
                this.Clear();
            }
            this.loading = true;
            this.requestedPropertySet = requestedPropertySet;
            this.onlySummaryPropertiesRequested = onlySummaryPropertiesRequested;
            try {
                var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonServiceObject.Keys.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: string = enumerator.Current;
                        var propertyDefinition: PropertyDefinition;
                        if ((() => {
                            var _p0 = [
                                propertyDefinition
                            ];
                            var _r = this.Owner.Schema.TryGetPropertyDefinition(current, _p0);
                            propertyDefinition = _p0[0];
                            return _r;
                        })()) {
                            propertyDefinition.LoadPropertyValueFromJson(jsonServiceObject.get_Item(current), service, this);
                            this.loadedProperties.Add(propertyDefinition);
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                this.ClearChangeLog();
            }
            finally {
                this.loading = false;
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.Owner.GetXmlElementName());
            var enumerator: IEnumerator<PropertyDefinition> = this.Owner.Schema.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    if (current.HasFlag(PropertyDefinitionFlags.CanSet, new Nullable<ExchangeVersion>(writer.Service.RequestedServerVersion)) && this.Contains(current)) {
                        current.WritePropertyValueToXml(writer, this, false);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService, isUpdateOperation: boolean): any {
            var jsonObject: JsonObject = new JsonObject();
            if (!isUpdateOperation) {
                this.ToJsonForCreate(service, jsonObject);
            }
            else {
                this.ToJsonForUpdate(service, jsonObject);
            }
            return jsonObject;
        }
        private ToJsonForUpdate(service: ExchangeService, jsonObject: JsonObject): void {
            jsonObject.AddTypeParameter(this.Owner.GetChangeXmlElementName());
            jsonObject.Add(this.Owner.GetId().GetJsonTypeName(), this.Owner.GetId().InternalToJson(service));
            var list: List<JsonObject> = new List<JsonObject>();
            var enumerator: List_Enumerator<PropertyDefinition> = this.addedProperties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    this.WriteSetUpdateToJson(list, current, service);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<PropertyDefinition> = this.modifiedProperties.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: PropertyDefinition = enumerator2.Current;
                    this.WriteSetUpdateToJson(list, current2, service);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            var enumerator3: Dictionary_Enumerator<PropertyDefinition, any> = this.deletedProperties.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: KeyValuePair<PropertyDefinition, any> = enumerator3.Current;
                    this.WriteDeleteUpdateToJson(list, current3.Key, current3.Value, service);
                }
            }
            finally {
                (<IDisposable>enumerator3).Dispose();
            }
            jsonObject.Add("Updates", NArray.ToEnumerable(list.ToArray()));
        }
        private ToJsonForCreate(service: ExchangeService, jsonObject: JsonObject): void {
            jsonObject.AddTypeParameter(this.Owner.GetXmlElementName());
            var enumerator: IEnumerator<PropertyDefinition> = this.Owner.Schema.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    if (current.HasFlag(PropertyDefinitionFlags.CanSet, new Nullable<ExchangeVersion>(service.RequestedServerVersion)) && this.Contains(current)) {
                        current.WriteJsonValue(jsonObject, this, service, false);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        WriteToXmlForUpdate(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.Owner.GetChangeXmlElementName());
            this.Owner.GetId().WriteToXml(writer);
            writer.WriteStartElement(XmlNamespace.Types, "Updates");
            var enumerator: List_Enumerator<PropertyDefinition> = this.addedProperties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    this.WriteSetUpdateToXml(writer, current);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<PropertyDefinition> = this.modifiedProperties.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: PropertyDefinition = enumerator2.Current;
                    this.WriteSetUpdateToXml(writer, current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            var enumerator3: Dictionary_Enumerator<PropertyDefinition, any> = this.deletedProperties.GetEnumerator();
            try {
                while (enumerator3.MoveNext()) {
                    var current3: KeyValuePair<PropertyDefinition, any> = enumerator3.Current;
                    this.WriteDeleteUpdateToXml(writer, current3.Key, current3.Value);
                }
            }
            finally {
                (<IDisposable>enumerator3).Dispose();
            }
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
        GetIsUpdateCallNecessary(): boolean {
            var list: List<PropertyDefinition> = new List<PropertyDefinition>();
            list.AddRange(this.addedProperties);
            list.AddRange(this.modifiedProperties);
            list.AddRange(this.deletedProperties.Keys);
            var enumerator: List_Enumerator<PropertyDefinition> = list.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    if (current.HasFlag(PropertyDefinitionFlags.CanUpdate)) {
                        return true;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return false;
        }
        private InitComplexProperty(complexProperty: ComplexProperty): void {
            if (complexProperty !== null) {
                complexProperty.OnChange.Add(this.PropertyChanged);
                var ownedProperty: IOwnedProperty = ((complexProperty instanceof IOwnedProperty) ? <IOwnedProperty>complexProperty : null);
                if (ownedProperty !== null) {
                    ownedProperty.Owner = this.Owner;
                }
            }
        }
        private WriteSetUpdateToXml(writer: EwsServiceXmlWriter, propertyDefinition: PropertyDefinition): void {
            if (propertyDefinition.HasFlag(PropertyDefinitionFlags.CanUpdate)) {
                var obj: any = this.get_Item(propertyDefinition);
                var flag: boolean = false;
                var customUpdateSerializer: ICustomUpdateSerializer = ((obj instanceof ICustomUpdateSerializer) ? <ICustomUpdateSerializer>obj : null);
                if (customUpdateSerializer !== null) {
                    flag = customUpdateSerializer.WriteSetUpdateToXml(writer, this.Owner, propertyDefinition);
                }
                if (!flag) {
                    writer.WriteStartElement(XmlNamespace.Types, this.Owner.GetSetFieldXmlElementName());
                    propertyDefinition.WriteToXml(writer);
                    writer.WriteStartElement(XmlNamespace.Types, this.Owner.GetXmlElementName());
                    propertyDefinition.WritePropertyValueToXml(writer, this, true);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
        }
        private WriteSetUpdateToJson(jsonUpdates: List<JsonObject>, propertyDefinition: PropertyDefinition, service: ExchangeService): void {
            if (propertyDefinition.HasFlag(PropertyDefinitionFlags.CanUpdate)) {
                var obj: any = this.get_Item(propertyDefinition);
                var flag: boolean = false;
                var customUpdateSerializer: ICustomUpdateSerializer = ((obj instanceof ICustomUpdateSerializer) ? <ICustomUpdateSerializer>obj : null);
                if (customUpdateSerializer !== null) {
                    flag = customUpdateSerializer.WriteSetUpdateToJson(service, this.Owner, propertyDefinition, jsonUpdates);
                }
                if (!flag) {
                    var item: JsonObject = PropertyBag.CreateJsonSetUpdate(propertyDefinition, service, this.Owner, this);
                    jsonUpdates.Add(item);
                }
            }
        }
        private WriteDeleteUpdateToXml(writer: EwsServiceXmlWriter, propertyDefinition: PropertyDefinition, propertyValue: any): void {
            if (propertyDefinition.HasFlag(PropertyDefinitionFlags.CanDelete)) {
                var flag: boolean = false;
                var customUpdateSerializer: ICustomUpdateSerializer = ((propertyValue instanceof ICustomUpdateSerializer) ? <ICustomUpdateSerializer>propertyValue : null);
                if (customUpdateSerializer !== null) {
                    flag = customUpdateSerializer.WriteDeleteUpdateToXml(writer, this.Owner);
                }
                if (!flag) {
                    writer.WriteStartElement(XmlNamespace.Types, this.Owner.GetDeleteFieldXmlElementName());
                    propertyDefinition.WriteToXml(writer);
                    writer.WriteEndElement();
                }
            }
        }
        private WriteDeleteUpdateToJson(jsonUpdates: List<JsonObject>, propertyDefinition: PropertyDefinition, propertyValue: any, service: ExchangeService): void {
            if (propertyDefinition.HasFlag(PropertyDefinitionFlags.CanDelete)) {
                var flag: boolean = false;
                var customUpdateSerializer: ICustomUpdateSerializer = ((propertyValue instanceof ICustomUpdateSerializer) ? <ICustomUpdateSerializer>propertyValue : null);
                if (customUpdateSerializer !== null) {
                    flag = customUpdateSerializer.WriteDeleteUpdateToJson(service, this.Owner, jsonUpdates);
                }
                if (!flag) {
                    var item: JsonObject = PropertyBag.CreateJsonDeleteUpdate(propertyDefinition, service, this.Owner);
                    jsonUpdates.Add(item);
                }
            }
        }
        Validate(): void {
            var enumerator: List_Enumerator<PropertyDefinition> = this.addedProperties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinition = enumerator.Current;
                    this.ValidatePropertyValue(current);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<PropertyDefinition> = this.modifiedProperties.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: PropertyDefinition = enumerator2.Current;
                    this.ValidatePropertyValue(current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
        }
        private ValidatePropertyValue(propertyDefinition: PropertyDefinition): void {
            var obj: any;
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = this.TryGetProperty(propertyDefinition, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                var selfValidate: ISelfValidate = ((obj instanceof ISelfValidate) ? <ISelfValidate>obj : null);
                if (selfValidate !== null) {
                    selfValidate.Validate();
                }
            }
        }
    }
    class PropertySet implements ISelfValidate, IEnumerable<PropertyDefinitionBase>
    {
        static IdOnly: PropertySet = PropertySet.CreateReadonlyPropertySet(BasePropertySet.IdOnly);
        static FirstClassProperties: PropertySet = PropertySet.CreateReadonlyPropertySet(BasePropertySet.FirstClassProperties);
        private static defaultPropertySetMap: LazyMember<Dictionary<BasePropertySet, string>> = new LazyMember<Dictionary<BasePropertySet, string>>(() => {
            var dictionary: Dictionary<BasePropertySet, string> = new Dictionary<BasePropertySet, string>();
            dictionary.Add(BasePropertySet.IdOnly, "IdOnly");
            dictionary.Add(BasePropertySet.FirstClassProperties, "AllProperties");
            return dictionary;
        });
        private basePropertySet: BasePropertySet = 0;
        private additionalProperties: List<PropertyDefinitionBase> = new List<PropertyDefinitionBase>();
        private requestedBodyType: Nullable<BodyType> = null;
        private requestedUniqueBodyType: Nullable<BodyType> = null;
        private requestedNormalizedBodyType: Nullable<BodyType> = null;
        private filterHtml: Nullable<boolean> = null;
        private convertHtmlCodePageToUTF8: Nullable<boolean> = null;
        private inlineImageUrlTemplate: string = null;
        private blockExternalImages: Nullable<boolean> = null;
        private addTargetToLinks: Nullable<boolean> = null;
        private isReadOnly: boolean = false;
        private maximumBodySize: Nullable<number> = null;
        set BasePropertySet(value: BasePropertySet) {
            this.ThrowIfReadonly();
            this.basePropertySet = value;
        }
        get BasePropertySet(): BasePropertySet {
            return this.basePropertySet;
        }
        set RequestedBodyType(value: Nullable<BodyType>) {
            this.ThrowIfReadonly();
            this.requestedBodyType = value;
        }
        get RequestedBodyType(): Nullable<BodyType> {
            return this.requestedBodyType;
        }
        set RequestedUniqueBodyType(value: Nullable<BodyType>) {
            this.ThrowIfReadonly();
            this.requestedUniqueBodyType = value;
        }
        get RequestedUniqueBodyType(): Nullable<BodyType> {
            return this.requestedUniqueBodyType;
        }
        set RequestedNormalizedBodyType(value: Nullable<BodyType>) {
            this.ThrowIfReadonly();
            this.requestedNormalizedBodyType = value;
        }
        get RequestedNormalizedBodyType(): Nullable<BodyType> {
            return this.requestedNormalizedBodyType;
        }
        get Count(): number {
            return this.additionalProperties.Count;
        }
        set FilterHtmlContent(value: Nullable<boolean>) {
            this.ThrowIfReadonly();
            this.filterHtml = value;
        }
        get FilterHtmlContent(): Nullable<boolean> {
            return this.filterHtml;
        }
        set ConvertHtmlCodePageToUTF8(value: Nullable<boolean>) {
            this.ThrowIfReadonly();
            this.convertHtmlCodePageToUTF8 = value;
        }
        get ConvertHtmlCodePageToUTF8(): Nullable<boolean> {
            return this.convertHtmlCodePageToUTF8;
        }
        set InlineImageUrlTemplate(value: string) {
            this.ThrowIfReadonly();
            this.inlineImageUrlTemplate = value;
        }
        get InlineImageUrlTemplate(): string {
            return this.inlineImageUrlTemplate;
        }
        set BlockExternalImages(value: Nullable<boolean>) {
            this.ThrowIfReadonly();
            this.blockExternalImages = value;
        }
        get BlockExternalImages(): Nullable<boolean> {
            return this.blockExternalImages;
        }
        set AddBlankTargetToLinks(value: Nullable<boolean>) {
            this.ThrowIfReadonly();
            this.addTargetToLinks = value;
        }
        get AddBlankTargetToLinks(): Nullable<boolean> {
            return this.addTargetToLinks;
        }
        set MaximumBodySize(value: Nullable<number>) {
            this.ThrowIfReadonly();
            this.maximumBodySize = value;
        }
        get MaximumBodySize(): Nullable<number> {
            return this.maximumBodySize;
        }
        get_Item(index: number): PropertyDefinitionBase {
            return this.additionalProperties.get_Item(index);
        }
        static get DefaultPropertySetMap(): LazyMember<Dictionary<BasePropertySet, string>> {
            return PropertySet.defaultPropertySetMap;
        }
        constructor(basePropertySet: BasePropertySet, additionalProperties: PropertyDefinitionBase[]);
        constructor(basePropertySet: BasePropertySet, additionalProperties: IEnumerable<PropertyDefinitionBase>);
        constructor();
        constructor(basePropertySet: BasePropertySet);
        constructor(additionalProperties: PropertyDefinitionBase[]);
        constructor(additionalProperties: IEnumerable<PropertyDefinitionBase>);
        constructor(basePropertySetOrAdditionalProperties?: any, additionalProperties?: any) {
            super();
            if (arguments.length === 2 && (basePropertySetOrAdditionalProperties === null || basePropertySetOrAdditionalProperties.constructor === Number) && (additionalProperties === null || additionalProperties instanceof Array)) {
                this.constructor_0(basePropertySetOrAdditionalProperties, additionalProperties);
                return;
            }
            if (arguments.length === 2 && (basePropertySetOrAdditionalProperties === null || basePropertySetOrAdditionalProperties.constructor === Number)) {
                this.constructor_1(basePropertySetOrAdditionalProperties, additionalProperties);
                return;
            }
            if (arguments.length === 0) {
                this.constructor_2();
                return;
            }
            if (arguments.length === 1 && (basePropertySetOrAdditionalProperties === null || basePropertySetOrAdditionalProperties.constructor === Number)) {
                this.constructor_3(basePropertySetOrAdditionalProperties);
                return;
            }
            if (arguments.length === 1 && (basePropertySetOrAdditionalProperties === null || basePropertySetOrAdditionalProperties instanceof Array)) {
                this.constructor_4(basePropertySetOrAdditionalProperties);
                return;
            }
            this.constructor_5(basePropertySetOrAdditionalProperties);
        }
        private constructor_0(basePropertySet: BasePropertySet, additionalProperties: PropertyDefinitionBase[]): void {
            this.constructor_1(basePropertySet, <IEnumerable<PropertyDefinitionBase>>additionalProperties);
        }
        private constructor_1(basePropertySet: BasePropertySet, additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            this.basePropertySet = basePropertySet;
            if (additionalProperties !== null) {
                this.additionalProperties.AddRange(additionalProperties);
            }
        }
        private constructor_2(): void {
            this.constructor_0(BasePropertySet.IdOnly, null);
        }
        private constructor_3(basePropertySet: BasePropertySet): void {
            this.constructor_0(basePropertySet, null);
        }
        private constructor_4(additionalProperties: PropertyDefinitionBase[]): void {
            this.constructor_0(BasePropertySet.IdOnly, additionalProperties);
        }
        private constructor_5(additionalProperties: IEnumerable<PropertyDefinitionBase>): void {
            this.constructor_1(BasePropertySet.IdOnly, additionalProperties);
        }
        static op_Implicit(basePropertySet: BasePropertySet): PropertySet {
            return new PropertySet(basePropertySet);
        }
        Add(property: PropertyDefinitionBase): void {
            this.ThrowIfReadonly();
            EwsUtilities.ValidateParam(property, "property");
            if (!this.additionalProperties.Contains(property)) {
                this.additionalProperties.Add(property);
            }
        }
        AddRange(properties: IEnumerable<PropertyDefinitionBase>): void {
            this.ThrowIfReadonly();
            EwsUtilities.ValidateParamCollection(properties, "properties");
            var enumerator: IEnumerator<PropertyDefinitionBase> = properties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinitionBase = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        Clear(): void {
            this.ThrowIfReadonly();
            this.additionalProperties.Clear();
        }
        private static CreateReadonlyPropertySet(basePropertySet: BasePropertySet): PropertySet {
            var propertySet: PropertySet = new PropertySet(basePropertySet);
            propertySet.isReadOnly = true;
            return propertySet;
        }
        private static GetShapeName(serviceObjectType: ServiceObjectType): string {
            switch (serviceObjectType) {
                case ServiceObjectType.Folder:
                    return "FolderShape";
                case ServiceObjectType.Item:
                    return "ItemShape";
                case ServiceObjectType.Conversation:
                    return "ConversationShape";
                default:
                    EwsUtilities.Assert(false, "PropertySet.GetShapeName", NString.Format("An unexpected object type {0} for property shape. This code path should never be reached.", serviceObjectType));
                    return NString.Empty;
            }
        }
        private ThrowIfReadonly(): void {
            if (this.isReadOnly) {
                throw new NotSupportedException(Strings.PropertySetCannotBeModified);
            }
        }
        Contains(property: PropertyDefinitionBase): boolean {
            return this.additionalProperties.Contains(property);
        }
        Remove(property: PropertyDefinitionBase): boolean {
            this.ThrowIfReadonly();
            return this.additionalProperties.Remove(property);
        }
        Validate(): void {
            this.InternalValidate();
        }
        static WriteAdditionalPropertiesToXml(writer: EwsServiceXmlWriter, propertyDefinitions: IEnumerable<PropertyDefinitionBase>): void {
            writer.WriteStartElement(XmlNamespace.Types, "AdditionalProperties");
            var enumerator: IEnumerator<PropertyDefinitionBase> = propertyDefinitions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinitionBase = enumerator.Current;
                    current.WriteToXml(writer);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
        }
        static WriteAdditionalPropertiesToJson(jsonItemShape: JsonObject, service: ExchangeService, propertyDefinitions: IEnumerable<PropertyDefinitionBase>): void {
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<PropertyDefinitionBase> = propertyDefinitions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinitionBase = enumerator.Current;
                    list.Add((<IJsonSerializable>current).ToJson(service));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            jsonItemShape.Add("AdditionalProperties", NArray.ToEnumerable(list.ToArray()));
        }
        InternalValidate(): void {
            for (var i: number = 0; i < this.additionalProperties.Count; i = i + 1) {
                if (this.additionalProperties.get_Item(i) === null) {
                    throw new ServiceValidationException(NString.Format(Strings.AdditionalPropertyIsNull, i));
                }
            }
        }
        ValidateForRequest(request: ServiceRequestBase, summaryPropertiesOnly: boolean): void {
            var enumerator: List_Enumerator<PropertyDefinitionBase> = this.additionalProperties.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: PropertyDefinitionBase = enumerator.Current;
                    var propertyDefinition: PropertyDefinition = ((current instanceof PropertyDefinition) ? <PropertyDefinition>current : null);
                    if (propertyDefinition !== null) {
                        if (propertyDefinition.Version > request.Service.RequestedServerVersion) {
                            throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, propertyDefinition.Name, propertyDefinition.Version));
                        }
                        if (summaryPropertiesOnly && !propertyDefinition.HasFlag(PropertyDefinitionFlags.CanFind, new Nullable<ExchangeVersion>(request.Service.RequestedServerVersion))) {
                            throw new ServiceValidationException(NString.Format(Strings.NonSummaryPropertyCannotBeUsed, propertyDefinition.Name, request.GetXmlElementName()));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (this.FilterHtmlContent !== null && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "FilterHtmlContent", ExchangeVersion.Exchange2010));
            }
            if (this.ConvertHtmlCodePageToUTF8 !== null && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2010_SP1) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "ConvertHtmlCodePageToUTF8", ExchangeVersion.Exchange2010_SP1));
            }
            if (!NString.IsNullOrEmpty(this.InlineImageUrlTemplate) && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "InlineImageUrlTemplate", ExchangeVersion.Exchange2013));
            }
            if (this.BlockExternalImages !== null && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "BlockExternalImages", ExchangeVersion.Exchange2013));
            }
            if (this.AddBlankTargetToLinks !== null && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "AddTargetToLinks", ExchangeVersion.Exchange2013));
            }
            if (this.MaximumBodySize !== null && request.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.PropertyIncompatibleWithRequestVersion, "MaximumBodySize", ExchangeVersion.Exchange2013));
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter, serviceObjectType: ServiceObjectType): void {
            var shapeName: string = PropertySet.GetShapeName(serviceObjectType);
            writer.WriteStartElement(XmlNamespace.Messages, shapeName);
            writer.WriteElementValue(XmlNamespace.Types, "BaseShape", PropertySet.defaultPropertySetMap.Member.get_Item(this.BasePropertySet));
            if (serviceObjectType === ServiceObjectType.Item) {
                if (this.RequestedBodyType !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "BodyType", this.RequestedBodyType.Value);
                }
                if (this.RequestedUniqueBodyType !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "UniqueBodyType", this.RequestedUniqueBodyType.Value);
                }
                if (this.RequestedNormalizedBodyType !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "NormalizedBodyType", this.RequestedNormalizedBodyType.Value);
                }
                if (this.FilterHtmlContent !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "FilterHtmlContent", this.FilterHtmlContent.Value);
                }
                if (this.ConvertHtmlCodePageToUTF8 !== null && writer.Service.RequestedServerVersion >= ExchangeVersion.Exchange2010_SP1) {
                    writer.WriteElementValue(XmlNamespace.Types, "ConvertHtmlCodePageToUTF8", this.ConvertHtmlCodePageToUTF8.Value);
                }
                if (!NString.IsNullOrEmpty(this.InlineImageUrlTemplate) && writer.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    writer.WriteElementValue(XmlNamespace.Types, "InlineImageUrlTemplate", this.InlineImageUrlTemplate);
                }
                if (this.BlockExternalImages !== null && writer.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    writer.WriteElementValue(XmlNamespace.Types, "BlockExternalImages", this.BlockExternalImages.Value);
                }
                if (this.AddBlankTargetToLinks !== null && writer.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    writer.WriteElementValue(XmlNamespace.Types, "AddBlankTargetToLinks", this.AddBlankTargetToLinks.Value);
                }
                if (this.MaximumBodySize !== null && writer.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    writer.WriteElementValue(XmlNamespace.Types, "MaximumBodySize", this.MaximumBodySize.Value);
                }
            }
            if (this.additionalProperties.Count > 0) {
                PropertySet.WriteAdditionalPropertiesToXml(writer, this.additionalProperties);
            }
            writer.WriteEndElement();
        }
        WriteGetShapeToJson(jsonRequest: JsonObject, service: ExchangeService, serviceObjectType: ServiceObjectType): void {
            var shapeName: string = PropertySet.GetShapeName(serviceObjectType);
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("BaseShape", PropertySet.defaultPropertySetMap.Member.get_Item(this.BasePropertySet));
            if (serviceObjectType === ServiceObjectType.Item) {
                if (this.RequestedBodyType !== null) {
                    jsonObject.Add("BodyType", this.RequestedBodyType.Value);
                }
                if (this.FilterHtmlContent !== null) {
                    jsonObject.Add("FilterHtmlContent", this.FilterHtmlContent.Value);
                }
                if (this.ConvertHtmlCodePageToUTF8 !== null && service.RequestedServerVersion >= ExchangeVersion.Exchange2010_SP1) {
                    jsonObject.Add("ConvertHtmlCodePageToUTF8", this.ConvertHtmlCodePageToUTF8.Value);
                }
                if (!NString.IsNullOrEmpty(this.InlineImageUrlTemplate) && service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    jsonObject.Add("InlineImageUrlTemplate", this.InlineImageUrlTemplate);
                }
                if (this.BlockExternalImages !== null && service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    jsonObject.Add("BlockExternalImages", this.BlockExternalImages.Value);
                }
                if (this.AddBlankTargetToLinks !== null && service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    jsonObject.Add("AddBlankTargetToLinks", this.AddBlankTargetToLinks.Value);
                }
                if (this.MaximumBodySize !== null && service.RequestedServerVersion >= ExchangeVersion.Exchange2013) {
                    jsonObject.Add("MaximumBodySize", this.MaximumBodySize.Value);
                }
            }
            if (this.additionalProperties.Count > 0) {
                PropertySet.WriteAdditionalPropertiesToJson(jsonObject, service, this.additionalProperties);
            }
            jsonRequest.Add(shapeName, jsonObject);
        }
        GetEnumerator(): IEnumerator<PropertyDefinitionBase> {
            return this.additionalProperties.GetEnumerator();
        }
    }
    class SimplePropertyBag<TKey> implements IEnumerable<KeyValuePair<TKey, any>>
    {
        private items: Dictionary<TKey, any> = new Dictionary<TKey, any>();
        private removedItems: List<TKey> = new List<TKey>();
        private addedItems: List<TKey> = new List<TKey>();
        private modifiedItems: List<TKey> = new List<TKey>();
        OnChange: NEvent<() => void> = new NEvent<() => void>();
        get AddedItems(): IEnumerable<TKey> {
            return this.addedItems;
        }
        get RemovedItems(): IEnumerable<TKey> {
            return this.removedItems;
        }
        get ModifiedItems(): IEnumerable<TKey> {
            return this.modifiedItems;
        }
        get_Item(key: TKey): any {
            var result: any;
            if ((() => {
                var _p0 = [
                    result
                ];
                var _r = this.TryGetValue(key, _p0);
                result = _p0[0];
                return _r;
            })()) {
                return result;
            }
            return null;
        }
        set_Item(key: TKey, value: any): void {
            if (value === null) {
                this.InternalRemoveItem(key);
                return;
            }
            if (this.removedItems.Remove(key)) {
                this.InternalAddItemToChangeList(key, this.modifiedItems);
            }
            else {
                if (!this.ContainsKey(key)) {
                    SimplePropertyBag<TKey>.InternalAddItemToChangeList(key, this.addedItems);
                }
                else {
                    if (!this.modifiedItems.Contains(key)) {
                        SimplePropertyBag<TKey>.InternalAddItemToChangeList(key, this.modifiedItems);
                    }
                }
            }
            this.items.set_Item(key, value);
            this.Changed();
        }
        private static InternalAddItemToChangeList(key: TKey, changeList: List<TKey>): void {
            if (!changeList.Contains(key)) {
                changeList.Add(key);
            }
        }
        private Changed(): void {
            if (this.OnChange !== null) {
                this.OnChange();
            }
        }
        private InternalRemoveItem(key: TKey): void {
            var obj: any;
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = this.TryGetValue(key, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                this.items.Remove(key);
                this.removedItems.Add(key);
                this.Changed();
            }
        }
        ClearChangeLog(): void {
            this.removedItems.Clear();
            this.addedItems.Clear();
            this.modifiedItems.Clear();
        }
        ContainsKey(key: TKey): boolean {
            return this.items.ContainsKey(key);
        }
        TryGetValue(key: TKey, value: any[]): boolean {
            return (() => {
                var _p0 = [
                    value[0]
                ];
                var _r = this.items.TryGetValue(key, _p0);
                value[0] = _p0[0];
                return _r;
            })();
        }
        GetEnumerator(): IEnumerator<KeyValuePair<TKey, any>> {
            return this.items.GetEnumerator();
        }
        constructor() {
            super();
        }
    }
    class XmlAttributeNames {
        static XmlNs: string = "xmlns";
        static Id: string = "Id";
        static ChangeKey: string = "ChangeKey";
        static RecurringMasterId: string = "RecurringMasterId";
        static InstanceIndex: string = "InstanceIndex";
        static OccurrenceId: string = "OccurrenceId";
        static Traversal: string = "Traversal";
        static ViewFilter: string = "ViewFilter";
        static Offset: string = "Offset";
        static MaxEntriesReturned: string = "MaxEntriesReturned";
        static BasePoint: string = "BasePoint";
        static ResponseClass: string = "ResponseClass";
        static IndexedPagingOffset: string = "IndexedPagingOffset";
        static TotalItemsInView: string = "TotalItemsInView";
        static IncludesLastItemInRange: string = "IncludesLastItemInRange";
        static BodyType: string = "BodyType";
        static MessageDisposition: string = "MessageDisposition";
        static SaveItemToFolder: string = "SaveItemToFolder";
        static RootItemChangeKey: string = "RootItemChangeKey";
        static DeleteType: string = "DeleteType";
        static DeleteSubFolders: string = "DeleteSubFolders";
        static AffectedTaskOccurrences: string = "AffectedTaskOccurrences";
        static SendMeetingCancellations: string = "SendMeetingCancellations";
        static SuppressReadReceipts: string = "SuppressReadReceipts";
        static FieldURI: string = "FieldURI";
        static FieldIndex: string = "FieldIndex";
        static ConflictResolution: string = "ConflictResolution";
        static SendMeetingInvitationsOrCancellations: string = "SendMeetingInvitationsOrCancellations";
        static CharacterSet: string = "CharacterSet";
        static HeaderName: string = "HeaderName";
        static SendMeetingInvitations: string = "SendMeetingInvitations";
        static Key: string = "Key";
        static RoutingType: string = "RoutingType";
        static MailboxType: string = "MailboxType";
        static DistinguishedPropertySetId: string = "DistinguishedPropertySetId";
        static PropertySetId: string = "PropertySetId";
        static PropertyTag: string = "PropertyTag";
        static PropertyName: string = "PropertyName";
        static PropertyId: string = "PropertyId";
        static PropertyType: string = "PropertyType";
        static TimeZoneName: string = "TimeZoneName";
        static ReturnFullContactData: string = "ReturnFullContactData";
        static ContactDataShape: string = "ContactDataShape";
        static Numerator: string = "Numerator";
        static Denominator: string = "Numerator";
        static Value: string = "Value";
        static ContainmentMode: string = "ContainmentMode";
        static ContainmentComparison: string = "ContainmentComparison";
        static Order: string = "Order";
        static StartDate: string = "StartDate";
        static EndDate: string = "EndDate";
        static Version: string = "Version";
        static Aggregate: string = "Aggregate";
        static SearchScope: string = "SearchScope";
        static Format: string = "Format";
        static Mailbox: string = "Mailbox";
        static DestinationFormat: string = "DestinationFormat";
        static FolderId: string = "FolderId";
        static ItemId: string = "ItemId";
        static IncludePermissions: string = "IncludePermissions";
        static InitialName: string = "InitialName";
        static FinalName: string = "FinalName";
        static AuthenticationMethod: string = "AuthenticationMethod";
        static Time: string = "Time";
        static Name: string = "Name";
        static Bias: string = "Bias";
        static Kind: string = "Kind";
        static SubscribeToAllFolders: string = "SubscribeToAllFolders";
        static PublicFolderServer: string = "PublicFolderServer";
        static IsArchive: string = "IsArchive";
        static ReturnHighlightTerms: string = "ReturnHighlightTerms";
        static IsExplicit: string = "IsExplicit";
        static ClientExtensionUserIdentity: string = "UserId";
        static ClientExtensionEnabledOnly: string = "EnabledOnly";
        static SetClientExtensionActionId: string = "ActionId";
        static ClientExtensionId: string = "ExtensionId";
        static ClientExtensionIsAvailable: string = "IsAvailable";
        static ClientExtensionIsMandatory: string = "IsMandatory";
        static ClientExtensionIsEnabledByDefault: string = "IsEnabledByDefault";
        static ClientExtensionProvidedTo: string = "ProvidedTo";
        static ClientExtensionType: string = "Type";
        static ClientExtensionScope: string = "Scope";
        static ClientExtensionMarketplaceAssetID: string = "MarketplaceAssetId";
        static ClientExtensionMarketplaceContentMarket: string = "MarketplaceContentMarket";
        static ClientExtensionAppStatus: string = "AppStatus";
        static ClientExtensionEtoken: string = "Etoken";
        static IsTruncated: string = "IsTruncated";
        static IsJunk: string = "IsJunk";
        static MoveItem: string = "MoveItem";
        static Nil: string = "nil";
        static Type: string = "type";
        constructor() {
            super();
        }
    }
    class XmlElementNames {
        static AllProperties: string = "AllProperties";
        static ParentFolderIds: string = "ParentFolderIds";
        static DistinguishedFolderId: string = "DistinguishedFolderId";
        static ItemId: string = "ItemId";
        static ItemIds: string = "ItemIds";
        static FolderId: string = "FolderId";
        static FolderIds: string = "FolderIds";
        static OccurrenceItemId: string = "OccurrenceItemId";
        static RecurringMasterItemId: string = "RecurringMasterItemId";
        static ItemShape: string = "ItemShape";
        static FolderShape: string = "FolderShape";
        static BaseShape: string = "BaseShape";
        static IndexedPageItemView: string = "IndexedPageItemView";
        static IndexedPageFolderView: string = "IndexedPageFolderView";
        static FractionalPageItemView: string = "FractionalPageItemView";
        static FractionalPageFolderView: string = "FractionalPageFolderView";
        static SeekToConditionPageItemView: string = "SeekToConditionPageItemView";
        static ResponseCode: string = "ResponseCode";
        static RootFolder: string = "RootFolder";
        static Folder: string = "Folder";
        static ContactsFolder: string = "ContactsFolder";
        static TasksFolder: string = "TasksFolder";
        static SearchFolder: string = "SearchFolder";
        static Folders: string = "Folders";
        static Item: string = "Item";
        static Items: string = "Items";
        static Message: string = "Message";
        static Mailbox: string = "Mailbox";
        static Body: string = "Body";
        static From: string = "From";
        static Sender: string = "Sender";
        static Name: string = "Name";
        static Address: string = "Address";
        static EmailAddress: string = "EmailAddress";
        static RoutingType: string = "RoutingType";
        static MailboxType: string = "MailboxType";
        static ToRecipients: string = "ToRecipients";
        static CcRecipients: string = "CcRecipients";
        static BccRecipients: string = "BccRecipients";
        static ReplyTo: string = "ReplyTo";
        static ConversationTopic: string = "ConversationTopic";
        static ConversationIndex: string = "ConversationIndex";
        static IsDeliveryReceiptRequested: string = "IsDeliveryReceiptRequested";
        static IsRead: string = "IsRead";
        static IsReadReceiptRequested: string = "IsReadReceiptRequested";
        static IsResponseRequested: string = "IsResponseRequested";
        static InternetMessageId: string = "InternetMessageId";
        static References: string = "References";
        static ParentItemId: string = "ParentItemId";
        static ParentFolderId: string = "ParentFolderId";
        static ChildFolderCount: string = "ChildFolderCount";
        static DisplayName: string = "DisplayName";
        static TotalCount: string = "TotalCount";
        static ItemClass: string = "ItemClass";
        static FolderClass: string = "FolderClass";
        static Subject: string = "Subject";
        static MimeContent: string = "MimeContent";
        static Sensitivity: string = "Sensitivity";
        static Attachments: string = "Attachments";
        static DateTimeReceived: string = "DateTimeReceived";
        static Size: string = "Size";
        static Categories: string = "Categories";
        static Importance: string = "Importance";
        static InReplyTo: string = "InReplyTo";
        static IsSubmitted: string = "IsSubmitted";
        static IsAssociated: string = "IsAssociated";
        static IsDraft: string = "IsDraft";
        static IsFromMe: string = "IsFromMe";
        static IsResend: string = "IsResend";
        static IsUnmodified: string = "IsUnmodified";
        static InternetMessageHeader: string = "InternetMessageHeader";
        static InternetMessageHeaders: string = "InternetMessageHeaders";
        static DateTimeSent: string = "DateTimeSent";
        static DateTimeCreated: string = "DateTimeCreated";
        static ResponseObjects: string = "ResponseObjects";
        static ReminderDueBy: string = "ReminderDueBy";
        static ReminderIsSet: string = "ReminderIsSet";
        static ReminderMinutesBeforeStart: string = "ReminderMinutesBeforeStart";
        static DisplayCc: string = "DisplayCc";
        static DisplayTo: string = "DisplayTo";
        static HasAttachments: string = "HasAttachments";
        static ExtendedProperty: string = "ExtendedProperty";
        static Culture: string = "Culture";
        static FileAttachment: string = "FileAttachment";
        static ItemAttachment: string = "ItemAttachment";
        static AttachmentIds: string = "AttachmentIds";
        static AttachmentId: string = "AttachmentId";
        static ContentType: string = "ContentType";
        static ContentLocation: string = "ContentLocation";
        static ContentId: string = "ContentId";
        static Content: string = "Content";
        static SavedItemFolderId: string = "SavedItemFolderId";
        static MessageText: string = "MessageText";
        static DescriptiveLinkKey: string = "DescriptiveLinkKey";
        static ItemChange: string = "ItemChange";
        static ItemChanges: string = "ItemChanges";
        static FolderChange: string = "FolderChange";
        static FolderChanges: string = "FolderChanges";
        static Updates: string = "Updates";
        static AppendToItemField: string = "AppendToItemField";
        static SetItemField: string = "SetItemField";
        static DeleteItemField: string = "DeleteItemField";
        static SetFolderField: string = "SetFolderField";
        static DeleteFolderField: string = "DeleteFolderField";
        static FieldURI: string = "FieldURI";
        static RootItemId: string = "RootItemId";
        static ReferenceItemId: string = "ReferenceItemId";
        static NewBodyContent: string = "NewBodyContent";
        static ReplyToItem: string = "ReplyToItem";
        static ReplyAllToItem: string = "ReplyAllToItem";
        static ForwardItem: string = "ForwardItem";
        static AcceptItem: string = "AcceptItem";
        static TentativelyAcceptItem: string = "TentativelyAcceptItem";
        static DeclineItem: string = "DeclineItem";
        static CancelCalendarItem: string = "CancelCalendarItem";
        static RemoveItem: string = "RemoveItem";
        static SuppressReadReceipt: string = "SuppressReadReceipt";
        static SuppressReadReceipts: string = "SuppressReadReceipts";
        static String: string = "String";
        static Start: string = "Start";
        static End: string = "End";
        static ProposedStart: string = "ProposedStart";
        static ProposedEnd: string = "ProposedEnd";
        static OriginalStart: string = "OriginalStart";
        static IsAllDayEvent: string = "IsAllDayEvent";
        static LegacyFreeBusyStatus: string = "LegacyFreeBusyStatus";
        static Location: string = "Location";
        static When: string = "When";
        static IsMeeting: string = "IsMeeting";
        static IsCancelled: string = "IsCancelled";
        static IsRecurring: string = "IsRecurring";
        static MeetingRequestWasSent: string = "MeetingRequestWasSent";
        static CalendarItemType: string = "CalendarItemType";
        static MyResponseType: string = "MyResponseType";
        static Organizer: string = "Organizer";
        static RequiredAttendees: string = "RequiredAttendees";
        static OptionalAttendees: string = "OptionalAttendees";
        static Resources: string = "Resources";
        static ConflictingMeetingCount: string = "ConflictingMeetingCount";
        static AdjacentMeetingCount: string = "AdjacentMeetingCount";
        static ConflictingMeetings: string = "ConflictingMeetings";
        static AdjacentMeetings: string = "AdjacentMeetings";
        static Duration: string = "Duration";
        static TimeZone: string = "TimeZone";
        static AppointmentReplyTime: string = "AppointmentReplyTime";
        static AppointmentSequenceNumber: string = "AppointmentSequenceNumber";
        static AppointmentState: string = "AppointmentState";
        static Recurrence: string = "Recurrence";
        static FirstOccurrence: string = "FirstOccurrence";
        static LastOccurrence: string = "LastOccurrence";
        static ModifiedOccurrences: string = "ModifiedOccurrences";
        static DeletedOccurrences: string = "DeletedOccurrences";
        static MeetingTimeZone: string = "MeetingTimeZone";
        static ConferenceType: string = "ConferenceType";
        static AllowNewTimeProposal: string = "AllowNewTimeProposal";
        static IsOnlineMeeting: string = "IsOnlineMeeting";
        static MeetingWorkspaceUrl: string = "MeetingWorkspaceUrl";
        static NetShowUrl: string = "NetShowUrl";
        static JoinOnlineMeetingUrl: string = "JoinOnlineMeetingUrl";
        static OnlineMeetingSettings: string = "OnlineMeetingSettings";
        static LobbyBypass: string = "LobbyBypass";
        static AccessLevel: string = "AccessLevel";
        static Presenters: string = "Presenters";
        static CalendarItem: string = "CalendarItem";
        static CalendarFolder: string = "CalendarFolder";
        static Attendee: string = "Attendee";
        static ResponseType: string = "ResponseType";
        static LastResponseTime: string = "LastResponseTime";
        static Occurrence: string = "Occurrence";
        static DeletedOccurrence: string = "DeletedOccurrence";
        static RelativeYearlyRecurrence: string = "RelativeYearlyRecurrence";
        static AbsoluteYearlyRecurrence: string = "AbsoluteYearlyRecurrence";
        static RelativeMonthlyRecurrence: string = "RelativeMonthlyRecurrence";
        static AbsoluteMonthlyRecurrence: string = "AbsoluteMonthlyRecurrence";
        static WeeklyRecurrence: string = "WeeklyRecurrence";
        static DailyRecurrence: string = "DailyRecurrence";
        static DailyRegeneration: string = "DailyRegeneration";
        static WeeklyRegeneration: string = "WeeklyRegeneration";
        static MonthlyRegeneration: string = "MonthlyRegeneration";
        static YearlyRegeneration: string = "YearlyRegeneration";
        static NoEndRecurrence: string = "NoEndRecurrence";
        static EndDateRecurrence: string = "EndDateRecurrence";
        static NumberedRecurrence: string = "NumberedRecurrence";
        static Interval: string = "Interval";
        static DayOfMonth: string = "DayOfMonth";
        static DayOfWeek: string = "DayOfWeek";
        static DaysOfWeek: string = "DaysOfWeek";
        static DayOfWeekIndex: string = "DayOfWeekIndex";
        static Month: string = "Month";
        static StartDate: string = "StartDate";
        static EndDate: string = "EndDate";
        static StartTime: string = "StartTime";
        static EndTime: string = "EndTime";
        static NumberOfOccurrences: string = "NumberOfOccurrences";
        static AssociatedCalendarItemId: string = "AssociatedCalendarItemId";
        static IsDelegated: string = "IsDelegated";
        static IsOutOfDate: string = "IsOutOfDate";
        static HasBeenProcessed: string = "HasBeenProcessed";
        static IsOrganizer: string = "IsOrganizer";
        static MeetingMessage: string = "MeetingMessage";
        static FileAs: string = "FileAs";
        static FileAsMapping: string = "FileAsMapping";
        static GivenName: string = "GivenName";
        static Initials: string = "Initials";
        static MiddleName: string = "MiddleName";
        static NickName: string = "Nickname";
        static CompleteName: string = "CompleteName";
        static CompanyName: string = "CompanyName";
        static EmailAddresses: string = "EmailAddresses";
        static PhysicalAddresses: string = "PhysicalAddresses";
        static PhoneNumbers: string = "PhoneNumbers";
        static PhoneNumber: string = "PhoneNumber";
        static AssistantName: string = "AssistantName";
        static Birthday: string = "Birthday";
        static BusinessHomePage: string = "BusinessHomePage";
        static Children: string = "Children";
        static Companies: string = "Companies";
        static ContactSource: string = "ContactSource";
        static Department: string = "Department";
        static Generation: string = "Generation";
        static ImAddresses: string = "ImAddresses";
        static ImAddress: string = "ImAddress";
        static JobTitle: string = "JobTitle";
        static Manager: string = "Manager";
        static Mileage: string = "Mileage";
        static OfficeLocation: string = "OfficeLocation";
        static PostalAddressIndex: string = "PostalAddressIndex";
        static Profession: string = "Profession";
        static SpouseName: string = "SpouseName";
        static Surname: string = "Surname";
        static WeddingAnniversary: string = "WeddingAnniversary";
        static HasPicture: string = "HasPicture";
        static Title: string = "Title";
        static FirstName: string = "FirstName";
        static LastName: string = "LastName";
        static Suffix: string = "Suffix";
        static FullName: string = "FullName";
        static YomiFirstName: string = "YomiFirstName";
        static YomiLastName: string = "YomiLastName";
        static Contact: string = "Contact";
        static Entry: string = "Entry";
        static Street: string = "Street";
        static City: string = "City";
        static State: string = "State";
        static SharePointSiteUrl: string = "SharePointSiteUrl";
        static Country: string = "Country";
        static CountryOrRegion: string = "CountryOrRegion";
        static PostalCode: string = "PostalCode";
        static PostOfficeBox: string = "PostOfficeBox";
        static Members: string = "Members";
        static Member: string = "Member";
        static AdditionalProperties: string = "AdditionalProperties";
        static ExtendedFieldURI: string = "ExtendedFieldURI";
        static Value: string = "Value";
        static Values: string = "Values";
        static ToFolderId: string = "ToFolderId";
        static ActualWork: string = "ActualWork";
        static AssignedTime: string = "AssignedTime";
        static BillingInformation: string = "BillingInformation";
        static ChangeCount: string = "ChangeCount";
        static CompleteDate: string = "CompleteDate";
        static Contacts: string = "Contacts";
        static DelegationState: string = "DelegationState";
        static Delegator: string = "Delegator";
        static DueDate: string = "DueDate";
        static IsAssignmentEditable: string = "IsAssignmentEditable";
        static IsComplete: string = "IsComplete";
        static IsTeamTask: string = "IsTeamTask";
        static Owner: string = "Owner";
        static PercentComplete: string = "PercentComplete";
        static Status: string = "Status";
        static StatusDescription: string = "StatusDescription";
        static TotalWork: string = "TotalWork";
        static Task: string = "Task";
        static MailboxCulture: string = "MailboxCulture";
        static MeetingRequestType: string = "MeetingRequestType";
        static IntendedFreeBusyStatus: string = "IntendedFreeBusyStatus";
        static MeetingRequest: string = "MeetingRequest";
        static MeetingResponse: string = "MeetingResponse";
        static MeetingCancellation: string = "MeetingCancellation";
        static ChangeHighlights: string = "ChangeHighlights";
        static HasLocationChanged: string = "HasLocationChanged";
        static HasStartTimeChanged: string = "HasStartTimeChanged";
        static HasEndTimeChanged: string = "HasEndTimeChanged";
        static BaseOffset: string = "BaseOffset";
        static Offset: string = "Offset";
        static Standard: string = "Standard";
        static Daylight: string = "Daylight";
        static Time: string = "Time";
        static AbsoluteDate: string = "AbsoluteDate";
        static UnresolvedEntry: string = "UnresolvedEntry";
        static ResolutionSet: string = "ResolutionSet";
        static Resolution: string = "Resolution";
        static DistributionList: string = "DistributionList";
        static DLExpansion: string = "DLExpansion";
        static IndexedFieldURI: string = "IndexedFieldURI";
        static PullSubscriptionRequest: string = "PullSubscriptionRequest";
        static PushSubscriptionRequest: string = "PushSubscriptionRequest";
        static StreamingSubscriptionRequest: string = "StreamingSubscriptionRequest";
        static EventTypes: string = "EventTypes";
        static EventType: string = "EventType";
        static Timeout: string = "Timeout";
        static Watermark: string = "Watermark";
        static SubscriptionId: string = "SubscriptionId";
        static SubscriptionIds: string = "SubscriptionIds";
        static StatusFrequency: string = "StatusFrequency";
        static URL: string = "URL";
        static CallerData: string = "CallerData";
        static Notification: string = "Notification";
        static Notifications: string = "Notifications";
        static PreviousWatermark: string = "PreviousWatermark";
        static MoreEvents: string = "MoreEvents";
        static TimeStamp: string = "TimeStamp";
        static UnreadCount: string = "UnreadCount";
        static OldParentFolderId: string = "OldParentFolderId";
        static CopiedEvent: string = "CopiedEvent";
        static CreatedEvent: string = "CreatedEvent";
        static DeletedEvent: string = "DeletedEvent";
        static ModifiedEvent: string = "ModifiedEvent";
        static MovedEvent: string = "MovedEvent";
        static NewMailEvent: string = "NewMailEvent";
        static StatusEvent: string = "StatusEvent";
        static FreeBusyChangedEvent: string = "FreeBusyChangedEvent";
        static ExchangeImpersonation: string = "ExchangeImpersonation";
        static ConnectingSID: string = "ConnectingSID";
        static OpenAsAdminOrSystemService: string = "OpenAsAdminOrSystemService";
        static LogonType: string = "LogonType";
        static BudgetType: string = "BudgetType";
        static ManagementRole: string = "ManagementRole";
        static UserRoles: string = "UserRoles";
        static ApplicationRoles: string = "ApplicationRoles";
        static Role: string = "Role";
        static SyncFolderId: string = "SyncFolderId";
        static SyncScope: string = "SyncScope";
        static SyncState: string = "SyncState";
        static Ignore: string = "Ignore";
        static MaxChangesReturned: string = "MaxChangesReturned";
        static Changes: string = "Changes";
        static IncludesLastItemInRange: string = "IncludesLastItemInRange";
        static IncludesLastFolderInRange: string = "IncludesLastFolderInRange";
        static Create: string = "Create";
        static Update: string = "Update";
        static Delete: string = "Delete";
        static ReadFlagChange: string = "ReadFlagChange";
        static SearchParameters: string = "SearchParameters";
        static SoftDeleted: string = "SoftDeleted";
        static Shallow: string = "Shallow";
        static Associated: string = "Associated";
        static BaseFolderId: string = "BaseFolderId";
        static BaseFolderIds: string = "BaseFolderIds";
        static SortOrder: string = "SortOrder";
        static FieldOrder: string = "FieldOrder";
        static CanDelete: string = "CanDelete";
        static CanRenameOrMove: string = "CanRenameOrMove";
        static MustDisplayComment: string = "MustDisplayComment";
        static HasQuota: string = "HasQuota";
        static IsManagedFoldersRoot: string = "IsManagedFoldersRoot";
        static ManagedFolderId: string = "ManagedFolderId";
        static Comment: string = "Comment";
        static StorageQuota: string = "StorageQuota";
        static FolderSize: string = "FolderSize";
        static HomePage: string = "HomePage";
        static ManagedFolderInformation: string = "ManagedFolderInformation";
        static CalendarView: string = "CalendarView";
        static PostedTime: string = "PostedTime";
        static PostItem: string = "PostItem";
        static RequestServerVersion: string = "RequestServerVersion";
        static PostReplyItem: string = "PostReplyItem";
        static CreateAssociated: string = "CreateAssociated";
        static CreateContents: string = "CreateContents";
        static CreateHierarchy: string = "CreateHierarchy";
        static Modify: string = "Modify";
        static Read: string = "Read";
        static EffectiveRights: string = "EffectiveRights";
        static LastModifiedName: string = "LastModifiedName";
        static LastModifiedTime: string = "LastModifiedTime";
        static ConversationId: string = "ConversationId";
        static UniqueBody: string = "UniqueBody";
        static BodyType: string = "BodyType";
        static NormalizedBodyType: string = "NormalizedBodyType";
        static UniqueBodyType: string = "UniqueBodyType";
        static AttachmentShape: string = "AttachmentShape";
        static UserId: string = "UserId";
        static UserIds: string = "UserIds";
        static CanCreateItems: string = "CanCreateItems";
        static CanCreateSubFolders: string = "CanCreateSubFolders";
        static IsFolderOwner: string = "IsFolderOwner";
        static IsFolderVisible: string = "IsFolderVisible";
        static IsFolderContact: string = "IsFolderContact";
        static EditItems: string = "EditItems";
        static DeleteItems: string = "DeleteItems";
        static ReadItems: string = "ReadItems";
        static PermissionLevel: string = "PermissionLevel";
        static CalendarPermissionLevel: string = "CalendarPermissionLevel";
        static SID: string = "SID";
        static PrimarySmtpAddress: string = "PrimarySmtpAddress";
        static DistinguishedUser: string = "DistinguishedUser";
        static PermissionSet: string = "PermissionSet";
        static Permissions: string = "Permissions";
        static Permission: string = "Permission";
        static CalendarPermissions: string = "CalendarPermissions";
        static CalendarPermission: string = "CalendarPermission";
        static GroupBy: string = "GroupBy";
        static AggregateOn: string = "AggregateOn";
        static Groups: string = "Groups";
        static GroupedItems: string = "GroupedItems";
        static GroupIndex: string = "GroupIndex";
        static ConflictResults: string = "ConflictResults";
        static Count: string = "Count";
        static OofSettings: string = "OofSettings";
        static UserOofSettings: string = "UserOofSettings";
        static OofState: string = "OofState";
        static ExternalAudience: string = "ExternalAudience";
        static AllowExternalOof: string = "AllowExternalOof";
        static InternalReply: string = "InternalReply";
        static ExternalReply: string = "ExternalReply";
        static Bias: string = "Bias";
        static DayOrder: string = "DayOrder";
        static Year: string = "Year";
        static StandardTime: string = "StandardTime";
        static DaylightTime: string = "DaylightTime";
        static MailboxData: string = "MailboxData";
        static MailboxDataArray: string = "MailboxDataArray";
        static Email: string = "Email";
        static AttendeeType: string = "AttendeeType";
        static ExcludeConflicts: string = "ExcludeConflicts";
        static FreeBusyViewOptions: string = "FreeBusyViewOptions";
        static SuggestionsViewOptions: string = "SuggestionsViewOptions";
        static FreeBusyView: string = "FreeBusyView";
        static TimeWindow: string = "TimeWindow";
        static MergedFreeBusyIntervalInMinutes: string = "MergedFreeBusyIntervalInMinutes";
        static RequestedView: string = "RequestedView";
        static FreeBusyViewType: string = "FreeBusyViewType";
        static CalendarEventArray: string = "CalendarEventArray";
        static CalendarEvent: string = "CalendarEvent";
        static BusyType: string = "BusyType";
        static MergedFreeBusy: string = "MergedFreeBusy";
        static WorkingHours: string = "WorkingHours";
        static WorkingPeriodArray: string = "WorkingPeriodArray";
        static WorkingPeriod: string = "WorkingPeriod";
        static StartTimeInMinutes: string = "StartTimeInMinutes";
        static EndTimeInMinutes: string = "EndTimeInMinutes";
        static GoodThreshold: string = "GoodThreshold";
        static MaximumResultsByDay: string = "MaximumResultsByDay";
        static MaximumNonWorkHourResultsByDay: string = "MaximumNonWorkHourResultsByDay";
        static MeetingDurationInMinutes: string = "MeetingDurationInMinutes";
        static MinimumSuggestionQuality: string = "MinimumSuggestionQuality";
        static DetailedSuggestionsWindow: string = "DetailedSuggestionsWindow";
        static CurrentMeetingTime: string = "CurrentMeetingTime";
        static GlobalObjectId: string = "GlobalObjectId";
        static SuggestionDayResultArray: string = "SuggestionDayResultArray";
        static SuggestionDayResult: string = "SuggestionDayResult";
        static Date: string = "Date";
        static DayQuality: string = "DayQuality";
        static SuggestionArray: string = "SuggestionArray";
        static Suggestion: string = "Suggestion";
        static MeetingTime: string = "MeetingTime";
        static IsWorkTime: string = "IsWorkTime";
        static SuggestionQuality: string = "SuggestionQuality";
        static AttendeeConflictDataArray: string = "AttendeeConflictDataArray";
        static UnknownAttendeeConflictData: string = "UnknownAttendeeConflictData";
        static TooBigGroupAttendeeConflictData: string = "TooBigGroupAttendeeConflictData";
        static IndividualAttendeeConflictData: string = "IndividualAttendeeConflictData";
        static GroupAttendeeConflictData: string = "GroupAttendeeConflictData";
        static NumberOfMembers: string = "NumberOfMembers";
        static NumberOfMembersAvailable: string = "NumberOfMembersAvailable";
        static NumberOfMembersWithConflict: string = "NumberOfMembersWithConflict";
        static NumberOfMembersWithNoData: string = "NumberOfMembersWithNoData";
        static SourceIds: string = "SourceIds";
        static AlternateId: string = "AlternateId";
        static AlternatePublicFolderId: string = "AlternatePublicFolderId";
        static AlternatePublicFolderItemId: string = "AlternatePublicFolderItemId";
        static DelegatePermissions: string = "DelegatePermissions";
        static ReceiveCopiesOfMeetingMessages: string = "ReceiveCopiesOfMeetingMessages";
        static ViewPrivateItems: string = "ViewPrivateItems";
        static CalendarFolderPermissionLevel: string = "CalendarFolderPermissionLevel";
        static TasksFolderPermissionLevel: string = "TasksFolderPermissionLevel";
        static InboxFolderPermissionLevel: string = "InboxFolderPermissionLevel";
        static ContactsFolderPermissionLevel: string = "ContactsFolderPermissionLevel";
        static NotesFolderPermissionLevel: string = "NotesFolderPermissionLevel";
        static JournalFolderPermissionLevel: string = "JournalFolderPermissionLevel";
        static DelegateUser: string = "DelegateUser";
        static DelegateUsers: string = "DelegateUsers";
        static DeliverMeetingRequests: string = "DeliverMeetingRequests";
        static MessageXml: string = "MessageXml";
        static UserConfiguration: string = "UserConfiguration";
        static UserConfigurationName: string = "UserConfigurationName";
        static UserConfigurationProperties: string = "UserConfigurationProperties";
        static Dictionary: string = "Dictionary";
        static DictionaryEntry: string = "DictionaryEntry";
        static DictionaryKey: string = "DictionaryKey";
        static DictionaryValue: string = "DictionaryValue";
        static XmlData: string = "XmlData";
        static BinaryData: string = "BinaryData";
        static FilterHtmlContent: string = "FilterHtmlContent";
        static ConvertHtmlCodePageToUTF8: string = "ConvertHtmlCodePageToUTF8";
        static UnknownEntries: string = "UnknownEntries";
        static UnknownEntry: string = "UnknownEntry";
        static PasswordExpirationDate: string = "PasswordExpirationDate";
        static Flag: string = "Flag";
        static PersonaPostalAddress: string = "PostalAddress";
        static PostalAddressType: string = "Type";
        static EnhancedLocation: string = "EnhancedLocation";
        static LocationDisplayName: string = "DisplayName";
        static LocationAnnotation: string = "Annotation";
        static LocationSource: string = "LocationSource";
        static LocationUri: string = "LocationUri";
        static Latitude: string = "Latitude";
        static Longitude: string = "Longitude";
        static Accuracy: string = "Accuracy";
        static Altitude: string = "Altitude";
        static AltitudeAccuracy: string = "AltitudeAccuracy";
        static FormattedAddress: string = "FormattedAddress";
        static Guid: string = "Guid";
        static PhoneCallId: string = "PhoneCallId";
        static DialString: string = "DialString";
        static PhoneCallInformation: string = "PhoneCallInformation";
        static PhoneCallState: string = "PhoneCallState";
        static ConnectionFailureCause: string = "ConnectionFailureCause";
        static SIPResponseCode: string = "SIPResponseCode";
        static SIPResponseText: string = "SIPResponseText";
        static WebClientReadFormQueryString: string = "WebClientReadFormQueryString";
        static WebClientEditFormQueryString: string = "WebClientEditFormQueryString";
        static Ids: string = "Ids";
        static Id: string = "Id";
        static TimeZoneDefinitions: string = "TimeZoneDefinitions";
        static TimeZoneDefinition: string = "TimeZoneDefinition";
        static Periods: string = "Periods";
        static Period: string = "Period";
        static TransitionsGroups: string = "TransitionsGroups";
        static TransitionsGroup: string = "TransitionsGroup";
        static Transitions: string = "Transitions";
        static Transition: string = "Transition";
        static AbsoluteDateTransition: string = "AbsoluteDateTransition";
        static RecurringDayTransition: string = "RecurringDayTransition";
        static RecurringDateTransition: string = "RecurringDateTransition";
        static DateTime: string = "DateTime";
        static TimeOffset: string = "TimeOffset";
        static Day: string = "Day";
        static TimeZoneContext: string = "TimeZoneContext";
        static StartTimeZone: string = "StartTimeZone";
        static EndTimeZone: string = "EndTimeZone";
        static ReceivedBy: string = "ReceivedBy";
        static ReceivedRepresenting: string = "ReceivedRepresenting";
        static Uid: string = "UID";
        static RecurrenceId: string = "RecurrenceId";
        static DateTimeStamp: string = "DateTimeStamp";
        static IsInline: string = "IsInline";
        static IsContactPhoto: string = "IsContactPhoto";
        static QueryString: string = "QueryString";
        static HighlightTerms: string = "HighlightTerms";
        static HighlightTerm: string = "Term";
        static HighlightTermScope: string = "Scope";
        static HighlightTermValue: string = "Value";
        static CalendarEventDetails: string = "CalendarEventDetails";
        static ID: string = "ID";
        static IsException: string = "IsException";
        static IsReminderSet: string = "IsReminderSet";
        static IsPrivate: string = "IsPrivate";
        static FirstDayOfWeek: string = "FirstDayOfWeek";
        static Verb: string = "Verb";
        static Parameter: string = "Parameter";
        static ReturnValue: string = "ReturnValue";
        static ReturnNewItemIds: string = "ReturnNewItemIds";
        static DateTimePrecision: string = "DateTimePrecision";
        static ConvertInlineImagesToDataUrls: string = "ConvertInlineImagesToDataUrls";
        static InlineImageUrlTemplate: string = "InlineImageUrlTemplate";
        static BlockExternalImages: string = "BlockExternalImages";
        static AddBlankTargetToLinks: string = "AddBlankTargetToLinks";
        static MaximumBodySize: string = "MaximumBodySize";
        static StoreEntryId: string = "StoreEntryId";
        static InstanceKey: string = "InstanceKey";
        static NormalizedBody: string = "NormalizedBody";
        static PolicyTag: string = "PolicyTag";
        static ArchiveTag: string = "ArchiveTag";
        static RetentionDate: string = "RetentionDate";
        static DisableReason: string = "DisableReason";
        static AppMarketplaceUrl: string = "AppMarketplaceUrl";
        static TextBody: string = "TextBody";
        static IconIndex: string = "IconIndex";
        static GlobalIconIndex: string = "GlobalIconIndex";
        static DraftItemIds: string = "DraftItemIds";
        static HasIrm: string = "HasIrm";
        static GlobalHasIrm: string = "GlobalHasIrm";
        static ApprovalRequestData: string = "ApprovalRequestData";
        static IsUndecidedApprovalRequest: string = "IsUndecidedApprovalRequest";
        static ApprovalDecision: string = "ApprovalDecision";
        static ApprovalDecisionMaker: string = "ApprovalDecisionMaker";
        static ApprovalDecisionTime: string = "ApprovalDecisionTime";
        static VotingOptionData: string = "VotingOptionData";
        static VotingOptionDisplayName: string = "DisplayName";
        static SendPrompt: string = "SendPrompt";
        static VotingInformation: string = "VotingInformation";
        static UserOptions: string = "UserOptions";
        static VotingResponse: string = "VotingResponse";
        static NlgEntityExtractionResult: string = "EntityExtractionResult";
        static NlgAddresses: string = "Addresses";
        static NlgAddress: string = "Address";
        static NlgMeetingSuggestions: string = "MeetingSuggestions";
        static NlgMeetingSuggestion: string = "MeetingSuggestion";
        static NlgTaskSuggestions: string = "TaskSuggestions";
        static NlgTaskSuggestion: string = "TaskSuggestion";
        static NlgBusinessName: string = "BusinessName";
        static NlgPeopleName: string = "PeopleName";
        static NlgEmailAddresses: string = "EmailAddresses";
        static NlgEmailAddress: string = "EmailAddress";
        static NlgEmailPosition: string = "Position";
        static NlgContacts: string = "Contacts";
        static NlgContact: string = "Contact";
        static NlgContactString: string = "ContactString";
        static NlgUrls: string = "Urls";
        static NlgUrl: string = "Url";
        static NlgPhoneNumbers: string = "PhoneNumbers";
        static NlgPhone: string = "Phone";
        static NlgAttendees: string = "Attendees";
        static NlgEmailUser: string = "EmailUser";
        static NlgLocation: string = "Location";
        static NlgSubject: string = "Subject";
        static NlgMeetingString: string = "MeetingString";
        static NlgStartTime: string = "StartTime";
        static NlgEndTime: string = "EndTime";
        static NlgTaskString: string = "TaskString";
        static NlgAssignees: string = "Assignees";
        static NlgPersonName: string = "PersonName";
        static NlgOriginalPhoneString: string = "OriginalPhoneString";
        static NlgPhoneString: string = "PhoneString";
        static NlgType: string = "Type";
        static NlgName: string = "Name";
        static NlgUserId: string = "UserId";
        static GetClientAccessToken: string = "GetClientAccessToken";
        static GetClientAccessTokenResponse: string = "GetClientAccessTokenResponse";
        static GetClientAccessTokenResponseMessage: string = "GetClientAccessTokenResponseMessage";
        static TokenRequests: string = "TokenRequests";
        static TokenRequest: string = "TokenRequest";
        static TokenType: string = "TokenType";
        static TokenValue: string = "TokenValue";
        static TTL: string = "TTL";
        static Tokens: string = "Tokens";
        static MarkAsJunk: string = "MarkAsJunk";
        static MarkAsJunkResponse: string = "MarkAsJunkResponse";
        static MarkAsJunkResponseMessage: string = "MarkAsJunkResponseMessage";
        static MovedItemId: string = "MovedItemId";
        static Conversations: string = "Conversations";
        static Conversation: string = "Conversation";
        static UniqueRecipients: string = "UniqueRecipients";
        static GlobalUniqueRecipients: string = "GlobalUniqueRecipients";
        static UniqueUnreadSenders: string = "UniqueUnreadSenders";
        static GlobalUniqueUnreadSenders: string = "GlobalUniqueUnreadSenders";
        static UniqueSenders: string = "UniqueSenders";
        static GlobalUniqueSenders: string = "GlobalUniqueSenders";
        static LastDeliveryTime: string = "LastDeliveryTime";
        static GlobalLastDeliveryTime: string = "GlobalLastDeliveryTime";
        static GlobalCategories: string = "GlobalCategories";
        static FlagStatus: string = "FlagStatus";
        static GlobalFlagStatus: string = "GlobalFlagStatus";
        static GlobalHasAttachments: string = "GlobalHasAttachments";
        static MessageCount: string = "MessageCount";
        static GlobalMessageCount: string = "GlobalMessageCount";
        static GlobalUnreadCount: string = "GlobalUnreadCount";
        static GlobalSize: string = "GlobalSize";
        static ItemClasses: string = "ItemClasses";
        static GlobalItemClasses: string = "GlobalItemClasses";
        static GlobalImportance: string = "GlobalImportance";
        static GlobalInferredImportance: string = "GlobalInferredImportance";
        static GlobalItemIds: string = "GlobalItemIds";
        static ChangeType: string = "ChangeType";
        static ReadFlag: string = "ReadFlag";
        static TotalConversationsInView: string = "TotalConversationsInView";
        static IndexedOffset: string = "IndexedOffset";
        static ConversationShape: string = "ConversationShape";
        static MailboxScope: string = "MailboxScope";
        static ApplyConversationAction: string = "ApplyConversationAction";
        static ConversationActions: string = "ConversationActions";
        static ConversationAction: string = "ConversationAction";
        static ApplyConversationActionResponse: string = "ApplyConversationActionResponse";
        static ApplyConversationActionResponseMessage: string = "ApplyConversationActionResponseMessage";
        static EnableAlwaysDelete: string = "EnableAlwaysDelete";
        static ProcessRightAway: string = "ProcessRightAway";
        static DestinationFolderId: string = "DestinationFolderId";
        static ContextFolderId: string = "ContextFolderId";
        static ConversationLastSyncTime: string = "ConversationLastSyncTime";
        static AlwaysCategorize: string = "AlwaysCategorize";
        static AlwaysDelete: string = "AlwaysDelete";
        static AlwaysMove: string = "AlwaysMove";
        static Move: string = "Move";
        static Copy: string = "Copy";
        static SetReadState: string = "SetReadState";
        static SetRetentionPolicy: string = "SetRetentionPolicy";
        static DeleteType: string = "DeleteType";
        static RetentionPolicyType: string = "RetentionPolicyType";
        static RetentionPolicyTagId: string = "RetentionPolicyTagId";
        static FoldersToIgnore: string = "FoldersToIgnore";
        static ParentInternetMessageId: string = "ParentInternetMessageId";
        static ConversationNode: string = "ConversationNode";
        static ConversationNodes: string = "ConversationNodes";
        static MaxItemsToReturn: string = "MaxItemsToReturn";
        static SetTeamMailbox: string = "SetTeamMailbox";
        static SetTeamMailboxResponse: string = "SetTeamMailboxResponse";
        static UnpinTeamMailbox: string = "UnpinTeamMailbox";
        static UnpinTeamMailboxResponse: string = "UnpinTeamMailboxResponse";
        static RoomLists: string = "RoomLists";
        static Rooms: string = "Rooms";
        static Room: string = "Room";
        static RoomList: string = "RoomList";
        static RoomId: string = "Id";
        static Autodiscover: string = "Autodiscover";
        static BinarySecret: string = "BinarySecret";
        static Response: string = "Response";
        static User: string = "User";
        static LegacyDN: string = "LegacyDN";
        static DeploymentId: string = "DeploymentId";
        static Account: string = "Account";
        static AccountType: string = "AccountType";
        static Action: string = "Action";
        static To: string = "To";
        static RedirectAddr: string = "RedirectAddr";
        static RedirectUrl: string = "RedirectUrl";
        static Protocol: string = "Protocol";
        static Type: string = "Type";
        static Server: string = "Server";
        static OwnerSmtpAddress: string = "OwnerSmtpAddress";
        static ServerDN: string = "ServerDN";
        static ServerVersion: string = "ServerVersion";
        static ServerVersionInfo: string = "ServerVersionInfo";
        static AD: string = "AD";
        static AuthPackage: string = "AuthPackage";
        static MdbDN: string = "MdbDN";
        static EWSUrl: string = "EwsUrl";
        static EwsPartnerUrl: string = "EwsPartnerUrl";
        static EmwsUrl: string = "EmwsUrl";
        static ASUrl: string = "ASUrl";
        static OOFUrl: string = "OOFUrl";
        static UMUrl: string = "UMUrl";
        static OABUrl: string = "OABUrl";
        static Internal: string = "Internal";
        static External: string = "External";
        static OWAUrl: string = "OWAUrl";
        static Error: string = "Error";
        static ErrorCode: string = "ErrorCode";
        static DebugData: string = "DebugData";
        static Users: string = "Users";
        static RequestedSettings: string = "RequestedSettings";
        static Setting: string = "Setting";
        static GetUserSettingsRequestMessage: string = "GetUserSettingsRequestMessage";
        static RequestedServerVersion: string = "RequestedServerVersion";
        static Request: string = "Request";
        static RedirectTarget: string = "RedirectTarget";
        static UserSettings: string = "UserSettings";
        static UserSettingErrors: string = "UserSettingErrors";
        static GetUserSettingsResponseMessage: string = "GetUserSettingsResponseMessage";
        static ErrorMessage: string = "ErrorMessage";
        static UserResponse: string = "UserResponse";
        static UserResponses: string = "UserResponses";
        static UserSettingError: string = "UserSettingError";
        static Domain: string = "Domain";
        static Domains: string = "Domains";
        static DomainResponse: string = "DomainResponse";
        static DomainResponses: string = "DomainResponses";
        static DomainSetting: string = "DomainSetting";
        static DomainSettings: string = "DomainSettings";
        static DomainStringSetting: string = "DomainStringSetting";
        static DomainSettingError: string = "DomainSettingError";
        static DomainSettingErrors: string = "DomainSettingErrors";
        static GetDomainSettingsRequestMessage: string = "GetDomainSettingsRequestMessage";
        static GetDomainSettingsResponseMessage: string = "GetDomainSettingsResponseMessage";
        static SettingName: string = "SettingName";
        static UserSetting: string = "UserSetting";
        static StringSetting: string = "StringSetting";
        static WebClientUrlCollectionSetting: string = "WebClientUrlCollectionSetting";
        static WebClientUrls: string = "WebClientUrls";
        static WebClientUrl: string = "WebClientUrl";
        static AuthenticationMethods: string = "AuthenticationMethods";
        static Url: string = "Url";
        static AlternateMailboxCollectionSetting: string = "AlternateMailboxCollectionSetting";
        static AlternateMailboxes: string = "AlternateMailboxes";
        static AlternateMailbox: string = "AlternateMailbox";
        static ProtocolConnectionCollectionSetting: string = "ProtocolConnectionCollectionSetting";
        static ProtocolConnections: string = "ProtocolConnections";
        static ProtocolConnection: string = "ProtocolConnection";
        static DocumentSharingLocationCollectionSetting: string = "DocumentSharingLocationCollectionSetting";
        static DocumentSharingLocations: string = "DocumentSharingLocations";
        static DocumentSharingLocation: string = "DocumentSharingLocation";
        static ServiceUrl: string = "ServiceUrl";
        static LocationUrl: string = "LocationUrl";
        static SupportedFileExtensions: string = "SupportedFileExtensions";
        static FileExtension: string = "FileExtension";
        static ExternalAccessAllowed: string = "ExternalAccessAllowed";
        static AnonymousAccessAllowed: string = "AnonymousAccessAllowed";
        static CanModifyPermissions: string = "CanModifyPermissions";
        static IsDefault: string = "IsDefault";
        static EncryptionMethod: string = "EncryptionMethod";
        static Hostname: string = "Hostname";
        static Port: string = "Port";
        static Version: string = "Version";
        static MajorVersion: string = "MajorVersion";
        static MinorVersion: string = "MinorVersion";
        static MajorBuildNumber: string = "MajorBuildNumber";
        static MinorBuildNumber: string = "MinorBuildNumber";
        static RequestedVersion: string = "RequestedVersion";
        static PublicFolderServer: string = "PublicFolderServer";
        static Ssl: string = "SSL";
        static SharingUrl: string = "SharingUrl";
        static EcpUrl: string = "EcpUrl";
        static EcpUrl_um: string = "EcpUrl-um";
        static EcpUrl_aggr: string = "EcpUrl-aggr";
        static EcpUrl_sms: string = "EcpUrl-sms";
        static EcpUrl_mt: string = "EcpUrl-mt";
        static EcpUrl_ret: string = "EcpUrl-ret";
        static EcpUrl_publish: string = "EcpUrl-publish";
        static EcpUrl_photo: string = "EcpUrl-photo";
        static ExchangeRpcUrl: string = "ExchangeRpcUrl";
        static EcpUrl_connect: string = "EcpUrl-connect";
        static EcpUrl_tm: string = "EcpUrl-tm";
        static EcpUrl_tmCreating: string = "EcpUrl-tmCreating";
        static EcpUrl_tmEditing: string = "EcpUrl-tmEditing";
        static EcpUrl_tmHiding: string = "EcpUrl-tmHiding";
        static SiteMailboxCreationURL: string = "SiteMailboxCreationURL";
        static EcpUrl_extinstall: string = "EcpUrl-extinstall";
        static PartnerToken: string = "PartnerToken";
        static PartnerTokenReference: string = "PartnerTokenReference";
        static ServerExclusiveConnect: string = "ServerExclusiveConnect";
        static AutoDiscoverSMTPAddress: string = "AutoDiscoverSMTPAddress";
        static CertPrincipalName: string = "CertPrincipalName";
        static GroupingInformation: string = "GroupingInformation";
        static MailboxSmtpAddress: string = "MailboxSmtpAddress";
        static RuleId: string = "RuleId";
        static Priority: string = "Priority";
        static IsEnabled: string = "IsEnabled";
        static IsNotSupported: string = "IsNotSupported";
        static IsInError: string = "IsInError";
        static Conditions: string = "Conditions";
        static Exceptions: string = "Exceptions";
        static Actions: string = "Actions";
        static InboxRules: string = "InboxRules";
        static Rule: string = "Rule";
        static OutlookRuleBlobExists: string = "OutlookRuleBlobExists";
        static RemoveOutlookRuleBlob: string = "RemoveOutlookRuleBlob";
        static ContainsBodyStrings: string = "ContainsBodyStrings";
        static ContainsHeaderStrings: string = "ContainsHeaderStrings";
        static ContainsRecipientStrings: string = "ContainsRecipientStrings";
        static ContainsSenderStrings: string = "ContainsSenderStrings";
        static ContainsSubjectOrBodyStrings: string = "ContainsSubjectOrBodyStrings";
        static ContainsSubjectStrings: string = "ContainsSubjectStrings";
        static FlaggedForAction: string = "FlaggedForAction";
        static FromAddresses: string = "FromAddresses";
        static FromConnectedAccounts: string = "FromConnectedAccounts";
        static IsApprovalRequest: string = "IsApprovalRequest";
        static IsAutomaticForward: string = "IsAutomaticForward";
        static IsAutomaticReply: string = "IsAutomaticReply";
        static IsEncrypted: string = "IsEncrypted";
        static IsMeetingRequest: string = "IsMeetingRequest";
        static IsMeetingResponse: string = "IsMeetingResponse";
        static IsNDR: string = "IsNDR";
        static IsPermissionControlled: string = "IsPermissionControlled";
        static IsSigned: string = "IsSigned";
        static IsVoicemail: string = "IsVoicemail";
        static IsReadReceipt: string = "IsReadReceipt";
        static MessageClassifications: string = "MessageClassifications";
        static NotSentToMe: string = "NotSentToMe";
        static SentCcMe: string = "SentCcMe";
        static SentOnlyToMe: string = "SentOnlyToMe";
        static SentToAddresses: string = "SentToAddresses";
        static SentToMe: string = "SentToMe";
        static SentToOrCcMe: string = "SentToOrCcMe";
        static WithinDateRange: string = "WithinDateRange";
        static WithinSizeRange: string = "WithinSizeRange";
        static MinimumSize: string = "MinimumSize";
        static MaximumSize: string = "MaximumSize";
        static StartDateTime: string = "StartDateTime";
        static EndDateTime: string = "EndDateTime";
        static AssignCategories: string = "AssignCategories";
        static CopyToFolder: string = "CopyToFolder";
        static FlagMessage: string = "FlagMessage";
        static ForwardAsAttachmentToRecipients: string = "ForwardAsAttachmentToRecipients";
        static ForwardToRecipients: string = "ForwardToRecipients";
        static MarkImportance: string = "MarkImportance";
        static MarkAsRead: string = "MarkAsRead";
        static MoveToFolder: string = "MoveToFolder";
        static PermanentDelete: string = "PermanentDelete";
        static RedirectToRecipients: string = "RedirectToRecipients";
        static SendSMSAlertToRecipients: string = "SendSMSAlertToRecipients";
        static ServerReplyWithMessage: string = "ServerReplyWithMessage";
        static StopProcessingRules: string = "StopProcessingRules";
        static CreateRuleOperation: string = "CreateRuleOperation";
        static SetRuleOperation: string = "SetRuleOperation";
        static DeleteRuleOperation: string = "DeleteRuleOperation";
        static Operations: string = "Operations";
        static RuleOperationErrors: string = "RuleOperationErrors";
        static RuleOperationError: string = "RuleOperationError";
        static OperationIndex: string = "OperationIndex";
        static ValidationErrors: string = "ValidationErrors";
        static FieldValue: string = "FieldValue";
        static Not: string = "Not";
        static Bitmask: string = "Bitmask";
        static Constant: string = "Constant";
        static Restriction: string = "Restriction";
        static Condition: string = "Condition";
        static Contains: string = "Contains";
        static Excludes: string = "Excludes";
        static Exists: string = "Exists";
        static FieldURIOrConstant: string = "FieldURIOrConstant";
        static And: string = "And";
        static Or: string = "Or";
        static IsEqualTo: string = "IsEqualTo";
        static IsNotEqualTo: string = "IsNotEqualTo";
        static IsGreaterThan: string = "IsGreaterThan";
        static IsGreaterThanOrEqualTo: string = "IsGreaterThanOrEqualTo";
        static IsLessThan: string = "IsLessThan";
        static IsLessThanOrEqualTo: string = "IsLessThanOrEqualTo";
        static PhoneticFullName: string = "PhoneticFullName";
        static PhoneticFirstName: string = "PhoneticFirstName";
        static PhoneticLastName: string = "PhoneticLastName";
        static Alias: string = "Alias";
        static Notes: string = "Notes";
        static Photo: string = "Photo";
        static UserSMIMECertificate: string = "UserSMIMECertificate";
        static MSExchangeCertificate: string = "MSExchangeCertificate";
        static DirectoryId: string = "DirectoryId";
        static ManagerMailbox: string = "ManagerMailbox";
        static DirectReports: string = "DirectReports";
        static ResponseMessage: string = "ResponseMessage";
        static ResponseMessages: string = "ResponseMessages";
        static FindConversation: string = "FindConversation";
        static FindConversationResponse: string = "FindConversationResponse";
        static FindConversationResponseMessage: string = "FindConversationResponseMessage";
        static GetConversationItems: string = "GetConversationItems";
        static GetConversationItemsResponse: string = "GetConversationItemsResponse";
        static GetConversationItemsResponseMessage: string = "GetConversationItemsResponseMessage";
        static FindItem: string = "FindItem";
        static FindItemResponse: string = "FindItemResponse";
        static FindItemResponseMessage: string = "FindItemResponseMessage";
        static GetItem: string = "GetItem";
        static GetItemResponse: string = "GetItemResponse";
        static GetItemResponseMessage: string = "GetItemResponseMessage";
        static CreateItem: string = "CreateItem";
        static CreateItemResponse: string = "CreateItemResponse";
        static CreateItemResponseMessage: string = "CreateItemResponseMessage";
        static SendItem: string = "SendItem";
        static SendItemResponse: string = "SendItemResponse";
        static SendItemResponseMessage: string = "SendItemResponseMessage";
        static DeleteItem: string = "DeleteItem";
        static DeleteItemResponse: string = "DeleteItemResponse";
        static DeleteItemResponseMessage: string = "DeleteItemResponseMessage";
        static UpdateItem: string = "UpdateItem";
        static UpdateItemResponse: string = "UpdateItemResponse";
        static UpdateItemResponseMessage: string = "UpdateItemResponseMessage";
        static CopyItem: string = "CopyItem";
        static CopyItemResponse: string = "CopyItemResponse";
        static CopyItemResponseMessage: string = "CopyItemResponseMessage";
        static MoveItem: string = "MoveItem";
        static MoveItemResponse: string = "MoveItemResponse";
        static MoveItemResponseMessage: string = "MoveItemResponseMessage";
        static ArchiveItem: string = "ArchiveItem";
        static ArchiveItemResponse: string = "ArchiveItemResponse";
        static ArchiveItemResponseMessage: string = "ArchiveItemResponseMessage";
        static ArchiveSourceFolderId: string = "ArchiveSourceFolderId";
        static FindFolder: string = "FindFolder";
        static FindFolderResponse: string = "FindFolderResponse";
        static FindFolderResponseMessage: string = "FindFolderResponseMessage";
        static GetFolder: string = "GetFolder";
        static GetFolderResponse: string = "GetFolderResponse";
        static GetFolderResponseMessage: string = "GetFolderResponseMessage";
        static CreateFolder: string = "CreateFolder";
        static CreateFolderResponse: string = "CreateFolderResponse";
        static CreateFolderResponseMessage: string = "CreateFolderResponseMessage";
        static DeleteFolder: string = "DeleteFolder";
        static DeleteFolderResponse: string = "DeleteFolderResponse";
        static DeleteFolderResponseMessage: string = "DeleteFolderResponseMessage";
        static EmptyFolder: string = "EmptyFolder";
        static EmptyFolderResponse: string = "EmptyFolderResponse";
        static EmptyFolderResponseMessage: string = "EmptyFolderResponseMessage";
        static UpdateFolder: string = "UpdateFolder";
        static UpdateFolderResponse: string = "UpdateFolderResponse";
        static UpdateFolderResponseMessage: string = "UpdateFolderResponseMessage";
        static CopyFolder: string = "CopyFolder";
        static CopyFolderResponse: string = "CopyFolderResponse";
        static CopyFolderResponseMessage: string = "CopyFolderResponseMessage";
        static MoveFolder: string = "MoveFolder";
        static MoveFolderResponse: string = "MoveFolderResponse";
        static MoveFolderResponseMessage: string = "MoveFolderResponseMessage";
        static MarkAllItemsAsRead: string = "MarkAllItemsAsRead";
        static MarkAllItemsAsReadResponse: string = "MarkAllItemsAsReadResponse";
        static MarkAllItemsAsReadResponseMessage: string = "MarkAllItemsAsReadResponseMessage";
        static GetAttachment: string = "GetAttachment";
        static GetAttachmentResponse: string = "GetAttachmentResponse";
        static GetAttachmentResponseMessage: string = "GetAttachmentResponseMessage";
        static CreateAttachment: string = "CreateAttachment";
        static CreateAttachmentResponse: string = "CreateAttachmentResponse";
        static CreateAttachmentResponseMessage: string = "CreateAttachmentResponseMessage";
        static DeleteAttachment: string = "DeleteAttachment";
        static DeleteAttachmentResponse: string = "DeleteAttachmentResponse";
        static DeleteAttachmentResponseMessage: string = "DeleteAttachmentResponseMessage";
        static ResolveNames: string = "ResolveNames";
        static ResolveNamesResponse: string = "ResolveNamesResponse";
        static ResolveNamesResponseMessage: string = "ResolveNamesResponseMessage";
        static ExpandDL: string = "ExpandDL";
        static ExpandDLResponse: string = "ExpandDLResponse";
        static ExpandDLResponseMessage: string = "ExpandDLResponseMessage";
        static Subscribe: string = "Subscribe";
        static SubscribeResponse: string = "SubscribeResponse";
        static SubscribeResponseMessage: string = "SubscribeResponseMessage";
        static SubscriptionRequest: string = "SubscriptionRequest";
        static Unsubscribe: string = "Unsubscribe";
        static UnsubscribeResponse: string = "UnsubscribeResponse";
        static UnsubscribeResponseMessage: string = "UnsubscribeResponseMessage";
        static GetEvents: string = "GetEvents";
        static GetEventsResponse: string = "GetEventsResponse";
        static GetEventsResponseMessage: string = "GetEventsResponseMessage";
        static GetStreamingEvents: string = "GetStreamingEvents";
        static GetStreamingEventsResponse: string = "GetStreamingEventsResponse";
        static GetStreamingEventsResponseMessage: string = "GetStreamingEventsResponseMessage";
        static ConnectionStatus: string = "ConnectionStatus";
        static ErrorSubscriptionIds: string = "ErrorSubscriptionIds";
        static ConnectionTimeout: string = "ConnectionTimeout";
        static HeartbeatFrequency: string = "HeartbeatFrequency";
        static SyncFolderItems: string = "SyncFolderItems";
        static SyncFolderItemsResponse: string = "SyncFolderItemsResponse";
        static SyncFolderItemsResponseMessage: string = "SyncFolderItemsResponseMessage";
        static SyncFolderHierarchy: string = "SyncFolderHierarchy";
        static SyncFolderHierarchyResponse: string = "SyncFolderHierarchyResponse";
        static SyncFolderHierarchyResponseMessage: string = "SyncFolderHierarchyResponseMessage";
        static GetUserOofSettingsRequest: string = "GetUserOofSettingsRequest";
        static GetUserOofSettingsResponse: string = "GetUserOofSettingsResponse";
        static SetUserOofSettingsRequest: string = "SetUserOofSettingsRequest";
        static SetUserOofSettingsResponse: string = "SetUserOofSettingsResponse";
        static GetUserAvailabilityRequest: string = "GetUserAvailabilityRequest";
        static GetUserAvailabilityResponse: string = "GetUserAvailabilityResponse";
        static FreeBusyResponseArray: string = "FreeBusyResponseArray";
        static FreeBusyResponse: string = "FreeBusyResponse";
        static SuggestionsResponse: string = "SuggestionsResponse";
        static GetRoomListsRequest: string = "GetRoomLists";
        static GetRoomListsResponse: string = "GetRoomListsResponse";
        static GetRoomsRequest: string = "GetRooms";
        static GetRoomsResponse: string = "GetRoomsResponse";
        static ConvertId: string = "ConvertId";
        static ConvertIdResponse: string = "ConvertIdResponse";
        static ConvertIdResponseMessage: string = "ConvertIdResponseMessage";
        static AddDelegate: string = "AddDelegate";
        static AddDelegateResponse: string = "AddDelegateResponse";
        static DelegateUserResponseMessageType: string = "DelegateUserResponseMessageType";
        static RemoveDelegate: string = "RemoveDelegate";
        static RemoveDelegateResponse: string = "RemoveDelegateResponse";
        static GetDelegate: string = "GetDelegate";
        static GetDelegateResponse: string = "GetDelegateResponse";
        static UpdateDelegate: string = "UpdateDelegate";
        static UpdateDelegateResponse: string = "UpdateDelegateResponse";
        static CreateUserConfiguration: string = "CreateUserConfiguration";
        static CreateUserConfigurationResponse: string = "CreateUserConfigurationResponse";
        static CreateUserConfigurationResponseMessage: string = "CreateUserConfigurationResponseMessage";
        static DeleteUserConfiguration: string = "DeleteUserConfiguration";
        static DeleteUserConfigurationResponse: string = "DeleteUserConfigurationResponse";
        static DeleteUserConfigurationResponseMessage: string = "DeleteUserConfigurationResponseMessage";
        static GetUserConfiguration: string = "GetUserConfiguration";
        static GetUserConfigurationResponse: string = "GetUserConfigurationResponse";
        static GetUserConfigurationResponseMessage: string = "GetUserConfigurationResponseMessage";
        static UpdateUserConfiguration: string = "UpdateUserConfiguration";
        static UpdateUserConfigurationResponse: string = "UpdateUserConfigurationResponse";
        static UpdateUserConfigurationResponseMessage: string = "UpdateUserConfigurationResponseMessage";
        static PlayOnPhone: string = "PlayOnPhone";
        static PlayOnPhoneResponse: string = "PlayOnPhoneResponse";
        static GetPhoneCall: string = "GetPhoneCallInformation";
        static GetPhoneCallResponse: string = "GetPhoneCallInformationResponse";
        static DisconnectPhoneCall: string = "DisconnectPhoneCall";
        static DisconnectPhoneCallResponse: string = "DisconnectPhoneCallResponse";
        static GetServerTimeZones: string = "GetServerTimeZones";
        static GetServerTimeZonesResponse: string = "GetServerTimeZonesResponse";
        static GetServerTimeZonesResponseMessage: string = "GetServerTimeZonesResponseMessage";
        static GetInboxRules: string = "GetInboxRules";
        static GetInboxRulesResponse: string = "GetInboxRulesResponse";
        static UpdateInboxRules: string = "UpdateInboxRules";
        static UpdateInboxRulesResponse: string = "UpdateInboxRulesResponse";
        static ExecuteDiagnosticMethod: string = "ExecuteDiagnosticMethod";
        static ExecuteDiagnosticMethodResponse: string = "ExecuteDiagnosticMethodResponse";
        static ExecuteDiagnosticMethodResponseMEssage: string = "ExecuteDiagnosticMethodResponseMessage";
        static GetPasswordExpirationDateRequest: string = "GetPasswordExpirationDate";
        static GetPasswordExpirationDateResponse: string = "GetPasswordExpirationDateResponse";
        static GetSearchableMailboxes: string = "GetSearchableMailboxes";
        static GetSearchableMailboxesResponse: string = "GetSearchableMailboxesResponse";
        static GetDiscoverySearchConfiguration: string = "GetDiscoverySearchConfiguration";
        static GetDiscoverySearchConfigurationResponse: string = "GetDiscoverySearchConfigurationResponse";
        static GetHoldOnMailboxes: string = "GetHoldOnMailboxes";
        static GetHoldOnMailboxesResponse: string = "GetHoldOnMailboxesResponse";
        static SetHoldOnMailboxes: string = "SetHoldOnMailboxes";
        static SetHoldOnMailboxesResponse: string = "SetHoldOnMailboxesResponse";
        static SearchMailboxes: string = "SearchMailboxes";
        static SearchMailboxesResponse: string = "SearchMailboxesResponse";
        static SearchMailboxesResponseMessage: string = "SearchMailboxesResponseMessage";
        static GetNonIndexableItemDetails: string = "GetNonIndexableItemDetails";
        static GetNonIndexableItemDetailsResponse: string = "GetNonIndexableItemDetailsResponse";
        static GetNonIndexableItemStatistics: string = "GetNonIndexableItemStatistics";
        static GetNonIndexableItemStatisticsResponse: string = "GetNonIndexableItemStatisticsResponse";
        static SearchQueries: string = "SearchQueries";
        static SearchQuery: string = "SearchQuery";
        static MailboxQuery: string = "MailboxQuery";
        static Query: string = "Query";
        static MailboxSearchScopes: string = "MailboxSearchScopes";
        static MailboxSearchScope: string = "MailboxSearchScope";
        static SearchScope: string = "SearchScope";
        static ResultType: string = "ResultType";
        static SortBy: string = "SortBy";
        static Order: string = "Order";
        static Language: string = "Language";
        static Deduplication: string = "Deduplication";
        static PageSize: string = "PageSize";
        static PageItemReference: string = "PageItemReference";
        static PageDirection: string = "PageDirection";
        static PreviewItemResponseShape: string = "PreviewItemResponseShape";
        static ExtendedProperties: string = "ExtendedProperties";
        static PageItemSize: string = "PageItemSize";
        static PageItemCount: string = "PageItemCount";
        static ItemCount: string = "ItemCount";
        static KeywordStats: string = "KeywordStats";
        static KeywordStat: string = "KeywordStat";
        static Keyword: string = "Keyword";
        static ItemHits: string = "ItemHits";
        static SearchPreviewItem: string = "SearchPreviewItem";
        static ChangeKey: string = "ChangeKey";
        static ParentId: string = "ParentId";
        static MailboxId: string = "MailboxId";
        static UniqueHash: string = "UniqueHash";
        static SortValue: string = "SortValue";
        static OwaLink: string = "OwaLink";
        static SmtpAddress: string = "SmtpAddress";
        static CreatedTime: string = "CreatedTime";
        static ReceivedTime: string = "ReceivedTime";
        static SentTime: string = "SentTime";
        static Preview: string = "Preview";
        static HasAttachment: string = "HasAttachment";
        static FailedMailboxes: string = "FailedMailboxes";
        static FailedMailbox: string = "FailedMailbox";
        static Token: string = "Token";
        static Refiners: string = "Refiners";
        static Refiner: string = "Refiner";
        static MailboxStats: string = "MailboxStats";
        static MailboxStat: string = "MailboxStat";
        static HoldId: string = "HoldId";
        static ActionType: string = "ActionType";
        static Mailboxes: string = "Mailboxes";
        static SearchFilter: string = "SearchFilter";
        static ReferenceId: string = "ReferenceId";
        static IsMembershipGroup: string = "IsMembershipGroup";
        static ExpandGroupMembership: string = "ExpandGroupMembership";
        static SearchableMailboxes: string = "SearchableMailboxes";
        static SearchableMailbox: string = "SearchableMailbox";
        static SearchMailboxesResult: string = "SearchMailboxesResult";
        static MailboxHoldResult: string = "MailboxHoldResult";
        static Statuses: string = "Statuses";
        static MailboxHoldStatuses: string = "MailboxHoldStatuses";
        static MailboxHoldStatus: string = "MailboxHoldStatus";
        static AdditionalInfo: string = "AdditionalInfo";
        static NonIndexableItemDetail: string = "NonIndexableItemDetail";
        static NonIndexableItemStatistic: string = "NonIndexableItemStatistic";
        static NonIndexableItemDetails: string = "NonIndexableItemDetails";
        static NonIndexableItemStatistics: string = "NonIndexableItemStatistics";
        static NonIndexableItemDetailsResult: string = "NonIndexableItemDetailsResult";
        static SearchArchiveOnly: string = "SearchArchiveOnly";
        static ErrorDescription: string = "ErrorDescription";
        static IsPartiallyIndexed: string = "IsPartiallyIndexed";
        static IsPermanentFailure: string = "IsPermanentFailure";
        static AttemptCount: string = "AttemptCount";
        static LastAttemptTime: string = "LastAttemptTime";
        static SearchId: string = "SearchId";
        static DiscoverySearchConfigurations: string = "DiscoverySearchConfigurations";
        static DiscoverySearchConfiguration: string = "DiscoverySearchConfiguration";
        static InPlaceHoldConfigurationOnly: string = "InPlaceHoldConfigurationOnly";
        static InPlaceHoldIdentity: string = "InPlaceHoldIdentity";
        static ItemHoldPeriod: string = "ItemHoldPeriod";
        static ManagedByOrganization: string = "ManagedByOrganization";
        static IsExternalMailbox: string = "IsExternalMailbox";
        static ExternalEmailAddress: string = "ExternalEmailAddress";
        static ExtendedAttributes: string = "ExtendedAttributes";
        static ExtendedAttribute: string = "ExtendedAttribute";
        static ExtendedAttributeName: string = "Name";
        static ExtendedAttributeValue: string = "Value";
        static SearchScopeType: string = "SearchScopeType";
        static GetAppManifestsRequest: string = "GetAppManifests";
        static GetAppManifestsResponse: string = "GetAppManifestsResponse";
        static Manifests: string = "Manifests";
        static Manifest: string = "Manifest";
        static Apps: string = "Apps";
        static App: string = "App";
        static Metadata: string = "Metadata";
        static ActionUrl: string = "ActionUrl";
        static AppStatus: string = "AppStatus";
        static EndNodeUrl: string = "EndNodeUrl";
        static GetClientExtensionRequest: string = "GetClientExtension";
        static ClientExtensionUserRequest: string = "UserParameters";
        static ClientExtensionUserEnabled: string = "UserEnabledExtensions";
        static ClientExtensionUserDisabled: string = "UserDisabledExtensions";
        static ClientExtensionRequestedIds: string = "RequestedExtensionIds";
        static ClientExtensionIsDebug: string = "IsDebug";
        static ClientExtensionRawMasterTableXml: string = "RawMasterTableXml";
        static GetClientExtensionResponse: string = "GetClientExtensionResponse";
        static ClientExtensionSpecificUsers: string = "SpecificUsers";
        static ClientExtensions: string = "ClientExtensions";
        static ClientExtension: string = "ClientExtension";
        static SetClientExtensionRequest: string = "SetClientExtension";
        static SetClientExtensionActions: string = "Actions";
        static SetClientExtensionAction: string = "Action";
        static SetClientExtensionResponse: string = "SetClientExtensionResponse";
        static SetClientExtensionResponseMessage: string = "SetClientExtensionResponseMessage";
        static GetEncryptionConfigurationRequest: string = "GetEncryptionConfiguration";
        static SetEncryptionConfigurationRequest: string = "SetEncryptionConfiguration";
        static EncryptionConfigurationImageBase64: string = "ImageBase64";
        static EncryptionConfigurationEmailText: string = "EmailText";
        static EncryptionConfigurationPortalText: string = "PortalText";
        static EncryptionConfigurationDisclaimerText: string = "DisclaimerText";
        static GetEncryptionConfigurationResponse: string = "GetEncryptionConfigurationResponse";
        static SetEncryptionConfigurationResponse: string = "SetEncryptionConfigurationResponse";
        static InstallAppRequest: string = "InstallApp";
        static InstallAppResponse: string = "InstallAppResponse";
        static UninstallAppRequest: string = "UninstallApp";
        static UninstallAppResponse: string = "UninstallAppResponse";
        static DisableAppRequest: string = "DisableApp";
        static DisableAppResponse: string = "DisableAppResponse";
        static GetAppMarketplaceUrlRequest: string = "GetAppMarketplaceUrl";
        static GetAppMarketplaceUrlResponse: string = "GetAppMarketplaceUrlResponse";
        static GetUserRetentionPolicyTags: string = "GetUserRetentionPolicyTags";
        static GetUserRetentionPolicyTagsResponse: string = "GetUserRetentionPolicyTagsResponse";
        static RetentionPolicyTags: string = "RetentionPolicyTags";
        static RetentionPolicyTag: string = "RetentionPolicyTag";
        static RetentionId: string = "RetentionId";
        static RetentionPeriod: string = "RetentionPeriod";
        static RetentionAction: string = "RetentionAction";
        static Description: string = "Description";
        static IsVisible: string = "IsVisible";
        static OptedInto: string = "OptedInto";
        static IsArchive: string = "IsArchive";
        static SOAPEnvelopeElementName: string = "Envelope";
        static SOAPHeaderElementName: string = "Header";
        static SOAPBodyElementName: string = "Body";
        static SOAPFaultElementName: string = "Fault";
        static SOAPFaultCodeElementName: string = "faultcode";
        static SOAPFaultStringElementName: string = "faultstring";
        static SOAPFaultActorElementName: string = "faultactor";
        static SOAPDetailElementName: string = "detail";
        static EwsResponseCodeElementName: string = "ResponseCode";
        static EwsMessageElementName: string = "Message";
        static EwsLineElementName: string = "Line";
        static EwsPositionElementName: string = "Position";
        static EwsErrorCodeElementName: string = "ErrorCode";
        static EwsExceptionTypeElementName: string = "ExceptionType";
        constructor() {
            super();
        }
    }
    class ServiceRequestBase {
        private static XMLSchemaNamespace: string = "http://www.w3.org/2001/XMLSchema";
        private static XMLSchemaInstanceNamespace: string = "http://www.w3.org/2001/XMLSchema-instance";
        private static ClientStatisticsRequestHeader: string = "X-ClientStatistics";
        private static RequestIdResponseHeaders: string[] = [
            "RequestId", "request-id"
        ];
        private static clientStatisticsCache: List<string> = new List<string>();
        private service: ExchangeService = null;
        get EmitTimeZoneHeader(): boolean {
            return false;
        }
        get Service(): ExchangeService {
            return this.service;
        }
        static GetResponseStream(response: IEwsHttpWebResponse): Stream;
        static GetResponseStream(response: IEwsHttpWebResponse, readTimeout: number): Stream;
        static GetResponseStream(response: IEwsHttpWebResponse, readTimeout?: number): Stream {
            if (arguments.length === 1) {
                return ServiceRequestBase.GetResponseStream_0(response);
            }
            return ServiceRequestBase.GetResponseStream_1(response, readTimeout);
        }
        private static GetResponseStream_0(response: IEwsHttpWebResponse): Stream {
            var arg_06_0: string = response.ContentEncoding;
            var responseStream: Stream = response.GetResponseStream();
            return ServiceRequestBase.WrapStream(responseStream, response.ContentEncoding);
        }
        private static GetResponseStream_1(response: IEwsHttpWebResponse, readTimeout: number): Stream {
            var responseStream: Stream = response.GetResponseStream();
            responseStream.ReadTimeout = readTimeout;
            return ServiceRequestBase.WrapStream(responseStream, response.ContentEncoding);
        }
        private static WrapStream(responseStream: Stream, contentEncoding: string): Stream {
            if (NString.Contains(NString.ToLowerInvariant(contentEncoding), "gzip")) {
                return new GZipStream(responseStream, CompressionMode.Decompress);
            }
            if (NString.Contains(NString.ToLowerInvariant(contentEncoding), "deflate")) {
                return new DeflateStream(responseStream, CompressionMode.Decompress);
            }
            return responseStream;
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetResponseXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            throw new NotSupportedException();
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var serviceResponse: ServiceResponse = new ServiceResponse();
            serviceResponse.LoadFromJson(jsonBody, this.Service);
            return serviceResponse;
        }
        Validate(): void {
            this.Service.Validate();
        }
        WriteBodyToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, this.GetXmlElementName());
            this.WriteAttributesToXml(writer);
            this.WriteElementsToXml(writer);
            writer.WriteEndElement();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
        }
        constructor(service: ExchangeService) {
            super();
            this.service = service;
            this.ThrowIfNotSupportedByRequestedServerVersion();
        }
        ThrowIfNotSupportedByRequestedServerVersion(): void {
            if (this.Service.RequestedServerVersion < this.GetMinimumRequiredServerVersion()) {
                throw new ServiceVersionException(NString.Format(Strings.RequestIncompatibleWithRequestVersion, this.GetXmlElementName(), this.GetMinimumRequiredServerVersion()));
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Soap, "Envelope");
            writer.WriteAttributeValue("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance");
            writer.WriteAttributeValue("xmlns", "m", "http://schemas.microsoft.com/exchange/services/2006/messages");
            writer.WriteAttributeValue("xmlns", "t", "http://schemas.microsoft.com/exchange/services/2006/types");
            if (writer.RequireWSSecurityUtilityNamespace) {
                writer.WriteAttributeValue("xmlns", "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
            }
            writer.WriteStartElement(XmlNamespace.Soap, "Header");
            if (this.Service.Credentials !== null) {
                this.Service.Credentials.EmitExtraSoapHeaderNamespaceAliases(writer.InternalWriter);
            }
            if (!this.Service.SuppressXmlVersionHeader) {
                writer.WriteStartElement(XmlNamespace.Types, "RequestServerVersion");
                writer.WriteAttributeValue("Version", this.GetRequestedServiceVersionString());
                writer.WriteEndElement();
            }
            if ((this.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1 || this.EmitTimeZoneHeader) && !this.Service.Exchange2007CompatibilityMode) {
                writer.WriteStartElement(XmlNamespace.Types, "TimeZoneContext");
                this.Service.TimeZoneDefinition.WriteToXml(writer);
                writer.WriteEndElement();
                writer.IsTimeZoneHeaderEmitted = true;
            }
            if (this.Service.PreferredCulture !== null) {
                writer.WriteElementValue(XmlNamespace.Types, "MailboxCulture", this.Service.PreferredCulture.Name);
            }
            if (this.Service.DateTimePrecision !== DateTimePrecision.Default) {
                writer.WriteElementValue(XmlNamespace.Types, "DateTimePrecision", DateTimePrecision[this.Service.DateTimePrecision]);
            }
            if (this.Service.ImpersonatedUserId !== null) {
                this.Service.ImpersonatedUserId.WriteToXml(writer);
            }
            else {
                if (this.Service.PrivilegedUserId !== null) {
                    this.Service.PrivilegedUserId.WriteToXml(writer, this.Service.RequestedServerVersion);
                }
                else {
                    if (this.Service.ManagementRoles !== null) {
                        this.Service.ManagementRoles.WriteToXml(writer);
                    }
                }
            }
            if (this.Service.Credentials !== null) {
                this.Service.Credentials.SerializeExtraSoapHeaders(writer.InternalWriter, this.GetXmlElementName());
            }
            this.Service.DoOnSerializeCustomSoapHeaders(writer.InternalWriter);
            writer.WriteEndElement();
            writer.WriteStartElement(XmlNamespace.Soap, "Body");
            this.WriteBodyToXml(writer);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
        CreateJsonRequest(): JsonObject {
            var jsonSerializable: IJsonSerializable = ((this instanceof IJsonSerializable) ? <IJsonSerializable>this : null);
            if (jsonSerializable === null) {
                throw new JsonSerializationNotImplementedException();
            }
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Header", this.CreateJsonHeaders());
            jsonObject.Add("Body", jsonSerializable.ToJson(this.service));
            return jsonObject;
        }
        private CreateJsonHeaders(): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("RequestServerVersion", this.GetRequestedServiceVersionString());
            if ((this.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1 || this.EmitTimeZoneHeader) && !this.Service.Exchange2007CompatibilityMode) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("TimeZoneDefinition", this.Service.TimeZoneDefinition.InternalToJson(this.Service));
                jsonObject.Add("TimeZoneContext", jsonObject2);
            }
            if (this.Service.PreferredCulture !== null) {
                jsonObject.Add("MailboxCulture", this.Service.PreferredCulture.Name);
            }
            if (this.Service.DateTimePrecision !== DateTimePrecision.Default) {
                jsonObject.Add("DateTimePrecision", DateTimePrecision[this.Service.DateTimePrecision]);
            }
            if (this.Service.ManagementRoles !== null) {
                jsonObject.Add("ManagementRole", this.Service.ManagementRoles.ToJsonObject());
            }
            return jsonObject;
        }
        private GetRequestedServiceVersionString(): string {
            if (this.Service.Exchange2007CompatibilityMode && this.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                return "Exchange2007";
            }
            return ExchangeVersion[this.Service.RequestedServerVersion];
        }
        private EmitRequest(request: IEwsHttpWebRequest): void {
            if (this.Service.RenderingMethod === ExchangeService_RenderingMode.Xml) {
                var webRequestStream: Stream = this.GetWebRequestStream(request);
                try {
                    var ewsServiceXmlWriter: EwsServiceXmlWriter = new EwsServiceXmlWriter(this.Service, webRequestStream);
                    try {
                        this.WriteToXml(ewsServiceXmlWriter);
                    }
                    finally {
                        if (ewsServiceXmlWriter !== null) {
                            (<IDisposable>ewsServiceXmlWriter).Dispose();
                        }
                    }
                    return;
                }
                finally {
                    if (webRequestStream !== null) {
                        (<IDisposable>webRequestStream).Dispose();
                    }
                }
            }
            if (this.Service.RenderingMethod === ExchangeService_RenderingMode.JSON) {
                var jsonObject: JsonObject = this.CreateJsonRequest();
                var webRequestStream2: Stream = this.GetWebRequestStream(request);
                try {
                    jsonObject.SerializeToJson(webRequestStream2);
                }
                finally {
                    if (webRequestStream2 !== null) {
                        (<IDisposable>webRequestStream2).Dispose();
                    }
                }
            }
        }
        private TraceAndEmitRequest(request: IEwsHttpWebRequest, needSignature: boolean, needTrace: boolean): void {
            if (this.service.RenderingMethod === ExchangeService_RenderingMode.Xml) {
                var memoryStream: MemoryStream = new MemoryStream();
                try {
                    var ewsServiceXmlWriter: EwsServiceXmlWriter = new EwsServiceXmlWriter(this.Service, memoryStream);
                    try {
                        ewsServiceXmlWriter.RequireWSSecurityUtilityNamespace = needSignature;
                        this.WriteToXml(ewsServiceXmlWriter);
                    }
                    finally {
                        if (ewsServiceXmlWriter !== null) {
                            (<IDisposable>ewsServiceXmlWriter).Dispose();
                        }
                    }
                    if (needSignature) {
                        this.service.Credentials.Sign(memoryStream);
                    }
                    if (needTrace) {
                        this.TraceXmlRequest(memoryStream);
                    }
                    var webRequestStream: Stream = this.GetWebRequestStream(request);
                    try {
                        EwsUtilities.CopyStream(memoryStream, webRequestStream);
                    }
                    finally {
                        if (webRequestStream !== null) {
                            (<IDisposable>webRequestStream).Dispose();
                        }
                    }
                    return;
                }
                finally {
                    if (memoryStream !== null) {
                        (<IDisposable>memoryStream).Dispose();
                    }
                }
            }
            if (this.service.RenderingMethod === ExchangeService_RenderingMode.JSON) {
                var jsonObject: JsonObject = this.CreateJsonRequest();
                this.TraceJsonRequest(jsonObject);
                var webRequestStream2: Stream = this.GetWebRequestStream(request);
                try {
                    jsonObject.SerializeToJson(webRequestStream2);
                }
                finally {
                    if (webRequestStream2 !== null) {
                        (<IDisposable>webRequestStream2).Dispose();
                    }
                }
            }
        }
        private GetWebRequestStream(request: IEwsHttpWebRequest): Stream {
            return request.EndGetRequestStream(request.BeginGetRequestStream(null, null));
        }
        ReadResponse(ewsXmlReader: EwsServiceXmlReader): any {
            this.ReadPreamble(ewsXmlReader);
            ewsXmlReader.ReadStartElement(XmlNamespace.Soap, "Envelope");
            this.ReadSoapHeader(ewsXmlReader);
            ewsXmlReader.ReadStartElement(XmlNamespace.Soap, "Body");
            ewsXmlReader.ReadStartElement(XmlNamespace.Messages, this.GetResponseXmlElementName());
            var result: any = this.ParseResponse(ewsXmlReader);
            ewsXmlReader.ReadEndElementIfNecessary(XmlNamespace.Messages, this.GetResponseXmlElementName());
            ewsXmlReader.ReadEndElement(XmlNamespace.Soap, "Body");
            ewsXmlReader.ReadEndElement(XmlNamespace.Soap, "Envelope");
            return result;
        }
        BuildResponseObjectFromJson(jsonResponse: JsonObject): any {
            if (jsonResponse.ContainsKey("Header")) {
                this.ReadSoapHeader(jsonResponse.ReadAsJsonObject("Header"));
            }
            return this.ParseResponse(jsonResponse.ReadAsJsonObject("Body"));
        }
        ReadPreamble(ewsXmlReader: EwsServiceXmlReader): void {
            this.ReadXmlDeclaration(ewsXmlReader);
        }
        private ReadSoapHeader(reader: EwsServiceXmlReader): void;
        private ReadSoapHeader(jsonHeader: JsonObject): void;
        private ReadSoapHeader(readerOrJsonHeader: any): void {
            if (arguments.length === 1 && (readerOrJsonHeader === null || readerOrJsonHeader instanceof EwsServiceXmlReader)) {
                this.ReadSoapHeader_0(readerOrJsonHeader);
                return;
            }
            this.ReadSoapHeader_1(readerOrJsonHeader);
        }
        private ReadSoapHeader_0(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Soap, "Header");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "ServerVersionInfo")) {
                    this.Service.ServerInfo = ExchangeServerInfo.Parse(reader);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Soap, "Header"));
        }
        private ReadSoapHeader_1(jsonHeader: JsonObject): void {
            if (jsonHeader.ContainsKey("ServerVersionInfo")) {
                this.Service.ServerInfo = ExchangeServerInfo.Parse(jsonHeader.ReadAsJsonObject("ServerVersionInfo"));
            }
        }
        ReadSoapFault(reader: EwsServiceXmlReader): SoapFaultDetails;
        ReadSoapFault(jsonSoapFault: JsonObject): SoapFaultDetails;
        ReadSoapFault(readerOrJsonSoapFault: any): SoapFaultDetails {
            if (arguments.length === 1 && (readerOrJsonSoapFault === null || readerOrJsonSoapFault instanceof EwsServiceXmlReader)) {
                return this.ReadSoapFault_0(readerOrJsonSoapFault);
            }
            return this.ReadSoapFault_1(readerOrJsonSoapFault);
        }
        private ReadSoapFault_0(reader: EwsServiceXmlReader): SoapFaultDetails {
            var soapFaultDetails: SoapFaultDetails = null;
            try {
                this.ReadXmlDeclaration(reader);
                reader.Read();
                if (!reader.IsStartElement() || reader.LocalName !== "Envelope") {
                    var result: SoapFaultDetails = soapFaultDetails;
                    return result;
                }
                var namespaceFromUri: XmlNamespace = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
                if (namespaceFromUri === XmlNamespace.NotSpecified) {
                    var result: SoapFaultDetails = soapFaultDetails;
                    return result;
                }
                reader.Read();
                if (reader.IsStartElement(namespaceFromUri, "Header")) {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "ServerVersionInfo")) {
                            this.Service.ServerInfo = ExchangeServerInfo.Parse(reader);
                        }
                    }
                    while (!reader.IsEndElement(namespaceFromUri, "Header"));
                    reader.Read();
                }
                if (reader.IsStartElement(namespaceFromUri, "Body")) {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(namespaceFromUri, "Fault")) {
                            soapFaultDetails = SoapFaultDetails.Parse(reader, namespaceFromUri);
                        }
                    }
                    while (!reader.IsEndElement(namespaceFromUri, "Body"));
                }
                reader.ReadEndElement(namespaceFromUri, "Envelope");
            }
            catch (ex_D9) {
                if (ex_D9 instanceof XmlException) {
                }
                else
                    throw ex_D9;
            }
            return soapFaultDetails;
        }
        private ReadSoapFault_1(jsonSoapFault: JsonObject): SoapFaultDetails {
            var result: SoapFaultDetails = null;
            if (jsonSoapFault.ContainsKey("Header")) {
                this.ReadSoapHeader(jsonSoapFault.ReadAsJsonObject("Header"));
            }
            if (jsonSoapFault.ContainsKey("Body")) {
                result = SoapFaultDetails.Parse(jsonSoapFault.ReadAsJsonObject("Body"));
            }
            return result;
        }
        ValidateAndEmitRequest(request: IEwsHttpWebRequest[]): IEwsHttpWebResponse {
            this.Validate();
            request[0] = this.BuildEwsHttpWebRequest();
            if (this.service.SendClientLatencies) {
                var text: string = null;
                var obj: List<string>;
                Monitor.Enter(obj = ServiceRequestBase.clientStatisticsCache);
                try {
                    if (ServiceRequestBase.clientStatisticsCache.Count > 0) {
                        text = ServiceRequestBase.clientStatisticsCache.get_Item(0);
                        ServiceRequestBase.clientStatisticsCache.RemoveAt(0);
                    }
                }
                finally {
                    Monitor.Exit(obj);
                }
                if (!NString.IsNullOrEmpty(text)) {
                    if (request[0].Headers.get_Item("X-ClientStatistics") !== null) {
                        request[0].Headers.set_Item("X-ClientStatistics", request[0].Headers.get_Item("X-ClientStatistics") + text);
                    }
                    else {
                        request[0].Headers.Add("X-ClientStatistics", text);
                    }
                }
            }
            var utcNow: DateTime = DateTime.UtcNow;
            var ewsHttpWebResponse: IEwsHttpWebResponse = null;
            try {
                ewsHttpWebResponse = this.GetEwsHttpWebResponse(request[0]);
            }
            finally {
                if (this.service.SendClientLatencies) {
                    var value: number = <number>DateTime.op_Subtraction(DateTime.UtcNow, utcNow).TotalMilliseconds;
                    var value2: string = NString.Empty;
                    var value3: string = NString.Replace(super.GetType().Name, "Request", NString.Empty);
                    if (ewsHttpWebResponse !== null && ewsHttpWebResponse.Headers !== null) {
                        var requestIdResponseHeaders: string[] = ServiceRequestBase.RequestIdResponseHeaders;
                        for (var i: number = 0; i < requestIdResponseHeaders.length; i = i + 1) {
                            var name: string = requestIdResponseHeaders[i];
                            var text2: string = ewsHttpWebResponse.Headers.Get(name);
                            if (!NString.IsNullOrEmpty(text2)) {
                                value2 = text2;
                                break;
                            }
                        }
                    }
                    var stringBuilder: StringBuilder = new StringBuilder();
                    stringBuilder.Append("MessageId=");
                    stringBuilder.Append(value2);
                    stringBuilder.Append(",ResponseTime=");
                    stringBuilder.Append(value);
                    stringBuilder.Append(",SoapAction=");
                    stringBuilder.Append(value3);
                    stringBuilder.Append(";");
                    var obj2: List<string>;
                    Monitor.Enter(obj2 = ServiceRequestBase.clientStatisticsCache);
                    try {
                        ServiceRequestBase.clientStatisticsCache.Add(stringBuilder.ToString());
                    }
                    finally {
                        Monitor.Exit(obj2);
                    }
                }
            }
            return ewsHttpWebResponse;
        }
        BuildEwsHttpWebRequest(): IEwsHttpWebRequest {
            var result: IEwsHttpWebRequest;
            try {
                var ewsHttpWebRequest: IEwsHttpWebRequest = this.Service.PrepareHttpWebRequest(this.GetXmlElementName());
                this.Service.TraceHttpRequestHeaders(TraceFlags.EwsRequestHttpHeaders, ewsHttpWebRequest);
                var flag: boolean = this.Service.Credentials !== null && this.Service.Credentials.NeedSignature;
                var flag2: boolean = this.Service.IsTraceEnabledFor(TraceFlags.EwsRequest);
                if (flag || flag2) {
                    this.TraceAndEmitRequest(ewsHttpWebRequest, flag, flag2);
                }
                else {
                    this.EmitRequest(ewsHttpWebRequest);
                }
                result = ewsHttpWebRequest;
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Status === WebExceptionStatus.ProtocolError && ex.Response !== null) {
                        this.ProcessWebException(ex);
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    if (ex instanceof IOException) {
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                    }
                    else
                        throw ex;
            }
            return result;
        }
        GetEwsHttpWebResponse(request: IEwsHttpWebRequest): IEwsHttpWebResponse {
            var response: IEwsHttpWebResponse;
            try {
                response = request.GetResponse();
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Status === WebExceptionStatus.ProtocolError && ex.Response !== null) {
                        this.ProcessWebException(ex);
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    if (ex instanceof IOException) {
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                    }
                    else
                        throw ex;
            }
            return response;
        }
        EndGetEwsHttpWebResponse(request: IEwsHttpWebRequest, asyncResult: IAsyncResult): IEwsHttpWebResponse {
            var result: IEwsHttpWebResponse;
            try {
                result = request.EndGetResponse(asyncResult);
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Status === WebExceptionStatus.ProtocolError && ex.Response !== null) {
                        this.ProcessWebException(ex);
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    if (ex instanceof IOException) {
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                    }
                    else
                        throw ex;
            }
            return result;
        }
        private ProcessWebException(webException: WebException): void {
            if (webException.Response !== null) {
                var ewsHttpWebResponse: IEwsHttpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(webException);
                var soapFaultDetails: SoapFaultDetails = null;
                if (ewsHttpWebResponse.StatusCode === HttpStatusCode.InternalServerError) {
                    this.Service.ProcessHttpResponseHeaders(TraceFlags.EwsResponseHttpHeaders, ewsHttpWebResponse);
                    if (this.Service.IsTraceEnabledFor(TraceFlags.EwsResponse)) {
                        var memoryStream: MemoryStream = new MemoryStream();
                        try {
                            var responseStream: Stream = ServiceRequestBase.GetResponseStream(ewsHttpWebResponse);
                            try {
                                EwsUtilities.CopyStream(responseStream, memoryStream);
                                memoryStream.Position = 0;
                            }
                            finally {
                                if (responseStream !== null) {
                                    (<IDisposable>responseStream).Dispose();
                                }
                            }
                            if (this.Service.RenderingMethod !== ExchangeService_RenderingMode.Xml) {
                                if (this.Service.RenderingMethod === ExchangeService_RenderingMode.JSON) {
                                    this.TraceResponseJson(ewsHttpWebResponse, memoryStream);
                                    try {
                                        var jsonSoapFault: JsonObject = new JsonParser(memoryStream).Parse();
                                        soapFaultDetails = this.ReadSoapFault(jsonSoapFault);
                                        goto IL_DC;
                                    }
                                    catch (ex_D3) {
                                        if (ex_D3 instanceof ServiceJsonDeserializationException) {
                                            goto IL_DC;
                                        }
                                        else
                                            throw ex_D3;
                                    }
                                }
                                throw new InvalidOperationException();
                            }
                            this.TraceResponseXml(ewsHttpWebResponse, memoryStream);
                            var reader: EwsServiceXmlReader = new EwsServiceXmlReader(memoryStream, this.Service);
                            soapFaultDetails = this.ReadSoapFault(reader);
                            IL_DC:
                            goto IL_155;
                        }
                        finally {
                            if (memoryStream !== null) {
                                (<IDisposable>memoryStream).Dispose();
                            }
                        }
                    }
                    var responseStream2: Stream = ServiceRequestBase.GetResponseStream(ewsHttpWebResponse);
                    try {
                        if (this.Service.RenderingMethod !== ExchangeService_RenderingMode.Xml) {
                            if (this.Service.RenderingMethod === ExchangeService_RenderingMode.JSON) {
                                try {
                                    var jsonSoapFault2: JsonObject = new JsonParser(responseStream2).Parse();
                                    soapFaultDetails = this.ReadSoapFault(jsonSoapFault2);
                                    goto IL_147;
                                }
                                catch (ex_13E) {
                                    if (ex_13E instanceof ServiceJsonDeserializationException) {
                                        goto IL_147;
                                    }
                                    else
                                        throw ex_13E;
                                }
                            }
                            throw new InvalidOperationException();
                        }
                        var reader2: EwsServiceXmlReader = new EwsServiceXmlReader(responseStream2, this.Service);
                        soapFaultDetails = this.ReadSoapFault(reader2);
                        IL_147: ;
                    }
                    finally {
                        if (responseStream2 !== null) {
                            (<IDisposable>responseStream2).Dispose();
                        }
                    }
                    IL_155:
                    if (soapFaultDetails !== null) {
                        var responseCode: ServiceError = soapFaultDetails.ResponseCode;
                        if (responseCode <= ServiceError.ErrorInvalidServerVersion) {
                            if (responseCode !== ServiceError.ErrorIncorrectSchemaVersion) {
                                if (responseCode === ServiceError.ErrorInvalidServerVersion) {
                                    throw new ServiceVersionException(Strings.ServerVersionNotSupported);
                                }
                            }
                            else {
                                EwsUtilities.Assert(false, "ServiceRequestBase.ProcessWebException", "Exchange server supports requested version but request was invalid for that version");
                            }
                        }
                        else {
                            if (responseCode !== ServiceError.ErrorSchemaValidation) {
                                if (responseCode === ServiceError.ErrorServerBusy) {
                                    throw new ServerBusyException(new ServiceResponse(soapFaultDetails));
                                }
                            }
                            else {
                                if (this.Service.ServerInfo !== null && this.Service.ServerInfo.MajorVersion === 8 && this.Service.ServerInfo.MinorVersion === 0) {
                                    throw new ServiceVersionException(Strings.ServerVersionNotSupported);
                                }
                            }
                        }
                        throw new ServiceResponseException(new ServiceResponse(soapFaultDetails));
                    }
                }
                else {
                    this.Service.ProcessHttpErrorResponse(ewsHttpWebResponse, webException);
                }
            }
        }
        TraceXmlRequest(memoryStream: MemoryStream): void {
            this.Service.TraceXml(TraceFlags.EwsRequest, memoryStream);
        }
        TraceJsonRequest(requestObject: JsonObject): void {
            var memoryStream: MemoryStream = new MemoryStream();
            try {
                requestObject.SerializeToJson(memoryStream, this.Service.TraceEnablePrettyPrinting);
                memoryStream.Position = 0;
                var streamReader: StreamReader = new StreamReader(memoryStream);
                try {
                    this.Service.TraceMessage(TraceFlags.EwsRequest, streamReader.ReadToEnd());
                }
                finally {
                    if (streamReader !== null) {
                        (<IDisposable>streamReader).Dispose();
                    }
                }
            }
            finally {
                if (memoryStream !== null) {
                    (<IDisposable>memoryStream).Dispose();
                }
            }
        }
        TraceResponseXml(response: IEwsHttpWebResponse, memoryStream: MemoryStream): void {
            if (!NString.IsNullOrEmpty(response.ContentType) && (NString.StartsWith(response.ContentType, "text/", StringComparison.OrdinalIgnoreCase) || NString.StartsWith(response.ContentType, "application/soap", StringComparison.OrdinalIgnoreCase))) {
                this.Service.TraceXml(TraceFlags.EwsResponse, memoryStream);
                return;
            }
            this.Service.TraceMessage(TraceFlags.EwsResponse, "Non-textual response");
        }
        TraceResponseJson(response: IEwsHttpWebResponse, memoryStream: MemoryStream): void {
            var jsonObject: JsonObject = new JsonParser(memoryStream).Parse();
            var memoryStream2: MemoryStream = new MemoryStream();
            try {
                jsonObject.SerializeToJson(memoryStream2, this.Service.TraceEnablePrettyPrinting);
                memoryStream2.Position = 0;
                var streamReader: StreamReader = new StreamReader(memoryStream2);
                try {
                    this.Service.TraceMessage(TraceFlags.EwsResponse, streamReader.ReadToEnd());
                }
                finally {
                    if (streamReader !== null) {
                        (<IDisposable>streamReader).Dispose();
                    }
                }
            }
            finally {
                if (memoryStream2 !== null) {
                    (<IDisposable>memoryStream2).Dispose();
                }
            }
            memoryStream.Seek(0, SeekOrigin.Begin);
        }
        private ReadXmlDeclaration(reader: EwsServiceXmlReader): void {
            try {
                reader.Read(17);
            }
            catch (innerException) {
                if (innerException instanceof XmlException) {
                    throw new ServiceRequestException(Strings.ServiceResponseDoesNotContainXml, innerException);
                }
                else
                    if (innerException instanceof ServiceXmlDeserializationException) {
                        throw new ServiceRequestException(Strings.ServiceResponseDoesNotContainXml, innerException2);
                    }
                    else
                        throw innerException;
            }
        }
    }
    class SimpleServiceRequestBase extends ServiceRequestBase {
        constructor(service: ExchangeService) {
            super(service);
        }
        InternalExecute(): any {
            var ewsHttpWebRequest: IEwsHttpWebRequest;
            var response: IEwsHttpWebResponse = (() => {
                var _p0 = [
                    ewsHttpWebRequest
                ];
                var _r = super.ValidateAndEmitRequest(_p0);
                ewsHttpWebRequest = _p0[0];
                return _r;
            })();
            return this.ReadResponse(response);
        }
        EndInternalExecute(asyncResult: IAsyncResult): any {
            var asyncRequestResult: AsyncRequestResult = <AsyncRequestResult>asyncResult;
            var response: IEwsHttpWebResponse = super.EndGetEwsHttpWebResponse(asyncRequestResult.WebRequest, asyncRequestResult.WebAsyncResult);
            return this.ReadResponse(response);
        }
        BeginExecute(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            this.Validate();
            var ewsHttpWebRequest: IEwsHttpWebRequest = super.BuildEwsHttpWebRequest();
            var state2: WebAsyncCallStateAnchor = new WebAsyncCallStateAnchor(this, ewsHttpWebRequest, callback, state);
            var webAsyncResult: IAsyncResult = ewsHttpWebRequest.BeginGetResponse(SimpleServiceRequestBase.WebRequestAsyncCallback, state2);
            return new AsyncRequestResult(this, ewsHttpWebRequest, webAsyncResult, state);
        }
        private static WebRequestAsyncCallback(webAsyncResult: IAsyncResult): void {
            var webAsyncCallStateAnchor: WebAsyncCallStateAnchor = ((webAsyncResult.AsyncState instanceof WebAsyncCallStateAnchor) ? <WebAsyncCallStateAnchor>webAsyncResult.AsyncState : null);
            if (webAsyncCallStateAnchor !== null && webAsyncCallStateAnchor.AsyncCallback !== null) {
                var ar: AsyncRequestResult = new AsyncRequestResult(webAsyncCallStateAnchor.ServiceRequest, webAsyncCallStateAnchor.WebRequest, webAsyncResult, webAsyncCallStateAnchor.AsyncState);
                webAsyncCallStateAnchor.AsyncCallback(ar);
            }
        }
        private ReadResponse(response: IEwsHttpWebResponse): any {
            var result: any;
            try {
                var IL_E8: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            this.Service.ProcessHttpResponseHeaders(TraceFlags.EwsResponseHttpHeaders, response);
                            if (this.Service.IsTraceEnabledFor(TraceFlags.EwsResponse)) {
                                var memoryStream: MemoryStream = new MemoryStream();
                                try {
                                    var responseStream: Stream = ServiceRequestBase.GetResponseStream(response);
                                    try {
                                        EwsUtilities.CopyStream(responseStream, memoryStream);
                                        memoryStream.Position = 0;
                                    }
                                    finally {
                                        if (responseStream !== null) {
                                            (<IDisposable>responseStream).Dispose();
                                        }
                                    }
                                    if (this.Service.RenderingMethod === ExchangeService_RenderingMode.Xml) {
                                        super.TraceResponseXml(response, memoryStream);
                                        result = this.ReadResponseXml(memoryStream);
                                    }
                                    else {
                                        if (this.Service.RenderingMethod !== ExchangeService_RenderingMode.JSON) {
                                            throw new InvalidOperationException("Unknown RenderingMethod.");
                                        }
                                        super.TraceResponseJson(response, memoryStream);
                                        result = this.ReadResponseJson(memoryStream);
                                    }
                                    _goto = IL_E8;
                                    continue _GOTO_LOOP;
                                }
                                finally {
                                    if (memoryStream !== null) {
                                        (<IDisposable>memoryStream).Dispose();
                                    }
                                }
                            }
                            var responseStream2: Stream = ServiceRequestBase.GetResponseStream(response);
                            try {
                                if (this.Service.RenderingMethod === ExchangeService_RenderingMode.Xml) {
                                    result = this.ReadResponseXml(responseStream2);
                                }
                                else {
                                    if (this.Service.RenderingMethod !== ExchangeService_RenderingMode.JSON) {
                                        throw new InvalidOperationException("Unknown RenderingMethod.");
                                    }
                                    result = this.ReadResponseJson(responseStream2);
                                }
                            }
                            finally {
                                if (responseStream2 !== null) {
                                    (<IDisposable>responseStream2).Dispose();
                                }
                            }
                            _goto = IL_E8;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Response !== null) {
                        var response2: IEwsHttpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(ex);
                        this.Service.ProcessHttpResponseHeaders(TraceFlags.EwsResponseHttpHeaders, response2);
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    if (ex instanceof IOException) {
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                    }
                    else
                        throw ex;
            }
            finally {
                if (response !== null) {
                    response.Close();
                }
            }
            return result;
        }
        private ReadResponseJson(responseStream: Stream): any {
            var jsonResponse: JsonObject = new JsonParser(responseStream).Parse();
            return super.BuildResponseObjectFromJson(jsonResponse);
        }
        private ReadResponseXml(responseStream: Stream): any {
            var ewsXmlReader: EwsServiceXmlReader = new EwsServiceXmlReader(responseStream, this.Service);
            return super.ReadResponse(ewsXmlReader);
        }
    }
    class DelegateManagementRequestBase<TResponse> extends SimpleServiceRequestBase {
        private mailbox: Mailbox = null;
        set Mailbox(value: Mailbox) {
            this.mailbox = value;
        }
        get Mailbox(): Mailbox {
            return this.mailbox;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Mailbox, "Mailbox");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.Mailbox.WriteToXml(writer, XmlNamespace.Messages, "Mailbox");
        }
        CreateResponse(): TResponse {
            throw new NotSupportedException();
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var delegateManagementResponse: DelegateManagementResponse = this.CreateResponse();
            delegateManagementResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return delegateManagementResponse;
        }
        Execute(): TResponse {
            var result: TResponse = <TResponse>(<any>super.InternalExecute());
            result.ThrowIfNecessary();
            return result;
        }
    }
    class AddDelegateRequest extends DelegateManagementRequestBase<DelegateManagementResponse>
    {
        private delegateUsers: List<DelegateUser> = new List<DelegateUser>();
        private meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope> = null;
        set MeetingRequestsDeliveryScope(value: Nullable<MeetingRequestsDeliveryScope>) {
            this.meetingRequestsDeliveryScope = value;
        }
        get MeetingRequestsDeliveryScope(): Nullable<MeetingRequestsDeliveryScope> {
            return this.meetingRequestsDeliveryScope;
        }
        get DelegateUsers(): List<DelegateUser> {
            return this.delegateUsers;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.DelegateUsers, "DelegateUsers");
            var enumerator: List_Enumerator<DelegateUser> = this.DelegateUsers.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DelegateUser = enumerator.Current;
                    current.ValidateUpdateDelegate();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (this.MeetingRequestsDeliveryScope !== null) {
                EwsUtilities.ValidateEnumVersionValue(this.MeetingRequestsDeliveryScope.Value, this.Service.RequestedServerVersion);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Messages, "DelegateUsers");
            var enumerator: List_Enumerator<DelegateUser> = this.DelegateUsers.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DelegateUser = enumerator.Current;
                    current.WriteToXml(writer, "DelegateUser");
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            if (this.MeetingRequestsDeliveryScope !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "DeliverMeetingRequests", this.MeetingRequestsDeliveryScope.Value);
            }
        }
        GetXmlElementName(): string {
            return "AddDelegate";
        }
        GetResponseXmlElementName(): string {
            return "AddDelegateResponse";
        }
        CreateResponse(): DelegateManagementResponse {
            return new DelegateManagementResponse(true, this.delegateUsers);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class MultiResponseServiceRequest<TResponse> extends SimpleServiceRequestBase {
        private errorHandlingMode: ServiceErrorHandling = 0;
        get ErrorHandlingMode(): ServiceErrorHandling {
            return this.errorHandlingMode;
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            var serviceResponseCollection: ServiceResponseCollection<TResponse> = new ServiceResponseCollection<TResponse>();
            reader.ReadStartElement(XmlNamespace.Messages, "ResponseMessages");
            for (var i: number = 0; i < this.GetExpectedResponseMessageCount(); i = i + 1) {
                reader.Read();
                if (reader.IsEndElement(XmlNamespace.Messages, "ResponseMessages")) {
                    break;
                }
                var response: TResponse = this.CreateServiceResponse(reader.Service, i);
                response.LoadFromXml(reader, this.GetResponseMessageXmlElementName());
                serviceResponseCollection.Add(response);
            }
            if (serviceResponseCollection.Count < this.GetExpectedResponseMessageCount()) {
                if (serviceResponseCollection.Count === 1) {
                    var tResponse: TResponse = serviceResponseCollection.get_Item(0);
                    if (tResponse.Result === ServiceResult.Error) {
                        throw new ServiceResponseException(serviceResponseCollection.get_Item(0));
                    }
                }
                throw new ServiceXmlDeserializationException(NString.Format(Strings.TooFewServiceReponsesReturned, this.GetResponseMessageXmlElementName(), this.GetExpectedResponseMessageCount(), serviceResponseCollection.Count));
            }
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "ResponseMessages");
            return serviceResponseCollection;
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var serviceResponseCollection: ServiceResponseCollection<TResponse> = new ServiceResponseCollection<TResponse>();
            var array: any[] = jsonBody.ReadAsJsonObject("ResponseMessages").ReadAsArray("Items");
            var num: number = 0;
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var obj: any = array2[i];
                var response: TResponse = this.CreateServiceResponse(this.Service, num);
                response.LoadFromJson(((obj instanceof JsonObject) ? <JsonObject>obj : null), this.Service);
                serviceResponseCollection.Add(response);
                num = num + 1;
            }
            if (serviceResponseCollection.Count < this.GetExpectedResponseMessageCount()) {
                if (serviceResponseCollection.Count === 1) {
                    var tResponse: TResponse = serviceResponseCollection.get_Item(0);
                    if (tResponse.Result === ServiceResult.Error) {
                        throw new ServiceResponseException(serviceResponseCollection.get_Item(0));
                    }
                }
                throw new ServiceJsonDeserializationException();
            }
            return serviceResponseCollection;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): TResponse {
            throw new NotSupportedException();
        }
        GetResponseMessageXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetExpectedResponseMessageCount(): number {
            throw new NotSupportedException();
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service);
            this.errorHandlingMode = errorHandlingMode;
        }
        Execute(): ServiceResponseCollection<TResponse> {
            var serviceResponseCollection: ServiceResponseCollection<TResponse> = <ServiceResponseCollection<TResponse>>super.InternalExecute();
            if (this.ErrorHandlingMode === ServiceErrorHandling.ThrowOnError) {
                EwsUtilities.Assert(serviceResponseCollection.Count === 1, "MultiResponseServiceRequest.Execute", "ServiceErrorHandling.ThrowOnError error handling is only valid for singleton request");
                var tResponse: TResponse = serviceResponseCollection.get_Item(0);
                tResponse.ThrowIfNecessary();
            }
            return serviceResponseCollection;
        }
        EndExecute(asyncResult: IAsyncResult): ServiceResponseCollection<TResponse> {
            var serviceResponseCollection: ServiceResponseCollection<TResponse> = <ServiceResponseCollection<TResponse>>super.EndInternalExecute(asyncResult);
            if (this.ErrorHandlingMode === ServiceErrorHandling.ThrowOnError) {
                EwsUtilities.Assert(serviceResponseCollection.Count === 1, "MultiResponseServiceRequest.Execute", "ServiceErrorHandling.ThrowOnError error handling is only valid for singleton request");
                var tResponse: TResponse = serviceResponseCollection.get_Item(0);
                tResponse.ThrowIfNecessary();
            }
            return serviceResponseCollection;
        }
    }
    class ApplyConversationActionRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        private conversationActions: List<ConversationAction> = new List<ConversationAction>();
        get ConversationActions(): List<ConversationAction> {
            return this.conversationActions;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return this.conversationActions.Count;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.conversationActions, "conversationActions");
            for (var i: number = 0; i < this.ConversationActions.Count; i = i + 1) {
                this.ConversationActions.get_Item(i).Validate();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "ConversationActions");
            for (var i: number = 0; i < this.ConversationActions.Count; i = i + 1) {
                this.ConversationActions.get_Item(i).WriteElementsToXml(writer);
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<ConversationAction> = this.conversationActions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ConversationAction = enumerator.Current;
                    list.Add((<IJsonSerializable>current).ToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("ConversationActions", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetXmlElementName(): string {
            return "ApplyConversationAction";
        }
        GetResponseXmlElementName(): string {
            return "ApplyConversationActionResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "ApplyConversationActionResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
    }
    class ArchiveItemRequest extends MultiResponseServiceRequest<ArchiveItemResponse> implements IJsonSerializable {
        private sourceFolderId: FolderId = null;
        private ids: ItemIdWrapperList = new ItemIdWrapperList();
        set SourceFolderId(value: FolderId) {
            this.sourceFolderId = value;
        }
        get SourceFolderId(): FolderId {
            return this.sourceFolderId;
        }
        get Ids(): ItemIdWrapperList {
            return this.ids;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            EwsUtilities.ValidateParam(this.sourceFolderId, "SourceFolderId");
            this.sourceFolderId.Validate(this.Service.RequestedServerVersion);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ArchiveItemResponse {
            return new ArchiveItemResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return this.ids.Count;
        }
        GetXmlElementName(): string {
            return "ArchiveItem";
        }
        GetResponseXmlElementName(): string {
            return "ArchiveItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "ArchiveItemResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "ArchiveSourceFolderId");
            this.SourceFolderId.WriteToXml(writer);
            writer.WriteEndElement();
            this.WriteIdsToXml(writer);
        }
        WriteIdsToXml(writer: EwsServiceXmlWriter): void {
            this.Ids.WriteToXml(writer, XmlNamespace.Messages, "ItemIds");
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ArchiveSourceFolderId", this.SourceFolderId.InternalToJson(service));
            this.AddIdsToJson(jsonObject, service);
            return jsonObject;
        }
        AddIdsToJson(jsonObject: JsonObject, service: ExchangeService): void {
            jsonObject.Add("ItemIds", this.Ids.InternalToJson(service));
        }
    }
    class AsyncRequestResult implements IAsyncResult {
        ServiceRequest: ServiceRequestBase = null;
        WebRequest: IEwsHttpWebRequest = null;
        WebAsyncResult: IAsyncResult = null;
        AsyncState: any = null;
        get AsyncWaitHandle(): WaitHandle {
            return this.WebAsyncResult.AsyncWaitHandle;
        }
        get CompletedSynchronously(): boolean {
            return this.WebAsyncResult.CompletedSynchronously;
        }
        get IsCompleted(): boolean {
            return this.WebAsyncResult.IsCompleted;
        }
        constructor(serviceRequest: ServiceRequestBase, webRequest: IEwsHttpWebRequest, webAsyncResult: IAsyncResult, asyncState: any) {
            super();
            EwsUtilities.ValidateParam(serviceRequest, "serviceRequest");
            EwsUtilities.ValidateParam(webRequest, "webRequest");
            EwsUtilities.ValidateParam(webAsyncResult, "webAsyncResult");
            this.ServiceRequest = serviceRequest;
            this.WebAsyncResult = webAsyncResult;
            this.WebRequest = webRequest;
            this.AsyncState = asyncState;
        }
        static ExtractServiceRequest<T>(exchangeService: ExchangeService, asyncResult: IAsyncResult): T {
            EwsUtilities.ValidateParam(asyncResult, "asyncResult");
            var asyncRequestResult: AsyncRequestResult = ((asyncResult instanceof AsyncRequestResult) ? <AsyncRequestResult>asyncResult : null);
            if (asyncRequestResult === null) {
                throw new ArgumentException(Strings.InvalidAsyncResult, "asyncResult");
            }
            if (asyncRequestResult.ServiceRequest === null) {
                throw new ArgumentException(Strings.InvalidAsyncResult, "asyncResult");
            }
            if (!NObject.ReferenceEquals(asyncRequestResult.ServiceRequest.Service, exchangeService)) {
                throw new ArgumentException(Strings.InvalidAsyncResult, "asyncResult");
            }
            var t: T = ((asyncRequestResult.ServiceRequest instanceof T) ? <T>asyncRequestResult.ServiceRequest : null);
            if (t === null) {
                throw new ArgumentException(Strings.InvalidAsyncResult, "asyncResult");
            }
            return t;
        }
    }
    class WebAsyncCallStateAnchor {
        ServiceRequest: ServiceRequestBase = null;
        WebRequest: IEwsHttpWebRequest = null;
        AsyncState: any = null;
        AsyncCallback: (ar: IAsyncResult) => void = null;
        constructor(serviceRequest: ServiceRequestBase, webRequest: IEwsHttpWebRequest, asyncCallback: (ar: IAsyncResult) => void, asyncState: any) {
            super();
            EwsUtilities.ValidateParam(serviceRequest, "serviceRequest");
            EwsUtilities.ValidateParam(webRequest, "webRequest");
            this.ServiceRequest = serviceRequest;
            this.WebRequest = webRequest;
            this.AsyncCallback = asyncCallback;
            this.AsyncState = asyncState;
        }
    }
    class ConvertIdRequest extends MultiResponseServiceRequest<ConvertIdResponse> implements IJsonSerializable {
        private destinationFormat: IdFormat = IdFormat.EwsId;
        private ids: List<AlternateIdBase> = new List<AlternateIdBase>();
        set DestinationFormat(value: IdFormat) {
            this.destinationFormat = value;
        }
        get DestinationFormat(): IdFormat {
            return this.destinationFormat;
        }
        get Ids(): List<AlternateIdBase> {
            return this.ids;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ConvertIdResponse {
            return new ConvertIdResponse();
        }
        GetResponseXmlElementName(): string {
            return "ConvertIdResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "ConvertIdResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return this.Ids.Count;
        }
        GetXmlElementName(): string {
            return "ConvertId";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.Ids, "Ids");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("DestinationFormat", this.DestinationFormat);
            writer.WriteStartElement(XmlNamespace.Messages, "SourceIds");
            var enumerator: List_Enumerator<AlternateIdBase> = this.Ids.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AlternateIdBase = enumerator.Current;
                    current.WriteToXml(writer);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("DestinationFormat", this.DestinationFormat);
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<AlternateIdBase> = this.Ids.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AlternateIdBase = enumerator.Current;
                    list.Add((<IJsonSerializable>current).ToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("SourceIds", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
    }
    class MoveCopyRequest<TServiceObject, TResponse> extends MultiResponseServiceRequest<TResponse> implements IJsonSerializable {
        private destinationFolderId: FolderId = null;
        set DestinationFolderId(value: FolderId) {
            this.destinationFolderId = value;
        }
        get DestinationFolderId(): FolderId {
            return this.destinationFolderId;
        }
        Validate(): void {
            EwsUtilities.ValidateParam(this.DestinationFolderId, "DestinationFolderId");
            this.DestinationFolderId.Validate(this.Service.RequestedServerVersion);
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        WriteIdsToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "ToFolderId");
            this.DestinationFolderId.WriteToXml(writer);
            writer.WriteEndElement();
            this.WriteIdsToXml(writer);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.Add("BaseFolderId", this.DestinationFolderId.InternalToJson(service));
            jsonObject.Add("ToFolderId", jsonObject2);
            this.AddIdsToJson(jsonObject, service);
            return jsonObject;
        }
        AddIdsToJson(jsonObject: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
    }
    class MoveCopyFolderRequest<TResponse> extends MoveCopyRequest<Folder, TResponse>
    {
        private folderIds: FolderIdWrapperList = new FolderIdWrapperList();
        get FolderIds(): FolderIdWrapperList {
            return this.folderIds;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.FolderIds, "FolderIds");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        WriteIdsToXml(writer: EwsServiceXmlWriter): void {
            this.folderIds.WriteToXml(writer, XmlNamespace.Messages, "FolderIds");
        }
        AddIdsToJson(jsonObject: JsonObject, service: ExchangeService): void {
            if (this.folderIds.Count > 0) {
                jsonObject.Add("FolderIds", this.folderIds.InternalToJson(service));
            }
        }
        GetExpectedResponseMessageCount(): number {
            return this.FolderIds.Count;
        }
    }
    class CopyFolderRequest extends MoveCopyFolderRequest<MoveCopyFolderResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): MoveCopyFolderResponse {
            return new MoveCopyFolderResponse();
        }
        GetXmlElementName(): string {
            return "CopyFolder";
        }
        GetResponseXmlElementName(): string {
            return "CopyFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CopyFolderResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class MoveCopyItemRequest<TResponse> extends MoveCopyRequest<Item, TResponse>
    {
        private itemIds: ItemIdWrapperList = new ItemIdWrapperList();
        get ItemIds(): ItemIdWrapperList {
            return this.itemIds;
        }
        ReturnNewItemIds: Nullable<boolean> = null;
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.ItemIds, "ItemIds");
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        WriteIdsToXml(writer: EwsServiceXmlWriter): void {
            this.ItemIds.WriteToXml(writer, XmlNamespace.Messages, "ItemIds");
            if (this.ReturnNewItemIds !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "ReturnNewItemIds", this.ReturnNewItemIds.Value);
            }
        }
        AddIdsToJson(jsonObject: JsonObject, service: ExchangeService): void {
            jsonObject.Add("ItemIds", this.ItemIds.InternalToJson(service));
            if (this.ReturnNewItemIds !== null) {
                jsonObject.Add("ReturnNewItemIds", this.ReturnNewItemIds.Value);
            }
        }
        GetExpectedResponseMessageCount(): number {
            return this.ItemIds.Count;
        }
    }
    class CopyItemRequest extends MoveCopyItemRequest<MoveCopyItemResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): MoveCopyItemResponse {
            return new MoveCopyItemResponse();
        }
        GetXmlElementName(): string {
            return "CopyItem";
        }
        GetResponseXmlElementName(): string {
            return "CopyItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CopyItemResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CreateAttachmentRequest extends MultiResponseServiceRequest<CreateAttachmentResponse> implements IJsonSerializable {
        private parentItemId: string = null;
        private attachments: List<Attachment> = new List<Attachment>();
        get EmitTimeZoneHeader(): boolean {
            var enumerator: IEnumerator<ItemAttachment> = Enumerable.OfType<ItemAttachment>(this.attachments).GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ItemAttachment = enumerator.Current;
                    if (current.Item !== null && current.Item.GetIsTimeZoneHeaderRequired(false)) {
                        return true;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return false;
        }
        get Attachments(): List<Attachment> {
            return this.attachments;
        }
        set ParentItemId(value: string) {
            this.parentItemId = value;
        }
        get ParentItemId(): string {
            return this.parentItemId;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.ParentItemId, "ParentItemId");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): CreateAttachmentResponse {
            return new CreateAttachmentResponse(this.Attachments.get_Item(responseIndex));
        }
        GetExpectedResponseMessageCount(): number {
            return this.Attachments.Count;
        }
        GetXmlElementName(): string {
            return "CreateAttachment";
        }
        GetResponseXmlElementName(): string {
            return "CreateAttachmentResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CreateAttachmentResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "ParentItemId");
            writer.WriteAttributeValue("Id", this.ParentItemId);
            writer.WriteEndElement();
            writer.WriteStartElement(XmlNamespace.Messages, "Attachments");
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    current.WriteToXml(writer, current.GetXmlElementName());
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ParentItemId", new ItemId(this.ParentItemId).InternalToJson(service));
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    list.Add(current.InternalToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("Attachments", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CreateRequest<TServiceObject, TResponse> extends MultiResponseServiceRequest<TResponse> implements IJsonSerializable {
        private parentFolderId: FolderId = null;
        private objects: IEnumerable<TServiceObject> = null;
        set Objects(value: IEnumerable<TServiceObject>) {
            this.objects = value;
        }
        get Objects(): IEnumerable<TServiceObject> {
            return this.objects;
        }
        set ParentFolderId(value: FolderId) {
            this.parentFolderId = value;
        }
        get ParentFolderId(): FolderId {
            return this.parentFolderId;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            if (this.ParentFolderId !== null) {
                this.ParentFolderId.Validate(this.Service.RequestedServerVersion);
            }
        }
        GetExpectedResponseMessageCount(): number {
            return EwsUtilities.GetEnumeratedObjectCount(this.objects);
        }
        GetParentFolderXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetObjectCollectionXmlElementName(): string {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.ParentFolderId !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, this.GetParentFolderXmlElementName());
                this.ParentFolderId.WriteToXml(writer);
                writer.WriteEndElement();
            }
            writer.WriteStartElement(XmlNamespace.Messages, this.GetObjectCollectionXmlElementName());
            var enumerator: IEnumerator<TServiceObject> = this.objects.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var serviceObject: ServiceObject = enumerator.Current;
                    serviceObject.WriteToXml(writer);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.ParentFolderId !== null) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("BaseFolderId", this.ParentFolderId.InternalToJson(service));
                jsonObject.Add(this.GetParentFolderXmlElementName(), jsonObject2);
            }
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<TServiceObject> = this.objects.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var serviceObject: ServiceObject = enumerator.Current;
                    list.Add(serviceObject.ToJson(service, false));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            jsonObject.Add(this.GetObjectCollectionXmlElementName(), NArray.ToEnumerable(list.ToArray()));
            this.AddJsonProperties(jsonObject, service);
            return jsonObject;
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
        }
    }
    class CreateFolderRequest extends CreateRequest<Folder, ServiceResponse>
    {
        set Folders(value: IEnumerable<Folder>) {
            this.Objects = value;
        }
        get Folders(): IEnumerable<Folder> {
            return this.Objects;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Folders, "Folders");
            var enumerator: IEnumerator<Folder> = this.Folders.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Folder = enumerator.Current;
                    current.Validate();
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new CreateFolderResponse(<Folder>EwsUtilities.GetEnumeratedObjectAt(this.Folders, responseIndex));
        }
        GetXmlElementName(): string {
            return "CreateFolder";
        }
        GetResponseXmlElementName(): string {
            return "CreateFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CreateFolderResponseMessage";
        }
        GetParentFolderXmlElementName(): string {
            return "ParentFolderId";
        }
        GetObjectCollectionXmlElementName(): string {
            return "Folders";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CreateItemRequestBase<TServiceObject, TResponse> extends CreateRequest<TServiceObject, TResponse>
    {
        private messageDisposition: Nullable<MessageDisposition> = null;
        private sendInvitationsMode: Nullable<SendInvitationsMode> = null;
        get EmitTimeZoneHeader(): boolean {
            var enumerator: IEnumerator<TServiceObject> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: TServiceObject = enumerator.Current;
                    if (current.GetIsTimeZoneHeaderRequired(false)) {
                        return true;
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return false;
        }
        set MessageDisposition(value: Nullable<MessageDisposition>) {
            this.messageDisposition = value;
        }
        get MessageDisposition(): Nullable<MessageDisposition> {
            return this.messageDisposition;
        }
        set SendInvitationsMode(value: Nullable<SendInvitationsMode>) {
            this.sendInvitationsMode = value;
        }
        get SendInvitationsMode(): Nullable<SendInvitationsMode> {
            return this.sendInvitationsMode;
        }
        set Items(value: IEnumerable<TServiceObject>) {
            this.Objects = value;
        }
        get Items(): IEnumerable<TServiceObject> {
            return this.Objects;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Items, "Items");
        }
        GetXmlElementName(): string {
            return "CreateItem";
        }
        GetResponseXmlElementName(): string {
            return "CreateItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CreateItemResponseMessage";
        }
        GetParentFolderXmlElementName(): string {
            return "SavedItemFolderId";
        }
        GetObjectCollectionXmlElementName(): string {
            return "Items";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            if (this.MessageDisposition !== null) {
                writer.WriteAttributeValue("MessageDisposition", this.MessageDisposition.Value);
            }
            if (this.SendInvitationsMode !== null) {
                writer.WriteAttributeValue("SendMeetingInvitations", this.SendInvitationsMode.Value);
            }
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            super.AddJsonProperties(jsonRequest, service);
            if (this.MessageDisposition !== null) {
                jsonRequest.Add("MessageDisposition", this.MessageDisposition.Value);
            }
            if (this.SendInvitationsMode !== null) {
                jsonRequest.Add("SendMeetingInvitations", this.SendInvitationsMode.Value);
            }
        }
    }
    class CreateItemRequest extends CreateItemRequestBase<Item, ServiceResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new CreateItemResponse(<Item>EwsUtilities.GetEnumeratedObjectAt(this.Items, responseIndex));
        }
        Validate(): void {
            super.Validate();
            var enumerator: IEnumerator<Item> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    current.Validate();
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CreateResponseObjectRequest extends CreateItemRequestBase<ServiceObject, CreateResponseObjectResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): CreateResponseObjectResponse {
            return new CreateResponseObjectResponse();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CreateUserConfigurationRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        userConfiguration: UserConfiguration = null;
        set UserConfiguration(value: UserConfiguration) {
            this.userConfiguration = value;
        }
        get UserConfiguration(): UserConfiguration {
            return this.userConfiguration;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.userConfiguration, "userConfiguration");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "CreateUserConfiguration";
        }
        GetResponseXmlElementName(): string {
            return "CreateUserConfigurationResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "CreateUserConfigurationResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.userConfiguration.WriteToXml(writer, XmlNamespace.Messages, "UserConfiguration");
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserConfiguration", (<IJsonSerializable>this.UserConfiguration).ToJson(service));
            return jsonObject;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
    }
    class DeleteAttachmentRequest extends MultiResponseServiceRequest<DeleteAttachmentResponse> implements IJsonSerializable {
        private attachments: List<Attachment> = new List<Attachment>();
        get Attachments(): List<Attachment> {
            return this.attachments;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.Attachments, "Attachments");
            for (var i: number = 0; i < this.Attachments.Count; i = i + 1) {
                EwsUtilities.ValidateParam(this.Attachments.get_Item(i).Id, NString.Format("Attachment[{0}].Id", i));
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): DeleteAttachmentResponse {
            return new DeleteAttachmentResponse(this.Attachments.get_Item(responseIndex));
        }
        GetExpectedResponseMessageCount(): number {
            return this.Attachments.Count;
        }
        GetXmlElementName(): string {
            return "DeleteAttachment";
        }
        GetResponseXmlElementName(): string {
            return "DeleteAttachmentResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "DeleteAttachmentResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "AttachmentIds");
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, "AttachmentId");
                    writer.WriteAttributeValue("Id", current.Id);
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    var jsonObject2: JsonObject = new JsonObject();
                    jsonObject2.AddTypeParameter("AttachmentId");
                    jsonObject2.Add("Id", current.Id);
                    list.Add(jsonObject2);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("AttachmentIds", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class DeleteRequest<TResponse> extends MultiResponseServiceRequest<TResponse> implements IJsonSerializable {
        private deleteMode: DeleteMode = DeleteMode.SoftDelete;
        set DeleteMode(value: DeleteMode) {
            this.deleteMode = value;
        }
        get DeleteMode(): DeleteMode {
            return this.deleteMode;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("DeleteType", this.DeleteMode);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("DeleteType", DeleteMode[this.DeleteMode]);
            this.InternalToJson(jsonObject);
            return jsonObject;
        }
        InternalToJson(body: JsonObject): void {
            throw new NotSupportedException();
        }
    }
    class DeleteFolderRequest extends DeleteRequest<ServiceResponse>
    {
        private folderIds: FolderIdWrapperList = new FolderIdWrapperList();
        get FolderIds(): FolderIdWrapperList {
            return this.folderIds;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.FolderIds, "FolderIds");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
        }
        GetExpectedResponseMessageCount(): number {
            return this.FolderIds.Count;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetXmlElementName(): string {
            return "DeleteFolder";
        }
        GetResponseXmlElementName(): string {
            return "DeleteFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "DeleteFolderResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.FolderIds.WriteToXml(writer, XmlNamespace.Messages, "FolderIds");
        }
        InternalToJson(body: JsonObject): void {
            body.Add("FolderIds", this.FolderIds.InternalToJson(this.Service));
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class DeleteItemRequest extends DeleteRequest<ServiceResponse>
    {
        private itemIds: ItemIdWrapperList = new ItemIdWrapperList();
        private affectedTaskOccurrences: Nullable<AffectedTaskOccurrence> = null;
        private sendCancellationsMode: Nullable<SendCancellationsMode> = null;
        get ItemIds(): ItemIdWrapperList {
            return this.itemIds;
        }
        set AffectedTaskOccurrences(value: Nullable<AffectedTaskOccurrence>) {
            this.affectedTaskOccurrences = value;
        }
        get AffectedTaskOccurrences(): Nullable<AffectedTaskOccurrence> {
            return this.affectedTaskOccurrences;
        }
        set SendCancellationsMode(value: Nullable<SendCancellationsMode>) {
            this.sendCancellationsMode = value;
        }
        get SendCancellationsMode(): Nullable<SendCancellationsMode> {
            return this.sendCancellationsMode;
        }
        SuppressReadReceipts: boolean = false;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.ItemIds, "ItemIds");
            if (this.SuppressReadReceipts && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "SuppressReadReceipts", ExchangeVersion.Exchange2013));
            }
        }
        GetExpectedResponseMessageCount(): number {
            return this.itemIds.Count;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetXmlElementName(): string {
            return "DeleteItem";
        }
        GetResponseXmlElementName(): string {
            return "DeleteItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "DeleteItemResponseMessage";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            if (this.AffectedTaskOccurrences !== null) {
                writer.WriteAttributeValue("AffectedTaskOccurrences", this.AffectedTaskOccurrences.Value);
            }
            if (this.SendCancellationsMode !== null) {
                writer.WriteAttributeValue("SendMeetingCancellations", this.SendCancellationsMode.Value);
            }
            if (this.SuppressReadReceipts) {
                writer.WriteAttributeValue("SuppressReadReceipts", true);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.itemIds.WriteToXml(writer, XmlNamespace.Messages, "ItemIds");
        }
        InternalToJson(body: JsonObject): void {
            if (this.AffectedTaskOccurrences !== null) {
                body.Add("AffectedTaskOccurrences", this.AffectedTaskOccurrences.Value);
            }
            if (this.SendCancellationsMode !== null) {
                body.Add("SendMeetingCancellations", this.SendCancellationsMode.Value);
            }
            if (this.SuppressReadReceipts) {
                body.Add("SuppressReadReceipts", true);
            }
            if (this.ItemIds.Count > 0) {
                body.Add("ItemIds", this.ItemIds.InternalToJson(this.Service));
            }
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class DeleteUserConfigurationRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        private name: string = null;
        private parentFolderId: FolderId = null;
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set ParentFolderId(value: FolderId) {
            this.parentFolderId = value;
        }
        get ParentFolderId(): FolderId {
            return this.parentFolderId;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.name, "name");
            EwsUtilities.ValidateParam(this.parentFolderId, "parentFolderId");
            this.ParentFolderId.Validate(this.Service.RequestedServerVersion);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "DeleteUserConfiguration";
        }
        GetResponseXmlElementName(): string {
            return "DeleteUserConfigurationResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "DeleteUserConfigurationResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            UserConfiguration.WriteUserConfigurationNameToXml(writer, XmlNamespace.Messages, this.name, this.parentFolderId);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserConfigurationName", UserConfiguration.GetJsonUserConfigName(service, this.parentFolderId, this.name));
            return jsonObject;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
    }
    enum DisableReasonType {
        NoReason,
        OutlookClientPerformance,
        OWAClientPerformance,
        MobileClientPerformance
    }
    class DisableAppRequest extends SimpleServiceRequestBase {
        private Id: string = null;
        private DisableReason: DisableReasonType = 0;
        constructor(service: ExchangeService, id: string, disableReason: DisableReasonType) {
            super(service);
            this.Id = id;
            this.DisableReason = disableReason;
        }
        GetXmlElementName(): string {
            return "DisableApp";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "ID", this.Id);
            writer.WriteElementValue(XmlNamespace.Messages, "DisableReason", this.DisableReason);
        }
        GetResponseXmlElementName(): string {
            return "DisableAppResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var disableAppResponse: DisableAppResponse = new DisableAppResponse();
            disableAppResponse.LoadFromXml(reader, "DisableAppResponse");
            return disableAppResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): DisableAppResponse {
            var disableAppResponse: DisableAppResponse = <DisableAppResponse>super.InternalExecute();
            disableAppResponse.ThrowIfNecessary();
            return disableAppResponse;
        }
    }
    class DisconnectPhoneCallRequest extends SimpleServiceRequestBase {
        private id: PhoneCallId = null;
        set Id(value: PhoneCallId) {
            this.id = value;
        }
        get Id(): PhoneCallId {
            return this.id;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "DisconnectPhoneCall";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.id.WriteToXml(writer, XmlNamespace.Messages, "PhoneCallId");
        }
        GetResponseXmlElementName(): string {
            return "DisconnectPhoneCallResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var serviceResponse: ServiceResponse = new ServiceResponse();
            serviceResponse.LoadFromXml(reader, "DisconnectPhoneCallResponse");
            return serviceResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        Execute(): ServiceResponse {
            var serviceResponse: ServiceResponse = <ServiceResponse>super.InternalExecute();
            serviceResponse.ThrowIfNecessary();
            return serviceResponse;
        }
    }
    class EmptyFolderRequest extends DeleteRequest<ServiceResponse>
    {
        private folderIds: FolderIdWrapperList = new FolderIdWrapperList();
        get FolderIds(): FolderIdWrapperList {
            return this.folderIds;
        }
        DeleteSubFolders: boolean = false;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.FolderIds, "FolderIds");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
        }
        GetExpectedResponseMessageCount(): number {
            return this.FolderIds.Count;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetXmlElementName(): string {
            return "EmptyFolder";
        }
        GetResponseXmlElementName(): string {
            return "EmptyFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "EmptyFolderResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.FolderIds.WriteToXml(writer, XmlNamespace.Messages, "FolderIds");
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("DeleteSubFolders", this.DeleteSubFolders);
        }
        InternalToJson(body: JsonObject): void {
            body.Add("DeleteSubFolders", this.DeleteSubFolders);
            body.Add("FolderIds", this.FolderIds.InternalToJson(this.Service));
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
    }
    class ExecuteDiagnosticMethodRequest extends MultiResponseServiceRequest<ExecuteDiagnosticMethodResponse>
    {
        Verb: string = null;
        Parameter: XmlNode = null;
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        GetXmlElementName(): string {
            return "ExecuteDiagnosticMethod";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "Verb", this.Verb);
            writer.WriteStartElement(XmlNamespace.Messages, "Parameter");
            writer.WriteNode(this.Parameter);
            writer.WriteEndElement();
        }
        GetResponseXmlElementName(): string {
            return "ExecuteDiagnosticMethodResponse";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ExecuteDiagnosticMethodResponse {
            return new ExecuteDiagnosticMethodResponse(service);
        }
        GetResponseMessageXmlElementName(): string {
            return "ExecuteDiagnosticMethodResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
    }
    class ExpandGroupRequest extends MultiResponseServiceRequest<ExpandGroupResponse>
    {
        private emailAddress: EmailAddress = null;
        set EmailAddress(value: EmailAddress) {
            this.emailAddress = value;
        }
        get EmailAddress(): EmailAddress {
            return this.emailAddress;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.EmailAddress, "EmailAddress");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ExpandGroupResponse {
            return new ExpandGroupResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "ExpandDL";
        }
        GetResponseXmlElementName(): string {
            return "ExpandDLResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "ExpandDLResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.EmailAddress !== null) {
                this.EmailAddress.WriteToXml(writer, XmlNamespace.Messages, "Mailbox");
            }
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
    }
    class FindConversationRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        private view: ViewBase = null;
        private folderId: FolderIdWrapper = null;
        private queryString: string = null;
        private returnHighlightTerms: boolean = false;
        private mailboxScope: Nullable<MailboxSearchLocation> = null;
        set View(value: ViewBase) {
            this.view = value;
            if (this.view instanceof SeekToConditionItemView) {
                (<SeekToConditionItemView>this.view).SetServiceObjectType(ServiceObjectType.Conversation);
            }
        }
        get View(): ViewBase {
            return this.view;
        }
        set FolderId(value: FolderIdWrapper) {
            this.folderId = value;
        }
        get FolderId(): FolderIdWrapper {
            return this.folderId;
        }
        set QueryString(value: string) {
            this.queryString = value;
        }
        get QueryString(): string {
            return this.queryString;
        }
        set ReturnHighlightTerms(value: boolean) {
            this.returnHighlightTerms = value;
        }
        get ReturnHighlightTerms(): boolean {
            return this.returnHighlightTerms;
        }
        set MailboxScope(value: Nullable<MailboxSearchLocation>) {
            this.mailboxScope = value;
        }
        get MailboxScope(): Nullable<MailboxSearchLocation> {
            return this.mailboxScope;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            this.view.InternalValidate(this);
            if (!NString.IsNullOrEmpty(this.queryString) && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "queryString", ExchangeVersion.Exchange2013));
            }
            if (this.ReturnHighlightTerms && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "returnHighlightTerms", ExchangeVersion.Exchange2013));
            }
            if (this.View instanceof SeekToConditionItemView && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "SeekToConditionItemView", ExchangeVersion.Exchange2013));
            }
            if (this.MailboxScope !== null && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "MailboxScope", ExchangeVersion.Exchange2013));
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            this.View.WriteAttributesToXml(writer);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.View.WriteToXml(writer, null);
            this.View.WriteOrderByToXml(writer);
            writer.WriteStartElement(XmlNamespace.Messages, "ParentFolderId");
            this.FolderId.WriteToXml(writer);
            writer.WriteEndElement();
            if (this.MailboxScope !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "MailboxScope", this.MailboxScope.Value);
            }
            if (!NString.IsNullOrEmpty(this.queryString)) {
                writer.WriteStartElement(XmlNamespace.Messages, "QueryString");
                if (this.ReturnHighlightTerms) {
                    writer.WriteAttributeString("ReturnHighlightTerms", NString.ToLowerInvariant(NBoolean.ToString(this.ReturnHighlightTerms)));
                }
                writer.WriteValue(this.queryString, "QueryString");
                writer.WriteEndElement();
            }
            if (this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013 && this.View.PropertySet !== null) {
                this.View.PropertySet.WriteToXml(writer, ServiceObjectType.Conversation);
            }
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Paging", this.View.WritePagingToJson(service));
            this.View.AddJsonProperties(jsonObject, service);
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.Add("BaseFolderId", this.FolderId.InternalToJson(service));
            jsonObject.Add("ParentFolderId", jsonObject2);
            if (this.MailboxScope !== null) {
                jsonObject.Add("MailboxScope", this.MailboxScope.Value);
            }
            if (!NString.IsNullOrEmpty(this.queryString)) {
                var jsonObject3: JsonObject = new JsonObject();
                jsonObject3.Add("Value", this.QueryString);
                if (this.ReturnHighlightTerms) {
                    jsonObject3.Add("ReturnHighlightTerms", NString.ToLowerInvariant(NBoolean.ToString(this.ReturnHighlightTerms)));
                }
                jsonObject.Add("QueryString", jsonObject3);
            }
            if (this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013 && this.View.PropertySet !== null) {
                this.View.PropertySet.WriteGetShapeToJson(jsonObject, service, ServiceObjectType.Conversation);
            }
            return jsonObject;
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            var findConversationResponse: FindConversationResponse = new FindConversationResponse();
            findConversationResponse.LoadFromXml(reader, "FindConversationResponse");
            return findConversationResponse;
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var findConversationResponse: FindConversationResponse = new FindConversationResponse();
            findConversationResponse.LoadFromJson(jsonBody, this.Service);
            return findConversationResponse;
        }
        GetXmlElementName(): string {
            return "FindConversation";
        }
        GetResponseXmlElementName(): string {
            return "FindConversationResponse";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        Execute(): FindConversationResponse {
            var findConversationResponse: FindConversationResponse = <FindConversationResponse>super.InternalExecute();
            findConversationResponse.ThrowIfNecessary();
            return findConversationResponse;
        }
    }
    class FindRequest<TResponse> extends MultiResponseServiceRequest<TResponse> implements IJsonSerializable {
        private parentFolderIds: FolderIdWrapperList = new FolderIdWrapperList();
        private searchFilter: SearchFilter = null;
        private queryString: string = null;
        private returnHighlightTerms: boolean = false;
        private view: ViewBase = null;
        get ParentFolderIds(): FolderIdWrapperList {
            return this.parentFolderIds;
        }
        set SearchFilter(value: SearchFilter) {
            this.searchFilter = value;
        }
        get SearchFilter(): SearchFilter {
            return this.searchFilter;
        }
        set QueryString(value: string) {
            this.queryString = value;
        }
        get QueryString(): string {
            return this.queryString;
        }
        set ReturnHighlightTerms(value: boolean) {
            this.returnHighlightTerms = value;
        }
        get ReturnHighlightTerms(): boolean {
            return this.returnHighlightTerms;
        }
        set View(value: ViewBase) {
            this.view = value;
        }
        get View(): ViewBase {
            return this.view;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            this.View.InternalValidate(this);
            if (!NString.IsNullOrEmpty(this.queryString) && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "queryString", ExchangeVersion.Exchange2010));
            }
            if (this.ReturnHighlightTerms && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "returnHighlightTerms", ExchangeVersion.Exchange2013));
            }
            if (this.View instanceof SeekToConditionItemView && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "SeekToConditionItemView", ExchangeVersion.Exchange2013));
            }
            if (!NString.IsNullOrEmpty(this.queryString) && this.searchFilter !== null) {
                throw new ServiceLocalException(Strings.BothSearchFilterAndQueryStringCannotBeSpecified);
            }
        }
        GetExpectedResponseMessageCount(): number {
            return this.ParentFolderIds.Count;
        }
        GetGroupBy(): Grouping {
            return null;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            this.View.WriteAttributesToXml(writer);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.View.WriteToXml(writer, this.GetGroupBy());
            if (this.SearchFilter !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "Restriction");
                this.SearchFilter.WriteToXml(writer);
                writer.WriteEndElement();
            }
            this.View.WriteOrderByToXml(writer);
            this.ParentFolderIds.WriteToXml(writer, XmlNamespace.Messages, "ParentFolderIds");
            if (!NString.IsNullOrEmpty(this.queryString)) {
                writer.WriteStartElement(XmlNamespace.Messages, "QueryString");
                if (this.ReturnHighlightTerms) {
                    writer.WriteAttributeString("ReturnHighlightTerms", NString.ToLowerInvariant(NBoolean.ToString(this.ReturnHighlightTerms)));
                }
                writer.WriteValue(this.queryString, "QueryString");
                writer.WriteEndElement();
            }
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.View.WriteShapeToJson(jsonObject, service);
            jsonObject.Add("Paging", this.View.WritePagingToJson(service));
            var obj: any = this.View.WriteGroupingToJson(service, this.GetGroupBy());
            if (obj !== null) {
                jsonObject.Add("Grouping", obj);
            }
            this.View.AddJsonProperties(jsonObject, service);
            if (this.SearchFilter !== null) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("Item", this.SearchFilter.InternalToJson(service));
                jsonObject.Add("Restriction", jsonObject2);
            }
            jsonObject.Add("ParentFolderIds", this.ParentFolderIds.InternalToJson(service));
            if (!NString.IsNullOrEmpty(this.queryString)) {
                var jsonObject3: JsonObject = new JsonObject();
                jsonObject3.Add("Value", this.QueryString);
                if (this.ReturnHighlightTerms) {
                    jsonObject3.Add("ReturnHighlightTerms", NString.ToLowerInvariant(NBoolean.ToString(this.ReturnHighlightTerms)));
                }
                jsonObject.Add("QueryString", jsonObject3);
            }
            return jsonObject;
        }
    }
    class FindFolderRequest extends FindRequest<FindFolderResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): FindFolderResponse {
            return new FindFolderResponse(this.View.GetPropertySetOrDefault());
        }
        GetXmlElementName(): string {
            return "FindFolder";
        }
        GetResponseXmlElementName(): string {
            return "FindFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "FindFolderResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class FindItemRequest<TItem> extends FindRequest<FindItemResponse<TItem>>
    {
        private groupBy: Grouping = null;
        set GroupBy(value: Grouping) {
            this.groupBy = value;
        }
        get GroupBy(): Grouping {
            return this.groupBy;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        GetGroupBy(): Grouping {
            return this.GroupBy;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): FindItemResponse<TItem> {
            return new FindItemResponse<TItem>(this.GroupBy !== null, this.View.GetPropertySetOrDefault());
        }
        GetXmlElementName(): string {
            return "FindItem";
        }
        GetResponseXmlElementName(): string {
            return "FindItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "FindItemResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class GetAttachmentRequest extends MultiResponseServiceRequest<GetAttachmentResponse> implements IJsonSerializable {
        private attachments: List<Attachment> = new List<Attachment>();
        private attachmentIds: List<string> = new List<string>();
        private additionalProperties: List<PropertyDefinitionBase> = new List<PropertyDefinitionBase>();
        private bodyType: Nullable<BodyType> = null;
        get Attachments(): List<Attachment> {
            return this.attachments;
        }
        get AttachmentIds(): List<string> {
            return this.attachmentIds;
        }
        get AdditionalProperties(): List<PropertyDefinitionBase> {
            return this.additionalProperties;
        }
        set BodyType(value: Nullable<BodyType>) {
            this.bodyType = value;
        }
        get BodyType(): Nullable<BodyType> {
            return this.bodyType;
        }
        get EmitTimeZoneHeader(): boolean {
            return this.additionalProperties.Contains(ItemSchema.MimeContent);
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            if (this.Attachments.Count > 0) {
                EwsUtilities.ValidateParamCollection(this.Attachments, "Attachments");
            }
            if (this.AttachmentIds.Count > 0) {
                EwsUtilities.ValidateParamCollection(this.AttachmentIds, "AttachmentIds");
            }
            if (this.AttachmentIds.Count === 0 && this.Attachments.Count === 0) {
                throw new ArgumentException(Strings.CollectionIsEmpty, "Attachments/AttachmentIds");
            }
            for (var i: number = 0; i < this.AdditionalProperties.Count; i = i + 1) {
                EwsUtilities.ValidateParam(this.AdditionalProperties.get_Item(i), NString.Format("AdditionalProperties[{0}]", i));
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetAttachmentResponse {
            return new GetAttachmentResponse((this.Attachments.Count > 0) ? this.Attachments.get_Item(responseIndex) : null);
        }
        GetExpectedResponseMessageCount(): number {
            return this.Attachments.Count + this.AttachmentIds.Count;
        }
        GetXmlElementName(): string {
            return "GetAttachment";
        }
        GetResponseXmlElementName(): string {
            return "GetAttachmentResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetAttachmentResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.BodyType !== null || this.AdditionalProperties.Count > 0) {
                writer.WriteStartElement(XmlNamespace.Messages, "AttachmentShape");
                if (this.BodyType !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "BodyType", this.BodyType.Value);
                }
                if (this.AdditionalProperties.Count > 0) {
                    PropertySet.WriteAdditionalPropertiesToXml(writer, this.AdditionalProperties);
                }
                writer.WriteEndElement();
            }
            writer.WriteStartElement(XmlNamespace.Messages, "AttachmentIds");
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    this.WriteAttachmentIdXml(writer, current.Id);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<string> = this.AttachmentIds.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: string = enumerator2.Current;
                    this.WriteAttachmentIdXml(writer, current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.BodyType !== null || this.AdditionalProperties.Count > 0) {
                var jsonObject2: JsonObject = new JsonObject();
                if (this.BodyType !== null) {
                    jsonObject2.Add("BodyType", this.BodyType.Value);
                }
                if (this.AdditionalProperties.Count > 0) {
                    PropertySet.WriteAdditionalPropertiesToJson(jsonObject2, service, this.AdditionalProperties);
                }
                jsonObject.Add("AttachmentShape", jsonObject2);
            }
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<Attachment> = this.Attachments.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Attachment = enumerator.Current;
                    this.AddJsonAttachmentIdToList(list, current.Id);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            var enumerator2: List_Enumerator<string> = this.AttachmentIds.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: string = enumerator2.Current;
                    this.AddJsonAttachmentIdToList(list, current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            jsonObject.Add("AttachmentIds", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        private WriteAttachmentIdXml(writer: EwsServiceXmlWriter, attachmentId: string): void {
            writer.WriteStartElement(XmlNamespace.Types, "AttachmentId");
            writer.WriteAttributeValue("Id", attachmentId);
            writer.WriteEndElement();
        }
        private AddJsonAttachmentIdToList(attachmentIds: List<any>, attachmentId: string): void {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Id", attachmentId);
            attachmentIds.Add(jsonObject);
        }
    }
    class GetClientAccessTokenRequest extends MultiResponseServiceRequest<GetClientAccessTokenResponse> implements IJsonSerializable {
        TokenRequests: ClientAccessTokenRequest[] = null;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetClientAccessTokenResponse {
            return new GetClientAccessTokenResponse(this.TokenRequests[responseIndex].Id, this.TokenRequests[responseIndex].TokenType);
        }
        GetXmlElementName(): string {
            return "GetClientAccessToken";
        }
        GetResponseXmlElementName(): string {
            return "GetClientAccessTokenResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetClientAccessTokenResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return this.TokenRequests.length;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "TokenRequests");
            var tokenRequests: ClientAccessTokenRequest[] = this.TokenRequests;
            for (var i: number = 0; i < tokenRequests.length; i = i + 1) {
                var clientAccessTokenRequest: ClientAccessTokenRequest = tokenRequests[i];
                writer.WriteStartElement(XmlNamespace.Types, "TokenRequest");
                writer.WriteElementValue(XmlNamespace.Types, "Id", clientAccessTokenRequest.Id);
                writer.WriteElementValue(XmlNamespace.Types, "TokenType", clientAccessTokenRequest.TokenType);
                if (!NString.IsNullOrEmpty(clientAccessTokenRequest.Scope)) {
                    writer.WriteElementValue(XmlNamespace.Types, "Scope", clientAccessTokenRequest.Scope);
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var tokenRequests: ClientAccessTokenRequest[] = this.TokenRequests;
            for (var i: number = 0; i < tokenRequests.length; i = i + 1) {
                var clientAccessTokenRequest: ClientAccessTokenRequest = tokenRequests[i];
                var jsonObject: JsonObject = new JsonObject();
                jsonObject.AddTypeParameter("TokenRequest");
                jsonObject.Add("Id", clientAccessTokenRequest.Id);
                jsonObject.Add("TokenType", clientAccessTokenRequest.TokenType);
                if (!NString.IsNullOrEmpty(clientAccessTokenRequest.Scope)) {
                    jsonObject.Add("Scope", clientAccessTokenRequest.Scope);
                }
                list.Add(jsonObject);
            }
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.Add("TokenRequests", NArray.ToEnumerable(list.ToArray()));
            return jsonObject2;
        }
        Validate(): void {
            super.Validate();
            if (this.TokenRequests === null || this.TokenRequests.length === 0) {
                throw new ServiceValidationException(Strings.HoldIdParameterIsNotSpecified);
            }
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
    }
    class GetClientExtensionRequest extends SimpleServiceRequestBase {
        private requestedExtensionIds: StringList = null;
        private shouldReturnEnabledOnly: boolean = false;
        private isUserScope: boolean = false;
        private userId: string = null;
        private userEnabledExtensionIds: StringList = null;
        private userDisabledExtensionIds: StringList = null;
        private isDebug: boolean = false;
        constructor(service: ExchangeService, requestedExtensionIds: StringList, shouldReturnEnabledOnly: boolean, isUserScope: boolean, userId: string, userEnabledExtensionIds: StringList, userDisabledExtensionIds: StringList, isDebug: boolean) {
            super(service);
            this.requestedExtensionIds = requestedExtensionIds;
            this.shouldReturnEnabledOnly = shouldReturnEnabledOnly;
            this.isUserScope = isUserScope;
            this.userId = userId;
            this.userEnabledExtensionIds = userEnabledExtensionIds;
            this.userDisabledExtensionIds = userDisabledExtensionIds;
            this.isDebug = isDebug;
        }
        GetXmlElementName(): string {
            return "GetClientExtension";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.requestedExtensionIds !== null && this.requestedExtensionIds.Count > 0) {
                writer.WriteStartElement(XmlNamespace.Messages, "RequestedExtensionIds");
                this.requestedExtensionIds.WriteElementsToXml(writer);
                writer.WriteEndElement();
            }
            if (this.isUserScope) {
                writer.WriteStartElement(XmlNamespace.Messages, "UserParameters");
                writer.WriteAttributeValue("UserId", this.userId);
                if (this.shouldReturnEnabledOnly) {
                    writer.WriteAttributeValue("EnabledOnly", this.shouldReturnEnabledOnly);
                }
                if (this.userEnabledExtensionIds !== null && this.userEnabledExtensionIds.Count > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "UserEnabledExtensions");
                    this.userEnabledExtensionIds.WriteElementsToXml(writer);
                    writer.WriteEndElement();
                }
                if (this.userDisabledExtensionIds !== null && this.userDisabledExtensionIds.Count > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "UserDisabledExtensions");
                    this.userDisabledExtensionIds.WriteElementsToXml(writer);
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            if (this.isDebug) {
                writer.WriteElementValue(XmlNamespace.Messages, "IsDebug", this.isDebug);
            }
        }
        GetResponseXmlElementName(): string {
            return "GetClientExtensionResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getClientExtensionResponse: GetClientExtensionResponse = new GetClientExtensionResponse();
            getClientExtensionResponse.LoadFromXml(reader, "GetClientExtensionResponse");
            return getClientExtensionResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetClientExtensionResponse {
            var getClientExtensionResponse: GetClientExtensionResponse = <GetClientExtensionResponse>super.InternalExecute();
            getClientExtensionResponse.ThrowIfNecessary();
            return getClientExtensionResponse;
        }
    }
    class GetEncryptionConfigurationRequest extends SimpleServiceRequestBase {
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetEncryptionConfiguration";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
        }
        GetResponseXmlElementName(): string {
            return "GetEncryptionConfigurationResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getEncryptionConfigurationResponse: GetEncryptionConfigurationResponse = new GetEncryptionConfigurationResponse();
            getEncryptionConfigurationResponse.LoadFromXml(reader, "GetEncryptionConfigurationResponse");
            return getEncryptionConfigurationResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetEncryptionConfigurationResponse {
            var getEncryptionConfigurationResponse: GetEncryptionConfigurationResponse = <GetEncryptionConfigurationResponse>super.InternalExecute();
            getEncryptionConfigurationResponse.ThrowIfNecessary();
            return getEncryptionConfigurationResponse;
        }
    }
    class GetAppManifestsRequest extends SimpleServiceRequestBase {
        ApiVersionSupported: string = null;
        SchemaVersionSupported: string = null;
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.ApiVersionSupported, "ApiVersionSupported");
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.SchemaVersionSupported, "SchemaVersionSupported");
        }
        GetXmlElementName(): string {
            return "GetAppManifests";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.ApiVersionSupported)) {
                writer.WriteElementValue(XmlNamespace.Messages, "ApiVersionSupported", this.ApiVersionSupported);
            }
            if (!NString.IsNullOrEmpty(this.SchemaVersionSupported)) {
                writer.WriteElementValue(XmlNamespace.Messages, "SchemaVersionSupported", this.SchemaVersionSupported);
            }
        }
        GetResponseXmlElementName(): string {
            return "GetAppManifestsResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getAppManifestsResponse: GetAppManifestsResponse = new GetAppManifestsResponse();
            getAppManifestsResponse.LoadFromXml(reader, "GetAppManifestsResponse");
            return getAppManifestsResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetAppManifestsResponse {
            var getAppManifestsResponse: GetAppManifestsResponse = <GetAppManifestsResponse>super.InternalExecute();
            getAppManifestsResponse.ThrowIfNecessary();
            return getAppManifestsResponse;
        }
    }
    class GetAppMarketplaceUrlRequest extends SimpleServiceRequestBase {
        ApiVersionSupported: string = null;
        SchemaVersionSupported: string = null;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetAppMarketplaceUrl";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.ApiVersionSupported, "ApiVersionSupported");
            EwsUtilities.ValidateNonBlankStringParamAllowNull(this.SchemaVersionSupported, "SchemaVersionSupported");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.ApiVersionSupported)) {
                writer.WriteElementValue(XmlNamespace.Messages, "ApiVersionSupported", this.ApiVersionSupported);
            }
            if (!NString.IsNullOrEmpty(this.SchemaVersionSupported)) {
                writer.WriteElementValue(XmlNamespace.Messages, "SchemaVersionSupported", this.SchemaVersionSupported);
            }
        }
        GetResponseXmlElementName(): string {
            return "GetAppMarketplaceUrlResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getAppMarketplaceUrlResponse: GetAppMarketplaceUrlResponse = new GetAppMarketplaceUrlResponse();
            getAppMarketplaceUrlResponse.LoadFromXml(reader, "GetAppMarketplaceUrlResponse");
            return getAppMarketplaceUrlResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetAppMarketplaceUrlResponse {
            var getAppMarketplaceUrlResponse: GetAppMarketplaceUrlResponse = <GetAppMarketplaceUrlResponse>super.InternalExecute();
            getAppMarketplaceUrlResponse.ThrowIfNecessary();
            return getAppMarketplaceUrlResponse;
        }
    }
    class GetConversationItemsRequest extends MultiResponseServiceRequest<GetConversationItemsResponse> implements IJsonSerializable {
        Conversations: List<ConversationRequest> = null;
        ItemProperties: PropertySet = null;
        FoldersToIgnore: FolderIdCollection = null;
        MaxItemsToReturn: Nullable<number> = null;
        SortOrder: Nullable<ConversationSortOrder> = null;
        MailboxScope: Nullable<MailboxSearchLocation> = null;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            if (this.MailboxScope !== null && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "MailboxScope", ExchangeVersion.Exchange2013));
            }
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.ItemProperties.WriteToXml(writer, ServiceObjectType.Item);
            this.FoldersToIgnore.WriteToXml(writer, XmlNamespace.Messages, "FoldersToIgnore");
            if (this.MaxItemsToReturn !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "MaxItemsToReturn", this.MaxItemsToReturn.Value);
            }
            if (this.SortOrder !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "SortOrder", this.SortOrder.Value);
            }
            if (this.MailboxScope !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "MailboxScope", this.MailboxScope.Value);
            }
            writer.WriteStartElement(XmlNamespace.Messages, "Conversations");
            this.Conversations.ForEach((conversation: ConversationRequest) => {
                conversation.WriteToXml(writer, "Conversation");
            });
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.ItemProperties.WriteGetShapeToJson(jsonObject, service, ServiceObjectType.Item);
            if (this.FoldersToIgnore.Count > 0) {
                jsonObject.Add("FoldersToIgnore", this.FoldersToIgnore.InternalToJson(service));
            }
            if (this.MaxItemsToReturn !== null) {
                jsonObject.Add("MaxItemsToReturn", this.MaxItemsToReturn.Value);
            }
            if (this.SortOrder !== null) {
                jsonObject.Add("SortOrder", this.SortOrder.Value);
            }
            if (this.MailboxScope !== null) {
                jsonObject.Add("MailboxScope", this.MailboxScope.Value);
            }
            var jsonPropertyCollection: List<any> = new List<any>();
            this.Conversations.ForEach((conversation: ConversationRequest) => {
                jsonPropertyCollection.Add(conversation.InternalToJson(service));
            });
            jsonObject.Add("Conversations", NArray.ToEnumerable(jsonPropertyCollection.ToArray()));
            return jsonObject;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetConversationItemsResponse {
            return new GetConversationItemsResponse(this.ItemProperties);
        }
        GetXmlElementName(): string {
            return "GetConversationItems";
        }
        GetResponseXmlElementName(): string {
            return "GetConversationItemsResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetConversationItemsResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        GetExpectedResponseMessageCount(): number {
            return this.Conversations.Count;
        }
    }
    class GetDelegateRequest extends DelegateManagementRequestBase<GetDelegateResponse>
    {
        private userIds: List<UserId> = new List<UserId>();
        private includePermissions: boolean = false;
        get UserIds(): List<UserId> {
            return this.userIds;
        }
        set IncludePermissions(value: boolean) {
            this.includePermissions = value;
        }
        get IncludePermissions(): boolean {
            return this.includePermissions;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        CreateResponse(): GetDelegateResponse {
            return new GetDelegateResponse(true);
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("IncludePermissions", this.IncludePermissions);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            if (this.UserIds.Count > 0) {
                writer.WriteStartElement(XmlNamespace.Messages, "UserIds");
                var enumerator: List_Enumerator<UserId> = this.UserIds.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: UserId = enumerator.Current;
                        current.WriteToXml(writer, "UserId");
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                writer.WriteEndElement();
            }
        }
        GetResponseXmlElementName(): string {
            return "GetDelegateResponse";
        }
        GetXmlElementName(): string {
            return "GetDelegate";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class GetDiscoverySearchConfigurationRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        SearchId: string = null;
        ExpandGroupMembership: boolean = false;
        InPlaceHoldConfigurationOnly: boolean = false;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetDiscoverySearchConfigurationResponse";
        }
        GetXmlElementName(): string {
            return "GetDiscoverySearchConfiguration";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getDiscoverySearchConfigurationResponse: GetDiscoverySearchConfigurationResponse = new GetDiscoverySearchConfigurationResponse();
            getDiscoverySearchConfigurationResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getDiscoverySearchConfigurationResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "SearchId", this.SearchId || NString.Empty);
            writer.WriteElementValue(XmlNamespace.Messages, "ExpandGroupMembership", NBoolean.ToString(this.ExpandGroupMembership).ToLower());
            writer.WriteElementValue(XmlNamespace.Messages, "InPlaceHoldConfigurationOnly", NBoolean.ToString(this.InPlaceHoldConfigurationOnly).ToLower());
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetDiscoverySearchConfigurationResponse {
            return <GetDiscoverySearchConfigurationResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class GetEventsRequest extends MultiResponseServiceRequest<GetEventsResponse> implements IJsonSerializable {
        private subscriptionId: string = null;
        private watermark: string = null;
        set SubscriptionId(value: string) {
            this.subscriptionId = value;
        }
        get SubscriptionId(): string {
            return this.subscriptionId;
        }
        set Watermark(value: string) {
            this.watermark = value;
        }
        get Watermark(): string {
            return this.watermark;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetEventsResponse {
            return new GetEventsResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "GetEvents";
        }
        GetResponseXmlElementName(): string {
            return "GetEventsResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetEventsResponseMessage";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateNonBlankStringParam(this.SubscriptionId, "SubscriptionId");
            EwsUtilities.ValidateNonBlankStringParam(this.Watermark, "Watermark");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "SubscriptionId", this.SubscriptionId);
            writer.WriteElementValue(XmlNamespace.Messages, "Watermark", this.Watermark);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("SubscriptionId", this.SubscriptionId);
            jsonObject.Add("Watermark", this.Watermark);
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class GetRequest<TServiceObject, TResponse> extends MultiResponseServiceRequest<TResponse> implements IJsonSerializable {
        private propertySet: PropertySet = null;
        set PropertySet(value: PropertySet) {
            this.propertySet = value;
        }
        get PropertySet(): PropertySet {
            return this.propertySet;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.PropertySet, "PropertySet");
            this.PropertySet.ValidateForRequest(this, false);
        }
        GetServiceObjectType(): ServiceObjectType {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.propertySet.WriteToXml(writer, this.GetServiceObjectType());
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.propertySet.WriteGetShapeToJson(jsonObject, service, this.GetServiceObjectType());
            this.AddIdsToRequest(jsonObject, service);
            return jsonObject;
        }
        AddIdsToRequest(jsonRequest: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
    }
    class GetFolderRequestBase<TResponse> extends GetRequest<Folder, TResponse>
    {
        private folderIds: FolderIdWrapperList = new FolderIdWrapperList();
        get FolderIds(): FolderIdWrapperList {
            return this.folderIds;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.FolderIds, "FolderIds");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
        }
        GetExpectedResponseMessageCount(): number {
            return this.FolderIds.Count;
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Folder;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            this.FolderIds.WriteToXml(writer, XmlNamespace.Messages, "FolderIds");
        }
        AddIdsToRequest(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("FolderIds", this.FolderIds.InternalToJson(service));
        }
        GetXmlElementName(): string {
            return "GetFolder";
        }
        GetResponseXmlElementName(): string {
            return "GetFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetFolderResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class GetFolderRequest extends GetFolderRequestBase<GetFolderResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetFolderResponse {
            return new GetFolderResponse(this.FolderIds.get_Item(responseIndex).GetFolder(), this.PropertySet);
        }
    }
    class GetFolderRequestForLoad extends GetFolderRequestBase<ServiceResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new GetFolderResponse(this.FolderIds.get_Item(responseIndex).GetFolder(), this.PropertySet);
        }
    }
    class GetHoldOnMailboxesRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        HoldId: string = null;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetHoldOnMailboxesResponse";
        }
        GetXmlElementName(): string {
            return "GetHoldOnMailboxes";
        }
        Validate(): void {
            super.Validate();
            if (NString.IsNullOrEmpty(this.HoldId)) {
                throw new ServiceValidationException(Strings.HoldIdParameterIsNotSpecified);
            }
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getHoldOnMailboxesResponse: GetHoldOnMailboxesResponse = new GetHoldOnMailboxesResponse();
            getHoldOnMailboxesResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getHoldOnMailboxesResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "HoldId", this.HoldId);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetHoldOnMailboxesResponse {
            return <GetHoldOnMailboxesResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class GetInboxRulesRequest extends SimpleServiceRequestBase {
        private mailboxSmtpAddress: string = null;
        set MailboxSmtpAddress(value: string) {
            this.mailboxSmtpAddress = value;
        }
        get MailboxSmtpAddress(): string {
            return this.mailboxSmtpAddress;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetInboxRules";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.mailboxSmtpAddress)) {
                writer.WriteElementValue(XmlNamespace.Messages, "MailboxSmtpAddress", this.mailboxSmtpAddress);
            }
        }
        GetResponseXmlElementName(): string {
            return "GetInboxRulesResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getInboxRulesResponse: GetInboxRulesResponse = new GetInboxRulesResponse();
            getInboxRulesResponse.LoadFromXml(reader, "GetInboxRulesResponse");
            return getInboxRulesResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        Execute(): GetInboxRulesResponse {
            var getInboxRulesResponse: GetInboxRulesResponse = <GetInboxRulesResponse>super.InternalExecute();
            getInboxRulesResponse.ThrowIfNecessary();
            return getInboxRulesResponse;
        }
    }
    class GetItemRequestBase<TResponse> extends GetRequest<Item, TResponse>
    {
        private itemIds: ItemIdWrapperList = new ItemIdWrapperList();
        get ItemIds(): ItemIdWrapperList {
            return this.itemIds;
        }
        get EmitTimeZoneHeader(): boolean {
            return this.PropertySet.Contains(ItemSchema.MimeContent);
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.ItemIds, "ItemIds");
        }
        GetExpectedResponseMessageCount(): number {
            return this.ItemIds.Count;
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Item;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            this.ItemIds.WriteToXml(writer, XmlNamespace.Messages, "ItemIds");
        }
        AddIdsToRequest(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("ItemIds", this.ItemIds.InternalToJson(service));
        }
        GetXmlElementName(): string {
            return "GetItem";
        }
        GetResponseXmlElementName(): string {
            return "GetItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetItemResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class GetItemRequest extends GetItemRequestBase<GetItemResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetItemResponse {
            return new GetItemResponse(this.ItemIds.get_Item(responseIndex), this.PropertySet);
        }
    }
    class GetItemRequestForLoad extends GetItemRequestBase<ServiceResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new GetItemResponse(this.ItemIds.get_Item(responseIndex), this.PropertySet);
        }
    }
    class GetNonIndexableItemDetailsRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        Mailboxes: string[] = null;
        PageSize: Nullable<number> = null;
        PageItemReference: string = null;
        PageDirection: Nullable<SearchPageDirection> = null;
        SearchArchiveOnly: boolean = false;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetNonIndexableItemDetailsResponse";
        }
        GetXmlElementName(): string {
            return "GetNonIndexableItemDetails";
        }
        Validate(): void {
            super.Validate();
            if (this.Mailboxes === null || this.Mailboxes.length === 0) {
                throw new ServiceValidationException(Strings.MailboxesParameterIsNotSpecified);
            }
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getNonIndexableItemDetailsResponse: GetNonIndexableItemDetailsResponse = new GetNonIndexableItemDetailsResponse();
            getNonIndexableItemDetailsResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getNonIndexableItemDetailsResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "Mailboxes");
            var mailboxes: string[] = this.Mailboxes;
            for (var i: number = 0; i < mailboxes.length; i = i + 1) {
                var value: string = mailboxes[i];
                writer.WriteElementValue(XmlNamespace.Types, "LegacyDN", value);
            }
            writer.WriteEndElement();
            if (this.PageSize !== null && this.PageSize !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "PageSize", NNumber.ToString(this.PageSize.Value));
            }
            if (!NString.IsNullOrEmpty(this.PageItemReference)) {
                writer.WriteElementValue(XmlNamespace.Messages, "PageItemReference", this.PageItemReference);
            }
            if (this.PageDirection !== null && this.PageDirection !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "PageDirection", SearchPageDirection[this.PageDirection.Value]);
            }
            writer.WriteElementValue(XmlNamespace.Messages, "SearchArchiveOnly", this.SearchArchiveOnly);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetNonIndexableItemDetailsResponse {
            return <GetNonIndexableItemDetailsResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class GetNonIndexableItemStatisticsRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        Mailboxes: string[] = null;
        SearchArchiveOnly: boolean = false;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetNonIndexableItemStatisticsResponse";
        }
        GetXmlElementName(): string {
            return "GetNonIndexableItemStatistics";
        }
        Validate(): void {
            super.Validate();
            if (this.Mailboxes === null || this.Mailboxes.length === 0) {
                throw new ServiceValidationException(Strings.MailboxesParameterIsNotSpecified);
            }
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getNonIndexableItemStatisticsResponse: GetNonIndexableItemStatisticsResponse = new GetNonIndexableItemStatisticsResponse();
            getNonIndexableItemStatisticsResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getNonIndexableItemStatisticsResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "Mailboxes");
            var mailboxes: string[] = this.Mailboxes;
            for (var i: number = 0; i < mailboxes.length; i = i + 1) {
                var value: string = mailboxes[i];
                writer.WriteElementValue(XmlNamespace.Types, "LegacyDN", value);
            }
            writer.WriteEndElement();
            writer.WriteElementValue(XmlNamespace.Messages, "SearchArchiveOnly", this.SearchArchiveOnly);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetNonIndexableItemStatisticsResponse {
            return <GetNonIndexableItemStatisticsResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class GetPasswordExpirationDateRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        private mailboxSmtpAddress: string = null;
        set MailboxSmtpAddress(value: string) {
            this.mailboxSmtpAddress = value;
        }
        get MailboxSmtpAddress(): string {
            return this.mailboxSmtpAddress;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetPasswordExpirationDate";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "MailboxSmtpAddress", this.MailboxSmtpAddress);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("MailboxSmtpAddress", this.MailboxSmtpAddress);
            return jsonObject;
        }
        GetResponseXmlElementName(): string {
            return "GetPasswordExpirationDateResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            var getPasswordExpirationDateResponse: GetPasswordExpirationDateResponse = new GetPasswordExpirationDateResponse();
            getPasswordExpirationDateResponse.LoadFromXml(reader, "GetPasswordExpirationDateResponse");
            return getPasswordExpirationDateResponse;
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var getPasswordExpirationDateResponse: GetPasswordExpirationDateResponse = new GetPasswordExpirationDateResponse();
            getPasswordExpirationDateResponse.LoadFromJson(jsonBody, this.Service);
            return getPasswordExpirationDateResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        Execute(): GetPasswordExpirationDateResponse {
            var getPasswordExpirationDateResponse: GetPasswordExpirationDateResponse = <GetPasswordExpirationDateResponse>super.InternalExecute();
            getPasswordExpirationDateResponse.ThrowIfNecessary();
            return getPasswordExpirationDateResponse;
        }
    }
    class GetPhoneCallRequest extends SimpleServiceRequestBase {
        private id: PhoneCallId = null;
        set Id(value: PhoneCallId) {
            this.id = value;
        }
        get Id(): PhoneCallId {
            return this.id;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetPhoneCallInformation";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.id.WriteToXml(writer, XmlNamespace.Messages, "PhoneCallId");
        }
        GetResponseXmlElementName(): string {
            return "GetPhoneCallInformationResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getPhoneCallResponse: GetPhoneCallResponse = new GetPhoneCallResponse(this.Service);
            getPhoneCallResponse.LoadFromXml(reader, "GetPhoneCallInformationResponse");
            return getPhoneCallResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        Execute(): GetPhoneCallResponse {
            var getPhoneCallResponse: GetPhoneCallResponse = <GetPhoneCallResponse>super.InternalExecute();
            getPhoneCallResponse.ThrowIfNecessary();
            return getPhoneCallResponse;
        }
    }
    class GetRoomListsRequest extends SimpleServiceRequestBase {
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetRoomLists";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
        }
        GetResponseXmlElementName(): string {
            return "GetRoomListsResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getRoomListsResponse: GetRoomListsResponse = new GetRoomListsResponse();
            getRoomListsResponse.LoadFromXml(reader, "GetRoomListsResponse");
            return getRoomListsResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        Execute(): GetRoomListsResponse {
            var getRoomListsResponse: GetRoomListsResponse = <GetRoomListsResponse>super.InternalExecute();
            getRoomListsResponse.ThrowIfNecessary();
            return getRoomListsResponse;
        }
    }
    class GetRoomsRequest extends SimpleServiceRequestBase {
        private roomList: EmailAddress = null;
        set RoomList(value: EmailAddress) {
            this.roomList = value;
        }
        get RoomList(): EmailAddress {
            return this.roomList;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetRooms";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.RoomList.WriteToXml(writer, XmlNamespace.Messages, "RoomList");
        }
        GetResponseXmlElementName(): string {
            return "GetRoomsResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getRoomsResponse: GetRoomsResponse = new GetRoomsResponse();
            getRoomsResponse.LoadFromXml(reader, "GetRoomsResponse");
            return getRoomsResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        Execute(): GetRoomsResponse {
            var getRoomsResponse: GetRoomsResponse = <GetRoomsResponse>super.InternalExecute();
            getRoomsResponse.ThrowIfNecessary();
            return getRoomsResponse;
        }
    }
    class GetSearchableMailboxesRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        SearchFilter: string = null;
        ExpandGroupMembership: boolean = false;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetSearchableMailboxesResponse";
        }
        GetXmlElementName(): string {
            return "GetSearchableMailboxes";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getSearchableMailboxesResponse: GetSearchableMailboxesResponse = new GetSearchableMailboxesResponse();
            getSearchableMailboxesResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getSearchableMailboxesResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "SearchFilter", this.SearchFilter || NString.Empty);
            writer.WriteElementValue(XmlNamespace.Messages, "ExpandGroupMembership", NBoolean.ToString(this.ExpandGroupMembership).ToLower());
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetSearchableMailboxesResponse {
            return <GetSearchableMailboxesResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class GetServerTimeZonesRequest extends MultiResponseServiceRequest<GetServerTimeZonesResponse>
    {
        private ids: IEnumerable<string> = null;
        set Ids(value: IEnumerable<string>) {
            this.ids = value;
        }
        get Ids(): IEnumerable<string> {
            return this.ids;
        }
        Validate(): void {
            super.Validate();
            if (this.ids !== null) {
                EwsUtilities.ValidateParamCollection(this.ids, "Ids");
            }
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetServerTimeZonesResponse {
            return new GetServerTimeZonesResponse();
        }
        GetResponseMessageXmlElementName(): string {
            return "GetServerTimeZonesResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "GetServerTimeZones";
        }
        GetResponseXmlElementName(): string {
            return "GetServerTimeZonesResponse";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.Ids !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "Ids");
                var enumerator: IEnumerator<string> = this.ids.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: string = enumerator.Current;
                        writer.WriteElementValue(XmlNamespace.Types, "Id", current);
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
                writer.WriteEndElement();
            }
        }
    }
    class HangingServiceRequestBase extends ServiceRequestBase {
        private static BufferSize: number = 4096;
        static LogAllWireBytes: boolean = false;
        private responseHandler: (response: any) => void = null;
        private response: IEwsHttpWebResponse = null;
        private request: IEwsHttpWebRequest = null;
        heartbeatFrequencyMilliseconds: number = 0;
        private lockObject: any = new any();
        OnDisconnect: NEvent<(sender: any, args: HangingRequestDisconnectEventArgs) => void> = new NEvent<(sender: any, args: HangingRequestDisconnectEventArgs) => void>();
        IsConnected: boolean = false;
        constructor(service: ExchangeService, handler: (response: any) => void, heartbeatFrequency: number) {
            super(service);
            this.responseHandler = handler;
            this.heartbeatFrequencyMilliseconds = heartbeatFrequency;
        }
        InternalExecute(): void {
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                this.response = (() => {
                    var _p0 = [
                        this.request
                    ];
                    var _r = super.ValidateAndEmitRequest(_p0);
                    this.request = _p0[0];
                    return _r;
                })();
                this.InternalOnConnect();
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private ParseResponses(state: any): void {
            try {
                var arg_05_0: Guid = Guid.Empty;
                var hangingTraceStream: HangingTraceStream = null;
                var memoryStream: MemoryStream = null;
                try {
                    var flag: boolean = this.Service.IsTraceEnabledFor(TraceFlags.EwsResponse);
                    var responseStream: Stream = this.response.GetResponseStream();
                    try {
                        responseStream.ReadTimeout = 2 * this.heartbeatFrequencyMilliseconds;
                        hangingTraceStream = new HangingTraceStream(responseStream, this.Service);
                        if (flag) {
                            memoryStream = new MemoryStream();
                            hangingTraceStream.SetResponseCopy(memoryStream);
                        }
                        var ewsXmlReader: EwsServiceMultiResponseXmlReader = EwsServiceMultiResponseXmlReader.Create(hangingTraceStream, this.Service);
                        while (this.IsConnected) {
                            var obj: any = null;
                            if (flag) {
                                try {
                                    obj = super.ReadResponse(ewsXmlReader);
                                }
                                finally {
                                    this.Service.TraceXml(TraceFlags.EwsResponse, memoryStream);
                                }
                                memoryStream.Close();
                                memoryStream = new MemoryStream();
                                hangingTraceStream.SetResponseCopy(memoryStream);
                            }
                            else {
                                obj = super.ReadResponse(ewsXmlReader);
                            }
                            this.responseHandler(obj);
                        }
                    }
                    finally {
                        if (responseStream !== null) {
                            (<IDisposable>responseStream).Dispose();
                        }
                    }
                }
                catch (exception) {
                    if (exception instanceof TimeoutException) {
                        this.Disconnect(HangingRequestDisconnectReason.Timeout, exception);
                    }
                    else
                        if (exception instanceof IOException) {
                            this.Disconnect(HangingRequestDisconnectReason.Exception, exception2);
                        }
                        else
                            if (exception instanceof HttpException) {
                                this.Disconnect(HangingRequestDisconnectReason.Exception, exception3);
                            }
                            else
                                if (exception instanceof WebException) {
                                    this.Disconnect(HangingRequestDisconnectReason.Exception, exception4);
                                }
                                else
                                    if (exception instanceof ObjectDisposedException) {
                                        this.Disconnect(HangingRequestDisconnectReason.Exception, exception5);
                                    }
                                    else
                                        if (exception instanceof NotSupportedException) {
                                            this.Disconnect(HangingRequestDisconnectReason.UserInitiated, null);
                                        }
                                        else
                                            if (exception instanceof XmlException) {
                                                this.Disconnect(HangingRequestDisconnectReason.UserInitiated, exception6);
                                            }
                                            else
                                                throw exception;
                }
                finally {
                    if (memoryStream !== null) {
                        memoryStream.Dispose();
                        memoryStream = null;
                    }
                }
            }
            catch (exception7) {
                if (exception7 instanceof ServiceLocalException) {
                    this.Disconnect(HangingRequestDisconnectReason.Exception, exception7);
                }
                else
                    throw exception7;
            }
        }
        Disconnect(): void;
        Disconnect(reason: HangingRequestDisconnectReason, exception: Exception): void;
        Disconnect(reason?: HangingRequestDisconnectReason, exception?: Exception): void {
            if (arguments.length === 0) {
                this.Disconnect_0();
                return;
            }
            this.Disconnect_1(reason, exception);
        }
        private Disconnect_0(): void {
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                this.request.Abort();
                this.response.Close();
                this.Disconnect(HangingRequestDisconnectReason.UserInitiated, null);
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private Disconnect_1(reason: HangingRequestDisconnectReason, exception: Exception): void {
            if (this.IsConnected) {
                this.response.Close();
                this.InternalOnDisconnect(reason, exception);
            }
        }
        private InternalOnConnect(): void {
            if (!this.IsConnected) {
                this.IsConnected = true;
                this.Service.ProcessHttpResponseHeaders(TraceFlags.EwsResponseHttpHeaders, this.response);
                ThreadPool.QueueUserWorkItem(this.ParseResponses);
            }
        }
        private InternalOnDisconnect(reason: HangingRequestDisconnectReason, exception: Exception): void {
            if (this.IsConnected) {
                this.IsConnected = false;
                this.OnDisconnect(this, new HangingRequestDisconnectEventArgs(reason, exception));
            }
        }
        ReadPreamble(ewsXmlReader: EwsServiceXmlReader): void {
        }
    }
    class GetStreamingEventsRequest extends HangingServiceRequestBase {
        static HeartbeatFrequencyDefault: number = 45000;
        private static heartbeatFrequency: number = 45000;
        private subscriptionIds: IEnumerable<string> = null;
        private connectionTimeout: number = 0;
        static set HeartbeatFrequency(value: number) {
            GetStreamingEventsRequest.heartbeatFrequency = value;
        }
        constructor(service: ExchangeService, serviceObjectHandler: (response: any) => void, subscriptionIds: IEnumerable<string>, connectionTimeout: number) {
            super(service, serviceObjectHandler, GetStreamingEventsRequest.heartbeatFrequency);
            this.subscriptionIds = subscriptionIds;
            this.connectionTimeout = connectionTimeout;
        }
        GetXmlElementName(): string {
            return "GetStreamingEvents";
        }
        GetResponseXmlElementName(): string {
            return "GetStreamingEventsResponse";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "SubscriptionIds");
            var enumerator: IEnumerator<string> = this.subscriptionIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    writer.WriteElementValue(XmlNamespace.Types, "SubscriptionId", current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
            writer.WriteElementValue(XmlNamespace.Messages, "ConnectionTimeout", this.connectionTimeout);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            reader.ReadStartElement(XmlNamespace.Messages, "ResponseMessages");
            var getStreamingEventsResponse: GetStreamingEventsResponse = new GetStreamingEventsResponse(this);
            getStreamingEventsResponse.LoadFromXml(reader, "GetStreamingEventsResponseMessage");
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "ResponseMessages");
            return getStreamingEventsResponse;
        }
    }
    class GetUserAvailabilityRequest extends SimpleServiceRequestBase {
        private attendees: IEnumerable<AttendeeInfo> = null;
        private timeWindow: TimeWindow = null;
        private requestedData: AvailabilityData = AvailabilityData.FreeBusyAndSuggestions;
        private options: AvailabilityOptions = null;
        get EmitTimeZoneHeader(): boolean {
            return true;
        }
        get IsFreeBusyViewRequested(): boolean {
            return this.requestedData === AvailabilityData.FreeBusy || this.requestedData === AvailabilityData.FreeBusyAndSuggestions;
        }
        get IsSuggestionsViewRequested(): boolean {
            return this.requestedData === AvailabilityData.Suggestions || this.requestedData === AvailabilityData.FreeBusyAndSuggestions;
        }
        set Attendees(value: IEnumerable<AttendeeInfo>) {
            this.attendees = value;
        }
        get Attendees(): IEnumerable<AttendeeInfo> {
            return this.attendees;
        }
        set TimeWindow(value: TimeWindow) {
            this.timeWindow = value;
        }
        get TimeWindow(): TimeWindow {
            return this.timeWindow;
        }
        set RequestedData(value: AvailabilityData) {
            this.requestedData = value;
        }
        get RequestedData(): AvailabilityData {
            return this.requestedData;
        }
        set Options(value: AvailabilityOptions) {
            this.options = value;
        }
        get Options(): AvailabilityOptions {
            return this.options;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "GetUserAvailabilityRequest";
        }
        Validate(): void {
            super.Validate();
            this.Options.Validate(this.TimeWindow.Duration);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (writer.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                var legacyAvailabilityTimeZone: LegacyAvailabilityTimeZone = new LegacyAvailabilityTimeZone(writer.Service.TimeZone);
                legacyAvailabilityTimeZone.WriteToXml(writer, "TimeZone");
            }
            writer.WriteStartElement(XmlNamespace.Messages, "MailboxDataArray");
            var enumerator: IEnumerator<AttendeeInfo> = this.Attendees.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AttendeeInfo = enumerator.Current;
                    current.WriteToXml(writer);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
            this.Options.WriteToXml(writer, this);
        }
        GetResponseXmlElementName(): string {
            return "GetUserAvailabilityResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getUserAvailabilityResults: GetUserAvailabilityResults = new GetUserAvailabilityResults();
            if (this.IsFreeBusyViewRequested) {
                getUserAvailabilityResults.AttendeesAvailability = new ServiceResponseCollection<AttendeeAvailability>();
                reader.ReadStartElement(XmlNamespace.Messages, "FreeBusyResponseArray");
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Messages, "FreeBusyResponse")) {
                        var attendeeAvailability: AttendeeAvailability = new AttendeeAvailability();
                        attendeeAvailability.LoadFromXml(reader, "ResponseMessage");
                        if (attendeeAvailability.ErrorCode === ServiceError.NoError) {
                            attendeeAvailability.LoadFreeBusyViewFromXml(reader, this.Options.RequestedFreeBusyView);
                        }
                        getUserAvailabilityResults.AttendeesAvailability.Add(attendeeAvailability);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "FreeBusyResponseArray"));
            }
            if (this.IsSuggestionsViewRequested) {
                getUserAvailabilityResults.SuggestionsResponse = new SuggestionsResponse();
                reader.ReadStartElement(XmlNamespace.Messages, "SuggestionsResponse");
                getUserAvailabilityResults.SuggestionsResponse.LoadFromXml(reader, "ResponseMessage");
                if (getUserAvailabilityResults.SuggestionsResponse.ErrorCode === ServiceError.NoError) {
                    getUserAvailabilityResults.SuggestionsResponse.LoadSuggestedDaysFromXml(reader);
                }
                reader.ReadEndElement(XmlNamespace.Messages, "SuggestionsResponse");
            }
            return getUserAvailabilityResults;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        Execute(): GetUserAvailabilityResults {
            return <GetUserAvailabilityResults>super.InternalExecute();
        }
    }
    class GetUserConfigurationRequest extends MultiResponseServiceRequest<GetUserConfigurationResponse> implements IJsonSerializable {
        private static EnumDelimiter: string = ",";
        private name: string = null;
        private parentFolderId: FolderId = null;
        private properties: UserConfigurationProperties = 0;
        private userConfiguration: UserConfiguration = null;
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set ParentFolderId(value: FolderId) {
            this.parentFolderId = value;
        }
        get ParentFolderId(): FolderId {
            return this.parentFolderId;
        }
        set UserConfiguration(value: UserConfiguration) {
            this.userConfiguration = value;
            this.name = this.userConfiguration.Name;
            this.parentFolderId = this.userConfiguration.ParentFolderId;
        }
        get UserConfiguration(): UserConfiguration {
            return this.userConfiguration;
        }
        set Properties(value: UserConfigurationProperties) {
            this.properties = value;
        }
        get Properties(): UserConfigurationProperties {
            return this.properties;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.name, "name");
            EwsUtilities.ValidateParam(this.parentFolderId, "parentFolderId");
            this.ParentFolderId.Validate(this.Service.RequestedServerVersion);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): GetUserConfigurationResponse {
            if (this.userConfiguration === null) {
                this.userConfiguration = new UserConfiguration(service, this.properties);
                this.userConfiguration.Name = this.name;
                this.userConfiguration.ParentFolderId = this.parentFolderId;
            }
            return new GetUserConfigurationResponse(this.userConfiguration);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "GetUserConfiguration";
        }
        GetResponseXmlElementName(): string {
            return "GetUserConfigurationResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "GetUserConfigurationResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            UserConfiguration.WriteUserConfigurationNameToXml(writer, XmlNamespace.Messages, this.name, this.parentFolderId);
            writer.WriteElementValue(XmlNamespace.Messages, "UserConfigurationProperties", UserConfigurationProperties[this.properties].Replace(",", NString.Empty));
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserConfigurationName", UserConfiguration.GetJsonUserConfigName(service, this.parentFolderId, this.name));
            jsonObject.Add("UserConfigurationProperties", UserConfigurationProperties[this.properties].Replace(",", NString.Empty));
            return jsonObject;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
    }
    class GetUserOofSettingsRequest extends SimpleServiceRequestBase {
        private smtpAddress: string = null;
        set SmtpAddress(value: string) {
            this.smtpAddress = value;
        }
        get SmtpAddress(): string {
            return this.smtpAddress;
        }
        GetXmlElementName(): string {
            return "GetUserOofSettingsRequest";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.SmtpAddress, "SmtpAddress");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "Mailbox");
            writer.WriteElementValue(XmlNamespace.Types, "Address", this.SmtpAddress);
            writer.WriteEndElement();
        }
        GetResponseXmlElementName(): string {
            return "GetUserOofSettingsResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getUserOofSettingsResponse: GetUserOofSettingsResponse = new GetUserOofSettingsResponse();
            getUserOofSettingsResponse.LoadFromXml(reader, "ResponseMessage");
            if (getUserOofSettingsResponse.ErrorCode === ServiceError.NoError) {
                reader.ReadStartElement(XmlNamespace.Types, "OofSettings");
                getUserOofSettingsResponse.OofSettings = new OofSettings();
                getUserOofSettingsResponse.OofSettings.LoadFromXml(reader, reader.LocalName);
                getUserOofSettingsResponse.OofSettings.AllowExternalOof = reader.ReadElementValue<OofExternalAudience>(XmlNamespace.Messages, "AllowExternalOof");
            }
            return getUserOofSettingsResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Execute(): GetUserOofSettingsResponse {
            var getUserOofSettingsResponse: GetUserOofSettingsResponse = <GetUserOofSettingsResponse>super.InternalExecute();
            getUserOofSettingsResponse.ThrowIfNecessary();
            return getUserOofSettingsResponse;
        }
    }
    class GetUserRetentionPolicyTagsRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "GetUserRetentionPolicyTagsResponse";
        }
        GetXmlElementName(): string {
            return "GetUserRetentionPolicyTags";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var getUserRetentionPolicyTagsResponse: GetUserRetentionPolicyTagsResponse = new GetUserRetentionPolicyTagsResponse();
            getUserRetentionPolicyTagsResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return getUserRetentionPolicyTagsResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): GetUserRetentionPolicyTagsResponse {
            return <GetUserRetentionPolicyTagsResponse>super.InternalExecute();
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    enum HangingRequestDisconnectReason {
        Clean,
        UserInitiated,
        Timeout,
        Exception
    }
    class HangingRequestDisconnectEventArgs extends EventArgs {
        Reason: HangingRequestDisconnectReason = 0;
        Exception: Exception = null;
        constructor(reason: HangingRequestDisconnectReason, exception: Exception) {
            super();
            this.Reason = reason;
            this.Exception = exception;
        }
    }
    class InstallAppRequest extends SimpleServiceRequestBase {
        private manifestStream: Stream = null;
        constructor(service: ExchangeService, manifestStream: Stream) {
            super(service);
            this.manifestStream = manifestStream;
        }
        GetXmlElementName(): string {
            return "InstallApp";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "Manifest");
            writer.WriteBase64ElementValue(this.manifestStream);
            writer.WriteEndElement();
        }
        GetResponseXmlElementName(): string {
            return "InstallAppResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var installAppResponse: InstallAppResponse = new InstallAppResponse();
            installAppResponse.LoadFromXml(reader, "InstallAppResponse");
            return installAppResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): InstallAppResponse {
            var installAppResponse: InstallAppResponse = <InstallAppResponse>super.InternalExecute();
            installAppResponse.ThrowIfNecessary();
            return installAppResponse;
        }
    }
    class MarkAllItemsAsReadRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        private folderIds: FolderIdWrapperList = new FolderIdWrapperList();
        get FolderIds(): FolderIdWrapperList {
            return this.folderIds;
        }
        ReadFlag: boolean = false;
        SuppressReadReceipts: boolean = false;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.FolderIds, "FolderIds");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
        }
        GetExpectedResponseMessageCount(): number {
            return this.FolderIds.Count;
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetXmlElementName(): string {
            return "MarkAllItemsAsRead";
        }
        GetResponseXmlElementName(): string {
            return "MarkAllItemsAsReadResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "MarkAllItemsAsReadResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "ReadFlag", this.ReadFlag);
            writer.WriteElementValue(XmlNamespace.Messages, "SuppressReadReceipts", this.SuppressReadReceipts);
            this.FolderIds.WriteToXml(writer, XmlNamespace.Messages, "FolderIds");
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ReadFlag", this.ReadFlag);
            jsonObject.Add("SuppressReadReceipts", this.SuppressReadReceipts);
            jsonObject.Add("FolderIds", this.FolderIds.InternalToJson(this.Service));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
    }
    class MarkAsJunkRequest extends MultiResponseServiceRequest<MarkAsJunkResponse> implements IJsonSerializable {
        private itemIds: ItemIdWrapperList = new ItemIdWrapperList();
        get ItemIds(): ItemIdWrapperList {
            return this.itemIds;
        }
        IsJunk: boolean = false;
        MoveItem: boolean = false;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.ItemIds, "ItemIds");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): MarkAsJunkResponse {
            return new MarkAsJunkResponse();
        }
        GetXmlElementName(): string {
            return "MarkAsJunk";
        }
        GetResponseXmlElementName(): string {
            return "MarkAsJunkResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "MarkAsJunkResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return this.itemIds.Count;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("IsJunk", this.IsJunk);
            writer.WriteAttributeValue("MoveItem", this.MoveItem);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.itemIds.WriteToXml(writer, XmlNamespace.Messages, "ItemIds");
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ItemIds", this.ItemIds.InternalToJson(service));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
    }
    class MoveFolderRequest extends MoveCopyFolderRequest<MoveCopyFolderResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): MoveCopyFolderResponse {
            return new MoveCopyFolderResponse();
        }
        GetXmlElementName(): string {
            return "MoveFolder";
        }
        GetResponseXmlElementName(): string {
            return "MoveFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "MoveFolderResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class MoveItemRequest extends MoveCopyItemRequest<MoveCopyItemResponse>
    {
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): MoveCopyItemResponse {
            return new MoveCopyItemResponse();
        }
        GetXmlElementName(): string {
            return "MoveItem";
        }
        GetResponseXmlElementName(): string {
            return "MoveItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "MoveItemResponseMessage";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class RemoveDelegateRequest extends DelegateManagementRequestBase<DelegateManagementResponse>
    {
        private userIds: List<UserId> = new List<UserId>();
        get UserIds(): List<UserId> {
            return this.userIds;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.UserIds, "UserIds");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Messages, "UserIds");
            var enumerator: List_Enumerator<UserId> = this.UserIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: UserId = enumerator.Current;
                    current.WriteToXml(writer, "UserId");
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        GetResponseXmlElementName(): string {
            return "RemoveDelegateResponse";
        }
        GetXmlElementName(): string {
            return "RemoveDelegate";
        }
        CreateResponse(): DelegateManagementResponse {
            return new DelegateManagementResponse(false, null);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class ResolveNamesRequest extends MultiResponseServiceRequest<ResolveNamesResponse> implements IJsonSerializable {
        private static searchScopeMap: LazyMember<Dictionary<ResolveNameSearchLocation, string>> = new LazyMember<Dictionary<ResolveNameSearchLocation, string>>(() => {
            var dictionary: Dictionary<ResolveNameSearchLocation, string> = new Dictionary<ResolveNameSearchLocation, string>();
            dictionary.Add(ResolveNameSearchLocation.DirectoryOnly, "ActiveDirectory");
            dictionary.Add(ResolveNameSearchLocation.DirectoryThenContacts, "ActiveDirectoryContacts");
            dictionary.Add(ResolveNameSearchLocation.ContactsOnly, "Contacts");
            dictionary.Add(ResolveNameSearchLocation.ContactsThenDirectory, "ContactsActiveDirectory");
            return dictionary;
        });
        private nameToResolve: string = null;
        private returnFullContactData: boolean = false;
        private searchLocation: ResolveNameSearchLocation = 0;
        private contactDataPropertySet: PropertySet = null;
        private parentFolderIds: FolderIdWrapperList = new FolderIdWrapperList();
        set NameToResolve(value: string) {
            this.nameToResolve = value;
        }
        get NameToResolve(): string {
            return this.nameToResolve;
        }
        set ReturnFullContactData(value: boolean) {
            this.returnFullContactData = value;
        }
        get ReturnFullContactData(): boolean {
            return this.returnFullContactData;
        }
        set SearchLocation(value: ResolveNameSearchLocation) {
            this.searchLocation = value;
        }
        get SearchLocation(): ResolveNameSearchLocation {
            return this.searchLocation;
        }
        set ContactDataPropertySet(value: PropertySet) {
            this.contactDataPropertySet = value;
        }
        get ContactDataPropertySet(): PropertySet {
            return this.contactDataPropertySet;
        }
        get ParentFolderIds(): FolderIdWrapperList {
            return this.parentFolderIds;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateNonBlankStringParam(this.NameToResolve, "NameToResolve");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ResolveNamesResponse {
            return new ResolveNamesResponse(service);
        }
        GetXmlElementName(): string {
            return "ResolveNames";
        }
        GetResponseXmlElementName(): string {
            return "ResolveNamesResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "ResolveNamesResponseMessage";
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("ReturnFullContactData", this.ReturnFullContactData);
            var value: string = null;
            (() => {
                var _p0 = [
                    value
                ];
                var _r = ResolveNamesRequest.searchScopeMap.Member.TryGetValue(this.SearchLocation, _p0);
                value = _p0[0];
                return _r;
            })();
            EwsUtilities.Assert(!NString.IsNullOrEmpty(value), "ResolveNameRequest.WriteAttributesToXml", "The specified search location cannot be mapped to an EWS search scope.");
            var value2: string = null;
            if (this.contactDataPropertySet !== null) {
                (() => {
                    var _p0 = [
                        value2
                    ];
                    var _r = PropertySet.DefaultPropertySetMap.Member.TryGetValue(this.contactDataPropertySet.BasePropertySet, _p0);
                    value2 = _p0[0];
                    return _r;
                })();
            }
            if (!this.Service.Exchange2007CompatibilityMode) {
                writer.WriteAttributeValue("SearchScope", value);
            }
            if (!NString.IsNullOrEmpty(value2)) {
                writer.WriteAttributeValue("ContactDataShape", value2);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.ParentFolderIds.WriteToXml(writer, XmlNamespace.Messages, "ParentFolderIds");
            writer.WriteElementValue(XmlNamespace.Messages, "UnresolvedEntry", this.NameToResolve);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.ParentFolderIds.Count > 0) {
                jsonObject.Add("ParentFolderIds", this.ParentFolderIds.InternalToJson(service));
            }
            jsonObject.Add("UnresolvedEntry", this.NameToResolve);
            jsonObject.Add("ReturnFullContactData", this.ReturnFullContactData);
            var value: string = null;
            (() => {
                var _p0 = [
                    value
                ];
                var _r = ResolveNamesRequest.searchScopeMap.Member.TryGetValue(this.SearchLocation, _p0);
                value = _p0[0];
                return _r;
            })();
            EwsUtilities.Assert(!NString.IsNullOrEmpty(value), "ResolveNameRequest.ToJson", "The specified search location cannot be mapped to an EWS search scope.");
            var value2: string = null;
            if (this.contactDataPropertySet !== null) {
                (() => {
                    var _p0 = [
                        value2
                    ];
                    var _r = PropertySet.DefaultPropertySetMap.Member.TryGetValue(this.contactDataPropertySet.BasePropertySet, _p0);
                    value2 = _p0[0];
                    return _r;
                })();
            }
            if (!this.Service.Exchange2007CompatibilityMode) {
                jsonObject.Add("SearchScope", value);
            }
            if (!NString.IsNullOrEmpty(value2)) {
                jsonObject.Add("ContactDataShape", value2);
            }
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class PlayOnPhoneRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        private itemId: ItemId = null;
        private dialString: string = null;
        set ItemId(value: ItemId) {
            this.itemId = value;
        }
        get ItemId(): ItemId {
            return this.itemId;
        }
        set DialString(value: string) {
            this.dialString = value;
        }
        get DialString(): string {
            return this.dialString;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "PlayOnPhone";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.itemId.WriteToXml(writer, XmlNamespace.Messages, "ItemId");
            writer.WriteElementValue(XmlNamespace.Messages, "DialString", this.dialString);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("ItemId", this.ItemId.InternalToJson(service));
            jsonObject.Add("DialString", this.dialString);
            return jsonObject;
        }
        GetResponseXmlElementName(): string {
            return "PlayOnPhoneResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            var playOnPhoneResponse: PlayOnPhoneResponse = new PlayOnPhoneResponse(this.Service);
            playOnPhoneResponse.LoadFromXml(reader, "PlayOnPhoneResponse");
            return playOnPhoneResponse;
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var playOnPhoneResponse: PlayOnPhoneResponse = new PlayOnPhoneResponse(this.Service);
            playOnPhoneResponse.LoadFromJson(jsonBody, this.Service);
            return playOnPhoneResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        Execute(): PlayOnPhoneResponse {
            var playOnPhoneResponse: PlayOnPhoneResponse = <PlayOnPhoneResponse>super.InternalExecute();
            playOnPhoneResponse.ThrowIfNecessary();
            return playOnPhoneResponse;
        }
    }
    interface IDiscoveryVersionable {
        ServerVersion: number;
    }
    class SearchMailboxesRequest extends MultiResponseServiceRequest<SearchMailboxesResponse> implements IJsonSerializable, IDiscoveryVersionable {
        private searchQueries: List<MailboxQuery> = new List<MailboxQuery>();
        private searchResultType: SearchResultType = SearchResultType.PreviewOnly;
        private sortOrder: SortDirection = 0;
        private sortByProperty: string = null;
        private performDeduplication: boolean = false;
        private pageSize: number = 0;
        private pageItemReference: string = null;
        private pageDirection: SearchPageDirection = 0;
        private previewItemResponseShape: PreviewItemResponseShape = null;
        set SearchQueries(value: List<MailboxQuery>) {
            this.searchQueries = value;
        }
        get SearchQueries(): List<MailboxQuery> {
            return this.searchQueries;
        }
        set ResultType(value: SearchResultType) {
            this.searchResultType = value;
        }
        get ResultType(): SearchResultType {
            return this.searchResultType;
        }
        set PreviewItemResponseShape(value: PreviewItemResponseShape) {
            this.previewItemResponseShape = value;
        }
        get PreviewItemResponseShape(): PreviewItemResponseShape {
            return this.previewItemResponseShape;
        }
        set SortOrder(value: SortDirection) {
            this.sortOrder = value;
        }
        get SortOrder(): SortDirection {
            return this.sortOrder;
        }
        set SortByProperty(value: string) {
            this.sortByProperty = value;
        }
        get SortByProperty(): string {
            return this.sortByProperty;
        }
        Language: string = null;
        set PerformDeduplication(value: boolean) {
            this.performDeduplication = value;
        }
        get PerformDeduplication(): boolean {
            return this.performDeduplication;
        }
        set PageSize(value: number) {
            this.pageSize = value;
        }
        get PageSize(): number {
            return this.pageSize;
        }
        set PageItemReference(value: string) {
            this.pageItemReference = value;
        }
        get PageItemReference(): string {
            return this.pageItemReference;
        }
        set PageDirection(value: SearchPageDirection) {
            this.pageDirection = value;
        }
        get PageDirection(): SearchPageDirection {
            return this.pageDirection;
        }
        ServerVersion: number = 0;
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SearchMailboxesResponse {
            return new SearchMailboxesResponse();
        }
        GetResponseXmlElementName(): string {
            return "SearchMailboxesResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SearchMailboxesResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "SearchMailboxes";
        }
        Validate(): void {
            super.Validate();
            if (this.SearchQueries === null || this.SearchQueries.Count === 0) {
                throw new ServiceValidationException(Strings.MailboxQueriesParameterIsNotSpecified);
            }
            var enumerator: List_Enumerator<MailboxQuery> = this.SearchQueries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: MailboxQuery = enumerator.Current;
                    if (current.MailboxSearchScopes === null || current.MailboxSearchScopes.length === 0) {
                        throw new ServiceValidationException(Strings.MailboxQueriesParameterIsNotSpecified);
                    }
                    var mailboxSearchScopes: MailboxSearchScope[] = current.MailboxSearchScopes;
                    for (var i: number = 0; i < mailboxSearchScopes.length; i = i + 1) {
                        var mailboxSearchScope: MailboxSearchScope = mailboxSearchScopes[i];
                        if (mailboxSearchScope.ExtendedAttributes !== null && mailboxSearchScope.ExtendedAttributes.Count > 0 && !DiscoverySchemaChanges.SearchMailboxesExtendedData.IsCompatible(this)) {
                            throw new ServiceVersionException(NString.Format(Strings.ClassIncompatibleWithRequestVersion, new Type("ExtendedAttribute").Name, DiscoverySchemaChanges.SearchMailboxesExtendedData.MinimumServerVersion));
                        }
                        if (mailboxSearchScope.SearchScopeType !== MailboxSearchScopeType.LegacyExchangeDN && (!DiscoverySchemaChanges.SearchMailboxesExtendedData.IsCompatible(this) || !DiscoverySchemaChanges.SearchMailboxesAdditionalSearchScopes.IsCompatible(this))) {
                            throw new ServiceVersionException(NString.Format(Strings.EnumValueIncompatibleWithRequestVersion, MailboxSearchScopeType[mailboxSearchScope.SearchScopeType], new Type("Number").Name, DiscoverySchemaChanges.SearchMailboxesAdditionalSearchScopes.MinimumServerVersion));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (!NString.IsNullOrEmpty(this.SortByProperty)) {
                var propertyDefinitionBase: PropertyDefinitionBase = null;
                try {
                    propertyDefinitionBase = ServiceObjectSchema.FindPropertyDefinition(this.SortByProperty);
                }
                catch (ex_181) {
                    if (ex_181 instanceof KeyNotFoundException) {
                    }
                    else
                        throw ex_181;
                }
                if (propertyDefinitionBase === null) {
                    throw new ServiceValidationException(NString.Format(Strings.InvalidSortByPropertyForMailboxSearch, this.SortByProperty));
                }
            }
        }
        ParseResponse(reader: EwsServiceXmlReader): any;
        ParseResponse(jsonBody: JsonObject): any;
        ParseResponse(readerOrJsonBody: any): any {
            if (arguments.length === 1 && (readerOrJsonBody === null || readerOrJsonBody instanceof EwsServiceXmlReader)) {
                return this.ParseResponse_0(readerOrJsonBody);
            }
            return this.ParseResponse_1(readerOrJsonBody);
        }
        private ParseResponse_0(reader: EwsServiceXmlReader): any {
            var serviceResponseCollection: ServiceResponseCollection<SearchMailboxesResponse> = new ServiceResponseCollection<SearchMailboxesResponse>();
            reader.ReadStartElement(XmlNamespace.Messages, "ResponseMessages");
            while (true) {
                reader.Read();
                if (reader.IsEndElement(XmlNamespace.Messages, "ResponseMessages")) {
                    break;
                }
                var searchMailboxesResponse: SearchMailboxesResponse = new SearchMailboxesResponse();
                searchMailboxesResponse.LoadFromXml(reader, this.GetResponseMessageXmlElementName());
                serviceResponseCollection.Add(searchMailboxesResponse);
            }
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "ResponseMessages");
            return serviceResponseCollection;
        }
        private ParseResponse_1(jsonBody: JsonObject): any {
            var serviceResponseCollection: ServiceResponseCollection<SearchMailboxesResponse> = new ServiceResponseCollection<SearchMailboxesResponse>();
            var array: any[] = jsonBody.ReadAsJsonObject("ResponseMessages").ReadAsArray("Items");
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var obj: any = array2[i];
                var searchMailboxesResponse: SearchMailboxesResponse = new SearchMailboxesResponse();
                searchMailboxesResponse.LoadFromJson(((obj instanceof JsonObject) ? <JsonObject>obj : null), this.Service);
                serviceResponseCollection.Add(searchMailboxesResponse);
            }
            return serviceResponseCollection;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "SearchQueries");
            var enumerator: List_Enumerator<MailboxQuery> = this.SearchQueries.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: MailboxQuery = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Types, "MailboxQuery");
                    writer.WriteElementValue(XmlNamespace.Types, "Query", current.Query);
                    writer.WriteStartElement(XmlNamespace.Types, "MailboxSearchScopes");
                    var mailboxSearchScopes: MailboxSearchScope[] = current.MailboxSearchScopes;
                    for (var i: number = 0; i < mailboxSearchScopes.length; i = i + 1) {
                        var mailboxSearchScope: MailboxSearchScope = mailboxSearchScopes[i];
                        if (mailboxSearchScope.SearchScopeType === MailboxSearchScopeType.LegacyExchangeDN || DiscoverySchemaChanges.SearchMailboxesAdditionalSearchScopes.IsCompatible(this)) {
                            writer.WriteStartElement(XmlNamespace.Types, "MailboxSearchScope");
                            writer.WriteElementValue(XmlNamespace.Types, "Mailbox", mailboxSearchScope.Mailbox);
                            writer.WriteElementValue(XmlNamespace.Types, "SearchScope", mailboxSearchScope.SearchScope);
                            if (DiscoverySchemaChanges.SearchMailboxesExtendedData.IsCompatible(this)) {
                                writer.WriteStartElement(XmlNamespace.Types, "ExtendedAttributes");
                                if (mailboxSearchScope.SearchScopeType !== MailboxSearchScopeType.LegacyExchangeDN) {
                                    writer.WriteStartElement(XmlNamespace.Types, "ExtendedAttribute");
                                    writer.WriteElementValue(XmlNamespace.Types, "Name", "SearchScopeType");
                                    writer.WriteElementValue(XmlNamespace.Types, "Value", mailboxSearchScope.SearchScopeType);
                                    writer.WriteEndElement();
                                }
                                if (mailboxSearchScope.ExtendedAttributes !== null && mailboxSearchScope.ExtendedAttributes.Count > 0) {
                                    var enumerator2: List_Enumerator<ExtendedAttribute> = mailboxSearchScope.ExtendedAttributes.GetEnumerator();
                                    try {
                                        while (enumerator2.MoveNext()) {
                                            var current2: ExtendedAttribute = enumerator2.Current;
                                            writer.WriteStartElement(XmlNamespace.Types, "ExtendedAttribute");
                                            writer.WriteElementValue(XmlNamespace.Types, "Name", current2.Name);
                                            writer.WriteElementValue(XmlNamespace.Types, "Value", current2.Value);
                                            writer.WriteEndElement();
                                        }
                                    }
                                    finally {
                                        (<IDisposable>enumerator2).Dispose();
                                    }
                                }
                                writer.WriteEndElement();
                            }
                            writer.WriteEndElement();
                        }
                    }
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            writer.WriteElementValue(XmlNamespace.Messages, "ResultType", this.ResultType);
            if (this.PreviewItemResponseShape !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "PreviewItemResponseShape");
                writer.WriteElementValue(XmlNamespace.Types, "BaseShape", this.PreviewItemResponseShape.BaseShape);
                if (ExtendedPropertyDefinition.op_Inequality(this.PreviewItemResponseShape.AdditionalProperties, null) && this.PreviewItemResponseShape.AdditionalProperties.length > 0) {
                    writer.WriteStartElement(XmlNamespace.Types, "AdditionalProperties");
                    var additionalProperties: ExtendedPropertyDefinition[] = this.PreviewItemResponseShape.AdditionalProperties;
                    for (var j: number = 0; j < additionalProperties.length; j = j + 1) {
                        var extendedPropertyDefinition: ExtendedPropertyDefinition = additionalProperties[j];
                        extendedPropertyDefinition.WriteToXml(writer);
                    }
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            if (!NString.IsNullOrEmpty(this.SortByProperty)) {
                writer.WriteStartElement(XmlNamespace.Messages, "SortBy");
                writer.WriteAttributeValue("Order", SortDirection[this.SortOrder]);
                writer.WriteStartElement(XmlNamespace.Types, "FieldURI");
                writer.WriteAttributeValue("FieldURI", this.sortByProperty);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            if (!NString.IsNullOrEmpty(this.Language)) {
                writer.WriteElementValue(XmlNamespace.Messages, "Language", this.Language);
            }
            writer.WriteElementValue(XmlNamespace.Messages, "Deduplication", this.performDeduplication);
            if (this.PageSize > 0) {
                writer.WriteElementValue(XmlNamespace.Messages, "PageSize", NNumber.ToString(this.PageSize));
            }
            if (!NString.IsNullOrEmpty(this.PageItemReference)) {
                writer.WriteElementValue(XmlNamespace.Messages, "PageItemReference", this.PageItemReference);
            }
            writer.WriteElementValue(XmlNamespace.Messages, "PageDirection", SearchPageDirection[this.PageDirection]);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class SendItemRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        private items: IEnumerable<Item> = null;
        private savedCopyDestinationFolderId: FolderId = null;
        set Items(value: IEnumerable<Item>) {
            this.items = value;
        }
        get Items(): IEnumerable<Item> {
            return this.items;
        }
        set SavedCopyDestinationFolderId(value: FolderId) {
            this.savedCopyDestinationFolderId = value;
        }
        get SavedCopyDestinationFolderId(): FolderId {
            return this.savedCopyDestinationFolderId;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Items, "Items");
            if (this.SavedCopyDestinationFolderId !== null) {
                this.SavedCopyDestinationFolderId.Validate(this.Service.RequestedServerVersion);
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return EwsUtilities.GetEnumeratedObjectCount(this.Items);
        }
        GetXmlElementName(): string {
            return "SendItem";
        }
        GetResponseXmlElementName(): string {
            return "SendItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SendItemResponseMessage";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("SaveItemToFolder", this.SavedCopyDestinationFolderId !== null);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "ItemIds");
            var enumerator: IEnumerator<Item> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    current.Id.WriteToXml(writer, "ItemId");
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
            if (this.SavedCopyDestinationFolderId !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "SavedItemFolderId");
                this.SavedCopyDestinationFolderId.WriteToXml(writer);
                writer.WriteEndElement();
            }
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("SaveItemToFolder", this.SavedCopyDestinationFolderId !== null);
            if (this.SavedCopyDestinationFolderId !== null) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("BaseFolderId", this.SavedCopyDestinationFolderId.InternalToJson(service));
                jsonObject.Add("SavedItemFolderId", jsonObject2);
            }
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<Item> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    list.Add(current.Id.InternalToJson(service));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            jsonObject.Add("ItemIds", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
    }
    class SetClientExtensionRequest extends MultiResponseServiceRequest<ServiceResponse>
    {
        private actions: List<SetClientExtensionAction> = null;
        constructor(service: ExchangeService, actions: List<SetClientExtensionAction>) {
            super(service, ServiceErrorHandling.ThrowOnError);
            this.actions = actions;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.actions, "actions");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        GetExpectedResponseMessageCount(): number {
            return this.actions.Count;
        }
        GetXmlElementName(): string {
            return "SetClientExtension";
        }
        GetResponseXmlElementName(): string {
            return "SetClientExtensionResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SetClientExtensionResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "Actions");
            var enumerator: List_Enumerator<SetClientExtensionAction> = this.actions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: SetClientExtensionAction = enumerator.Current;
                    current.WriteToXml(writer, "Action");
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
    }
    class SetEncryptionConfigurationRequest extends SimpleServiceRequestBase {
        private imageBase64: string = null;
        private emailText: string = null;
        private portalText: string = null;
        private disclaimerText: string = null;
        get ImageBase64(): string {
            return this.imageBase64;
        }
        get EmailText(): string {
            return this.emailText;
        }
        get PortalText(): string {
            return this.portalText;
        }
        get DisclaimerText(): string {
            return this.disclaimerText;
        }
        constructor(service: ExchangeService, imageBase64: string, emailText: string, portalText: string, disclaimerText: string) {
            super(service);
            this.emailText = emailText;
            this.portalText = portalText;
            this.imageBase64 = imageBase64;
            this.disclaimerText = disclaimerText;
        }
        GetXmlElementName(): string {
            return "SetEncryptionConfiguration";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "ImageBase64", this.ImageBase64);
            writer.WriteElementValue(XmlNamespace.Messages, "EmailText", this.EmailText);
            writer.WriteElementValue(XmlNamespace.Messages, "PortalText", this.PortalText);
            writer.WriteElementValue(XmlNamespace.Messages, "DisclaimerText", this.disclaimerText);
        }
        GetResponseXmlElementName(): string {
            return "SetEncryptionConfigurationResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var setEncryptionConfigurationResponse: SetEncryptionConfigurationResponse = new SetEncryptionConfigurationResponse();
            setEncryptionConfigurationResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return setEncryptionConfigurationResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): ServiceResponse {
            var setEncryptionConfigurationResponse: SetEncryptionConfigurationResponse = <SetEncryptionConfigurationResponse>super.InternalExecute();
            setEncryptionConfigurationResponse.ThrowIfNecessary();
            return setEncryptionConfigurationResponse;
        }
    }
    class SetHoldOnMailboxesRequest extends SimpleServiceRequestBase implements IJsonSerializable {
        ActionType: HoldAction = 0;
        HoldId: string = null;
        Query: string = null;
        Mailboxes: string[] = null;
        Language: string = null;
        InPlaceHoldIdentity: string = null;
        ItemHoldPeriod: string = null;
        constructor(service: ExchangeService) {
            super(service);
        }
        GetResponseXmlElementName(): string {
            return "SetHoldOnMailboxesResponse";
        }
        GetXmlElementName(): string {
            return "SetHoldOnMailboxes";
        }
        Validate(): void {
            super.Validate();
            if (NString.IsNullOrEmpty(this.HoldId)) {
                throw new ServiceValidationException(Strings.HoldIdParameterIsNotSpecified);
            }
            if (NString.IsNullOrEmpty(this.InPlaceHoldIdentity) && (this.Mailboxes === null || this.Mailboxes.length === 0)) {
                throw new ServiceValidationException(Strings.HoldMailboxesParameterIsNotSpecified);
            }
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var setHoldOnMailboxesResponse: SetHoldOnMailboxesResponse = new SetHoldOnMailboxesResponse();
            setHoldOnMailboxesResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return setHoldOnMailboxesResponse;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "ActionType", HoldAction[this.ActionType]);
            writer.WriteElementValue(XmlNamespace.Messages, "HoldId", this.HoldId);
            writer.WriteElementValue(XmlNamespace.Messages, "Query", this.Query || NString.Empty);
            if (this.Mailboxes !== null && this.Mailboxes.length > 0) {
                writer.WriteStartElement(XmlNamespace.Messages, "Mailboxes");
                var mailboxes: string[] = this.Mailboxes;
                for (var i: number = 0; i < mailboxes.length; i = i + 1) {
                    var value: string = mailboxes[i];
                    writer.WriteElementValue(XmlNamespace.Types, "String", value);
                }
                writer.WriteEndElement();
            }
            if (!NString.IsNullOrEmpty(this.Language)) {
                writer.WriteElementValue(XmlNamespace.Messages, "Language", this.Language);
            }
            if (!NString.IsNullOrEmpty(this.InPlaceHoldIdentity)) {
                writer.WriteElementValue(XmlNamespace.Messages, "InPlaceHoldIdentity", this.InPlaceHoldIdentity);
            }
            if (!NString.IsNullOrEmpty(this.ItemHoldPeriod)) {
                writer.WriteElementValue(XmlNamespace.Messages, "ItemHoldPeriod", this.ItemHoldPeriod);
            }
        }
        Execute(): SetHoldOnMailboxesResponse {
            return <SetHoldOnMailboxesResponse>super.InternalExecute();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        ToJson(service: ExchangeService): any {
            return new JsonObject();
        }
    }
    class SetTeamMailboxRequest extends SimpleServiceRequestBase {
        private emailAddress: EmailAddress = null;
        private sharePointSiteUrl: Uri = null;
        private state: TeamMailboxLifecycleState = 0;
        constructor(service: ExchangeService, emailAddress: EmailAddress, sharePointSiteUrl: Uri, state: TeamMailboxLifecycleState) {
            super(service);
            if (emailAddress === null) {
                throw new ArgumentNullException("emailAddress");
            }
            if (Uri.op_Equality(sharePointSiteUrl, null)) {
                throw new ArgumentNullException("sharePointSiteUrl");
            }
            this.emailAddress = emailAddress;
            this.sharePointSiteUrl = sharePointSiteUrl;
            this.state = state;
        }
        GetXmlElementName(): string {
            return "SetTeamMailbox";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.emailAddress.WriteToXml(writer, XmlNamespace.Messages, "EmailAddress");
            writer.WriteElementValue(XmlNamespace.Messages, "SharePointSiteUrl", this.sharePointSiteUrl.ToString());
            writer.WriteElementValue(XmlNamespace.Messages, "State", TeamMailboxLifecycleState[this.state]);
        }
        GetResponseXmlElementName(): string {
            return "SetTeamMailboxResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var serviceResponse: ServiceResponse = new ServiceResponse();
            serviceResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return serviceResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): ServiceResponse {
            var serviceResponse: ServiceResponse = <ServiceResponse>super.InternalExecute();
            serviceResponse.ThrowIfNecessary();
            return serviceResponse;
        }
    }
    class SetUserOofSettingsRequest extends SimpleServiceRequestBase {
        private smtpAddress: string = null;
        private oofSettings: OofSettings = null;
        set SmtpAddress(value: string) {
            this.smtpAddress = value;
        }
        get SmtpAddress(): string {
            return this.smtpAddress;
        }
        set OofSettings(value: OofSettings) {
            this.oofSettings = value;
        }
        get OofSettings(): OofSettings {
            return this.oofSettings;
        }
        GetXmlElementName(): string {
            return "SetUserOofSettingsRequest";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.SmtpAddress, "SmtpAddress");
            EwsUtilities.ValidateParam(this.OofSettings, "OofSettings");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "Mailbox");
            writer.WriteElementValue(XmlNamespace.Types, "Address", this.SmtpAddress);
            writer.WriteEndElement();
            this.OofSettings.WriteToXml(writer, "UserOofSettings");
        }
        GetResponseXmlElementName(): string {
            return "SetUserOofSettingsResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var serviceResponse: ServiceResponse = new ServiceResponse();
            serviceResponse.LoadFromXml(reader, "ResponseMessage");
            return serviceResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Execute(): ServiceResponse {
            var serviceResponse: ServiceResponse = <ServiceResponse>super.InternalExecute();
            serviceResponse.ThrowIfNecessary();
            return serviceResponse;
        }
    }
    class SubscribeRequest<TSubscription> extends MultiResponseServiceRequest<SubscribeResponse<TSubscription>> implements IJsonSerializable {
        FolderIds: FolderIdWrapperList = null;
        EventTypes: List<EventType> = null;
        Watermark: string = null;
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.FolderIds, "FolderIds");
            EwsUtilities.ValidateParamCollection(this.EventTypes, "EventTypes");
            this.FolderIds.Validate(this.Service.RequestedServerVersion);
            if (Enumerable.Count<EventType>(this.EventTypes, (eventType: EventType) => { return eventType === EventType.Status; }) > 0) {
                throw new ServiceValidationException(Strings.CannotSubscribeToStatusEvents);
            }
            if (!NString.IsNullOrEmpty(this.Watermark)) {
                EwsUtilities.ValidateNonBlankStringParam(this.Watermark, "Watermark");
            }
            this.EventTypes.ForEach((eventType: EventType) => {
                EwsUtilities.ValidateEnumVersionValue(eventType, this.Service.RequestedServerVersion);
            });
        }
        GetSubscriptionXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "Subscribe";
        }
        GetResponseXmlElementName(): string {
            return "SubscribeResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SubscribeResponseMessage";
        }
        InternalWriteElementsToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, this.GetSubscriptionXmlElementName());
            if (this.FolderIds.Count === 0) {
                writer.WriteAttributeValue("SubscribeToAllFolders", true);
            }
            this.FolderIds.WriteToXml(writer, XmlNamespace.Types, "FolderIds");
            writer.WriteStartElement(XmlNamespace.Types, "EventTypes");
            var enumerator: List_Enumerator<EventType> = this.EventTypes.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: EventType = enumerator.Current;
                    writer.WriteElementValue(XmlNamespace.Types, "EventType", current);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            if (!NString.IsNullOrEmpty(this.Watermark)) {
                writer.WriteElementValue(XmlNamespace.Types, "Watermark", this.Watermark);
            }
            this.InternalWriteElementsToXml(writer);
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.AddTypeParameter(this.GetSubscriptionXmlElementName());
            jsonObject2.Add("EventTypes", this.EventTypes.ToArray());
            if (this.FolderIds.Count > 0) {
                jsonObject2.Add("FolderIds", this.FolderIds.InternalToJson(service));
            }
            else {
                jsonObject2.Add("SubscribeToAllFolders", true);
            }
            if (!NString.IsNullOrEmpty(this.Watermark)) {
                jsonObject2.Add("Watermark", this.Watermark);
            }
            this.AddJsonProperties(jsonObject2, service);
            jsonObject.Add("SubscriptionRequest", jsonObject2);
            return jsonObject;
        }
        AddJsonProperties(jsonSubscribeRequest: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
            this.FolderIds = new FolderIdWrapperList();
            this.EventTypes = new List<EventType>();
        }
    }
    class SubscribeToPullNotificationsRequest extends SubscribeRequest<PullSubscription>
    {
        private timeout: number = 30;
        set Timeout(value: number) {
            this.timeout = value;
        }
        get Timeout(): number {
            return this.timeout;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            if (this.Timeout < 1 || this.Timeout > 1440) {
                throw new ArgumentException(NString.Format(Strings.InvalidTimeoutValue, this.Timeout));
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SubscribeResponse<PullSubscription> {
            return new SubscribeResponse<PullSubscription>(new PullSubscription(service));
        }
        GetSubscriptionXmlElementName(): string {
            return "PullSubscriptionRequest";
        }
        InternalWriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Timeout", this.Timeout);
        }
        AddJsonProperties(jsonSubscribeRequest: JsonObject, service: ExchangeService): void {
            jsonSubscribeRequest.Add("Timeout", this.Timeout);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class SubscribeToPushNotificationsRequest extends SubscribeRequest<PushSubscription>
    {
        private frequency: number = 30;
        private url: Uri = null;
        private callerData: string = null;
        set Frequency(value: number) {
            this.frequency = value;
        }
        get Frequency(): number {
            return this.frequency;
        }
        set Url(value: Uri) {
            this.url = value;
        }
        get Url(): Uri {
            return this.url;
        }
        set CallerData(value: string) {
            this.callerData = value;
        }
        get CallerData(): string {
            return this.callerData;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Url, "Url");
            if (this.Frequency < 1 || this.Frequency > 1440) {
                throw new ArgumentException(NString.Format(Strings.InvalidFrequencyValue, this.Frequency));
            }
        }
        GetSubscriptionXmlElementName(): string {
            return "PushSubscriptionRequest";
        }
        InternalWriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "StatusFrequency", this.Frequency);
            writer.WriteElementValue(XmlNamespace.Types, "URL", this.Url.ToString());
            if (this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2013 && !NString.IsNullOrEmpty(this.callerData)) {
                writer.WriteElementValue(XmlNamespace.Types, "CallerData", this.CallerData);
            }
        }
        AddJsonProperties(jsonSubscribeRequest: JsonObject, service: ExchangeService): void {
            jsonSubscribeRequest.Add("StatusFrequency", this.Frequency);
            jsonSubscribeRequest.Add("URL", this.Url.ToString());
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SubscribeResponse<PushSubscription> {
            return new SubscribeResponse<PushSubscription>(new PushSubscription(service));
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class SubscribeToStreamingNotificationsRequest extends SubscribeRequest<StreamingSubscription>
    {
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            if (!NString.IsNullOrEmpty(this.Watermark)) {
                throw new ArgumentException("Watermarks cannot be used with StreamingSubscriptions.", "Watermark");
            }
        }
        GetSubscriptionXmlElementName(): string {
            return "StreamingSubscriptionRequest";
        }
        InternalWriteElementsToXml(writer: EwsServiceXmlWriter): void {
        }
        AddJsonProperties(jsonSubscribeRequest: JsonObject, service: ExchangeService): void {
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SubscribeResponse<StreamingSubscription> {
            return new SubscribeResponse<StreamingSubscription>(new StreamingSubscription(service));
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
    }
    class SyncFolderHierarchyRequest extends MultiResponseServiceRequest<SyncFolderHierarchyResponse> implements IJsonSerializable {
        private propertySet: PropertySet = null;
        private syncFolderId: FolderId = null;
        private syncState: string = null;
        set PropertySet(value: PropertySet) {
            this.propertySet = value;
        }
        get PropertySet(): PropertySet {
            return this.propertySet;
        }
        set SyncFolderId(value: FolderId) {
            this.syncFolderId = value;
        }
        get SyncFolderId(): FolderId {
            return this.syncFolderId;
        }
        set SyncState(value: string) {
            this.syncState = value;
        }
        get SyncState(): string {
            return this.syncState;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SyncFolderHierarchyResponse {
            return new SyncFolderHierarchyResponse(this.PropertySet);
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "SyncFolderHierarchy";
        }
        GetResponseXmlElementName(): string {
            return "SyncFolderHierarchyResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SyncFolderHierarchyResponseMessage";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.PropertySet, "PropertySet");
            if (this.SyncFolderId !== null) {
                this.SyncFolderId.Validate(this.Service.RequestedServerVersion);
            }
            this.PropertySet.ValidateForRequest(this, false);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.PropertySet.WriteToXml(writer, ServiceObjectType.Folder);
            if (this.SyncFolderId !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "SyncFolderId");
                this.SyncFolderId.WriteToXml(writer);
                writer.WriteEndElement();
            }
            writer.WriteElementValue(XmlNamespace.Messages, "SyncState", this.SyncState);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.propertySet.WriteGetShapeToJson(jsonObject, service, ServiceObjectType.Folder);
            if (this.SyncFolderId !== null) {
                var jsonObject2: JsonObject = new JsonObject();
                jsonObject2.Add("BaseFolderId", this.SyncFolderId.InternalToJson(service));
                jsonObject.Add("SyncFolderId", jsonObject2);
            }
            jsonObject.Add("SyncState", this.SyncState);
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class SyncFolderItemsRequest extends MultiResponseServiceRequest<SyncFolderItemsResponse> implements IJsonSerializable {
        private propertySet: PropertySet = null;
        private syncFolderId: FolderId = null;
        private syncScope: SyncFolderItemsScope = 0;
        private syncState: string = null;
        private ignoredItemIds: ItemIdWrapperList = new ItemIdWrapperList();
        private maxChangesReturned: number = 100;
        set PropertySet(value: PropertySet) {
            this.propertySet = value;
        }
        get PropertySet(): PropertySet {
            return this.propertySet;
        }
        set SyncFolderId(value: FolderId) {
            this.syncFolderId = value;
        }
        get SyncFolderId(): FolderId {
            return this.syncFolderId;
        }
        set SyncScope(value: SyncFolderItemsScope) {
            this.syncScope = value;
        }
        get SyncScope(): SyncFolderItemsScope {
            return this.syncScope;
        }
        set SyncState(value: string) {
            this.syncState = value;
        }
        get SyncState(): string {
            return this.syncState;
        }
        get IgnoredItemIds(): ItemIdWrapperList {
            return this.ignoredItemIds;
        }
        set MaxChangesReturned(value: number) {
            if (value >= 1 && value <= 512) {
                this.maxChangesReturned = value;
                return;
            }
            throw new ArgumentException(Strings.MaxChangesMustBeBetween1And512);
        }
        get MaxChangesReturned(): number {
            return this.maxChangesReturned;
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): SyncFolderItemsResponse {
            return new SyncFolderItemsResponse(this.PropertySet);
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "SyncFolderItems";
        }
        GetResponseXmlElementName(): string {
            return "SyncFolderItemsResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "SyncFolderItemsResponseMessage";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.PropertySet, "PropertySet");
            EwsUtilities.ValidateParam(this.SyncFolderId, "SyncFolderId");
            this.SyncFolderId.Validate(this.Service.RequestedServerVersion);
            if (this.Service.RequestedServerVersion < ExchangeVersion.Exchange2010 && this.syncScope !== SyncFolderItemsScope.NormalItems) {
                throw new ServiceVersionException(NString.Format(Strings.EnumValueIncompatibleWithRequestVersion, SyncFolderItemsScope[this.syncScope], this.syncScope.GetType().Name, ExchangeVersion.Exchange2010));
            }
            this.PropertySet.ValidateForRequest(this, true);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.PropertySet.WriteToXml(writer, ServiceObjectType.Item);
            writer.WriteStartElement(XmlNamespace.Messages, "SyncFolderId");
            this.SyncFolderId.WriteToXml(writer);
            writer.WriteEndElement();
            writer.WriteElementValue(XmlNamespace.Messages, "SyncState", this.SyncState);
            this.IgnoredItemIds.WriteToXml(writer, XmlNamespace.Messages, "Ignore");
            writer.WriteElementValue(XmlNamespace.Messages, "MaxChangesReturned", this.MaxChangesReturned);
            if (this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2010) {
                writer.WriteElementValue(XmlNamespace.Messages, "SyncScope", this.syncScope);
            }
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.propertySet.WriteGetShapeToJson(jsonObject, service, ServiceObjectType.Item);
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.Add("BaseFolderId", this.SyncFolderId.InternalToJson(service));
            jsonObject.Add("SyncFolderId", jsonObject2);
            jsonObject.Add("SyncState", this.SyncState);
            if (this.IgnoredItemIds.Count > 0) {
                jsonObject.Add("Ignore", this.IgnoredItemIds.InternalToJson(service));
            }
            jsonObject.Add("MaxChangesReturned", this.MaxChangesReturned);
            if (this.Service.RequestedServerVersion >= ExchangeVersion.Exchange2010) {
                jsonObject.Add("SyncScope", this.SyncScope);
            }
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class UninstallAppRequest extends SimpleServiceRequestBase {
        private ID: string = null;
        constructor(service: ExchangeService, id: string) {
            super(service);
            this.ID = id;
        }
        GetXmlElementName(): string {
            return "UninstallApp";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "ID", this.ID);
        }
        GetResponseXmlElementName(): string {
            return "UninstallAppResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var uninstallAppResponse: UninstallAppResponse = new UninstallAppResponse();
            uninstallAppResponse.LoadFromXml(reader, "UninstallAppResponse");
            return uninstallAppResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): UninstallAppResponse {
            var uninstallAppResponse: UninstallAppResponse = <UninstallAppResponse>super.InternalExecute();
            uninstallAppResponse.ThrowIfNecessary();
            return uninstallAppResponse;
        }
    }
    class UnpinTeamMailboxRequest extends SimpleServiceRequestBase {
        private emailAddress: EmailAddress = null;
        constructor(service: ExchangeService, emailAddress: EmailAddress) {
            super(service);
            if (emailAddress === null) {
                throw new ArgumentNullException("emailAddress");
            }
            this.emailAddress = emailAddress;
        }
        GetXmlElementName(): string {
            return "UnpinTeamMailbox";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.emailAddress.WriteToXml(writer, XmlNamespace.Messages, "EmailAddress");
        }
        GetResponseXmlElementName(): string {
            return "UnpinTeamMailboxResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var serviceResponse: ServiceResponse = new ServiceResponse();
            serviceResponse.LoadFromXml(reader, this.GetResponseXmlElementName());
            return serviceResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2013;
        }
        Execute(): ServiceResponse {
            var serviceResponse: ServiceResponse = <ServiceResponse>super.InternalExecute();
            serviceResponse.ThrowIfNecessary();
            return serviceResponse;
        }
    }
    class UnsubscribeRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        SubscriptionId: string = null;
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "Unsubscribe";
        }
        GetResponseXmlElementName(): string {
            return "UnsubscribeResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "UnsubscribeResponseMessage";
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateNonBlankStringParam(this.SubscriptionId, "SubscriptionId");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Messages, "SubscriptionId", this.SubscriptionId);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("SubscriptionId", this.SubscriptionId);
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class UpdateDelegateRequest extends DelegateManagementRequestBase<DelegateManagementResponse>
    {
        private delegateUsers: List<DelegateUser> = new List<DelegateUser>();
        private meetingRequestsDeliveryScope: Nullable<MeetingRequestsDeliveryScope> = null;
        set MeetingRequestsDeliveryScope(value: Nullable<MeetingRequestsDeliveryScope>) {
            this.meetingRequestsDeliveryScope = value;
        }
        get MeetingRequestsDeliveryScope(): Nullable<MeetingRequestsDeliveryScope> {
            return this.meetingRequestsDeliveryScope;
        }
        get DelegateUsers(): List<DelegateUser> {
            return this.delegateUsers;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.DelegateUsers, "DelegateUsers");
            var enumerator: List_Enumerator<DelegateUser> = this.DelegateUsers.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DelegateUser = enumerator.Current;
                    current.ValidateUpdateDelegate();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Messages, "DelegateUsers");
            var enumerator: List_Enumerator<DelegateUser> = this.DelegateUsers.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DelegateUser = enumerator.Current;
                    current.WriteToXml(writer, "DelegateUser");
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            if (this.MeetingRequestsDeliveryScope !== null) {
                writer.WriteElementValue(XmlNamespace.Messages, "DeliverMeetingRequests", this.MeetingRequestsDeliveryScope.Value);
            }
        }
        GetResponseXmlElementName(): string {
            return "UpdateDelegateResponse";
        }
        CreateResponse(): DelegateManagementResponse {
            return new DelegateManagementResponse(true, this.delegateUsers);
        }
        GetXmlElementName(): string {
            return "UpdateDelegate";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class UpdateFolderRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        private folders: List<Folder> = new List<Folder>();
        get Folders(): List<Folder> {
            return this.folders;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.Folders, "Folders");
            for (var i: number = 0; i < this.Folders.Count; i = i + 1) {
                var folder: Folder = this.Folders.get_Item(i);
                if (folder === null || folder.IsNew) {
                    throw new ArgumentException(NString.Format(Strings.FolderToUpdateCannotBeNullOrNew, i));
                }
                folder.Validate();
            }
        }
        CreateServiceResponse(session: ExchangeService, responseIndex: number): ServiceResponse {
            return new UpdateFolderResponse(this.Folders.get_Item(responseIndex));
        }
        GetXmlElementName(): string {
            return "UpdateFolder";
        }
        GetResponseXmlElementName(): string {
            return "UpdateFolderResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "UpdateFolderResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return this.folders.Count;
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "FolderChanges");
            var enumerator: List_Enumerator<Folder> = this.folders.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Folder = enumerator.Current;
                    current.WriteToXmlForUpdate(writer);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<Folder> = this.folders.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Folder = enumerator.Current;
                    list.Add(current.WriteToJsonForUpdate(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("FolderChanges", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class UpdateInboxRulesRequest extends SimpleServiceRequestBase {
        private mailboxSmtpAddress: string = null;
        private removeOutlookRuleBlob: boolean = false;
        private inboxRuleOperations: IEnumerable<RuleOperation> = null;
        set MailboxSmtpAddress(value: string) {
            this.mailboxSmtpAddress = value;
        }
        get MailboxSmtpAddress(): string {
            return this.mailboxSmtpAddress;
        }
        set RemoveOutlookRuleBlob(value: boolean) {
            this.removeOutlookRuleBlob = value;
        }
        get RemoveOutlookRuleBlob(): boolean {
            return this.removeOutlookRuleBlob;
        }
        set InboxRuleOperations(value: IEnumerable<RuleOperation>) {
            this.inboxRuleOperations = value;
        }
        get InboxRuleOperations(): IEnumerable<RuleOperation> {
            return this.inboxRuleOperations;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetXmlElementName(): string {
            return "UpdateInboxRules";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (!NString.IsNullOrEmpty(this.mailboxSmtpAddress)) {
                writer.WriteElementValue(XmlNamespace.Messages, "MailboxSmtpAddress", this.mailboxSmtpAddress);
            }
            writer.WriteElementValue(XmlNamespace.Messages, "RemoveOutlookRuleBlob", this.RemoveOutlookRuleBlob);
            writer.WriteStartElement(XmlNamespace.Messages, "Operations");
            var enumerator: IEnumerator<RuleOperation> = this.inboxRuleOperations.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: RuleOperation = enumerator.Current;
                    current.WriteToXml(writer, current.XmlElementName);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            writer.WriteEndElement();
        }
        GetResponseXmlElementName(): string {
            return "UpdateInboxRulesResponse";
        }
        ParseResponse(reader: EwsServiceXmlReader): any {
            var updateInboxRulesResponse: UpdateInboxRulesResponse = new UpdateInboxRulesResponse();
            updateInboxRulesResponse.LoadFromXml(reader, "UpdateInboxRulesResponse");
            return updateInboxRulesResponse;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010_SP1;
        }
        Validate(): void {
            if (this.inboxRuleOperations === null) {
                throw new ArgumentException("RuleOperations cannot be null.", "Operations");
            }
            var num: number = 0;
            var enumerator: IEnumerator<RuleOperation> = this.inboxRuleOperations.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: RuleOperation = enumerator.Current;
                    EwsUtilities.ValidateParam(current, "RuleOperation");
                    num = num + 1;
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            if (num === 0) {
                throw new ArgumentException("RuleOperations cannot be empty.", "Operations");
            }
            this.Service.Validate();
        }
        Execute(): UpdateInboxRulesResponse {
            var updateInboxRulesResponse: UpdateInboxRulesResponse = <UpdateInboxRulesResponse>super.InternalExecute();
            if (updateInboxRulesResponse.Result === ServiceResult.Error) {
                throw new UpdateInboxRulesException(updateInboxRulesResponse, this.inboxRuleOperations.GetEnumerator());
            }
            return updateInboxRulesResponse;
        }
    }
    class UpdateItemRequest extends MultiResponseServiceRequest<UpdateItemResponse> implements IJsonSerializable {
        private items: List<Item> = new List<Item>();
        private savedItemsDestinationFolder: FolderId = null;
        private conflictResolutionMode: ConflictResolutionMode = 0;
        private messageDisposition: Nullable<MessageDisposition> = null;
        private sendInvitationsOrCancellationsMode: Nullable<SendInvitationsOrCancellationsMode> = null;
        get EmitTimeZoneHeader(): boolean {
            var enumerator: List_Enumerator<Item> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    if (current.GetIsTimeZoneHeaderRequired(true)) {
                        return true;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return false;
        }
        set MessageDisposition(value: Nullable<MessageDisposition>) {
            this.messageDisposition = value;
        }
        get MessageDisposition(): Nullable<MessageDisposition> {
            return this.messageDisposition;
        }
        set ConflictResolutionMode(value: ConflictResolutionMode) {
            this.conflictResolutionMode = value;
        }
        get ConflictResolutionMode(): ConflictResolutionMode {
            return this.conflictResolutionMode;
        }
        set SendInvitationsOrCancellationsMode(value: Nullable<SendInvitationsOrCancellationsMode>) {
            this.sendInvitationsOrCancellationsMode = value;
        }
        get SendInvitationsOrCancellationsMode(): Nullable<SendInvitationsOrCancellationsMode> {
            return this.sendInvitationsOrCancellationsMode;
        }
        SuppressReadReceipts: boolean = false;
        get Items(): List<Item> {
            return this.items;
        }
        set SavedItemsDestinationFolder(value: FolderId) {
            this.savedItemsDestinationFolder = value;
        }
        get SavedItemsDestinationFolder(): FolderId {
            return this.savedItemsDestinationFolder;
        }
        constructor(service: ExchangeService, errorHandlingMode: ServiceErrorHandling) {
            super(service, errorHandlingMode);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParamCollection(this.Items, "Items");
            for (var i: number = 0; i < this.Items.Count; i = i + 1) {
                if (this.Items.get_Item(i) === null || this.Items.get_Item(i).IsNew) {
                    throw new ArgumentException(NString.Format(Strings.ItemToUpdateCannotBeNullOrNew, i));
                }
            }
            if (this.SavedItemsDestinationFolder !== null) {
                this.SavedItemsDestinationFolder.Validate(this.Service.RequestedServerVersion);
            }
            var enumerator: List_Enumerator<Item> = this.Items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    current.Validate();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (this.SuppressReadReceipts && this.Service.RequestedServerVersion < ExchangeVersion.Exchange2013) {
                throw new ServiceVersionException(NString.Format(Strings.ParameterIncompatibleWithRequestVersion, "SuppressReadReceipts", ExchangeVersion.Exchange2013));
            }
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): UpdateItemResponse {
            return new UpdateItemResponse(this.Items.get_Item(responseIndex));
        }
        GetXmlElementName(): string {
            return "UpdateItem";
        }
        GetResponseXmlElementName(): string {
            return "UpdateItemResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "UpdateItemResponseMessage";
        }
        GetExpectedResponseMessageCount(): number {
            return this.items.Count;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            if (this.MessageDisposition !== null) {
                writer.WriteAttributeValue("MessageDisposition", this.MessageDisposition);
            }
            if (this.SuppressReadReceipts) {
                writer.WriteAttributeValue("SuppressReadReceipts", true);
            }
            writer.WriteAttributeValue("ConflictResolution", this.ConflictResolutionMode);
            if (this.SendInvitationsOrCancellationsMode !== null) {
                writer.WriteAttributeValue("SendMeetingInvitationsOrCancellations", this.SendInvitationsOrCancellationsMode.Value);
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            if (this.SavedItemsDestinationFolder !== null) {
                writer.WriteStartElement(XmlNamespace.Messages, "SavedItemFolderId");
                this.SavedItemsDestinationFolder.WriteToXml(writer);
                writer.WriteEndElement();
            }
            writer.WriteStartElement(XmlNamespace.Messages, "ItemChanges");
            var enumerator: List_Enumerator<Item> = this.items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    current.WriteToXmlForUpdate(writer);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            if (this.MessageDisposition !== null) {
                jsonObject.Add("MessageDisposition", <Enum>this.MessageDisposition);
            }
            jsonObject.Add("ConflictResolution", this.ConflictResolutionMode);
            if (this.SendInvitationsOrCancellationsMode !== null) {
                jsonObject.Add("SendMeetingInvitationsOrCancellations", this.SendInvitationsOrCancellationsMode.Value);
            }
            if (this.SuppressReadReceipts) {
                jsonObject.Add("SuppressReadReceipts", true);
            }
            if (this.SavedItemsDestinationFolder !== null) {
                jsonObject.Add("SavedItemFolderId", this.SavedItemsDestinationFolder.InternalToJson(service));
            }
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<Item> = this.items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    list.Add(current.WriteToJsonForUpdate(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            jsonObject.Add("ItemChanges", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class UpdateUserConfigurationRequest extends MultiResponseServiceRequest<ServiceResponse> implements IJsonSerializable {
        userConfiguration: UserConfiguration = null;
        set UserConfiguration(value: UserConfiguration) {
            this.userConfiguration = value;
        }
        get UserConfiguration(): UserConfiguration {
            return this.userConfiguration;
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.userConfiguration, "userConfiguration");
        }
        CreateServiceResponse(service: ExchangeService, responseIndex: number): ServiceResponse {
            return new ServiceResponse();
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2010;
        }
        GetExpectedResponseMessageCount(): number {
            return 1;
        }
        GetXmlElementName(): string {
            return "UpdateUserConfiguration";
        }
        GetResponseXmlElementName(): string {
            return "UpdateUserConfigurationResponse";
        }
        GetResponseMessageXmlElementName(): string {
            return "UpdateUserConfigurationResponseMessage";
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.userConfiguration.WriteToXml(writer, XmlNamespace.Messages, "UserConfiguration");
        }
        constructor(service: ExchangeService) {
            super(service, ServiceErrorHandling.ThrowOnError);
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserConfiguration", (<IJsonSerializable>this.UserConfiguration).ToJson(service));
            return jsonObject;
        }
    }
    class ServiceResponse {
        private result: ServiceResult = 0;
        private errorCode: ServiceError = 0;
        private errorMessage: string = null;
        private errorDetails: Dictionary<string, string> = new Dictionary<string, string>();
        private errorProperties: Collection<PropertyDefinitionBase> = new Collection<PropertyDefinitionBase>();
        get BatchProcessingStopped(): boolean {
            return this.result === ServiceResult.Warning && this.errorCode === ServiceError.ErrorBatchProcessingStopped;
        }
        get Result(): ServiceResult {
            return this.result;
        }
        get ErrorCode(): ServiceError {
            return this.errorCode;
        }
        set ErrorMessage(value: string) {
            this.errorMessage = value;
        }
        get ErrorMessage(): string {
            return this.errorMessage;
        }
        get ErrorDetails(): IDictionary<string, string> {
            return this.errorDetails;
        }
        get ErrorProperties(): Collection<PropertyDefinitionBase> {
            return this.errorProperties;
        }
        constructor();
        constructor(soapFaultDetails: SoapFaultDetails);
        constructor(responseCode: ServiceError, errorMessage: string);
        constructor(soapFaultDetailsOrResponseCode?: any, errorMessage?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (soapFaultDetailsOrResponseCode === null || soapFaultDetailsOrResponseCode instanceof SoapFaultDetails)) {
                this.constructor_1(soapFaultDetailsOrResponseCode);
                return;
            }
            this.constructor_2(soapFaultDetailsOrResponseCode, errorMessage);
        }
        private constructor_0(): void {
        }
        private constructor_1(soapFaultDetails: SoapFaultDetails): void {
            this.result = ServiceResult.Error;
            this.errorCode = soapFaultDetails.ResponseCode;
            this.errorMessage = soapFaultDetails.FaultString;
            this.errorDetails = soapFaultDetails.ErrorDetails;
        }
        private constructor_2(responseCode: ServiceError, errorMessage: string): void {
            this.result = ServiceResult.Error;
            this.errorCode = responseCode;
            this.errorMessage = errorMessage;
            this.errorDetails = null;
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void {
            if (!reader.IsStartElement(XmlNamespace.Messages, xmlElementName)) {
                reader.ReadStartElement(XmlNamespace.Messages, xmlElementName);
            }
            this.result = reader.ReadAttributeValue<ServiceResult>("ResponseClass");
            if (this.result === ServiceResult.Success || this.result === ServiceResult.Warning) {
                if (this.result === ServiceResult.Warning) {
                    this.errorMessage = reader.ReadElementValue(XmlNamespace.Messages, "MessageText");
                }
                this.errorCode = reader.ReadElementValue<ServiceError>(XmlNamespace.Messages, "ResponseCode");
                if (this.result === ServiceResult.Warning) {
                    reader.ReadElementValue<number>(XmlNamespace.Messages, "DescriptiveLinkKey");
                }
                if (this.BatchProcessingStopped) {
                    do {
                        reader.Read();
                    }
                    while (!reader.IsEndElement(XmlNamespace.Messages, xmlElementName));
                }
                else {
                    this.ReadElementsFromXml(reader);
                    reader.ReadEndElementIfNecessary(XmlNamespace.Messages, xmlElementName);
                }
            }
            else {
                this.errorMessage = reader.ReadElementValue(XmlNamespace.Messages, "MessageText");
                this.errorCode = reader.ReadElementValue<ServiceError>(XmlNamespace.Messages, "ResponseCode");
                reader.ReadElementValue<number>(XmlNamespace.Messages, "DescriptiveLinkKey");
                while (!reader.IsEndElement(XmlNamespace.Messages, xmlElementName)) {
                    reader.Read();
                    if (reader.IsStartElement() && !this.LoadExtraErrorDetailsFromXml(reader, reader.LocalName)) {
                        reader.SkipCurrentElement();
                    }
                }
            }
            this.MapErrorCodeToErrorMessage();
            this.Loaded();
        }
        LoadFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.result = <ServiceResult>Enum.Parse(new Type("Number"), responseObject.ReadAsString("ResponseClass"));
            this.errorCode = <ServiceError>Enum.Parse(new Type("Number"), responseObject.ReadAsString("ResponseCode"));
            if (this.result === ServiceResult.Warning || this.result === ServiceResult.Error) {
                this.errorMessage = responseObject.ReadAsString("MessageText");
            }
            if ((this.result === ServiceResult.Success || this.result === ServiceResult.Warning) && !this.BatchProcessingStopped) {
                this.ReadElementsFromJson(responseObject, service);
            }
            this.MapErrorCodeToErrorMessage();
            this.Loaded();
        }
        private ParseMessageXml(reader: EwsServiceXmlReader): void {
            do {
                reader.Read();
                var localName: string;
                if (reader.IsStartElement() && (localName = reader.LocalName) !== null) {
                    if (!(localName === "Value")) {
                        if (!(localName === "FieldURI")) {
                            if (!(localName === "IndexedFieldURI")) {
                                if (localName === "ExtendedFieldURI") {
                                    var extendedPropertyDefinition: ExtendedPropertyDefinition = new ExtendedPropertyDefinition();
                                    extendedPropertyDefinition.LoadFromXml(reader);
                                    this.errorProperties.Add(extendedPropertyDefinition);
                                }
                            }
                            else {
                                this.errorProperties.Add(new IndexedPropertyDefinition(reader.ReadAttributeValue("FieldURI"), reader.ReadAttributeValue("FieldIndex")));
                            }
                        }
                        else {
                            this.errorProperties.Add(ServiceObjectSchema.FindPropertyDefinition(reader.ReadAttributeValue("FieldURI")));
                        }
                    }
                    else {
                        this.errorDetails.Add(reader.ReadAttributeValue("Name"), reader.ReadElementValue());
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "MessageXml"));
        }
        Loaded(): void {
        }
        MapErrorCodeToErrorMessage(): void {
            if (this.ErrorCode === ServiceError.ErrorIrresolvableConflict) {
                this.ErrorMessage = Strings.ItemIsOutOfDate;
            }
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
        }
        LoadExtraErrorDetailsFromXml(reader: EwsServiceXmlReader, xmlElementName: string): boolean {
            if (reader.IsStartElement(XmlNamespace.Messages, "MessageXml") && !reader.IsEmptyElement) {
                this.ParseMessageXml(reader);
                return true;
            }
            return false;
        }
        ThrowIfNecessary(): void {
            this.InternalThrowIfNecessary();
        }
        InternalThrowIfNecessary(): void {
            if (this.Result === ServiceResult.Error) {
                throw new ServiceResponseException(this);
            }
        }
    }
    class ArchiveItemResponse extends ServiceResponse {
        private item: Item = null;
        get Item(): Item {
            return this.item;
        }
        constructor() {
            super();
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Item> = reader.ReadServiceObjectsCollectionFromXml<Item>("Items", this.GetObjectInstance, false, null, false);
            if (list.Count > 0) {
                this.item = list.get_Item(0);
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var ewsServiceJsonReader: EwsServiceJsonReader = new EwsServiceJsonReader(service);
            var list: List<Item> = ewsServiceJsonReader.ReadServiceObjectsCollectionFromJson<Item>(responseObject, "Folders", this.GetObjectInstance, false, null, false);
            if (list.Count > 0) {
                this.item = list.get_Item(0);
            }
        }
    }
    class AttendeeAvailability extends ServiceResponse {
        private calendarEvents: Collection<CalendarEvent> = new Collection<CalendarEvent>();
        private mergedFreeBusyStatus: Collection<LegacyFreeBusyStatus> = new Collection<LegacyFreeBusyStatus>();
        private viewType: FreeBusyViewType = 0;
        private workingHours: WorkingHours = null;
        get CalendarEvents(): Collection<CalendarEvent> {
            return this.calendarEvents;
        }
        get ViewType(): FreeBusyViewType {
            return this.viewType;
        }
        get MergedFreeBusyStatus(): Collection<LegacyFreeBusyStatus> {
            return this.mergedFreeBusyStatus;
        }
        get WorkingHours(): WorkingHours {
            return this.workingHours;
        }
        constructor() {
            super();
        }
        LoadFreeBusyViewFromXml(reader: EwsServiceXmlReader, viewType: FreeBusyViewType): void {
            reader.ReadStartElement(XmlNamespace.Messages, "FreeBusyView");
            var value: string = reader.ReadElementValue(XmlNamespace.Types, "FreeBusyViewType");
            this.viewType = <FreeBusyViewType>Enum.Parse(new Type("Number"), value, false);
            do {
                reader.Read();
                var localName: string;
                if (reader.IsStartElement() && (localName = reader.LocalName) !== null) {
                    if (!(localName === "MergedFreeBusy")) {
                        if (!(localName === "CalendarEventArray")) {
                            if (localName === "WorkingHours") {
                                this.workingHours = new WorkingHours();
                                this.workingHours.LoadFromXml(reader, reader.LocalName);
                            }
                        }
                        else {
                            do {
                                reader.Read();
                                if (reader.IsStartElement(XmlNamespace.Types, "CalendarEvent")) {
                                    var calendarEvent: CalendarEvent = new CalendarEvent();
                                    calendarEvent.LoadFromXml(reader, "CalendarEvent");
                                    this.calendarEvents.Add(calendarEvent);
                                }
                            }
                            while (!reader.IsEndElement(XmlNamespace.Types, "CalendarEventArray"));
                        }
                    }
                    else {
                        var text: string = reader.ReadElementValue();
                        for (var i: number = 0; i < text.length; i = i + 1) {
                            this.mergedFreeBusyStatus.Add(<LegacyFreeBusyStatus>NNumber.Parse(NNumber.ToString(text.charCodeAt(i))));
                        }
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "FreeBusyView"));
        }
    }
    class ConvertIdResponse extends ServiceResponse {
        private convertedId: AlternateIdBase = null;
        get ConvertedId(): AlternateIdBase {
            return this.convertedId;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            var IL_A2: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        super.ReadElementsFromXml(reader);
                        reader.ReadStartElement(XmlNamespace.Messages, "AlternateId");
                        var text: string = reader.ReadAttributeValue(XmlNamespace.XmlSchemaInstance, "type");
                        var num: number = NString.IndexOf(text, 58)/*':'*/;
                        if (num > -1) {
                            text = NString.Substring(text, num + 1);
                        }
                        var a: string;
                        if ((a = text) !== null) {
                            if (a === "AlternateIdType") {
                                this.convertedId = new AlternateId();
                                _goto = IL_A2;
                                continue _GOTO_LOOP;
                            }
                            if (a === "AlternatePublicFolderIdType") {
                                this.convertedId = new AlternatePublicFolderId();
                                _goto = IL_A2;
                                continue _GOTO_LOOP;
                            }
                            if (a === "AlternatePublicFolderItemIdType") {
                                this.convertedId = new AlternatePublicFolderItemId();
                                _goto = IL_A2;
                                continue _GOTO_LOOP;
                            }
                        }
                        EwsUtilities.Assert(false, "ConvertIdResponse.ReadElementsFromXml", NString.Format("Unknown alternate Id class: {0}", text));
                        _goto = IL_A2;
                        continue _GOTO_LOOP;
                    case 1:
                        this.convertedId.LoadAttributesFromXml(reader);
                        reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "AlternateId");
                        break _GOTO_LOOP;
                }
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var IL_72: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        var text: string = responseObject.ReadTypeString();
                        var a: string;
                        if ((a = text) !== null) {
                            if (a === "AlternateIdType") {
                                this.convertedId = new AlternateId();
                                _goto = IL_72;
                                continue _GOTO_LOOP;
                            }
                            if (a === "AlternatePublicFolderIdType") {
                                this.convertedId = new AlternatePublicFolderId();
                                _goto = IL_72;
                                continue _GOTO_LOOP;
                            }
                            if (a === "AlternatePublicFolderItemIdType") {
                                this.convertedId = new AlternatePublicFolderItemId();
                                _goto = IL_72;
                                continue _GOTO_LOOP;
                            }
                        }
                        EwsUtilities.Assert(false, "ConvertIdResponse.ReadElementsFromXml", NString.Format("Unknown alternate Id class: {0}", text));
                        _goto = IL_72;
                        continue _GOTO_LOOP;
                    case 1:
                        this.convertedId.LoadAttributesFromJson(responseObject);
                        break _GOTO_LOOP;
                }
            }
        }
    }
    class CreateAttachmentResponse extends ServiceResponse {
        private attachment: Attachment = null;
        get Attachment(): Attachment {
            return this.attachment;
        }
        constructor(attachment: Attachment) {
            super();
            EwsUtilities.Assert(attachment !== null, "CreateAttachmentResponse.ctor", "attachment is null");
            this.attachment = attachment;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "Attachments");
            reader.Read(1);
            this.attachment.LoadFromXml(reader, reader.LocalName);
            reader.ReadEndElement(XmlNamespace.Messages, "Attachments");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var array: any[] = responseObject.ReadAsArray("Attachments");
            if (array !== null && array.length > 0) {
                this.attachment.LoadFromJson(((array[0] instanceof JsonObject) ? <JsonObject>array[0] : null), service);
            }
        }
    }
    class CreateFolderResponse extends ServiceResponse {
        private folder: Folder = null;
        constructor(folder: Folder) {
            super();
            this.folder = folder;
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Folder {
            if (this.folder !== null) {
                return this.folder;
            }
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Folder>(service, xmlElementName);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Folder> = reader.ReadServiceObjectsCollectionFromXml<Folder>("Folders", this.GetObjectInstance, false, null, false);
            this.folder = list.get_Item(0);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            var list: List<Folder> = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Folder>(responseObject, "Folders", this.GetObjectInstance, false, null, false);
            this.folder = list.get_Item(0);
        }
        Loaded(): void {
            if (this.Result === ServiceResult.Success) {
                this.folder.ClearChangeLog();
            }
        }
    }
    class CreateItemResponseBase extends ServiceResponse {
        private items: List<Item> = null;
        get Items(): List<Item> {
            return this.items;
        }
        GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            throw new NotSupportedException();
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.items = reader.ReadServiceObjectsCollectionFromXml<Item>("Items", this.GetObjectInstance, false, null, false);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.items = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Item>(responseObject, "Items", this.GetObjectInstance, false, null, false);
        }
    }
    class CreateItemResponse extends CreateItemResponseBase {
        private item: Item = null;
        GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            return this.item;
        }
        constructor(item: Item) {
            super();
            this.item = item;
        }
        Loaded(): void {
            if (this.Result === ServiceResult.Success) {
                this.item.ClearChangeLog();
            }
        }
    }
    class CreateResponseObjectResponse extends CreateItemResponseBase {
        GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
        }
        constructor() {
            super();
        }
    }
    class DelegateManagementResponse extends ServiceResponse {
        private readDelegateUsers: boolean = false;
        private delegateUsers: List<DelegateUser> = null;
        private delegateUserResponses: Collection<DelegateUserResponse> = null;
        get DelegateUserResponses(): Collection<DelegateUserResponse> {
            return this.delegateUserResponses;
        }
        constructor(readDelegateUsers: boolean, delegateUsers: List<DelegateUser>) {
            super();
            this.readDelegateUsers = readDelegateUsers;
            this.delegateUsers = delegateUsers;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            if (this.ErrorCode === ServiceError.NoError) {
                this.delegateUserResponses = new Collection<DelegateUserResponse>();
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Messages, "ResponseMessages")) {
                    var num: number = 0;
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Messages, "DelegateUserResponseMessageType")) {
                            var delegateUser: DelegateUser = null;
                            if (this.readDelegateUsers && this.delegateUsers !== null) {
                                delegateUser = this.delegateUsers.get_Item(num);
                            }
                            var delegateUserResponse: DelegateUserResponse = new DelegateUserResponse(this.readDelegateUsers, delegateUser);
                            delegateUserResponse.LoadFromXml(reader, "DelegateUserResponseMessageType");
                            this.delegateUserResponses.Add(delegateUserResponse);
                            num = num + 1;
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Messages, "ResponseMessages"));
                }
            }
        }
    }
    class DelegateUserResponse extends ServiceResponse {
        private readDelegateUser: boolean = false;
        private delegateUser: DelegateUser = null;
        get DelegateUser(): DelegateUser {
            return this.delegateUser;
        }
        constructor(readDelegateUser: boolean, delegateUser: DelegateUser) {
            super();
            this.readDelegateUser = readDelegateUser;
            this.delegateUser = delegateUser;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            if (this.readDelegateUser) {
                if (this.delegateUser === null) {
                    this.delegateUser = new DelegateUser();
                }
                reader.ReadStartElement(XmlNamespace.Messages, "DelegateUser");
                this.delegateUser.LoadFromXml(reader, XmlNamespace.Messages, reader.LocalName);
            }
        }
    }
    class DeleteAttachmentResponse extends ServiceResponse {
        private attachment: Attachment = null;
        get Attachment(): Attachment {
            return this.attachment;
        }
        constructor(attachment: Attachment) {
            super();
            EwsUtilities.Assert(attachment !== null, "DeleteAttachmentResponse.ctor", "attachment is null");
            this.attachment = attachment;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "RootItemId");
            var text: string = reader.ReadAttributeValue("RootItemChangeKey");
            if (!NString.IsNullOrEmpty(text) && this.attachment.Owner !== null) {
                this.attachment.Owner.RootItemId.ChangeKey = text;
            }
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "RootItemId");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("RootItemId")) {
                var jsonObject: JsonObject = responseObject.ReadAsJsonObject("RootItemId");
                var changeKey: string;
                if (jsonObject.ContainsKey("RootItemChangeKey") && !NString.IsNullOrEmpty(changeKey = jsonObject.ReadAsString("RootItemChangeKey")) && this.attachment.Owner !== null) {
                    this.attachment.Owner.RootItemId.ChangeKey = changeKey;
                }
            }
        }
    }
    class DisableAppResponse extends ServiceResponse {
        constructor() {
            super();
        }
    }
    class GetAppMarketplaceUrlResponse extends ServiceResponse {
        private appMarketplaceUrl: string = null;
        get AppMarketplaceUrl(): string {
            return this.appMarketplaceUrl;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.appMarketplaceUrl = reader.ReadElementValue<string>(XmlNamespace.NotSpecified, "AppMarketplaceUrl");
        }
    }
    class ExecuteDiagnosticMethodResponse extends ServiceResponse {
        ReturnValue: XmlDocument = null;
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.Assert(service !== null, "ExecuteDiagnosticMethodResponse.ctor", "service is null");
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "ReturnValue");
            var xmlReaderForNode: XmlReader = reader.GetXmlReaderForNode();
            try {
                this.ReturnValue = new SafeXmlDocument();
                this.ReturnValue.Load(xmlReaderForNode);
            }
            finally {
                if (xmlReaderForNode !== null) {
                    xmlReaderForNode.Dispose();
                }
            }
            reader.SkipCurrentElement();
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "ReturnValue");
        }
    }
    class ExpandGroupResponse extends ServiceResponse {
        private members: ExpandGroupResults = new ExpandGroupResults();
        get Members(): ExpandGroupResults {
            return this.members;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.Members.LoadFromXml(reader);
        }
    }
    class FindConversationResponse extends ServiceResponse {
        get Conversations(): Collection<Conversation> {
            return this.Results.Conversations;
        }
        Results: FindConversationResults = null;
        constructor() {
            super();
            this.Results = new FindConversationResults();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            EwsUtilities.Assert(this.Results.Conversations !== null, "FindConversationResponse.ReadElementsFromXml", "conversations is null.");
            EwsUtilities.Assert(this.Results.HighlightTerms !== null, "FindConversationResponse.ReadElementsFromXml", "highlightTerms is null.");
            reader.ReadStartElement(XmlNamespace.Messages, "Conversations");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var conversation: Conversation = EwsUtilities.CreateEwsObjectFromXmlElementName<Conversation>(reader.Service, reader.LocalName);
                        if (conversation === null) {
                            reader.SkipCurrentElement();
                        }
                        else {
                            conversation.LoadFromXml(reader, true, null, false);
                            this.Results.Conversations.Add(conversation);
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "Conversations"));
            }
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "HighlightTerms") && !reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var highlightTerm: HighlightTerm = new HighlightTerm();
                        highlightTerm.LoadFromXml(reader, XmlNamespace.Types, "Term");
                        this.Results.HighlightTerms.Add(highlightTerm);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "HighlightTerms"));
            }
            if (reader.IsStartElement(XmlNamespace.Messages, "TotalConversationsInView") && !reader.IsEmptyElement) {
                this.Results.TotalCount = new Nullable<number>(reader.ReadElementValue<number>());
                reader.Read();
            }
            if (reader.IsStartElement(XmlNamespace.Messages, "IndexedOffset") && !reader.IsEmptyElement) {
                this.Results.IndexedOffset = new Nullable<number>(reader.ReadElementValue<number>());
                reader.Read();
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            EwsUtilities.Assert(this.Results.Conversations !== null, "FindConversationResponse.ReadElementsFromXml", "conversations is null.");
            EwsUtilities.Assert(this.Results.HighlightTerms !== null, "FindConversationResponse.ReadElementsFromXml", "highlightTerms is null.");
            var array: any[] = responseObject.ReadAsArray("Conversations");
            for (var i: number = 0; i < array.length; i = i + 1) {
                var obj: any = array[i];
                var jsonServiceObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                var conversation: Conversation = EwsUtilities.CreateEwsObjectFromXmlElementName<Conversation>(service, "Conversation");
                if (conversation !== null) {
                    conversation.LoadFromJson(jsonServiceObject, service, true, null, false);
                    this.Conversations.Add(conversation);
                }
            }
            var array2: any[] = responseObject.ReadAsArray("HighlightTerms");
            if (array2 !== null) {
                var array3: any[] = array2;
                for (var j: number = 0; j < array3.length; j = j + 1) {
                    var obj2: any = array3[j];
                    var jsonProperty: JsonObject = ((obj2 instanceof JsonObject) ? <JsonObject>obj2 : null);
                    var highlightTerm: HighlightTerm = new HighlightTerm();
                    highlightTerm.LoadFromJson(jsonProperty, service);
                    this.Results.HighlightTerms.Add(highlightTerm);
                }
            }
            if (responseObject.ContainsKey("TotalConversationsInView")) {
                this.Results.TotalCount = new Nullable<number>(responseObject.ReadAsInt("TotalConversationsInView"));
            }
            if (responseObject.ContainsKey("IndexedOffset")) {
                this.Results.IndexedOffset = new Nullable<number>(responseObject.ReadAsInt("IndexedOffset"));
            }
        }
    }
    class FindFolderResponse extends ServiceResponse {
        private results: FindFoldersResults = new FindFoldersResults();
        private propertySet: PropertySet = null;
        get Results(): FindFoldersResults {
            return this.results;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "RootFolder");
            this.results.TotalCount = reader.ReadAttributeValue<number>("TotalItemsInView");
            this.results.MoreAvailable = !reader.ReadAttributeValue<boolean>("IncludesLastItemInRange");
            this.results.NextPageOffset = (this.results.MoreAvailable ? reader.ReadNullableAttributeValue<number>("IndexedPagingOffset") : null);
            reader.ReadStartElement(XmlNamespace.Types, "Folders");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var folder: Folder = EwsUtilities.CreateEwsObjectFromXmlElementName<Folder>(reader.Service, reader.LocalName);
                        if (folder === null) {
                            reader.SkipCurrentElement();
                        }
                        else {
                            folder.LoadFromXml(reader, true, this.propertySet, true);
                            this.results.Folders.Add(folder);
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, "Folders"));
            }
            reader.ReadEndElement(XmlNamespace.Messages, "RootFolder");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var jsonObject: JsonObject = responseObject.ReadAsJsonObject("RootFolder");
            this.results.TotalCount = jsonObject.ReadAsInt("TotalItemsInView");
            this.results.MoreAvailable = jsonObject.ReadAsBool("IncludesLastItemInRange");
            if (this.results.MoreAvailable) {
                if (jsonObject.ContainsKey("IndexedPagingOffset")) {
                    this.results.NextPageOffset = new Nullable<number>(jsonObject.ReadAsInt("IndexedPagingOffset"));
                }
                else {
                    this.results.NextPageOffset = null;
                }
            }
            if (jsonObject.ContainsKey("Folders")) {
                var list: List<Folder> = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Folder>(jsonObject, "Folders", this.CreateFolderInstance, true, this.propertySet, true);
                list.ForEach((folder: Folder) => {
                    this.results.Folders.Add(folder);
                });
            }
        }
        private CreateFolderInstance(service: ExchangeService, xmlElementName: string): Folder {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Folder>(service, xmlElementName);
        }
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
            EwsUtilities.Assert(this.propertySet !== null, "FindFolderResponse.ctor", "PropertySet should not be null");
        }
    }
    class FindItemResponse<TItem> extends ServiceResponse {
        private results: FindItemsResults<TItem> = null;
        private isGrouped: boolean = false;
        private groupedFindResults: GroupedFindItemsResults<TItem> = null;
        private propertySet: PropertySet = null;
        get GroupedFindResults(): GroupedFindItemsResults<TItem> {
            return this.groupedFindResults;
        }
        get Results(): FindItemsResults<TItem> {
            return this.results;
        }
        constructor(isGrouped: boolean, propertySet: PropertySet) {
            super();
            this.isGrouped = isGrouped;
            this.propertySet = propertySet;
            EwsUtilities.Assert(this.propertySet !== null, "FindItemResponse.ctor", "PropertySet should not be null");
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "RootFolder");
            var totalCount: number = reader.ReadAttributeValue<number>("TotalItemsInView");
            var flag: boolean = !reader.ReadAttributeValue<boolean>("IncludesLastItemInRange");
            var nextPageOffset: Nullable<number> = flag ? reader.ReadNullableAttributeValue<number>("IndexedPagingOffset") : null;
            if (!this.isGrouped) {
                this.results = new FindItemsResults<TItem>();
                this.results.TotalCount = totalCount;
                this.results.NextPageOffset = nextPageOffset;
                this.results.MoreAvailable = flag;
                FindItemResponse<TItem>.InternalReadItemsFromXml(reader, this.propertySet, this.results.Items);
            }
            else {
                this.groupedFindResults = new GroupedFindItemsResults<TItem>();
                this.groupedFindResults.TotalCount = totalCount;
                this.groupedFindResults.NextPageOffset = nextPageOffset;
                this.groupedFindResults.MoreAvailable = flag;
                reader.ReadStartElement(XmlNamespace.Types, "Groups");
                if (!reader.IsEmptyElement) {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "GroupedItems")) {
                            var groupIndex: string = reader.ReadElementValue(XmlNamespace.Types, "GroupIndex");
                            var list: List<TItem> = new List<TItem>();
                            FindItemResponse<TItem>.InternalReadItemsFromXml(reader, this.propertySet, list);
                            reader.ReadEndElement(XmlNamespace.Types, "GroupedItems");
                            this.groupedFindResults.ItemGroups.Add(new ItemGroup<TItem>(groupIndex, list));
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "Groups"));
                }
            }
            reader.ReadEndElement(XmlNamespace.Messages, "RootFolder");
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "HighlightTerms") && !reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var highlightTerm: HighlightTerm = new HighlightTerm();
                        highlightTerm.LoadFromXml(reader, XmlNamespace.Types, "Term");
                        this.results.HighlightTerms.Add(highlightTerm);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "HighlightTerms"));
            }
        }
        private static InternalReadItemsFromXml(reader: EwsServiceXmlReader, propertySet: PropertySet, destinationList: IList<TItem>): void {
            EwsUtilities.Assert(destinationList !== null, "FindItemResponse.InternalReadItemsFromXml", "destinationList is null.");
            reader.ReadStartElement(XmlNamespace.Types, "Items");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1) {
                        var tItem: TItem = EwsUtilities.CreateEwsObjectFromXmlElementName<TItem>(reader.Service, reader.LocalName);
                        if (tItem === null) {
                            reader.SkipCurrentElement();
                        }
                        else {
                            tItem.LoadFromXml(reader, true, propertySet, true);
                            destinationList.Add(tItem);
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, "Items"));
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            var jsonObject: JsonObject = responseObject.ReadAsJsonObject("RootFolder");
            var totalCount: number = jsonObject.ReadAsInt("TotalItemsInView");
            var flag: boolean = !jsonObject.ReadAsBool("IncludesLastItemInRange");
            var nextPageOffset: Nullable<number> = new Nullable<number>();
            if (flag && jsonObject.ContainsKey("IndexedPagingOffset")) {
                nextPageOffset = new Nullable<number>(jsonObject.ReadAsInt("IndexedPagingOffset"));
            }
            if (!this.isGrouped) {
                this.results = new FindItemsResults<TItem>();
                this.results.TotalCount = totalCount;
                this.results.NextPageOffset = nextPageOffset;
                this.results.MoreAvailable = flag;
                this.InternalReadItemsFromJson(jsonObject, this.propertySet, service, this.results.Items);
            }
            else {
                this.groupedFindResults = new GroupedFindItemsResults<TItem>();
                this.groupedFindResults.TotalCount = totalCount;
                this.groupedFindResults.NextPageOffset = nextPageOffset;
                this.groupedFindResults.MoreAvailable = flag;
                if (jsonObject.ContainsKey("Groups")) {
                    var source: any[] = jsonObject.ReadAsArray("Groups");
                    var enumerator: IEnumerator<JsonObject> = Enumerable.OfType<JsonObject>(NArray.ToEnumerable(source)).GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var current: JsonObject = enumerator.Current;
                            if (current.ContainsKey("GroupedItems")) {
                                var jsonObject2: JsonObject = current.ReadAsJsonObject("GroupedItems");
                                var groupIndex: string = jsonObject2.ReadAsString("GroupIndex");
                                var list: List<TItem> = new List<TItem>();
                                this.InternalReadItemsFromJson(jsonObject2, this.propertySet, service, list);
                                this.groupedFindResults.ItemGroups.Add(new ItemGroup<TItem>(groupIndex, list));
                            }
                        }
                    }
                    finally {
                        if (enumerator !== null) {
                            enumerator.Dispose();
                        }
                    }
                }
            }
            var array: any[] = responseObject.ReadAsArray("HighlightTerms");
            if (array !== null) {
                var array2: any[] = array;
                for (var i: number = 0; i < array2.length; i = i + 1) {
                    var obj: any = array2[i];
                    var jsonProperty: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    var highlightTerm: HighlightTerm = new HighlightTerm();
                    highlightTerm.LoadFromJson(jsonProperty, service);
                    this.results.HighlightTerms.Add(highlightTerm);
                }
            }
        }
        private InternalReadItemsFromJson(jsonObject: JsonObject, propertySet: PropertySet, service: ExchangeService, destinationList: IList<TItem>): void {
            EwsUtilities.Assert(destinationList !== null, "FindItemResponse.InternalReadItemsFromJson", "destinationList is null.");
            if (jsonObject.ContainsKey("Items")) {
                var list: List<TItem> = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<TItem>(jsonObject, "Items", this.CreateItemInstance, true, this.propertySet, true);
                list.ForEach((item: TItem) => {
                    destinationList.Add(item);
                });
            }
        }
        private CreateItemInstance(service: ExchangeService, xmlElementName: string): TItem {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<TItem>(service, xmlElementName);
        }
    }
    class GetAttachmentResponse extends ServiceResponse {
        private attachment: Attachment = null;
        get Attachment(): Attachment {
            return this.attachment;
        }
        constructor(attachment: Attachment) {
            super();
            this.attachment = attachment;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "Attachments");
            if (!reader.IsEmptyElement) {
                reader.Read(1);
                if (this.attachment === null) {
                    if (NString.Equals(reader.LocalName, "FileAttachment", StringComparison.OrdinalIgnoreCase)) {
                        this.attachment = new FileAttachment(reader.Service);
                    }
                    else {
                        if (NString.Equals(reader.LocalName, "ItemAttachment", StringComparison.OrdinalIgnoreCase)) {
                            this.attachment = new ItemAttachment(reader.Service);
                        }
                    }
                }
                if (this.attachment !== null) {
                    this.attachment.LoadFromXml(reader, reader.LocalName);
                }
                reader.ReadEndElement(XmlNamespace.Messages, "Attachments");
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var array: any[];
            if (responseObject.ContainsKey("Attachments") && (array = responseObject.ReadAsArray("Attachments")).length > 0) {
                var jsonObject: JsonObject = ((array[0] instanceof JsonObject) ? <JsonObject>array[0] : null);
                if (this.attachment === null && jsonObject !== null) {
                    if (jsonObject.ContainsKey("FileAttachment")) {
                        this.attachment = new FileAttachment(service);
                    }
                    else {
                        if (jsonObject.ContainsKey("ItemAttachment")) {
                            this.attachment = new ItemAttachment(service);
                        }
                    }
                }
                if (this.attachment !== null) {
                    this.attachment.LoadFromJson(jsonObject, service);
                }
            }
        }
    }
    class GetClientAccessTokenResponse extends ServiceResponse {
        Id: string = null;
        TokenType: ClientAccessTokenType = 0;
        TokenValue: string = null;
        TTL: number = 0;
        constructor(id: string, tokenType: ClientAccessTokenType) {
            super();
            this.Id = id;
            this.TokenType = tokenType;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "Token");
            this.Id = reader.ReadElementValue(XmlNamespace.Types, "Id");
            this.TokenType = <ClientAccessTokenType>Enum.Parse(new Type("Number"), reader.ReadElementValue(XmlNamespace.Types, "TokenType"));
            this.TokenValue = reader.ReadElementValue(XmlNamespace.Types, "TokenValue");
            this.TTL = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "TTL"));
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "Token");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("Token")) {
                var jsonObject: JsonObject = responseObject.ReadAsJsonObject("Token");
                this.Id = jsonObject.ReadAsString("Id");
                this.TokenType = <ClientAccessTokenType>Enum.Parse(new Type("Number"), jsonObject.ReadAsString("TokenType"));
                this.TokenValue = jsonObject.ReadAsString("TokenValue");
                this.TTL = jsonObject.ReadAsInt("TTL");
            }
        }
    }
    class GetClientExtensionResponse extends ServiceResponse {
        private clientExtension: Collection<ClientExtension> = new Collection<ClientExtension>();
        private rawMasterTableXml: string = null;
        get ClientExtensions(): Collection<ClientExtension> {
            return this.clientExtension;
        }
        get RawMasterTableXml(): string {
            return this.rawMasterTableXml;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.ClientExtensions.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "ClientExtensions");
            if (!reader.IsEmptyElement) {
                reader.Read();
                while (reader.IsStartElement(XmlNamespace.Types, "ClientExtension")) {
                    var clientExtension: ClientExtension = new ClientExtension();
                    clientExtension.LoadFromXml(reader, XmlNamespace.Types, "ClientExtension");
                    this.ClientExtensions.Add(clientExtension);
                    reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Types, "ClientExtension");
                    reader.Read();
                }
                reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Messages, "ClientExtensions");
            }
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "RawMasterTableXml")) {
                this.rawMasterTableXml = reader.ReadElementValue();
            }
        }
    }
    class GetEncryptionConfigurationResponse extends ServiceResponse {
        private imageBase64: string = null;
        private emailText: string = null;
        private portalText: string = null;
        private disclaimerText: string = null;
        get ImageBase64(): string {
            return this.imageBase64;
        }
        get EmailText(): string {
            return this.emailText;
        }
        get PortalText(): string {
            return this.portalText;
        }
        get DisclaimerText(): string {
            return this.disclaimerText;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.imageBase64 = reader.ReadElementValue<string>(XmlNamespace.Messages, "ImageBase64");
            this.emailText = reader.ReadElementValue<string>(XmlNamespace.Messages, "EmailText");
            this.portalText = reader.ReadElementValue<string>(XmlNamespace.Messages, "PortalText");
            this.disclaimerText = reader.ReadElementValue<string>(XmlNamespace.Messages, "DisclaimerText");
        }
    }
    class GetAppManifestsResponse extends ServiceResponse {
        private manifests: Collection<XmlDocument> = new Collection<XmlDocument>();
        private apps: Collection<ClientApp> = new Collection<ClientApp>();
        get Manifests(): Collection<XmlDocument> {
            return this.manifests;
        }
        get Apps(): Collection<ClientApp> {
            return this.apps;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.Manifests.Clear();
            super.ReadElementsFromXml(reader);
            reader.Read(1);
            var flag: boolean;
            if ("Manifests" === reader.LocalName) {
                flag = true;
            }
            else {
                if (!("Apps" === reader.LocalName)) {
                    throw new ServiceXmlDeserializationException(NString.Format(Strings.UnexpectedElement, [
                        EwsUtilities.GetNamespacePrefix(XmlNamespace.Messages), "Manifests", 1, reader.LocalName, reader.NodeType
                    ]));
                }
                flag = false;
            }
            if (!reader.IsEmptyElement) {
                reader.Read();
                if (flag) {
                    this.ReadFromExchange2013(reader);
                }
                else {
                    this.ReadFromExchange2013Sp1(reader);
                }
            }
            reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Messages, flag ? "Manifests" : "Apps");
        }
        private ReadFromExchange2013(reader: EwsServiceXmlReader): void {
            while (reader.IsStartElement(XmlNamespace.Messages, "Manifest")) {
                var xmlDocument: XmlDocument = ClientApp.ReadToXmlDocument(reader);
                this.Manifests.Add(xmlDocument);
                var arg_29_0: Collection<ClientApp> = this.Apps;
                var clientApp: ClientApp = new ClientApp();
                clientApp.Manifest = xmlDocument;
                arg_29_0.Add(clientApp);
            }
        }
        private ReadFromExchange2013Sp1(reader: EwsServiceXmlReader): void {
            while (reader.IsStartElement(XmlNamespace.Types, "App")) {
                var clientApp: ClientApp = new ClientApp();
                clientApp.LoadFromXml(reader, "App");
                this.Apps.Add(clientApp);
                this.Manifests.Add(clientApp.Manifest);
                reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Types, "App");
                reader.Read();
            }
        }
    }
    class GetConversationItemsResponse extends ServiceResponse {
        private propertySet: PropertySet = null;
        Conversation: ConversationResponse = null;
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.Conversation = new ConversationResponse(this.propertySet);
            reader.ReadStartElement(XmlNamespace.Messages, "Conversation");
            this.Conversation.LoadFromXml(reader, XmlNamespace.Messages, "Conversation");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.Conversation = new ConversationResponse(this.propertySet);
            this.Conversation.LoadFromJson(responseObject.ReadAsJsonObject("Conversation"), service);
        }
    }
    class GetDelegateResponse extends DelegateManagementResponse {
        private meetingRequestsDeliveryScope: MeetingRequestsDeliveryScope = MeetingRequestsDeliveryScope.NoForward;
        get MeetingRequestsDeliveryScope(): MeetingRequestsDeliveryScope {
            return this.meetingRequestsDeliveryScope;
        }
        constructor(readDelegateUsers: boolean) {
            super(readDelegateUsers, null);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            if (this.ErrorCode === ServiceError.NoError) {
                if (this.DelegateUserResponses.Count > 0) {
                    reader.Read();
                }
                if (reader.IsStartElement(XmlNamespace.Messages, "DeliverMeetingRequests")) {
                    this.meetingRequestsDeliveryScope = reader.ReadElementValue<MeetingRequestsDeliveryScope>();
                }
            }
        }
    }
    class GetDiscoverySearchConfigurationResponse extends ServiceResponse {
        private configurations: List<DiscoverySearchConfiguration> = new List<DiscoverySearchConfiguration>();
        get DiscoverySearchConfigurations(): DiscoverySearchConfiguration[] {
            return this.configurations.ToArray();
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.configurations.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "DiscoverySearchConfigurations");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "DiscoverySearchConfiguration")) {
                        this.configurations.Add(DiscoverySearchConfiguration.LoadFromXml(reader));
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "DiscoverySearchConfigurations"));
            }
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "DiscoverySearchConfigurations");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.configurations.Clear();
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("DiscoverySearchConfigurations")) {
                var array: any[] = responseObject.ReadAsArray("DiscoverySearchConfigurations");
                for (var i: number = 0; i < array.length; i = i + 1) {
                    var obj: any = array[i];
                    var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    this.configurations.Add(DiscoverySearchConfiguration.LoadFromJson(jsonObject));
                }
            }
        }
    }
    class GetEventsResponse extends ServiceResponse {
        private results: GetEventsResults = new GetEventsResults();
        get Results(): GetEventsResults {
            return this.results;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.results.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.results.LoadFromJson(responseObject.ReadAsJsonObject("Notification"), service);
        }
    }
    class GetStreamingEventsResponse extends ServiceResponse {
        results: GetStreamingEventsResults = new GetStreamingEventsResults();
        request: HangingServiceRequestBase = null;
        get Results(): GetStreamingEventsResults {
            return this.results;
        }
        ErrorSubscriptionIds: List<string> = null;
        constructor(request: HangingServiceRequestBase) {
            super();
            this.ErrorSubscriptionIds = new List<string>();
            this.request = request;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.Read();
            if (reader.LocalName === "Notifications") {
                this.results.LoadFromXml(reader);
                return;
            }
            if (reader.LocalName === "ConnectionStatus") {
                var text: string = reader.ReadElementValue(XmlNamespace.Messages, "ConnectionStatus");
                if (text === ConnectionStatus[GetStreamingEventsResponse_ConnectionStatus.Closed]) {
                    this.request.Disconnect(HangingRequestDisconnectReason.Clean, null);
                }
            }
        }
        LoadExtraErrorDetailsFromXml(reader: EwsServiceXmlReader, xmlElementName: string): boolean {
            var result: boolean = super.LoadExtraErrorDetailsFromXml(reader, xmlElementName);
            if (reader.IsStartElement(XmlNamespace.Messages, "ErrorSubscriptionIds")) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === "SubscriptionId") {
                        this.ErrorSubscriptionIds.Add(reader.ReadElementValue(XmlNamespace.Messages, "SubscriptionId"));
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "ErrorSubscriptionIds"));
                return true;
            }
            return result;
        }
    }
    enum GetStreamingEventsResponse_ConnectionStatus {
        OK,
        Closed
    }
    class GetFolderResponse extends ServiceResponse {
        private folder: Folder = null;
        private propertySet: PropertySet = null;
        get Folder(): Folder {
            return this.folder;
        }
        constructor(folder: Folder, propertySet: PropertySet) {
            super();
            this.folder = folder;
            this.propertySet = propertySet;
            EwsUtilities.Assert(this.propertySet !== null, "GetFolderResponse.ctor", "PropertySet should not be null");
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Folder> = reader.ReadServiceObjectsCollectionFromXml<Folder>("Folders", this.GetObjectInstance, true, this.propertySet, false);
            this.folder = list.get_Item(0);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            var list: List<Folder> = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Folder>(responseObject, "Folders", this.GetObjectInstance, true, this.propertySet, false);
            this.folder = list.get_Item(0);
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Folder {
            if (this.Folder !== null) {
                return this.Folder;
            }
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Folder>(service, xmlElementName);
        }
    }
    class GetHoldOnMailboxesResponse extends ServiceResponse {
        private holdResult: MailboxHoldResult = null;
        get HoldResult(): MailboxHoldResult {
            return this.holdResult;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.holdResult = MailboxHoldResult.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("MailboxHoldResult")) {
                var jsonObject: JsonObject = responseObject.ReadAsJsonObject("MailboxHoldResult");
                this.holdResult = MailboxHoldResult.LoadFromJson(jsonObject);
            }
        }
    }
    class GetInboxRulesResponse extends ServiceResponse {
        private ruleCollection: RuleCollection = null;
        get Rules(): RuleCollection {
            return this.ruleCollection;
        }
        constructor() {
            super();
            this.ruleCollection = new RuleCollection();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.Read();
            this.ruleCollection.OutlookRuleBlobExists = reader.ReadElementValue<boolean>(XmlNamespace.Messages, "OutlookRuleBlobExists");
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.NotSpecified, "InboxRules")) {
                this.ruleCollection.LoadFromXml(reader, XmlNamespace.NotSpecified, "InboxRules");
            }
        }
    }
    class GetItemResponse extends ServiceResponse {
        private item: Item = null;
        private propertySet: PropertySet = null;
        get Item(): Item {
            return this.item;
        }
        constructor(item: Item, propertySet: PropertySet) {
            super();
            this.item = item;
            this.propertySet = propertySet;
            EwsUtilities.Assert(this.propertySet !== null, "GetItemResponse.ctor", "PropertySet should not be null");
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Item> = reader.ReadServiceObjectsCollectionFromXml<Item>("Items", this.GetObjectInstance, true, this.propertySet, false);
            this.item = list.get_Item(0);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            var list: List<Item> = new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Item>(responseObject, "Items", this.GetObjectInstance, true, this.propertySet, false);
            this.item = list.get_Item(0);
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            if (this.Item !== null) {
                return this.Item;
            }
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
        }
    }
    class GetNonIndexableItemDetailsResponse extends ServiceResponse {
        NonIndexableItemsResult: NonIndexableItemDetailsResult = null;
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.NonIndexableItemsResult = NonIndexableItemDetailsResult.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            throw new NotImplementedException("GetNonIndexableItemdDetails doesn't support JSON.");
        }
    }
    class GetNonIndexableItemStatisticsResponse extends ServiceResponse {
        NonIndexableStatistics: List<NonIndexableItemStatistic> = null;
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.NonIndexableStatistics = NonIndexableItemStatistic.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            throw new NotImplementedException("GetNonIndexableItemStatistics doesn't support JSON.");
        }
    }
    class GetPhoneCallResponse extends ServiceResponse {
        private phoneCall: PhoneCall = null;
        get PhoneCall(): PhoneCall {
            return this.phoneCall;
        }
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.Assert(service !== null, "GetPhoneCallResponse.ctor", "service is null");
            this.phoneCall = new PhoneCall(service);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "PhoneCallInformation");
            this.phoneCall.LoadFromXml(reader, XmlNamespace.Messages, "PhoneCallInformation");
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "PhoneCallInformation");
        }
    }
    class GetPasswordExpirationDateResponse extends ServiceResponse {
        private passwordExpirationDate: Nullable<DateTime> = null;
        get PasswordExpirationDate(): Nullable<DateTime> {
            return this.passwordExpirationDate;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.passwordExpirationDate = reader.ReadElementValueAsDateTime(XmlNamespace.NotSpecified, "PasswordExpirationDate");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.passwordExpirationDate = new Nullable<DateTime>(service.ConvertUniversalDateTimeStringToLocalDateTime(responseObject.ReadAsString("PasswordExpirationDate")).Value);
        }
    }
    class GetRoomListsResponse extends ServiceResponse {
        private roomLists: EmailAddressCollection = new EmailAddressCollection();
        get RoomLists(): EmailAddressCollection {
            return this.roomLists;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.RoomLists.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "RoomLists");
            if (!reader.IsEmptyElement) {
                reader.Read();
                while (reader.IsStartElement(XmlNamespace.Types, "Address")) {
                    var emailAddress: EmailAddress = new EmailAddress();
                    emailAddress.LoadFromXml(reader, "Address");
                    this.RoomLists.Add(emailAddress);
                    reader.Read();
                }
                reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Messages, "RoomLists");
            }
        }
    }
    class GetRoomsResponse extends ServiceResponse {
        private rooms: Collection<EmailAddress> = new Collection<EmailAddress>();
        get Rooms(): Collection<EmailAddress> {
            return this.rooms;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.Rooms.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "Rooms");
            if (!reader.IsEmptyElement) {
                reader.Read();
                while (reader.IsStartElement(XmlNamespace.Types, "Room")) {
                    reader.Read();
                    var emailAddress: EmailAddress = new EmailAddress();
                    emailAddress.LoadFromXml(reader, "Id");
                    this.Rooms.Add(emailAddress);
                    reader.ReadEndElement(XmlNamespace.Types, "Room");
                    reader.Read();
                }
                reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Messages, "Rooms");
            }
        }
    }
    class GetSearchableMailboxesResponse extends ServiceResponse {
        private searchableMailboxes: List<SearchableMailbox> = new List<SearchableMailbox>();
        get SearchableMailboxes(): SearchableMailbox[] {
            return this.searchableMailboxes.ToArray();
        }
        FailedMailboxes: FailedSearchMailbox[] = null;
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.searchableMailboxes.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "SearchableMailboxes");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "SearchableMailbox")) {
                        this.searchableMailboxes.Add(SearchableMailbox.LoadFromXml(reader));
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "SearchableMailboxes"));
            }
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "FailedMailboxes")) {
                this.FailedMailboxes = FailedSearchMailbox.LoadFailedMailboxesXml(XmlNamespace.Messages, reader);
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.searchableMailboxes.Clear();
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("SearchMailboxes")) {
                var array: any[] = responseObject.ReadAsArray("SearchableMailboxes");
                for (var i: number = 0; i < array.length; i = i + 1) {
                    var obj: any = array[i];
                    var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    this.searchableMailboxes.Add(SearchableMailbox.LoadFromJson(jsonObject));
                }
            }
        }
    }
    class GetServerTimeZonesResponse extends ServiceResponse {
        private timeZones: Collection<TimeZoneInfo> = new Collection<TimeZoneInfo>();
        get TimeZones(): Collection<TimeZoneInfo> {
            return this.timeZones;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "TimeZoneDefinitions");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "TimeZoneDefinition")) {
                        var timeZoneDefinition: TimeZoneDefinition = new TimeZoneDefinition();
                        timeZoneDefinition.LoadFromXml(reader);
                        this.timeZones.Add(timeZoneDefinition.ToTimeZoneInfo());
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "TimeZoneDefinitions"));
            }
        }
    }
    class GetUserConfigurationResponse extends ServiceResponse {
        private userConfiguration: UserConfiguration = null;
        get UserConfiguration(): UserConfiguration {
            return this.userConfiguration;
        }
        constructor(userConfiguration: UserConfiguration) {
            super();
            EwsUtilities.Assert(userConfiguration !== null, "GetUserConfigurationResponse.ctor", "userConfiguration is null");
            this.userConfiguration = userConfiguration;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.userConfiguration.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.UserConfiguration.LoadFromJson(responseObject.ReadAsJsonObject("UserConfiguration"), service);
        }
    }
    class GetUserOofSettingsResponse extends ServiceResponse {
        private oofSettings: OofSettings = null;
        set OofSettings(value: OofSettings) {
            this.oofSettings = value;
        }
        get OofSettings(): OofSettings {
            return this.oofSettings;
        }
        constructor() {
            super();
        }
    }
    class GetUserRetentionPolicyTagsResponse extends ServiceResponse {
        private retentionPolicyTags: List<RetentionPolicyTag> = new List<RetentionPolicyTag>();
        get RetentionPolicyTags(): RetentionPolicyTag[] {
            return this.retentionPolicyTags.ToArray();
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.retentionPolicyTags.Clear();
            super.ReadElementsFromXml(reader);
            reader.ReadStartElement(XmlNamespace.Messages, "RetentionPolicyTags");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "RetentionPolicyTag")) {
                        this.retentionPolicyTags.Add(RetentionPolicyTag.LoadFromXml(reader));
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "RetentionPolicyTags"));
                reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "RetentionPolicyTags");
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.retentionPolicyTags.Clear();
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("RetentionPolicyTags")) {
                var array: any[] = responseObject.ReadAsArray("RetentionPolicyTags");
                for (var i: number = 0; i < array.length; i = i + 1) {
                    var obj: any = array[i];
                    var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    this.retentionPolicyTags.Add(RetentionPolicyTag.LoadFromJson(jsonObject));
                }
            }
        }
    }
    class InstallAppResponse extends ServiceResponse {
        constructor() {
            super();
        }
    }
    class MarkAsJunkResponse extends ServiceResponse {
        MovedItemId: ItemId = null;
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "MovedItemId")) {
                this.MovedItemId = new ItemId();
                this.MovedItemId.LoadFromXml(reader, XmlNamespace.Messages, "MovedItemId");
                reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "MovedItemId");
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("Token")) {
                this.MovedItemId = new ItemId();
                this.MovedItemId.LoadFromJson(responseObject.ReadAsJsonObject("MovedItemId"), service);
            }
        }
    }
    class MoveCopyFolderResponse extends ServiceResponse {
        private folder: Folder = null;
        get Folder(): Folder {
            return this.folder;
        }
        constructor() {
            super();
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Folder {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Folder>(service, xmlElementName);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Folder> = reader.ReadServiceObjectsCollectionFromXml<Folder>("Folders", this.GetObjectInstance, false, null, false);
            this.folder = list.get_Item(0);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var ewsServiceJsonReader: EwsServiceJsonReader = new EwsServiceJsonReader(service);
            var list: List<Folder> = ewsServiceJsonReader.ReadServiceObjectsCollectionFromJson<Folder>(responseObject, "Folders", this.GetObjectInstance, false, null, false);
            this.folder = list.get_Item(0);
        }
    }
    class MoveCopyItemResponse extends ServiceResponse {
        private item: Item = null;
        get Item(): Item {
            return this.item;
        }
        constructor() {
            super();
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            return EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            var list: List<Item> = reader.ReadServiceObjectsCollectionFromXml<Item>("Items", this.GetObjectInstance, false, null, false);
            if (list.Count > 0) {
                this.item = list.get_Item(0);
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var ewsServiceJsonReader: EwsServiceJsonReader = new EwsServiceJsonReader(service);
            var list: List<Item> = ewsServiceJsonReader.ReadServiceObjectsCollectionFromJson<Item>(responseObject, "Folders", this.GetObjectInstance, false, null, false);
            if (list.Count > 0) {
                this.item = list.get_Item(0);
            }
        }
    }
    class ResolveNamesResponse extends ServiceResponse {
        private resolutions: NameResolutionCollection = null;
        get Resolutions(): NameResolutionCollection {
            return this.resolutions;
        }
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.Assert(service !== null, "ResolveNamesResponse.ctor", "service is null");
            this.resolutions = new NameResolutionCollection(service);
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.Resolutions.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.Resolutions.LoadFromJson(responseObject.ReadAsJsonObject("ResolutionSet"), service);
        }
        InternalThrowIfNecessary(): void {
            if (this.ErrorCode !== ServiceError.ErrorNameResolutionNoResults) {
                super.InternalThrowIfNecessary();
            }
        }
    }
    class PlayOnPhoneResponse extends ServiceResponse {
        private phoneCallId: PhoneCallId = null;
        get PhoneCallId(): PhoneCallId {
            return this.phoneCallId;
        }
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.Assert(service !== null, "PlayOnPhoneResponse.ctor", "service is null");
            this.phoneCallId = new PhoneCallId();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "PhoneCallId");
            this.phoneCallId.LoadFromXml(reader, XmlNamespace.Messages, "PhoneCallId");
            reader.ReadEndElementIfNecessary(XmlNamespace.Messages, "PhoneCallId");
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.phoneCallId.LoadFromJson(responseObject.ReadAsJsonObject("PhoneCallId"), service);
        }
    }
    class SearchMailboxesResponse extends ServiceResponse {
        private searchResult: SearchMailboxesResult = null;
        set SearchResult(value: SearchMailboxesResult) {
            this.searchResult = value;
        }
        get SearchResult(): SearchMailboxesResult {
            return this.searchResult;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.searchResult = new SearchMailboxesResult();
            super.ReadElementsFromXml(reader);
            this.searchResult = SearchMailboxesResult.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("SearchMailboxesResult")) {
                var jsonObject: JsonObject = responseObject.ReadAsJsonObject("SearchMailboxesResult");
                this.searchResult = SearchMailboxesResult.LoadFromJson(jsonObject);
            }
        }
    }
    class ServiceResponseCollection<TResponse> implements IEnumerable<TResponse>
    {
        private responses: List<TResponse> = new List<TResponse>();
        private overallResult: ServiceResult = 0;
        get Count(): number {
            return this.responses.Count;
        }
        get_Item(index: number): TResponse {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.responses.get_Item(index);
        }
        get OverallResult(): ServiceResult {
            return this.overallResult;
        }
        constructor() {
            super();
        }
        Add(response: TResponse): void {
            EwsUtilities.Assert(response !== null, "EwsResponseList.Add", "response is null");
            if (response.Result > this.overallResult) {
                this.overallResult = response.Result;
            }
            this.responses.Add(response);
        }
        GetEnumerator(): IEnumerator<TResponse> {
            return this.responses.GetEnumerator();
        }
    }
    class SetEncryptionConfigurationResponse extends ServiceResponse {
        constructor() {
            super();
        }
    }
    class SetHoldOnMailboxesResponse extends ServiceResponse {
        private holdResult: MailboxHoldResult = null;
        get HoldResult(): MailboxHoldResult {
            return this.holdResult;
        }
        constructor() {
            super();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.holdResult = MailboxHoldResult.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            if (responseObject.ContainsKey("MailboxHoldResult")) {
                var jsonObject: JsonObject = responseObject.ReadAsJsonObject("MailboxHoldResult");
                this.holdResult = MailboxHoldResult.LoadFromJson(jsonObject);
            }
        }
    }
    class SubscribeResponse<TSubscription> extends ServiceResponse {
        private subscription: TSubscription = null;
        get Subscription(): TSubscription {
            return this.subscription;
        }
        constructor(subscription: TSubscription) {
            super();
            EwsUtilities.Assert(subscription !== null, "SubscribeResponse.ctor", "subscription is null");
            this.subscription = subscription;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            this.subscription.LoadFromXml(reader);
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            this.subscription.LoadFromJson(responseObject, service);
        }
    }
    class SuggestionsResponse extends ServiceResponse {
        private daySuggestions: Collection<Suggestion> = new Collection<Suggestion>();
        get Suggestions(): Collection<Suggestion> {
            return this.daySuggestions;
        }
        constructor() {
            super();
        }
        LoadSuggestedDaysFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "SuggestionDayResultArray");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "SuggestionDayResult")) {
                    var suggestion: Suggestion = new Suggestion();
                    suggestion.LoadFromXml(reader, reader.LocalName);
                    this.daySuggestions.Add(suggestion);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "SuggestionDayResultArray"));
        }
    }
    class SyncResponse<TServiceObject, TChange> extends ServiceResponse {
        private changes: ChangeCollection<TChange> = new ChangeCollection<TChange>();
        private propertySet: PropertySet = null;
        get Changes(): ChangeCollection<TChange> {
            return this.changes;
        }
        SummaryPropertiesOnly: boolean = false;
        constructor(propertySet: PropertySet) {
            super();
            this.propertySet = propertySet;
            EwsUtilities.Assert(this.propertySet !== null, "SyncResponse.ctor", "PropertySet should not be null");
        }
        GetIncludesLastInRangeXmlElementName(): string {
            throw new NotSupportedException();
        }
        CreateChangeInstance(): TChange {
            throw new NotSupportedException();
        }
        GetChangeElementName(): string {
            throw new NotSupportedException();
        }
        GetChangeIdElementName(): string {
            throw new NotSupportedException();
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            this.Changes.SyncState = reader.ReadElementValue(XmlNamespace.Messages, "SyncState");
            this.Changes.MoreChangesAvailable = !reader.ReadElementValue<boolean>(XmlNamespace.Messages, this.GetIncludesLastInRangeXmlElementName());
            reader.ReadStartElement(XmlNamespace.Messages, "Changes");
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        var tChange: TChange = this.CreateChangeInstance();
                        var localName: string;
                        if ((localName = reader.LocalName) === null) {
                            goto IL_E1;
                        }
                        if (!(localName === "Create")) {
                            if (!(localName === "Update")) {
                                if (!(localName === "Delete")) {
                                    if (!(localName === "ReadFlagChange")) {
                                        goto IL_E1;
                                    }
                                    tChange.ChangeType = ChangeType.ReadFlagChange;
                                }
                                else {
                                    tChange.ChangeType = ChangeType.Delete;
                                }
                            }
                            else {
                                tChange.ChangeType = ChangeType.Update;
                            }
                        }
                        else {
                            tChange.ChangeType = ChangeType.Create;
                        }
                        IL_E7:
                        if (tChange !== null) {
                            reader.Read();
                            reader.EnsureCurrentNodeIsStartElement();
                            switch (tChange.ChangeType) {
                                case ChangeType.Delete:
                                case ChangeType.ReadFlagChange:
                                    tChange.Id = tChange.CreateId();
                                    tChange.Id.LoadFromXml(reader, tChange.Id.GetXmlElementName());
                                    if (tChange.ChangeType === ChangeType.ReadFlagChange) {
                                        reader.Read();
                                        reader.EnsureCurrentNodeIsStartElement();
                                        var itemChange: ItemChange = ((tChange instanceof ItemChange) ? <ItemChange>tChange : null);
                                        EwsUtilities.Assert(itemChange !== null, "SyncResponse.ReadElementsFromXml", "ReadFlagChange is only valid on ItemChange");
                                        itemChange.IsRead = reader.ReadElementValue<boolean>(XmlNamespace.Types, "IsRead");
                                    }
                                    break;
                                default:
                                    tChange.ServiceObject = EwsUtilities.CreateEwsObjectFromXmlElementName<TServiceObject>(reader.Service, reader.LocalName);
                                    tChange.ServiceObject.LoadFromXml(reader, true, this.propertySet, this.SummaryPropertiesOnly);
                                    break;
                            }
                            reader.ReadEndElementIfNecessary(XmlNamespace.Types, ChangeType[tChange.ChangeType]);
                            this.changes.Add(tChange);
                            goto IL_222;
                        }
                        goto IL_222;
                        IL_E1:
                        reader.SkipCurrentElement();
                        goto IL_E7;
                    }
                    IL_222: ;
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "Changes"));
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            this.Changes.SyncState = responseObject.ReadAsString("SyncState");
            this.Changes.MoreChangesAvailable = !responseObject.ReadAsBool(this.GetIncludesLastInRangeXmlElementName());
            var jsonObject: JsonObject = responseObject.ReadAsJsonObject("Changes");
            var array: any[] = jsonObject.ReadAsArray("Changes");
            for (var i: number = 0; i < array.length; i = i + 1) {
                var obj: any = array[i];
                var jsonObject2: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                var tChange: TChange = this.CreateChangeInstance();
                var text: string = jsonObject2.ReadAsString("ChangeType");
                var a: string;
                if ((a = text) !== null) {
                    if (!(a === "Create")) {
                        if (!(a === "Update")) {
                            if (!(a === "Delete")) {
                                if (a === "ReadFlagChange") {
                                    tChange.ChangeType = ChangeType.ReadFlagChange;
                                }
                            }
                            else {
                                tChange.ChangeType = ChangeType.Delete;
                            }
                        }
                        else {
                            tChange.ChangeType = ChangeType.Update;
                        }
                    }
                    else {
                        tChange.ChangeType = ChangeType.Create;
                    }
                }
                if (tChange !== null) {
                    switch (tChange.ChangeType) {
                        case ChangeType.Delete:
                        case ChangeType.ReadFlagChange:
                            {
                                tChange.Id = tChange.CreateId();
                                var jsonProperty: JsonObject = jsonObject2.ReadAsJsonObject(this.GetChangeIdElementName());
                                tChange.Id.LoadFromJson(jsonProperty, service);
                                if (tChange.ChangeType === ChangeType.ReadFlagChange) {
                                    var itemChange: ItemChange = ((tChange instanceof ItemChange) ? <ItemChange>tChange : null);
                                    EwsUtilities.Assert(itemChange !== null, "SyncResponse.ReadElementsFromJson", "ReadFlagChange is only valid on ItemChange");
                                    itemChange.IsRead = jsonObject2.ReadAsBool("IsRead");
                                }
                                break;
                            }
                        default:
                            {
                                var jsonObject3: JsonObject = jsonObject2.ReadAsJsonObject(this.GetChangeElementName());
                                tChange.ServiceObject = EwsUtilities.CreateEwsObjectFromXmlElementName<TServiceObject>(service, jsonObject3.ReadTypeString());
                                tChange.ServiceObject.LoadFromJson(jsonObject3, service, true, this.propertySet, this.SummaryPropertiesOnly);
                                break;
                            }
                    }
                    this.changes.Add(tChange);
                }
            }
        }
    }
    class SyncFolderHierarchyResponse extends SyncResponse<Folder, FolderChange>
    {
        get SummaryPropertiesOnly(): boolean {
            return false;
        }
        constructor(propertySet: PropertySet) {
            super(propertySet);
        }
        GetIncludesLastInRangeXmlElementName(): string {
            return "IncludesLastFolderInRange";
        }
        CreateChangeInstance(): FolderChange {
            return new FolderChange();
        }
        GetChangeElementName(): string {
            return "Folder";
        }
        GetChangeIdElementName(): string {
            return "FolderId";
        }
    }
    class SyncFolderItemsResponse extends SyncResponse<Item, ItemChange>
    {
        get SummaryPropertiesOnly(): boolean {
            return true;
        }
        constructor(propertySet: PropertySet) {
            super(propertySet);
        }
        GetIncludesLastInRangeXmlElementName(): string {
            return "IncludesLastItemInRange";
        }
        CreateChangeInstance(): ItemChange {
            return new ItemChange();
        }
        GetChangeElementName(): string {
            return "Item";
        }
        GetChangeIdElementName(): string {
            return "ItemId";
        }
    }
    class UninstallAppResponse extends ServiceResponse {
        constructor() {
            super();
        }
    }
    class UpdateFolderResponse extends ServiceResponse {
        private folder: Folder = null;
        constructor(folder: Folder) {
            super();
            EwsUtilities.Assert(folder !== null, "UpdateFolderResponse.ctor", "folder is null");
            this.folder = folder;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadServiceObjectsCollectionFromXml<Folder>("Folders", this.GetObjectInstance, false, null, false);
        }
        Loaded(): void {
            if (this.Result === ServiceResult.Success) {
                this.folder.ClearChangeLog();
            }
        }
        private GetObjectInstance(session: ExchangeService, xmlElementName: string): Folder {
            return this.folder;
        }
    }
    class UpdateInboxRulesResponse extends ServiceResponse {
        private errors: RuleOperationErrorCollection = null;
        get Errors(): RuleOperationErrorCollection {
            return this.errors;
        }
        constructor() {
            super();
            this.errors = new RuleOperationErrorCollection();
        }
        LoadExtraErrorDetailsFromXml(reader: EwsServiceXmlReader, xmlElementName: string): boolean {
            if (xmlElementName === "MessageXml") {
                return super.LoadExtraErrorDetailsFromXml(reader, xmlElementName);
            }
            if (xmlElementName === "RuleOperationErrors") {
                this.errors.LoadFromXml(reader, XmlNamespace.Messages, xmlElementName);
                return true;
            }
            return false;
        }
    }
    class UpdateItemResponse extends ServiceResponse {
        private item: Item = null;
        private returnedItem: Item = null;
        private conflictCount: number = 0;
        get ReturnedItem(): Item {
            return this.returnedItem;
        }
        get ConflictCount(): number {
            return this.conflictCount;
        }
        constructor(item: Item) {
            super();
            EwsUtilities.Assert(item !== null, "UpdateItemResponse.ctor", "item is null");
            this.item = item;
        }
        ReadElementsFromXml(reader: EwsServiceXmlReader): void {
            super.ReadElementsFromXml(reader);
            reader.ReadServiceObjectsCollectionFromXml<Item>("Items", this.GetObjectInstance, false, null, false);
            if (!reader.Service.Exchange2007CompatibilityMode) {
                reader.ReadStartElement(XmlNamespace.Messages, "ConflictResults");
                this.conflictCount = reader.ReadElementValue<number>(XmlNamespace.Types, "Count");
                reader.ReadEndElement(XmlNamespace.Messages, "ConflictResults");
            }
            if (this.returnedItem !== null && this.item.Id.UniqueId === this.returnedItem.Id.UniqueId) {
                this.item.Id.ChangeKey = this.returnedItem.Id.ChangeKey;
                this.returnedItem = null;
            }
        }
        ReadElementsFromJson(responseObject: JsonObject, service: ExchangeService): void {
            super.ReadElementsFromJson(responseObject, service);
            new EwsServiceJsonReader(service).ReadServiceObjectsCollectionFromJson<Item>(responseObject, "Items", this.GetObjectInstance, false, null, false);
            if (!service.Exchange2007CompatibilityMode) {
                this.conflictCount = responseObject.ReadAsJsonObject("ConflictResults").ReadAsInt("Count");
            }
            if (this.returnedItem !== null && this.item.Id.UniqueId === this.returnedItem.Id.UniqueId) {
                this.item.Id.ChangeKey = this.returnedItem.Id.ChangeKey;
                this.returnedItem = null;
            }
        }
        Loaded(): void {
            if (this.Result === ServiceResult.Success) {
                this.item.ClearChangeLog();
            }
        }
        private GetObjectInstance(service: ExchangeService, xmlElementName: string): Item {
            this.returnedItem = EwsUtilities.CreateEwsObjectFromXmlElementName<Item>(service, xmlElementName);
            return this.returnedItem;
        }
    }
    class ResponseObject<TMessage> extends ServiceObject {
        private referenceItem: Item = null;
        set IsReadReceiptRequested(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsReadReceiptRequested, value);
        }
        get IsReadReceiptRequested(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsReadReceiptRequested);
        }
        set IsDeliveryReceiptRequested(value: boolean) {
            this.PropertyBag.set_Item(EmailMessageSchema.IsDeliveryReceiptRequested, value);
        }
        get IsDeliveryReceiptRequested(): boolean {
            return <boolean>this.PropertyBag.get_Item(EmailMessageSchema.IsDeliveryReceiptRequested);
        }
        constructor(referenceItem: Item) {
            super(referenceItem.Service);
            EwsUtilities.Assert(referenceItem !== null, "ResponseObject.ctor", "referenceItem is null");
            referenceItem.ThrowIfThisIsNew();
            this.referenceItem = referenceItem;
        }
        GetSchema(): ServiceObjectSchema {
            return ResponseObjectSchema.Instance;
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new NotSupportedException();
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new NotSupportedException();
        }
        InternalCreate(destinationFolderId: FolderId, messageDisposition: MessageDisposition): List<Item> {
            (<ItemId>this.PropertyBag.get_Item(ResponseObjectSchema.ReferenceItemId)).Assign(this.referenceItem.Id);
            return this.Service.InternalCreateResponseObject(this, destinationFolderId, new Nullable<MessageDisposition>(messageDisposition));
        }
        Save(destinationFolderId: FolderId): TMessage;
        Save(destinationFolderName: WellKnownFolderName): TMessage;
        Save(): TMessage;
        Save(destinationFolderIdOrDestinationFolderName?: any): TMessage {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Save_0(destinationFolderIdOrDestinationFolderName);
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName.constructor === Number)) {
                return this.Save_1(destinationFolderIdOrDestinationFolderName);
            }
            return this.Save_2();
        }
        private Save_0(destinationFolderId: FolderId): TMessage {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return ((this.InternalCreate(destinationFolderId, MessageDisposition.SaveOnly).get_Item(0) instanceof TMessage) ? <TMessage>this.InternalCreate(destinationFolderId, MessageDisposition.SaveOnly).get_Item(0) : null);
        }
        private Save_1(destinationFolderName: WellKnownFolderName): TMessage {
            return ((this.InternalCreate(new FolderId(destinationFolderName), MessageDisposition.SaveOnly).get_Item(0) instanceof TMessage) ? <TMessage>this.InternalCreate(new FolderId(destinationFolderName), MessageDisposition.SaveOnly).get_Item(0) : null);
        }
        private Save_2(): TMessage {
            return ((this.InternalCreate(null, MessageDisposition.SaveOnly).get_Item(0) instanceof TMessage) ? <TMessage>this.InternalCreate(null, MessageDisposition.SaveOnly).get_Item(0) : null);
        }
        Send(): void {
            this.InternalCreate(null, MessageDisposition.SendOnly);
        }
        SendAndSaveCopy(destinationFolderId: FolderId): void;
        SendAndSaveCopy(destinationFolderName: WellKnownFolderName): void;
        SendAndSaveCopy(): void;
        SendAndSaveCopy(destinationFolderIdOrDestinationFolderName?: any): void {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                this.SendAndSaveCopy_0(destinationFolderIdOrDestinationFolderName);
                return;
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName.constructor === Number)) {
                this.SendAndSaveCopy_1(destinationFolderIdOrDestinationFolderName);
                return;
            }
            this.SendAndSaveCopy_2();
        }
        private SendAndSaveCopy_0(destinationFolderId: FolderId): void {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            this.InternalCreate(destinationFolderId, MessageDisposition.SendAndSaveCopy);
        }
        private SendAndSaveCopy_1(destinationFolderName: WellKnownFolderName): void {
            this.InternalCreate(new FolderId(destinationFolderName), MessageDisposition.SendAndSaveCopy);
        }
        private SendAndSaveCopy_2(): void {
            this.InternalCreate(null, MessageDisposition.SendAndSaveCopy);
        }
    }
    class CalendarResponseMessageBase<TMessage> extends ResponseObject<TMessage>
    {
        constructor(referenceItem: Item) {
            super(referenceItem);
        }
        Save(destinationFolderId: FolderId): CalendarActionResults;
        Save(destinationFolderName: WellKnownFolderName): CalendarActionResults;
        Save(): CalendarActionResults;
        Save(destinationFolderIdOrDestinationFolderName?: any): CalendarActionResults {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Save_0(destinationFolderIdOrDestinationFolderName);
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName.constructor === Number)) {
                return this.Save_1(destinationFolderIdOrDestinationFolderName);
            }
            return this.Save_2();
        }
        private Save_0(destinationFolderId: FolderId): CalendarActionResults {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return CalendarActionResults(super.InternalCreate(destinationFolderId, MessageDisposition.SaveOnly));
        }
        private Save_1(destinationFolderName: WellKnownFolderName): CalendarActionResults {
            return new CalendarActionResults(super.InternalCreate(new FolderId(destinationFolderName), MessageDisposition.SaveOnly));
        }
        private Save_2(): CalendarActionResults {
            return new CalendarActionResults(super.InternalCreate(null, MessageDisposition.SaveOnly));
        }
        Send(): CalendarActionResults {
            return new CalendarActionResults(super.InternalCreate(null, MessageDisposition.SendOnly));
        }
        SendAndSaveCopy(destinationFolderId: FolderId): CalendarActionResults;
        SendAndSaveCopy(destinationFolderName: WellKnownFolderName): CalendarActionResults;
        SendAndSaveCopy(): CalendarActionResults;
        SendAndSaveCopy(destinationFolderIdOrDestinationFolderName?: any): CalendarActionResults {
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.SendAndSaveCopy_0(destinationFolderIdOrDestinationFolderName);
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName.constructor === Number)) {
                return this.SendAndSaveCopy_1(destinationFolderIdOrDestinationFolderName);
            }
            return this.SendAndSaveCopy_2();
        }
        private SendAndSaveCopy_0(destinationFolderId: FolderId): CalendarActionResults {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return new CalendarActionResults(super.InternalCreate(destinationFolderId, MessageDisposition.SendAndSaveCopy));
        }
        private SendAndSaveCopy_1(destinationFolderName: WellKnownFolderName): CalendarActionResults {
            return new CalendarActionResults(super.InternalCreate(new FolderId(destinationFolderName), MessageDisposition.SendAndSaveCopy));
        }
        private SendAndSaveCopy_2(): CalendarActionResults {
            return new CalendarActionResults(super.InternalCreate(null, MessageDisposition.SendAndSaveCopy));
        }
    }
    class CalendarResponseMessage<TMessage> extends CalendarResponseMessageBase<TMessage>
    {
        set Body(value: MessageBody) {
            this.PropertyBag.set_Item(ItemSchema.Body, value);
        }
        get Body(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ItemSchema.Body);
        }
        get ToRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.ToRecipients);
        }
        get CcRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.CcRecipients);
        }
        get BccRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.BccRecipients);
        }
        set ItemClass(value: string) {
            this.PropertyBag.set_Item(ItemSchema.ItemClass, value);
        }
        get ItemClass(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.ItemClass);
        }
        set Sensitivity(value: Sensitivity) {
            this.PropertyBag.set_Item(ItemSchema.Sensitivity, value);
        }
        get Sensitivity(): Sensitivity {
            return <Sensitivity>this.PropertyBag.get_Item(ItemSchema.Sensitivity);
        }
        get Attachments(): AttachmentCollection {
            return <AttachmentCollection>this.PropertyBag.get_Item(ItemSchema.Attachments);
        }
        get InternetMessageHeaders(): InternetMessageHeaderCollection {
            return <InternetMessageHeaderCollection>this.PropertyBag.get_Item(ItemSchema.InternetMessageHeaders);
        }
        set Sender(value: EmailAddress) {
            this.PropertyBag.set_Item(EmailMessageSchema.Sender, value);
        }
        get Sender(): EmailAddress {
            return <EmailAddress>this.PropertyBag.get_Item(EmailMessageSchema.Sender);
        }
        constructor(referenceItem: Item) {
            super(referenceItem);
        }
        GetSchema(): ServiceObjectSchema {
            return CalendarResponseObjectSchema.Instance;
        }
    }
    class AcceptMeetingInvitationMessage extends CalendarResponseMessage<MeetingResponse>
    {
        private tentative: boolean = false;
        get Tentative(): boolean {
            return this.tentative;
        }
        constructor(referenceItem: Item, tentative: boolean) {
            super(referenceItem);
            this.tentative = tentative;
        }
        GetXmlElementNameOverride(): string {
            if (this.tentative) {
                return "TentativelyAcceptItem";
            }
            return "AcceptItem";
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class CancelMeetingMessage extends CalendarResponseMessageBase<MeetingCancellation>
    {
        set Body(value: MessageBody) {
            this.PropertyBag.set_Item(CancelMeetingMessageSchema.Body, value);
        }
        get Body(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(CancelMeetingMessageSchema.Body);
        }
        constructor(referenceItem: Item) {
            super(referenceItem);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        GetSchema(): ServiceObjectSchema {
            return CancelMeetingMessageSchema.Instance;
        }
    }
    class DeclineMeetingInvitationMessage extends CalendarResponseMessage<MeetingResponse>
    {
        constructor(referenceItem: Item) {
            super(referenceItem);
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
    }
    class PostReply extends ServiceObject {
        private referenceItem: Item = null;
        set Subject(value: string) {
            this.PropertyBag.set_Item(ItemSchema.Subject, value);
        }
        get Subject(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.Subject);
        }
        set Body(value: MessageBody) {
            this.PropertyBag.set_Item(ItemSchema.Body, value);
        }
        get Body(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ItemSchema.Body);
        }
        set BodyPrefix(value: MessageBody) {
            this.PropertyBag.set_Item(ResponseObjectSchema.BodyPrefix, value);
        }
        get BodyPrefix(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ResponseObjectSchema.BodyPrefix);
        }
        constructor(referenceItem: Item) {
            super(referenceItem.Service);
            EwsUtilities.Assert(referenceItem !== null, "PostReply.ctor", "referenceItem is null");
            referenceItem.ThrowIfThisIsNew();
            this.referenceItem = referenceItem;
        }
        GetSchema(): ServiceObjectSchema {
            return PostReplySchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        InternalCreate(parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>): PostItem {
            (<ItemId>this.PropertyBag.get_Item(ResponseObjectSchema.ReferenceItemId)).Assign(this.referenceItem.Id);
            var items: List<Item> = this.Service.InternalCreateResponseObject(this, parentFolderId, messageDisposition);
            var postItem: PostItem = EwsUtilities.FindFirstItemOfType<PostItem>(items);
            EwsUtilities.Assert(postItem !== null, "PostReply.InternalCreate", "postItem is null. The CreateItem call did not return the expected PostItem.");
            return postItem;
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new InvalidOperationException(Strings.LoadingThisObjectTypeNotSupported);
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new InvalidOperationException(Strings.DeletingThisObjectTypeNotAuthorized);
        }
        Save(): PostItem;
        Save(destinationFolderId: FolderId): PostItem;
        Save(destinationFolderName: WellKnownFolderName): PostItem;
        Save(destinationFolderIdOrDestinationFolderName?: any): PostItem {
            if (arguments.length === 0) {
                return this.Save_0();
            }
            if (arguments.length === 1 && (destinationFolderIdOrDestinationFolderName === null || destinationFolderIdOrDestinationFolderName instanceof FolderId)) {
                return this.Save_1(destinationFolderIdOrDestinationFolderName);
            }
            return this.Save_2(destinationFolderIdOrDestinationFolderName);
        }
        private Save_0(): PostItem {
            return this.InternalCreate(null, null);
        }
        private Save_1(destinationFolderId: FolderId): PostItem {
            EwsUtilities.ValidateParam(destinationFolderId, "destinationFolderId");
            return this.InternalCreate(destinationFolderId, null);
        }
        private Save_2(destinationFolderName: WellKnownFolderName): PostItem {
            return this.InternalCreate(new FolderId(destinationFolderName), null);
        }
    }
    class RemoveFromCalendar extends ServiceObject {
        private referenceItem: Item = null;
        constructor(referenceItem: Item) {
            super(referenceItem.Service);
            EwsUtilities.Assert(referenceItem !== null, "RemoveFromCalendar.ctor", "referenceItem is null");
            referenceItem.ThrowIfThisIsNew();
            this.referenceItem = referenceItem;
        }
        GetSchema(): ServiceObjectSchema {
            return ResponseObjectSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new NotSupportedException();
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new NotSupportedException();
        }
        InternalCreate(parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>): List<Item> {
            (<ItemId>this.PropertyBag.get_Item(ResponseObjectSchema.ReferenceItemId)).Assign(this.referenceItem.Id);
            return this.Service.InternalCreateResponseObject(this, parentFolderId, messageDisposition);
        }
    }
    class ResponseMessage extends ResponseObject<EmailMessage>
    {
        private responseType: ResponseMessageType = 0;
        get ResponseType(): ResponseMessageType {
            return this.responseType;
        }
        set Body(value: MessageBody) {
            this.PropertyBag.set_Item(ItemSchema.Body, value);
        }
        get Body(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ItemSchema.Body);
        }
        get ToRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.ToRecipients);
        }
        get CcRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.CcRecipients);
        }
        get BccRecipients(): EmailAddressCollection {
            return <EmailAddressCollection>this.PropertyBag.get_Item(EmailMessageSchema.BccRecipients);
        }
        set Subject(value: string) {
            this.PropertyBag.set_Item(ItemSchema.Subject, value);
        }
        get Subject(): string {
            return <string>this.PropertyBag.get_Item(ItemSchema.Subject);
        }
        set BodyPrefix(value: MessageBody) {
            this.PropertyBag.set_Item(ResponseObjectSchema.BodyPrefix, value);
        }
        get BodyPrefix(): MessageBody {
            return <MessageBody>this.PropertyBag.get_Item(ResponseObjectSchema.BodyPrefix);
        }
        constructor(referenceItem: Item, responseType: ResponseMessageType) {
            super(referenceItem);
            this.responseType = responseType;
        }
        GetSchema(): ServiceObjectSchema {
            return ResponseMessageSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        GetXmlElementNameOverride(): string {
            switch (this.responseType) {
                case ResponseMessageType.Reply:
                    return "ReplyToItem";
                case ResponseMessageType.ReplyAll:
                    return "ReplyAllToItem";
                case ResponseMessageType.Forward:
                    return "ForwardItem";
                default:
                    EwsUtilities.Assert(false, "ResponseMessage.GetXmlElementNameOverride", "An unexpected value for responseType could not be handled.");
                    return null;
            }
        }
    }
    class SuppressReadReceipt extends ServiceObject {
        private referenceItem: Item = null;
        constructor(referenceItem: Item) {
            super(referenceItem.Service);
            EwsUtilities.Assert(referenceItem !== null, "SuppressReadReceipt.ctor", "referenceItem is null");
            referenceItem.ThrowIfThisIsNew();
            this.referenceItem = referenceItem;
        }
        GetSchema(): ServiceObjectSchema {
            return ResponseObjectSchema.Instance;
        }
        GetMinimumRequiredServerVersion(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        InternalLoad(propertySet: PropertySet): void {
            throw new NotSupportedException();
        }
        InternalDelete(deleteMode: DeleteMode, sendCancellationsMode: Nullable<SendCancellationsMode>, affectedTaskOccurrences: Nullable<AffectedTaskOccurrence>): void {
            throw new NotSupportedException();
        }
        InternalCreate(parentFolderId: FolderId, messageDisposition: Nullable<MessageDisposition>): void {
            (<ItemId>this.PropertyBag.get_Item(ResponseObjectSchema.ReferenceItemId)).Assign(this.referenceItem.Id);
            this.Service.InternalCreateResponseObject(this, parentFolderId, messageDisposition);
        }
    }
    class PropertyDefinitionBase implements IJsonSerializable {
        Version: ExchangeVersion = 0;
        Type: Type = null;
        constructor() {
            super();
        }
        static TryLoadFromXml(reader: EwsServiceXmlReader, propertyDefinition: PropertyDefinitionBase[]): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "FieldURI") {
                    propertyDefinition[0] = ServiceObjectSchema.FindPropertyDefinition(reader.ReadAttributeValue("FieldURI"));
                    reader.SkipCurrentElement();
                    return true;
                }
                if (localName === "IndexedFieldURI") {
                    propertyDefinition[0] = new IndexedPropertyDefinition(reader.ReadAttributeValue("FieldURI"), reader.ReadAttributeValue("FieldIndex"));
                    reader.SkipCurrentElement();
                    return true;
                }
                if (localName === "ExtendedFieldURI") {
                    propertyDefinition[0] = new ExtendedPropertyDefinition();
                    (((propertyDefinition[0] instanceof ExtendedPropertyDefinition) ? <ExtendedPropertyDefinition>propertyDefinition[0] : null)).LoadFromXml(reader);
                    return true;
                }
            }
            return false;
        }
        static TryLoadFromJson(jsonObject: JsonObject): PropertyDefinitionBase {
            var a: string;
            if ((a = jsonObject.ReadTypeString()) !== null) {
                if (a === "PropertyUri") {
                    return ServiceObjectSchema.FindPropertyDefinition(jsonObject.ReadAsString("FieldURI"));
                }
                if (a === "DictionaryPropertyUri") {
                    return new IndexedPropertyDefinition(jsonObject.ReadAsString("FieldURI"), jsonObject.ReadAsString("FieldIndex"));
                }
                if (a === "ExtendedPropertyUri") {
                    var extendedPropertyDefinition: ExtendedPropertyDefinition = new ExtendedPropertyDefinition();
                    extendedPropertyDefinition.LoadFromJson(jsonObject);
                    return extendedPropertyDefinition;
                }
            }
            return null;
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetJsonType(): string {
            throw new NotSupportedException();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        GetPrintableName(): string {
            throw new NotSupportedException();
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.GetXmlElementName());
            this.WriteAttributesToXml(writer);
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetJsonType());
            this.AddJsonProperties(jsonObject, service);
            return jsonObject;
        }
        AddJsonProperties(jsonPropertyDefinition: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
        ToString(): string {
            return this.GetPrintableName();
        }
    }
    class ServiceObjectPropertyDefinition extends PropertyDefinitionBase {
        private uri: string = null;
        get Version(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        get Uri(): string {
            return this.uri;
        }
        GetXmlElementName(): string {
            return "FieldURI";
        }
        GetJsonType(): string {
            return "PropertyUri";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("FieldURI", this.Uri);
        }
        AddJsonProperties(jsonPropertyDefinition: JsonObject, service: ExchangeService): void {
            jsonPropertyDefinition.Add("FieldURI", this.Uri);
        }
        constructor();
        constructor(uri: string);
        constructor(uri?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(uri);
        }
        private constructor_0(): void {
        }
        private constructor_1(uri: string): void {
            EwsUtilities.Assert(!NString.IsNullOrEmpty(uri), "ServiceObjectPropertyDefinition.ctor", "uri is null or empty");
            this.uri = uri;
        }
    }
    class PropertyDefinition extends ServiceObjectPropertyDefinition {
        private xmlElementName: string = null;
        private flags: PropertyDefinitionFlags = 0;
        private name: string = null;
        private version: ExchangeVersion = 0;
        get Version(): ExchangeVersion {
            return this.version;
        }
        get IsNullable(): boolean {
            return true;
        }
        get XmlElementName(): string {
            return this.xmlElementName;
        }
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            if (NString.IsNullOrEmpty(this.name)) {
                ServiceObjectSchema.InitializeSchemaPropertyNames();
            }
            return this.name;
        }
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uriOrFlags: any, versionOrFlags: any, version?: ExchangeVersion) {
            super(uriOrFlags);
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uriOrFlags === null || uriOrFlags.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_0(xmlElementName, uriOrFlags, versionOrFlags);
                return;
            }
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uriOrFlags === null || uriOrFlags.constructor === Number) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_1(xmlElementName, uriOrFlags, versionOrFlags);
                return;
            }
            this.constructor_2(xmlElementName, uriOrFlags, versionOrFlags, version);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
            this.xmlElementName = xmlElementName;
            this.flags = PropertyDefinitionFlags.None;
            this.version = version;
        }
        private constructor_1(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
            this.xmlElementName = xmlElementName;
            this.flags = flags;
            this.version = version;
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
            this.constructor_0(xmlElementName, uri, version);
            this.flags = flags;
        }
        HasFlag(flag: PropertyDefinitionFlags): boolean;
        HasFlag(flag: PropertyDefinitionFlags, version: Nullable<ExchangeVersion>): boolean;
        HasFlag(flag: PropertyDefinitionFlags, version?: Nullable<ExchangeVersion>): boolean {
            if (arguments.length === 1 && (flag === null || flag.constructor === Number)) {
                return this.HasFlag_0(flag);
            }
            return this.HasFlag_1(flag, version);
        }
        private HasFlag_0(flag: PropertyDefinitionFlags): boolean {
            return this.HasFlag(flag, null);
        }
        private HasFlag_1(flag: PropertyDefinitionFlags, version: Nullable<ExchangeVersion>): boolean {
            return (this.flags & flag) === flag;
        }
        RegisterAssociatedInternalProperties(properties: List<PropertyDefinition>): void {
        }
        GetAssociatedInternalProperties(): List<PropertyDefinition> {
            var list: List<PropertyDefinition> = new List<PropertyDefinition>();
            this.RegisterAssociatedInternalProperties(list);
            return list;
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            throw new NotSupportedException();
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            throw new NotSupportedException();
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            throw new NotSupportedException();
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            throw new NotSupportedException();
        }
        GetPrintableName(): string {
            return this.Name;
        }
    }
    class ComplexPropertyDefinitionBase extends PropertyDefinition {
        constructor(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, flagsOrUri: any, versionOrFlags: any, version?: ExchangeVersion) {
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (flagsOrUri === null || flagsOrUri.constructor === Number) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                super(xmlElementName, flagsOrUri, versionOrFlags);
                this.constructor_0(xmlElementName, flagsOrUri, versionOrFlags);
                return;
            }
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (flagsOrUri === null || flagsOrUri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                super(xmlElementName, flagsOrUri, versionOrFlags);
                this.constructor_1(xmlElementName, flagsOrUri, versionOrFlags);
                return;
            }
            super(xmlElementName, flagsOrUri, versionOrFlags, version);
            this.constructor_2(xmlElementName, flagsOrUri, versionOrFlags, version);
        }
        private constructor_0(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_1(xmlElementName: string, uri: string, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        CreatePropertyInstance(owner: ServiceObject): ComplexProperty {
            throw new NotSupportedException();
        }
        InternalLoadFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var obj: any;
            if (!(() => {
                var _p0 = [
                    obj
                ];
                var _r = this.GetPropertyInstance(propertyBag, _p0);
                obj = _p0[0];
                return _r;
            })() && this.HasFlag(PropertyDefinitionFlags.UpdateCollectionItems, new Nullable<ExchangeVersion>(propertyBag.Owner.Service.RequestedServerVersion))) {
                (((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null)).UpdateFromXml(reader, reader.LocalName);
            }
            else {
                (((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null)).LoadFromXml(reader, reader.LocalName);
            }
            propertyBag.set_Item(this, obj);
        }
        InternalLoadFromJson(jsonObject: JsonObject, service: ExchangeService, propertyBag: PropertyBag): void {
            var obj: any;
            (() => {
                var _p0 = [
                    obj
                ];
                var _r = this.GetPropertyInstance(propertyBag, _p0);
                obj = _p0[0];
                return _r;
            })();
            (((obj instanceof ComplexProperty) ? <ComplexProperty>obj : null)).LoadFromJson(jsonObject, service);
            propertyBag.set_Item(this, obj);
        }
        private InternalLoadCollectionFromJson(jsonCollection: any[], service: ExchangeService, propertyBag: PropertyBag): void {
            var obj: any;
            var propertyInstance: boolean = (() => {
                var _p0 = [
                    obj
                ];
                var _r = this.GetPropertyInstance(propertyBag, _p0);
                obj = _p0[0];
                return _r;
            })();
            var jsonCollectionDeserializer: IJsonCollectionDeserializer = ((obj instanceof IJsonCollectionDeserializer) ? <IJsonCollectionDeserializer>obj : null);
            if (jsonCollectionDeserializer === null) {
                throw new ServiceJsonDeserializationException();
            }
            if (!propertyInstance && this.HasFlag(PropertyDefinitionFlags.UpdateCollectionItems, new Nullable<ExchangeVersion>(propertyBag.Owner.Service.RequestedServerVersion))) {
                jsonCollectionDeserializer.UpdateFromJsonCollection(jsonCollection, service);
            }
            else {
                jsonCollectionDeserializer.CreateFromJsonCollection(jsonCollection, service);
            }
            propertyBag.set_Item(this, jsonCollectionDeserializer);
        }
        private GetPropertyInstance(propertyBag: PropertyBag, complexProperty: any[]): boolean {
            complexProperty[0] = null;
            if (!(() => {
                var _p0 = [
                    complexProperty[0]
                ];
                var _r = propertyBag.TryGetValue(this, _p0);
                complexProperty[0] = _p0[0];
                return _r;
            })() || !this.HasFlag(PropertyDefinitionFlags.ReuseInstance, new Nullable<ExchangeVersion>(propertyBag.Owner.Service.RequestedServerVersion))) {
                complexProperty[0] = this.CreatePropertyInstance(propertyBag.Owner);
                return true;
            }
            return false;
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, this.XmlElementName);
            if (!reader.IsEmptyElement || reader.HasAttributes) {
                this.InternalLoadFromXml(reader, propertyBag);
            }
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, this.XmlElementName);
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
            if (jsonObject !== null) {
                this.InternalLoadFromJson(jsonObject, service, propertyBag);
                return;
            }
            if (value.GetType().IsArray) {
                this.InternalLoadCollectionFromJson(((value instanceof any[]) ? <any[]>value : null), service, propertyBag);
            }
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var complexProperty: ComplexProperty = <ComplexProperty>propertyBag.get_Item(this);
            if (complexProperty !== null) {
                complexProperty.WriteToXml(writer, this.XmlElementName);
            }
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            var complexProperty: ComplexProperty = <ComplexProperty>propertyBag.get_Item(this);
            if (complexProperty !== null) {
                jsonObject.Add(this.XmlElementName, complexProperty.InternalToJson(service));
            }
        }
    }
    class ComplexPropertyDefinition<TComplexProperty> extends ComplexPropertyDefinitionBase {
        private propertyCreationDelegate: () => TComplexProperty = null;
        get Type(): Type {
            return new Type("TComplexProperty");
        }
        constructor(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty);
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty);
        constructor(xmlElementName: string, flagsOrUri: any, versionOrFlags: any, propertyCreationDelegateOrVersion: any, propertyCreationDelegate?: () => TComplexProperty) {
            super(xmlElementName, flagsOrUri, versionOrFlags);
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (flagsOrUri === null || flagsOrUri.constructor === Number) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_0(xmlElementName, flagsOrUri, versionOrFlags, propertyCreationDelegateOrVersion);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (flagsOrUri === null || flagsOrUri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_1(xmlElementName, flagsOrUri, versionOrFlags, propertyCreationDelegateOrVersion);
                return;
            }
            this.constructor_2(xmlElementName, flagsOrUri, versionOrFlags, propertyCreationDelegateOrVersion, propertyCreationDelegate);
        }
        private constructor_0(xmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty): void {
            EwsUtilities.Assert(propertyCreationDelegate !== null, "ComplexPropertyDefinition ctor", "CreateComplexPropertyDelegate cannot be null");
            this.propertyCreationDelegate = propertyCreationDelegate;
        }
        private constructor_1(xmlElementName: string, uri: string, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty): void {
            this.propertyCreationDelegate = propertyCreationDelegate;
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty): void {
            this.propertyCreationDelegate = propertyCreationDelegate;
        }
        CreatePropertyInstance(owner: ServiceObject): ComplexProperty {
            var tComplexProperty: TComplexProperty = this.propertyCreationDelegate();
            var ownedProperty: IOwnedProperty = ((tComplexProperty instanceof IOwnedProperty) ? <IOwnedProperty>tComplexProperty : null);
            if (ownedProperty !== null) {
                ownedProperty.Owner = owner;
            }
            return tComplexProperty;
        }
    }
    class ServiceObjectSchema implements IEnumerable<PropertyDefinition>
    {
        private static lockObject: any = new any();
        private static allSchemaTypes: LazyMember<List<Type>> = new LazyMember<List<Type>>(() => {
            var list: List<Type> = new List<Type>();
            list.Add(new Type("AppointmentSchema"));
            list.Add(new Type("CalendarResponseObjectSchema"));
            list.Add(new Type("CancelMeetingMessageSchema"));
            list.Add(new Type("ContactGroupSchema"));
            list.Add(new Type("ContactSchema"));
            list.Add(new Type("ConversationSchema"));
            list.Add(new Type("EmailMessageSchema"));
            list.Add(new Type("FolderSchema"));
            list.Add(new Type("ItemSchema"));
            list.Add(new Type("MeetingMessageSchema"));
            list.Add(new Type("MeetingRequestSchema"));
            list.Add(new Type("MeetingCancellationSchema"));
            list.Add(new Type("MeetingResponseSchema"));
            list.Add(new Type("PostItemSchema"));
            list.Add(new Type("PostReplySchema"));
            list.Add(new Type("ResponseMessageSchema"));
            list.Add(new Type("ResponseObjectSchema"));
            list.Add(new Type("ServiceObjectSchema"));
            list.Add(new Type("SearchFolderSchema"));
            list.Add(new Type("TaskSchema"));
            return list;
        });
        private static allSchemaProperties: LazyMember<Dictionary<string, PropertyDefinitionBase>> = new LazyMember<Dictionary<string, PropertyDefinitionBase>>(() => {
            var dictionary: Dictionary<string, PropertyDefinitionBase> = new Dictionary<string, PropertyDefinitionBase>();
            var enumerator: List_Enumerator<Type> = ServiceObjectSchema.allSchemaTypes.Member.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Type = enumerator.Current;
                    ServiceObjectSchema.AddSchemaPropertiesToDictionary(current, dictionary);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return dictionary;
        });
        static ExtendedProperties: PropertyDefinition = new ComplexPropertyDefinition<ExtendedPropertyCollection>("ExtendedProperty", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.ReuseInstance | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new ExtendedPropertyCollection(); });
        private properties: Dictionary<string, PropertyDefinition> = new Dictionary<string, PropertyDefinition>();
        private visibleProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private firstClassProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private firstClassSummaryProperties: List<PropertyDefinition> = new List<PropertyDefinition>();
        private indexedProperties: List<IndexedPropertyDefinition> = new List<IndexedPropertyDefinition>();
        get FirstClassProperties(): List<PropertyDefinition> {
            return this.firstClassProperties;
        }
        get FirstClassSummaryProperties(): List<PropertyDefinition> {
            return this.firstClassSummaryProperties;
        }
        get IndexedProperties(): List<IndexedPropertyDefinition> {
            return this.indexedProperties;
        }
        static ForeachPublicStaticPropertyFieldInType(type: Type, propFieldDelegate: (propertyDefinition: PropertyDefinition, fieldInfo: FieldInfo) => void): void {
            var fields: FieldInfo[] = type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public);
            var array: FieldInfo[] = fields;
            for (var i: number = 0; i < array.length; i = i + 1) {
                var fieldInfo: FieldInfo = array[i];
                if (Type.op_Equality(fieldInfo.FieldType, new Type("PropertyDefinition")) || fieldInfo.FieldType.IsSubclassOf(new Type("PropertyDefinition"))) {
                    var propertyDefinition: PropertyDefinition = <PropertyDefinition>fieldInfo.GetValue(null);
                    propFieldDelegate(propertyDefinition, fieldInfo);
                }
            }
        }
        static AddSchemaPropertiesToDictionary(type: Type, propDefDictionary: Dictionary<string, PropertyDefinitionBase>): void {
            ServiceObjectSchema.ForeachPublicStaticPropertyFieldInType(type, (propertyDefinition: PropertyDefinition, fieldInfo: FieldInfo) => {
                if (!NString.IsNullOrEmpty(propertyDefinition.Uri)) {
                    var propertyDefinitionBase: PropertyDefinitionBase;
                    if ((() => {
                        var _p0 = [
                            propertyDefinitionBase
                        ];
                        var _r = propDefDictionary.TryGetValue(propertyDefinition.Uri, _p0);
                        propertyDefinitionBase = _p0[0];
                        return _r;
                    })()) {
                        EwsUtilities.Assert(propertyDefinitionBase === propertyDefinition, "Schema.allSchemaProperties.delegate", NString.Format("There are at least two distinct property definitions with the following URI: {0}", propertyDefinition.Uri));
                        return;
                    }
                    propDefDictionary.Add(propertyDefinition.Uri, propertyDefinition);
                    var associatedInternalProperties: List<PropertyDefinition> = propertyDefinition.GetAssociatedInternalProperties();
                    var enumerator: List_Enumerator<PropertyDefinition> = associatedInternalProperties.GetEnumerator();
                    try {
                        while (enumerator.MoveNext()) {
                            var current: PropertyDefinition = enumerator.Current;
                            propDefDictionary.Add(current.Uri, current);
                        }
                    }
                    finally {
                        (<IDisposable>enumerator).Dispose();
                    }
                }
            });
        }
        private static AddSchemaPropertyNamesToDictionary(type: Type, propertyNameDictionary: Dictionary<PropertyDefinition, string>): void {
            ServiceObjectSchema.ForeachPublicStaticPropertyFieldInType(type, (propertyDefinition: PropertyDefinition, fieldInfo: FieldInfo) => {
                propertyNameDictionary.Add(propertyDefinition, fieldInfo.Name);
            });
        }
        constructor() {
            super();
            this.RegisterProperties();
        }
        static FindPropertyDefinition(uri: string): PropertyDefinitionBase {
            return ServiceObjectSchema.allSchemaProperties.Member.get_Item(uri);
        }
        static InitializeSchemaPropertyNames(): void {
            var obj: any;
            Monitor.Enter(obj = ServiceObjectSchema.lockObject);
            try {
                var enumerator: List_Enumerator<Type> = ServiceObjectSchema.allSchemaTypes.Member.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: Type = enumerator.Current;
                        ServiceObjectSchema.ForeachPublicStaticPropertyFieldInType(current, (propDef: PropertyDefinition, fieldInfo: FieldInfo) => {
                            propDef.Name = fieldInfo.Name;
                        });
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private RegisterProperty(property: PropertyDefinition, isInternal: boolean): void;
        private RegisterProperty(property: PropertyDefinition): void;
        private RegisterProperty(property: PropertyDefinition, isInternal?: boolean): void {
            if (arguments.length === 2 && (property === null || property instanceof PropertyDefinition) && (isInternal === null || isInternal.constructor === Boolean)) {
                this.RegisterProperty_0(property, isInternal);
                return;
            }
            this.RegisterProperty_1(property);
        }
        private RegisterProperty_0(property: PropertyDefinition, isInternal: boolean): void {
            this.properties.Add(property.XmlElementName, property);
            if (!isInternal) {
                this.visibleProperties.Add(property);
            }
            if (!property.HasFlag(PropertyDefinitionFlags.MustBeExplicitlyLoaded)) {
                this.firstClassProperties.Add(property);
            }
            if (property.HasFlag(PropertyDefinitionFlags.CanFind)) {
                this.firstClassSummaryProperties.Add(property);
            }
        }
        private RegisterProperty_1(property: PropertyDefinition): void {
            this.RegisterProperty(property, false);
        }
        RegisterInternalProperty(property: PropertyDefinition): void {
            this.RegisterProperty(property, true);
        }
        RegisterIndexedProperty(indexedProperty: IndexedPropertyDefinition): void {
            this.indexedProperties.Add(indexedProperty);
        }
        RegisterProperties(): void {
        }
        TryGetPropertyDefinition(xmlElementName: string, propertyDefinition: PropertyDefinition[]): boolean {
            return (() => {
                var _p0 = [
                    propertyDefinition[0]
                ];
                var _r = this.properties.TryGetValue(xmlElementName, _p0);
                propertyDefinition[0] = _p0[0];
                return _r;
            })();
        }
        GetEnumerator(): IEnumerator<PropertyDefinition> {
            return this.visibleProperties.GetEnumerator();
        }
    }
    class AttachmentsPropertyDefinition extends ComplexPropertyDefinition<AttachmentCollection>
    {
        private static Exchange2010SP2PropertyDefinitionFlags: PropertyDefinitionFlags = PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.ReuseInstance | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.UpdateCollectionItems;
        constructor() {
            super("Attachments", "item:Attachments", PropertyDefinitionFlags.AutoInstantiateOnRead, ExchangeVersion.Exchange2007_SP1, () => { return new AttachmentCollection(); });
        }
        HasFlag(flag: PropertyDefinitionFlags, version: Nullable<ExchangeVersion>): boolean {
            if (version !== null && version >= ExchangeVersion.Exchange2010_SP2) {
                return (flag & AttachmentsPropertyDefinition.Exchange2010SP2PropertyDefinitionFlags) === flag;
            }
            return super.HasFlag(flag, version);
        }
    }
    class TypedPropertyDefinition extends PropertyDefinition {
        private isNullable: boolean = false;
        get IsNullable(): boolean {
            return this.isNullable;
        }
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean);
        constructor(xmlElementName: string, uri: string, versionOrFlags: any, version?: ExchangeVersion, isNullable?: boolean) {
            super(xmlElementName, uri, versionOrFlags);
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_0(xmlElementName, uri, versionOrFlags);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number) && (version === null || version.constructor === Number)) {
                this.constructor_1(xmlElementName, uri, versionOrFlags, version);
                return;
            }
            this.constructor_2(xmlElementName, uri, versionOrFlags, version, isNullable);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
            this.isNullable = false;
        }
        private constructor_1(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean): void {
            this.constructor_1(xmlElementName, uri, flags, version);
            this.isNullable = isNullable;
        }
        Parse(value: string): any {
            throw new NotSupportedException();
        }
        ToString(value: any): string {
            return NObject.GenericToString(value);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var value: string = reader.ReadElementValue(XmlNamespace.Types, this.XmlElementName);
            if (!NString.IsNullOrEmpty(value)) {
                propertyBag.set_Item(this, this.Parse(value));
            }
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var value2: string = ((value instanceof string) ? <string>value : null);
            if (!NString.IsNullOrEmpty(value2)) {
                propertyBag.set_Item(this, this.Parse(value2));
                return;
            }
            if (value !== null) {
                propertyBag.set_Item(this, this.Parse(NObject.GenericToString(value)));
            }
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var obj: any = propertyBag.get_Item(this);
            if (obj !== null) {
                writer.WriteElementValue(XmlNamespace.Types, this.XmlElementName, this.Name, obj);
            }
        }
    }
    class GenericPropertyDefinition<TPropertyValue> extends TypedPropertyDefinition {
        get Type(): Type {
            if (!this.IsNullable) {
                return new Type("TPropertyValue");
            }
            return new Type("Array");
        }
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean);
        constructor(xmlElementName: string, uri: string, versionOrFlags: any, version?: ExchangeVersion, isNullable?: boolean) {
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags);
                this.constructor_0(xmlElementName, uri, versionOrFlags);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number) && (version === null || version.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags, version);
                this.constructor_1(xmlElementName, uri, versionOrFlags, version);
                return;
            }
            super(xmlElementName, uri, versionOrFlags, version, isNullable);
            this.constructor_2(xmlElementName, uri, versionOrFlags, version, isNullable);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
        }
        private constructor_1(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean): void {
        }
        Parse(value: string): any {
            return EwsUtilities.Parse<TPropertyValue>(value);
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            jsonObject.Add(this.XmlElementName, propertyBag.get_Item(this));
        }
    }
    class BoolPropertyDefinition extends GenericPropertyDefinition<boolean>
    {
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean);
        constructor(xmlElementName: string, uri: string, versionOrFlags: any, version?: ExchangeVersion, isNullable?: boolean) {
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags);
                this.constructor_0(xmlElementName, uri, versionOrFlags);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number) && (version === null || version.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags, version);
                this.constructor_1(xmlElementName, uri, versionOrFlags, version);
                return;
            }
            super(xmlElementName, uri, versionOrFlags, version, isNullable);
            this.constructor_2(xmlElementName, uri, versionOrFlags, version, isNullable);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
        }
        private constructor_1(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean): void {
        }
        ToString(value: any): string {
            return EwsUtilities.BoolToXSBool(<boolean>value);
        }
    }
    class ByteArrayPropertyDefinition extends TypedPropertyDefinition {
        get IsNullable(): boolean {
            return true;
        }
        get Type(): Type {
            return new Type("Array");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        Parse(value: string): any {
            return Convert.FromBase64String(value);
        }
        ToString(value: any): string {
            return Convert.ToBase64String(<number[]>value);
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            if (propertyBag.get_Item(this) !== null) {
                jsonObject.Add(this.XmlElementName, this.ToString(propertyBag.get_Item(this)));
            }
        }
    }
    class DateTimePropertyDefinition extends PropertyDefinition {
        private isNullable: boolean = false;
        get IsNullable(): boolean {
            return this.isNullable;
        }
        get Type(): Type {
            if (!this.IsNullable) {
                return new Type("DateTime");
            }
            return new Type("Array");
        }
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean);
        constructor(xmlElementName: string, uri: string, versionOrFlags: any, version?: ExchangeVersion, isNullable?: boolean) {
            super(xmlElementName, uri, versionOrFlags);
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                this.constructor_0(xmlElementName, uri, versionOrFlags);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number) && (version === null || version.constructor === Number)) {
                this.constructor_1(xmlElementName, uri, versionOrFlags, version);
                return;
            }
            this.constructor_2(xmlElementName, uri, versionOrFlags, version, isNullable);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
        }
        private constructor_1(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean): void {
            this.isNullable = isNullable;
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var value: string = reader.ReadElementValue(XmlNamespace.Types, this.XmlElementName);
            propertyBag.set_Item(this, reader.Service.ConvertUniversalDateTimeStringToLocalDateTime(value));
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var value2: string = ((value instanceof string) ? <string>value : null);
            if (!NString.IsNullOrEmpty(value2)) {
                propertyBag.set_Item(this, service.ConvertUniversalDateTimeStringToLocalDateTime(value2));
            }
        }
        ScopeToTimeZone(service: ExchangeServiceBase, dateTime: DateTime, propertyBag: PropertyBag, isUpdateOperation: boolean): DateTime {
            var result: DateTime;
            try {
                result = new DateTime(EwsUtilities.ConvertTime(dateTime, service.TimeZone, TimeZoneInfo.Utc).Ticks, DateTimeKind.Utc);
            }
            catch (innerException) {
                if (innerException instanceof TimeZoneConversionException) {
                    throw new PropertyException(NString.Format(Strings.InvalidDateTime, dateTime), this.Name, innerException);
                }
                else
                    throw innerException;
            }
            return result;
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var obj: any = propertyBag.get_Item(this);
            if (obj !== null) {
                writer.WriteStartElement(XmlNamespace.Types, this.XmlElementName);
                var convertedDateTime: DateTime = this.GetConvertedDateTime(writer.Service, propertyBag, isUpdateOperation, obj);
                writer.WriteValue(EwsUtilities.DateTimeToXSDateTime(convertedDateTime), this.Name);
                writer.WriteEndElement();
            }
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            var obj: any = propertyBag.get_Item(this);
            if (obj !== null) {
                var convertedDateTime: DateTime = this.GetConvertedDateTime(service, propertyBag, isUpdateOperation, obj);
                jsonObject.Add(this.XmlElementName, EwsUtilities.DateTimeToXSDateTime(convertedDateTime));
            }
        }
        private GetConvertedDateTime(service: ExchangeServiceBase, propertyBag: PropertyBag, isUpdateOperation: boolean, value: any): DateTime {
            var dateTime: DateTime = <DateTime>value;
            var result: DateTime;
            if (dateTime.Kind === DateTimeKind.Unspecified) {
                result = this.ScopeToTimeZone(service, <DateTime>value, propertyBag, isUpdateOperation);
            }
            else {
                result = dateTime;
            }
            return result;
        }
    }
    class EffectiveRightsPropertyDefinition extends PropertyDefinition {
        get Type(): Type {
            return new Type("Number");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var effectiveRights: EffectiveRights = EffectiveRights.None;
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, this.XmlElementName);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    var localName: string;
                    if (reader.IsStartElement() && (localName = reader.LocalName) !== null) {
                        if (_PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x600186b - 1 === null)
                        {
                            var expr_47: Dictionary<string, number> = new Dictionary<string, number>(7);
                            expr_47.Add("CreateAssociated", 0);
                            expr_47.Add("CreateContents", 1);
                            expr_47.Add("CreateHierarchy", 2);
                            expr_47.Add("Delete", 3);
                            expr_47.Add("Modify", 4);
                            expr_47.Add("Read", 5);
                            expr_47.Add("ViewPrivateItems", 6);
                            _PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x600186b - 1 = expr_47;
                        }
                        var num: number;
                        if ((() => {
                            var _p0 = [
                                num
                            ];
                            var _r = _PrivateImplementationDetails_{70549B87-FCC0 - 4468 - A58C - F62EC848C70D}.$$method0x600186b-1.TryGetValue(localName, _p0);
                            num = _p0[0];
                            return _r;
                        })()) {
                            switch (num) {
                                case 0:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.CreateAssociated);
                                    }
                                    break;
                                case 1:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.CreateContents);
                                    }
                                    break;
                                case 2:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.CreateHierarchy);
                                    }
                                    break;
                                case 3:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.Delete);
                                    }
                                    break;
                                case 4:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.Modify);
                                    }
                                    break;
                                case 5:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.Read);
                                    }
                                    break;
                                case 6:
                                    if (reader.ReadElementValue<boolean>()) {
                                        effectiveRights = (effectiveRights | EffectiveRights.ViewPrivateItems);
                                    }
                                    break;
                            }
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, this.XmlElementName));
            }
            propertyBag.set_Item(this, effectiveRights);
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var effectiveRights: EffectiveRights = EffectiveRights.None;
            var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
            if (jsonObject !== null) {
                var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonObject.Keys.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: string = enumerator.Current;
                        var key: string;
                        switch (key = current) {
                            case "CreateAssociated":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.CreateAssociated);
                                }
                                break;
                            case "CreateContents":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.CreateContents);
                                }
                                break;
                            case "CreateHierarchy":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.CreateHierarchy);
                                }
                                break;
                            case "Delete":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.Delete);
                                }
                                break;
                            case "Modify":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.Modify);
                                }
                                break;
                            case "Read":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.Read);
                                }
                                break;
                            case "ViewPrivateItems":
                                if (jsonObject.ReadAsBool(current)) {
                                    effectiveRights = (effectiveRights | EffectiveRights.ViewPrivateItems);
                                }
                                break;
                        }
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
            }
            propertyBag.set_Item(this, value);
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
        }
    }
    class IntPropertyDefinition extends GenericPropertyDefinition<number>
    {
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion);
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean);
        constructor(xmlElementName: string, uri: string, versionOrFlags: any, version?: ExchangeVersion, isNullable?: boolean) {
            if (arguments.length === 3 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags);
                this.constructor_0(xmlElementName, uri, versionOrFlags);
                return;
            }
            if (arguments.length === 4 && (xmlElementName === null || xmlElementName.constructor === String) && (uri === null || uri.constructor === String) && (versionOrFlags === null || versionOrFlags.constructor === Number) && (version === null || version.constructor === Number)) {
                super(xmlElementName, uri, versionOrFlags, version);
                this.constructor_1(xmlElementName, uri, versionOrFlags, version);
                return;
            }
            super(xmlElementName, uri, versionOrFlags, version, isNullable);
            this.constructor_2(xmlElementName, uri, versionOrFlags, version, isNullable);
        }
        private constructor_0(xmlElementName: string, uri: string, version: ExchangeVersion): void {
        }
        private constructor_1(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion): void {
        }
        private constructor_2(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, isNullable: boolean): void {
        }
    }
    class ResponseObjectsPropertyDefinition extends PropertyDefinition {
        get IsNullable(): boolean {
            return false;
        }
        get Type(): Type {
            return new Type("Number");
        }
        constructor(xmlElementName: string, uri: string, version: ExchangeVersion) {
            super(xmlElementName, uri, version);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var responseActions: ResponseActions = ResponseActions.None;
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, this.XmlElementName);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        responseActions = (responseActions | ResponseObjectsPropertyDefinition.GetResponseAction(reader.LocalName));
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, this.XmlElementName));
            }
            propertyBag.set_Item(this, responseActions);
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var responseActions: ResponseActions = ResponseActions.None;
            var array: any[] = ((value instanceof any[]) ? <any[]>value : null);
            if (array !== null) {
                var enumerator: IEnumerator<JsonObject> = Enumerable.OfType<JsonObject>(NArray.ToEnumerable(array)).GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: JsonObject = enumerator.Current;
                        if (current.HasTypeProperty()) {
                            var text: string = current.ReadTypeString();
                            if (!NString.IsNullOrEmpty(text)) {
                                responseActions = (responseActions | ResponseObjectsPropertyDefinition.GetResponseAction(text));
                            }
                        }
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
            propertyBag.set_Item(this, responseActions);
        }
        private static GetResponseAction(responseActionString: string): ResponseActions {
            var result: ResponseActions = ResponseActions.None;
            switch (responseActionString) {
                case "AcceptItem":
                    result = ResponseActions.Accept;
                    break;
                case "TentativelyAcceptItem":
                    result = ResponseActions.TentativelyAccept;
                    break;
                case "DeclineItem":
                    result = ResponseActions.Decline;
                    break;
                case "ReplyToItem":
                    result = ResponseActions.Reply;
                    break;
                case "ForwardItem":
                    result = ResponseActions.Forward;
                    break;
                case "ReplyAllToItem":
                    result = ResponseActions.ReplyAll;
                    break;
                case "CancelCalendarItem":
                    result = ResponseActions.Cancel;
                    break;
                case "RemoveItem":
                    result = ResponseActions.RemoveFromCalendar;
                    break;
                case "SuppressReadReceipt":
                    result = ResponseActions.SuppressReadReceipt;
                    break;
                case "PostReplyItem":
                    result = ResponseActions.PostReply;
                    break;
            }
            return result;
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
        }
    }
    class ScopedDateTimePropertyDefinition extends DateTimePropertyDefinition {
        private getPropertyDefinitionCallback: (version: ExchangeVersion) => PropertyDefinition = null;
        private GetTimeZoneProperty(version: ExchangeVersion): PropertyDefinition {
            var propertyDefinition: PropertyDefinition = this.getPropertyDefinitionCallback(version);
            EwsUtilities.Assert(propertyDefinition !== null, "ScopedDateTimePropertyDefinition.GetTimeZoneProperty", "timeZoneProperty is null.");
            return propertyDefinition;
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, getPropertyDefinitionCallback: (version: ExchangeVersion) => PropertyDefinition) {
            super(xmlElementName, uri, flags, version);
            EwsUtilities.Assert(getPropertyDefinitionCallback !== null, "ScopedDateTimePropertyDefinition.ctor", "getPropertyDefinitionCallback is null.");
            this.getPropertyDefinitionCallback = getPropertyDefinitionCallback;
        }
        ScopeToTimeZone(service: ExchangeServiceBase, dateTime: DateTime, propertyBag: PropertyBag, isUpdateOperation: boolean): DateTime {
            if (!propertyBag.Owner.GetIsCustomDateTimeScopingRequired()) {
                return super.ScopeToTimeZone(service, dateTime, propertyBag, isUpdateOperation);
            }
            var timeZoneProperty: PropertyDefinition = this.GetTimeZoneProperty(service.RequestedServerVersion);
            var obj: any = null;
            (() => {
                var _p0 = [
                    obj
                ];
                var _r = propertyBag.TryGetProperty(timeZoneProperty, _p0);
                obj = _p0[0];
                return _r;
            })();
            if (obj !== null && propertyBag.IsPropertyUpdated(timeZoneProperty)) {
                try {
                    return new DateTime(EwsUtilities.ConvertTime(dateTime, <TimeZoneInfo>obj, TimeZoneInfo.Utc).Ticks, DateTimeKind.Utc);
                }
                catch (innerException) {
                    if (innerException instanceof TimeZoneConversionException) {
                        throw new PropertyException(NString.Format(Strings.InvalidDateTime, dateTime), this.Name, innerException);
                    }
                    else
                        throw innerException;
                }
            }
            if (!isUpdateOperation) {
                return super.ScopeToTimeZone(service, dateTime, propertyBag, isUpdateOperation);
            }
            if (service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                return super.ScopeToTimeZone(service, dateTime, propertyBag, isUpdateOperation);
            }
            return dateTime;
        }
    }
    class StringPropertyDefinition extends TypedPropertyDefinition {
        get IsNullable(): boolean {
            return true;
        }
        get Type(): Type {
            return new Type("String");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        Parse(value: string): any {
            return value;
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            jsonObject.Add(this.XmlElementName, propertyBag.get_Item(this));
        }
    }
    class ItemSchema extends ServiceObjectSchema {
        static Id: PropertyDefinition = new ComplexPropertyDefinition<ItemId>("ItemId", "item:ItemId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new ItemId(); });
        static Body: PropertyDefinition = new ComplexPropertyDefinition<MessageBody>("Body", "item:Body", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new MessageBody(); });
        static ItemClass: PropertyDefinition = new StringPropertyDefinition("ItemClass", "item:ItemClass", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Subject: PropertyDefinition = new StringPropertyDefinition("Subject", "item:Subject", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static MimeContent: PropertyDefinition = new ComplexPropertyDefinition<MimeContent>("MimeContent", "item:MimeContent", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2007_SP1, () => { return new MimeContent(); });
        static ParentFolderId: PropertyDefinition = new ComplexPropertyDefinition<FolderId>("ParentFolderId", "item:ParentFolderId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new FolderId(); });
        static Sensitivity: PropertyDefinition = new GenericPropertyDefinition<Sensitivity>("Sensitivity", "item:Sensitivity", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Attachments: PropertyDefinition = new AttachmentsPropertyDefinition();
        static DateTimeReceived: PropertyDefinition = new DateTimePropertyDefinition("DateTimeReceived", "item:DateTimeReceived", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Size: PropertyDefinition = new IntPropertyDefinition("Size", "item:Size", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Categories: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Categories", "item:Categories", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new StringList(); });
        static Importance: PropertyDefinition = new GenericPropertyDefinition<Importance>("Importance", "item:Importance", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static InReplyTo: PropertyDefinition = new StringPropertyDefinition("InReplyTo", "item:InReplyTo", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsSubmitted: PropertyDefinition = new BoolPropertyDefinition("IsSubmitted", "item:IsSubmitted", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsAssociated: PropertyDefinition = new BoolPropertyDefinition("IsAssociated", "item:IsAssociated", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010);
        static IsDraft: PropertyDefinition = new BoolPropertyDefinition("IsDraft", "item:IsDraft", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsFromMe: PropertyDefinition = new BoolPropertyDefinition("IsFromMe", "item:IsFromMe", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsResend: PropertyDefinition = new BoolPropertyDefinition("IsResend", "item:IsResend", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsUnmodified: PropertyDefinition = new BoolPropertyDefinition("IsUnmodified", "item:IsUnmodified", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static InternetMessageHeaders: PropertyDefinition = new ComplexPropertyDefinition<InternetMessageHeaderCollection>("InternetMessageHeaders", "item:InternetMessageHeaders", ExchangeVersion.Exchange2007_SP1, () => { return new InternetMessageHeaderCollection(); });
        static DateTimeSent: PropertyDefinition = new DateTimePropertyDefinition("DateTimeSent", "item:DateTimeSent", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DateTimeCreated: PropertyDefinition = new DateTimePropertyDefinition("DateTimeCreated", "item:DateTimeCreated", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static AllowedResponseActions: PropertyDefinition = new ResponseObjectsPropertyDefinition("ResponseObjects", "item:ResponseObjects", ExchangeVersion.Exchange2007_SP1);
        static ReminderDueBy: PropertyDefinition = new ScopedDateTimePropertyDefinition("ReminderDueBy", "item:ReminderDueBy", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, (version: ExchangeVersion) => { return AppointmentSchema.StartTimeZone; });
        static IsReminderSet: PropertyDefinition = new BoolPropertyDefinition("ReminderIsSet", "item:ReminderIsSet", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ReminderMinutesBeforeStart: PropertyDefinition = new IntPropertyDefinition("ReminderMinutesBeforeStart", "item:ReminderMinutesBeforeStart", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DisplayCc: PropertyDefinition = new StringPropertyDefinition("DisplayCc", "item:DisplayCc", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DisplayTo: PropertyDefinition = new StringPropertyDefinition("DisplayTo", "item:DisplayTo", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static HasAttachments: PropertyDefinition = new BoolPropertyDefinition("HasAttachments", "item:HasAttachments", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Culture: PropertyDefinition = new StringPropertyDefinition("Culture", "item:Culture", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static EffectiveRights: PropertyDefinition = new EffectiveRightsPropertyDefinition("EffectiveRights", "item:EffectiveRights", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static LastModifiedName: PropertyDefinition = new StringPropertyDefinition("LastModifiedName", "item:LastModifiedName", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static LastModifiedTime: PropertyDefinition = new DateTimePropertyDefinition("LastModifiedTime", "item:LastModifiedTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static WebClientReadFormQueryString: PropertyDefinition = new StringPropertyDefinition("WebClientReadFormQueryString", "item:WebClientReadFormQueryString", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010);
        static WebClientEditFormQueryString: PropertyDefinition = new StringPropertyDefinition("WebClientEditFormQueryString", "item:WebClientEditFormQueryString", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010);
        static ConversationId: PropertyDefinition = new ComplexPropertyDefinition<ConversationId>("ConversationId", "item:ConversationId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010, () => { return new ConversationId(); });
        static UniqueBody: PropertyDefinition = new ComplexPropertyDefinition<UniqueBody>("UniqueBody", "item:UniqueBody", PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2010, () => { return new UniqueBody(); });
        static StoreEntryId: PropertyDefinition = new ByteArrayPropertyDefinition("StoreEntryId", "item:StoreEntryId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP2);
        static InstanceKey: PropertyDefinition = new ByteArrayPropertyDefinition("InstanceKey", "item:InstanceKey", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static NormalizedBody: PropertyDefinition = new ComplexPropertyDefinition<NormalizedBody>("NormalizedBody", "item:NormalizedBody", PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2013, () => { return new NormalizedBody(); });
        static EntityExtractionResult: PropertyDefinition = new ComplexPropertyDefinition<EntityExtractionResult>("EntityExtractionResult", "item:EntityExtractionResult", PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2013, () => { return new EntityExtractionResult(); });
        static Flag: PropertyDefinition = new ComplexPropertyDefinition<Flag>("Flag", "item:Flag", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new Flag(); });
        static PolicyTag: PropertyDefinition = new ComplexPropertyDefinition<PolicyTag>("PolicyTag", "item:PolicyTag", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new PolicyTag(); });
        static ArchiveTag: PropertyDefinition = new ComplexPropertyDefinition<ArchiveTag>("ArchiveTag", "item:ArchiveTag", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new ArchiveTag(); });
        static RetentionDate: PropertyDefinition = new DateTimePropertyDefinition("RetentionDate", "item:RetentionDate", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, true);
        static Preview: PropertyDefinition = new StringPropertyDefinition("Preview", "item:Preview", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static TextBody: PropertyDefinition = new ComplexPropertyDefinition<TextBody>("TextBody", "item:TextBody", PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2013, () => { return new TextBody(); });
        static IconIndex: PropertyDefinition = new GenericPropertyDefinition<IconIndex>("IconIndex", "item:IconIndex", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static Instance: ItemSchema = new ItemSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ItemSchema.MimeContent);
            super.RegisterProperty(ItemSchema.Id);
            super.RegisterProperty(ItemSchema.ParentFolderId);
            super.RegisterProperty(ItemSchema.ItemClass);
            super.RegisterProperty(ItemSchema.Subject);
            super.RegisterProperty(ItemSchema.Sensitivity);
            super.RegisterProperty(ItemSchema.Body);
            super.RegisterProperty(ItemSchema.Attachments);
            super.RegisterProperty(ItemSchema.DateTimeReceived);
            super.RegisterProperty(ItemSchema.Size);
            super.RegisterProperty(ItemSchema.Categories);
            super.RegisterProperty(ItemSchema.Importance);
            super.RegisterProperty(ItemSchema.InReplyTo);
            super.RegisterProperty(ItemSchema.IsSubmitted);
            super.RegisterProperty(ItemSchema.IsDraft);
            super.RegisterProperty(ItemSchema.IsFromMe);
            super.RegisterProperty(ItemSchema.IsResend);
            super.RegisterProperty(ItemSchema.IsUnmodified);
            super.RegisterProperty(ItemSchema.InternetMessageHeaders);
            super.RegisterProperty(ItemSchema.DateTimeSent);
            super.RegisterProperty(ItemSchema.DateTimeCreated);
            super.RegisterProperty(ItemSchema.AllowedResponseActions);
            super.RegisterProperty(ItemSchema.ReminderDueBy);
            super.RegisterProperty(ItemSchema.IsReminderSet);
            super.RegisterProperty(ItemSchema.ReminderMinutesBeforeStart);
            super.RegisterProperty(ItemSchema.DisplayCc);
            super.RegisterProperty(ItemSchema.DisplayTo);
            super.RegisterProperty(ItemSchema.HasAttachments);
            super.RegisterProperty(ServiceObjectSchema.ExtendedProperties);
            super.RegisterProperty(ItemSchema.Culture);
            super.RegisterProperty(ItemSchema.EffectiveRights);
            super.RegisterProperty(ItemSchema.LastModifiedName);
            super.RegisterProperty(ItemSchema.LastModifiedTime);
            super.RegisterProperty(ItemSchema.IsAssociated);
            super.RegisterProperty(ItemSchema.WebClientReadFormQueryString);
            super.RegisterProperty(ItemSchema.WebClientEditFormQueryString);
            super.RegisterProperty(ItemSchema.ConversationId);
            super.RegisterProperty(ItemSchema.UniqueBody);
            super.RegisterProperty(ItemSchema.Flag);
            super.RegisterProperty(ItemSchema.StoreEntryId);
            super.RegisterProperty(ItemSchema.InstanceKey);
            super.RegisterProperty(ItemSchema.NormalizedBody);
            super.RegisterProperty(ItemSchema.EntityExtractionResult);
            super.RegisterProperty(ItemSchema.PolicyTag);
            super.RegisterProperty(ItemSchema.ArchiveTag);
            super.RegisterProperty(ItemSchema.RetentionDate);
            super.RegisterProperty(ItemSchema.Preview);
            super.RegisterProperty(ItemSchema.TextBody);
            super.RegisterProperty(ItemSchema.IconIndex);
        }
        constructor() {
            super();
        }
    }
    class ItemSchema_FieldUris {
        static ItemId: string = "item:ItemId";
        static ParentFolderId: string = "item:ParentFolderId";
        static ItemClass: string = "item:ItemClass";
        static MimeContent: string = "item:MimeContent";
        static Attachments: string = "item:Attachments";
        static Subject: string = "item:Subject";
        static DateTimeReceived: string = "item:DateTimeReceived";
        static Size: string = "item:Size";
        static Categories: string = "item:Categories";
        static HasAttachments: string = "item:HasAttachments";
        static Importance: string = "item:Importance";
        static InReplyTo: string = "item:InReplyTo";
        static InternetMessageHeaders: string = "item:InternetMessageHeaders";
        static IsAssociated: string = "item:IsAssociated";
        static IsDraft: string = "item:IsDraft";
        static IsFromMe: string = "item:IsFromMe";
        static IsResend: string = "item:IsResend";
        static IsSubmitted: string = "item:IsSubmitted";
        static IsUnmodified: string = "item:IsUnmodified";
        static DateTimeSent: string = "item:DateTimeSent";
        static DateTimeCreated: string = "item:DateTimeCreated";
        static Body: string = "item:Body";
        static ResponseObjects: string = "item:ResponseObjects";
        static Sensitivity: string = "item:Sensitivity";
        static ReminderDueBy: string = "item:ReminderDueBy";
        static ReminderIsSet: string = "item:ReminderIsSet";
        static ReminderMinutesBeforeStart: string = "item:ReminderMinutesBeforeStart";
        static DisplayTo: string = "item:DisplayTo";
        static DisplayCc: string = "item:DisplayCc";
        static Culture: string = "item:Culture";
        static EffectiveRights: string = "item:EffectiveRights";
        static LastModifiedName: string = "item:LastModifiedName";
        static LastModifiedTime: string = "item:LastModifiedTime";
        static WebClientReadFormQueryString: string = "item:WebClientReadFormQueryString";
        static WebClientEditFormQueryString: string = "item:WebClientEditFormQueryString";
        static ConversationId: string = "item:ConversationId";
        static UniqueBody: string = "item:UniqueBody";
        static StoreEntryId: string = "item:StoreEntryId";
        static InstanceKey: string = "item:InstanceKey";
        static NormalizedBody: string = "item:NormalizedBody";
        static EntityExtractionResult: string = "item:EntityExtractionResult";
        static Flag: string = "item:Flag";
        static PolicyTag: string = "item:PolicyTag";
        static ArchiveTag: string = "item:ArchiveTag";
        static RetentionDate: string = "item:RetentionDate";
        static Preview: string = "item:Preview";
        static TextBody: string = "item:TextBody";
        static IconIndex: string = "item:IconIndex";
        constructor() {
            super();
        }
    }
    class ContainedPropertyDefinition<TComplexProperty> extends ComplexPropertyDefinition<TComplexProperty>
    {
        private containedXmlElementName: string = null;
        constructor(xmlElementName: string, uri: string, containedXmlElementName: string, flags: PropertyDefinitionFlags, version: ExchangeVersion, propertyCreationDelegate: () => TComplexProperty) {
            super(xmlElementName, uri, flags, version, propertyCreationDelegate);
            this.containedXmlElementName = containedXmlElementName;
        }
        InternalLoadFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            reader.ReadStartElement(XmlNamespace.Types, this.containedXmlElementName);
            super.InternalLoadFromXml(reader, propertyBag);
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, this.containedXmlElementName);
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var complexProperty: ComplexProperty = <ComplexProperty>propertyBag.get_Item(this);
            if (complexProperty !== null) {
                writer.WriteStartElement(XmlNamespace.Types, this.XmlElementName);
                complexProperty.WriteToXml(writer, this.containedXmlElementName);
                writer.WriteEndElement();
            }
        }
    }
    class MeetingTimeZonePropertyDefinition extends PropertyDefinition {
        get Type(): Type {
            return new Type("MeetingTimeZone");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var meetingTimeZone: MeetingTimeZone = new MeetingTimeZone();
            meetingTimeZone.LoadFromXml(reader, this.XmlElementName);
            propertyBag.set_Item(AppointmentSchema.StartTimeZone, meetingTimeZone.ToTimeZoneInfo());
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
            if (jsonObject !== null) {
                var meetingTimeZone: MeetingTimeZone = new MeetingTimeZone();
                meetingTimeZone.LoadFromJson(jsonObject, service);
                propertyBag.set_Item(AppointmentSchema.StartTimeZone, meetingTimeZone.ToTimeZoneInfo());
            }
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var meetingTimeZone: MeetingTimeZone = <MeetingTimeZone>propertyBag.get_Item(this);
            if (meetingTimeZone !== null) {
                meetingTimeZone.WriteToXml(writer, this.XmlElementName);
            }
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            var meetingTimeZone: MeetingTimeZone = ((propertyBag.get_Item(this) instanceof MeetingTimeZone) ? <MeetingTimeZone>propertyBag.get_Item(this) : null);
            if (meetingTimeZone !== null) {
                jsonObject.Add(this.XmlElementName, meetingTimeZone.InternalToJson(service));
            }
        }
    }
    class RecurrencePropertyDefinition extends PropertyDefinition {
        get Type(): Type {
            return new Type("Recurrence");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "Recurrence");
            reader.Read(1);
            var recurrenceFromString: Recurrence = RecurrencePropertyDefinition.GetRecurrenceFromString(reader.LocalName);
            recurrenceFromString.LoadFromXml(reader, reader.LocalName);
            reader.Read(1);
            var recurrenceRange: RecurrenceRange = RecurrencePropertyDefinition.GetRecurrenceRange(reader.LocalName);
            recurrenceRange.LoadFromXml(reader, reader.LocalName);
            recurrenceRange.SetupRecurrence(recurrenceFromString);
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, "Recurrence");
            propertyBag.set_Item(this, recurrenceFromString);
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
            var jsonObject2: JsonObject = jsonObject.ReadAsJsonObject("RecurrencePattern");
            var recurrenceFromString: Recurrence = RecurrencePropertyDefinition.GetRecurrenceFromString(jsonObject2.ReadTypeString());
            recurrenceFromString.LoadFromJson(jsonObject2, service);
            var jsonObject3: JsonObject = jsonObject.ReadAsJsonObject("RecurrenceRange");
            var recurrenceRange: RecurrenceRange = RecurrencePropertyDefinition.GetRecurrenceRange(jsonObject3.ReadTypeString());
            recurrenceRange.LoadFromJson(jsonObject3, service);
            recurrenceRange.SetupRecurrence(recurrenceFromString);
            propertyBag.set_Item(this, recurrenceFromString);
        }
        private static GetRecurrenceRange(recurrenceRangeString: string): RecurrenceRange {
            var IL_46: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        if (recurrenceRangeString !== null) {
                            var result: RecurrenceRange;
                            if (!(recurrenceRangeString === "NoEndRecurrence")) {
                                if (!(recurrenceRangeString === "EndDateRecurrence")) {
                                    if (!(recurrenceRangeString === "NumberedRecurrence")) {
                                        _goto = IL_46;
                                        continue _GOTO_LOOP;
                                    }
                                    result = new NumberedRecurrenceRange();
                                }
                                else {
                                    result = new EndDateRecurrenceRange();
                                }
                            }
                            else {
                                result = new NoEndRecurrenceRange();
                            }
                            return result;
                        }
                        _goto = IL_46;
                        continue _GOTO_LOOP;
                    case 1:
                        throw new ServiceXmlDeserializationException(NString.Format(Strings.InvalidRecurrenceRange, recurrenceRangeString));
                }
            }
        }
        private static GetRecurrenceFromString(recurranceString: string): Recurrence {
            var IL_131: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        if (recurranceString !== null) {
                            if (_PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x60018b5 - 1 === null)
                            {
                                var expr_1D: Dictionary<string, number> = new Dictionary<string, number>(10);
                                expr_1D.Add("RelativeYearlyRecurrence", 0);
                                expr_1D.Add("AbsoluteYearlyRecurrence", 1);
                                expr_1D.Add("RelativeMonthlyRecurrence", 2);
                                expr_1D.Add("AbsoluteMonthlyRecurrence", 3);
                                expr_1D.Add("DailyRecurrence", 4);
                                expr_1D.Add("DailyRegeneration", 5);
                                expr_1D.Add("WeeklyRecurrence", 6);
                                expr_1D.Add("WeeklyRegeneration", 7);
                                expr_1D.Add("MonthlyRegeneration", 8);
                                expr_1D.Add("YearlyRegeneration", 9);
                                _PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x60018b5 - 1 = expr_1D;
                            }
                            var num: number;
                            if ((() => {
                                var _p0 = [
                                    num
                                ];
                                var _r = _PrivateImplementationDetails_{70549B87-FCC0 - 4468 - A58C - F62EC848C70D}.$$method0x60018b5-1.TryGetValue(recurranceString, _p0);
                                num = _p0[0];
                                return _r;
                            })()) {
                                var result: Recurrence;
                                switch (num) {
                                    case 0:
                                        result = new Recurrence_RelativeYearlyPattern();
                                        break;
                                    case 1:
                                        result = new Recurrence_YearlyPattern();
                                        break;
                                    case 2:
                                        result = new Recurrence_RelativeMonthlyPattern();
                                        break;
                                    case 3:
                                        result = new Recurrence_MonthlyPattern();
                                        break;
                                    case 4:
                                        result = new Recurrence_DailyPattern();
                                        break;
                                    case 5:
                                        result = new Recurrence_DailyRegenerationPattern();
                                        break;
                                    case 6:
                                        result = new Recurrence_WeeklyPattern();
                                        break;
                                    case 7:
                                        result = new Recurrence_WeeklyRegenerationPattern();
                                        break;
                                    case 8:
                                        result = new Recurrence_MonthlyRegenerationPattern();
                                        break;
                                    case 9:
                                        result = new Recurrence_YearlyRegenerationPattern();
                                        break;
                                    default:
                                        _goto = IL_131;
                                        continue _GOTO_LOOP;
                                }
                                return result;
                            }
                        }
                        _goto = IL_131;
                        continue _GOTO_LOOP;
                    case 1:
                        throw new ServiceXmlDeserializationException(NString.Format(Strings.InvalidRecurrencePattern, recurranceString));
                }
            }
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var recurrence: Recurrence = <Recurrence>propertyBag.get_Item(this);
            if (recurrence !== null) {
                recurrence.WriteToXml(writer, "Recurrence");
            }
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            var recurrence: Recurrence = ((propertyBag.get_Item(this) instanceof Recurrence) ? <Recurrence>propertyBag.get_Item(this) : null);
            if (recurrence !== null) {
                jsonObject.Add(this.XmlElementName, recurrence.InternalToJson(service));
            }
        }
    }
    class TimeZonePropertyDefinition extends PropertyDefinition {
        get Type(): Type {
            return new Type("TimeZoneInfo");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        LoadPropertyValueFromXml(reader: EwsServiceXmlReader, propertyBag: PropertyBag): void {
            var timeZoneDefinition: TimeZoneDefinition = new TimeZoneDefinition();
            timeZoneDefinition.LoadFromXml(reader, this.XmlElementName);
            propertyBag.set_Item(this, timeZoneDefinition.ToTimeZoneInfo());
        }
        LoadPropertyValueFromJson(value: any, service: ExchangeService, propertyBag: PropertyBag): void {
            var timeZoneDefinition: TimeZoneDefinition = new TimeZoneDefinition();
            var jsonObject: JsonObject = ((value instanceof JsonObject) ? <JsonObject>value : null);
            if (jsonObject !== null) {
                timeZoneDefinition.LoadFromJson(jsonObject, service);
            }
            propertyBag.set_Item(this, timeZoneDefinition.ToTimeZoneInfo());
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var timeZoneInfo: TimeZoneInfo = <TimeZoneInfo>propertyBag.get_Item(this);
            if (timeZoneInfo !== null && (!writer.IsTimeZoneHeaderEmitted || timeZoneInfo !== writer.Service.TimeZone)) {
                var timeZoneDefinition: TimeZoneDefinition = new TimeZoneDefinition(timeZoneInfo);
                timeZoneDefinition.WriteToXml(writer, this.XmlElementName);
            }
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            var timeZoneInfo: TimeZoneInfo = ((propertyBag.get_Item(this) instanceof TimeZoneInfo) ? <TimeZoneInfo>propertyBag.get_Item(this) : null);
            if (timeZoneInfo !== null && timeZoneInfo !== service.TimeZone) {
                var timeZoneDefinition: TimeZoneDefinition = new TimeZoneDefinition(timeZoneInfo);
                jsonObject.Add(this.XmlElementName, timeZoneDefinition.InternalToJson(service));
            }
        }
    }
    class StartTimeZonePropertyDefinition extends TimeZonePropertyDefinition {
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        RegisterAssociatedInternalProperties(properties: List<PropertyDefinition>): void {
            super.RegisterAssociatedInternalProperties(properties);
            properties.Add(AppointmentSchema.MeetingTimeZone);
        }
        WritePropertyValueToXml(writer: EwsServiceXmlWriter, propertyBag: PropertyBag, isUpdateOperation: boolean): void {
            var obj: any = propertyBag.get_Item(this);
            if (obj !== null) {
                if (writer.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                    var exchangeService: ExchangeService = ((writer.Service instanceof ExchangeService) ? <ExchangeService>writer.Service : null);
                    if (exchangeService !== null && !exchangeService.Exchange2007CompatibilityMode) {
                        var meetingTimeZone: MeetingTimeZone = new MeetingTimeZone(<TimeZoneInfo>obj);
                        meetingTimeZone.WriteToXml(writer, "MeetingTimeZone");
                        return;
                    }
                }
                else {
                    super.WritePropertyValueToXml(writer, propertyBag, isUpdateOperation);
                }
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            if (writer.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) {
                AppointmentSchema.MeetingTimeZone.WriteToXml(writer);
                return;
            }
            super.WriteToXml(writer);
        }
        HasFlag(flag: PropertyDefinitionFlags, version: Nullable<ExchangeVersion>): boolean {
            if (version !== null && version.Value === ExchangeVersion.Exchange2007_SP1) {
                return AppointmentSchema.MeetingTimeZone.HasFlag(flag, version);
            }
            return super.HasFlag(flag, version);
        }
    }
    class TimeSpanPropertyDefinition extends GenericPropertyDefinition<TimeSpan>
    {
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        Parse(value: string): any {
            return EwsUtilities.XSDurationToTimeSpan(value);
        }
        ToString(value: any): string {
            return EwsUtilities.TimeSpanToXSDuration(<TimeSpan>value);
        }
        WriteJsonValue(jsonObject: JsonObject, propertyBag: PropertyBag, service: ExchangeService, isUpdateOperation: boolean): void {
            jsonObject.Add(this.XmlElementName, propertyBag.get_Item(this));
        }
    }
    class AppointmentSchema extends ItemSchema {
        static StartTimeZone: PropertyDefinition = new StartTimeZonePropertyDefinition("StartTimeZone", "calendar:StartTimeZone", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static EndTimeZone: PropertyDefinition = new TimeZonePropertyDefinition("EndTimeZone", "calendar:EndTimeZone", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010);
        static Start: PropertyDefinition = new ScopedDateTimePropertyDefinition("Start", "calendar:Start", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, (version: ExchangeVersion) => { return AppointmentSchema.StartTimeZone; });
        static End: PropertyDefinition = new ScopedDateTimePropertyDefinition("End", "calendar:End", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, (version: ExchangeVersion) => {
            if (version !== ExchangeVersion.Exchange2007_SP1) {
                return AppointmentSchema.EndTimeZone;
            }
            return AppointmentSchema.StartTimeZone;
        });
        static OriginalStart: PropertyDefinition = new DateTimePropertyDefinition("OriginalStart", "calendar:OriginalStart", ExchangeVersion.Exchange2007_SP1);
        static IsAllDayEvent: PropertyDefinition = new BoolPropertyDefinition("IsAllDayEvent", "calendar:IsAllDayEvent", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static LegacyFreeBusyStatus: PropertyDefinition = new GenericPropertyDefinition<LegacyFreeBusyStatus>("LegacyFreeBusyStatus", "calendar:LegacyFreeBusyStatus", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Location: PropertyDefinition = new StringPropertyDefinition("Location", "calendar:Location", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static When: PropertyDefinition = new StringPropertyDefinition("When", "calendar:When", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsMeeting: PropertyDefinition = new BoolPropertyDefinition("IsMeeting", "calendar:IsMeeting", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsCancelled: PropertyDefinition = new BoolPropertyDefinition("IsCancelled", "calendar:IsCancelled", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsRecurring: PropertyDefinition = new BoolPropertyDefinition("IsRecurring", "calendar:IsRecurring", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static MeetingRequestWasSent: PropertyDefinition = new BoolPropertyDefinition("MeetingRequestWasSent", "calendar:MeetingRequestWasSent", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsResponseRequested: PropertyDefinition = new BoolPropertyDefinition("IsResponseRequested", "calendar:IsResponseRequested", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static AppointmentType: PropertyDefinition = new GenericPropertyDefinition<AppointmentType>("CalendarItemType", "calendar:CalendarItemType", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static MyResponseType: PropertyDefinition = new GenericPropertyDefinition<MeetingResponseType>("MyResponseType", "calendar:MyResponseType", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Organizer: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("Organizer", "calendar:Organizer", "Mailbox", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddress(); });
        static RequiredAttendees: PropertyDefinition = new ComplexPropertyDefinition<AttendeeCollection>("RequiredAttendees", "calendar:RequiredAttendees", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new AttendeeCollection(); });
        static OptionalAttendees: PropertyDefinition = new ComplexPropertyDefinition<AttendeeCollection>("OptionalAttendees", "calendar:OptionalAttendees", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new AttendeeCollection(); });
        static Resources: PropertyDefinition = new ComplexPropertyDefinition<AttendeeCollection>("Resources", "calendar:Resources", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new AttendeeCollection(); });
        static ConflictingMeetingCount: PropertyDefinition = new IntPropertyDefinition("ConflictingMeetingCount", "calendar:ConflictingMeetingCount", ExchangeVersion.Exchange2007_SP1);
        static AdjacentMeetingCount: PropertyDefinition = new IntPropertyDefinition("AdjacentMeetingCount", "calendar:AdjacentMeetingCount", ExchangeVersion.Exchange2007_SP1);
        static ConflictingMeetings: PropertyDefinition = new ComplexPropertyDefinition<ItemCollection<Appointment>>("ConflictingMeetings", "calendar:ConflictingMeetings", ExchangeVersion.Exchange2007_SP1, () => { return new ItemCollection<Appointment>(); });
        static AdjacentMeetings: PropertyDefinition = new ComplexPropertyDefinition<ItemCollection<Appointment>>("AdjacentMeetings", "calendar:AdjacentMeetings", ExchangeVersion.Exchange2007_SP1, () => { return new ItemCollection<Appointment>(); });
        static Duration: PropertyDefinition = new TimeSpanPropertyDefinition("Duration", "calendar:Duration", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static TimeZone: PropertyDefinition = new StringPropertyDefinition("TimeZone", "calendar:TimeZone", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static AppointmentReplyTime: PropertyDefinition = new DateTimePropertyDefinition("AppointmentReplyTime", "calendar:AppointmentReplyTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static AppointmentSequenceNumber: PropertyDefinition = new IntPropertyDefinition("AppointmentSequenceNumber", "calendar:AppointmentSequenceNumber", ExchangeVersion.Exchange2007_SP1);
        static AppointmentState: PropertyDefinition = new IntPropertyDefinition("AppointmentState", "calendar:AppointmentState", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Recurrence: PropertyDefinition = new RecurrencePropertyDefinition("Recurrence", "calendar:Recurrence", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1);
        static FirstOccurrence: PropertyDefinition = new ComplexPropertyDefinition<OccurrenceInfo>("FirstOccurrence", "calendar:FirstOccurrence", ExchangeVersion.Exchange2007_SP1, () => { return new OccurrenceInfo(); });
        static LastOccurrence: PropertyDefinition = new ComplexPropertyDefinition<OccurrenceInfo>("LastOccurrence", "calendar:LastOccurrence", ExchangeVersion.Exchange2007_SP1, () => { return new OccurrenceInfo(); });
        static ModifiedOccurrences: PropertyDefinition = new ComplexPropertyDefinition<OccurrenceInfoCollection>("ModifiedOccurrences", "calendar:ModifiedOccurrences", ExchangeVersion.Exchange2007_SP1, () => { return new OccurrenceInfoCollection(); });
        static DeletedOccurrences: PropertyDefinition = new ComplexPropertyDefinition<DeletedOccurrenceInfoCollection>("DeletedOccurrences", "calendar:DeletedOccurrences", ExchangeVersion.Exchange2007_SP1, () => { return new DeletedOccurrenceInfoCollection(); });
        static MeetingTimeZone: PropertyDefinition = new MeetingTimeZonePropertyDefinition("MeetingTimeZone", "calendar:MeetingTimeZone", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1);
        static ConferenceType: PropertyDefinition = new IntPropertyDefinition("ConferenceType", "calendar:ConferenceType", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static AllowNewTimeProposal: PropertyDefinition = new BoolPropertyDefinition("AllowNewTimeProposal", "calendar:AllowNewTimeProposal", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsOnlineMeeting: PropertyDefinition = new BoolPropertyDefinition("IsOnlineMeeting", "calendar:IsOnlineMeeting", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static MeetingWorkspaceUrl: PropertyDefinition = new StringPropertyDefinition("MeetingWorkspaceUrl", "calendar:MeetingWorkspaceUrl", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static NetShowUrl: PropertyDefinition = new StringPropertyDefinition("NetShowUrl", "calendar:NetShowUrl", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ICalUid: PropertyDefinition = new StringPropertyDefinition("UID", "calendar:UID", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ICalRecurrenceId: PropertyDefinition = new DateTimePropertyDefinition("RecurrenceId", "calendar:RecurrenceId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static ICalDateTimeStamp: PropertyDefinition = new DateTimePropertyDefinition("DateTimeStamp", "calendar:DateTimeStamp", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static EnhancedLocation: PropertyDefinition = new ComplexPropertyDefinition<EnhancedLocation>("EnhancedLocation", "calendar:EnhancedLocation", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new EnhancedLocation(); });
        static JoinOnlineMeetingUrl: PropertyDefinition = new StringPropertyDefinition("JoinOnlineMeetingUrl", "calendar:JoinOnlineMeetingUrl", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static OnlineMeetingSettings: PropertyDefinition = new ComplexPropertyDefinition<OnlineMeetingSettings>("OnlineMeetingSettings", "calendar:OnlineMeetingSettings", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new OnlineMeetingSettings(); });
        static Instance: AppointmentSchema = new AppointmentSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(AppointmentSchema.ICalUid);
            super.RegisterProperty(AppointmentSchema.ICalRecurrenceId);
            super.RegisterProperty(AppointmentSchema.ICalDateTimeStamp);
            super.RegisterProperty(AppointmentSchema.Start);
            super.RegisterProperty(AppointmentSchema.End);
            super.RegisterProperty(AppointmentSchema.OriginalStart);
            super.RegisterProperty(AppointmentSchema.IsAllDayEvent);
            super.RegisterProperty(AppointmentSchema.LegacyFreeBusyStatus);
            super.RegisterProperty(AppointmentSchema.Location);
            super.RegisterProperty(AppointmentSchema.When);
            super.RegisterProperty(AppointmentSchema.IsMeeting);
            super.RegisterProperty(AppointmentSchema.IsCancelled);
            super.RegisterProperty(AppointmentSchema.IsRecurring);
            super.RegisterProperty(AppointmentSchema.MeetingRequestWasSent);
            super.RegisterProperty(AppointmentSchema.IsResponseRequested);
            super.RegisterProperty(AppointmentSchema.AppointmentType);
            super.RegisterProperty(AppointmentSchema.MyResponseType);
            super.RegisterProperty(AppointmentSchema.Organizer);
            super.RegisterProperty(AppointmentSchema.RequiredAttendees);
            super.RegisterProperty(AppointmentSchema.OptionalAttendees);
            super.RegisterProperty(AppointmentSchema.Resources);
            super.RegisterProperty(AppointmentSchema.ConflictingMeetingCount);
            super.RegisterProperty(AppointmentSchema.AdjacentMeetingCount);
            super.RegisterProperty(AppointmentSchema.ConflictingMeetings);
            super.RegisterProperty(AppointmentSchema.AdjacentMeetings);
            super.RegisterProperty(AppointmentSchema.Duration);
            super.RegisterProperty(AppointmentSchema.TimeZone);
            super.RegisterProperty(AppointmentSchema.AppointmentReplyTime);
            super.RegisterProperty(AppointmentSchema.AppointmentSequenceNumber);
            super.RegisterProperty(AppointmentSchema.AppointmentState);
            super.RegisterProperty(AppointmentSchema.Recurrence);
            super.RegisterProperty(AppointmentSchema.FirstOccurrence);
            super.RegisterProperty(AppointmentSchema.LastOccurrence);
            super.RegisterProperty(AppointmentSchema.ModifiedOccurrences);
            super.RegisterProperty(AppointmentSchema.DeletedOccurrences);
            super.RegisterInternalProperty(AppointmentSchema.MeetingTimeZone);
            super.RegisterProperty(AppointmentSchema.StartTimeZone);
            super.RegisterProperty(AppointmentSchema.EndTimeZone);
            super.RegisterProperty(AppointmentSchema.ConferenceType);
            super.RegisterProperty(AppointmentSchema.AllowNewTimeProposal);
            super.RegisterProperty(AppointmentSchema.IsOnlineMeeting);
            super.RegisterProperty(AppointmentSchema.MeetingWorkspaceUrl);
            super.RegisterProperty(AppointmentSchema.NetShowUrl);
            super.RegisterProperty(AppointmentSchema.EnhancedLocation);
            super.RegisterProperty(AppointmentSchema.JoinOnlineMeetingUrl);
            super.RegisterProperty(AppointmentSchema.OnlineMeetingSettings);
        }
        constructor() {
            super();
        }
    }
    class AppointmentSchema_FieldUris {
        static Start: string = "calendar:Start";
        static End: string = "calendar:End";
        static OriginalStart: string = "calendar:OriginalStart";
        static IsAllDayEvent: string = "calendar:IsAllDayEvent";
        static LegacyFreeBusyStatus: string = "calendar:LegacyFreeBusyStatus";
        static Location: string = "calendar:Location";
        static When: string = "calendar:When";
        static IsMeeting: string = "calendar:IsMeeting";
        static IsCancelled: string = "calendar:IsCancelled";
        static IsRecurring: string = "calendar:IsRecurring";
        static MeetingRequestWasSent: string = "calendar:MeetingRequestWasSent";
        static IsResponseRequested: string = "calendar:IsResponseRequested";
        static CalendarItemType: string = "calendar:CalendarItemType";
        static MyResponseType: string = "calendar:MyResponseType";
        static Organizer: string = "calendar:Organizer";
        static RequiredAttendees: string = "calendar:RequiredAttendees";
        static OptionalAttendees: string = "calendar:OptionalAttendees";
        static Resources: string = "calendar:Resources";
        static ConflictingMeetingCount: string = "calendar:ConflictingMeetingCount";
        static AdjacentMeetingCount: string = "calendar:AdjacentMeetingCount";
        static ConflictingMeetings: string = "calendar:ConflictingMeetings";
        static AdjacentMeetings: string = "calendar:AdjacentMeetings";
        static Duration: string = "calendar:Duration";
        static TimeZone: string = "calendar:TimeZone";
        static AppointmentReplyTime: string = "calendar:AppointmentReplyTime";
        static AppointmentSequenceNumber: string = "calendar:AppointmentSequenceNumber";
        static AppointmentState: string = "calendar:AppointmentState";
        static Recurrence: string = "calendar:Recurrence";
        static FirstOccurrence: string = "calendar:FirstOccurrence";
        static LastOccurrence: string = "calendar:LastOccurrence";
        static ModifiedOccurrences: string = "calendar:ModifiedOccurrences";
        static DeletedOccurrences: string = "calendar:DeletedOccurrences";
        static MeetingTimeZone: string = "calendar:MeetingTimeZone";
        static StartTimeZone: string = "calendar:StartTimeZone";
        static EndTimeZone: string = "calendar:EndTimeZone";
        static ConferenceType: string = "calendar:ConferenceType";
        static AllowNewTimeProposal: string = "calendar:AllowNewTimeProposal";
        static IsOnlineMeeting: string = "calendar:IsOnlineMeeting";
        static MeetingWorkspaceUrl: string = "calendar:MeetingWorkspaceUrl";
        static NetShowUrl: string = "calendar:NetShowUrl";
        static Uid: string = "calendar:UID";
        static RecurrenceId: string = "calendar:RecurrenceId";
        static DateTimeStamp: string = "calendar:DateTimeStamp";
        static EnhancedLocation: string = "calendar:EnhancedLocation";
        static JoinOnlineMeetingUrl: string = "calendar:JoinOnlineMeetingUrl";
        static OnlineMeetingSettings: string = "calendar:OnlineMeetingSettings";
        constructor() {
            super();
        }
    }
    class CalendarResponseObjectSchema extends ServiceObjectSchema {
        static Instance: CalendarResponseObjectSchema = new CalendarResponseObjectSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ItemSchema.ItemClass);
            super.RegisterProperty(ItemSchema.Sensitivity);
            super.RegisterProperty(ItemSchema.Body);
            super.RegisterProperty(ItemSchema.Attachments);
            super.RegisterProperty(ItemSchema.InternetMessageHeaders);
            super.RegisterProperty(EmailMessageSchema.Sender);
            super.RegisterProperty(EmailMessageSchema.ToRecipients);
            super.RegisterProperty(EmailMessageSchema.CcRecipients);
            super.RegisterProperty(EmailMessageSchema.BccRecipients);
            super.RegisterProperty(EmailMessageSchema.IsReadReceiptRequested);
            super.RegisterProperty(EmailMessageSchema.IsDeliveryReceiptRequested);
            super.RegisterProperty(ResponseObjectSchema.ReferenceItemId);
        }
        constructor() {
            super();
        }
    }
    class CancelMeetingMessageSchema extends ServiceObjectSchema {
        static Body: PropertyDefinition = new ComplexPropertyDefinition<MessageBody>("NewBodyContent", PropertyDefinitionFlags.CanSet, ExchangeVersion.Exchange2007_SP1, () => { return new MessageBody(); });
        static Instance: CancelMeetingMessageSchema = new CancelMeetingMessageSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(EmailMessageSchema.IsReadReceiptRequested);
            super.RegisterProperty(EmailMessageSchema.IsDeliveryReceiptRequested);
            super.RegisterProperty(ResponseObjectSchema.ReferenceItemId);
            super.RegisterProperty(CancelMeetingMessageSchema.Body);
        }
        constructor() {
            super();
        }
    }
    class ConversationSchema extends ServiceObjectSchema {
        static Id: PropertyDefinition = new ComplexPropertyDefinition<ConversationId>("ConversationId", "conversation:ConversationId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new ConversationId(); });
        static Topic: PropertyDefinition = new StringPropertyDefinition("ConversationTopic", "conversation:ConversationTopic", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static UniqueRecipients: PropertyDefinition = new ComplexPropertyDefinition<StringList>("UniqueRecipients", "conversation:UniqueRecipients", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static GlobalUniqueRecipients: PropertyDefinition = new ComplexPropertyDefinition<StringList>("GlobalUniqueRecipients", "conversation:GlobalUniqueRecipients", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static UniqueUnreadSenders: PropertyDefinition = new ComplexPropertyDefinition<StringList>("UniqueUnreadSenders", "conversation:UniqueUnreadSenders", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static GlobalUniqueUnreadSenders: PropertyDefinition = new ComplexPropertyDefinition<StringList>("GlobalUniqueUnreadSenders", "conversation:GlobalUniqueUnreadSenders", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static UniqueSenders: PropertyDefinition = new ComplexPropertyDefinition<StringList>("UniqueSenders", "conversation:UniqueSenders", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static GlobalUniqueSenders: PropertyDefinition = new ComplexPropertyDefinition<StringList>("GlobalUniqueSenders", "conversation:GlobalUniqueSenders", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static LastDeliveryTime: PropertyDefinition = new DateTimePropertyDefinition("LastDeliveryTime", "conversation:LastDeliveryTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalLastDeliveryTime: PropertyDefinition = new DateTimePropertyDefinition("GlobalLastDeliveryTime", "conversation:GlobalLastDeliveryTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static Categories: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Categories", "conversation:Categories", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static GlobalCategories: PropertyDefinition = new ComplexPropertyDefinition<StringList>("GlobalCategories", "conversation:GlobalCategories", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList(); });
        static FlagStatus: PropertyDefinition = new GenericPropertyDefinition<ConversationFlagStatus>("FlagStatus", "conversation:FlagStatus", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalFlagStatus: PropertyDefinition = new GenericPropertyDefinition<ConversationFlagStatus>("GlobalFlagStatus", "conversation:GlobalFlagStatus", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static HasAttachments: PropertyDefinition = new BoolPropertyDefinition("HasAttachments", "conversation:HasAttachments", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalHasAttachments: PropertyDefinition = new BoolPropertyDefinition("GlobalHasAttachments", "conversation:GlobalHasAttachments", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static MessageCount: PropertyDefinition = new IntPropertyDefinition("MessageCount", "conversation:MessageCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalMessageCount: PropertyDefinition = new IntPropertyDefinition("GlobalMessageCount", "conversation:GlobalMessageCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static UnreadCount: PropertyDefinition = new IntPropertyDefinition("UnreadCount", "conversation:UnreadCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalUnreadCount: PropertyDefinition = new IntPropertyDefinition("GlobalUnreadCount", "conversation:GlobalUnreadCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static Size: PropertyDefinition = new IntPropertyDefinition("Size", "conversation:Size", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalSize: PropertyDefinition = new IntPropertyDefinition("GlobalSize", "conversation:GlobalSize", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static ItemClasses: PropertyDefinition = new ComplexPropertyDefinition<StringList>("ItemClasses", "conversation:ItemClasses", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList("ItemClass"); });
        static GlobalItemClasses: PropertyDefinition = new ComplexPropertyDefinition<StringList>("GlobalItemClasses", "conversation:GlobalItemClasses", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new StringList("ItemClass"); });
        static Importance: PropertyDefinition = new GenericPropertyDefinition<Importance>("Importance", "conversation:Importance", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static GlobalImportance: PropertyDefinition = new GenericPropertyDefinition<Importance>("GlobalImportance", "conversation:GlobalImportance", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static ItemIds: PropertyDefinition = new ComplexPropertyDefinition<ItemIdCollection>("ItemIds", "conversation:ItemIds", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new ItemIdCollection(); });
        static GlobalItemIds: PropertyDefinition = new ComplexPropertyDefinition<ItemIdCollection>("GlobalItemIds", "conversation:GlobalItemIds", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new ItemIdCollection(); });
        static LastModifiedTime: PropertyDefinition = new DateTimePropertyDefinition("LastModifiedTime", "conversation:LastModifiedTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static InstanceKey: PropertyDefinition = new ByteArrayPropertyDefinition("InstanceKey", "conversation:InstanceKey", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static Preview: PropertyDefinition = new StringPropertyDefinition("Preview", "conversation:Preview", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static IconIndex: PropertyDefinition = new GenericPropertyDefinition<IconIndex>("IconIndex", "conversation:IconIndex", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static GlobalIconIndex: PropertyDefinition = new GenericPropertyDefinition<IconIndex>("GlobalIconIndex", "conversation:GlobalIconIndex", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static DraftItemIds: PropertyDefinition = new ComplexPropertyDefinition<ItemIdCollection>("DraftItemIds", "conversation:DraftItemIds", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new ItemIdCollection(); });
        static HasIrm: PropertyDefinition = new BoolPropertyDefinition("HasIrm", "conversation:HasIrm", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static GlobalHasIrm: PropertyDefinition = new BoolPropertyDefinition("GlobalHasIrm", "conversation:GlobalHasIrm", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static Instance: ConversationSchema = new ConversationSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ConversationSchema.Id);
            super.RegisterProperty(ConversationSchema.Topic);
            super.RegisterProperty(ConversationSchema.UniqueRecipients);
            super.RegisterProperty(ConversationSchema.GlobalUniqueRecipients);
            super.RegisterProperty(ConversationSchema.UniqueUnreadSenders);
            super.RegisterProperty(ConversationSchema.GlobalUniqueUnreadSenders);
            super.RegisterProperty(ConversationSchema.UniqueSenders);
            super.RegisterProperty(ConversationSchema.GlobalUniqueSenders);
            super.RegisterProperty(ConversationSchema.LastDeliveryTime);
            super.RegisterProperty(ConversationSchema.GlobalLastDeliveryTime);
            super.RegisterProperty(ConversationSchema.Categories);
            super.RegisterProperty(ConversationSchema.GlobalCategories);
            super.RegisterProperty(ConversationSchema.FlagStatus);
            super.RegisterProperty(ConversationSchema.GlobalFlagStatus);
            super.RegisterProperty(ConversationSchema.HasAttachments);
            super.RegisterProperty(ConversationSchema.GlobalHasAttachments);
            super.RegisterProperty(ConversationSchema.MessageCount);
            super.RegisterProperty(ConversationSchema.GlobalMessageCount);
            super.RegisterProperty(ConversationSchema.UnreadCount);
            super.RegisterProperty(ConversationSchema.GlobalUnreadCount);
            super.RegisterProperty(ConversationSchema.Size);
            super.RegisterProperty(ConversationSchema.GlobalSize);
            super.RegisterProperty(ConversationSchema.ItemClasses);
            super.RegisterProperty(ConversationSchema.GlobalItemClasses);
            super.RegisterProperty(ConversationSchema.Importance);
            super.RegisterProperty(ConversationSchema.GlobalImportance);
            super.RegisterProperty(ConversationSchema.ItemIds);
            super.RegisterProperty(ConversationSchema.GlobalItemIds);
            super.RegisterProperty(ConversationSchema.LastModifiedTime);
            super.RegisterProperty(ConversationSchema.InstanceKey);
            super.RegisterProperty(ConversationSchema.Preview);
            super.RegisterProperty(ConversationSchema.IconIndex);
            super.RegisterProperty(ConversationSchema.GlobalIconIndex);
            super.RegisterProperty(ConversationSchema.DraftItemIds);
            super.RegisterProperty(ConversationSchema.HasIrm);
            super.RegisterProperty(ConversationSchema.GlobalHasIrm);
        }
        constructor() {
            super();
        }
    }
    class ConversationSchema_FieldUris {
        static ConversationId: string = "conversation:ConversationId";
        static ConversationTopic: string = "conversation:ConversationTopic";
        static UniqueRecipients: string = "conversation:UniqueRecipients";
        static GlobalUniqueRecipients: string = "conversation:GlobalUniqueRecipients";
        static UniqueUnreadSenders: string = "conversation:UniqueUnreadSenders";
        static GlobalUniqueUnreadSenders: string = "conversation:GlobalUniqueUnreadSenders";
        static UniqueSenders: string = "conversation:UniqueSenders";
        static GlobalUniqueSenders: string = "conversation:GlobalUniqueSenders";
        static LastDeliveryTime: string = "conversation:LastDeliveryTime";
        static GlobalLastDeliveryTime: string = "conversation:GlobalLastDeliveryTime";
        static Categories: string = "conversation:Categories";
        static GlobalCategories: string = "conversation:GlobalCategories";
        static FlagStatus: string = "conversation:FlagStatus";
        static GlobalFlagStatus: string = "conversation:GlobalFlagStatus";
        static HasAttachments: string = "conversation:HasAttachments";
        static GlobalHasAttachments: string = "conversation:GlobalHasAttachments";
        static MessageCount: string = "conversation:MessageCount";
        static GlobalMessageCount: string = "conversation:GlobalMessageCount";
        static UnreadCount: string = "conversation:UnreadCount";
        static GlobalUnreadCount: string = "conversation:GlobalUnreadCount";
        static Size: string = "conversation:Size";
        static GlobalSize: string = "conversation:GlobalSize";
        static ItemClasses: string = "conversation:ItemClasses";
        static GlobalItemClasses: string = "conversation:GlobalItemClasses";
        static Importance: string = "conversation:Importance";
        static GlobalImportance: string = "conversation:GlobalImportance";
        static ItemIds: string = "conversation:ItemIds";
        static GlobalItemIds: string = "conversation:GlobalItemIds";
        static LastModifiedTime: string = "conversation:LastModifiedTime";
        static InstanceKey: string = "conversation:InstanceKey";
        static Preview: string = "conversation:Preview";
        static IconIndex: string = "conversation:IconIndex";
        static GlobalIconIndex: string = "conversation:GlobalIconIndex";
        static DraftItemIds: string = "conversation:DraftItemIds";
        static HasIrm: string = "conversation:HasIrm";
        static GlobalHasIrm: string = "conversation:GlobalHasIrm";
        constructor() {
            super();
        }
    }
    class ContactGroupSchema extends ItemSchema {
        static DisplayName: PropertyDefinition = ContactSchema.DisplayName;
        static FileAs: PropertyDefinition = ContactSchema.FileAs;
        static Members: PropertyDefinition = new ComplexPropertyDefinition<GroupMemberCollection>("Members", "distributionlist:Members", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2010, () => { return new GroupMemberCollection(); });
        static Instance: ContactGroupSchema = new ContactGroupSchema();
        constructor() {
            super();
        }
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ContactGroupSchema.DisplayName);
            super.RegisterProperty(ContactGroupSchema.FileAs);
            super.RegisterProperty(ContactGroupSchema.Members);
        }
    }
    class ContactGroupSchema_FieldUris {
        static Members: string = "distributionlist:Members";
        constructor() {
            super();
        }
    }
    class IndexedPropertyDefinition extends ServiceObjectPropertyDefinition {
        private index: string = null;
        get Index(): string {
            return this.index;
        }
        get Type(): Type {
            return new Type("String");
        }
        constructor(uri: string, index: string) {
            super(uri);
            this.index = index;
        }
        static IsEqualTo(idxPropDef1: IndexedPropertyDefinition, idxPropDef2: IndexedPropertyDefinition): boolean {
            return NObject.ReferenceEquals(idxPropDef1, idxPropDef2) || (IndexedPropertyDefinition.op_Inequality(idxPropDef1, null) && IndexedPropertyDefinition.op_Inequality(idxPropDef2, null) && idxPropDef1.Uri === idxPropDef2.Uri && idxPropDef1.Index === idxPropDef2.Index);
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("FieldIndex", this.Index);
        }
        AddJsonProperties(jsonPropertyDefinition: JsonObject, service: ExchangeService): void {
            super.AddJsonProperties(jsonPropertyDefinition, service);
            jsonPropertyDefinition.Add("FieldIndex", this.Index);
        }
        GetXmlElementName(): string {
            return "IndexedFieldURI";
        }
        GetJsonType(): string {
            return "DictionaryPropertyUri";
        }
        GetPrintableName(): string {
            return NString.Format("{0}:{1}", this.Uri, this.Index);
        }
        static op_Equality(idxPropDef1: IndexedPropertyDefinition, idxPropDef2: IndexedPropertyDefinition): boolean {
            return IndexedPropertyDefinition.IsEqualTo(idxPropDef1, idxPropDef2);
        }
        static op_Inequality(idxPropDef1: IndexedPropertyDefinition, idxPropDef2: IndexedPropertyDefinition): boolean {
            return !IndexedPropertyDefinition.IsEqualTo(idxPropDef1, idxPropDef2);
        }
        Equals(obj: any): boolean {
            var idxPropDef: IndexedPropertyDefinition = ((obj instanceof IndexedPropertyDefinition) ? <IndexedPropertyDefinition>obj : null);
            return IndexedPropertyDefinition.IsEqualTo(idxPropDef, this);
        }
        GetHashCode(): number {
            return NString.GetHashCode(this.Uri) ^ NString.GetHashCode(this.Index);
        }
    }
    class ContactSchema extends ItemSchema {
        static FileAs: PropertyDefinition = new StringPropertyDefinition("FileAs", "contacts:FileAs", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static FileAsMapping: PropertyDefinition = new GenericPropertyDefinition<FileAsMapping>("FileAsMapping", "contacts:FileAsMapping", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DisplayName: PropertyDefinition = new StringPropertyDefinition("DisplayName", "contacts:DisplayName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static GivenName: PropertyDefinition = new StringPropertyDefinition("GivenName", "contacts:GivenName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Initials: PropertyDefinition = new StringPropertyDefinition("Initials", "contacts:Initials", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static MiddleName: PropertyDefinition = new StringPropertyDefinition("MiddleName", "contacts:MiddleName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static NickName: PropertyDefinition = new StringPropertyDefinition("Nickname", "contacts:Nickname", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static CompleteName: PropertyDefinition = new ComplexPropertyDefinition<CompleteName>("CompleteName", "contacts:CompleteName", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new CompleteName(); });
        static CompanyName: PropertyDefinition = new StringPropertyDefinition("CompanyName", "contacts:CompanyName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static EmailAddresses: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressDictionary>("EmailAddresses", "contacts:EmailAddresses", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddressDictionary(); });
        static PhysicalAddresses: PropertyDefinition = new ComplexPropertyDefinition<PhysicalAddressDictionary>("PhysicalAddresses", "contacts:PhysicalAddresses", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new PhysicalAddressDictionary(); });
        static PhoneNumbers: PropertyDefinition = new ComplexPropertyDefinition<PhoneNumberDictionary>("PhoneNumbers", "contacts:PhoneNumbers", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new PhoneNumberDictionary(); });
        static AssistantName: PropertyDefinition = new StringPropertyDefinition("AssistantName", "contacts:AssistantName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Birthday: PropertyDefinition = new DateTimePropertyDefinition("Birthday", "contacts:Birthday", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static BusinessHomePage: PropertyDefinition = new StringPropertyDefinition("BusinessHomePage", "contacts:BusinessHomePage", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Children: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Children", "contacts:Children", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new StringList(); });
        static Companies: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Companies", "contacts:Companies", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new StringList(); });
        static ContactSource: PropertyDefinition = new GenericPropertyDefinition<ContactSource>("ContactSource", "contacts:ContactSource", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Department: PropertyDefinition = new StringPropertyDefinition("Department", "contacts:Department", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Generation: PropertyDefinition = new StringPropertyDefinition("Generation", "contacts:Generation", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ImAddresses: PropertyDefinition = new ComplexPropertyDefinition<ImAddressDictionary>("ImAddresses", "contacts:ImAddresses", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new ImAddressDictionary(); });
        static JobTitle: PropertyDefinition = new StringPropertyDefinition("JobTitle", "contacts:JobTitle", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Manager: PropertyDefinition = new StringPropertyDefinition("Manager", "contacts:Manager", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Mileage: PropertyDefinition = new StringPropertyDefinition("Mileage", "contacts:Mileage", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static OfficeLocation: PropertyDefinition = new StringPropertyDefinition("OfficeLocation", "contacts:OfficeLocation", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static PostalAddressIndex: PropertyDefinition = new GenericPropertyDefinition<PhysicalAddressIndex>("PostalAddressIndex", "contacts:PostalAddressIndex", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Profession: PropertyDefinition = new StringPropertyDefinition("Profession", "contacts:Profession", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static SpouseName: PropertyDefinition = new StringPropertyDefinition("SpouseName", "contacts:SpouseName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Surname: PropertyDefinition = new StringPropertyDefinition("Surname", "contacts:Surname", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static WeddingAnniversary: PropertyDefinition = new DateTimePropertyDefinition("WeddingAnniversary", "contacts:WeddingAnniversary", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static HasPicture: PropertyDefinition = new BoolPropertyDefinition("HasPicture", "contacts:HasPicture", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010);
        static PhoneticFullName: PropertyDefinition = new StringPropertyDefinition("PhoneticFullName", "contacts:PhoneticFullName", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static PhoneticFirstName: PropertyDefinition = new StringPropertyDefinition("PhoneticFirstName", "contacts:PhoneticFirstName", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static PhoneticLastName: PropertyDefinition = new StringPropertyDefinition("PhoneticLastName", "contacts:PhoneticLastName", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static Alias: PropertyDefinition = new StringPropertyDefinition("Alias", "contacts:Alias", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static Notes: PropertyDefinition = new StringPropertyDefinition("Notes", "contacts:Notes", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static Photo: PropertyDefinition = new ByteArrayPropertyDefinition("Photo", "contacts:Photo", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static UserSMIMECertificate: PropertyDefinition = new ComplexPropertyDefinition<ByteArrayArray>("UserSMIMECertificate", "contacts:UserSMIMECertificate", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new ByteArrayArray(); });
        static MSExchangeCertificate: PropertyDefinition = new ComplexPropertyDefinition<ByteArrayArray>("MSExchangeCertificate", "contacts:MSExchangeCertificate", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new ByteArrayArray(); });
        static DirectoryId: PropertyDefinition = new StringPropertyDefinition("DirectoryId", "contacts:DirectoryId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1);
        static ManagerMailbox: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("ManagerMailbox", "contacts:ManagerMailbox", "Mailbox", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new EmailAddress(); });
        static DirectReports: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressCollection>("DirectReports", "contacts:DirectReports", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2010_SP1, () => { return new EmailAddressCollection(); });
        static EmailAddress1: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:EmailAddress", "EmailAddress1");
        static EmailAddress2: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:EmailAddress", "EmailAddress2");
        static EmailAddress3: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:EmailAddress", "EmailAddress3");
        static ImAddress1: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:ImAddress", "ImAddress1");
        static ImAddress2: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:ImAddress", "ImAddress2");
        static ImAddress3: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:ImAddress", "ImAddress3");
        static AssistantPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "AssistantPhone");
        static BusinessFax: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "BusinessFax");
        static BusinessPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "BusinessPhone");
        static BusinessPhone2: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "BusinessPhone2");
        static Callback: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "Callback");
        static CarPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "CarPhone");
        static CompanyMainPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "CompanyMainPhone");
        static HomeFax: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "HomeFax");
        static HomePhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "HomePhone");
        static HomePhone2: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "HomePhone2");
        static Isdn: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "Isdn");
        static MobilePhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "MobilePhone");
        static OtherFax: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "OtherFax");
        static OtherTelephone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "OtherTelephone");
        static Pager: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "Pager");
        static PrimaryPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "PrimaryPhone");
        static RadioPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "RadioPhone");
        static Telex: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "Telex");
        static TtyTddPhone: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhoneNumber", "TtyTddPhone");
        static BusinessAddressStreet: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:Street", "Business");
        static BusinessAddressCity: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:City", "Business");
        static BusinessAddressState: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:State", "Business");
        static BusinessAddressCountryOrRegion: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:CountryOrRegion", "Business");
        static BusinessAddressPostalCode: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:PostalCode", "Business");
        static HomeAddressStreet: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:Street", "Home");
        static HomeAddressCity: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:City", "Home");
        static HomeAddressState: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:State", "Home");
        static HomeAddressCountryOrRegion: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:CountryOrRegion", "Home");
        static HomeAddressPostalCode: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:PostalCode", "Home");
        static OtherAddressStreet: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:Street", "Other");
        static OtherAddressCity: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:City", "Other");
        static OtherAddressState: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:State", "Other");
        static OtherAddressCountryOrRegion: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:CountryOrRegion", "Other");
        static OtherAddressPostalCode: IndexedPropertyDefinition = new IndexedPropertyDefinition("contacts:PhysicalAddress:PostalCode", "Other");
        static Instance: ContactSchema = new ContactSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ContactSchema.FileAs);
            super.RegisterProperty(ContactSchema.FileAsMapping);
            super.RegisterProperty(ContactSchema.DisplayName);
            super.RegisterProperty(ContactSchema.GivenName);
            super.RegisterProperty(ContactSchema.Initials);
            super.RegisterProperty(ContactSchema.MiddleName);
            super.RegisterProperty(ContactSchema.NickName);
            super.RegisterProperty(ContactSchema.CompleteName);
            super.RegisterProperty(ContactSchema.CompanyName);
            super.RegisterProperty(ContactSchema.EmailAddresses);
            super.RegisterProperty(ContactSchema.PhysicalAddresses);
            super.RegisterProperty(ContactSchema.PhoneNumbers);
            super.RegisterProperty(ContactSchema.AssistantName);
            super.RegisterProperty(ContactSchema.Birthday);
            super.RegisterProperty(ContactSchema.BusinessHomePage);
            super.RegisterProperty(ContactSchema.Children);
            super.RegisterProperty(ContactSchema.Companies);
            super.RegisterProperty(ContactSchema.ContactSource);
            super.RegisterProperty(ContactSchema.Department);
            super.RegisterProperty(ContactSchema.Generation);
            super.RegisterProperty(ContactSchema.ImAddresses);
            super.RegisterProperty(ContactSchema.JobTitle);
            super.RegisterProperty(ContactSchema.Manager);
            super.RegisterProperty(ContactSchema.Mileage);
            super.RegisterProperty(ContactSchema.OfficeLocation);
            super.RegisterProperty(ContactSchema.PostalAddressIndex);
            super.RegisterProperty(ContactSchema.Profession);
            super.RegisterProperty(ContactSchema.SpouseName);
            super.RegisterProperty(ContactSchema.Surname);
            super.RegisterProperty(ContactSchema.WeddingAnniversary);
            super.RegisterProperty(ContactSchema.HasPicture);
            super.RegisterProperty(ContactSchema.PhoneticFullName);
            super.RegisterProperty(ContactSchema.PhoneticFirstName);
            super.RegisterProperty(ContactSchema.PhoneticLastName);
            super.RegisterProperty(ContactSchema.Alias);
            super.RegisterProperty(ContactSchema.Notes);
            super.RegisterProperty(ContactSchema.Photo);
            super.RegisterProperty(ContactSchema.UserSMIMECertificate);
            super.RegisterProperty(ContactSchema.MSExchangeCertificate);
            super.RegisterProperty(ContactSchema.DirectoryId);
            super.RegisterProperty(ContactSchema.ManagerMailbox);
            super.RegisterProperty(ContactSchema.DirectReports);
            super.RegisterIndexedProperty(ContactSchema.EmailAddress1);
            super.RegisterIndexedProperty(ContactSchema.EmailAddress2);
            super.RegisterIndexedProperty(ContactSchema.EmailAddress3);
            super.RegisterIndexedProperty(ContactSchema.ImAddress1);
            super.RegisterIndexedProperty(ContactSchema.ImAddress2);
            super.RegisterIndexedProperty(ContactSchema.ImAddress3);
            super.RegisterIndexedProperty(ContactSchema.AssistantPhone);
            super.RegisterIndexedProperty(ContactSchema.BusinessFax);
            super.RegisterIndexedProperty(ContactSchema.BusinessPhone);
            super.RegisterIndexedProperty(ContactSchema.BusinessPhone2);
            super.RegisterIndexedProperty(ContactSchema.Callback);
            super.RegisterIndexedProperty(ContactSchema.CarPhone);
            super.RegisterIndexedProperty(ContactSchema.CompanyMainPhone);
            super.RegisterIndexedProperty(ContactSchema.HomeFax);
            super.RegisterIndexedProperty(ContactSchema.HomePhone);
            super.RegisterIndexedProperty(ContactSchema.HomePhone2);
            super.RegisterIndexedProperty(ContactSchema.Isdn);
            super.RegisterIndexedProperty(ContactSchema.MobilePhone);
            super.RegisterIndexedProperty(ContactSchema.OtherFax);
            super.RegisterIndexedProperty(ContactSchema.OtherTelephone);
            super.RegisterIndexedProperty(ContactSchema.Pager);
            super.RegisterIndexedProperty(ContactSchema.PrimaryPhone);
            super.RegisterIndexedProperty(ContactSchema.RadioPhone);
            super.RegisterIndexedProperty(ContactSchema.Telex);
            super.RegisterIndexedProperty(ContactSchema.TtyTddPhone);
            super.RegisterIndexedProperty(ContactSchema.BusinessAddressStreet);
            super.RegisterIndexedProperty(ContactSchema.BusinessAddressCity);
            super.RegisterIndexedProperty(ContactSchema.BusinessAddressState);
            super.RegisterIndexedProperty(ContactSchema.BusinessAddressCountryOrRegion);
            super.RegisterIndexedProperty(ContactSchema.BusinessAddressPostalCode);
            super.RegisterIndexedProperty(ContactSchema.HomeAddressStreet);
            super.RegisterIndexedProperty(ContactSchema.HomeAddressCity);
            super.RegisterIndexedProperty(ContactSchema.HomeAddressState);
            super.RegisterIndexedProperty(ContactSchema.HomeAddressCountryOrRegion);
            super.RegisterIndexedProperty(ContactSchema.HomeAddressPostalCode);
            super.RegisterIndexedProperty(ContactSchema.OtherAddressStreet);
            super.RegisterIndexedProperty(ContactSchema.OtherAddressCity);
            super.RegisterIndexedProperty(ContactSchema.OtherAddressState);
            super.RegisterIndexedProperty(ContactSchema.OtherAddressCountryOrRegion);
            super.RegisterIndexedProperty(ContactSchema.OtherAddressPostalCode);
        }
        constructor() {
            super();
        }
    }
    class ContactSchema_FieldUris {
        static FileAs: string = "contacts:FileAs";
        static FileAsMapping: string = "contacts:FileAsMapping";
        static DisplayName: string = "contacts:DisplayName";
        static GivenName: string = "contacts:GivenName";
        static Initials: string = "contacts:Initials";
        static MiddleName: string = "contacts:MiddleName";
        static NickName: string = "contacts:Nickname";
        static CompleteName: string = "contacts:CompleteName";
        static CompanyName: string = "contacts:CompanyName";
        static EmailAddress: string = "contacts:EmailAddress";
        static EmailAddresses: string = "contacts:EmailAddresses";
        static PhysicalAddresses: string = "contacts:PhysicalAddresses";
        static PhoneNumber: string = "contacts:PhoneNumber";
        static PhoneNumbers: string = "contacts:PhoneNumbers";
        static AssistantName: string = "contacts:AssistantName";
        static Birthday: string = "contacts:Birthday";
        static BusinessHomePage: string = "contacts:BusinessHomePage";
        static Children: string = "contacts:Children";
        static Companies: string = "contacts:Companies";
        static ContactSource: string = "contacts:ContactSource";
        static Department: string = "contacts:Department";
        static Generation: string = "contacts:Generation";
        static ImAddress: string = "contacts:ImAddress";
        static ImAddresses: string = "contacts:ImAddresses";
        static JobTitle: string = "contacts:JobTitle";
        static Manager: string = "contacts:Manager";
        static Mileage: string = "contacts:Mileage";
        static OfficeLocation: string = "contacts:OfficeLocation";
        static PhysicalAddressCity: string = "contacts:PhysicalAddress:City";
        static PhysicalAddressCountryOrRegion: string = "contacts:PhysicalAddress:CountryOrRegion";
        static PhysicalAddressState: string = "contacts:PhysicalAddress:State";
        static PhysicalAddressStreet: string = "contacts:PhysicalAddress:Street";
        static PhysicalAddressPostalCode: string = "contacts:PhysicalAddress:PostalCode";
        static PostalAddressIndex: string = "contacts:PostalAddressIndex";
        static Profession: string = "contacts:Profession";
        static SpouseName: string = "contacts:SpouseName";
        static Surname: string = "contacts:Surname";
        static WeddingAnniversary: string = "contacts:WeddingAnniversary";
        static HasPicture: string = "contacts:HasPicture";
        static PhoneticFullName: string = "contacts:PhoneticFullName";
        static PhoneticFirstName: string = "contacts:PhoneticFirstName";
        static PhoneticLastName: string = "contacts:PhoneticLastName";
        static Alias: string = "contacts:Alias";
        static Notes: string = "contacts:Notes";
        static Photo: string = "contacts:Photo";
        static UserSMIMECertificate: string = "contacts:UserSMIMECertificate";
        static MSExchangeCertificate: string = "contacts:MSExchangeCertificate";
        static DirectoryId: string = "contacts:DirectoryId";
        static ManagerMailbox: string = "contacts:ManagerMailbox";
        static DirectReports: string = "contacts:DirectReports";
        constructor() {
            super();
        }
    }
    class EmailMessageSchema extends ItemSchema {
        static ToRecipients: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressCollection>("ToRecipients", "message:ToRecipients", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddressCollection(); });
        static BccRecipients: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressCollection>("BccRecipients", "message:BccRecipients", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddressCollection(); });
        static CcRecipients: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressCollection>("CcRecipients", "message:CcRecipients", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddressCollection(); });
        static ConversationIndex: PropertyDefinition = new ByteArrayPropertyDefinition("ConversationIndex", "message:ConversationIndex", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ConversationTopic: PropertyDefinition = new StringPropertyDefinition("ConversationTopic", "message:ConversationTopic", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static From: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("From", "message:From", "Mailbox", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddress(); });
        static IsDeliveryReceiptRequested: PropertyDefinition = new BoolPropertyDefinition("IsDeliveryReceiptRequested", "message:IsDeliveryReceiptRequested", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsRead: PropertyDefinition = new BoolPropertyDefinition("IsRead", "message:IsRead", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsReadReceiptRequested: PropertyDefinition = new BoolPropertyDefinition("IsReadReceiptRequested", "message:IsReadReceiptRequested", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsResponseRequested: PropertyDefinition = new BoolPropertyDefinition("IsResponseRequested", "message:IsResponseRequested", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static InternetMessageId: PropertyDefinition = new StringPropertyDefinition("InternetMessageId", "message:InternetMessageId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static References: PropertyDefinition = new StringPropertyDefinition("References", "message:References", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ReplyTo: PropertyDefinition = new ComplexPropertyDefinition<EmailAddressCollection>("ReplyTo", "message:ReplyTo", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddressCollection(); });
        static Sender: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("Sender", "message:Sender", "Mailbox", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddress(); });
        static ReceivedBy: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("ReceivedBy", "message:ReceivedBy", "Mailbox", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddress(); });
        static ReceivedRepresenting: PropertyDefinition = new ContainedPropertyDefinition<EmailAddress>("ReceivedRepresenting", "message:ReceivedRepresenting", "Mailbox", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new EmailAddress(); });
        static ApprovalRequestData: PropertyDefinition = new ComplexPropertyDefinition<ApprovalRequestData>("ApprovalRequestData", "message:ApprovalRequestData", ExchangeVersion.Exchange2013, () => { return new ApprovalRequestData(); });
        static VotingInformation: PropertyDefinition = new ComplexPropertyDefinition<VotingInformation>("VotingInformation", "message:VotingInformation", ExchangeVersion.Exchange2013, () => { return new VotingInformation(); });
        static Instance: EmailMessageSchema = new EmailMessageSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(EmailMessageSchema.Sender);
            super.RegisterProperty(EmailMessageSchema.ToRecipients);
            super.RegisterProperty(EmailMessageSchema.CcRecipients);
            super.RegisterProperty(EmailMessageSchema.BccRecipients);
            super.RegisterProperty(EmailMessageSchema.IsReadReceiptRequested);
            super.RegisterProperty(EmailMessageSchema.IsDeliveryReceiptRequested);
            super.RegisterProperty(EmailMessageSchema.ConversationIndex);
            super.RegisterProperty(EmailMessageSchema.ConversationTopic);
            super.RegisterProperty(EmailMessageSchema.From);
            super.RegisterProperty(EmailMessageSchema.InternetMessageId);
            super.RegisterProperty(EmailMessageSchema.IsRead);
            super.RegisterProperty(EmailMessageSchema.IsResponseRequested);
            super.RegisterProperty(EmailMessageSchema.References);
            super.RegisterProperty(EmailMessageSchema.ReplyTo);
            super.RegisterProperty(EmailMessageSchema.ReceivedBy);
            super.RegisterProperty(EmailMessageSchema.ReceivedRepresenting);
            super.RegisterProperty(EmailMessageSchema.ApprovalRequestData);
            super.RegisterProperty(EmailMessageSchema.VotingInformation);
        }
        constructor() {
            super();
        }
    }
    class EmailMessageSchema_FieldUris {
        static ConversationIndex: string = "message:ConversationIndex";
        static ConversationTopic: string = "message:ConversationTopic";
        static InternetMessageId: string = "message:InternetMessageId";
        static IsRead: string = "message:IsRead";
        static IsResponseRequested: string = "message:IsResponseRequested";
        static IsReadReceiptRequested: string = "message:IsReadReceiptRequested";
        static IsDeliveryReceiptRequested: string = "message:IsDeliveryReceiptRequested";
        static References: string = "message:References";
        static ReplyTo: string = "message:ReplyTo";
        static From: string = "message:From";
        static Sender: string = "message:Sender";
        static ToRecipients: string = "message:ToRecipients";
        static CcRecipients: string = "message:CcRecipients";
        static BccRecipients: string = "message:BccRecipients";
        static ReceivedBy: string = "message:ReceivedBy";
        static ReceivedRepresenting: string = "message:ReceivedRepresenting";
        static ApprovalRequestData: string = "message:ApprovalRequestData";
        static VotingInformation: string = "message:VotingInformation";
        constructor() {
            super();
        }
    }
    class PermissionSetPropertyDefinition extends ComplexPropertyDefinitionBase {
        get Type(): Type {
            return new Type("FolderPermissionCollection");
        }
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        CreatePropertyInstance(owner: ServiceObject): ComplexProperty {
            var folder: Folder = ((owner instanceof Folder) ? <Folder>owner : null);
            EwsUtilities.Assert(folder !== null, "PermissionCollectionPropertyDefinition.CreatePropertyInstance", "The owner parameter is not of type Folder or a derived class.");
            return new FolderPermissionCollection(folder);
        }
    }
    class FolderSchema extends ServiceObjectSchema {
        static Id: PropertyDefinition = new ComplexPropertyDefinition<FolderId>("FolderId", "folder:FolderId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new FolderId(); });
        static FolderClass: PropertyDefinition = new StringPropertyDefinition("FolderClass", "folder:FolderClass", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ParentFolderId: PropertyDefinition = new ComplexPropertyDefinition<FolderId>("ParentFolderId", "folder:ParentFolderId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new FolderId(); });
        static ChildFolderCount: PropertyDefinition = new IntPropertyDefinition("ChildFolderCount", "folder:ChildFolderCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DisplayName: PropertyDefinition = new StringPropertyDefinition("DisplayName", "folder:DisplayName", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static UnreadCount: PropertyDefinition = new IntPropertyDefinition("UnreadCount", "folder:UnreadCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static TotalCount: PropertyDefinition = new IntPropertyDefinition("TotalCount", "folder:TotalCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ManagedFolderInformation: PropertyDefinition = new ComplexPropertyDefinition<ManagedFolderInformation>("ManagedFolderInformation", "folder:ManagedFolderInformation", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new ManagedFolderInformation(); });
        static EffectiveRights: PropertyDefinition = new EffectiveRightsPropertyDefinition("EffectiveRights", "folder:EffectiveRights", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Permissions: PropertyDefinition = new PermissionSetPropertyDefinition("PermissionSet", "folder:PermissionSet", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.MustBeExplicitlyLoaded, ExchangeVersion.Exchange2007_SP1);
        static WellKnownFolderName: PropertyDefinition = new GenericPropertyDefinition<WellKnownFolderName>("DistinguishedFolderId", "folder:DistinguishedFolderId", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, true);
        static PolicyTag: PropertyDefinition = new ComplexPropertyDefinition<PolicyTag>("PolicyTag", "folder:PolicyTag", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new PolicyTag(); });
        static ArchiveTag: PropertyDefinition = new ComplexPropertyDefinition<ArchiveTag>("ArchiveTag", "folder:ArchiveTag", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, () => { return new ArchiveTag(); });
        static Instance: FolderSchema = new FolderSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(FolderSchema.Id);
            super.RegisterProperty(FolderSchema.ParentFolderId);
            super.RegisterProperty(FolderSchema.FolderClass);
            super.RegisterProperty(FolderSchema.DisplayName);
            super.RegisterProperty(FolderSchema.TotalCount);
            super.RegisterProperty(FolderSchema.ChildFolderCount);
            super.RegisterProperty(ServiceObjectSchema.ExtendedProperties);
            super.RegisterProperty(FolderSchema.ManagedFolderInformation);
            super.RegisterProperty(FolderSchema.EffectiveRights);
            super.RegisterProperty(FolderSchema.Permissions);
            super.RegisterProperty(FolderSchema.UnreadCount);
            super.RegisterProperty(FolderSchema.WellKnownFolderName);
            super.RegisterProperty(FolderSchema.PolicyTag);
            super.RegisterProperty(FolderSchema.ArchiveTag);
        }
        constructor() {
            super();
        }
    }
    class FolderSchema_FieldUris {
        static FolderId: string = "folder:FolderId";
        static ParentFolderId: string = "folder:ParentFolderId";
        static DisplayName: string = "folder:DisplayName";
        static UnreadCount: string = "folder:UnreadCount";
        static TotalCount: string = "folder:TotalCount";
        static ChildFolderCount: string = "folder:ChildFolderCount";
        static FolderClass: string = "folder:FolderClass";
        static ManagedFolderInformation: string = "folder:ManagedFolderInformation";
        static EffectiveRights: string = "folder:EffectiveRights";
        static PermissionSet: string = "folder:PermissionSet";
        static PolicyTag: string = "folder:PolicyTag";
        static ArchiveTag: string = "folder:ArchiveTag";
        static DistinguishedFolderId: string = "folder:DistinguishedFolderId";
        constructor() {
            super();
        }
    }
    class MeetingMessageSchema extends EmailMessageSchema {
        static AssociatedAppointmentId: PropertyDefinition = new ComplexPropertyDefinition<ItemId>("AssociatedCalendarItemId", "meeting:AssociatedCalendarItemId", ExchangeVersion.Exchange2007_SP1, () => { return new ItemId(); });
        static IsDelegated: PropertyDefinition = new BoolPropertyDefinition("IsDelegated", "meeting:IsDelegated", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsOutOfDate: PropertyDefinition = new BoolPropertyDefinition("IsOutOfDate", "meeting:IsOutOfDate", ExchangeVersion.Exchange2007_SP1);
        static HasBeenProcessed: PropertyDefinition = new BoolPropertyDefinition("HasBeenProcessed", "meeting:HasBeenProcessed", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ResponseType: PropertyDefinition = new GenericPropertyDefinition<MeetingResponseType>("ResponseType", "meeting:ResponseType", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ICalUid: PropertyDefinition = AppointmentSchema.ICalUid;
        static ICalRecurrenceId: PropertyDefinition = AppointmentSchema.ICalRecurrenceId;
        static ICalDateTimeStamp: PropertyDefinition = AppointmentSchema.ICalDateTimeStamp;
        static IsOrganizer: PropertyDefinition = new GenericPropertyDefinition<boolean>("IsOrganizer", "cal:IsOrganizer", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013);
        static Instance: MeetingMessageSchema = new MeetingMessageSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(MeetingMessageSchema.AssociatedAppointmentId);
            super.RegisterProperty(MeetingMessageSchema.IsDelegated);
            super.RegisterProperty(MeetingMessageSchema.IsOutOfDate);
            super.RegisterProperty(MeetingMessageSchema.HasBeenProcessed);
            super.RegisterProperty(MeetingMessageSchema.ResponseType);
            super.RegisterProperty(MeetingMessageSchema.ICalUid);
            super.RegisterProperty(MeetingMessageSchema.ICalRecurrenceId);
            super.RegisterProperty(MeetingMessageSchema.ICalDateTimeStamp);
            super.RegisterProperty(MeetingMessageSchema.IsOrganizer);
        }
        constructor() {
            super();
        }
    }
    class MeetingMessageSchema_FieldUris {
        static AssociatedCalendarItemId: string = "meeting:AssociatedCalendarItemId";
        static IsDelegated: string = "meeting:IsDelegated";
        static IsOutOfDate: string = "meeting:IsOutOfDate";
        static HasBeenProcessed: string = "meeting:HasBeenProcessed";
        static ResponseType: string = "meeting:ResponseType";
        static IsOrganizer: string = "cal:IsOrganizer";
        constructor() {
            super();
        }
    }
    class MeetingCancellationSchema extends MeetingMessageSchema {
        static Start: PropertyDefinition = AppointmentSchema.Start;
        static End: PropertyDefinition = AppointmentSchema.End;
        static Location: PropertyDefinition = AppointmentSchema.Location;
        static AppointmentType: PropertyDefinition = AppointmentSchema.AppointmentType;
        static Recurrence: PropertyDefinition = AppointmentSchema.Recurrence;
        static EnhancedLocation: PropertyDefinition = AppointmentSchema.EnhancedLocation;
        static Instance: MeetingCancellationSchema = new MeetingCancellationSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(MeetingCancellationSchema.Start);
            super.RegisterProperty(MeetingCancellationSchema.End);
            super.RegisterProperty(MeetingCancellationSchema.Location);
            super.RegisterProperty(MeetingCancellationSchema.Recurrence);
            super.RegisterProperty(MeetingCancellationSchema.AppointmentType);
            super.RegisterProperty(MeetingCancellationSchema.EnhancedLocation);
        }
        constructor() {
            super();
        }
    }
    class MeetingRequestSchema extends MeetingMessageSchema {
        static MeetingRequestType: PropertyDefinition = new GenericPropertyDefinition<MeetingRequestType>("MeetingRequestType", "meetingRequest:MeetingRequestType", ExchangeVersion.Exchange2007_SP1);
        static IntendedFreeBusyStatus: PropertyDefinition = new GenericPropertyDefinition<LegacyFreeBusyStatus>("IntendedFreeBusyStatus", "meetingRequest:IntendedFreeBusyStatus", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ChangeHighlights: PropertyDefinition = new ComplexPropertyDefinition<ChangeHighlights>("ChangeHighlights", "meetingRequest:ChangeHighlights", ExchangeVersion.Exchange2013, () => { return new ChangeHighlights(); });
        static EnhancedLocation: PropertyDefinition = AppointmentSchema.EnhancedLocation;
        static Start: PropertyDefinition = AppointmentSchema.Start;
        static End: PropertyDefinition = AppointmentSchema.End;
        static OriginalStart: PropertyDefinition = AppointmentSchema.OriginalStart;
        static IsAllDayEvent: PropertyDefinition = AppointmentSchema.IsAllDayEvent;
        static LegacyFreeBusyStatus: PropertyDefinition = AppointmentSchema.LegacyFreeBusyStatus;
        static Location: PropertyDefinition = AppointmentSchema.Location;
        static When: PropertyDefinition = AppointmentSchema.When;
        static IsMeeting: PropertyDefinition = AppointmentSchema.IsMeeting;
        static IsCancelled: PropertyDefinition = AppointmentSchema.IsCancelled;
        static IsRecurring: PropertyDefinition = AppointmentSchema.IsRecurring;
        static MeetingRequestWasSent: PropertyDefinition = AppointmentSchema.MeetingRequestWasSent;
        static AppointmentType: PropertyDefinition = AppointmentSchema.AppointmentType;
        static MyResponseType: PropertyDefinition = AppointmentSchema.MyResponseType;
        static Organizer: PropertyDefinition = AppointmentSchema.Organizer;
        static RequiredAttendees: PropertyDefinition = AppointmentSchema.RequiredAttendees;
        static OptionalAttendees: PropertyDefinition = AppointmentSchema.OptionalAttendees;
        static Resources: PropertyDefinition = AppointmentSchema.Resources;
        static ConflictingMeetingCount: PropertyDefinition = AppointmentSchema.ConflictingMeetingCount;
        static AdjacentMeetingCount: PropertyDefinition = AppointmentSchema.AdjacentMeetingCount;
        static ConflictingMeetings: PropertyDefinition = AppointmentSchema.ConflictingMeetings;
        static AdjacentMeetings: PropertyDefinition = AppointmentSchema.AdjacentMeetings;
        static Duration: PropertyDefinition = AppointmentSchema.Duration;
        static TimeZone: PropertyDefinition = AppointmentSchema.TimeZone;
        static AppointmentReplyTime: PropertyDefinition = AppointmentSchema.AppointmentReplyTime;
        static AppointmentSequenceNumber: PropertyDefinition = AppointmentSchema.AppointmentSequenceNumber;
        static AppointmentState: PropertyDefinition = AppointmentSchema.AppointmentState;
        static Recurrence: PropertyDefinition = AppointmentSchema.Recurrence;
        static FirstOccurrence: PropertyDefinition = AppointmentSchema.FirstOccurrence;
        static LastOccurrence: PropertyDefinition = AppointmentSchema.LastOccurrence;
        static ModifiedOccurrences: PropertyDefinition = AppointmentSchema.ModifiedOccurrences;
        static DeletedOccurrences: PropertyDefinition = AppointmentSchema.DeletedOccurrences;
        static MeetingTimeZone: PropertyDefinition = AppointmentSchema.MeetingTimeZone;
        static StartTimeZone: PropertyDefinition = AppointmentSchema.StartTimeZone;
        static EndTimeZone: PropertyDefinition = AppointmentSchema.EndTimeZone;
        static ConferenceType: PropertyDefinition = AppointmentSchema.ConferenceType;
        static AllowNewTimeProposal: PropertyDefinition = AppointmentSchema.AllowNewTimeProposal;
        static IsOnlineMeeting: PropertyDefinition = AppointmentSchema.IsOnlineMeeting;
        static MeetingWorkspaceUrl: PropertyDefinition = AppointmentSchema.MeetingWorkspaceUrl;
        static NetShowUrl: PropertyDefinition = AppointmentSchema.NetShowUrl;
        static Instance: MeetingRequestSchema = new MeetingRequestSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(MeetingRequestSchema.MeetingRequestType);
            super.RegisterProperty(MeetingRequestSchema.IntendedFreeBusyStatus);
            super.RegisterProperty(MeetingRequestSchema.ChangeHighlights);
            super.RegisterProperty(MeetingRequestSchema.Start);
            super.RegisterProperty(MeetingRequestSchema.End);
            super.RegisterProperty(MeetingRequestSchema.OriginalStart);
            super.RegisterProperty(MeetingRequestSchema.IsAllDayEvent);
            super.RegisterProperty(MeetingRequestSchema.LegacyFreeBusyStatus);
            super.RegisterProperty(MeetingRequestSchema.Location);
            super.RegisterProperty(MeetingRequestSchema.When);
            super.RegisterProperty(MeetingRequestSchema.IsMeeting);
            super.RegisterProperty(MeetingRequestSchema.IsCancelled);
            super.RegisterProperty(MeetingRequestSchema.IsRecurring);
            super.RegisterProperty(MeetingRequestSchema.MeetingRequestWasSent);
            super.RegisterProperty(MeetingRequestSchema.AppointmentType);
            super.RegisterProperty(MeetingRequestSchema.MyResponseType);
            super.RegisterProperty(MeetingRequestSchema.Organizer);
            super.RegisterProperty(MeetingRequestSchema.RequiredAttendees);
            super.RegisterProperty(MeetingRequestSchema.OptionalAttendees);
            super.RegisterProperty(MeetingRequestSchema.Resources);
            super.RegisterProperty(MeetingRequestSchema.ConflictingMeetingCount);
            super.RegisterProperty(MeetingRequestSchema.AdjacentMeetingCount);
            super.RegisterProperty(MeetingRequestSchema.ConflictingMeetings);
            super.RegisterProperty(MeetingRequestSchema.AdjacentMeetings);
            super.RegisterProperty(MeetingRequestSchema.Duration);
            super.RegisterProperty(MeetingRequestSchema.TimeZone);
            super.RegisterProperty(MeetingRequestSchema.AppointmentReplyTime);
            super.RegisterProperty(MeetingRequestSchema.AppointmentSequenceNumber);
            super.RegisterProperty(MeetingRequestSchema.AppointmentState);
            super.RegisterProperty(MeetingRequestSchema.Recurrence);
            super.RegisterProperty(MeetingRequestSchema.FirstOccurrence);
            super.RegisterProperty(MeetingRequestSchema.LastOccurrence);
            super.RegisterProperty(MeetingRequestSchema.ModifiedOccurrences);
            super.RegisterProperty(MeetingRequestSchema.DeletedOccurrences);
            super.RegisterInternalProperty(MeetingRequestSchema.MeetingTimeZone);
            super.RegisterProperty(MeetingRequestSchema.StartTimeZone);
            super.RegisterProperty(MeetingRequestSchema.EndTimeZone);
            super.RegisterProperty(MeetingRequestSchema.ConferenceType);
            super.RegisterProperty(MeetingRequestSchema.AllowNewTimeProposal);
            super.RegisterProperty(MeetingRequestSchema.IsOnlineMeeting);
            super.RegisterProperty(MeetingRequestSchema.MeetingWorkspaceUrl);
            super.RegisterProperty(MeetingRequestSchema.NetShowUrl);
            super.RegisterProperty(MeetingRequestSchema.EnhancedLocation);
        }
        constructor() {
            super();
        }
    }
    class MeetingRequestSchema_FieldUris {
        static MeetingRequestType: string = "meetingRequest:MeetingRequestType";
        static IntendedFreeBusyStatus: string = "meetingRequest:IntendedFreeBusyStatus";
        static ChangeHighlights: string = "meetingRequest:ChangeHighlights";
        constructor() {
            super();
        }
    }
    class MeetingResponseSchema extends MeetingMessageSchema {
        static Start: PropertyDefinition = AppointmentSchema.Start;
        static End: PropertyDefinition = AppointmentSchema.End;
        static Location: PropertyDefinition = AppointmentSchema.Location;
        static AppointmentType: PropertyDefinition = AppointmentSchema.AppointmentType;
        static Recurrence: PropertyDefinition = AppointmentSchema.Recurrence;
        static ProposedStart: PropertyDefinition = new ScopedDateTimePropertyDefinition("ProposedStart", "meeting:ProposedStart", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, (version: ExchangeVersion) => { return AppointmentSchema.StartTimeZone; });
        static ProposedEnd: PropertyDefinition = new ScopedDateTimePropertyDefinition("ProposedEnd", "meeting:ProposedEnd", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2013, (version: ExchangeVersion) => { return AppointmentSchema.EndTimeZone; });
        static EnhancedLocation: PropertyDefinition = AppointmentSchema.EnhancedLocation;
        static Instance: MeetingResponseSchema = new MeetingResponseSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(MeetingResponseSchema.Start);
            super.RegisterProperty(MeetingResponseSchema.End);
            super.RegisterProperty(MeetingResponseSchema.Location);
            super.RegisterProperty(MeetingResponseSchema.Recurrence);
            super.RegisterProperty(MeetingResponseSchema.AppointmentType);
            super.RegisterProperty(MeetingResponseSchema.ProposedStart);
            super.RegisterProperty(MeetingResponseSchema.ProposedEnd);
            super.RegisterProperty(MeetingResponseSchema.EnhancedLocation);
        }
        constructor() {
            super();
        }
    }
    class MeetingResponseSchema_FieldUris {
        static ProposedStart: string = "meeting:ProposedStart";
        static ProposedEnd: string = "meeting:ProposedEnd";
        constructor() {
            super();
        }
    }
    class PostItemSchema extends ItemSchema {
        static ConversationIndex: PropertyDefinition = EmailMessageSchema.ConversationIndex;
        static ConversationTopic: PropertyDefinition = EmailMessageSchema.ConversationTopic;
        static From: PropertyDefinition = EmailMessageSchema.From;
        static InternetMessageId: PropertyDefinition = EmailMessageSchema.InternetMessageId;
        static IsRead: PropertyDefinition = EmailMessageSchema.IsRead;
        static PostedTime: PropertyDefinition = new DateTimePropertyDefinition("PostedTime", "postitem:PostedTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static References: PropertyDefinition = EmailMessageSchema.References;
        static Sender: PropertyDefinition = EmailMessageSchema.Sender;
        static Instance: PostItemSchema = new PostItemSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(PostItemSchema.ConversationIndex);
            super.RegisterProperty(PostItemSchema.ConversationTopic);
            super.RegisterProperty(PostItemSchema.From);
            super.RegisterProperty(PostItemSchema.InternetMessageId);
            super.RegisterProperty(PostItemSchema.IsRead);
            super.RegisterProperty(PostItemSchema.PostedTime);
            super.RegisterProperty(PostItemSchema.References);
            super.RegisterProperty(PostItemSchema.Sender);
        }
        constructor() {
            super();
        }
    }
    class PostItemSchema_FieldUris {
        static PostedTime: string = "postitem:PostedTime";
        constructor() {
            super();
        }
    }
    class PostReplySchema extends ServiceObjectSchema {
        static Instance: PostReplySchema = new PostReplySchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ItemSchema.Subject);
            super.RegisterProperty(ItemSchema.Body);
            super.RegisterProperty(ResponseObjectSchema.ReferenceItemId);
            super.RegisterProperty(ResponseObjectSchema.BodyPrefix);
        }
        constructor() {
            super();
        }
    }
    class ResponseMessageSchema extends ServiceObjectSchema {
        static Instance: ResponseMessageSchema = new ResponseMessageSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ItemSchema.Subject);
            super.RegisterProperty(ItemSchema.Body);
            super.RegisterProperty(EmailMessageSchema.ToRecipients);
            super.RegisterProperty(EmailMessageSchema.CcRecipients);
            super.RegisterProperty(EmailMessageSchema.BccRecipients);
            super.RegisterProperty(EmailMessageSchema.IsReadReceiptRequested);
            super.RegisterProperty(EmailMessageSchema.IsDeliveryReceiptRequested);
            super.RegisterProperty(ResponseObjectSchema.ReferenceItemId);
            super.RegisterProperty(ResponseObjectSchema.BodyPrefix);
        }
        constructor() {
            super();
        }
    }
    class ResponseObjectSchema extends ServiceObjectSchema {
        static ReferenceItemId: PropertyDefinition = new ComplexPropertyDefinition<ItemId>("ReferenceItemId", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet, ExchangeVersion.Exchange2007_SP1, () => { return new ItemId(); });
        static BodyPrefix: PropertyDefinition = new ComplexPropertyDefinition<MessageBody>("NewBodyContent", PropertyDefinitionFlags.CanSet, ExchangeVersion.Exchange2007_SP1, () => { return new MessageBody(); });
        static Instance: ResponseObjectSchema = new ResponseObjectSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(ResponseObjectSchema.ReferenceItemId);
        }
        constructor() {
            super();
        }
    }
    class SearchFolderSchema extends FolderSchema {
        static SearchParameters: PropertyDefinition = new ComplexPropertyDefinition<SearchFolderParameters>("SearchParameters", "folder:SearchParameters", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate, ExchangeVersion.Exchange2007_SP1, () => { return new SearchFolderParameters(); });
        static Instance: SearchFolderSchema = new SearchFolderSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(SearchFolderSchema.SearchParameters);
        }
        constructor() {
            super();
        }
    }
    class SearchFolderSchema_FieldUris {
        static SearchParameters: string = "folder:SearchParameters";
        constructor() {
            super();
        }
    }
    class DoublePropertyDefinition extends GenericPropertyDefinition<number>
    {
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
    }
    class TaskDelegationStatePropertyDefinition extends GenericPropertyDefinition<TaskDelegationState>
    {
        private static NoMatch: string = "NoMatch";
        private static OwnNew: string = "OwnNew";
        private static Owned: string = "Owned";
        private static Accepted: string = "Accepted";
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        Parse(value: string): any {
            if (value !== null) {
                if (value === "NoMatch") {
                    return TaskDelegationState.NoDelegation;
                }
                if (value === "OwnNew") {
                    return TaskDelegationState.Unknown;
                }
                if (value === "Owned") {
                    return TaskDelegationState.Accepted;
                }
                if (value === "Accepted") {
                    return TaskDelegationState.Declined;
                }
            }
            EwsUtilities.Assert(false, "TaskDelegationStatePropertyDefinition.Parse", NString.Format("TaskDelegationStatePropertyDefinition.Parse(): value {0} cannot be handled.", value));
            return null;
        }
        ToString(value: any): string {
            switch (<TaskDelegationState>value) {
                case TaskDelegationState.NoDelegation:
                    return "NoMatch";
                case TaskDelegationState.Unknown:
                    return "OwnNew";
                case TaskDelegationState.Accepted:
                    return "Owned";
                case TaskDelegationState.Declined:
                    return "Accepted";
                default:
                    EwsUtilities.Assert(false, "TaskDelegationStatePropertyDefinition.ToString", "Invalid TaskDelegationState value.");
                    return null;
            }
        }
    }
    class TaskSchema extends ItemSchema {
        static ActualWork: PropertyDefinition = new IntPropertyDefinition("ActualWork", "task:ActualWork", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static AssignedTime: PropertyDefinition = new DateTimePropertyDefinition("AssignedTime", "task:AssignedTime", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static BillingInformation: PropertyDefinition = new StringPropertyDefinition("BillingInformation", "task:BillingInformation", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static ChangeCount: PropertyDefinition = new IntPropertyDefinition("ChangeCount", "task:ChangeCount", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Companies: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Companies", "task:Companies", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new StringList(); });
        static CompleteDate: PropertyDefinition = new DateTimePropertyDefinition("CompleteDate", "task:CompleteDate", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static Contacts: PropertyDefinition = new ComplexPropertyDefinition<StringList>("Contacts", "task:Contacts", PropertyDefinitionFlags.AutoInstantiateOnRead | PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, () => { return new StringList(); });
        static DelegationState: PropertyDefinition = new TaskDelegationStatePropertyDefinition("DelegationState", "task:DelegationState", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Delegator: PropertyDefinition = new StringPropertyDefinition("Delegator", "task:Delegator", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static DueDate: PropertyDefinition = new DateTimePropertyDefinition("DueDate", "task:DueDate", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static Mode: PropertyDefinition = new GenericPropertyDefinition<TaskMode>("IsAssignmentEditable", "task:IsAssignmentEditable", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsComplete: PropertyDefinition = new BoolPropertyDefinition("IsComplete", "task:IsComplete", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsRecurring: PropertyDefinition = new BoolPropertyDefinition("IsRecurring", "task:IsRecurring", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static IsTeamTask: PropertyDefinition = new BoolPropertyDefinition("IsTeamTask", "task:IsTeamTask", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Mileage: PropertyDefinition = new StringPropertyDefinition("Mileage", "task:Mileage", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Owner: PropertyDefinition = new StringPropertyDefinition("Owner", "task:Owner", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static PercentComplete: PropertyDefinition = new DoublePropertyDefinition("PercentComplete", "task:PercentComplete", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static Recurrence: PropertyDefinition = new RecurrencePropertyDefinition("Recurrence", "task:Recurrence", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete, ExchangeVersion.Exchange2007_SP1);
        static StartDate: PropertyDefinition = new DateTimePropertyDefinition("StartDate", "task:StartDate", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static Status: PropertyDefinition = new GenericPropertyDefinition<TaskStatus>("Status", "task:Status", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static StatusDescription: PropertyDefinition = new StringPropertyDefinition("StatusDescription", "task:StatusDescription", PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1);
        static TotalWork: PropertyDefinition = new IntPropertyDefinition("TotalWork", "task:TotalWork", PropertyDefinitionFlags.CanSet | PropertyDefinitionFlags.CanUpdate | PropertyDefinitionFlags.CanDelete | PropertyDefinitionFlags.CanFind, ExchangeVersion.Exchange2007_SP1, true);
        static Instance: TaskSchema = new TaskSchema();
        RegisterProperties(): void {
            super.RegisterProperties();
            super.RegisterProperty(TaskSchema.ActualWork);
            super.RegisterProperty(TaskSchema.AssignedTime);
            super.RegisterProperty(TaskSchema.BillingInformation);
            super.RegisterProperty(TaskSchema.ChangeCount);
            super.RegisterProperty(TaskSchema.Companies);
            super.RegisterProperty(TaskSchema.CompleteDate);
            super.RegisterProperty(TaskSchema.Contacts);
            super.RegisterProperty(TaskSchema.DelegationState);
            super.RegisterProperty(TaskSchema.Delegator);
            super.RegisterProperty(TaskSchema.DueDate);
            super.RegisterProperty(TaskSchema.Mode);
            super.RegisterProperty(TaskSchema.IsComplete);
            super.RegisterProperty(TaskSchema.IsRecurring);
            super.RegisterProperty(TaskSchema.IsTeamTask);
            super.RegisterProperty(TaskSchema.Mileage);
            super.RegisterProperty(TaskSchema.Owner);
            super.RegisterProperty(TaskSchema.PercentComplete);
            super.RegisterProperty(TaskSchema.Recurrence);
            super.RegisterProperty(TaskSchema.StartDate);
            super.RegisterProperty(TaskSchema.Status);
            super.RegisterProperty(TaskSchema.StatusDescription);
            super.RegisterProperty(TaskSchema.TotalWork);
        }
        constructor() {
            super();
        }
    }
    class TaskSchema_FieldUris {
        static ActualWork: string = "task:ActualWork";
        static AssignedTime: string = "task:AssignedTime";
        static BillingInformation: string = "task:BillingInformation";
        static ChangeCount: string = "task:ChangeCount";
        static Companies: string = "task:Companies";
        static CompleteDate: string = "task:CompleteDate";
        static Contacts: string = "task:Contacts";
        static DelegationState: string = "task:DelegationState";
        static Delegator: string = "task:Delegator";
        static DueDate: string = "task:DueDate";
        static IsAssignmentEditable: string = "task:IsAssignmentEditable";
        static IsComplete: string = "task:IsComplete";
        static IsRecurring: string = "task:IsRecurring";
        static IsTeamTask: string = "task:IsTeamTask";
        static Mileage: string = "task:Mileage";
        static Owner: string = "task:Owner";
        static PercentComplete: string = "task:PercentComplete";
        static Recurrence: string = "task:Recurrence";
        static StartDate: string = "task:StartDate";
        static Status: string = "task:Status";
        static StatusDescription: string = "task:StatusDescription";
        static TotalWork: string = "task:TotalWork";
        constructor() {
            super();
        }
    }
    class ExchangeCredentials {
        get NeedSignature(): boolean {
            return false;
        }
        static op_Implicit(credentials: NetworkCredential): ExchangeCredentials {
            return new WebCredentials(credentials);
        }
        static op_Implicit(credentials: CredentialCache): ExchangeCredentials {
            return new WebCredentials(credentials);
        }
        static GetUriWithoutSuffix(url: Uri): string {
            var absoluteUri: string = url.AbsoluteUri;
            var num: number = NString.IndexOf(absoluteUri, "/wssecurity", StringComparison.OrdinalIgnoreCase);
            if (num !== -1) {
                return NString.Substring(absoluteUri, 0, num);
            }
            return absoluteUri;
        }
        PreAuthenticate(): void {
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
        }
        EmitExtraSoapHeaderNamespaceAliases(writer: XmlWriter): void {
        }
        SerializeExtraSoapHeaders(writer: XmlWriter, webMethodName: string): void {
        }
        SerializeWSSecurityHeaders(writer: XmlWriter): void {
        }
        AdjustUrl(url: Uri): Uri {
            return new Uri(ExchangeCredentials.GetUriWithoutSuffix(url));
        }
        Sign(memoryStream: MemoryStream): void {
            throw new InvalidOperationException();
        }
        constructor() {
            super();
        }
    }
    class ClientCertificateCredentials extends ExchangeCredentials {
        private clientCertificates: X509CertificateCollection = null;
        get ClientCertificates(): X509CertificateCollection {
            return this.clientCertificates;
        }
        constructor(clientCertificates: X509CertificateCollection) {
            super();
            EwsUtilities.ValidateParam(clientCertificates, "clientCertificates");
            this.clientCertificates = clientCertificates;
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            request.ClientCertificates = this.ClientCertificates;
        }
    }
    class OAuthCredentials extends ExchangeCredentials {
        private static BearerAuthenticationType: string = "Bearer";
        private static validTokenPattern: Regex = new Regex("^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$", RegexOptions.Compiled);
        private token: string = null;
        private credentials: ICredentials = null;
        constructor(token: string);
        constructor(token: string, verbatim: boolean);
        constructor(credentials: ICredentials);
        constructor(tokenOrCredentials: any, verbatim?: boolean) {
            super();
            if (arguments.length === 1 && (tokenOrCredentials === null || tokenOrCredentials.constructor === String)) {
                this.constructor_0(tokenOrCredentials);
                return;
            }
            if (arguments.length === 2 && (tokenOrCredentials === null || tokenOrCredentials.constructor === String) && (verbatim === null || verbatim.constructor === Boolean)) {
                this.constructor_1(tokenOrCredentials, verbatim);
                return;
            }
            this.constructor_2(tokenOrCredentials);
        }
        private constructor_0(token: string): void {
            this.constructor_1(token, false);
        }
        private constructor_1(token: string, verbatim: boolean): void {
            EwsUtilities.ValidateParam(token, "token");
            var text: string;
            if (verbatim) {
                text = token;
            }
            else {
                var num: number = NString.IndexOf(token, 32)/*' '*/;
                if (num === -1) {
                    text = token;
                }
                else {
                    var strA: string = NString.Substring(token, 0, num);
                    if (NString.Compare(strA, "Bearer", StringComparison.OrdinalIgnoreCase) !== 0) {
                        throw new ArgumentException(Strings.InvalidAuthScheme);
                    }
                    text = NString.Substring(token, num + 1);
                }
                if (!OAuthCredentials.validTokenPattern.IsMatch(text)) {
                    throw new ArgumentException(Strings.InvalidOAuthToken);
                }
            }
            this.token = "Bearer " + text;
        }
        private constructor_2(credentials: ICredentials): void {
            EwsUtilities.ValidateParam(credentials, "credentials");
            this.credentials = credentials;
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            super.PrepareWebRequest(request);
            if (this.token !== null) {
                request.Headers.Remove(HttpRequestHeader.Authorization);
                request.Headers.Add(HttpRequestHeader.Authorization, this.token);
                return;
            }
            request.Credentials = this.credentials;
        }
    }
    class WSSecurityBasedCredentials extends ExchangeCredentials {
        static WsAddressingHeadersFormat: string = "<wsa:Action soap:mustUnderstand='1'>http://schemas.microsoft.com/exchange/services/2006/messages/{0}</wsa:Action><wsa:ReplyTo><wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address></wsa:ReplyTo><wsa:To soap:mustUnderstand='1'>{1}</wsa:To>";
        static WsSecurityHeaderFormat: string = "<wsse:Security soap:mustUnderstand='1'>  {0}</wsse:Security>";
        static WsuTimeStampFormat: string = "<wsu:Timestamp><wsu:Created>{0:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}</wsu:Created><wsu:Expires>{1:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}</wsu:Expires></wsu:Timestamp>";
        static WsSecurityPathSuffix: string = "/wssecurity";
        private addTimestamp: boolean = false;
        private static namespaceManager: XmlNamespaceManager = null;
        private securityToken: string = null;
        private ewsUrl: Uri = null;
        set SecurityToken(value: string) {
            this.securityToken = value;
        }
        get SecurityToken(): string {
            return this.securityToken;
        }
        set EwsUrl(value: Uri) {
            this.ewsUrl = value;
        }
        get EwsUrl(): Uri {
            return this.ewsUrl;
        }
        static get NamespaceManager(): XmlNamespaceManager {
            if (WSSecurityBasedCredentials.namespaceManager === null) {
                WSSecurityBasedCredentials.namespaceManager = new XmlNamespaceManager(new NameTable());
                WSSecurityBasedCredentials.namespaceManager.AddNamespace("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
                WSSecurityBasedCredentials.namespaceManager.AddNamespace("wsa", "http://www.w3.org/2005/08/addressing");
                WSSecurityBasedCredentials.namespaceManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
                WSSecurityBasedCredentials.namespaceManager.AddNamespace("t", "http://schemas.microsoft.com/exchange/services/2006/types");
                WSSecurityBasedCredentials.namespaceManager.AddNamespace("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            }
            return WSSecurityBasedCredentials.namespaceManager;
        }
        constructor();
        constructor(securityToken: string);
        constructor(securityToken: string, addTimestamp: boolean);
        constructor(securityToken?: string, addTimestamp?: boolean) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (securityToken === null || securityToken.constructor === String)) {
                this.constructor_1(securityToken);
                return;
            }
            this.constructor_2(securityToken, addTimestamp);
        }
        private constructor_0(): void {
        }
        private constructor_1(securityToken: string): void {
            this.securityToken = securityToken;
        }
        private constructor_2(securityToken: string, addTimestamp: boolean): void {
            this.securityToken = securityToken;
            this.addTimestamp = addTimestamp;
        }
        PreAuthenticate(): void {
        }
        EmitExtraSoapHeaderNamespaceAliases(writer: XmlWriter): void {
            writer.WriteAttributeString("xmlns", "wsse", null, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            writer.WriteAttributeString("xmlns", "wsa", null, "http://www.w3.org/2005/08/addressing");
        }
        SerializeExtraSoapHeaders(writer: XmlWriter, webMethodName: string): void {
            this.SerializeWSAddressingHeaders(writer, webMethodName);
            this.SerializeWSSecurityHeaders(writer);
        }
        private SerializeWSAddressingHeaders(xmlWriter: XmlWriter, webMethodName: string): void {
            EwsUtilities.Assert(webMethodName !== null, "WSSecurityBasedCredentials.SerializeWSAddressingHeaders", "Web method name cannot be null!");
            EwsUtilities.Assert(Uri.op_Inequality(this.ewsUrl, null), "WSSecurityBasedCredentials.SerializeWSAddressingHeaders", "EWS Url cannot be null!");
            var text: string = NString.Format("<wsa:Action soap:mustUnderstand='1'>http://schemas.microsoft.com/exchange/services/2006/messages/{0}</wsa:Action><wsa:ReplyTo><wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address></wsa:ReplyTo><wsa:To soap:mustUnderstand='1'>{1}</wsa:To>", webMethodName, this.ewsUrl);
            xmlWriter.WriteRaw(text);
        }
        SerializeWSSecurityHeaders(xmlWriter: XmlWriter): void {
            EwsUtilities.Assert(this.securityToken !== null, "WSSecurityBasedCredentials.SerializeWSSecurityHeaders", "Security token cannot be null!");
            var str: string = null;
            if (this.addTimestamp) {
                var utcNow: DateTime = DateTime.UtcNow;
                str = NString.Format("<wsu:Timestamp><wsu:Created>{0:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}</wsu:Created><wsu:Expires>{1:yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'}</wsu:Expires></wsu:Timestamp>", utcNow, utcNow.AddMinutes(5.0));
            }
            var text: string = NString.Format("<wsse:Security soap:mustUnderstand='1'>  {0}</wsse:Security>", str + this.securityToken);
            xmlWriter.WriteRaw(text);
        }
        AdjustUrl(url: Uri): Uri {
            return new Uri(ExchangeCredentials.GetUriWithoutSuffix(url) + "/wssecurity");
        }
    }
    class PartnerTokenCredentials extends WSSecurityBasedCredentials {
        private static WsSecuritySymmetricKeyPathSuffix: string = "/wssecurity/symmetrickey";
        private keyInfoNode: KeyInfoNode = null;
        get NeedSignature(): boolean {
            return true;
        }
        constructor(securityToken: string, securityTokenReference: string) {
            super(securityToken, true);
            EwsUtilities.ValidateParam(securityToken, "securityToken");
            EwsUtilities.ValidateParam(securityTokenReference, "securityTokenReference");
            var safeXmlDocument: SafeXmlDocument = new SafeXmlDocument();
            safeXmlDocument.set_PreserveWhitespace(true);
            safeXmlDocument.LoadXml(securityTokenReference);
            this.keyInfoNode = new KeyInfoNode(safeXmlDocument.get_DocumentElement());
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            this.EwsUrl = request.RequestUri;
        }
        AdjustUrl(url: Uri): Uri {
            return new Uri(ExchangeCredentials.GetUriWithoutSuffix(url) + "/wssecurity/symmetrickey");
        }
        Sign(memoryStream: MemoryStream): void {
            memoryStream.Position = 0;
            var safeXmlDocument: SafeXmlDocument = new SafeXmlDocument();
            safeXmlDocument.set_PreserveWhitespace(true);
            safeXmlDocument.Load(memoryStream);
            var wSSecurityUtilityIdSignedXml: WSSecurityUtilityIdSignedXml = new WSSecurityUtilityIdSignedXml(safeXmlDocument);
            wSSecurityUtilityIdSignedXml.get_SignedInfo().set_CanonicalizationMethod("http://www.w3.org/2001/10/xml-exc-c14n#");
            wSSecurityUtilityIdSignedXml.AddReference("/soap:Envelope/soap:Header/wsse:Security/wsu:Timestamp");
            wSSecurityUtilityIdSignedXml.get_KeyInfo().AddClause(this.keyInfoNode);
            var hMACSHA: HMACSHA1 = new HMACSHA1(ExchangeServiceBase.SessionKey);
            try {
                wSSecurityUtilityIdSignedXml.ComputeSignature(hMACSHA);
            }
            finally {
                if (hMACSHA !== null) {
                    (<IDisposable>hMACSHA).Dispose();
                }
            }
            var xml: XmlElement = wSSecurityUtilityIdSignedXml.GetXml();
            var xmlNode: XmlNode = safeXmlDocument.SelectSingleNode("/soap:Envelope/soap:Header/wsse:Security", WSSecurityBasedCredentials.NamespaceManager);
            xmlNode.AppendChild(xml);
            memoryStream.Position = 0;
            safeXmlDocument.Save(memoryStream);
        }
    }
    class TokenCredentials extends WSSecurityBasedCredentials {
        constructor(securityToken: string) {
            super(securityToken);
            EwsUtilities.ValidateParam(securityToken, "securityToken");
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            this.EwsUrl = request.RequestUri;
        }
    }
    class WebCredentials extends ExchangeCredentials {
        private credentials: ICredentials = null;
        get Credentials(): ICredentials {
            return this.credentials;
        }
        constructor();
        constructor(credentials: ICredentials);
        constructor(username: string, password: string);
        constructor(username: string, password: string, domain: string);
        constructor(credentialsOrUsername?: any, password?: string, domain?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1) {
                this.constructor_1(credentialsOrUsername);
                return;
            }
            if (arguments.length === 2 && (credentialsOrUsername === null || credentialsOrUsername.constructor === String) && (password === null || password.constructor === String)) {
                this.constructor_2(credentialsOrUsername, password);
                return;
            }
            this.constructor_3(credentialsOrUsername, password, domain);
        }
        private constructor_0(): void {
            this.constructor_1(CredentialCache.DefaultNetworkCredentials);
        }
        private constructor_1(credentials: ICredentials): void {
            EwsUtilities.ValidateParam(credentials, "credentials");
            this.credentials = credentials;
        }
        private constructor_2(username: string, password: string): void {
            this.constructor_1(new NetworkCredential(username, password));
        }
        private constructor_3(username: string, password: string, domain: string): void {
            this.constructor_1(new NetworkCredential(username, password, domain));
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            request.Credentials = this.credentials;
        }
        AdjustUrl(url: Uri): Uri {
            return url;
        }
    }
    class WindowsLiveCredentials extends WSSecurityBasedCredentials {
        static XmlEncNamespace: string = "http://www.w3.org/2001/04/xmlenc#";
        static WindowsLiveSoapNamespacePrefix: string = "S";
        static RequestSecurityTokenResponseCollectionElementName: string = "RequestSecurityTokenResponseCollection";
        static RequestSecurityTokenResponseElementName: string = "RequestSecurityTokenResponse";
        static EncryptedDataElementName: string = "EncryptedData";
        static PpElementName: string = "pp";
        static ReqstatusElementName: string = "reqstatus";
        static SuccessfulReqstatus: string = "0x0";
        static XmlSignatureReference: string = "_EWSTKREF";
        private windowsLiveId: string = null;
        private password: string = null;
        private windowsLiveUrl: Uri = null;
        private isAuthenticated: boolean = false;
        private traceEnabled: boolean = false;
        private traceListener: ITraceListener = new EwsTraceListener();
        static DefaultWindowsLiveUrl: Uri = new Uri("https://login.live.com/rst2.srf");
        set TraceEnabled(value: boolean) {
            this.traceEnabled = value;
            if (this.traceEnabled && this.traceListener === null) {
                this.traceListener = new EwsTraceListener();
            }
        }
        get TraceEnabled(): boolean {
            return this.traceEnabled;
        }
        set TraceListener(value: ITraceListener) {
            this.traceListener = value;
            this.traceEnabled = (value !== null);
        }
        get TraceListener(): ITraceListener {
            return this.traceListener;
        }
        set WindowsLiveUrl(value: Uri) {
            this.EwsUrl = null;
            this.IsAuthenticated = false;
            this.windowsLiveUrl = value;
        }
        get WindowsLiveUrl(): Uri {
            return this.windowsLiveUrl;
        }
        set IsAuthenticated(value: boolean) {
            this.isAuthenticated = value;
        }
        get IsAuthenticated(): boolean {
            return this.isAuthenticated;
        }
        constructor(windowsLiveId: string, password: string) {
            super();
            if (windowsLiveId === null) {
                throw new ArgumentNullException("windowsLiveId");
            }
            if (password === null) {
                throw new ArgumentNullException("password");
            }
            this.windowsLiveId = windowsLiveId;
            this.password = password;
            this.windowsLiveUrl = WindowsLiveCredentials.DefaultWindowsLiveUrl;
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            if (Uri.op_Equality(this.EwsUrl, null) || Uri.op_Inequality(this.EwsUrl, request.RequestUri)) {
                this.IsAuthenticated = false;
                this.MakeTokenRequestToWindowsLive(request.RequestUri);
                this.IsAuthenticated = true;
                this.EwsUrl = request.RequestUri;
            }
        }
        private EmitTokenRequest(uriForTokenEndpointReference: Uri): HttpWebResponse {
            var utcNow: DateTime = DateTime.UtcNow;
            var securityTimestamp: SecurityTimestamp = new SecurityTimestamp(utcNow, utcNow.AddMinutes(5.0), "Timestamp");
            var s: string = NString.Format("<?xml version='1.0' encoding='UTF-8'?><s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope'             xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'             xmlns:saml='urn:oasis:names:tc:SAML:1.0:assertion'             xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'             xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'             xmlns:wsa='http://www.w3.org/2005/08/addressing'             xmlns:wssc='http://schemas.xmlsoap.org/ws/2005/02/sc'             xmlns:wst='http://schemas.xmlsoap.org/ws/2005/02/trust'             xmlns:ps='http://schemas.microsoft.com/Passport/SoapServices/PPCRL'>  <s:Header>    <wsa:Action s:mustUnderstand='1'>http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</wsa:Action>    <wsa:To s:mustUnderstand='1'>{0}</wsa:To>    <ps:AuthInfo Id='PPAuthInfo'>      <ps:HostingApp>{{63f179af-8bcd-49a0-a3e5-1154c02df090}}</ps:HostingApp>      <ps:BinaryVersion>5</ps:BinaryVersion>      <ps:UIVersion>1</ps:UIVersion>      <ps:Cookies></ps:Cookies>      <ps:RequestParams>AQAAAAIAAABsYwQAAAAxMDMz</ps:RequestParams>    </ps:AuthInfo>    <wsse:Security>      <wsse:UsernameToken wsu:Id='user'>        <wsse:Username>{1}</wsse:Username>        <wsse:Password>{2}</wsse:Password>      </wsse:UsernameToken>      <wsu:Timestamp Id='Timestamp'>        <wsu:Created>{3}</wsu:Created>        <wsu:Expires>{4}</wsu:Expires>      </wsu:Timestamp>    </wsse:Security>  </s:Header>  <s:Body>    <ps:RequestMultipleSecurityTokens Id='RSTS'>      <wst:RequestSecurityToken Id='RST0'>        <wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</wst:RequestType>        <wsp:AppliesTo>          <wsa:EndpointReference>            <wsa:Address>http://Passport.NET/tb</wsa:Address>          </wsa:EndpointReference>        </wsp:AppliesTo>      </wst:RequestSecurityToken>      <wst:RequestSecurityToken Id='RST1'>        <wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</wst:RequestType>        <wsp:AppliesTo>          <wsa:EndpointReference>            <wsa:Address>{5}</wsa:Address>          </wsa:EndpointReference>        </wsp:AppliesTo>        <wsp:PolicyReference URI='LBI_FED_SSL'></wsp:PolicyReference>      </wst:RequestSecurityToken>    </ps:RequestMultipleSecurityTokens>  </s:Body></s:Envelope>", [
                this.windowsLiveUrl, this.windowsLiveId, this.password, securityTimestamp.GetCreationTimeChars(), securityTimestamp.GetExpiryTimeChars(), uriForTokenEndpointReference.ToString()
            ]);
            var httpWebRequest: HttpWebRequest = <HttpWebRequest>WebRequest.Create(this.windowsLiveUrl);
            httpWebRequest.Method = "POST";
            httpWebRequest.ContentType = "text/xml; charset=utf-8";
            var bytes: number[] = Encoding.UTF8.GetBytes(s);
            httpWebRequest.ContentLength = <number>bytes.length;
            var requestStream: Stream = httpWebRequest.GetRequestStream();
            try {
                requestStream.Write(bytes, 0, bytes.length);
            }
            finally {
                if (requestStream !== null) {
                    (<IDisposable>requestStream).Dispose();
                }
            }
            return <HttpWebResponse>httpWebRequest.GetResponse();
        }
        private TraceResponse(response: HttpWebResponse, memoryStream: MemoryStream): void {
            EwsUtilities.Assert(memoryStream !== null, "WindowsLiveCredentials.TraceResponse", "memoryStream cannot be null");
            if (!this.TraceEnabled) {
                return;
            }
            if (!NString.IsNullOrEmpty(response.ContentType) && (NString.StartsWith(response.ContentType, "text/", StringComparison.OrdinalIgnoreCase) || NString.StartsWith(response.ContentType, "application/soap", StringComparison.OrdinalIgnoreCase))) {
                this.traceListener.Trace("WindowsLiveResponse", EwsUtilities.FormatLogMessageWithXmlContent("WindowsLiveResponse", memoryStream));
                return;
            }
            this.traceListener.Trace("WindowsLiveResponse", "Non-textual response");
        }
        private TraceWebException(e: WebException): void {
            if (e.Response === null) {
                if (this.TraceEnabled) {
                    var traceMessage: string = NString.Format("Exception Received when sending Windows Live token request: {0}", e);
                    this.traceListener.Trace("WindowsLiveResponse", traceMessage);
                }
                return;
            }
            if (this.TraceEnabled) {
                var memoryStream: MemoryStream = new MemoryStream();
                try {
                    var responseStream: Stream = e.Response.GetResponseStream();
                    try {
                        EwsUtilities.CopyStream(responseStream, memoryStream);
                        memoryStream.Position = 0;
                    }
                    finally {
                        if (responseStream !== null) {
                            (<IDisposable>responseStream).Dispose();
                        }
                    }
                    this.TraceResponse(<HttpWebResponse>e.Response, memoryStream);
                }
                finally {
                    if (memoryStream !== null) {
                        (<IDisposable>memoryStream).Dispose();
                    }
                }
            }
        }
        private MakeTokenRequestToWindowsLive(uriForTokenEndpointReference: Uri): void {
            var response: HttpWebResponse;
            try {
                response = this.EmitTokenRequest(uriForTokenEndpointReference);
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Status === WebExceptionStatus.ProtocolError && ex.Response !== null) {
                        this.TraceWebException(ex);
                    }
                    else {
                        if (this.TraceEnabled) {
                            var traceMessage: string = NString.Format("Error occurred sending request - status was {0}, exception {1}", ex.Status, ex);
                            this.traceListener.Trace("WindowsLiveCredentials", traceMessage);
                        }
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    throw ex;
            }
            try {
                this.ProcessTokenResponse(response);
            }
            catch (ex2) {
                if (ex2 instanceof WebException) {
                    if (this.TraceEnabled) {
                        var traceMessage2: string = NString.Format("Error occurred sending request - status was {0}, exception {1}", ex2.Status, ex2);
                        this.traceListener.Trace("WindowsLiveCredentials", traceMessage2);
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                }
                else
                    throw ex2;
            }
        }
        private ReadWindowsLiveRSTResponseHeaders(rstResponse: EwsXmlReader): void {
            rstResponse.ReadStartElement("S", "Header");
            rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, "pp");
            if (rstResponse.IsEndElement("S", "Header")) {
                if (this.TraceEnabled) {
                    this.traceListener.Trace("WindowsLiveResponse", "Could not find Passport SOAP fault information in Windows Live response");
                }
                throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, "pp"));
            }
            rstResponse.ReadToDescendant(XmlNamespace.PassportSoapFault, "reqstatus");
            if (rstResponse.IsEndElement(XmlNamespace.PassportSoapFault, "pp")) {
                if (this.TraceEnabled) {
                    this.traceListener.Trace("WindowsLiveResponse", "Could not find reqstatus element in Passport SOAP fault information in Windows Live response");
                }
                throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, "reqstatus"));
            }
            var text: string = rstResponse.ReadElementValue();
            while (!rstResponse.IsEndElement("S", "Header")) {
                rstResponse.Read();
            }
            if (!NString.Equals(text, "0x0")) {
                if (this.TraceEnabled) {
                    var traceMessage: string = NString.Format("Received status {0} from Windows Live instead of {1}.", text, "0x0");
                    this.traceListener.Trace("WindowsLiveResponse", traceMessage);
                    rstResponse.ReadStartElement("S", "Body");
                    this.traceListener.Trace("WindowsLiveResponse", NString.Format("Windows Live reported Fault : {0}", rstResponse.ReadInnerXml()));
                }
                throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, "reqstatus: " + text));
            }
        }
        private ParseWindowsLiveRSTResponseBody(rstResponse: EwsXmlReader): void {
            rstResponse.ReadStartElement(XmlNamespace.WSTrustFebruary2005, "RequestSecurityTokenResponseCollection");
            rstResponse.SkipElement(XmlNamespace.WSTrustFebruary2005, "RequestSecurityTokenResponse");
            rstResponse.ReadStartElement(XmlNamespace.WSTrustFebruary2005, "RequestSecurityTokenResponse");
            while (!rstResponse.IsEndElement(XmlNamespace.WSTrustFebruary2005, "RequestSecurityTokenResponse")) {
                if (rstResponse.IsStartElement() && rstResponse.LocalName === "EncryptedData" && rstResponse.NamespaceUri === "http://www.w3.org/2001/04/xmlenc#") {
                    this.SecurityToken = rstResponse.ReadOuterXml();
                }
                else {
                    if (rstResponse.IsStartElement(XmlNamespace.PassportSoapFault, "pp")) {
                        if (this.TraceEnabled) {
                            var traceMessage: string = NString.Format("Windows Live reported an error retrieving the token - {0}", rstResponse.ReadOuterXml());
                            this.traceListener.Trace("WindowsLiveResponse", traceMessage);
                        }
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, "EncryptedData"));
                    }
                }
                rstResponse.Read();
            }
            if (this.SecurityToken === null) {
                if (this.TraceEnabled) {
                    var traceMessage2: string = NString.Format("Did not find all required parts of the Windows Live response - Security Token - {0}", (this.SecurityToken === null) ? "NOT FOUND" : "found");
                    this.traceListener.Trace("WindowsLiveResponse", traceMessage2);
                }
                throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, "No security token found."));
            }
            rstResponse.Read();
        }
        private ProcessTokenResponse(response: HttpWebResponse): void {
            var responseStream: Stream = response.GetResponseStream();
            try {
                this.SecurityToken = null;
                var ewsXmlReader: EwsXmlReader = new EwsXmlReader(responseStream);
                ewsXmlReader.Read(17);
                ewsXmlReader.ReadStartElement("S", "Envelope");
                this.ReadWindowsLiveRSTResponseHeaders(ewsXmlReader);
                ewsXmlReader.ReadStartElement("S", "Body");
                this.ParseWindowsLiveRSTResponseBody(ewsXmlReader);
            }
            finally {
                if (responseStream !== null) {
                    (<IDisposable>responseStream).Dispose();
                }
            }
        }
    }
    class WSSecurityUtilityIdSignedXml extends SignedXml {
        private static nextId: number = 0;
        private static commonPrefix: string = "uuid-" + Guid.NewGuid().ToString() + "-";
        private document: XmlDocument = null;
        private ids: Dictionary<string, XmlElement> = null;
        constructor(document: XmlDocument) {
            super(document);
            this.document = document;
            this.ids = new Dictionary<string, XmlElement>();
        }
        static GetUniqueId(): string {
            return WSSecurityUtilityIdSignedXml.commonPrefix + (() => {
                var _p0 = [
                    WSSecurityUtilityIdSignedXml.nextId
                ];
                var _r = Interlocked.Increment(_p0);
                WSSecurityUtilityIdSignedXml.nextId = _p0[0];
                return _r;
            })().ToString(CultureInfo.InvariantCulture);
        }
        AddReference(xpath: string): void {
            var xmlElement: XmlElement = ((this.document.SelectSingleNode(xpath, WSSecurityBasedCredentials.NamespaceManager) instanceof XmlElement) ? <XmlElement>this.document.SelectSingleNode(xpath, WSSecurityBasedCredentials.NamespaceManager) : null);
            if (xmlElement !== null) {
                var uniqueId: string = WSSecurityUtilityIdSignedXml.GetUniqueId();
                var xmlAttribute: XmlAttribute = this.document.CreateAttribute("wsu", "Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
                xmlAttribute.set_Value(uniqueId);
                xmlElement.get_Attributes().Append(xmlAttribute);
                var reference: Reference = new Reference();
                reference.set_Uri("#" + uniqueId);
                reference.AddTransform(new XmlDsigExcC14NTransform());
                super.AddReference(reference);
                this.ids.Add(uniqueId, xmlElement);
            }
        }
        GetIdElement(document: XmlDocument, idValue: string): XmlElement {
            return this.ids.get_Item(idValue);
        }
    }
    class X509CertificateCredentials extends WSSecurityBasedCredentials {
        private static BinarySecurityTokenFormat: string = "<wsse:BinarySecurityToken EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" wsu:Id=\"{0}\">{1}</wsse:BinarySecurityToken>";
        private static KeyInfoClauseFormat: string = "<wsse:SecurityTokenReference xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" ><wsse:Reference URI=\"#{0}\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" /></wsse:SecurityTokenReference>";
        private static WsSecurityX509CertPathSuffix: string = "/wssecurity/x509cert";
        private certificate: X509Certificate2 = null;
        private keyInfoClause: KeyInfoClause = null;
        get NeedSignature(): boolean {
            return true;
        }
        constructor(certificate: X509Certificate2) {
            super(null, true);
            EwsUtilities.ValidateParam(certificate, "certificate");
            if (!certificate.HasPrivateKey) {
                throw new ServiceValidationException(Strings.CertificateHasNoPrivateKey);
            }
            this.certificate = certificate;
            var uniqueId: string = WSSecurityUtilityIdSignedXml.GetUniqueId();
            this.SecurityToken = NString.Format("<wsse:BinarySecurityToken EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" wsu:Id=\"{0}\">{1}</wsse:BinarySecurityToken>", uniqueId, Convert.ToBase64String(this.certificate.GetRawCertData()));
            var safeXmlDocument: SafeXmlDocument = new SafeXmlDocument();
            safeXmlDocument.set_PreserveWhitespace(true);
            safeXmlDocument.LoadXml(NString.Format("<wsse:SecurityTokenReference xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" ><wsse:Reference URI=\"#{0}\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" /></wsse:SecurityTokenReference>", uniqueId));
            this.keyInfoClause = new KeyInfoNode(safeXmlDocument.get_DocumentElement());
        }
        PrepareWebRequest(request: IEwsHttpWebRequest): void {
            this.EwsUrl = request.RequestUri;
        }
        AdjustUrl(url: Uri): Uri {
            return new Uri(ExchangeCredentials.GetUriWithoutSuffix(url) + "/wssecurity/x509cert");
        }
        Sign(memoryStream: MemoryStream): void {
            memoryStream.Position = 0;
            var safeXmlDocument: SafeXmlDocument = new SafeXmlDocument();
            safeXmlDocument.set_PreserveWhitespace(true);
            safeXmlDocument.Load(memoryStream);
            var wSSecurityUtilityIdSignedXml: WSSecurityUtilityIdSignedXml = new WSSecurityUtilityIdSignedXml(safeXmlDocument);
            wSSecurityUtilityIdSignedXml.get_SignedInfo().set_CanonicalizationMethod("http://www.w3.org/2001/10/xml-exc-c14n#");
            wSSecurityUtilityIdSignedXml.set_SigningKey(this.certificate.PrivateKey);
            wSSecurityUtilityIdSignedXml.AddReference("/soap:Envelope/soap:Header/wsa:To");
            wSSecurityUtilityIdSignedXml.AddReference("/soap:Envelope/soap:Header/wsse:Security/wsu:Timestamp");
            wSSecurityUtilityIdSignedXml.get_KeyInfo().AddClause(this.keyInfoClause);
            wSSecurityUtilityIdSignedXml.ComputeSignature();
            var xml: XmlElement = wSSecurityUtilityIdSignedXml.GetXml();
            var xmlNode: XmlNode = safeXmlDocument.SelectSingleNode("/soap:Envelope/soap:Header/wsse:Security", WSSecurityBasedCredentials.NamespaceManager);
            xmlNode.AppendChild(xml);
            memoryStream.Position = 0;
            safeXmlDocument.Save(memoryStream);
        }
        ToString(): string {
            return NString.Format("X509:<I>={0},<S>={1}", this.certificate.Issuer, this.certificate.Subject);
        }
    }
    class RetentionPolicyTag {
        DisplayName: string = null;
        RetentionId: Guid = null;
        RetentionPeriod: number = 0;
        Type: ElcFolderType = 0;
        RetentionAction: RetentionActionType = 0;
        Description: string = null;
        IsVisible: boolean = false;
        OptedInto: boolean = false;
        IsArchive: boolean = false;
        constructor();
        constructor(displayName: string, retentionId: Guid, retentionPeriod: number, type: ElcFolderType, retentionAction: RetentionActionType, isVisible: boolean, optedInto: boolean, isArchive: boolean);
        constructor(displayName?: string, retentionId?: Guid, retentionPeriod?: number, type?: ElcFolderType, retentionAction?: RetentionActionType, isVisible?: boolean, optedInto?: boolean, isArchive?: boolean) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(displayName, retentionId, retentionPeriod, type, retentionAction, isVisible, optedInto, isArchive);
        }
        private constructor_0(): void {
        }
        private constructor_1(displayName: string, retentionId: Guid, retentionPeriod: number, type: ElcFolderType, retentionAction: RetentionActionType, isVisible: boolean, optedInto: boolean, isArchive: boolean): void {
            this.DisplayName = displayName;
            this.RetentionId = retentionId;
            this.RetentionPeriod = retentionPeriod;
            this.Type = type;
            this.RetentionAction = retentionAction;
            this.IsVisible = isVisible;
            this.OptedInto = optedInto;
            this.IsArchive = isArchive;
        }
        static LoadFromXml(reader: EwsServiceXmlReader): RetentionPolicyTag {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "RetentionPolicyTag");
            var retentionPolicyTag: RetentionPolicyTag = new RetentionPolicyTag();
            retentionPolicyTag.DisplayName = reader.ReadElementValue(XmlNamespace.Types, "DisplayName");
            retentionPolicyTag.RetentionId = new Guid(reader.ReadElementValue(XmlNamespace.Types, "RetentionId"));
            retentionPolicyTag.RetentionPeriod = reader.ReadElementValue<number>(XmlNamespace.Types, "RetentionPeriod");
            retentionPolicyTag.Type = reader.ReadElementValue<ElcFolderType>(XmlNamespace.Types, "Type");
            retentionPolicyTag.RetentionAction = reader.ReadElementValue<RetentionActionType>(XmlNamespace.Types, "RetentionAction");
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Types, "Description")) {
                retentionPolicyTag.Description = reader.ReadElementValue(XmlNamespace.Types, "Description");
            }
            retentionPolicyTag.IsVisible = reader.ReadElementValue<boolean>(XmlNamespace.Types, "IsVisible");
            retentionPolicyTag.OptedInto = reader.ReadElementValue<boolean>(XmlNamespace.Types, "OptedInto");
            retentionPolicyTag.IsArchive = reader.ReadElementValue<boolean>(XmlNamespace.Types, "IsArchive");
            return retentionPolicyTag;
        }
        static LoadFromJson(jsonObject: JsonObject): RetentionPolicyTag {
            var retentionPolicyTag: RetentionPolicyTag = new RetentionPolicyTag();
            if (jsonObject.ContainsKey("DisplayName")) {
                retentionPolicyTag.DisplayName = jsonObject.ReadAsString("DisplayName");
            }
            if (jsonObject.ContainsKey("RetentionId")) {
                retentionPolicyTag.RetentionId = new Guid(jsonObject.ReadAsString("RetentionId"));
            }
            if (jsonObject.ContainsKey("RetentionPeriod")) {
                retentionPolicyTag.RetentionPeriod = jsonObject.ReadAsInt("RetentionPeriod");
            }
            if (jsonObject.ContainsKey("Type")) {
                retentionPolicyTag.Type = jsonObject.ReadEnumValue<ElcFolderType>("Type");
            }
            if (jsonObject.ContainsKey("RetentionAction")) {
                retentionPolicyTag.RetentionAction = jsonObject.ReadEnumValue<RetentionActionType>("RetentionAction");
            }
            if (jsonObject.ContainsKey("Description")) {
                retentionPolicyTag.Description = jsonObject.ReadAsString("Description");
            }
            if (jsonObject.ContainsKey("IsVisible")) {
                retentionPolicyTag.IsVisible = jsonObject.ReadAsBool("IsVisible");
            }
            if (jsonObject.ContainsKey("OptedInto")) {
                retentionPolicyTag.OptedInto = jsonObject.ReadAsBool("OptedInto");
            }
            if (jsonObject.ContainsKey("IsArchive")) {
                retentionPolicyTag.IsArchive = jsonObject.ReadAsBool("IsArchive");
            }
            return retentionPolicyTag;
        }
    }
    enum AffectedTaskOccurrence {
        AllOccurrences,
        SpecifiedOccurrenceOnly
    }
    enum AggregateType {
        Minimum,
        Maximum
    }
    enum AppointmentType {
        Single,
        Occurrence,
        Exception,
        RecurringMaster
    }
    enum AutodiscoverEndpoints {
        None = 0,
        Legacy = 1,
        Soap = 2,
        WsSecurity = 4,
        WSSecuritySymmetricKey = 8,
        WSSecurityX509Cert = 16,
        OAuth = 32
    }
    enum AvailabilityData {
        FreeBusy,
        Suggestions,
        FreeBusyAndSuggestions
    }
    enum BasePropertySet {
        IdOnly,
        FirstClassProperties
    }
    enum BodyType {
        HTML,
        Text
    }
    enum ChangeType {
        Create,
        Update,
        Delete,
        ReadFlagChange
    }
    enum ClientAccessTokenType {
        CallerIdentity,
        ExtensionCallback,
        ScopedToken
    }
    enum EmailPosition {
        LatestReply,
        Other,
        Subject,
        Signature
    }
    enum ClientExtensionProvidedTo {
        Everyone,
        SpecificUsers
    }
    enum ComparisonMode {
        Exact,
        IgnoreCase,
        IgnoreNonSpacingCharacters,
        IgnoreCaseAndNonSpacingCharacters
    }
    enum ConflictResolutionMode {
        NeverOverwrite,
        AutoResolve,
        AlwaysOverwrite
    }
    enum ConflictType {
        IndividualAttendeeConflict,
        GroupConflict,
        GroupTooBigConflict,
        UnknownAttendeeConflict
    }
    enum ConnectingIdType {
        PrincipalName,
        SID,
        SmtpAddress
    }
    enum ConnectionFailureCause {
        None,
        UserBusy,
        NoAnswer,
        Unavailable,
        Other
    }
    enum ContactSource {
        ActiveDirectory,
        Store
    }
    enum ContainmentMode {
        FullString,
        Prefixed,
        Substring,
        PrefixOnWords,
        ExactPhrase
    }
    enum ConversationActionType {
        AlwaysCategorize,
        AlwaysDelete,
        AlwaysMove,
        Delete,
        Move,
        Copy,
        SetReadState,
        SetRetentionPolicy,
        Flag
    }
    enum ConversationFlagStatus {
        NotFlagged,
        Flagged,
        Complete
    }
    enum ConversationQueryTraversal {
        Shallow,
        Deep
    }
    enum ConversationSortOrder {
        TreeOrderAscending,
        TreeOrderDescending,
        DateOrderAscending,
        DateOrderDescending
    }
    enum DateTimePrecision {
        Default,
        Seconds,
        Milliseconds
    }
    enum DayOfTheWeekIndex {
        First,
        Second,
        Third,
        Fourth,
        Last
    }
    enum DayOfTheWeek {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,
        Day,
        Weekday,
        WeekendDay
    }
    enum DefaultExtendedPropertySet {
        Meeting,
        Appointment,
        Common,
        PublicStrings,
        Address,
        InternetHeaders,
        CalendarAssistant,
        UnifiedMessaging,
        Task
    }
    enum DelegateFolderPermissionLevel {
        None,
        Editor,
        Reviewer,
        Author,
        Custom
    }
    enum DeleteMode {
        HardDelete,
        SoftDelete,
        MoveToDeletedItems
    }
    enum EffectiveRights {
        None = 0,
        CreateAssociated = 1,
        CreateContents = 2,
        CreateHierarchy = 4,
        Delete = 8,
        Modify = 16,
        Read = 32,
        ViewPrivateItems = 64
    }
    enum ElcFolderType {
        Calendar = 1,
        Contacts,
        DeletedItems,
        Drafts,
        Inbox,
        JunkEmail,
        Journal,
        Notes,
        Outbox,
        SentItems,
        Tasks,
        All,
        ManagedCustomFolder,
        RssSubscriptions,
        SyncIssues,
        ConversationHistory,
        Personal,
        RecoverableItems,
        NonIpmRoot
    }
    enum EmailAddressKey {
        EmailAddress1,
        EmailAddress2,
        EmailAddress3
    }
    enum EventType {
        Status,
        NewMail,
        Deleted,
        Modified,
        Moved,
        Copied,
        Created,
        FreeBusyChanged
    }
    enum ExchangeVersion {
        Exchange2007_SP1,
        Exchange2010,
        Exchange2010_SP1,
        Exchange2010_SP2,
        Exchange2013,
        Exchange2013_SP1
    }
    enum ExtensionInstallScope {
        None,
        User,
        Organization,
        Default
    }
    enum ExtensionType {
        Default,
        Private,
        MarketPlace
    }
    enum FileAsMapping {
        None,
        SurnameCommaGivenName,
        GivenNameSpaceSurname,
        Company,
        SurnameCommaGivenNameCompany,
        CompanySurnameGivenName,
        SurnameGivenName,
        SurnameGivenNameCompany,
        CompanySurnameCommaGivenName,
        SurnameGivenNameSuffix,
        SurnameSpaceGivenNameCompany,
        CompanySurnameSpaceGivenName,
        SurnameSpaceGivenName,
        DisplayName,
        GivenName,
        SurnameGivenNameMiddleSuffix,
        Surname,
        Empty
    }
    enum FlaggedForAction {
        Any,
        Call,
        DoNotForward,
        FollowUp,
        FYI,
        Forward,
        NoResponseNecessary,
        Read,
        Reply,
        ReplyToAll,
        Review
    }
    enum FolderPermissionLevel {
        None,
        Owner,
        PublishingEditor,
        Editor,
        PublishingAuthor,
        Author,
        NoneditingAuthor,
        Reviewer,
        Contributor,
        FreeBusyTimeOnly,
        FreeBusyTimeAndSubjectAndLocation,
        Custom
    }
    enum FolderPermissionReadAccess {
        None,
        TimeOnly,
        TimeAndSubjectAndLocation,
        FullDetails
    }
    enum FolderTraversal {
        Shallow,
        Deep,
        SoftDeleted
    }
    enum FreeBusyViewType {
        None,
        MergedOnly,
        FreeBusy,
        FreeBusyMerged,
        Detailed,
        DetailedMerged
    }
    enum HoldAction {
        Create,
        Update,
        Remove
    }
    enum HoldStatus {
        NotOnHold,
        Pending,
        OnHold,
        PartialHold,
        Failed
    }
    enum IconIndex {
        Default,
        PostItem,
        MailRead,
        MailUnread,
        MailReplied,
        MailForwarded,
        MailEncrypted,
        MailSmimeSigned,
        MailEncryptedReplied,
        MailSmimeSignedReplied,
        MailEncryptedForwarded,
        MailSmimeSignedForwarded,
        MailEncryptedRead,
        MailSmimeSignedRead,
        MailIrm,
        MailIrmForwarded,
        MailIrmReplied,
        SmsSubmitted,
        SmsRoutedToDeliveryPoint,
        SmsRoutedToExternalMessagingSystem,
        SmsDelivered,
        OutlookDefaultForContacts,
        AppointmentItem,
        AppointmentRecur,
        AppointmentMeet,
        AppointmentMeetRecur,
        AppointmentMeetNY,
        AppointmentMeetYes,
        AppointmentMeetNo,
        AppointmentMeetMaybe,
        AppointmentMeetCancel,
        AppointmentMeetInfo,
        TaskItem,
        TaskRecur,
        TaskOwned,
        TaskDelegated
    }
    enum IdFormat {
        EwsLegacyId,
        EwsId,
        EntryId,
        HexEntryId,
        StoreId,
        OwaId
    }
    enum ImAddressKey {
        ImAddress1,
        ImAddress2,
        ImAddress3
    }
    enum Importance {
        Low,
        Normal,
        High
    }
    enum ItemFlagStatus {
        NotFlagged,
        Flagged,
        Complete
    }
    enum ItemTraversal {
        Shallow,
        SoftDeleted,
        Associated
    }
    enum LegacyFreeBusyStatus {
        Free,
        Tentative,
        Busy,
        OOF,
        WorkingElsewhere,
        NoData
    }
    enum LocationSource {
        None,
        LocationServices,
        PhonebookServices,
        Device,
        Contact,
        Resource
    }
    enum LogicalOperator {
        And,
        Or
    }
    enum MailboxSearchLocation {
        PrimaryOnly,
        ArchiveOnly,
        All
    }
    enum MailboxSearchScopeType {
        LegacyExchangeDN,
        PublicFolder,
        Recipient,
        MailboxGuid,
        AllPublicFolders,
        AllMailboxes,
        SavedSearchId,
        AutoDetect
    }
    enum MailboxType {
        Unknown,
        OneOff,
        Mailbox,
        PublicFolder,
        PublicGroup,
        ContactGroup,
        Contact
    }
    enum MapiPropertyType {
        ApplicationTime,
        ApplicationTimeArray,
        Binary,
        BinaryArray,
        Boolean,
        CLSID,
        CLSIDArray,
        Currency,
        CurrencyArray,
        Double,
        DoubleArray,
        Error,
        Float,
        FloatArray,
        Integer,
        IntegerArray,
        Long,
        LongArray,
        Null,
        Object,
        ObjectArray,
        Short,
        ShortArray,
        SystemTime,
        SystemTimeArray,
        String,
        StringArray
    }
    enum MemberStatus {
        Unrecognized,
        Normal,
        Demoted
    }
    enum MeetingAttendeeType {
        Organizer,
        Required,
        Optional,
        Room,
        Resource
    }
    enum MeetingRequestsDeliveryScope {
        DelegatesOnly,
        DelegatesAndMe,
        DelegatesAndSendInformationToMe,
        NoForward
    }
    enum MeetingRequestType {
        None,
        FullUpdate,
        InformationalUpdate,
        NewMeetingRequest,
        Outdated,
        SilentUpdate,
        PrincipalWantsCopy
    }
    enum MessageDisposition {
        SaveOnly,
        SendAndSaveCopy,
        SendOnly
    }
    enum Month {
        January = 1,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December
    }
    enum OffsetBasePoint {
        Beginning,
        End
    }
    enum OofExternalAudience {
        None,
        Known,
        All
    }
    enum OofState {
        Disabled,
        Enabled,
        Scheduled
    }
    enum PermissionScope {
        None,
        Owned,
        All
    }
    enum PhoneCallState {
        Idle,
        Connecting,
        Alerted,
        Connected,
        Disconnected,
        Incoming,
        Transferring,
        Forwarding
    }
    enum PhoneNumberKey {
        AssistantPhone,
        BusinessFax,
        BusinessPhone,
        BusinessPhone2,
        Callback,
        CarPhone,
        CompanyMainPhone,
        HomeFax,
        HomePhone,
        HomePhone2,
        Isdn,
        MobilePhone,
        OtherFax,
        OtherTelephone,
        Pager,
        PrimaryPhone,
        RadioPhone,
        Telex,
        TtyTddPhone
    }
    enum PhysicalAddressIndex {
        None,
        Business,
        Home,
        Other
    }
    enum PhysicalAddressKey {
        Business,
        Home,
        Other
    }
    enum PreviewItemBaseShape {
        Default,
        Compact
    }
    enum PrivilegedLogonType {
        Admin,
        SystemService
    }
    enum PropertyDefinitionFlags {
        None = 0,
        AutoInstantiateOnRead = 1,
        ReuseInstance = 2,
        CanSet = 4,
        CanUpdate = 8,
        CanDelete = 16,
        CanFind = 32,
        MustBeExplicitlyLoaded = 64,
        UpdateCollectionItems = 128
    }
    enum ResolveNameSearchLocation {
        DirectoryOnly,
        DirectoryThenContacts,
        ContactsOnly,
        ContactsThenDirectory
    }
    enum ResponseActions {
        None = 0,
        Accept = 1,
        TentativelyAccept = 2,
        Decline = 4,
        Reply = 8,
        ReplyAll = 16,
        Forward = 32,
        Cancel = 64,
        RemoveFromCalendar = 128,
        SuppressReadReceipt = 256,
        PostReply = 512
    }
    enum ResponseMessageType {
        Reply,
        ReplyAll,
        Forward
    }
    enum MeetingResponseType {
        Unknown,
        Organizer,
        Tentative,
        Accept,
        Decline,
        NoResponseReceived
    }
    enum RetentionActionType {
        None,
        MoveToDeletedItems,
        MoveToFolder,
        DeleteAndAllowRecovery,
        PermanentlyDelete,
        MarkAsPastRetentionLimit,
        MoveToArchive
    }
    enum RetentionType {
        Delete,
        Archive
    }
    enum RuleProperty {
        RuleId,
        DisplayName,
        Priority,
        IsNotSupported,
        Actions,
        ConditionCategories,
        ConditionContainsBodyStrings,
        ConditionContainsHeaderStrings,
        ConditionContainsRecipientStrings,
        ConditionContainsSenderStrings,
        ConditionContainsSubjectOrBodyStrings,
        ConditionContainsSubjectStrings,
        ConditionFlaggedForAction,
        ConditionFromAddresses,
        ConditionFromConnectedAccounts,
        ConditionHasAttachments,
        ConditionImportance,
        ConditionIsApprovalRequest,
        ConditionIsAutomaticForward,
        ConditionIsAutomaticReply,
        ConditionIsEncrypted,
        ConditionIsMeetingRequest,
        ConditionIsMeetingResponse,
        ConditionIsNonDeliveryReport,
        ConditionIsPermissionControlled,
        ConditionIsRead,
        ConditionIsSigned,
        ConditionIsVoicemail,
        ConditionIsReadReceipt,
        ConditionItemClasses,
        ConditionMessageClassifications,
        ConditionNotSentToMe,
        ConditionSentCcMe,
        ConditionSentOnlyToMe,
        ConditionSentToAddresses,
        ConditionSentToMe,
        ConditionSentToOrCcMe,
        ConditionSensitivity,
        ConditionWithinDateRange,
        ConditionWithinSizeRange,
        ExceptionCategories,
        ExceptionContainsBodyStrings,
        ExceptionContainsHeaderStrings,
        ExceptionContainsRecipientStrings,
        ExceptionContainsSenderStrings,
        ExceptionContainsSubjectOrBodyStrings,
        ExceptionContainsSubjectStrings,
        ExceptionFlaggedForAction,
        ExceptionFromAddresses,
        ExceptionFromConnectedAccounts,
        ExceptionHasAttachments,
        ExceptionImportance,
        ExceptionIsApprovalRequest,
        ExceptionIsAutomaticForward,
        ExceptionIsAutomaticReply,
        ExceptionIsEncrypted,
        ExceptionIsMeetingRequest,
        ExceptionIsMeetingResponse,
        ExceptionIsNonDeliveryReport,
        ExceptionIsPermissionControlled,
        ExceptionIsRead,
        ExceptionIsSigned,
        ExceptionIsVoicemail,
        ExceptionItemClasses,
        ExceptionMessageClassifications,
        ExceptionNotSentToMe,
        ExceptionSentCcMe,
        ExceptionSentOnlyToMe,
        ExceptionSentToAddresses,
        ExceptionSentToMe,
        ExceptionSentToOrCcMe,
        ExceptionSensitivity,
        ExceptionWithinDateRange,
        ExceptionWithinSizeRange,
        ActionCategories,
        ActionCopyToFolder,
        ActionDelete,
        ActionForwardAsAttachmentToRecipients,
        ActionForwardToRecipients,
        ActionImportance,
        ActionMarkAsRead,
        ActionMoveToFolder,
        ActionPermanentDelete,
        ActionRedirectToRecipients,
        ActionSendSMSAlertToRecipients,
        ActionServerReplyWithMessage,
        ActionStopProcessingRules,
        IsEnabled,
        IsInError,
        Conditions,
        Exceptions
    }
    enum RuleErrorCode {
        ADOperationFailure,
        ConnectedAccountNotFound,
        CreateWithRuleId,
        EmptyValueFound,
        DuplicatedPriority,
        DuplicatedOperationOnTheSameRule,
        FolderDoesNotExist,
        InvalidAddress,
        InvalidDateRange,
        InvalidFolderId,
        InvalidSizeRange,
        InvalidValue,
        MessageClassificationNotFound,
        MissingAction,
        MissingParameter,
        MissingRangeValue,
        NotSettable,
        RecipientDoesNotExist,
        RuleNotFound,
        SizeLessThanZero,
        StringValueTooBig,
        UnsupportedAddress,
        UnexpectedError,
        UnsupportedRule
    }
    enum SearchFolderTraversal {
        Shallow,
        Deep
    }
    enum SearchPageDirection {
        Next,
        Previous
    }
    enum SearchResultType {
        StatisticsOnly,
        PreviewOnly
    }
    enum SendCancellationsMode {
        SendToNone,
        SendOnlyToAll,
        SendToAllAndSaveCopy
    }
    enum SendInvitationsMode {
        SendToNone,
        SendOnlyToAll,
        SendToAllAndSaveCopy
    }
    enum SendInvitationsOrCancellationsMode {
        SendToNone,
        SendOnlyToAll,
        SendOnlyToChanged,
        SendToAllAndSaveCopy,
        SendToChangedAndSaveCopy
    }
    enum SendPrompt {
        None,
        Send,
        VotingOption
    }
    enum Sensitivity {
        Normal,
        Personal,
        Private,
        Confidential
    }
    enum ServiceError {
        NoError,
        ErrorAccessDenied,
        ErrorAccessModeSpecified,
        ErrorAccountDisabled,
        ErrorAddDelegatesFailed,
        ErrorAddressSpaceNotFound,
        ErrorADOperation,
        ErrorADSessionFilter,
        ErrorADUnavailable,
        ErrorAffectedTaskOccurrencesRequired,
        ErrorApplyConversationActionFailed,
        ErrorArchiveMailboxNotEnabled,
        ErrorArchiveFolderPathCreation,
        ErrorArchiveMailboxServiceDiscoveryFailed,
        ErrorAttachmentNestLevelLimitExceeded,
        ErrorAttachmentSizeLimitExceeded,
        ErrorAutoDiscoverFailed,
        ErrorAvailabilityConfigNotFound,
        ErrorBatchProcessingStopped,
        ErrorCalendarCannotMoveOrCopyOccurrence,
        ErrorCalendarCannotUpdateDeletedItem,
        ErrorCalendarCannotUseIdForOccurrenceId,
        ErrorCalendarCannotUseIdForRecurringMasterId,
        ErrorCalendarDurationIsTooLong,
        ErrorCalendarEndDateIsEarlierThanStartDate,
        ErrorCalendarFolderIsInvalidForCalendarView,
        ErrorCalendarInvalidAttributeValue,
        ErrorCalendarInvalidDayForTimeChangePattern,
        ErrorCalendarInvalidDayForWeeklyRecurrence,
        ErrorCalendarInvalidPropertyState,
        ErrorCalendarInvalidPropertyValue,
        ErrorCalendarInvalidRecurrence,
        ErrorCalendarInvalidTimeZone,
        ErrorCalendarIsCancelledForAccept,
        ErrorCalendarIsCancelledForDecline,
        ErrorCalendarIsCancelledForRemove,
        ErrorCalendarIsCancelledForTentative,
        ErrorCalendarIsDelegatedForAccept,
        ErrorCalendarIsDelegatedForDecline,
        ErrorCalendarIsDelegatedForRemove,
        ErrorCalendarIsDelegatedForTentative,
        ErrorCalendarIsNotOrganizer,
        ErrorCalendarIsOrganizerForAccept,
        ErrorCalendarIsOrganizerForDecline,
        ErrorCalendarIsOrganizerForRemove,
        ErrorCalendarIsOrganizerForTentative,
        ErrorCalendarMeetingRequestIsOutOfDate,
        ErrorCalendarOccurrenceIndexIsOutOfRecurrenceRange,
        ErrorCalendarOccurrenceIsDeletedFromRecurrence,
        ErrorCalendarOutOfRange,
        ErrorCalendarViewRangeTooBig,
        ErrorCallerIsInvalidADAccount,
        ErrorCannotArchiveCalendarContactTaskFolderException,
        ErrorCannotArchiveItemsInArchiveMailbox,
        ErrorCannotArchiveItemsInPublicFolders,
        ErrorCannotCreateCalendarItemInNonCalendarFolder,
        ErrorCannotCreateContactInNonContactFolder,
        ErrorCannotCreatePostItemInNonMailFolder,
        ErrorCannotCreateTaskInNonTaskFolder,
        ErrorCannotDeleteObject,
        ErrorCannotDeleteTaskOccurrence,
        ErrorCannotDisableMandatoryExtension,
        ErrorCannotEmptyFolder,
        ErrorCannotGetExternalEcpUrl,
        ErrorCannotGetSourceFolderPath,
        ErrorCannotOpenFileAttachment,
        ErrorCannotSetCalendarPermissionOnNonCalendarFolder,
        ErrorCannotSetNonCalendarPermissionOnCalendarFolder,
        ErrorCannotSetPermissionUnknownEntries,
        ErrorCannotSpecifySearchFolderAsSourceFolder,
        ErrorCannotUseFolderIdForItemId,
        ErrorCannotUseItemIdForFolderId,
        ErrorChangeKeyRequired,
        ErrorChangeKeyRequiredForWriteOperations,
        ErrorClientDisconnected,
        ErrorConnectionFailed,
        ErrorContainsFilterWrongType,
        ErrorContentConversionFailed,
        ErrorCorruptData,
        ErrorCreateItemAccessDenied,
        ErrorCreateManagedFolderPartialCompletion,
        ErrorCreateSubfolderAccessDenied,
        ErrorCrossMailboxMoveCopy,
        ErrorCrossSiteRequest,
        ErrorDataSizeLimitExceeded,
        ErrorDataSourceOperation,
        ErrorDelegateAlreadyExists,
        ErrorDelegateCannotAddOwner,
        ErrorDelegateMissingConfiguration,
        ErrorDelegateNoUser,
        ErrorDelegateValidationFailed,
        ErrorDeleteDistinguishedFolder,
        ErrorDeleteItemsFailed,
        ErrorDistinguishedUserNotSupported,
        ErrorDistributionListMemberNotExist,
        ErrorDuplicateInputFolderNames,
        ErrorDuplicateLegacyDistinguishedName,
        ErrorDuplicateSOAPHeader,
        ErrorDuplicateUserIdsSpecified,
        ErrorEmailAddressMismatch,
        ErrorEventNotFound,
        ErrorExceededConnectionCount,
        ErrorExceededFindCountLimit,
        ErrorExceededSubscriptionCount,
        ErrorExpiredSubscription,
        ErrorExtensionNotFound,
        ErrorFolderCorrupt,
        ErrorFolderExists,
        ErrorFolderNotFound,
        ErrorFolderPropertRequestFailed,
        ErrorFolderSave,
        ErrorFolderSaveFailed,
        ErrorFolderSavePropertyError,
        ErrorFreeBusyDLLimitReached,
        ErrorFreeBusyGenerationFailed,
        ErrorGetServerSecurityDescriptorFailed,
        ErrorImContactLimitReached,
        ErrorImGroupDisplayNameAlreadyExists,
        ErrorImGroupLimitReached,
        ErrorImpersonateUserDenied,
        ErrorImpersonationDenied,
        ErrorImpersonationFailed,
        ErrorInboxRulesValidationError,
        ErrorIncorrectSchemaVersion,
        ErrorIncorrectUpdatePropertyCount,
        ErrorIndividualMailboxLimitReached,
        ErrorInsufficientResources,
        ErrorInternalServerError,
        ErrorInternalServerTransientError,
        ErrorInvalidAccessLevel,
        ErrorInvalidArgument,
        ErrorInvalidAttachmentId,
        ErrorInvalidAttachmentSubfilter,
        ErrorInvalidAttachmentSubfilterTextFilter,
        ErrorInvalidAuthorizationContext,
        ErrorInvalidChangeKey,
        ErrorInvalidClientSecurityContext,
        ErrorInvalidCompleteDate,
        ErrorInvalidContactEmailAddress,
        ErrorInvalidContactEmailIndex,
        ErrorInvalidCrossForestCredentials,
        ErrorInvalidDelegatePermission,
        ErrorInvalidDelegateUserId,
        ErrorInvalidExchangeImpersonationHeaderData,
        ErrorInvalidExcludesRestriction,
        ErrorInvalidExpressionTypeForSubFilter,
        ErrorInvalidExtendedProperty,
        ErrorInvalidExtendedPropertyValue,
        ErrorInvalidExternalSharingInitiator,
        ErrorInvalidExternalSharingSubscriber,
        ErrorInvalidFederatedOrganizationId,
        ErrorInvalidFolderId,
        ErrorInvalidFolderTypeForOperation,
        ErrorInvalidFractionalPagingParameters,
        ErrorInvalidFreeBusyViewType,
        ErrorInvalidGetSharingFolderRequest,
        ErrorInvalidId,
        ErrorInvalidImContactId,
        ErrorInvalidImDistributionGroupSmtpAddress,
        ErrorInvalidImGroupId,
        ErrorInvalidIdEmpty,
        ErrorInvalidIdMalformed,
        ErrorInvalidIdMalformedEwsLegacyIdFormat,
        ErrorInvalidIdMonikerTooLong,
        ErrorInvalidIdNotAnItemAttachmentId,
        ErrorInvalidIdReturnedByResolveNames,
        ErrorInvalidIdStoreObjectIdTooLong,
        ErrorInvalidIdTooManyAttachmentLevels,
        ErrorInvalidIdXml,
        ErrorInvalidIndexedPagingParameters,
        ErrorInvalidInternetHeaderChildNodes,
        ErrorInvalidItemForOperationAcceptItem,
        ErrorInvalidItemForOperationArchiveItem,
        ErrorInvalidItemForOperationCancelItem,
        ErrorInvalidItemForOperationCreateItem,
        ErrorInvalidItemForOperationCreateItemAttachment,
        ErrorInvalidItemForOperationDeclineItem,
        ErrorInvalidItemForOperationExpandDL,
        ErrorInvalidItemForOperationRemoveItem,
        ErrorInvalidItemForOperationSendItem,
        ErrorInvalidItemForOperationTentative,
        ErrorInvalidLogonType,
        ErrorInvalidMailbox,
        ErrorInvalidManagedFolderProperty,
        ErrorInvalidManagedFolderQuota,
        ErrorInvalidManagedFolderSize,
        ErrorInvalidMergedFreeBusyInterval,
        ErrorInvalidNameForNameResolution,
        ErrorInvalidNetworkServiceContext,
        ErrorInvalidOofParameter,
        ErrorInvalidOperation,
        ErrorInvalidOrganizationRelationshipForFreeBusy,
        ErrorInvalidPagingMaxRows,
        ErrorInvalidParentFolder,
        ErrorInvalidPercentCompleteValue,
        ErrorInvalidPermissionSettings,
        ErrorInvalidPhoneCallId,
        ErrorInvalidPhoneNumber,
        ErrorInvalidPropertyAppend,
        ErrorInvalidPropertyDelete,
        ErrorInvalidPropertyForExists,
        ErrorInvalidPropertyForOperation,
        ErrorInvalidPropertyRequest,
        ErrorInvalidPropertySet,
        ErrorInvalidPropertyUpdateSentMessage,
        ErrorInvalidProxySecurityContext,
        ErrorInvalidPullSubscriptionId,
        ErrorInvalidPushSubscriptionUrl,
        ErrorInvalidRecipients,
        ErrorInvalidRecipientSubfilter,
        ErrorInvalidRecipientSubfilterComparison,
        ErrorInvalidRecipientSubfilterOrder,
        ErrorInvalidRecipientSubfilterTextFilter,
        ErrorInvalidReferenceItem,
        ErrorInvalidRequest,
        ErrorInvalidRestriction,
        ErrorInvalidRetentionTagTypeMismatch,
        ErrorInvalidRetentionTagInvisible,
        ErrorInvalidRetentionTagInheritance,
        ErrorInvalidRetentionTagIdGuid,
        ErrorInvalidRoutingType,
        ErrorInvalidScheduledOofDuration,
        ErrorInvalidSchemaVersionForMailboxVersion,
        ErrorInvalidSecurityDescriptor,
        ErrorInvalidSendItemSaveSettings,
        ErrorInvalidSerializedAccessToken,
        ErrorInvalidServerVersion,
        ErrorInvalidSharingData,
        ErrorInvalidSharingMessage,
        ErrorInvalidSid,
        ErrorInvalidSIPUri,
        ErrorInvalidSmtpAddress,
        ErrorInvalidSubfilterType,
        ErrorInvalidSubfilterTypeNotAttendeeType,
        ErrorInvalidSubfilterTypeNotRecipientType,
        ErrorInvalidSubscription,
        ErrorInvalidSubscriptionRequest,
        ErrorInvalidSyncStateData,
        ErrorInvalidTimeInterval,
        ErrorInvalidUserInfo,
        ErrorInvalidUserOofSettings,
        ErrorInvalidUserPrincipalName,
        ErrorInvalidUserSid,
        ErrorInvalidUserSidMissingUPN,
        ErrorInvalidValueForProperty,
        ErrorInvalidWatermark,
        ErrorIPGatewayNotFound,
        ErrorIrresolvableConflict,
        ErrorItemCorrupt,
        ErrorItemNotFound,
        ErrorItemPropertyRequestFailed,
        ErrorItemSave,
        ErrorItemSavePropertyError,
        ErrorLegacyMailboxFreeBusyViewTypeNotMerged,
        ErrorLocalServerObjectNotFound,
        ErrorLogonAsNetworkServiceFailed,
        ErrorMailboxConfiguration,
        ErrorMailboxDataArrayEmpty,
        ErrorMailboxDataArrayTooBig,
        ErrorMailboxFailover,
        ErrorMailboxHoldNotFound,
        ErrorMailboxLogonFailed,
        ErrorMailboxMoveInProgress,
        ErrorMailboxStoreUnavailable,
        ErrorMailRecipientNotFound,
        ErrorMailTipsDisabled,
        ErrorManagedFolderAlreadyExists,
        ErrorManagedFolderNotFound,
        ErrorManagedFoldersRootFailure,
        ErrorMeetingSuggestionGenerationFailed,
        ErrorMessageDispositionRequired,
        ErrorMessageSizeExceeded,
        ErrorMessageTrackingNoSuchDomain,
        ErrorMessageTrackingPermanentError,
        ErrorMessageTrackingTransientError,
        ErrorMimeContentConversionFailed,
        ErrorMimeContentInvalid,
        ErrorMimeContentInvalidBase64String,
        ErrorMissedNotificationEvents,
        ErrorMissingArgument,
        ErrorMissingEmailAddress,
        ErrorMissingEmailAddressForManagedFolder,
        ErrorMissingInformationEmailAddress,
        ErrorMissingInformationReferenceItemId,
        ErrorMissingInformationSharingFolderId,
        ErrorMissingItemForCreateItemAttachment,
        ErrorMissingManagedFolderId,
        ErrorMissingRecipients,
        ErrorMissingUserIdInformation,
        ErrorMoreThanOneAccessModeSpecified,
        ErrorMoveCopyFailed,
        ErrorMoveDistinguishedFolder,
        ErrorMultiLegacyMailboxAccess,
        ErrorNameResolutionMultipleResults,
        ErrorNameResolutionNoMailbox,
        ErrorNameResolutionNoResults,
        ErrorNewEventStreamConnectionOpened,
        ErrorNoApplicableProxyCASServersAvailable,
        ErrorNoCalendar,
        ErrorNoDestinationCASDueToKerberosRequirements,
        ErrorNoDestinationCASDueToSSLRequirements,
        ErrorNoDestinationCASDueToVersionMismatch,
        ErrorNoFolderClassOverride,
        ErrorNoFreeBusyAccess,
        ErrorNonExistentMailbox,
        ErrorNonPrimarySmtpAddress,
        ErrorNoPropertyTagForCustomProperties,
        ErrorNoPublicFolderReplicaAvailable,
        ErrorNoPublicFolderServerAvailable,
        ErrorNoRespondingCASInDestinationSite,
        ErrorNotAllowedExternalSharingByPolicy,
        ErrorNotDelegate,
        ErrorNotEnoughMemory,
        ErrorNotSupportedSharingMessage,
        ErrorObjectTypeChanged,
        ErrorOccurrenceCrossingBoundary,
        ErrorOccurrenceTimeSpanTooBig,
        ErrorOperationNotAllowedWithPublicFolderRoot,
        ErrorOrganizationNotFederated,
        ErrorOutlookRuleBlobExists,
        ErrorParentFolderIdRequired,
        ErrorParentFolderNotFound,
        ErrorPasswordChangeRequired,
        ErrorPasswordExpired,
        ErrorPermissionNotAllowedByPolicy,
        ErrorPhoneNumberNotDialable,
        ErrorPropertyUpdate,
        ErrorPropertyValidationFailure,
        ErrorProxiedSubscriptionCallFailure,
        ErrorProxyCallFailed,
        ErrorProxyGroupSidLimitExceeded,
        ErrorProxyRequestNotAllowed,
        ErrorProxyRequestProcessingFailed,
        ErrorProxyServiceDiscoveryFailed,
        ErrorProxyTokenExpired,
        ErrorPublicFolderRequestProcessingFailed,
        ErrorPublicFolderServerNotFound,
        ErrorQueryFilterTooLong,
        ErrorQuotaExceeded,
        ErrorReadEventsFailed,
        ErrorReadReceiptNotPending,
        ErrorRecurrenceEndDateTooBig,
        ErrorRecurrenceHasNoOccurrence,
        ErrorRemoveDelegatesFailed,
        ErrorRequestAborted,
        ErrorRequestStreamTooBig,
        ErrorRequiredPropertyMissing,
        ErrorResolveNamesInvalidFolderType,
        ErrorResolveNamesOnlyOneContactsFolderAllowed,
        ErrorResponseSchemaValidation,
        ErrorRestrictionTooComplex,
        ErrorRestrictionTooLong,
        ErrorResultSetTooBig,
        ErrorRulesOverQuota,
        ErrorSavedItemFolderNotFound,
        ErrorSchemaValidation,
        ErrorSearchFolderNotInitialized,
        ErrorSendAsDenied,
        ErrorSendMeetingCancellationsRequired,
        ErrorSendMeetingInvitationsOrCancellationsRequired,
        ErrorSendMeetingInvitationsRequired,
        ErrorSentMeetingRequestUpdate,
        ErrorSentTaskRequestUpdate,
        ErrorServerBusy,
        ErrorServiceDiscoveryFailed,
        ErrorSharingNoExternalEwsAvailable,
        ErrorSharingSynchronizationFailed,
        ErrorStaleObject,
        ErrorSubmissionQuotaExceeded,
        ErrorSubscriptionAccessDenied,
        ErrorSubscriptionDelegateAccessNotSupported,
        ErrorSubscriptionNotFound,
        ErrorSubscriptionUnsubscribed,
        ErrorSyncFolderNotFound,
        ErrorTeamMailboxNotFound,
        ErrorTeamMailboxNotLinkedToSharePoint,
        ErrorTeamMailboxUrlValidationFailed,
        ErrorTeamMailboxNotAuthorizedOwner,
        ErrorTeamMailboxActiveToPendingDelete,
        ErrorTeamMailboxFailedSendingNotifications,
        ErrorTeamMailboxErrorUnknown,
        ErrorTimeIntervalTooBig,
        ErrorTimeoutExpired,
        ErrorTimeZone,
        ErrorToFolderNotFound,
        ErrorTokenSerializationDenied,
        ErrorUnableToGetUserOofSettings,
        ErrorUnableToRemoveImContactFromGroup,
        ErrorUnifiedMessagingDialPlanNotFound,
        ErrorUnifiedMessagingRequestFailed,
        ErrorUnifiedMessagingServerNotFound,
        ErrorUnsupportedCulture,
        ErrorUnsupportedMapiPropertyType,
        ErrorUnsupportedMimeConversion,
        ErrorUnsupportedPathForQuery,
        ErrorUnsupportedPathForSortGroup,
        ErrorUnsupportedPropertyDefinition,
        ErrorUnsupportedQueryFilter,
        ErrorUnsupportedRecurrence,
        ErrorUnsupportedSubFilter,
        ErrorUnsupportedTypeForConversion,
        ErrorUpdateDelegatesFailed,
        ErrorUpdatePropertyMismatch,
        ErrorUserNotAllowedByPolicy,
        ErrorUserNotUnifiedMessagingEnabled,
        ErrorUserWithoutFederatedProxyAddress,
        ErrorValueOutOfRange,
        ErrorVirusDetected,
        ErrorVirusMessageDeleted,
        ErrorVoiceMailNotImplemented,
        ErrorWebRequestInInvalidState,
        ErrorWin32InteropError,
        ErrorWorkingHoursSaveFailed,
        ErrorWorkingHoursXmlMalformed,
        ErrorWrongServerVersion,
        ErrorWrongServerVersionDelegate,
        ErrorInvalidClientAccessTokenRequest,
        ErrorInvalidManagementRoleHeader,
        ErrorSearchQueryHasTooManyKeywords,
        ErrorSearchTooManyMailboxes,
        ErrorInvalidRetentionTagNone,
        ErrorDiscoverySearchesDisabled,
        ErrorCalendarSeekToConditionNotSupported,
        ErrorArchiveMailboxSearchFailed,
        ErrorGetRemoteArchiveFolderFailed,
        ErrorFindRemoteArchiveFolderFailed,
        ErrorGetRemoteArchiveItemFailed,
        ErrorExportRemoteArchiveItemsFailed,
        ErrorClientIntentInvalidStateDefinition,
        ErrorClientIntentNotFound,
        ErrorContentIndexingNotEnabled,
        ErrorDeleteUnifiedMessagingPromptFailed,
        ErrorLocationServicesDisabled,
        ErrorLocationServicesInvalidRequest,
        ErrorLocationServicesRequestFailed,
        ErrorLocationServicesRequestTimedOut,
        ErrorWeatherServiceDisabled,
        ErrorMailboxScopeNotAllowedWithoutQueryString,
        ErrorNoSpeechDetected,
        ErrorPromptPublishingOperationFailed,
        ErrorPublicFolderMailboxDiscoveryFailed,
        ErrorPublicFolderOperationFailed,
        ErrorPublicFolderSyncException,
        ErrorRecipientNotFound,
        ErrorRecognizerNotInstalled,
        ErrorSpeechGrammarError,
        ErrorTooManyObjectsOpened,
        ErrorUMServerUnavailable,
        ErrorUnifiedMessagingPromptNotFound,
        ErrorUnifiedMessagingReportDataNotFound,
        ErrorInvalidPhotoSize,
        ErrorCalendarIsGroupMailboxForAccept,
        ErrorCalendarIsGroupMailboxForDecline,
        ErrorCalendarIsGroupMailboxForTentative,
        ErrorCalendarIsGroupMailboxForSuppressReadReceipt
    }
    enum ServiceErrorHandling {
        ReturnErrors,
        ThrowOnError
    }
    enum ServiceObjectType {
        Folder,
        Item,
        Conversation
    }
    enum ServiceResult {
        Success,
        Warning,
        Error
    }
    enum SetClientExtensionActionId {
        Install,
        Uninstall,
        Configure
    }
    enum SortDirection {
        Ascending,
        Descending
    }
    enum StandardUser {
        Default,
        Anonymous
    }
    enum SuggestionQuality {
        Excellent,
        Good,
        Fair,
        Poor
    }
    enum SyncFolderItemsScope {
        NormalItems,
        NormalAndAssociatedItems
    }
    enum TaskDelegationState {
        NoDelegation,
        Unknown,
        Accepted,
        Declined
    }
    enum TaskMode {
        Normal,
        Request,
        RequestAccepted,
        RequestDeclined,
        Update,
        SelfDelegated
    }
    enum TaskStatus {
        NotStarted,
        InProgress,
        Completed,
        WaitingOnOthers,
        Deferred
    }
    enum TeamMailboxLifecycleState {
        Active,
        Closed,
        Unlinked,
        PendingDelete
    }
    enum TraceFlags {
        None = 0,
        EwsRequest = 1,
        EwsResponse = 2,
        EwsResponseHttpHeaders = 4,
        AutodiscoverRequest = 8,
        AutodiscoverResponse = 16,
        AutodiscoverResponseHttpHeaders = 32,
        AutodiscoverConfiguration = 64,
        DebugMessage = 128,
        EwsRequestHttpHeaders = 256,
        AutodiscoverRequestHttpHeaders = 512,
        All = 9223372036854775807
    }
    enum UserConfigurationProperties {
        Id = 1,
        Dictionary = 2,
        XmlData = 4,
        BinaryData = 8,
        All = 15
    }
    enum UserConfigurationDictionaryObjectType {
        DateTime,
        Boolean,
        Byte,
        String,
        Integer32,
        UnsignedInteger32,
        Integer64,
        UnsignedInteger64,
        StringArray,
        ByteArray
    }
    enum ViewFilter {
        All,
        Flagged,
        HasAttachment,
        ToOrCcMe,
        Unread,
        TaskActive,
        TaskOverdue,
        TaskCompleted,
        Suggestions,
        SuggestionsRespond,
        SuggestionsDelete
    }
    enum WellKnownFolderName {
        Calendar,
        Contacts,
        DeletedItems,
        Drafts,
        Inbox,
        Journal,
        Notes,
        Outbox,
        SentItems,
        Tasks,
        MsgFolderRoot,
        PublicFoldersRoot,
        Root,
        JunkEmail,
        SearchFolders,
        VoiceMail,
        RecoverableItemsRoot,
        RecoverableItemsDeletions,
        RecoverableItemsVersions,
        RecoverableItemsPurges,
        ArchiveRoot,
        ArchiveMsgFolderRoot,
        ArchiveDeletedItems,
        ArchiveRecoverableItemsRoot,
        ArchiveRecoverableItemsDeletions,
        ArchiveRecoverableItemsVersions,
        ArchiveRecoverableItemsPurges,
        SyncIssues,
        Conflicts,
        LocalFailures,
        ServerFailures,
        RecipientCache,
        QuickContacts,
        ConversationHistory,
        ToDoSearch
    }
    enum XmlNamespace {
        NotSpecified,
        Messages,
        Types,
        Errors,
        Soap,
        Soap12,
        XmlSchemaInstance,
        PassportSoapFault,
        WSTrustFebruary2005,
        WSAddressing,
        Autodiscover
    }
    class ServiceRemoteException extends Exception {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class AccountIsLockedException extends ServiceRemoteException {
        AccountUnlockUrl: Uri = null;
        constructor(message: string, accountUnlockUrl: Uri, innerException: Exception) {
            super(message, innerException);
            this.AccountUnlockUrl = accountUnlockUrl;
        }
    }
    class ServiceLocalException extends Exception {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class AutodiscoverLocalException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class BatchServiceResponseException<TResponse> extends ServiceRemoteException {
        private responses: ServiceResponseCollection<TResponse> = null;
        get ServiceResponses(): ServiceResponseCollection<TResponse> {
            return this.responses;
        }
        constructor(serviceResponses: ServiceResponseCollection<TResponse>, message: string);
        constructor(serviceResponses: ServiceResponseCollection<TResponse>, message: string, innerException: Exception);
        constructor(serviceResponses: ServiceResponseCollection<TResponse>, message: string, innerException?: Exception) {
            super(message);
            if (arguments.length === 2 && (serviceResponses === null || serviceResponses instanceof ServiceResponseCollection) && (message === null || message.constructor === String)) {
                this.constructor_0(serviceResponses, message);
                return;
            }
            this.constructor_1(serviceResponses, message, innerException);
        }
        private constructor_0(serviceResponses: ServiceResponseCollection<TResponse>, message: string): void {
            EwsUtilities.Assert(serviceResponses !== null, "MultiServiceResponseException.ctor", "serviceResponses is null");
            this.responses = serviceResponses;
        }
        private constructor_1(serviceResponses: ServiceResponseCollection<TResponse>, message: string, innerException: Exception): void {
            EwsUtilities.Assert(serviceResponses !== null, "MultiServiceResponseException.ctor", "serviceResponses is null");
            this.responses = serviceResponses;
        }
    }
    class CreateAttachmentException extends BatchServiceResponseException<CreateAttachmentResponse>
    {
        constructor(serviceResponses: ServiceResponseCollection<CreateAttachmentResponse>, message: string);
        constructor(serviceResponses: ServiceResponseCollection<CreateAttachmentResponse>, message: string, innerException: Exception);
        constructor(serviceResponses: ServiceResponseCollection<CreateAttachmentResponse>, message: string, innerException?: Exception) {
            if (arguments.length === 2 && (serviceResponses === null || serviceResponses instanceof ServiceResponseCollection) && (message === null || message.constructor === String)) {
                super(serviceResponses, message);
                this.constructor_0(serviceResponses, message);
                return;
            }
            super(serviceResponses, message, innerException);
            this.constructor_1(serviceResponses, message, innerException);
        }
        private constructor_0(serviceResponses: ServiceResponseCollection<CreateAttachmentResponse>, message: string): void {
        }
        private constructor_1(serviceResponses: ServiceResponseCollection<CreateAttachmentResponse>, message: string, innerException: Exception): void {
        }
    }
    class DeleteAttachmentException extends BatchServiceResponseException<DeleteAttachmentResponse>
    {
        constructor(serviceResponses: ServiceResponseCollection<DeleteAttachmentResponse>, message: string);
        constructor(serviceResponses: ServiceResponseCollection<DeleteAttachmentResponse>, message: string, innerException: Exception);
        constructor(serviceResponses: ServiceResponseCollection<DeleteAttachmentResponse>, message: string, innerException?: Exception) {
            if (arguments.length === 2 && (serviceResponses === null || serviceResponses instanceof ServiceResponseCollection) && (message === null || message.constructor === String)) {
                super(serviceResponses, message);
                this.constructor_0(serviceResponses, message);
                return;
            }
            super(serviceResponses, message, innerException);
            this.constructor_1(serviceResponses, message, innerException);
        }
        private constructor_0(serviceResponses: ServiceResponseCollection<DeleteAttachmentResponse>, message: string): void {
        }
        private constructor_1(serviceResponses: ServiceResponseCollection<DeleteAttachmentResponse>, message: string, innerException: Exception): void {
        }
    }
    class JsonDeserializationNotImplementedException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message?: string) {
            if (arguments.length === 0) {
                super(Strings.JsonDeserializationNotImplemented);
                this.constructor_0();
                return;
            }
            super(message);
            this.constructor_1(message);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
    }
    class JsonSerializationNotImplementedException extends Exception {
        constructor() {
            super(Strings.JsonSerializationNotImplemented);
        }
    }
    class PropertyException extends ServiceLocalException {
        private name: string = null;
        get Name(): string {
            return this.name;
        }
        constructor(name: string);
        constructor(message: string, name: string);
        constructor(message: string, name: string, innerException: Exception);
        constructor(nameOrMessage: string, name?: string, innerException?: Exception) {
            super();
            if (arguments.length === 1 && (nameOrMessage === null || nameOrMessage.constructor === String)) {
                this.constructor_0(nameOrMessage);
                return;
            }
            if (arguments.length === 2 && (nameOrMessage === null || nameOrMessage.constructor === String) && (name === null || name.constructor === String)) {
                this.constructor_1(nameOrMessage, name);
                return;
            }
            this.constructor_2(nameOrMessage, name, innerException);
        }
        private constructor_0(name: string): void {
            this.name = name;
        }
        private constructor_1(message: string, name: string): void {
            this.name = name;
        }
        private constructor_2(message: string, name: string, innerException: Exception): void {
            this.name = name;
        }
    }
    class ServiceResponseException extends ServiceRemoteException {
        private static ExceptionClassKey: string = "ExceptionClass";
        private static ExceptionMessageKey: string = "ExceptionMessage";
        private static StackTraceKey: string = "StackTrace";
        private response: ServiceResponse = null;
        get Response(): ServiceResponse {
            return this.response;
        }
        get ErrorCode(): ServiceError {
            return this.response.ErrorCode;
        }
        get Message(): string {
            var text: string;
            var text2: string;
            var text3: string;
            if (this.Response.ErrorCode === ServiceError.ErrorInternalServerError && (() => {
                var _p0 = [
                    text
                ];
                var _r = this.Response.ErrorDetails.TryGetValue("ExceptionClass", _p0);
                text = _p0[0];
                return _r;
            })() && (() => {
                    var _p0 = [
                        text2
                    ];
                    var _r = this.Response.ErrorDetails.TryGetValue("ExceptionMessage", _p0);
                    text2 = _p0[0];
                    return _r;
                })() && (() => {
                    var _p0 = [
                        text3
                    ];
                    var _r = this.Response.ErrorDetails.TryGetValue("StackTrace", _p0);
                    text3 = _p0[0];
                    return _r;
                })()) {
                return NString.Format(Strings.ServerErrorAndStackTraceDetails, [
                    this.Response.ErrorMessage, text, text2, text3
                ]);
            }
            return this.Response.ErrorMessage;
        }
        constructor(response: ServiceResponse) {
            super();
            this.response = response;
        }
    }
    class ServerBusyException extends ServiceResponseException {
        private static BackOffMillisecondsKey: string = "BackOffMilliseconds";
        private backOffMilliseconds: number = 0;
        get BackOffMilliseconds(): number {
            return this.backOffMilliseconds;
        }
        constructor(response: ServiceResponse) {
            super(response);
            if (response.ErrorDetails !== null && response.ErrorDetails.ContainsKey("BackOffMilliseconds")) {
                (() => {
                    var _p0 = [
                        this.backOffMilliseconds
                    ];
                    var _r = NNumber.TryParse(response.ErrorDetails.get_Item("BackOffMilliseconds"), _p0);
                    this.backOffMilliseconds = _p0[0];
                    return _r;
                })();
            }
        }
    }
    class ServiceJsonDeserializationException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class ServiceObjectPropertyException extends PropertyException {
        private propertyDefinition: PropertyDefinitionBase = null;
        get PropertyDefinition(): PropertyDefinitionBase {
            return this.propertyDefinition;
        }
        constructor(propertyDefinition: PropertyDefinitionBase);
        constructor(message: string, propertyDefinition: PropertyDefinitionBase);
        constructor(message: string, propertyDefinition: PropertyDefinitionBase, innerException: Exception);
        constructor(propertyDefinitionOrMessage: any, propertyDefinition?: PropertyDefinitionBase, innerException?: Exception) {
            super(propertyDefinitionOrMessage.GetPrintableName());
            if (arguments.length === 1 && (propertyDefinitionOrMessage === null || propertyDefinitionOrMessage instanceof PropertyDefinitionBase)) {
                this.constructor_0(propertyDefinitionOrMessage);
                return;
            }
            if (arguments.length === 2 && (propertyDefinitionOrMessage === null || propertyDefinitionOrMessage.constructor === String) && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase)) {
                this.constructor_1(propertyDefinitionOrMessage, propertyDefinition);
                return;
            }
            this.constructor_2(propertyDefinitionOrMessage, propertyDefinition, innerException);
        }
        private constructor_0(propertyDefinition: PropertyDefinitionBase): void {
            this.propertyDefinition = propertyDefinition;
        }
        private constructor_1(message: string, propertyDefinition: PropertyDefinitionBase): void {
            this.propertyDefinition = propertyDefinition;
        }
        private constructor_2(message: string, propertyDefinition: PropertyDefinitionBase, innerException: Exception): void {
            this.propertyDefinition = propertyDefinition;
        }
    }
    class ServiceRequestException extends ServiceRemoteException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class ServiceValidationException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class ServiceVersionException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class ServiceXmlDeserializationException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class ServiceXmlSerializationException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class TimeZoneConversionException extends ServiceLocalException {
        constructor();
        constructor(message: string);
        constructor(message: string, innerException: Exception);
        constructor(message?: string, innerException?: Exception) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (message === null || message.constructor === String)) {
                super(message);
                this.constructor_1(message);
                return;
            }
            super(message, innerException);
            this.constructor_2(message, innerException);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
        }
        private constructor_2(message: string, innerException: Exception): void {
        }
    }
    class UpdateInboxRulesException extends ServiceRemoteException {
        private serviceResponse: ServiceResponse = null;
        private errors: RuleOperationErrorCollection = null;
        get ServiceResponse(): ServiceResponse {
            return this.serviceResponse;
        }
        get Errors(): RuleOperationErrorCollection {
            return this.errors;
        }
        get ErrorCode(): ServiceError {
            return this.serviceResponse.ErrorCode;
        }
        get ErrorMessage(): string {
            return this.serviceResponse.ErrorMessage;
        }
        constructor(serviceResponse: UpdateInboxRulesResponse, ruleOperations: IEnumerator<RuleOperation>) {
            super();
            this.serviceResponse = serviceResponse;
            this.errors = serviceResponse.Errors;
            var enumerator: IEnumerator<RuleOperationError> = this.errors.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: RuleOperationError = enumerator.Current;
                    current.SetOperationByIndex(ruleOperations);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
    }
    interface IFileAttachmentContentHandler {
        GetOutputStream(attachmentId: string): Stream;
    }
    interface ITraceListener {
        Trace(traceType: string, traceMessage: string): void;
    }
    class DiscoverySearchConfiguration {
        SearchId: string = null;
        SearchQuery: string = null;
        SearchableMailboxes: SearchableMailbox[] = null;
        InPlaceHoldIdentity: string = null;
        ManagedByOrganization: string = null;
        Language: string = null;
        static LoadFromXml(reader: EwsServiceXmlReader): DiscoverySearchConfiguration {
            var list: List<SearchableMailbox> = new List<SearchableMailbox>();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "DiscoverySearchConfiguration");
            var discoverySearchConfiguration: DiscoverySearchConfiguration = new DiscoverySearchConfiguration();
            discoverySearchConfiguration.SearchId = reader.ReadElementValue(XmlNamespace.Types, "SearchId");
            discoverySearchConfiguration.SearchQuery = NString.Empty;
            discoverySearchConfiguration.InPlaceHoldIdentity = NString.Empty;
            discoverySearchConfiguration.ManagedByOrganization = NString.Empty;
            discoverySearchConfiguration.Language = NString.Empty;
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "SearchQuery")) {
                    discoverySearchConfiguration.SearchQuery = reader.ReadElementValue(XmlNamespace.Types, "SearchQuery");
                    reader.ReadEndElementIfNecessary(XmlNamespace.Types, "SearchQuery");
                }
                else {
                    if (reader.IsStartElement(XmlNamespace.Types, "SearchableMailboxes")) {
                        if (!reader.IsEmptyElement) {
                            while (!reader.IsEndElement(XmlNamespace.Types, "SearchableMailboxes")) {
                                reader.Read();
                                if (reader.IsStartElement(XmlNamespace.Types, "SearchableMailbox")) {
                                    list.Add(SearchableMailbox.LoadFromXml(reader));
                                    reader.ReadEndElementIfNecessary(XmlNamespace.Types, "SearchableMailbox");
                                }
                            }
                        }
                    }
                    else {
                        if (reader.IsStartElement(XmlNamespace.Types, "InPlaceHoldIdentity")) {
                            discoverySearchConfiguration.InPlaceHoldIdentity = reader.ReadElementValue(XmlNamespace.Types, "InPlaceHoldIdentity");
                            reader.ReadEndElementIfNecessary(XmlNamespace.Types, "InPlaceHoldIdentity");
                        }
                        else {
                            if (reader.IsStartElement(XmlNamespace.Types, "ManagedByOrganization")) {
                                discoverySearchConfiguration.ManagedByOrganization = reader.ReadElementValue(XmlNamespace.Types, "ManagedByOrganization");
                                reader.ReadEndElementIfNecessary(XmlNamespace.Types, "ManagedByOrganization");
                            }
                            else {
                                if (!reader.IsStartElement(XmlNamespace.Types, "Language")) {
                                    break;
                                }
                                discoverySearchConfiguration.Language = reader.ReadElementValue(XmlNamespace.Types, "Language");
                                reader.ReadEndElementIfNecessary(XmlNamespace.Types, "Language");
                            }
                        }
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "DiscoverySearchConfiguration"));
            discoverySearchConfiguration.SearchableMailboxes = ((list.Count === 0) ? null : list.ToArray());
            return discoverySearchConfiguration;
        }
        static LoadFromJson(jsonObject: JsonObject): DiscoverySearchConfiguration {
            var list: List<SearchableMailbox> = new List<SearchableMailbox>();
            var discoverySearchConfiguration: DiscoverySearchConfiguration = new DiscoverySearchConfiguration();
            if (jsonObject.ContainsKey("SearchId")) {
                discoverySearchConfiguration.SearchId = jsonObject.ReadAsString("SearchId");
            }
            if (jsonObject.ContainsKey("InPlaceHoldIdentity")) {
                discoverySearchConfiguration.InPlaceHoldIdentity = jsonObject.ReadAsString("InPlaceHoldIdentity");
            }
            if (jsonObject.ContainsKey("ManagedByOrganization")) {
                discoverySearchConfiguration.ManagedByOrganization = jsonObject.ReadAsString("ManagedByOrganization");
            }
            if (jsonObject.ContainsKey("SearchQuery")) {
                discoverySearchConfiguration.SearchQuery = jsonObject.ReadAsString("SearchQuery");
            }
            if (jsonObject.ContainsKey("SearchableMailboxes")) {
                var array: any[] = jsonObject.ReadAsArray("SearchableMailboxes");
                for (var i: number = 0; i < array.length; i = i + 1) {
                    var obj: any = array[i];
                    var jsonObject2: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    list.Add(SearchableMailbox.LoadFromJson(jsonObject2));
                }
            }
            if (jsonObject.ContainsKey("Language")) {
                discoverySearchConfiguration.Language = jsonObject.ReadAsString("Language");
            }
            discoverySearchConfiguration.SearchableMailboxes = ((list.Count === 0) ? null : list.ToArray());
            return discoverySearchConfiguration;
        }
        constructor() {
            super();
        }
    }
    class ExtendedAttributes extends List<ExtendedAttribute>
    {
        constructor() {
            super();
        }
    }
    class ExtendedAttribute {
        Name: string = null;
        Value: string = null;
        constructor();
        constructor(name: string, value: string);
        constructor(name?: string, value?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(name, value);
        }
        private constructor_0(): void {
        }
        private constructor_1(name: string, value: string): void {
            this.Name = name;
            this.Value = value;
        }
    }
    class FailedSearchMailbox {
        Mailbox: string = null;
        ErrorCode: number = 0;
        ErrorMessage: string = null;
        IsArchive: boolean = false;
        constructor(mailbox: string, errorCode: number, errorMessage: string);
        constructor(mailbox: string, errorCode: number, errorMessage: string, isArchive: boolean);
        constructor(mailbox: string, errorCode: number, errorMessage: string, isArchive?: boolean) {
            super();
            if (arguments.length === 3 && (mailbox === null || mailbox.constructor === String) && (errorCode === null || errorCode.constructor === Number) && (errorMessage === null || errorMessage.constructor === String)) {
                this.constructor_0(mailbox, errorCode, errorMessage);
                return;
            }
            this.constructor_1(mailbox, errorCode, errorMessage, isArchive);
        }
        private constructor_0(mailbox: string, errorCode: number, errorMessage: string): void {
            this.constructor_1(mailbox, errorCode, errorMessage, false);
        }
        private constructor_1(mailbox: string, errorCode: number, errorMessage: string, isArchive: boolean): void {
            this.Mailbox = mailbox;
            this.ErrorCode = errorCode;
            this.ErrorMessage = errorMessage;
            this.IsArchive = isArchive;
        }
        static LoadFailedMailboxesXml(rootXmlNamespace: XmlNamespace, reader: EwsServiceXmlReader): FailedSearchMailbox[] {
            var list: List<FailedSearchMailbox> = new List<FailedSearchMailbox>();
            reader.EnsureCurrentNodeIsStartElement(rootXmlNamespace, "FailedMailboxes");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "FailedMailbox")) {
                    var mailbox: string = reader.ReadElementValue(XmlNamespace.Types, "Mailbox");
                    var errorCode: number = 0;
                    (() => {
                        var _p0 = [
                            errorCode
                        ];
                        var _r = NNumber.TryParse(reader.ReadElementValue(XmlNamespace.Types, "ErrorCode"), _p0);
                        errorCode = _p0[0];
                        return _r;
                    })();
                    var errorMessage: string = reader.ReadElementValue(XmlNamespace.Types, "ErrorMessage");
                    var isArchive: boolean = false;
                    (() => {
                        var _p0 = [
                            isArchive
                        ];
                        var _r = NBoolean.TryParse(reader.ReadElementValue(XmlNamespace.Types, "IsArchive"), _p0);
                        isArchive = _p0[0];
                        return _r;
                    })();
                    list.Add(new FailedSearchMailbox(mailbox, errorCode, errorMessage, isArchive));
                }
            }
            while (!reader.IsEndElement(rootXmlNamespace, "FailedMailboxes"));
            if (list.Count !== 0) {
                return list.ToArray();
            }
            return null;
        }
    }
    class KeywordStatisticsSearchResult {
        Keyword: string = null;
        ItemHits: number = 0;
        Size: number = 0;
        constructor() {
            super();
        }
    }
    class MailboxHoldStatus {
        Mailbox: string = null;
        Status: HoldStatus = 0;
        AdditionalInfo: string = null;
        constructor();
        constructor(mailbox: string, status: HoldStatus, additionalInfo: string);
        constructor(mailbox?: string, status?: HoldStatus, additionalInfo?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(mailbox, status, additionalInfo);
        }
        private constructor_0(): void {
        }
        private constructor_1(mailbox: string, status: HoldStatus, additionalInfo: string): void {
            this.Mailbox = mailbox;
            this.Status = status;
            this.AdditionalInfo = additionalInfo;
        }
    }
    class MailboxHoldResult {
        HoldId: string = null;
        Query: string = null;
        Statuses: MailboxHoldStatus[] = null;
        static LoadFromXml(reader: EwsServiceXmlReader): MailboxHoldResult {
            var list: List<MailboxHoldStatus> = new List<MailboxHoldStatus>();
            reader.ReadStartElement(XmlNamespace.Messages, "MailboxHoldResult");
            var mailboxHoldResult: MailboxHoldResult = new MailboxHoldResult();
            mailboxHoldResult.HoldId = reader.ReadElementValue(XmlNamespace.Types, "HoldId");
            reader.Read();
            mailboxHoldResult.Query = NString.Empty;
            if (reader.IsStartElement(XmlNamespace.Types, "Query")) {
                mailboxHoldResult.Query = reader.ReadElementValue(XmlNamespace.Types, "Query");
                reader.ReadStartElement(XmlNamespace.Types, "MailboxHoldStatuses");
            }
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "MailboxHoldStatus")) {
                    var mailbox: string = reader.ReadElementValue(XmlNamespace.Types, "Mailbox");
                    var status: HoldStatus = <HoldStatus>Enum.Parse(new Type("Number"), reader.ReadElementValue(XmlNamespace.Types, "Status"));
                    var additionalInfo: string = reader.ReadElementValue(XmlNamespace.Types, "AdditionalInfo");
                    list.Add(new MailboxHoldStatus(mailbox, status, additionalInfo));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "MailboxHoldResult"));
            mailboxHoldResult.Statuses = ((list.Count === 0) ? null : list.ToArray());
            return mailboxHoldResult;
        }
        static LoadFromJson(jsonObject: JsonObject): MailboxHoldResult {
            var list: List<MailboxHoldStatus> = new List<MailboxHoldStatus>();
            var mailboxHoldResult: MailboxHoldResult = new MailboxHoldResult();
            if (jsonObject.ContainsKey("HoldId")) {
                mailboxHoldResult.HoldId = jsonObject.ReadAsString("HoldId");
            }
            if (jsonObject.ContainsKey("Query")) {
                mailboxHoldResult.Query = jsonObject.ReadAsString("Query");
            }
            if (jsonObject.ContainsKey("Statuses")) {
                var array: any[] = jsonObject.ReadAsArray("Statuses");
                for (var i: number = 0; i < array.length; i = i + 1) {
                    var obj: any = array[i];
                    var mailboxHoldStatus: MailboxHoldStatus = new MailboxHoldStatus();
                    var jsonObject2: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                    if (jsonObject2.ContainsKey("Mailbox")) {
                        mailboxHoldStatus.Mailbox = jsonObject2.ReadAsString("Mailbox");
                    }
                    if (jsonObject2.ContainsKey("Status")) {
                        mailboxHoldStatus.Status = <HoldStatus>Enum.Parse(new Type("Number"), jsonObject2.ReadAsString("Status"));
                    }
                    if (jsonObject2.ContainsKey("AdditionalInfo")) {
                        mailboxHoldStatus.AdditionalInfo = jsonObject2.ReadAsString("AdditionalInfo");
                    }
                    list.Add(mailboxHoldStatus);
                }
            }
            mailboxHoldResult.Statuses = ((list.Count === 0) ? null : list.ToArray());
            return mailboxHoldResult;
        }
        constructor() {
            super();
        }
    }
    class MailboxQuery {
        Query: string = null;
        MailboxSearchScopes: MailboxSearchScope[] = null;
        constructor(query: string, searchScopes: MailboxSearchScope[]) {
            super();
            this.Query = query;
            this.MailboxSearchScopes = searchScopes;
        }
    }
    class MailboxSearchScope {
        private searchScope: MailboxSearchLocation = MailboxSearchLocation.All;
        private scopeType: MailboxSearchScopeType = 0;
        Mailbox: string = null;
        set SearchScope(value: MailboxSearchLocation) {
            this.searchScope = value;
        }
        get SearchScope(): MailboxSearchLocation {
            return this.searchScope;
        }
        set SearchScopeType(value: MailboxSearchScopeType) {
            this.scopeType = value;
        }
        get SearchScopeType(): MailboxSearchScopeType {
            return this.scopeType;
        }
        ExtendedAttributes: ExtendedAttributes = null;
        constructor(mailbox: string, searchScope: MailboxSearchLocation) {
            super();
            this.Mailbox = mailbox;
            this.searchScope = searchScope;
            this.ExtendedAttributes = new ExtendedAttributes();
        }
    }
    class PreviewItemMailbox {
        MailboxId: string = null;
        PrimarySmtpAddress: string = null;
        constructor();
        constructor(mailboxId: string, primarySmtpAddress: string);
        constructor(mailboxId?: string, primarySmtpAddress?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(mailboxId, primarySmtpAddress);
        }
        private constructor_0(): void {
        }
        private constructor_1(mailboxId: string, primarySmtpAddress: string): void {
            this.MailboxId = mailboxId;
            this.PrimarySmtpAddress = primarySmtpAddress;
        }
    }
    enum ItemIndexError {
        None,
        GenericError,
        Timeout,
        StaleEvent,
        MailboxOffline,
        AttachmentLimitReached,
        MarsWriterTruncation
    }
    class NonIndexableItem {
        ItemId: ItemId = null;
        ErrorCode: ItemIndexError = 0;
        ErrorDescription: string = null;
        IsPartiallyIndexed: boolean = false;
        IsPermanentFailure: boolean = false;
        AttemptCount: number = 0;
        LastAttemptTime: Nullable<DateTime> = null;
        AdditionalInfo: string = null;
        SortValue: string = null;
        static LoadFromXml(reader: EwsServiceXmlReader): NonIndexableItem {
            var result: NonIndexableItem = null;
            if (reader.IsStartElement(XmlNamespace.Types, "NonIndexableItemDetail")) {
                var itemId: ItemId = null;
                var errorCode: ItemIndexError = ItemIndexError.None;
                var errorDescription: string = null;
                var isPartiallyIndexed: boolean = false;
                var isPermanentFailure: boolean = false;
                var attemptCount: number = 0;
                var lastAttemptTime: Nullable<DateTime> = new Nullable<DateTime>();
                var additionalInfo: string = null;
                var sortValue: string = null;
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "ItemId")) {
                        itemId = new ItemId();
                        itemId.ReadAttributesFromXml(reader);
                    }
                    else {
                        if (reader.IsStartElement(XmlNamespace.Types, "ErrorDescription")) {
                            errorDescription = reader.ReadElementValue(XmlNamespace.Types, "ErrorDescription");
                        }
                        else {
                            if (reader.IsStartElement(XmlNamespace.Types, "IsPartiallyIndexed")) {
                                isPartiallyIndexed = reader.ReadElementValue<boolean>(XmlNamespace.Types, "IsPartiallyIndexed");
                            }
                            else {
                                if (reader.IsStartElement(XmlNamespace.Types, "IsPermanentFailure")) {
                                    isPermanentFailure = reader.ReadElementValue<boolean>(XmlNamespace.Types, "IsPermanentFailure");
                                }
                                else {
                                    if (reader.IsStartElement(XmlNamespace.Types, "AttemptCount")) {
                                        attemptCount = reader.ReadElementValue<number>(XmlNamespace.Types, "AttemptCount");
                                    }
                                    else {
                                        if (reader.IsStartElement(XmlNamespace.Types, "LastAttemptTime")) {
                                            lastAttemptTime = new Nullable<DateTime>(reader.ReadElementValue<DateTime>(XmlNamespace.Types, "LastAttemptTime"));
                                        }
                                        else {
                                            if (reader.IsStartElement(XmlNamespace.Types, "AdditionalInfo")) {
                                                additionalInfo = reader.ReadElementValue(XmlNamespace.Types, "AdditionalInfo");
                                            }
                                            else {
                                                if (reader.IsStartElement(XmlNamespace.Types, "SortValue")) {
                                                    sortValue = reader.ReadElementValue(XmlNamespace.Types, "SortValue");
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Types, "NonIndexableItemDetail"));
                var nonIndexableItem: NonIndexableItem = new NonIndexableItem();
                nonIndexableItem.ItemId = itemId;
                nonIndexableItem.ErrorCode = errorCode;
                nonIndexableItem.ErrorDescription = errorDescription;
                nonIndexableItem.IsPartiallyIndexed = isPartiallyIndexed;
                nonIndexableItem.IsPermanentFailure = isPermanentFailure;
                nonIndexableItem.AttemptCount = attemptCount;
                nonIndexableItem.LastAttemptTime = lastAttemptTime;
                nonIndexableItem.AdditionalInfo = additionalInfo;
                nonIndexableItem.SortValue = sortValue;
                result = nonIndexableItem;
            }
            return result;
        }
        constructor() {
            super();
        }
    }
    class NonIndexableItemDetailsResult {
        Items: NonIndexableItem[] = null;
        FailedMailboxes: FailedSearchMailbox[] = null;
        static LoadFromXml(reader: EwsServiceXmlReader): NonIndexableItemDetailsResult {
            var nonIndexableItemDetailsResult: NonIndexableItemDetailsResult = new NonIndexableItemDetailsResult();
            reader.ReadStartElement(XmlNamespace.Messages, "NonIndexableItemDetailsResult");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "Items")) {
                    var list: List<NonIndexableItem> = new List<NonIndexableItem>();
                    if (!reader.IsEmptyElement) {
                        do {
                            reader.Read();
                            var nonIndexableItem: NonIndexableItem = NonIndexableItem.LoadFromXml(reader);
                            if (nonIndexableItem !== null) {
                                list.Add(nonIndexableItem);
                            }
                        }
                        while (!reader.IsEndElement(XmlNamespace.Types, "Items"));
                        nonIndexableItemDetailsResult.Items = list.ToArray();
                    }
                }
                if (reader.IsStartElement(XmlNamespace.Types, "FailedMailboxes")) {
                    nonIndexableItemDetailsResult.FailedMailboxes = FailedSearchMailbox.LoadFailedMailboxesXml(XmlNamespace.Types, reader);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "NonIndexableItemDetailsResult"));
            return nonIndexableItemDetailsResult;
        }
        static LoadFromJson(jsonObject: JsonObject): NonIndexableItemDetailsResult {
            return new NonIndexableItemDetailsResult();
        }
        constructor() {
            super();
        }
    }
    class NonIndexableItemParameters {
        Mailboxes: string[] = null;
        SearchArchiveOnly: boolean = false;
        constructor() {
            super();
        }
    }
    class GetNonIndexableItemStatisticsParameters extends NonIndexableItemParameters {
        constructor() {
            super();
        }
    }
    class GetNonIndexableItemDetailsParameters extends NonIndexableItemParameters {
        PageSize: Nullable<number> = null;
        PageItemReference: string = null;
        PageDirection: Nullable<SearchPageDirection> = null;
        constructor() {
            super();
        }
    }
    class NonIndexableItemStatistic {
        Mailbox: string = null;
        ItemCount: number = 0;
        ErrorMessage: string = null;
        static LoadFromXml(reader: EwsServiceXmlReader): List<NonIndexableItemStatistic> {
            var list: List<NonIndexableItemStatistic> = new List<NonIndexableItemStatistic>();
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Messages, "NonIndexableItemStatistics")) {
                do {
                    reader.Read();
                    if (reader.IsStartElement(XmlNamespace.Types, "NonIndexableItemStatistic")) {
                        var mailbox: string = reader.ReadElementValue(XmlNamespace.Types, "Mailbox");
                        var num: number = reader.ReadElementValue<number>(XmlNamespace.Types, "ItemCount");
                        var errorMessage: string = null;
                        if (reader.IsStartElement(XmlNamespace.Types, "ErrorMessage")) {
                            errorMessage = reader.ReadElementValue(XmlNamespace.Types, "ErrorMessage");
                        }
                        var arg_8B_0: List<NonIndexableItemStatistic> = list;
                        var nonIndexableItemStatistic: NonIndexableItemStatistic = new NonIndexableItemStatistic();
                        nonIndexableItemStatistic.Mailbox = mailbox;
                        nonIndexableItemStatistic.ItemCount = <number>num;
                        nonIndexableItemStatistic.ErrorMessage = errorMessage;
                        arg_8B_0.Add(nonIndexableItemStatistic);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "NonIndexableItemStatistics"));
            }
            return list;
        }
        constructor() {
            super();
        }
    }
    class PreviewItemResponseShape {
        BaseShape: PreviewItemBaseShape = 0;
        AdditionalProperties: ExtendedPropertyDefinition[] = null;
        constructor();
        constructor(baseShape: PreviewItemBaseShape, additionalProperties: ExtendedPropertyDefinition[]);
        constructor(baseShape?: PreviewItemBaseShape, additionalProperties?: ExtendedPropertyDefinition[]) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(baseShape, additionalProperties);
        }
        private constructor_0(): void {
        }
        private constructor_1(baseShape: PreviewItemBaseShape, additionalProperties: ExtendedPropertyDefinition[]): void {
            this.BaseShape = baseShape;
            this.AdditionalProperties = additionalProperties;
        }
    }
    class SearchableMailbox {
        Guid: Guid = null;
        SmtpAddress: string = null;
        IsExternalMailbox: boolean = false;
        ExternalEmailAddress: string = null;
        DisplayName: string = null;
        IsMembershipGroup: boolean = false;
        ReferenceId: string = null;
        constructor();
        constructor(guid: Guid, smtpAddress: string, isExternalMailbox: boolean, externalEmailAddress: string, displayName: string, isMembershipGroup: boolean, referenceId: string);
        constructor(guid?: Guid, smtpAddress?: string, isExternalMailbox?: boolean, externalEmailAddress?: string, displayName?: string, isMembershipGroup?: boolean, referenceId?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(guid, smtpAddress, isExternalMailbox, externalEmailAddress, displayName, isMembershipGroup, referenceId);
        }
        private constructor_0(): void {
        }
        private constructor_1(guid: Guid, smtpAddress: string, isExternalMailbox: boolean, externalEmailAddress: string, displayName: string, isMembershipGroup: boolean, referenceId: string): void {
            this.Guid = guid;
            this.SmtpAddress = smtpAddress;
            this.IsExternalMailbox = isExternalMailbox;
            this.ExternalEmailAddress = externalEmailAddress;
            this.DisplayName = displayName;
            this.IsMembershipGroup = isMembershipGroup;
            this.ReferenceId = referenceId;
        }
        static LoadFromXml(reader: EwsServiceXmlReader): SearchableMailbox {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "SearchableMailbox");
            var searchableMailbox: SearchableMailbox = new SearchableMailbox();
            searchableMailbox.Guid = new Guid(reader.ReadElementValue(XmlNamespace.Types, "Guid"));
            searchableMailbox.SmtpAddress = reader.ReadElementValue(XmlNamespace.Types, "PrimarySmtpAddress");
            var isExternalMailbox: boolean = false;
            (() => {
                var _p0 = [
                    isExternalMailbox
                ];
                var _r = NBoolean.TryParse(reader.ReadElementValue(XmlNamespace.Types, "IsExternalMailbox"), _p0);
                isExternalMailbox = _p0[0];
                return _r;
            })();
            searchableMailbox.IsExternalMailbox = isExternalMailbox;
            searchableMailbox.ExternalEmailAddress = reader.ReadElementValue(XmlNamespace.Types, "ExternalEmailAddress");
            searchableMailbox.DisplayName = reader.ReadElementValue(XmlNamespace.Types, "DisplayName");
            var isMembershipGroup: boolean = false;
            (() => {
                var _p0 = [
                    isMembershipGroup
                ];
                var _r = NBoolean.TryParse(reader.ReadElementValue(XmlNamespace.Types, "IsMembershipGroup"), _p0);
                isMembershipGroup = _p0[0];
                return _r;
            })();
            searchableMailbox.IsMembershipGroup = isMembershipGroup;
            searchableMailbox.ReferenceId = reader.ReadElementValue(XmlNamespace.Types, "ReferenceId");
            return searchableMailbox;
        }
        static LoadFromJson(jsonObject: JsonObject): SearchableMailbox {
            var searchableMailbox: SearchableMailbox = new SearchableMailbox();
            if (jsonObject.ContainsKey("Guid")) {
                searchableMailbox.Guid = new Guid(jsonObject.ReadAsString("Guid"));
            }
            if (jsonObject.ContainsKey("DisplayName")) {
                searchableMailbox.DisplayName = jsonObject.ReadAsString("DisplayName");
            }
            if (jsonObject.ContainsKey("PrimarySmtpAddress")) {
                searchableMailbox.SmtpAddress = jsonObject.ReadAsString("PrimarySmtpAddress");
            }
            if (jsonObject.ContainsKey("IsExternalMailbox")) {
                searchableMailbox.IsExternalMailbox = jsonObject.ReadAsBool("IsExternalMailbox");
            }
            if (jsonObject.ContainsKey("ExternalEmailAddress")) {
                searchableMailbox.ExternalEmailAddress = jsonObject.ReadAsString("ExternalEmailAddress");
            }
            if (jsonObject.ContainsKey("IsMembershipGroup")) {
                searchableMailbox.IsMembershipGroup = jsonObject.ReadAsBool("IsMembershipGroup");
            }
            if (jsonObject.ContainsKey("ReferenceId")) {
                searchableMailbox.ReferenceId = jsonObject.ReadAsString("ReferenceId");
            }
            return searchableMailbox;
        }
    }
    class SearchMailboxesParameters {
        SearchQueries: MailboxQuery[] = null;
        ResultType: SearchResultType = 0;
        SortBy: string = null;
        SortOrder: SortDirection = 0;
        PerformDeduplication: boolean = false;
        PageSize: number = 0;
        PageDirection: SearchPageDirection = 0;
        PageItemReference: string = null;
        PreviewItemResponseShape: PreviewItemResponseShape = null;
        Language: string = null;
        constructor() {
            super();
        }
    }
    class SearchMailboxesResult {
        SearchQueries: MailboxQuery[] = null;
        ResultType: SearchResultType = 0;
        ItemCount: number = 0;
        Size: number = 0;
        PageItemCount: number = 0;
        PageItemSize: number = 0;
        KeywordStats: KeywordStatisticsSearchResult[] = null;
        PreviewItems: SearchPreviewItem[] = null;
        FailedMailboxes: FailedSearchMailbox[] = null;
        Refiners: SearchRefinerItem[] = null;
        MailboxStats: MailboxStatisticsItem[] = null;
        static LoadFromXml(reader: EwsServiceXmlReader): SearchMailboxesResult {
            var searchMailboxesResult: SearchMailboxesResult = new SearchMailboxesResult();
            reader.ReadStartElement(XmlNamespace.Messages, "SearchMailboxesResult");
            var list: List<MailboxQuery> = new List<MailboxQuery>();
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "SearchQueries")) {
                    reader.ReadStartElement(XmlNamespace.Types, "MailboxQuery");
                    var query: string = reader.ReadElementValue(XmlNamespace.Types, "Query");
                    reader.ReadStartElement(XmlNamespace.Types, "MailboxSearchScopes");
                    var list2: List<MailboxSearchScope> = new List<MailboxSearchScope>();
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "MailboxSearchScope")) {
                            var mailbox: string = reader.ReadElementValue(XmlNamespace.Types, "Mailbox");
                            reader.ReadStartElement(XmlNamespace.Types, "SearchScope");
                            var value: string = reader.ReadElementValue(XmlNamespace.Types, "SearchScope");
                            reader.ReadEndElement(XmlNamespace.Types, "MailboxSearchScope");
                            list2.Add(new MailboxSearchScope(mailbox, <MailboxSearchLocation>Enum.Parse(new Type("Number"), value)));
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "MailboxSearchScopes"));
                    reader.ReadEndElementIfNecessary(XmlNamespace.Types, "MailboxSearchScopes");
                    list.Add(new MailboxQuery(query, list2.ToArray()));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "SearchQueries"));
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, "SearchQueries");
            searchMailboxesResult.SearchQueries = list.ToArray();
            searchMailboxesResult.ResultType = <SearchResultType>Enum.Parse(new Type("Number"), reader.ReadElementValue(XmlNamespace.Types, "ResultType"));
            searchMailboxesResult.ItemCount = <number>NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "ItemCount"));
            searchMailboxesResult.Size = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "Size"));
            searchMailboxesResult.PageItemCount = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "PageItemCount"));
            searchMailboxesResult.PageItemSize = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "PageItemSize"));
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "KeywordStats")) {
                    searchMailboxesResult.KeywordStats = SearchMailboxesResult.LoadKeywordStatsXml(reader);
                }
                if (reader.IsStartElement(XmlNamespace.Types, "Items")) {
                    searchMailboxesResult.PreviewItems = SearchMailboxesResult.LoadPreviewItemsXml(reader);
                }
                if (reader.IsStartElement(XmlNamespace.Types, "FailedMailboxes")) {
                    searchMailboxesResult.FailedMailboxes = FailedSearchMailbox.LoadFailedMailboxesXml(XmlNamespace.Types, reader);
                }
                if (reader.IsStartElement(XmlNamespace.Types, "Refiners")) {
                    var list3: List<SearchRefinerItem> = new List<SearchRefinerItem>();
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "Refiner")) {
                            list3.Add(SearchRefinerItem.LoadFromXml(reader));
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "Refiners"));
                    if (list3.Count > 0) {
                        searchMailboxesResult.Refiners = list3.ToArray();
                    }
                }
                if (reader.IsStartElement(XmlNamespace.Types, "MailboxStats")) {
                    var list4: List<MailboxStatisticsItem> = new List<MailboxStatisticsItem>();
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "MailboxStat")) {
                            list4.Add(MailboxStatisticsItem.LoadFromXml(reader));
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "MailboxStats"));
                    if (list4.Count > 0) {
                        searchMailboxesResult.MailboxStats = list4.ToArray();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "SearchMailboxesResult"));
            return searchMailboxesResult;
        }
        static LoadFromJson(jsonObject: JsonObject): SearchMailboxesResult {
            return new SearchMailboxesResult();
        }
        private static LoadKeywordStatsXml(reader: EwsServiceXmlReader): KeywordStatisticsSearchResult[] {
            var list: List<KeywordStatisticsSearchResult> = new List<KeywordStatisticsSearchResult>();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "KeywordStats");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "KeywordStat")) {
                    var keywordStatisticsSearchResult: KeywordStatisticsSearchResult = new KeywordStatisticsSearchResult();
                    keywordStatisticsSearchResult.Keyword = reader.ReadElementValue(XmlNamespace.Types, "Keyword");
                    keywordStatisticsSearchResult.ItemHits = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "ItemHits"));
                    keywordStatisticsSearchResult.Size = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "Size"));
                    list.Add(keywordStatisticsSearchResult);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "KeywordStats"));
            if (list.Count !== 0) {
                return list.ToArray();
            }
            return null;
        }
        private static LoadPreviewItemsXml(reader: EwsServiceXmlReader): SearchPreviewItem[] {
            var list: List<SearchPreviewItem> = new List<SearchPreviewItem>();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "Items");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "SearchPreviewItem")) {
                    var searchPreviewItem: SearchPreviewItem = new SearchPreviewItem();
                    do {
                        reader.Read();
                        if (reader.IsStartElement(XmlNamespace.Types, "Id")) {
                            searchPreviewItem.Id = new ItemId();
                            searchPreviewItem.Id.ReadAttributesFromXml(reader);
                        }
                        else {
                            if (reader.IsStartElement(XmlNamespace.Types, "ParentId")) {
                                searchPreviewItem.ParentId = new ItemId();
                                searchPreviewItem.ParentId.ReadAttributesFromXml(reader);
                            }
                            else {
                                if (reader.IsStartElement(XmlNamespace.Types, "Mailbox")) {
                                    searchPreviewItem.Mailbox = new PreviewItemMailbox();
                                    searchPreviewItem.Mailbox.MailboxId = reader.ReadElementValue(XmlNamespace.Types, "MailboxId");
                                    searchPreviewItem.Mailbox.PrimarySmtpAddress = reader.ReadElementValue(XmlNamespace.Types, "PrimarySmtpAddress");
                                }
                                else {
                                    if (reader.IsStartElement(XmlNamespace.Types, "UniqueHash")) {
                                        searchPreviewItem.UniqueHash = reader.ReadElementValue(XmlNamespace.Types, "UniqueHash");
                                    }
                                    else {
                                        if (reader.IsStartElement(XmlNamespace.Types, "SortValue")) {
                                            searchPreviewItem.SortValue = reader.ReadElementValue(XmlNamespace.Types, "SortValue");
                                        }
                                        else {
                                            if (reader.IsStartElement(XmlNamespace.Types, "OwaLink")) {
                                                searchPreviewItem.OwaLink = reader.ReadElementValue(XmlNamespace.Types, "OwaLink");
                                            }
                                            else {
                                                if (reader.IsStartElement(XmlNamespace.Types, "Sender")) {
                                                    searchPreviewItem.Sender = reader.ReadElementValue(XmlNamespace.Types, "Sender");
                                                }
                                                else {
                                                    if (reader.IsStartElement(XmlNamespace.Types, "ToRecipients")) {
                                                        searchPreviewItem.ToRecipients = SearchMailboxesResult.GetRecipients(reader, "ToRecipients");
                                                    }
                                                    else {
                                                        if (reader.IsStartElement(XmlNamespace.Types, "CcRecipients")) {
                                                            searchPreviewItem.CcRecipients = SearchMailboxesResult.GetRecipients(reader, "CcRecipients");
                                                        }
                                                        else {
                                                            if (reader.IsStartElement(XmlNamespace.Types, "BccRecipients")) {
                                                                searchPreviewItem.BccRecipients = SearchMailboxesResult.GetRecipients(reader, "BccRecipients");
                                                            }
                                                            else {
                                                                if (reader.IsStartElement(XmlNamespace.Types, "CreatedTime")) {
                                                                    searchPreviewItem.CreatedTime = DateTime.Parse(reader.ReadElementValue(XmlNamespace.Types, "CreatedTime"));
                                                                }
                                                                else {
                                                                    if (reader.IsStartElement(XmlNamespace.Types, "ReceivedTime")) {
                                                                        searchPreviewItem.ReceivedTime = DateTime.Parse(reader.ReadElementValue(XmlNamespace.Types, "ReceivedTime"));
                                                                    }
                                                                    else {
                                                                        if (reader.IsStartElement(XmlNamespace.Types, "SentTime")) {
                                                                            searchPreviewItem.SentTime = DateTime.Parse(reader.ReadElementValue(XmlNamespace.Types, "SentTime"));
                                                                        }
                                                                        else {
                                                                            if (reader.IsStartElement(XmlNamespace.Types, "Subject")) {
                                                                                searchPreviewItem.Subject = reader.ReadElementValue(XmlNamespace.Types, "Subject");
                                                                            }
                                                                            else {
                                                                                if (reader.IsStartElement(XmlNamespace.Types, "Preview")) {
                                                                                    searchPreviewItem.Preview = reader.ReadElementValue(XmlNamespace.Types, "Preview");
                                                                                }
                                                                                else {
                                                                                    if (reader.IsStartElement(XmlNamespace.Types, "Size")) {
                                                                                        searchPreviewItem.Size = NNumber.Parse(reader.ReadElementValue(XmlNamespace.Types, "Size"));
                                                                                    }
                                                                                    else {
                                                                                        if (reader.IsStartElement(XmlNamespace.Types, "Importance")) {
                                                                                            searchPreviewItem.Importance = <Importance>Enum.Parse(new Type("Number"), reader.ReadElementValue(XmlNamespace.Types, "Importance"));
                                                                                        }
                                                                                        else {
                                                                                            if (reader.IsStartElement(XmlNamespace.Types, "Read")) {
                                                                                                searchPreviewItem.Read = NBoolean.Parse(reader.ReadElementValue(XmlNamespace.Types, "Read"));
                                                                                            }
                                                                                            else {
                                                                                                if (reader.IsStartElement(XmlNamespace.Types, "HasAttachment")) {
                                                                                                    searchPreviewItem.HasAttachment = NBoolean.Parse(reader.ReadElementValue(XmlNamespace.Types, "HasAttachment"));
                                                                                                }
                                                                                                else {
                                                                                                    if (reader.IsStartElement(XmlNamespace.Types, "ExtendedProperties")) {
                                                                                                        searchPreviewItem.ExtendedProperties = SearchMailboxesResult.LoadExtendedPropertiesXml(reader);
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    while (!reader.IsEndElement(XmlNamespace.Types, "SearchPreviewItem"));
                    list.Add(searchPreviewItem);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "Items"));
            if (list.Count !== 0) {
                return list.ToArray();
            }
            return null;
        }
        private static GetRecipients(reader: EwsServiceXmlReader, elementName: string): string[] {
            var list: List<string> = new List<string>();
            do {
                if (reader.IsStartElement(XmlNamespace.Types, "SmtpAddress")) {
                    list.Add(reader.ReadElementValue(XmlNamespace.Types, "SmtpAddress"));
                }
                reader.Read();
            }
            while (!reader.IsEndElement(XmlNamespace.Types, elementName));
            if (list.Count !== 0) {
                return list.ToArray();
            }
            return null;
        }
        private static LoadExtendedPropertiesXml(reader: EwsServiceXmlReader): ExtendedPropertyCollection {
            var extendedPropertyCollection: ExtendedPropertyCollection = new ExtendedPropertyCollection();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "ExtendedProperties");
            do {
                reader.Read();
                if (reader.IsStartElement(XmlNamespace.Types, "ExtendedProperty")) {
                    extendedPropertyCollection.LoadFromXml(reader, "ExtendedProperty");
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Types, "ExtendedProperties"));
            if (extendedPropertyCollection.Count !== 0) {
                return extendedPropertyCollection;
            }
            return null;
        }
        constructor() {
            super();
        }
    }
    class SearchRefinerItem {
        Name: string = null;
        Value: string = null;
        Count: number = 0;
        Token: string = null;
        static LoadFromXml(reader: EwsServiceXmlReader): SearchRefinerItem {
            var searchRefinerItem: SearchRefinerItem = new SearchRefinerItem();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "Refiner");
            searchRefinerItem.Name = reader.ReadElementValue(XmlNamespace.Types, "Name");
            searchRefinerItem.Value = reader.ReadElementValue(XmlNamespace.Types, "Value");
            searchRefinerItem.Count = reader.ReadElementValue<number>(XmlNamespace.Types, "Count");
            searchRefinerItem.Token = reader.ReadElementValue(XmlNamespace.Types, "Token");
            return searchRefinerItem;
        }
        constructor() {
            super();
        }
    }
    class MailboxStatisticsItem {
        MailboxId: string = null;
        DisplayName: string = null;
        ItemCount: number = 0;
        Size: number = 0;
        static LoadFromXml(reader: EwsServiceXmlReader): MailboxStatisticsItem {
            var mailboxStatisticsItem: MailboxStatisticsItem = new MailboxStatisticsItem();
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "MailboxStat");
            mailboxStatisticsItem.MailboxId = reader.ReadElementValue(XmlNamespace.Types, "MailboxId");
            mailboxStatisticsItem.DisplayName = reader.ReadElementValue(XmlNamespace.Types, "DisplayName");
            mailboxStatisticsItem.ItemCount = reader.ReadElementValue<number>(XmlNamespace.Types, "ItemCount");
            mailboxStatisticsItem.Size = reader.ReadElementValue<number>(XmlNamespace.Types, "Size");
            return mailboxStatisticsItem;
        }
        constructor() {
            super();
        }
    }
    class SearchPreviewItem {
        Id: ItemId = null;
        Mailbox: PreviewItemMailbox = null;
        ParentId: ItemId = null;
        ItemClass: string = null;
        UniqueHash: string = null;
        SortValue: string = null;
        OwaLink: string = null;
        Sender: string = null;
        ToRecipients: string[] = null;
        CcRecipients: string[] = null;
        BccRecipients: string[] = null;
        CreatedTime: DateTime = null;
        ReceivedTime: DateTime = null;
        SentTime: DateTime = null;
        Subject: string = null;
        Size: number = 0;
        Preview: string = null;
        Importance: Importance = 0;
        Read: boolean = false;
        HasAttachment: boolean = false;
        ExtendedProperties: ExtendedPropertyCollection = null;
        constructor() {
            super();
        }
    }
    class SetHoldOnMailboxesParameters {
        ActionType: HoldAction = 0;
        HoldId: string = null;
        Query: string = null;
        Mailboxes: string[] = null;
        Language: string = null;
        InPlaceHoldIdentity: string = null;
        constructor() {
            super();
        }
    }
    class DiscoverySchemaChanges {
        static SearchMailboxesExtendedData: DiscoverySchemaChanges_SchemaChange = null;
        static SearchMailboxesAdditionalSearchScopes: DiscoverySchemaChanges_SchemaChange = null;
        static DiscoverySchemaChanges_cctor(): void {
            DiscoverySchemaChanges.SearchMailboxesExtendedData = new DiscoverySchemaChanges_SchemaChange("15.0.730.0");
            DiscoverySchemaChanges.SearchMailboxesAdditionalSearchScopes = new DiscoverySchemaChanges_SchemaChange("15.0.730.0");
        }
    }
    class DiscoverySchemaChanges_SchemaChange {
        MinimumServerVersion: number = 0;
        constructor(serverVersion: number);
        constructor(serverBuild: string);
        constructor(serverVersionOrServerBuild: any) {
            super();
            if (arguments.length === 1 && (serverVersionOrServerBuild === null || serverVersionOrServerBuild.constructor === Number)) {
                this.constructor_0(serverVersionOrServerBuild);
                return;
            }
            this.constructor_1(serverVersionOrServerBuild);
        }
        private constructor_0(serverVersion: number): void {
            this.MinimumServerVersion = serverVersion;
        }
        private constructor_1(serverBuild: string): void {
            var version: Version = new Version(serverBuild);
            this.MinimumServerVersion = <number>((version.Build & 32767) | (version.Minor & 63) << 16 | (version.Major & 63) << 22 | 1879080960);
        }
        IsCompatible(versionable: IDiscoveryVersionable): boolean {
            return versionable.ServerVersion === 0 || versionable.ServerVersion >= this.MinimumServerVersion;
        }
    }
    class AbstractFolderIdWrapper implements IJsonSerializable {
        GetFolder(): Folder {
            return null;
        }
        constructor() {
            super();
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        Validate(version: ExchangeVersion): void {
        }
        ToJson(service: ExchangeService): any {
            return this.InternalToJson(service);
        }
        InternalToJson(service: ExchangeService): any {
            throw new NotSupportedException();
        }
    }
    class AbstractItemIdWrapper implements IJsonSerializable {
        constructor() {
            super();
        }
        GetItem(): Item {
            return null;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        ToJson(service: ExchangeService): any {
            return this.IternalToJson(service);
        }
        IternalToJson(service: ExchangeService): any {
            throw new NotSupportedException();
        }
    }
    class CalendarActionResults {
        private appointment: Appointment = null;
        private meetingRequest: MeetingRequest = null;
        private meetingResponse: MeetingResponse = null;
        private meetingCancellation: MeetingCancellation = null;
        get Appointment(): Appointment {
            return this.appointment;
        }
        get MeetingRequest(): MeetingRequest {
            return this.meetingRequest;
        }
        get MeetingResponse(): MeetingResponse {
            return this.meetingResponse;
        }
        get MeetingCancellation(): MeetingCancellation {
            return this.meetingCancellation;
        }
        constructor(items: IEnumerable<Item>) {
            super();
            this.appointment = EwsUtilities.FindFirstItemOfType<Appointment>(items);
            this.meetingRequest = EwsUtilities.FindFirstItemOfType<MeetingRequest>(items);
            this.meetingResponse = EwsUtilities.FindFirstItemOfType<MeetingResponse>(items);
            this.meetingCancellation = EwsUtilities.FindFirstItemOfType<MeetingCancellation>(items);
        }
    }
    class ConversationAction implements IJsonSerializable {
        Action: ConversationActionType = 0;
        ConversationId: ConversationId = null;
        ProcessRightAway: boolean = false;
        Categories: StringList = null;
        EnableAlwaysDelete: boolean = false;
        IsRead: Nullable<boolean> = null;
        SuppressReadReceipts: Nullable<boolean> = null;
        DeleteType: Nullable<DeleteMode> = null;
        Flag: Flag = null;
        ConversationLastSyncTime: Nullable<DateTime> = null;
        ContextFolderId: FolderIdWrapper = null;
        DestinationFolderId: FolderIdWrapper = null;
        RetentionPolicyType: Nullable<RetentionType> = null;
        RetentionPolicyTagId: Nullable<Guid> = null;
        GetXmlElementName(): string {
            return "ApplyConversationAction";
        }
        Validate(): void {
            EwsUtilities.ValidateParam(this.ConversationId, "conversationId");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "ConversationAction");
            try {
                var value: string = NString.Empty;
                switch (this.Action) {
                    case ConversationActionType.AlwaysCategorize:
                        value = "AlwaysCategorize";
                        break;
                    case ConversationActionType.AlwaysDelete:
                        value = "AlwaysDelete";
                        break;
                    case ConversationActionType.AlwaysMove:
                        value = "AlwaysMove";
                        break;
                    case ConversationActionType.Delete:
                        value = "Delete";
                        break;
                    case ConversationActionType.Move:
                        value = "Move";
                        break;
                    case ConversationActionType.Copy:
                        value = "Copy";
                        break;
                    case ConversationActionType.SetReadState:
                        value = "SetReadState";
                        break;
                    case ConversationActionType.SetRetentionPolicy:
                        value = "SetRetentionPolicy";
                        break;
                    case ConversationActionType.Flag:
                        value = "Flag";
                        break;
                    default:
                        throw new ArgumentException("ConversationAction");
                }
                writer.WriteElementValue(XmlNamespace.Types, "Action", value);
                this.ConversationId.WriteToXml(writer, XmlNamespace.Types, "ConversationId");
                if (this.Action === ConversationActionType.AlwaysCategorize || this.Action === ConversationActionType.AlwaysDelete || this.Action === ConversationActionType.AlwaysMove) {
                    writer.WriteElementValue(XmlNamespace.Types, "ProcessRightAway", EwsUtilities.BoolToXSBool(this.ProcessRightAway));
                }
                if (this.Action === ConversationActionType.AlwaysCategorize) {
                    if (this.Categories !== null && this.Categories.Count > 0) {
                        this.Categories.WriteToXml(writer, XmlNamespace.Types, "Categories");
                    }
                }
                else {
                    if (this.Action === ConversationActionType.AlwaysDelete) {
                        writer.WriteElementValue(XmlNamespace.Types, "EnableAlwaysDelete", EwsUtilities.BoolToXSBool(this.EnableAlwaysDelete));
                    }
                    else {
                        if (this.Action === ConversationActionType.AlwaysMove) {
                            if (this.DestinationFolderId !== null) {
                                writer.WriteStartElement(XmlNamespace.Types, "DestinationFolderId");
                                this.DestinationFolderId.WriteToXml(writer);
                                writer.WriteEndElement();
                            }
                        }
                        else {
                            if (this.ContextFolderId !== null) {
                                writer.WriteStartElement(XmlNamespace.Types, "ContextFolderId");
                                this.ContextFolderId.WriteToXml(writer);
                                writer.WriteEndElement();
                            }
                            if (this.ConversationLastSyncTime !== null) {
                                writer.WriteElementValue(XmlNamespace.Types, "ConversationLastSyncTime", this.ConversationLastSyncTime.Value);
                            }
                            if (this.Action === ConversationActionType.Copy) {
                                EwsUtilities.Assert(this.DestinationFolderId !== null, "ApplyconversationActionRequest", "DestinationFolderId should be set when performing copy action");
                                writer.WriteStartElement(XmlNamespace.Types, "DestinationFolderId");
                                this.DestinationFolderId.WriteToXml(writer);
                                writer.WriteEndElement();
                            }
                            else {
                                if (this.Action === ConversationActionType.Move) {
                                    EwsUtilities.Assert(this.DestinationFolderId !== null, "ApplyconversationActionRequest", "DestinationFolderId should be set when performing move action");
                                    writer.WriteStartElement(XmlNamespace.Types, "DestinationFolderId");
                                    this.DestinationFolderId.WriteToXml(writer);
                                    writer.WriteEndElement();
                                }
                                else {
                                    if (this.Action === ConversationActionType.Delete) {
                                        EwsUtilities.Assert(this.DeleteType !== null, "ApplyconversationActionRequest", "DeleteType should be specified when deleting a conversation.");
                                        writer.WriteElementValue(XmlNamespace.Types, "DeleteType", this.DeleteType.Value);
                                    }
                                    else {
                                        if (this.Action === ConversationActionType.SetReadState) {
                                            EwsUtilities.Assert(this.IsRead !== null, "ApplyconversationActionRequest", "IsRead should be specified when marking/unmarking a conversation as read.");
                                            writer.WriteElementValue(XmlNamespace.Types, "IsRead", this.IsRead.Value);
                                            if (this.SuppressReadReceipts !== null) {
                                                writer.WriteElementValue(XmlNamespace.Types, "SuppressReadReceipts", this.SuppressReadReceipts.Value);
                                            }
                                        }
                                        else {
                                            if (this.Action === ConversationActionType.SetRetentionPolicy) {
                                                EwsUtilities.Assert(this.RetentionPolicyType !== null, "ApplyconversationActionRequest", "RetentionPolicyType should be specified when setting a retention policy on a conversation.");
                                                writer.WriteElementValue(XmlNamespace.Types, "RetentionPolicyType", this.RetentionPolicyType.Value);
                                                if (this.RetentionPolicyTagId !== null) {
                                                    writer.WriteElementValue(XmlNamespace.Types, "RetentionPolicyTagId", this.RetentionPolicyTagId.Value);
                                                }
                                            }
                                            else {
                                                if (this.Action === ConversationActionType.Flag) {
                                                    EwsUtilities.Assert(this.Flag !== null, "ApplyconversationActionRequest", "Flag should be specified when flagging conversation items.");
                                                    writer.WriteStartElement(XmlNamespace.Types, "Flag");
                                                    this.Flag.WriteElementsToXml(writer);
                                                    writer.WriteEndElement();
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            finally {
                writer.WriteEndElement();
            }
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Action", this.Action);
            jsonObject.Add("ConversationId", this.ConversationId.InternalToJson(service));
            if (this.Action === ConversationActionType.AlwaysCategorize || this.Action === ConversationActionType.AlwaysDelete || this.Action === ConversationActionType.AlwaysMove) {
                jsonObject.Add("ProcessRightAway", this.ProcessRightAway);
            }
            if (this.Action === ConversationActionType.AlwaysCategorize) {
                if (this.Categories !== null && this.Categories.Count > 0) {
                    jsonObject.Add("Categories", this.Categories.InternalToJson(service));
                }
            }
            else {
                if (this.Action === ConversationActionType.AlwaysDelete) {
                    jsonObject.Add("EnableAlwaysDelete", this.EnableAlwaysDelete);
                }
                else {
                    if (this.Action === ConversationActionType.AlwaysMove) {
                        if (this.DestinationFolderId !== null) {
                            var jsonObject2: JsonObject = new JsonObject();
                            jsonObject2.Add("BaseFolderId", this.DestinationFolderId.InternalToJson(service));
                            jsonObject.Add("DestinationFolderId", jsonObject2);
                        }
                    }
                    else {
                        if (this.ContextFolderId !== null) {
                            var jsonObject3: JsonObject = new JsonObject();
                            jsonObject3.Add("BaseFolderId", this.ContextFolderId.InternalToJson(service));
                            jsonObject.Add("ContextFolderId", jsonObject3);
                        }
                        if (this.ConversationLastSyncTime !== null) {
                            jsonObject.Add("ConversationLastSyncTime", this.ConversationLastSyncTime.Value);
                        }
                        if (this.Action === ConversationActionType.Copy) {
                            EwsUtilities.Assert(this.DestinationFolderId !== null, "ApplyconversationActionRequest", "DestinationFolderId should be set when performing copy action");
                            var jsonObject4: JsonObject = new JsonObject();
                            jsonObject4.Add("BaseFolderId", this.DestinationFolderId.InternalToJson(service));
                            jsonObject.Add("DestinationFolderId", jsonObject4);
                        }
                        else {
                            if (this.Action === ConversationActionType.Move) {
                                EwsUtilities.Assert(this.DestinationFolderId !== null, "ApplyconversationActionRequest", "DestinationFolderId should be set when performing move action");
                                var jsonObject5: JsonObject = new JsonObject();
                                jsonObject5.Add("BaseFolderId", this.DestinationFolderId.InternalToJson(service));
                                jsonObject.Add("DestinationFolderId", jsonObject5);
                            }
                            else {
                                if (this.Action === ConversationActionType.Delete) {
                                    EwsUtilities.Assert(this.DeleteType !== null, "ApplyconversationActionRequest", "DeleteType should be specified when deleting a conversation.");
                                    jsonObject.Add("DeleteType", this.DeleteType.Value);
                                }
                                else {
                                    if (this.Action === ConversationActionType.SetReadState) {
                                        EwsUtilities.Assert(this.IsRead !== null, "ApplyconversationActionRequest", "IsRead should be specified when marking/unmarking a conversation as read.");
                                        jsonObject.Add("IsRead", this.IsRead.Value);
                                        if (this.SuppressReadReceipts !== null) {
                                            jsonObject.Add("SuppressReadReceipts", this.SuppressReadReceipts !== null);
                                        }
                                    }
                                    else {
                                        if (this.Action === ConversationActionType.SetRetentionPolicy) {
                                            EwsUtilities.Assert(this.RetentionPolicyType !== null, "ApplyconversationActionRequest", "RetentionPolicyType should be specified when setting a retention policy on a conversation.");
                                            jsonObject.Add("RetentionPolicyType", this.RetentionPolicyType.Value);
                                            if (this.RetentionPolicyTagId !== null) {
                                                jsonObject.Add("RetentionPolicyTagId", this.RetentionPolicyTagId.Value);
                                            }
                                        }
                                        else {
                                            if (this.Action === ConversationActionType.Flag) {
                                                EwsUtilities.Assert(this.Flag !== null, "ApplyconversationActionRequest", "Flag should be specified when flagging items in a conversation.");
                                                jsonObject.Add("Flag", this.Flag.InternalToJson(service));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return jsonObject;
        }
        constructor() {
            super();
        }
    }
    class DelegateInformation {
        private delegateUserResponses: Collection<DelegateUserResponse> = null;
        private meetingReqestsDeliveryScope: MeetingRequestsDeliveryScope = 0;
        get DelegateUserResponses(): Collection<DelegateUserResponse> {
            return this.delegateUserResponses;
        }
        get MeetingRequestsDeliveryScope(): MeetingRequestsDeliveryScope {
            return this.meetingReqestsDeliveryScope;
        }
        constructor(delegateUserResponses: IList<DelegateUserResponse>, meetingReqestsDeliveryScope: MeetingRequestsDeliveryScope) {
            super();
            this.delegateUserResponses = new Collection<DelegateUserResponse>(delegateUserResponses);
            this.meetingReqestsDeliveryScope = meetingReqestsDeliveryScope;
        }
    }
    class EwsTraceListener implements ITraceListener {
        private writer: TextWriter = null;
        constructor();
        constructor(writer: TextWriter);
        constructor(writer?: TextWriter) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(writer);
        }
        private constructor_0(): void {
            this.constructor_1(NConsole.Out);
        }
        private constructor_1(writer: TextWriter): void {
            this.writer = writer;
        }
        Trace(traceType: string, traceMessage: string): void {
            this.writer.Write(traceMessage);
        }
    }
    class ExpandGroupResults implements IEnumerable<EmailAddress>
    {
        private includesAllMembers: boolean = false;
        private members: Collection<EmailAddress> = new Collection<EmailAddress>();
        get Count(): number {
            return this.members.Count;
        }
        get IncludesAllMembers(): boolean {
            return this.includesAllMembers;
        }
        get Members(): Collection<EmailAddress> {
            return this.members;
        }
        constructor() {
            super();
        }
        GetEnumerator(): IEnumerator<EmailAddress> {
            return this.members.GetEnumerator();
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "DLExpansion");
            if (!reader.IsEmptyElement) {
                var num: number = reader.ReadAttributeValue<number>("TotalItemsInView");
                this.includesAllMembers = reader.ReadAttributeValue<boolean>("IncludesLastItemInRange");
                for (var i: number = 0; i < num; i = i + 1) {
                    var emailAddress: EmailAddress = new EmailAddress();
                    reader.ReadStartElement(XmlNamespace.Types, "Mailbox");
                    emailAddress.LoadFromXml(reader, "Mailbox");
                    this.members.Add(emailAddress);
                }
                reader.ReadEndElement(XmlNamespace.Messages, "DLExpansion");
            }
        }
    }
    class FolderIdWrapper extends AbstractFolderIdWrapper {
        private folderId: FolderId = null;
        constructor(folderId: FolderId) {
            super();
            EwsUtilities.Assert(folderId !== null, "FolderIdWrapper.ctor", "folderId is null");
            this.folderId = folderId;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.folderId.WriteToXml(writer);
        }
        Validate(version: ExchangeVersion): void {
            this.folderId.Validate(version);
        }
        InternalToJson(service: ExchangeService): any {
            return this.folderId.InternalToJson(service);
        }
    }
    class FolderIdWrapperList implements IEnumerable<AbstractFolderIdWrapper>
    {
        private ids: List<AbstractFolderIdWrapper> = new List<AbstractFolderIdWrapper>();
        get Count(): number {
            return this.ids.Count;
        }
        get_Item(index: number): AbstractFolderIdWrapper {
            return this.ids.get_Item(index);
        }
        Add(folder: Folder): void;
        Add(folderId: FolderId): void;
        Add(folderOrFolderId: any): void {
            if (arguments.length === 1 && (folderOrFolderId === null || folderOrFolderId instanceof Folder)) {
                this.Add_0(folderOrFolderId);
                return;
            }
            this.Add_1(folderOrFolderId);
        }
        private Add_0(folder: Folder): void {
            this.ids.Add(new FolderWrapper(folder));
        }
        AddRange(folders: IEnumerable<Folder>): void;
        AddRange(folderIds: IEnumerable<FolderId>): void;
        AddRange(foldersOrFolderIds: any): void {
            if (arguments.length === 1) {
                this.AddRange_0(foldersOrFolderIds);
                return;
            }
            this.AddRange_1(foldersOrFolderIds);
        }
        private AddRange_0(folders: IEnumerable<Folder>): void {
            if (folders !== null) {
                var enumerator: IEnumerator<Folder> = folders.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: Folder = enumerator.Current;
                        this.Add(current);
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
        }
        private Add_1(folderId: FolderId): void {
            this.ids.Add(new FolderIdWrapper(folderId));
        }
        private AddRange_1(folderIds: IEnumerable<FolderId>): void {
            if (folderIds !== null) {
                var enumerator: IEnumerator<FolderId> = folderIds.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: FolderId = enumerator.Current;
                        this.Add(current);
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter, ewsNamesapce: XmlNamespace, xmlElementName: string): void {
            if (this.Count > 0) {
                writer.WriteStartElement(ewsNamesapce, xmlElementName);
                var enumerator: List_Enumerator<AbstractFolderIdWrapper> = this.ids.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: AbstractFolderIdWrapper = enumerator.Current;
                        current.WriteToXml(writer);
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                writer.WriteEndElement();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<AbstractFolderIdWrapper> = this.ids.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AbstractFolderIdWrapper = enumerator.Current;
                    list.Add((<IJsonSerializable>current).ToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list.ToArray();
        }
        Validate(version: ExchangeVersion): void {
            var enumerator: List_Enumerator<AbstractFolderIdWrapper> = this.ids.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AbstractFolderIdWrapper = enumerator.Current;
                    current.Validate(version);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        GetEnumerator(): IEnumerator<AbstractFolderIdWrapper> {
            return this.ids.GetEnumerator();
        }
        constructor() {
            super();
        }
    }
    class FolderWrapper extends AbstractFolderIdWrapper {
        private folder: Folder = null;
        constructor(folder: Folder) {
            super();
            EwsUtilities.Assert(folder !== null, "FolderWrapper.ctor", "folder is null");
            EwsUtilities.Assert(!folder.IsNew, "FolderWrapper.ctor", "folder does not have an Id");
            this.folder = folder;
        }
        GetFolder(): Folder {
            return this.folder;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.folder.Id.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            return this.folder.Id.InternalToJson(service);
        }
    }
    class HangingTraceStream extends Stream {
        private underlyingStream: Stream = null;
        private service: ExchangeService = null;
        private responseCopy: MemoryStream = null;
        get CanRead(): boolean {
            return true;
        }
        get CanSeek(): boolean {
            return false;
        }
        get CanWrite(): boolean {
            return false;
        }
        get Length(): number {
            throw new NotSupportedException();
        }
        set Position(value: number) {
            throw new NotSupportedException();
        }
        get Position(): number {
            throw new NotSupportedException();
        }
        constructor(stream: Stream, service: ExchangeService) {
            super();
            this.underlyingStream = stream;
            this.service = service;
        }
        Flush(): void {
        }
        Read(buffer: number[], offset: number, count: number): number {
            var num: number = this.underlyingStream.Read(buffer, offset, count);
            if (HangingServiceRequestBase.LogAllWireBytes) {
                var $string: string = Encoding.UTF8.GetString(buffer, offset, num);
                var logEntry: string = NString.Format("HangingTraceStream ID [{0}] returned {1} bytes. Bytes returned: [{2}]", this.GetHashCode(), num, $string);
                this.service.TraceMessage(TraceFlags.DebugMessage, logEntry);
            }
            if (this.responseCopy !== null) {
                this.responseCopy.Write(buffer, offset, num);
            }
            return num;
        }
        Seek(offset: number, origin: SeekOrigin): number {
            throw new NotSupportedException();
        }
        SetLength(value: number): void {
            throw new NotSupportedException();
        }
        Write(buffer: number[], offset: number, count: number): void {
            throw new NotSupportedException();
        }
        SetResponseCopy(responseCopy: MemoryStream): void {
            this.responseCopy = responseCopy;
        }
    }
    class ImpersonatedUserId {
        private idType: ConnectingIdType = 0;
        private id: string = null;
        set IdType(value: ConnectingIdType) {
            this.idType = value;
        }
        get IdType(): ConnectingIdType {
            return this.idType;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        constructor();
        constructor(idType: ConnectingIdType, id: string);
        constructor(idType?: ConnectingIdType, id?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(idType, id);
        }
        private constructor_0(): void {
        }
        private constructor_1(idType: ConnectingIdType, id: string): void {
            this.constructor_0();
            this.idType = idType;
            this.id = id;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            if (NString.IsNullOrEmpty(this.id)) {
                throw new ArgumentException(Strings.IdPropertyMustBeSet);
            }
            writer.WriteStartElement(XmlNamespace.Types, "ExchangeImpersonation");
            writer.WriteStartElement(XmlNamespace.Types, "ConnectingSID");
            var localName: string = (this.idType === ConnectingIdType.SmtpAddress && writer.Service.RequestedServerVersion === ExchangeVersion.Exchange2007_SP1) ? "PrimarySmtpAddress" : ConnectingIdType[this.IdType];
            writer.WriteElementValue(XmlNamespace.Types, localName, this.id);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
    class ItemIdWrapper extends AbstractItemIdWrapper {
        private itemId: ItemId = null;
        constructor(itemId: ItemId) {
            super();
            EwsUtilities.Assert(itemId !== null, "ItemIdWrapper.ctor", "itemId is null");
            this.itemId = itemId;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.itemId.WriteToXml(writer);
        }
        IternalToJson(service: ExchangeService): any {
            return this.itemId.InternalToJson(service);
        }
    }
    class ItemIdWrapperList implements IEnumerable<AbstractItemIdWrapper>
    {
        private itemIds: List<AbstractItemIdWrapper> = new List<AbstractItemIdWrapper>();
        get Count(): number {
            return this.itemIds.Count;
        }
        get_Item(index: number): Item {
            return this.itemIds.get_Item(index).GetItem();
        }
        constructor() {
            super();
        }
        Add(item: Item): void;
        Add(itemId: ItemId): void;
        Add(itemOrItemId: any): void {
            if (arguments.length === 1 && (itemOrItemId === null || itemOrItemId instanceof Item)) {
                this.Add_0(itemOrItemId);
                return;
            }
            this.Add_1(itemOrItemId);
        }
        private Add_0(item: Item): void {
            this.itemIds.Add(new ItemWrapper(item));
        }
        AddRange(items: IEnumerable<Item>): void;
        AddRange(itemIds: IEnumerable<ItemId>): void;
        AddRange(itemsOrItemIds: any): void {
            if (arguments.length === 1) {
                this.AddRange_0(itemsOrItemIds);
                return;
            }
            this.AddRange_1(itemsOrItemIds);
        }
        private AddRange_0(items: IEnumerable<Item>): void {
            var enumerator: IEnumerator<Item> = items.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Item = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        private Add_1(itemId: ItemId): void {
            this.itemIds.Add(new ItemIdWrapper(itemId));
        }
        private AddRange_1(itemIds: IEnumerable<ItemId>): void {
            var enumerator: IEnumerator<ItemId> = itemIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: ItemId = enumerator.Current;
                    this.Add(current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter, ewsNamesapce: XmlNamespace, xmlElementName: string): void {
            if (this.Count > 0) {
                writer.WriteStartElement(ewsNamesapce, xmlElementName);
                var enumerator: List_Enumerator<AbstractItemIdWrapper> = this.itemIds.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: AbstractItemIdWrapper = enumerator.Current;
                        current.WriteToXml(writer);
                    }
                }
                finally {
                    (<IDisposable>enumerator).Dispose();
                }
                writer.WriteEndElement();
            }
        }
        InternalToJson(service: ExchangeService): any {
            var list: List<any> = new List<any>();
            var enumerator: List_Enumerator<AbstractItemIdWrapper> = this.itemIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: AbstractItemIdWrapper = enumerator.Current;
                    list.Add((<IJsonSerializable>current).ToJson(service));
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list.ToArray();
        }
        GetEnumerator(): IEnumerator<AbstractItemIdWrapper> {
            return this.itemIds.GetEnumerator();
        }
    }
    class ItemWrapper extends AbstractItemIdWrapper {
        private item: Item = null;
        constructor(item: Item) {
            super();
            EwsUtilities.Assert(item !== null, "ItemWrapper.ctor", "item is null");
            EwsUtilities.Assert(!item.IsNew, "ItemWrapper.ctor", "item does not have an Id");
            this.item = item;
        }
        GetItem(): Item {
            return this.item;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.item.Id.WriteToXml(writer);
        }
        IternalToJson(service: ExchangeService): any {
            return (<IJsonSerializable>this.item.Id).ToJson(service);
        }
    }
    class ManagementRoles {
        private userRoles: string[] = null;
        private applicationRoles: string[] = null;
        constructor(userRole: string);
        constructor(userRole: string, applicationRole: string);
        constructor(userRoles: string[], applicationRoles: string[]);
        constructor(userRoleOrUserRoles: any, applicationRoleOrApplicationRoles?: any) {
            super();
            if (arguments.length === 1 && (userRoleOrUserRoles === null || userRoleOrUserRoles.constructor === String)) {
                this.constructor_0(userRoleOrUserRoles);
                return;
            }
            if (arguments.length === 2 && (userRoleOrUserRoles === null || userRoleOrUserRoles.constructor === String) && (applicationRoleOrApplicationRoles === null || applicationRoleOrApplicationRoles.constructor === String)) {
                this.constructor_1(userRoleOrUserRoles, applicationRoleOrApplicationRoles);
                return;
            }
            this.constructor_2(userRoleOrUserRoles, applicationRoleOrApplicationRoles);
        }
        private constructor_0(userRole: string): void {
            EwsUtilities.ValidateParam(userRole, "userRole");
            this.userRoles = [
                userRole
            ];
        }
        private constructor_1(userRole: string, applicationRole: string): void {
            if (userRole !== null) {
                EwsUtilities.ValidateParam(userRole, "userRole");
                this.userRoles = [
                    userRole
                ];
            }
            if (applicationRole !== null) {
                EwsUtilities.ValidateParam(applicationRole, "applicationRole");
                this.applicationRoles = [
                    applicationRole
                ];
            }
        }
        private constructor_2(userRoles: string[], applicationRoles: string[]): void {
            if (userRoles !== null) {
                this.userRoles = Enumerable.ToArray<string>(NArray.ToEnumerable(userRoles));
            }
            if (applicationRoles !== null) {
                this.applicationRoles = Enumerable.ToArray<string>(NArray.ToEnumerable(applicationRoles));
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "ManagementRole");
            this.WriteRolesToXml(writer, this.userRoles, "UserRoles");
            this.WriteRolesToXml(writer, this.applicationRoles, "ApplicationRoles");
            writer.WriteEndElement();
        }
        private WriteRolesToXml(writer: EwsServiceXmlWriter, roles: string[], elementName: string): void {
            if (roles !== null) {
                writer.WriteStartElement(XmlNamespace.Types, elementName);
                for (var i: number = 0; i < roles.length; i = i + 1) {
                    var value: string = roles[i];
                    writer.WriteElementValue(XmlNamespace.Types, "Role", value);
                }
                writer.WriteEndElement();
            }
        }
        ToJsonObject(): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            if (this.userRoles !== null) {
                jsonObject.Add("UserRoles", NArray.ToEnumerable(this.userRoles));
            }
            if (this.applicationRoles !== null) {
                jsonObject.Add("ApplicationRoles", NArray.ToEnumerable(this.applicationRoles));
            }
            return jsonObject;
        }
    }
    class MapiTypeConverterMapEntry {
        private static defaultValueMap: LazyMember<Dictionary<Type, any>> = new LazyMember<Dictionary<Type, any>>(() => {
            var dictionary: Dictionary<Type, any> = new Dictionary<Type, any>();
            dictionary.Add(new Type("Boolean"), false);
            dictionary.Add(new Type("Array"), null);
            dictionary.Add(new Type("Number"), 0);
            dictionary.Add(new Type("Number"), 0);
            dictionary.Add(new Type("Number"), 0);
            dictionary.Add(new Type("Number"), 0);
            dictionary.Add(new Type("Number"), 0.0);
            dictionary.Add(new Type("DateTime"), DateTime.MinValue);
            dictionary.Add(new Type("Guid"), Guid.Empty);
            dictionary.Add(new Type("String"), null);
            return dictionary;
        });
        Parse: (arg: string) => any = null;
        ConvertToString: (arg: any) => string = null;
        Type: Type = null;
        IsArray: boolean = false;
        get DefaultValue(): any {
            return MapiTypeConverterMapEntry.defaultValueMap.Member.get_Item(this.Type);
        }
        constructor(type: Type) {
            super();
            EwsUtilities.Assert(MapiTypeConverterMapEntry.defaultValueMap.Member.ContainsKey(type), "MapiTypeConverterMapEntry ctor", NString.Format("No default value entry for type {0}", type.Name));
            this.Type = type;
            this.ConvertToString = ((o: any) => { return <string>Convert.ChangeType(o, new Type("String"), CultureInfo.InvariantCulture); });
            this.Parse = ((s: string) => { return Convert.ChangeType(s, type, CultureInfo.InvariantCulture); });
        }
        ChangeType(value: any): any {
            if (this.IsArray) {
                this.ValidateValueAsArray(value);
                return value;
            }
            if (Type.op_Equality(value.GetType(), this.Type)) {
                return value;
            }
            var result: any;
            try {
                result = Convert.ChangeType(value, this.Type, CultureInfo.InvariantCulture);
            }
            catch (innerException) {
                if (innerException instanceof InvalidCastException) {
                    throw new ArgumentException(NString.Format(Strings.ValueOfTypeCannotBeConverted, value, value.GetType(), this.Type), innerException);
                }
                else
                    throw innerException;
            }
            return result;
        }
        ConvertToValue(stringValue: string): any {
            var result: any;
            try {
                result = this.Parse(stringValue);
            }
            catch (innerException) {
                if (innerException instanceof FormatException) {
                    throw new ServiceXmlDeserializationException(NString.Format(Strings.ValueCannotBeConverted, stringValue, this.Type), innerException);
                }
                else
                    if (innerException instanceof InvalidCastException) {
                        throw new ServiceXmlDeserializationException(NString.Format(Strings.ValueCannotBeConverted, stringValue, this.Type), innerException2);
                    }
                    else
                        if (innerException instanceof OverflowException) {
                            throw new ServiceXmlDeserializationException(NString.Format(Strings.ValueCannotBeConverted, stringValue, this.Type), innerException3);
                        }
                        else
                            throw innerException;
            }
            return result;
        }
        ConvertToValueOrDefault(stringValue: string): any {
            if (!NString.IsNullOrEmpty(stringValue)) {
                return this.ConvertToValue(stringValue);
            }
            return this.DefaultValue;
        }
        private ValidateValueAsArray(value: any): void {
            var array: Array = ((value instanceof Array) ? <Array>value : null);
            if (array === null) {
                throw new ArgumentException(NString.Format(Strings.IncompatibleTypeForArray, value.GetType(), this.Type));
            }
            if (array.Rank !== 1) {
                throw new ArgumentException(Strings.ArrayMustHaveSingleDimension);
            }
            if (array.Length === 0) {
                throw new ArgumentException(Strings.ArrayMustHaveAtLeastOneElement);
            }
            if (Type.op_Inequality(array.GetType().GetElementType(), this.Type)) {
                throw new ArgumentException(NString.Format(Strings.IncompatibleTypeForArray, value.GetType(), this.Type));
            }
        }
    }
    class MapiTypeConverter {
        private static UtcDataTimeStyles: DateTimeStyles = DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal;
        private static mapiTypeConverterMap: LazyMember<Dictionary<MapiPropertyType, MapiTypeConverterMapEntry>> = new LazyMember<Dictionary<MapiPropertyType, MapiTypeConverterMapEntry>>(() => {
            var dictionary: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = new Dictionary<MapiPropertyType, MapiTypeConverterMapEntry>();
            dictionary.Add(MapiPropertyType.ApplicationTime, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_39_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_39_1: MapiPropertyType = MapiPropertyType.ApplicationTimeArray;
            var mapiTypeConverterMapEntry: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry.IsArray = true;
            arg_39_0.Add(arg_39_1, mapiTypeConverterMapEntry);
            var mapiTypeConverterMapEntry2: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Array"));
            mapiTypeConverterMapEntry2.Parse = (s: string) => {
                if (!NString.IsNullOrEmpty(s)) {
                    return Convert.FromBase64String(s);
                }
                return null;
            };
            mapiTypeConverterMapEntry2.ConvertToString = ((o: any) => { return Convert.ToBase64String(<number[]>o); });
            var value: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry2;
            dictionary.Add(MapiPropertyType.Binary, value);
            var mapiTypeConverterMapEntry3: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Array"));
            mapiTypeConverterMapEntry3.Parse = (s: string) => {
                if (!NString.IsNullOrEmpty(s)) {
                    return Convert.FromBase64String(s);
                }
                return null;
            };
            mapiTypeConverterMapEntry3.ConvertToString = ((o: any) => { return Convert.ToBase64String(<number[]>o); });
            mapiTypeConverterMapEntry3.IsArray = true;
            var value2: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry3;
            dictionary.Add(MapiPropertyType.BinaryArray, value2);
            var mapiTypeConverterMapEntry4: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Boolean"));
            mapiTypeConverterMapEntry4.Parse = ((s: string) => { return Convert.ChangeType(s, new Type("Boolean"), CultureInfo.InvariantCulture); });
            mapiTypeConverterMapEntry4.ConvertToString = ((o: any) => { return NBoolean.ToString(<boolean>o, CultureInfo.InvariantCulture).ToLower(); });
            var value3: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry4;
            dictionary.Add(MapiPropertyType.Boolean, value3);
            var mapiTypeConverterMapEntry5: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Guid"));
            mapiTypeConverterMapEntry5.Parse = ((s: string) => { return new Guid(s); });
            mapiTypeConverterMapEntry5.ConvertToString = ((o: any) => { return (<Guid>o).ToString(); });
            var value4: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry5;
            dictionary.Add(MapiPropertyType.CLSID, value4);
            var mapiTypeConverterMapEntry6: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Guid"));
            mapiTypeConverterMapEntry6.Parse = ((s: string) => { return new Guid(s); });
            mapiTypeConverterMapEntry6.ConvertToString = ((o: any) => { return (<Guid>o).ToString(); });
            mapiTypeConverterMapEntry6.IsArray = true;
            var value5: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry6;
            dictionary.Add(MapiPropertyType.CLSIDArray, value5);
            dictionary.Add(MapiPropertyType.Currency, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_279_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_279_1: MapiPropertyType = MapiPropertyType.CurrencyArray;
            var mapiTypeConverterMapEntry7: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry7.IsArray = true;
            arg_279_0.Add(arg_279_1, mapiTypeConverterMapEntry7);
            dictionary.Add(MapiPropertyType.Double, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_2B3_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_2B3_1: MapiPropertyType = MapiPropertyType.DoubleArray;
            var mapiTypeConverterMapEntry8: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry8.IsArray = true;
            arg_2B3_0.Add(arg_2B3_1, mapiTypeConverterMapEntry8);
            dictionary.Add(MapiPropertyType.Error, new MapiTypeConverterMapEntry(new Type("Number")));
            dictionary.Add(MapiPropertyType.Float, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_304_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_304_1: MapiPropertyType = MapiPropertyType.FloatArray;
            var mapiTypeConverterMapEntry9: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry9.IsArray = true;
            arg_304_0.Add(arg_304_1, mapiTypeConverterMapEntry9);
            var arg_343_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_343_1: MapiPropertyType = MapiPropertyType.Integer;
            var mapiTypeConverterMapEntry10: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry10.Parse = ((s: string) => { return MapiTypeConverter.ParseMapiIntegerValue(s); });
            arg_343_0.Add(arg_343_1, mapiTypeConverterMapEntry10);
            var arg_366_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_366_1: MapiPropertyType = MapiPropertyType.IntegerArray;
            var mapiTypeConverterMapEntry11: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry11.IsArray = true;
            arg_366_0.Add(arg_366_1, mapiTypeConverterMapEntry11);
            dictionary.Add(MapiPropertyType.Long, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_3A0_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_3A0_1: MapiPropertyType = MapiPropertyType.LongArray;
            var mapiTypeConverterMapEntry12: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry12.IsArray = true;
            arg_3A0_0.Add(arg_3A0_1, mapiTypeConverterMapEntry12);
            var mapiTypeConverterMapEntry13: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("String"));
            mapiTypeConverterMapEntry13.Parse = ((s: string) => { return s; });
            var value6: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry13;
            dictionary.Add(MapiPropertyType.Object, value6);
            var mapiTypeConverterMapEntry14: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("String"));
            mapiTypeConverterMapEntry14.Parse = ((s: string) => { return s; });
            mapiTypeConverterMapEntry14.IsArray = true;
            var value7: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry14;
            dictionary.Add(MapiPropertyType.ObjectArray, value7);
            dictionary.Add(MapiPropertyType.Short, new MapiTypeConverterMapEntry(new Type("Number")));
            var arg_468_0: Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> = dictionary;
            var arg_468_1: MapiPropertyType = MapiPropertyType.ShortArray;
            var mapiTypeConverterMapEntry15: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("Number"));
            mapiTypeConverterMapEntry15.IsArray = true;
            arg_468_0.Add(arg_468_1, mapiTypeConverterMapEntry15);
            var mapiTypeConverterMapEntry16: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("String"));
            mapiTypeConverterMapEntry16.Parse = ((s: string) => { return s; });
            var value8: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry16;
            dictionary.Add(MapiPropertyType.String, value8);
            var mapiTypeConverterMapEntry17: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("String"));
            mapiTypeConverterMapEntry17.Parse = ((s: string) => { return s; });
            mapiTypeConverterMapEntry17.IsArray = true;
            var value9: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry17;
            dictionary.Add(MapiPropertyType.StringArray, value9);
            var mapiTypeConverterMapEntry18: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("DateTime"));
            mapiTypeConverterMapEntry18.Parse = ((s: string) => { return DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); });
            mapiTypeConverterMapEntry18.ConvertToString = ((o: any) => { return EwsUtilities.DateTimeToXSDateTime(<DateTime>o); });
            var value10: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry18;
            dictionary.Add(MapiPropertyType.SystemTime, value10);
            var mapiTypeConverterMapEntry19: MapiTypeConverterMapEntry = new MapiTypeConverterMapEntry(new Type("DateTime"));
            mapiTypeConverterMapEntry19.IsArray = true;
            mapiTypeConverterMapEntry19.Parse = ((s: string) => { return DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); });
            mapiTypeConverterMapEntry19.ConvertToString = ((o: any) => { return EwsUtilities.DateTimeToXSDateTime(<DateTime>o); });
            var value11: MapiTypeConverterMapEntry = mapiTypeConverterMapEntry19;
            dictionary.Add(MapiPropertyType.SystemTimeArray, value11);
            return dictionary;
        });
        static get MapiTypeConverterMap(): Dictionary<MapiPropertyType, MapiTypeConverterMapEntry> {
            return MapiTypeConverter.mapiTypeConverterMap.Member;
        }
        static ConvertToValue(mapiPropType: MapiPropertyType, strings: IEnumerable<string>): Array;
        static ConvertToValue(mapiPropType: MapiPropertyType, stringValue: string): Array;
        static ConvertToValue(mapiPropType: MapiPropertyType, stringsOrStringValue: any): Array {
            if (arguments.length === 2 && (mapiPropType === null || mapiPropType.constructor === Number)) {
                return MapiTypeConverter.ConvertToValue_0(mapiPropType, stringsOrStringValue);
            }
            return MapiTypeConverter.ConvertToValue_1(mapiPropType, stringsOrStringValue);
        }
        private static ConvertToValue_0(mapiPropType: MapiPropertyType, strings: IEnumerable<string>): Array {
            EwsUtilities.ValidateParam(strings, "strings");
            var mapiTypeConverterMapEntry: MapiTypeConverterMapEntry = MapiTypeConverter.MapiTypeConverterMap.get_Item(mapiPropType);
            var array: Array = NArray.CreateInstance(mapiTypeConverterMapEntry.Type, Enumerable.Count<string>(strings));
            var num: number = 0;
            var enumerator: IEnumerator<string> = strings.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var value: any = mapiTypeConverterMapEntry.ConvertToValueOrDefault(current);
                    array.SetValue(value, num++);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            return array;
        }
        private static ConvertToValue_1(mapiPropType: MapiPropertyType, stringValue: string): any {
            return MapiTypeConverter.MapiTypeConverterMap.get_Item(mapiPropType).ConvertToValue(stringValue);
        }
        static ConvertToString(mapiPropType: MapiPropertyType, value: any): string {
            if (value !== null) {
                return MapiTypeConverter.MapiTypeConverterMap.get_Item(mapiPropType).ConvertToString(value);
            }
            return NString.Empty;
        }
        static ChangeType(mapiType: MapiPropertyType, value: any): any {
            EwsUtilities.ValidateParam(value, "value");
            return MapiTypeConverter.MapiTypeConverterMap.get_Item(mapiType).ChangeType(value);
        }
        static ParseMapiIntegerValue(s: string): any {
            var num: number;
            if ((() => {
                var _p0 = [
                    num
                ];
                var _r = NNumber.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, _p0);
                num = _p0[0];
                return _r;
            })()) {
                return num;
            }
            return s;
        }
        static IsArrayType(mapiType: MapiPropertyType): boolean {
            return MapiTypeConverter.MapiTypeConverterMap.get_Item(mapiType).IsArray;
        }
        constructor() {
            super();
        }
    }
    class MobilePhone implements ISelfValidate {
        private name: string = null;
        private phoneNumber: string = null;
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set PhoneNumber(value: string) {
            this.phoneNumber = value;
        }
        get PhoneNumber(): string {
            return this.phoneNumber;
        }
        constructor();
        constructor(name: string, phoneNumber: string);
        constructor(name?: string, phoneNumber?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(name, phoneNumber);
        }
        private constructor_0(): void {
        }
        private constructor_1(name: string, phoneNumber: string): void {
            this.name = name;
            this.phoneNumber = phoneNumber;
        }
        Validate(): void {
            if (NString.IsNullOrEmpty(this.PhoneNumber)) {
                throw new ServiceValidationException("PhoneNumber cannot be empty.");
            }
        }
    }
    class NameResolution {
        private owner: NameResolutionCollection = null;
        private mailbox: EmailAddress = new EmailAddress();
        private contact: Contact = null;
        get Mailbox(): EmailAddress {
            return this.mailbox;
        }
        get Contact(): Contact {
            return this.contact;
        }
        constructor(owner: NameResolutionCollection) {
            super();
            EwsUtilities.Assert(owner !== null, "NameResolution.ctor", "owner is null.");
            this.owner = owner;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Types, "Resolution");
            reader.ReadStartElement(XmlNamespace.Types, "Mailbox");
            this.mailbox.LoadFromXml(reader, "Mailbox");
            reader.Read();
            if (reader.IsStartElement(XmlNamespace.Types, "Contact")) {
                this.contact = new Contact(this.owner.Session);
                this.contact.LoadFromXml(reader, true, PropertySet.FirstClassProperties, false);
                reader.ReadEndElement(XmlNamespace.Types, "Resolution");
                return;
            }
            reader.EnsureCurrentNodeIsEndElement(XmlNamespace.Types, "Resolution");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Mailbox")) {
                            if (a === "Contact") {
                                this.contact = new Contact(this.owner.Session);
                                this.contact.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service, true, PropertySet.FirstClassProperties, false);
                            }
                        }
                        else {
                            this.mailbox.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class NameResolutionCollection implements IEnumerable<NameResolution>
    {
        private service: ExchangeService = null;
        private includesAllResolutions: boolean = false;
        private items: List<NameResolution> = new List<NameResolution>();
        get Session(): ExchangeService {
            return this.service;
        }
        get Count(): number {
            return this.items.Count;
        }
        get IncludesAllResolutions(): boolean {
            return this.includesAllResolutions;
        }
        get_Item(index: number): NameResolution {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.items.get_Item(index);
        }
        constructor(service: ExchangeService) {
            super();
            EwsUtilities.Assert(service !== null, "NameResolutionSet.ctor", "service is null.");
            this.service = service;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "ResolutionSet");
            var num: number = reader.ReadAttributeValue<number>("TotalItemsInView");
            this.includesAllResolutions = reader.ReadAttributeValue<boolean>("IncludesLastItemInRange");
            for (var i: number = 0; i < num; i = i + 1) {
                var nameResolution: NameResolution = new NameResolution(this);
                nameResolution.LoadFromXml(reader);
                this.items.Add(nameResolution);
            }
            reader.ReadEndElement(XmlNamespace.Messages, "ResolutionSet");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "TotalItemsInView")) {
                            if (!(a === "IncludesLastItemInRange")) {
                                if (a === "Resolutions") {
                                    var array: any[] = jsonProperty.ReadAsArray(current);
                                    var array2: any[] = array;
                                    for (var i: number = 0; i < array2.length; i = i + 1) {
                                        var obj: any = array2[i];
                                        var jsonObject: JsonObject = ((obj instanceof JsonObject) ? <JsonObject>obj : null);
                                        if (jsonObject !== null) {
                                            var nameResolution: NameResolution = new NameResolution(this);
                                            nameResolution.LoadFromJson(jsonObject, service);
                                            this.items.Add(nameResolution);
                                        }
                                    }
                                }
                            }
                            else {
                                this.includesAllResolutions = jsonProperty.ReadAsBool(current);
                            }
                        }
                        else {
                            jsonProperty.ReadAsInt(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        GetEnumerator(): IEnumerator<NameResolution> {
            return this.items.GetEnumerator();
        }
    }
    class PrivilegedUserId {
        private logonType: PrivilegedLogonType = 0;
        private idType: ConnectingIdType = 0;
        private id: string = null;
        private budgetType: Nullable<PrivilegedUserIdBudgetType> = null;
        set IdType(value: ConnectingIdType) {
            this.idType = value;
        }
        get IdType(): ConnectingIdType {
            return this.idType;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        set LogonType(value: PrivilegedLogonType) {
            this.logonType = value;
        }
        get LogonType(): PrivilegedLogonType {
            return this.logonType;
        }
        set BudgetType(value: Nullable<PrivilegedUserIdBudgetType>) {
            this.budgetType = value;
        }
        get BudgetType(): Nullable<PrivilegedUserIdBudgetType> {
            return this.budgetType;
        }
        constructor();
        constructor(openType: PrivilegedLogonType, idType: ConnectingIdType, id: string);
        constructor(openType?: PrivilegedLogonType, idType?: ConnectingIdType, id?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(openType, idType, id);
        }
        private constructor_0(): void {
        }
        private constructor_1(openType: PrivilegedLogonType, idType: ConnectingIdType, id: string): void {
            this.constructor_0();
            this.logonType = openType;
            this.idType = idType;
            this.id = id;
        }
        WriteToXml(writer: EwsServiceXmlWriter, requestedServerVersion: ExchangeVersion): void {
            if (NString.IsNullOrEmpty(this.id)) {
                throw new ArgumentException(Strings.IdPropertyMustBeSet);
            }
            writer.WriteStartElement(XmlNamespace.Types, "OpenAsAdminOrSystemService");
            writer.WriteAttributeString("LogonType", PrivilegedLogonType[this.logonType]);
            if (requestedServerVersion >= ExchangeVersion.Exchange2013 && this.budgetType !== null) {
                writer.WriteAttributeString("BudgetType", PrivilegedUserIdBudgetType[<number>this.budgetType.Value]);
            }
            writer.WriteStartElement(XmlNamespace.Types, "ConnectingSID");
            writer.WriteElementValue(XmlNamespace.Types, ConnectingIdType[this.idType], this.id);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
    enum PrivilegedUserIdBudgetType {
        Default,
        RunningAsBackgroundLoad,
        Unthrottled
    }
    class SoapFaultDetails {
        private faultCode: string = null;
        private faultString: string = null;
        private faultActor: string = null;
        private responseCode: ServiceError = ServiceError.ErrorInternalServerError;
        private message: string = null;
        private errorCode: ServiceError = 0;
        private exceptionType: string = null;
        private lineNumber: number = 0;
        private positionWithinLine: number = 0;
        private errorDetails: Dictionary<string, string> = new Dictionary<string, string>();
        set FaultCode(value: string) {
            this.faultCode = value;
        }
        get FaultCode(): string {
            return this.faultCode;
        }
        set FaultString(value: string) {
            this.faultString = value;
        }
        get FaultString(): string {
            return this.faultString;
        }
        set FaultActor(value: string) {
            this.faultActor = value;
        }
        get FaultActor(): string {
            return this.faultActor;
        }
        set ResponseCode(value: ServiceError) {
            this.responseCode = value;
        }
        get ResponseCode(): ServiceError {
            return this.responseCode;
        }
        set Message(value: string) {
            this.message = value;
        }
        get Message(): string {
            return this.message;
        }
        set ErrorCode(value: ServiceError) {
            this.errorCode = value;
        }
        get ErrorCode(): ServiceError {
            return this.errorCode;
        }
        set ExceptionType(value: string) {
            this.exceptionType = value;
        }
        get ExceptionType(): string {
            return this.exceptionType;
        }
        set LineNumber(value: number) {
            this.lineNumber = value;
        }
        get LineNumber(): number {
            return this.lineNumber;
        }
        set PositionWithinLine(value: number) {
            this.positionWithinLine = value;
        }
        get PositionWithinLine(): number {
            return this.positionWithinLine;
        }
        set ErrorDetails(value: Dictionary<string, string>) {
            this.errorDetails = value;
        }
        get ErrorDetails(): Dictionary<string, string> {
            return this.errorDetails;
        }
        constructor() {
            super();
        }
        static Parse(reader: EwsXmlReader, soapNamespace: XmlNamespace): SoapFaultDetails;
        static Parse(jsonObject: JsonObject): SoapFaultDetails;
        static Parse(readerOrJsonObject: any, soapNamespace?: XmlNamespace): SoapFaultDetails {
            if (arguments.length === 2 && (readerOrJsonObject === null || readerOrJsonObject instanceof EwsXmlReader) && (soapNamespace === null || soapNamespace.constructor === Number)) {
                return SoapFaultDetails.Parse_0(readerOrJsonObject, soapNamespace);
            }
            return SoapFaultDetails.Parse_1(readerOrJsonObject);
        }
        private static Parse_0(reader: EwsXmlReader, soapNamespace: XmlNamespace): SoapFaultDetails {
            var soapFaultDetails: SoapFaultDetails = new SoapFaultDetails();
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "faultcode")) {
                        if (!(localName === "faultstring")) {
                            if (!(localName === "faultactor")) {
                                if (localName === "detail") {
                                    soapFaultDetails.ParseDetailNode(reader);
                                }
                            }
                            else {
                                soapFaultDetails.FaultActor = reader.ReadElementValue();
                            }
                        }
                        else {
                            soapFaultDetails.FaultString = reader.ReadElementValue();
                        }
                    }
                    else {
                        soapFaultDetails.FaultCode = reader.ReadElementValue();
                    }
                }
            }
            while (!reader.IsEndElement(soapNamespace, "Fault"));
            return soapFaultDetails;
        }
        private static Parse_1(jsonObject: JsonObject): SoapFaultDetails {
            var soapFaultDetails: SoapFaultDetails = new SoapFaultDetails();
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonObject.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null && a === "FaultMessage") {
                        soapFaultDetails.FaultString = jsonObject.ReadAsString(current);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return soapFaultDetails;
        }
        private ParseDetailNode(reader: EwsXmlReader): void {
            do {
                var IL_132: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            var localName: string;
                            if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                                if (_PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x60016c6 - 1 === null)
                                {
                                    var expr_2E: Dictionary<string, number> = new Dictionary<string, number>(7);
                                    expr_2E.Add("ResponseCode", 0);
                                    expr_2E.Add("Message", 1);
                                    expr_2E.Add("Line", 2);
                                    expr_2E.Add("Position", 3);
                                    expr_2E.Add("ErrorCode", 4);
                                    expr_2E.Add("ExceptionType", 5);
                                    expr_2E.Add("MessageXml", 6);
                                    _PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x60016c6 - 1 = expr_2E;
                                }
                                var num: number;
                                if ((() => {
                                    var _p0 = [
                                        num
                                    ];
                                    var _r = _PrivateImplementationDetails_{70549B87-FCC0 - 4468 - A58C - F62EC848C70D}.$$method0x60016c6-1.TryGetValue(localName, _p0);
                                    num = _p0[0];
                                    return _r;
                                })()) {
                                    switch (num) {
                                        case 0:
                                            try {
                                                this.ResponseCode = reader.ReadElementValue<ServiceError>();
                                                _goto = IL_132;
                                                continue _GOTO_LOOP;
                                            }
                                            catch (ex_CF) {
                                                if (ex_CF instanceof ArgumentException) {
                                                    this.ResponseCode = ServiceError.ErrorInternalServerError;
                                                    _goto = IL_132;
                                                    continue _GOTO_LOOP;
                                                }
                                                else
                                                    throw ex_CF;
                                            }
                                            break;
                                        case 1:
                                            break;
                                        case 2:
                                            this.LineNumber = reader.ReadElementValue<number>();
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                        case 3:
                                            this.PositionWithinLine = reader.ReadElementValue<number>();
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                        case 4:
                                            try {
                                                this.ErrorCode = reader.ReadElementValue<ServiceError>();
                                                _goto = IL_132;
                                                continue _GOTO_LOOP;
                                            }
                                            catch (ex_112) {
                                                if (ex_112 instanceof ArgumentException) {
                                                    this.ErrorCode = ServiceError.ErrorInternalServerError;
                                                    _goto = IL_132;
                                                    continue _GOTO_LOOP;
                                                }
                                                else
                                                    throw ex_112;
                                            }
                                            this.ExceptionType = reader.ReadElementValue();
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                        case 5:
                                            this.ExceptionType = reader.ReadElementValue();
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                        case 6:
                                            this.ParseMessageXml(reader);
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                        default:
                                            _goto = IL_132;
                                            continue _GOTO_LOOP;
                                    }
                                    this.Message = reader.ReadElementValue();
                                    _goto = IL_132;
                                    continue _GOTO_LOOP;
                                }
                            }
                            _goto = IL_132;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, "detail"));
        }
        private ParseMessageXml(reader: EwsXmlReader): void {
            var namespaceFromUri: XmlNamespace = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    var localName: string;
                    if (reader.IsStartElement() && !reader.IsEmptyElement && (localName = reader.LocalName) !== null && localName === "Value") {
                        this.errorDetails.Add(reader.ReadAttributeValue("Name"), reader.ReadElementValue());
                    }
                }
                while (!reader.IsEndElement(namespaceFromUri, "MessageXml"));
            }
        }
    }
    class Time {
        private hours: number = 0;
        private minutes: number = 0;
        private seconds: number = 0;
        set Hours(value: number) {
            if (value >= 0 && value < 24) {
                this.hours = value;
                return;
            }
            throw new ArgumentException(Strings.HourMustBeBetween0And23);
        }
        get Hours(): number {
            return this.hours;
        }
        set Minutes(value: number) {
            if (value >= 0 && value < 60) {
                this.minutes = value;
                return;
            }
            throw new ArgumentException(Strings.MinuteMustBeBetween0And59);
        }
        get Minutes(): number {
            return this.minutes;
        }
        set Seconds(value: number) {
            if (value >= 0 && value < 60) {
                this.seconds = value;
                return;
            }
            throw new ArgumentException(Strings.SecondMustBeBetween0And59);
        }
        get Seconds(): number {
            return this.seconds;
        }
        constructor();
        constructor(minutes: number);
        constructor(dateTime: DateTime);
        constructor(hours: number, minutes: number, seconds: number);
        constructor(minutesOrDateTimeOrHours?: any, minutes?: number, seconds?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (minutesOrDateTimeOrHours === null || minutesOrDateTimeOrHours.constructor === Number)) {
                this.constructor_1(minutesOrDateTimeOrHours);
                return;
            }
            if (arguments.length === 1 && (minutesOrDateTimeOrHours === null || minutesOrDateTimeOrHours instanceof DateTime)) {
                this.constructor_2(minutesOrDateTimeOrHours);
                return;
            }
            this.constructor_3(minutesOrDateTimeOrHours, minutes, seconds);
        }
        private constructor_0(): void {
        }
        private constructor_1(minutes: number): void {
            this.constructor_0();
            if (minutes < 0 || minutes >= 1440) {
                throw new ArgumentException(Strings.MinutesMustBeBetween0And1439, "minutes");
            }
            this.Hours = minutes / 60;
            this.Minutes = minutes % 60;
            this.Seconds = 0;
        }
        private constructor_2(dateTime: DateTime): void {
            this.Hours = dateTime.Hour;
            this.Minutes = dateTime.Minute;
            this.Seconds = dateTime.Second;
        }
        private constructor_3(hours: number, minutes: number, seconds: number): void {
            this.constructor_0();
            this.Hours = hours;
            this.Minutes = minutes;
            this.Seconds = seconds;
        }
        ToXSTime(): string {
            return NString.Format("{0:00}:{1:00}:{2:00}", this.Hours, this.Minutes, this.Seconds);
        }
        ConvertToMinutes(): number {
            return this.Minutes + this.Hours * 60;
        }
    }
    class UserConfiguration implements IJsonSerializable {
        private static ObjectVersion: ExchangeVersion = ExchangeVersion.Exchange2010;
        private static PropertiesAvailableForNewObject: UserConfigurationProperties = UserConfigurationProperties.Dictionary | UserConfigurationProperties.XmlData | UserConfigurationProperties.BinaryData;
        private static NoProperties: UserConfigurationProperties = <UserConfigurationProperties>0;
        private service: ExchangeService = null;
        private name: string = null;
        private parentFolderId: FolderId = null;
        private itemId: ItemId = null;
        private dictionary: UserConfigurationDictionary = null;
        private xmlData: number[] = null;
        private binaryData: number[] = null;
        private propertiesAvailableForAccess: UserConfigurationProperties = 0;
        private updatedProperties: UserConfigurationProperties = 0;
        private isNew: boolean = false;
        set Name(value: string) {
            this.name = value;
        }
        get Name(): string {
            return this.name;
        }
        set ParentFolderId(value: FolderId) {
            this.parentFolderId = value;
        }
        get ParentFolderId(): FolderId {
            return this.parentFolderId;
        }
        get ItemId(): ItemId {
            return this.itemId;
        }
        get Dictionary(): UserConfigurationDictionary {
            return this.dictionary;
        }
        set XmlData(value: number[]) {
            this.xmlData = value;
            this.MarkPropertyForUpdate(UserConfigurationProperties.XmlData);
        }
        get XmlData(): number[] {
            this.ValidatePropertyAccess(UserConfigurationProperties.XmlData);
            return this.xmlData;
        }
        set BinaryData(value: number[]) {
            this.binaryData = value;
            this.MarkPropertyForUpdate(UserConfigurationProperties.BinaryData);
        }
        get BinaryData(): number[] {
            this.ValidatePropertyAccess(UserConfigurationProperties.BinaryData);
            return this.binaryData;
        }
        get IsDirty(): boolean {
            return this.updatedProperties !== <UserConfigurationProperties>0 || this.dictionary.IsDirty;
        }
        constructor(service: ExchangeService);
        constructor(service: ExchangeService, requestedProperties: UserConfigurationProperties);
        constructor(service: ExchangeService, requestedProperties?: UserConfigurationProperties) {
            super();
            if (arguments.length === 1 && (service === null || service instanceof ExchangeService)) {
                this.constructor_0(service);
                return;
            }
            this.constructor_1(service, requestedProperties);
        }
        private constructor_0(service: ExchangeService): void {
            this.constructor_1(service, UserConfigurationProperties.Dictionary | UserConfigurationProperties.XmlData | UserConfigurationProperties.BinaryData);
        }
        private static WriteByteArrayToXml(writer: EwsServiceXmlWriter, byteArray: number[], xmlElementName: string): void {
            EwsUtilities.Assert(writer !== null, "UserConfiguration.WriteByteArrayToXml", "writer is null");
            EwsUtilities.Assert(xmlElementName !== null, "UserConfiguration.WriteByteArrayToXml", "xmlElementName is null");
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            if (byteArray !== null && byteArray.length > 0) {
                writer.WriteValue(Convert.ToBase64String(byteArray), xmlElementName);
            }
            writer.WriteEndElement();
        }
        static WriteUserConfigurationNameToXml(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, name: string, parentFolderId: FolderId): void {
            EwsUtilities.Assert(writer !== null, "UserConfiguration.WriteUserConfigurationNameToXml", "writer is null");
            EwsUtilities.Assert(name !== null, "UserConfiguration.WriteUserConfigurationNameToXml", "name is null");
            EwsUtilities.Assert(parentFolderId !== null, "UserConfiguration.WriteUserConfigurationNameToXml", "parentFolderId is null");
            writer.WriteStartElement(xmlNamespace, "UserConfigurationName");
            writer.WriteAttributeValue("Name", name);
            parentFolderId.WriteToXml(writer);
            writer.WriteEndElement();
        }
        private constructor_1(service: ExchangeService, requestedProperties: UserConfigurationProperties): void {
            EwsUtilities.ValidateParam(service, "service");
            if (service.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                throw new ServiceVersionException(NString.Format(Strings.ObjectTypeIncompatibleWithRequestVersion, super.GetType().Name, ExchangeVersion.Exchange2010));
            }
            this.service = service;
            this.isNew = true;
            this.InitializeProperties(requestedProperties);
        }
        static Bind(service: ExchangeService, name: string, parentFolderId: FolderId, properties: UserConfigurationProperties): UserConfiguration;
        static Bind(service: ExchangeService, name: string, parentFolderName: WellKnownFolderName, properties: UserConfigurationProperties): UserConfiguration;
        static Bind(service: ExchangeService, name: string, parentFolderIdOrParentFolderName: any, properties: UserConfigurationProperties): UserConfiguration {
            if (arguments.length === 4 && (service === null || service instanceof ExchangeService) && (name === null || name.constructor === String) && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId) && (properties === null || properties.constructor === Number)) {
                return UserConfiguration.Bind_0(service, name, parentFolderIdOrParentFolderName, properties);
            }
            return UserConfiguration.Bind_1(service, name, parentFolderIdOrParentFolderName, properties);
        }
        private static Bind_0(service: ExchangeService, name: string, parentFolderId: FolderId, properties: UserConfigurationProperties): UserConfiguration {
            var userConfiguration: UserConfiguration = service.GetUserConfiguration(name, parentFolderId, properties);
            userConfiguration.isNew = false;
            return userConfiguration;
        }
        private static Bind_1(service: ExchangeService, name: string, parentFolderName: WellKnownFolderName, properties: UserConfigurationProperties): UserConfiguration {
            return UserConfiguration.Bind(service, name, new FolderId(parentFolderName), properties);
        }
        Save(name: string, parentFolderId: FolderId): void;
        Save(name: string, parentFolderName: WellKnownFolderName): void;
        Save(name: string, parentFolderIdOrParentFolderName: any): void {
            if (arguments.length === 2 && (name === null || name.constructor === String) && (parentFolderIdOrParentFolderName === null || parentFolderIdOrParentFolderName instanceof FolderId)) {
                this.Save_0(name, parentFolderIdOrParentFolderName);
                return;
            }
            this.Save_1(name, parentFolderIdOrParentFolderName);
        }
        private Save_0(name: string, parentFolderId: FolderId): void {
            EwsUtilities.ValidateParam(name, "name");
            EwsUtilities.ValidateParam(parentFolderId, "parentFolderId");
            parentFolderId.Validate(this.service.RequestedServerVersion);
            if (!this.isNew) {
                throw new InvalidOperationException(Strings.CannotSaveNotNewUserConfiguration);
            }
            this.parentFolderId = parentFolderId;
            this.name = name;
            this.service.CreateUserConfiguration(this);
            this.isNew = false;
            this.ResetIsDirty();
        }
        private Save_1(name: string, parentFolderName: WellKnownFolderName): void {
            this.Save(name, new FolderId(parentFolderName));
        }
        Update(): void {
            if (this.isNew) {
                throw new InvalidOperationException(Strings.CannotUpdateNewUserConfiguration);
            }
            if (this.IsPropertyUpdated(UserConfigurationProperties.BinaryData) || this.IsPropertyUpdated(UserConfigurationProperties.Dictionary) || this.IsPropertyUpdated(UserConfigurationProperties.XmlData)) {
                this.service.UpdateUserConfiguration(this);
            }
            this.ResetIsDirty();
        }
        Delete(): void {
            if (this.isNew) {
                throw new InvalidOperationException(Strings.DeleteInvalidForUnsavedUserConfiguration);
            }
            this.service.DeleteUserConfiguration(this.name, this.parentFolderId);
        }
        Load(properties: UserConfigurationProperties): void {
            this.InitializeProperties(properties);
            this.service.LoadPropertiesForUserConfiguration(this, properties);
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlNamespace: XmlNamespace, xmlElementName: string): void {
            EwsUtilities.Assert(writer !== null, "UserConfiguration.WriteToXml", "writer is null");
            EwsUtilities.Assert(xmlElementName !== null, "UserConfiguration.WriteToXml", "xmlElementName is null");
            writer.WriteStartElement(xmlNamespace, xmlElementName);
            UserConfiguration.WriteUserConfigurationNameToXml(writer, XmlNamespace.Types, this.name, this.parentFolderId);
            if (this.IsPropertyUpdated(UserConfigurationProperties.Dictionary)) {
                this.dictionary.WriteToXml(writer, "Dictionary");
            }
            if (this.IsPropertyUpdated(UserConfigurationProperties.XmlData)) {
                this.WriteXmlDataToXml(writer);
            }
            if (this.IsPropertyUpdated(UserConfigurationProperties.BinaryData)) {
                this.WriteBinaryDataToXml(writer);
            }
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("UserConfigurationName", this.GetJsonUserConfigName(service));
            jsonObject.Add("ItemId", this.itemId);
            if (this.IsPropertyUpdated(UserConfigurationProperties.Dictionary)) {
                jsonObject.Add("Dictionary", (<IJsonSerializable>this.dictionary).ToJson(service));
            }
            if (this.IsPropertyUpdated(UserConfigurationProperties.XmlData)) {
                jsonObject.Add("XmlData", this.GetBase64PropertyValue(this.XmlData));
            }
            if (this.IsPropertyUpdated(UserConfigurationProperties.BinaryData)) {
                jsonObject.Add("BinaryData", this.GetBase64PropertyValue(this.BinaryData));
            }
            return jsonObject;
        }
        private GetJsonUserConfigName(service: ExchangeService): JsonObject {
            var folderId: FolderId = this.parentFolderId;
            var text: string = this.name;
            return UserConfiguration.GetJsonUserConfigName(service, folderId, text);
        }
        static GetJsonUserConfigName(service: ExchangeService, parentFolderId: FolderId, name: string): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("BaseFolderId", parentFolderId.InternalToJson(service));
            jsonObject.Add("Name", name);
            return jsonObject;
        }
        private GetBase64PropertyValue(bytes: number[]): string {
            if (bytes === null || bytes.length === 0) {
                return NString.Empty;
            }
            return Convert.ToBase64String(bytes);
        }
        private IsPropertyUpdated(property: UserConfigurationProperties): boolean {
            var IL_A7: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        var flag: boolean = false;
                        var flag2: boolean = false;
                        switch (property) {
                            case UserConfigurationProperties.Dictionary:
                                flag = this.Dictionary.IsDirty;
                                flag2 = (this.Dictionary.Count === 0);
                                _goto = IL_A7;
                                continue _GOTO_LOOP;
                            case UserConfigurationProperties.Id | UserConfigurationProperties.Dictionary:
                                break;
                            case UserConfigurationProperties.XmlData:
                                flag = ((property & this.updatedProperties) === property);
                                flag2 = (this.xmlData === null || this.xmlData.length === 0);
                                _goto = IL_A7;
                                continue _GOTO_LOOP;
                            default:
                                if (property === UserConfigurationProperties.BinaryData) {
                                    flag = ((property & this.updatedProperties) === property);
                                    flag2 = (this.binaryData === null || this.binaryData.length === 0);
                                    _goto = IL_A7;
                                    continue _GOTO_LOOP;
                                }
                                break;
                        }
                        EwsUtilities.Assert(false, "UserConfiguration.IsPropertyUpdated", "property not supported: " + UserConfigurationProperties[property]);
                        _goto = IL_A7;
                        continue _GOTO_LOOP;
                    case 1:
                        return flag && (!flag2 || !this.isNew);
                }
            }
        }
        private WriteXmlDataToXml(writer: EwsServiceXmlWriter): void {
            EwsUtilities.Assert(writer !== null, "UserConfiguration.WriteXmlDataToXml", "writer is null");
            UserConfiguration.WriteByteArrayToXml(writer, this.xmlData, "XmlData");
        }
        private WriteBinaryDataToXml(writer: EwsServiceXmlWriter): void {
            EwsUtilities.Assert(writer !== null, "UserConfiguration.WriteBinaryDataToXml", "writer is null");
            UserConfiguration.WriteByteArrayToXml(writer, this.binaryData, "BinaryData");
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            EwsUtilities.Assert(reader !== null, "UserConfiguration.LoadFromXml", "reader is null");
            reader.ReadStartElement(XmlNamespace.Messages, "UserConfiguration");
            reader.Read();
            do {
                var IL_146: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            if (reader.NodeType === 1) {
                                var localName: string;
                                if ((localName = reader.LocalName) !== null) {
                                    if (localName === "UserConfigurationName") {
                                        var text: string = reader.ReadAttributeValue("Name");
                                        EwsUtilities.Assert(NString.Compare(this.name, text, StringComparison.Ordinal) === 0, "UserConfiguration.LoadFromXml", "UserConfigurationName does not match: Expected: " + this.name + " Name in response: " + text);
                                        reader.SkipCurrentElement();
                                        _goto = IL_146;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "ItemId") {
                                        this.itemId = new ItemId();
                                        this.itemId.LoadFromXml(reader, "ItemId");
                                        _goto = IL_146;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "Dictionary") {
                                        this.dictionary.LoadFromXml(reader, "Dictionary");
                                        _goto = IL_146;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "XmlData") {
                                        this.xmlData = Convert.FromBase64String(reader.ReadElementValue());
                                        _goto = IL_146;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "BinaryData") {
                                        this.binaryData = Convert.FromBase64String(reader.ReadElementValue());
                                        _goto = IL_146;
                                        continue _GOTO_LOOP;
                                    }
                                }
                                EwsUtilities.Assert(false, "UserConfiguration.LoadFromXml", "Xml element not supported: " + reader.LocalName);
                            }
                            _goto = IL_146;
                            continue _GOTO_LOOP;
                        case 1:
                            reader.Read();
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "UserConfiguration"));
        }
        LoadFromJson(responseObject: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = responseObject.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "UserConfigurationName")) {
                            if (!(a === "ItemId")) {
                                if (!(a === "Dictionary")) {
                                    if (!(a === "XmlData")) {
                                        if (a === "BinaryData") {
                                            this.binaryData = Convert.FromBase64String(responseObject.ReadAsString(current));
                                        }
                                    }
                                    else {
                                        this.xmlData = Convert.FromBase64String(responseObject.ReadAsString(current));
                                    }
                                }
                                else {
                                    (<IJsonCollectionDeserializer>this.dictionary).CreateFromJsonCollection(responseObject.ReadAsArray(current), service);
                                }
                            }
                            else {
                                this.itemId = new ItemId();
                                this.itemId.LoadFromJson(responseObject.ReadAsJsonObject(current), service);
                            }
                        }
                        else {
                            var jsonObject: JsonObject = responseObject.ReadAsJsonObject(current);
                            var text: string = jsonObject.ReadAsString("Name");
                            EwsUtilities.Assert(NString.Compare(this.name, text, StringComparison.Ordinal) === 0, "UserConfiguration.LoadFromJson", "UserConfigurationName does not match: Expected: " + this.name + " Name in response: " + text);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        private InitializeProperties(requestedProperties: UserConfigurationProperties): void {
            this.itemId = null;
            this.dictionary = new UserConfigurationDictionary();
            this.xmlData = null;
            this.binaryData = null;
            this.propertiesAvailableForAccess = requestedProperties;
            this.ResetIsDirty();
        }
        private ResetIsDirty(): void {
            this.updatedProperties = <UserConfigurationProperties>0;
            this.dictionary.IsDirty = false;
        }
        private ValidatePropertyAccess(property: UserConfigurationProperties): void {
            if ((property & this.propertiesAvailableForAccess) !== property) {
                throw new PropertyException(Strings.MustLoadOrAssignPropertyBeforeAccess, UserConfigurationProperties[property]);
            }
        }
        private MarkPropertyForUpdate(property: UserConfigurationProperties): void {
            this.updatedProperties = (this.updatedProperties | property);
            this.propertiesAvailableForAccess = (this.propertiesAvailableForAccess | property);
        }
    }
    class AttendeeInfo implements ISelfValidate {
        private smtpAddress: string = null;
        private attendeeType: MeetingAttendeeType = MeetingAttendeeType.Required;
        private excludeConflicts: boolean = false;
        set SmtpAddress(value: string) {
            this.smtpAddress = value;
        }
        get SmtpAddress(): string {
            return this.smtpAddress;
        }
        set AttendeeType(value: MeetingAttendeeType) {
            this.attendeeType = value;
        }
        get AttendeeType(): MeetingAttendeeType {
            return this.attendeeType;
        }
        set ExcludeConflicts(value: boolean) {
            this.excludeConflicts = value;
        }
        get ExcludeConflicts(): boolean {
            return this.excludeConflicts;
        }
        constructor();
        constructor(smtpAddress: string, attendeeType: MeetingAttendeeType, excludeConflicts: boolean);
        constructor(smtpAddress: string);
        constructor(smtpAddress?: string, attendeeType?: MeetingAttendeeType, excludeConflicts?: boolean) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 3 && (smtpAddress === null || smtpAddress.constructor === String) && (attendeeType === null || attendeeType.constructor === Number) && (excludeConflicts === null || excludeConflicts.constructor === Boolean)) {
                this.constructor_1(smtpAddress, attendeeType, excludeConflicts);
                return;
            }
            this.constructor_2(smtpAddress);
        }
        private constructor_0(): void {
        }
        private constructor_1(smtpAddress: string, attendeeType: MeetingAttendeeType, excludeConflicts: boolean): void {
            this.constructor_0();
            this.smtpAddress = smtpAddress;
            this.attendeeType = attendeeType;
            this.excludeConflicts = excludeConflicts;
        }
        private constructor_2(smtpAddress: string): void {
            this.constructor_1(smtpAddress, MeetingAttendeeType.Required, false);
            this.smtpAddress = smtpAddress;
        }
        static op_Implicit(smtpAddress: string): AttendeeInfo {
            return new AttendeeInfo(smtpAddress);
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, "MailboxData");
            writer.WriteStartElement(XmlNamespace.Types, "Email");
            writer.WriteElementValue(XmlNamespace.Types, "Address", this.SmtpAddress);
            writer.WriteEndElement();
            writer.WriteElementValue(XmlNamespace.Types, "AttendeeType", this.attendeeType);
            writer.WriteElementValue(XmlNamespace.Types, "ExcludeConflicts", this.excludeConflicts);
            writer.WriteEndElement();
        }
        Validate(): void {
            EwsUtilities.ValidateParam(this.smtpAddress, "SmtpAddress");
        }
    }
    class AvailabilityOptions {
        private mergedFreeBusyInterval: number = 30;
        private requestedFreeBusyView: FreeBusyViewType = FreeBusyViewType.Detailed;
        private goodSuggestionThreshold: number = 25;
        private maximumSuggestionsPerDay: number = 10;
        private maximumNonWorkHoursSuggestionsPerDay: number = 0;
        private meetingDuration: number = 60;
        private minimumSuggestionQuality: SuggestionQuality = SuggestionQuality.Fair;
        private detailedSuggestionsWindow: TimeWindow = null;
        private currentMeetingTime: Nullable<DateTime> = null;
        private globalObjectId: string = null;
        set MergedFreeBusyInterval(value: number) {
            if (value < 5 || value > 1440) {
                throw new ArgumentException(NString.Format(Strings.InvalidPropertyValueNotInRange, "MergedFreeBusyInterval", 5, 1440));
            }
            this.mergedFreeBusyInterval = value;
        }
        get MergedFreeBusyInterval(): number {
            return this.mergedFreeBusyInterval;
        }
        set RequestedFreeBusyView(value: FreeBusyViewType) {
            this.requestedFreeBusyView = value;
        }
        get RequestedFreeBusyView(): FreeBusyViewType {
            return this.requestedFreeBusyView;
        }
        set GoodSuggestionThreshold(value: number) {
            if (value < 1 || value > 49) {
                throw new ArgumentException(NString.Format(Strings.InvalidPropertyValueNotInRange, "GoodSuggestionThreshold", 1, 49));
            }
            this.goodSuggestionThreshold = value;
        }
        get GoodSuggestionThreshold(): number {
            return this.goodSuggestionThreshold;
        }
        set MaximumSuggestionsPerDay(value: number) {
            if (value < 0 || value > 48) {
                throw new ArgumentException(NString.Format(Strings.InvalidPropertyValueNotInRange, "MaximumSuggestionsPerDay", 0, 48));
            }
            this.maximumSuggestionsPerDay = value;
        }
        get MaximumSuggestionsPerDay(): number {
            return this.maximumSuggestionsPerDay;
        }
        set MaximumNonWorkHoursSuggestionsPerDay(value: number) {
            if (value < 0 || value > 48) {
                throw new ArgumentException(NString.Format(Strings.InvalidPropertyValueNotInRange, "MaximumNonWorkHoursSuggestionsPerDay", 0, 48));
            }
            this.maximumNonWorkHoursSuggestionsPerDay = value;
        }
        get MaximumNonWorkHoursSuggestionsPerDay(): number {
            return this.maximumNonWorkHoursSuggestionsPerDay;
        }
        set MeetingDuration(value: number) {
            if (value < 30 || value > 1440) {
                throw new ArgumentException(NString.Format(Strings.InvalidPropertyValueNotInRange, "MeetingDuration", 30, 1440));
            }
            this.meetingDuration = value;
        }
        get MeetingDuration(): number {
            return this.meetingDuration;
        }
        set MinimumSuggestionQuality(value: SuggestionQuality) {
            this.minimumSuggestionQuality = value;
        }
        get MinimumSuggestionQuality(): SuggestionQuality {
            return this.minimumSuggestionQuality;
        }
        set DetailedSuggestionsWindow(value: TimeWindow) {
            this.detailedSuggestionsWindow = value;
        }
        get DetailedSuggestionsWindow(): TimeWindow {
            return this.detailedSuggestionsWindow;
        }
        set CurrentMeetingTime(value: Nullable<DateTime>) {
            this.currentMeetingTime = value;
        }
        get CurrentMeetingTime(): Nullable<DateTime> {
            return this.currentMeetingTime;
        }
        set GlobalObjectId(value: string) {
            this.globalObjectId = value;
        }
        get GlobalObjectId(): string {
            return this.globalObjectId;
        }
        Validate(timeWindow: TimeSpan): void {
            if (TimeSpan.op_GreaterThan(TimeSpan.FromMinutes(<number>this.MergedFreeBusyInterval), timeWindow)) {
                throw new ArgumentException(Strings.MergedFreeBusyIntervalMustBeSmallerThanTimeWindow, "MergedFreeBusyInterval");
            }
            EwsUtilities.ValidateParamAllowNull(this.DetailedSuggestionsWindow, "DetailedSuggestionsWindow");
        }
        WriteToXml(writer: EwsServiceXmlWriter, request: GetUserAvailabilityRequest): void {
            if (request.IsFreeBusyViewRequested) {
                writer.WriteStartElement(XmlNamespace.Types, "FreeBusyViewOptions");
                request.TimeWindow.WriteToXmlUnscopedDatesOnly(writer, "TimeWindow");
                writer.WriteElementValue(XmlNamespace.Types, "MergedFreeBusyIntervalInMinutes", this.MergedFreeBusyInterval);
                writer.WriteElementValue(XmlNamespace.Types, "RequestedView", this.RequestedFreeBusyView);
                writer.WriteEndElement();
            }
            if (request.IsSuggestionsViewRequested) {
                writer.WriteStartElement(XmlNamespace.Types, "SuggestionsViewOptions");
                writer.WriteElementValue(XmlNamespace.Types, "GoodThreshold", this.GoodSuggestionThreshold);
                writer.WriteElementValue(XmlNamespace.Types, "MaximumResultsByDay", this.MaximumSuggestionsPerDay);
                writer.WriteElementValue(XmlNamespace.Types, "MaximumNonWorkHourResultsByDay", this.MaximumNonWorkHoursSuggestionsPerDay);
                writer.WriteElementValue(XmlNamespace.Types, "MeetingDurationInMinutes", this.MeetingDuration);
                writer.WriteElementValue(XmlNamespace.Types, "MinimumSuggestionQuality", this.MinimumSuggestionQuality);
                var timeWindow: TimeWindow = (this.DetailedSuggestionsWindow === null) ? request.TimeWindow : this.DetailedSuggestionsWindow;
                timeWindow.WriteToXmlUnscopedDatesOnly(writer, "DetailedSuggestionsWindow");
                if (this.CurrentMeetingTime !== null) {
                    writer.WriteElementValue(XmlNamespace.Types, "CurrentMeetingTime", this.CurrentMeetingTime.Value);
                }
                writer.WriteElementValue(XmlNamespace.Types, "GlobalObjectId", this.GlobalObjectId);
                writer.WriteEndElement();
            }
        }
        constructor() {
            super();
        }
    }
    class GetUserAvailabilityResults {
        private attendeesAvailability: ServiceResponseCollection<AttendeeAvailability> = null;
        private suggestionsResponse: SuggestionsResponse = null;
        set SuggestionsResponse(value: SuggestionsResponse) {
            this.suggestionsResponse = value;
        }
        get SuggestionsResponse(): SuggestionsResponse {
            return this.suggestionsResponse;
        }
        set AttendeesAvailability(value: ServiceResponseCollection<AttendeeAvailability>) {
            this.attendeesAvailability = value;
        }
        get AttendeesAvailability(): ServiceResponseCollection<AttendeeAvailability> {
            return this.attendeesAvailability;
        }
        get Suggestions(): Collection<Suggestion> {
            if (this.suggestionsResponse === null) {
                return null;
            }
            this.suggestionsResponse.ThrowIfNecessary();
            return this.suggestionsResponse.Suggestions;
        }
        constructor() {
            super();
        }
    }
    class LegacyAvailabilityTimeZone extends ComplexProperty {
        private bias: TimeSpan = null;
        private standardTime: LegacyAvailabilityTimeZoneTime = null;
        private daylightTime: LegacyAvailabilityTimeZoneTime = null;
        constructor();
        constructor(timeZoneInfo: TimeZoneInfo);
        constructor(timeZoneInfo?: TimeZoneInfo) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(timeZoneInfo);
        }
        private constructor_0(): void {
        }
        private constructor_1(timeZoneInfo: TimeZoneInfo): void {
            this.constructor_0();
            this.bias = -timeZoneInfo.BaseUtcOffset;
            var adjustmentRules: TimeZoneInfo_AdjustmentRule[] = timeZoneInfo.GetAdjustmentRules();
            if (adjustmentRules.length === 0) {
                this.daylightTime = new LegacyAvailabilityTimeZoneTime();
                this.daylightTime.Delta = TimeSpan.Zero;
                this.daylightTime.DayOrder = 1;
                this.daylightTime.DayOfTheWeek = DayOfTheWeek.Sunday;
                this.daylightTime.Month = 10;
                this.daylightTime.TimeOfDay = TimeSpan.FromHours(2.0);
                this.daylightTime.Year = 0;
                this.standardTime = new LegacyAvailabilityTimeZoneTime();
                this.standardTime.Delta = TimeSpan.Zero;
                this.standardTime.DayOrder = 1;
                this.standardTime.DayOfTheWeek = DayOfTheWeek.Sunday;
                this.standardTime.Month = 3;
                this.standardTime.TimeOfDay = TimeSpan.FromHours(2.0);
                this.daylightTime.Year = 0;
                return;
            }
            var adjustmentRule: TimeZoneInfo_AdjustmentRule = adjustmentRules[adjustmentRules.length - 1];
            this.standardTime = new LegacyAvailabilityTimeZoneTime(adjustmentRule.DaylightTransitionEnd, TimeSpan.Zero);
            this.daylightTime = new LegacyAvailabilityTimeZoneTime(adjustmentRule.DaylightTransitionStart, -adjustmentRule.DaylightDelta);
        }
        ToTimeZoneInfo(): TimeZoneInfo {
            if (this.daylightTime.HasTransitionTime && this.standardTime.HasTransitionTime) {
                var adjustmentRule: TimeZoneInfo_AdjustmentRule = TimeZoneInfo_AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date, DateTime.MaxValue.Date, -this.daylightTime.Delta, this.daylightTime.ToTransitionTime(), this.standardTime.ToTransitionTime());
                return TimeZoneInfo.CreateCustomTimeZone(Guid.NewGuid().ToString(), -this.bias, "Custom time zone", "Standard time", "Daylight time", [
                    adjustmentRule
                ]);
            }
            return TimeZoneInfo.CreateCustomTimeZone(Guid.NewGuid().ToString(), -this.bias, "Custom time zone", "Standard time");
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "Bias") {
                    this.bias = TimeSpan.FromMinutes(<number>reader.ReadElementValue<number>());
                    return true;
                }
                if (localName === "StandardTime") {
                    this.standardTime = new LegacyAvailabilityTimeZoneTime();
                    this.standardTime.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
                if (localName === "DaylightTime") {
                    this.daylightTime = new LegacyAvailabilityTimeZoneTime();
                    this.daylightTime.LoadFromXml(reader, reader.LocalName);
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "Bias")) {
                            if (!(a === "StandardTime")) {
                                if (a === "DaylightTime") {
                                    this.daylightTime = new LegacyAvailabilityTimeZoneTime();
                                    this.daylightTime.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                                }
                            }
                            else {
                                this.standardTime = new LegacyAvailabilityTimeZoneTime();
                                this.standardTime.LoadFromJson(jsonProperty.ReadAsJsonObject(current), service);
                            }
                        }
                        else {
                            this.bias = TimeSpan.FromMinutes(<number>jsonProperty.ReadAsInt(current));
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Bias", <number>this.bias.TotalMinutes);
            this.standardTime.WriteToXml(writer, "StandardTime");
            this.daylightTime.WriteToXml(writer, "DaylightTime");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Bias", <number>this.bias.TotalMinutes);
            jsonObject.Add("StandardTime", this.standardTime.InternalToJson(service));
            jsonObject.Add("DaylightTime", this.daylightTime.InternalToJson(service));
            return jsonObject;
        }
    }
    class LegacyAvailabilityTimeZoneTime extends ComplexProperty {
        private delta: TimeSpan = null;
        private year: number = 0;
        private month: number = 0;
        private dayOrder: number = 0;
        private dayOfTheWeek: DayOfTheWeek = 0;
        private timeOfDay: TimeSpan = null;
        get HasTransitionTime(): boolean {
            return this.month >= 1 && this.month <= 12;
        }
        set Delta(value: TimeSpan) {
            this.delta = value;
        }
        get Delta(): TimeSpan {
            return this.delta;
        }
        set TimeOfDay(value: TimeSpan) {
            this.timeOfDay = value;
        }
        get TimeOfDay(): TimeSpan {
            return this.timeOfDay;
        }
        set DayOrder(value: number) {
            this.dayOrder = value;
        }
        get DayOrder(): number {
            return this.dayOrder;
        }
        set Month(value: number) {
            this.month = value;
        }
        get Month(): number {
            return this.month;
        }
        set DayOfTheWeek(value: DayOfTheWeek) {
            this.dayOfTheWeek = value;
        }
        get DayOfTheWeek(): DayOfTheWeek {
            return this.dayOfTheWeek;
        }
        set Year(value: number) {
            this.year = value;
        }
        get Year(): number {
            return this.year;
        }
        constructor();
        constructor(transitionTime: TimeZoneInfo_TransitionTime, delta: TimeSpan);
        constructor(transitionTime?: TimeZoneInfo_TransitionTime, delta?: TimeSpan) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(transitionTime, delta);
        }
        private constructor_0(): void {
        }
        private constructor_1(transitionTime: TimeZoneInfo_TransitionTime, delta: TimeSpan): void {
            this.constructor_0();
            this.delta = delta;
            if (transitionTime.IsFixedDateRule) {
                this.year = DateTime.Today.Year;
                this.month = transitionTime.Month;
                this.dayOrder = transitionTime.Day;
                this.timeOfDay = transitionTime.TimeOfDay.TimeOfDay;
                return;
            }
            this.year = 0;
            this.month = transitionTime.Month;
            this.dayOfTheWeek = EwsUtilities.SystemToEwsDayOfTheWeek(transitionTime.DayOfWeek);
            this.dayOrder = transitionTime.Week;
            this.timeOfDay = transitionTime.TimeOfDay.TimeOfDay;
        }
        ToTransitionTime(): TimeZoneInfo_TransitionTime {
            if (this.year === 0) {
                return TimeZoneInfo_TransitionTime.CreateFloatingDateRule(new DateTime(DateTime.MinValue.Year, DateTime.MinValue.Month, DateTime.MinValue.Day, this.timeOfDay.Hours, this.timeOfDay.Minutes, this.timeOfDay.Seconds), this.month, this.dayOrder, EwsUtilities.EwsToSystemDayOfWeek(this.dayOfTheWeek));
            }
            return TimeZoneInfo_TransitionTime.CreateFixedDateRule(new DateTime(this.timeOfDay.Ticks), this.month, this.dayOrder);
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            switch (localName = reader.LocalName) {
                case "Bias":
                    this.delta = TimeSpan.FromMinutes(<number>reader.ReadElementValue<number>());
                    return true;
                case "Time":
                    this.timeOfDay = TimeSpan.Parse(reader.ReadElementValue());
                    return true;
                case "DayOrder":
                    this.dayOrder = reader.ReadElementValue<number>();
                    return true;
                case "DayOfWeek":
                    this.dayOfTheWeek = reader.ReadElementValue<DayOfTheWeek>();
                    return true;
                case "Month":
                    this.month = reader.ReadElementValue<number>();
                    return true;
                case "Year":
                    this.year = reader.ReadElementValue<number>();
                    return true;
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "Bias":
                            this.delta = TimeSpan.FromMinutes(<number>jsonProperty.ReadAsInt(current));
                            break;
                        case "Time":
                            this.timeOfDay = TimeSpan.Parse(jsonProperty.ReadAsString(current));
                            break;
                        case "DayOrder":
                            this.dayOrder = jsonProperty.ReadAsInt(current);
                            break;
                        case "DayOfWeek":
                            this.dayOfTheWeek = jsonProperty.ReadEnumValue<DayOfTheWeek>(current);
                            break;
                        case "Month":
                            this.month = jsonProperty.ReadAsInt(current);
                            break;
                        case "Year":
                            this.year = jsonProperty.ReadAsInt(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteElementValue(XmlNamespace.Types, "Bias", <number>this.delta.TotalMinutes);
            writer.WriteElementValue(XmlNamespace.Types, "Time", EwsUtilities.TimeSpanToXSTime(this.timeOfDay));
            writer.WriteElementValue(XmlNamespace.Types, "DayOrder", this.dayOrder);
            writer.WriteElementValue(XmlNamespace.Types, "Month", this.month);
            if (this.Year === 0) {
                writer.WriteElementValue(XmlNamespace.Types, "DayOfWeek", this.dayOfTheWeek);
            }
            if (this.Year !== 0) {
                writer.WriteElementValue(XmlNamespace.Types, "Year", this.Year);
            }
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Bias", <number>this.delta.TotalMinutes);
            jsonObject.Add("Time", EwsUtilities.TimeSpanToXSTime(this.timeOfDay));
            jsonObject.Add("DayOrder", this.dayOrder);
            jsonObject.Add("Month", this.month);
            if (this.Year === 0) {
                jsonObject.Add("DayOfWeek", this.dayOfTheWeek);
            }
            if (this.Year !== 0) {
                jsonObject.Add("Year", this.Year);
            }
            return jsonObject;
        }
    }
    class OofReply {
        private culture: string = CultureInfo.CurrentCulture.Name;
        private message: string = null;
        set Culture(value: string) {
            this.culture = value;
        }
        get Culture(): string {
            return this.culture;
        }
        set Message(value: string) {
            this.message = value;
        }
        get Message(): string {
            return this.message;
        }
        static WriteEmptyReplyToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            writer.WriteEndElement();
        }
        constructor();
        constructor(message: string);
        constructor(message?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(message);
        }
        private constructor_0(): void {
        }
        private constructor_1(message: string): void {
            this.message = message;
        }
        static op_Implicit(message: string): OofReply {
            return new OofReply(message);
        }
        static op_Implicit(oofReply: OofReply): string {
            EwsUtilities.ValidateParam(oofReply, "oofReply");
            return oofReply.Message;
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, xmlElementName);
            if (reader.HasAttributes) {
                this.culture = reader.ReadAttributeValue("xml:lang");
            }
            this.message = reader.ReadElementValue(XmlNamespace.Types, "Message");
            reader.ReadEndElement(XmlNamespace.Types, xmlElementName);
        }
        LoadFromJson(jsonObject: JsonObject, service: ExchangeService): void {
            if (jsonObject.ContainsKey("xml:lang")) {
                this.culture = jsonObject.ReadAsString("xml:lang");
            }
            this.message = jsonObject.ReadAsString("Message");
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            if (this.Culture !== null) {
                writer.WriteAttributeValue("xml", "lang", this.Culture);
            }
            writer.WriteElementValue(XmlNamespace.Types, "Message", this.Message);
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            if (this.Culture !== null) {
                jsonObject.Add("xml:lang", this.Culture);
            }
            jsonObject.Add("Message", this.Message);
            return jsonObject;
        }
        ToString(): string {
            return this.Message;
        }
    }
    class TimeWindow implements ISelfValidate {
        private startTime: DateTime = null;
        private endTime: DateTime = null;
        set StartTime(value: DateTime) {
            this.startTime = value;
        }
        get StartTime(): DateTime {
            return this.startTime;
        }
        set EndTime(value: DateTime) {
            this.endTime = value;
        }
        get EndTime(): DateTime {
            return this.endTime;
        }
        get Duration(): TimeSpan {
            return DateTime.op_Subtraction(this.endTime, this.startTime);
        }
        constructor();
        constructor(startTime: DateTime, endTime: DateTime);
        constructor(startTime?: DateTime, endTime?: DateTime) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(startTime, endTime);
        }
        private constructor_0(): void {
        }
        private constructor_1(startTime: DateTime, endTime: DateTime): void {
            this.constructor_0();
            this.startTime = startTime;
            this.endTime = endTime;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "Duration");
            this.startTime = reader.ReadElementValueAsDateTime(XmlNamespace.Types, "StartTime").Value;
            this.endTime = reader.ReadElementValueAsDateTime(XmlNamespace.Types, "EndTime").Value;
            reader.ReadEndElement(XmlNamespace.Types, "Duration");
        }
        LoadFromJson(jsonObject: JsonObject, service: ExchangeService): void {
            this.startTime = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonObject.ReadAsString("StartTime")).Value;
            this.endTime = service.ConvertUniversalDateTimeStringToLocalDateTime(jsonObject.ReadAsString("EndTime")).Value;
        }
        private static WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string, startTime: any, endTime: any): void {
            writer.WriteStartElement(XmlNamespace.Types, xmlElementName);
            writer.WriteElementValue(XmlNamespace.Types, "StartTime", startTime);
            writer.WriteElementValue(XmlNamespace.Types, "EndTime", endTime);
            writer.WriteEndElement();
        }
        WriteToXmlUnscopedDatesOnly(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            TimeWindow.WriteToXml(writer, xmlElementName, this.StartTime.ToString("yyyy-MM-ddT00:00:00", CultureInfo.InvariantCulture), this.EndTime.ToString("yyyy-MM-ddT00:00:00", CultureInfo.InvariantCulture));
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            TimeWindow.WriteToXml(writer, xmlElementName, this.StartTime, this.EndTime);
        }
        InternalToJson(service: ExchangeService): JsonObject {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("StartTime", EwsUtilities.DateTimeToXSDateTime(this.startTime));
            jsonObject.Add("EndTime", EwsUtilities.DateTimeToXSDateTime(this.endTime));
            return jsonObject;
        }
        Validate(): void {
            if (DateTime.op_GreaterThanOrEqual(this.StartTime, this.EndTime)) {
                throw new ArgumentException(Strings.TimeWindowStartTimeMustBeGreaterThanEndTime);
            }
        }
    }
    class AlternateIdBase implements ISelfValidate, IJsonSerializable {
        Format: IdFormat = 0;
        constructor();
        constructor(format: IdFormat);
        constructor(format?: IdFormat) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(format);
        }
        private constructor_0(): void {
        }
        private constructor_1(format: IdFormat): void {
            this.constructor_0();
            this.Format = format;
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Format", this.Format);
        }
        LoadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.Format = reader.ReadAttributeValue<IdFormat>("Format");
        }
        LoadAttributesFromJson(responseObject: JsonObject): void {
            this.Format = responseObject.ReadEnumValue<IdFormat>("Format");
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Types, this.GetXmlElementName());
            this.WriteAttributesToXml(writer);
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            this.InternalToJson(jsonObject);
            return jsonObject;
        }
        InternalToJson(jsonObject: JsonObject): void {
            jsonObject.Add("Format", this.Format);
            jsonObject.AddTypeParameter(this.GetXmlElementName());
        }
        InternalValidate(): void {
        }
        Validate(): void {
            this.InternalValidate();
        }
    }
    class AlternateId extends AlternateIdBase {
        static SchemaTypeName: string = "AlternateIdType";
        UniqueId: string = null;
        Mailbox: string = null;
        IsArchive: boolean = false;
        constructor();
        constructor(format: IdFormat, id: string, mailbox: string);
        constructor(format: IdFormat, id: string, mailbox: string, isArchive: boolean);
        constructor(format?: IdFormat, id?: string, mailbox?: string, isArchive?: boolean) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 3 && (format === null || format.constructor === Number) && (id === null || id.constructor === String) && (mailbox === null || mailbox.constructor === String)) {
                this.constructor_1(format, id, mailbox);
                return;
            }
            this.constructor_2(format, id, mailbox, isArchive);
        }
        private constructor_0(): void {
        }
        private constructor_1(format: IdFormat, id: string, mailbox: string): void {
            this.UniqueId = id;
            this.Mailbox = mailbox;
        }
        private constructor_2(format: IdFormat, id: string, mailbox: string, isArchive: boolean): void {
            this.UniqueId = id;
            this.Mailbox = mailbox;
            this.IsArchive = isArchive;
        }
        GetXmlElementName(): string {
            return "AlternateId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("Id", this.UniqueId);
            writer.WriteAttributeValue("Mailbox", this.Mailbox);
            if (this.IsArchive) {
                writer.WriteAttributeValue("IsArchive", true);
            }
        }
        InternalToJson(jsonObject: JsonObject): void {
            super.InternalToJson(jsonObject);
            jsonObject.Add("Id", this.UniqueId);
            jsonObject.Add("Mailbox", this.Mailbox);
            if (this.IsArchive) {
                jsonObject.Add("IsArchive", true);
            }
        }
        LoadAttributesFromXml(reader: EwsServiceXmlReader): void {
            super.LoadAttributesFromXml(reader);
            this.UniqueId = reader.ReadAttributeValue("Id");
            this.Mailbox = reader.ReadAttributeValue("Mailbox");
            var value: string = reader.ReadAttributeValue("IsArchive");
            if (!NString.IsNullOrEmpty(value)) {
                this.IsArchive = reader.ReadAttributeValue<boolean>("IsArchive");
                return;
            }
            this.IsArchive = false;
        }
        LoadAttributesFromJson(responseObject: JsonObject): void {
            super.LoadAttributesFromJson(responseObject);
            this.UniqueId = responseObject.ReadAsString("Id");
            this.Mailbox = responseObject.ReadAsString("Mailbox");
            this.IsArchive = (responseObject.ContainsKey("IsArchive") && responseObject.ReadAsBool("IsArchive"));
        }
        InternalValidate(): void {
            EwsUtilities.ValidateParam(this.Mailbox, "mailbox");
        }
    }
    class AlternatePublicFolderId extends AlternateIdBase {
        static SchemaTypeName: string = "AlternatePublicFolderIdType";
        FolderId: string = null;
        constructor();
        constructor(format: IdFormat, folderId: string);
        constructor(format?: IdFormat, folderId?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(format, folderId);
        }
        private constructor_0(): void {
        }
        private constructor_1(format: IdFormat, folderId: string): void {
            this.FolderId = folderId;
        }
        GetXmlElementName(): string {
            return "AlternatePublicFolderId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("FolderId", this.FolderId);
        }
        InternalToJson(jsonObject: JsonObject): void {
            super.InternalToJson(jsonObject);
            jsonObject.Add("FolderId", this.FolderId);
        }
        LoadAttributesFromXml(reader: EwsServiceXmlReader): void {
            super.LoadAttributesFromXml(reader);
            this.FolderId = reader.ReadAttributeValue("FolderId");
        }
        LoadAttributesFromJson(responseObject: JsonObject): void {
            super.LoadAttributesFromJson(responseObject);
            this.FolderId = responseObject.ReadAsString("FolderId");
        }
    }
    class AlternatePublicFolderItemId extends AlternatePublicFolderId {
        static SchemaTypeName: string = "AlternatePublicFolderItemIdType";
        private itemId: string = null;
        set ItemId(value: string) {
            this.itemId = value;
        }
        get ItemId(): string {
            return this.itemId;
        }
        constructor();
        constructor(format: IdFormat, folderId: string, itemId: string);
        constructor(format?: IdFormat, folderId?: string, itemId?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(format, folderId, itemId);
        }
        private constructor_0(): void {
        }
        private constructor_1(format: IdFormat, folderId: string, itemId: string): void {
            this.itemId = itemId;
        }
        GetXmlElementName(): string {
            return "AlternatePublicFolderItemId";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("ItemId", this.ItemId);
        }
        InternalToJson(jsonObject: JsonObject): void {
            super.InternalToJson(jsonObject);
            jsonObject.Add("ItemId", this.ItemId);
        }
        LoadAttributesFromXml(reader: EwsServiceXmlReader): void {
            super.LoadAttributesFromXml(reader);
            this.itemId = reader.ReadAttributeValue("ItemId");
        }
        LoadAttributesFromJson(responseObject: JsonObject): void {
            super.LoadAttributesFromJson(responseObject);
            this.itemId = responseObject.ReadAsString("ItemId");
        }
    }
    class NotificationEvent {
        private eventType: EventType = 0;
        private timestamp: DateTime = null;
        private parentFolderId: FolderId = null;
        private oldParentFolderId: FolderId = null;
        get EventType(): EventType {
            return this.eventType;
        }
        get TimeStamp(): DateTime {
            return this.timestamp;
        }
        set ParentFolderId(value: FolderId) {
            this.parentFolderId = value;
        }
        get ParentFolderId(): FolderId {
            return this.parentFolderId;
        }
        set OldParentFolderId(value: FolderId) {
            this.oldParentFolderId = value;
        }
        get OldParentFolderId(): FolderId {
            return this.oldParentFolderId;
        }
        constructor(eventType: EventType, timestamp: DateTime) {
            super();
            this.eventType = eventType;
            this.timestamp = timestamp;
        }
        InternalLoadFromXml(reader: EwsServiceXmlReader): void {
        }
        LoadFromXml(reader: EwsServiceXmlReader, xmlElementName: string): void {
            this.InternalLoadFromXml(reader);
            reader.ReadEndElementIfNecessary(XmlNamespace.Types, xmlElementName);
        }
        LoadFromJson(jsonEvent: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
    }
    class FolderEvent extends NotificationEvent {
        private folderId: FolderId = null;
        private oldFolderId: FolderId = null;
        private unreadCount: Nullable<number> = null;
        get FolderId(): FolderId {
            return this.folderId;
        }
        get OldFolderId(): FolderId {
            return this.oldFolderId;
        }
        get UnreadCount(): Nullable<number> {
            return this.unreadCount;
        }
        constructor(eventType: EventType, timestamp: DateTime) {
            super(eventType, timestamp);
        }
        InternalLoadFromXml(reader: EwsServiceXmlReader): void {
            super.InternalLoadFromXml(reader);
            this.folderId = new FolderId();
            this.folderId.LoadFromXml(reader, reader.LocalName);
            reader.Read();
            this.ParentFolderId = new FolderId();
            this.ParentFolderId.LoadFromXml(reader, "ParentFolderId");
            switch (this.EventType) {
                case EventType.Modified:
                    reader.Read();
                    if (reader.IsStartElement()) {
                        reader.EnsureCurrentNodeIsStartElement(XmlNamespace.Types, "UnreadCount");
                        this.unreadCount = new Nullable<number>(NNumber.Parse(reader.ReadValue()));
                    }
                    return;
                case EventType.Moved:
                case EventType.Copied:
                    reader.Read();
                    this.oldFolderId = new FolderId();
                    this.oldFolderId.LoadFromXml(reader, reader.LocalName);
                    reader.Read();
                    this.OldParentFolderId = new FolderId();
                    this.OldParentFolderId.LoadFromXml(reader, reader.LocalName);
                    return;
                default:
                    return;
            }
        }
        LoadFromJson(jsonEvent: JsonObject, service: ExchangeService): void {
            this.folderId = new FolderId();
            this.folderId.LoadFromJson(jsonEvent.ReadAsJsonObject("FolderId"), service);
            this.ParentFolderId = new FolderId();
            this.ParentFolderId.LoadFromJson(jsonEvent.ReadAsJsonObject("ParentFolderId"), service);
            switch (this.EventType) {
                case EventType.Modified:
                    if (jsonEvent.ContainsKey("UnreadCount")) {
                        this.unreadCount = new Nullable<number>(jsonEvent.ReadAsInt("UnreadCount"));
                    }
                    return;
                case EventType.Moved:
                case EventType.Copied:
                    this.oldFolderId = new FolderId();
                    this.oldFolderId.LoadFromJson(jsonEvent.ReadAsJsonObject("OldFolderId"), service);
                    this.OldParentFolderId = new FolderId();
                    this.OldParentFolderId.LoadFromJson(jsonEvent.ReadAsJsonObject("OldParentFolderId"), service);
                    return;
                default:
                    return;
            }
        }
    }
    class GetEventsResults {
        private static xmlElementNameToEventTypeMap: LazyMember<Dictionary<string, EventType>> = new LazyMember<Dictionary<string, EventType>>(() => {
            var dictionary: Dictionary<string, EventType> = new Dictionary<string, EventType>();
            dictionary.Add("CopiedEvent", EventType.Copied);
            dictionary.Add("CreatedEvent", EventType.Created);
            dictionary.Add("DeletedEvent", EventType.Deleted);
            dictionary.Add("ModifiedEvent", EventType.Modified);
            dictionary.Add("MovedEvent", EventType.Moved);
            dictionary.Add("NewMailEvent", EventType.NewMail);
            dictionary.Add("StatusEvent", EventType.Status);
            dictionary.Add("FreeBusyChangedEvent", EventType.FreeBusyChanged);
            return dictionary;
        });
        privateWatermark: string = null;
        private subscriptionId: string = null;
        private previousWatermark: string = null;
        private moreEventsAvailable: boolean = false;
        private events: Collection<NotificationEvent> = new Collection<NotificationEvent>();
        static get XmlElementNameToEventTypeMap(): Dictionary<string, EventType> {
            return GetEventsResults.xmlElementNameToEventTypeMap.Member;
        }
        get SubscriptionId(): string {
            return this.subscriptionId;
        }
        get PreviousWatermark(): string {
            return this.previousWatermark;
        }
        get NewWatermark(): string {
            return this.newWatermark;
        }
        get MoreEventsAvailable(): boolean {
            return this.moreEventsAvailable;
        }
        get FolderEvents(): IEnumerable<FolderEvent> {
            return Enumerable.OfType<FolderEvent>(this.events);
        }
        get ItemEvents(): IEnumerable<ItemEvent> {
            return Enumerable.OfType<ItemEvent>(this.events);
        }
        get AllEvents(): Collection<NotificationEvent> {
            return this.events;
        }
        constructor() {
            super();
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "Notification");
            this.subscriptionId = reader.ReadElementValue(XmlNamespace.Types, "SubscriptionId");
            this.previousWatermark = reader.ReadElementValue(XmlNamespace.Types, "PreviousWatermark");
            this.moreEventsAvailable = reader.ReadElementValue<boolean>(XmlNamespace.Types, "MoreEvents");
            do {
                reader.Read();
                if (reader.IsStartElement()) {
                    var localName: string = reader.LocalName;
                    var eventType: EventType;
                    if ((() => {
                        var _p0 = [
                            eventType
                        ];
                        var _r = GetEventsResults.xmlElementNameToEventTypeMap.Member.TryGetValue(localName, _p0);
                        eventType = _p0[0];
                        return _r;
                    })()) {
                        this.newWatermark = reader.ReadElementValue(XmlNamespace.Types, "Watermark");
                        if (eventType === EventType.Status) {
                            reader.ReadEndElementIfNecessary(XmlNamespace.Types, localName);
                        }
                        else {
                            this.LoadNotificationEventFromXml(reader, localName, eventType);
                        }
                    }
                    else {
                        reader.SkipCurrentElement();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "Notification"));
        }
        LoadFromJson(eventsResponse: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = eventsResponse.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "SubscriptionId")) {
                            if (!(a === "PreviousWatermark")) {
                                if (!(a === "MoreEvents")) {
                                    if (a === "Events") {
                                        this.LoadEventsFromJson(eventsResponse.ReadAsArray(current), service);
                                    }
                                }
                                else {
                                    this.moreEventsAvailable = eventsResponse.ReadAsBool(current);
                                }
                            }
                            else {
                                this.previousWatermark = eventsResponse.ReadAsString(current);
                            }
                        }
                        else {
                            this.subscriptionId = eventsResponse.ReadAsString(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        private LoadEventsFromJson(jsonEventsArray: any[], service: ExchangeService): void {
            for (var i: number = 0; i < jsonEventsArray.length; i = i + 1) {
                var jsonObject: JsonObject = <JsonObject>jsonEventsArray[i];
                this.newWatermark = jsonObject.ReadAsString("Watermark");
                var eventType: EventType = jsonObject.ReadEnumValue<EventType>("NotificationType");
                if (eventType !== EventType.Status) {
                    var notificationEvent: NotificationEvent;
                    if (jsonObject.ContainsKey("FolderId")) {
                        notificationEvent = new FolderEvent(eventType, service.ConvertUniversalDateTimeStringToLocalDateTime(jsonObject.ReadAsString("TimeStamp")).Value);
                    }
                    else {
                        notificationEvent = new ItemEvent(eventType, service.ConvertUniversalDateTimeStringToLocalDateTime(jsonObject.ReadAsString("TimeStamp")).Value);
                    }
                    notificationEvent.LoadFromJson(jsonObject, service);
                    this.events.Add(notificationEvent);
                }
            }
        }
        private LoadNotificationEventFromXml(reader: EwsServiceXmlReader, eventElementName: string, eventType: EventType): void {
            var timestamp: DateTime = reader.ReadElementValue<DateTime>(XmlNamespace.Types, "TimeStamp");
            reader.Read();
            var notificationEvent: NotificationEvent;
            if (reader.LocalName === "FolderId") {
                notificationEvent = new FolderEvent(eventType, timestamp);
            }
            else {
                notificationEvent = new ItemEvent(eventType, timestamp);
            }
            notificationEvent.LoadFromXml(reader, eventElementName);
            this.events.Add(notificationEvent);
        }
    }
    class GetStreamingEventsResults {
        events: Collection<GetStreamingEventsResults_NotificationGroup> = new Collection<GetStreamingEventsResults_NotificationGroup>();
        get Notifications(): Collection<GetStreamingEventsResults_NotificationGroup> {
            return this.events;
        }
        constructor() {
            super();
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Messages, "Notification");
            do {
                var notificationGroup: GetStreamingEventsResults_NotificationGroup = null;
                notificationGroup.SubscriptionId = reader.ReadElementValue(XmlNamespace.Types, "SubscriptionId");
                notificationGroup.Events = new Collection<NotificationEvent>();
                Monitor.Enter(this);
                try {
                    this.events.Add(notificationGroup);
                }
                finally {
                    Monitor.Exit(this);
                }
                do {
                    reader.Read();
                    if (reader.IsStartElement()) {
                        var localName: string = reader.LocalName;
                        var eventType: EventType;
                        if ((() => {
                            var _p0 = [
                                eventType
                            ];
                            var _r = GetEventsResults.XmlElementNameToEventTypeMap.TryGetValue(localName, _p0);
                            eventType = _p0[0];
                            return _r;
                        })()) {
                            if (eventType === EventType.Status) {
                                reader.ReadEndElementIfNecessary(XmlNamespace.Types, localName);
                            }
                            else {
                                this.LoadNotificationEventFromXml(reader, localName, eventType, notificationGroup);
                            }
                        }
                        else {
                            reader.SkipCurrentElement();
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Messages, "Notification"));
                reader.Read();
            }
            while (!reader.IsEndElement(XmlNamespace.Messages, "Notifications"));
        }
        LoadNotificationEventFromXml(reader: EwsServiceXmlReader, eventElementName: string, eventType: EventType, notifications: GetStreamingEventsResults_NotificationGroup): void {
            var timestamp: DateTime = reader.ReadElementValue<DateTime>(XmlNamespace.Types, "TimeStamp");
            reader.Read();
            var notificationEvent: NotificationEvent;
            if (reader.LocalName === "FolderId") {
                notificationEvent = new FolderEvent(eventType, timestamp);
            }
            else {
                notificationEvent = new ItemEvent(eventType, timestamp);
            }
            notificationEvent.LoadFromXml(reader, eventElementName);
            notifications.Events.Add(notificationEvent);
        }
    }
    class GetStreamingEventsResults_NotificationGroup {
        SubscriptionId: string = null;
        Events: Collection<NotificationEvent> = null;
        constructor() {
            super();
        }
    }
    class ItemEvent extends NotificationEvent {
        private itemId: ItemId = null;
        private oldItemId: ItemId = null;
        get ItemId(): ItemId {
            return this.itemId;
        }
        get OldItemId(): ItemId {
            return this.oldItemId;
        }
        constructor(eventType: EventType, timestamp: DateTime) {
            super(eventType, timestamp);
        }
        InternalLoadFromXml(reader: EwsServiceXmlReader): void {
            super.InternalLoadFromXml(reader);
            this.itemId = new ItemId();
            this.itemId.LoadFromXml(reader, reader.LocalName);
            reader.Read();
            this.ParentFolderId = new FolderId();
            this.ParentFolderId.LoadFromXml(reader, "ParentFolderId");
            switch (this.EventType) {
                case EventType.Moved:
                case EventType.Copied:
                    reader.Read();
                    this.oldItemId = new ItemId();
                    this.oldItemId.LoadFromXml(reader, reader.LocalName);
                    reader.Read();
                    this.OldParentFolderId = new FolderId();
                    this.OldParentFolderId.LoadFromXml(reader, reader.LocalName);
                    return;
                default:
                    return;
            }
        }
        LoadFromJson(jsonEvent: JsonObject, service: ExchangeService): void {
            this.itemId = new ItemId();
            this.itemId.LoadFromJson(jsonEvent.ReadAsJsonObject("ItemId"), service);
            this.ParentFolderId = new FolderId();
            this.ParentFolderId.LoadFromJson(jsonEvent.ReadAsJsonObject("ParentFolderId"), service);
            switch (this.EventType) {
                case EventType.Moved:
                case EventType.Copied:
                    this.oldItemId = new ItemId();
                    this.oldItemId.LoadFromJson(jsonEvent.ReadAsJsonObject("OldItemId"), service);
                    this.OldParentFolderId = new FolderId();
                    this.OldParentFolderId.LoadFromJson(jsonEvent.ReadAsJsonObject("OldParentFolderId"), service);
                    return;
                default:
                    return;
            }
        }
    }
    class NotificationEventArgs extends EventArgs {
        Subscription: StreamingSubscription = null;
        Events: IEnumerable<NotificationEvent> = null;
        constructor(subscription: StreamingSubscription, events: IEnumerable<NotificationEvent>) {
            super();
            this.Subscription = subscription;
            this.Events = events;
        }
    }
    class SubscriptionBase {
        private service: ExchangeService = null;
        private id: string = null;
        private watermark: string = null;
        get Service(): ExchangeService {
            return this.service;
        }
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        set Watermark(value: string) {
            this.watermark = value;
        }
        get Watermark(): string {
            return this.watermark;
        }
        get UsesWatermark(): boolean {
            return true;
        }
        constructor(service: ExchangeService);
        constructor(service: ExchangeService, id: string);
        constructor(service: ExchangeService, id: string, watermark: string);
        constructor(service: ExchangeService, id?: string, watermark?: string) {
            super();
            if (arguments.length === 1 && (service === null || service instanceof ExchangeService)) {
                this.constructor_0(service);
                return;
            }
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (id === null || id.constructor === String)) {
                this.constructor_1(service, id);
                return;
            }
            this.constructor_2(service, id, watermark);
        }
        private constructor_0(service: ExchangeService): void {
            EwsUtilities.ValidateParam(service, "service");
            this.service = service;
        }
        private constructor_1(service: ExchangeService, id: string): void {
            this.constructor_0(service);
            EwsUtilities.ValidateParam(id, "id");
            this.id = id;
        }
        private constructor_2(service: ExchangeService, id: string, watermark: string): void {
            this.constructor_1(service, id);
            this.watermark = watermark;
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            this.id = reader.ReadElementValue(XmlNamespace.Messages, "SubscriptionId");
            if (this.UsesWatermark) {
                this.watermark = reader.ReadElementValue(XmlNamespace.Messages, "Watermark");
            }
        }
        LoadFromJson(jsonResponse: JsonObject, service: ExchangeService): void {
            this.id = jsonResponse.ReadAsString("SubscriptionId");
            if (this.UsesWatermark) {
                this.watermark = jsonResponse.ReadAsString("Watermark");
            }
        }
    }
    class PullSubscription extends SubscriptionBase {
        private moreEventsAvailable: Nullable<boolean> = null;
        get MoreEventsAvailable(): Nullable<boolean> {
            return this.moreEventsAvailable;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        GetEvents(): GetEventsResults {
            var events: GetEventsResults = this.Service.GetEvents(this.Id, this.Watermark);
            this.Watermark = events.NewWatermark;
            this.moreEventsAvailable = new Nullable<boolean>(events.MoreEventsAvailable);
            return events;
        }
        BeginGetEvents(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            return this.Service.BeginGetEvents(callback, state, this.Id, this.Watermark);
        }
        EndGetEvents(asyncResult: IAsyncResult): GetEventsResults {
            var getEventsResults: GetEventsResults = this.Service.EndGetEvents(asyncResult);
            this.Watermark = getEventsResults.NewWatermark;
            this.moreEventsAvailable = new Nullable<boolean>(getEventsResults.MoreEventsAvailable);
            return getEventsResults;
        }
        Unsubscribe(): void {
            this.Service.Unsubscribe(this.Id);
        }
        BeginUnsubscribe(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            return this.Service.BeginUnsubscribe(callback, state, this.Id);
        }
        EndUnsubscribe(asyncResult: IAsyncResult): void {
            this.Service.EndUnsubscribe(asyncResult);
        }
    }
    class PushSubscription extends SubscriptionBase {
        constructor(service: ExchangeService) {
            super(service);
        }
    }
    class StreamingSubscription extends SubscriptionBase {
        get Service(): ExchangeService {
            return this.Service;
        }
        get UsesWatermark(): boolean {
            return false;
        }
        constructor(service: ExchangeService) {
            super(service);
        }
        Unsubscribe(): void {
            this.Service.Unsubscribe(this.Id);
        }
        BeginUnsubscribe(callback: (ar: IAsyncResult) => void, state: any): IAsyncResult {
            return this.Service.BeginUnsubscribe(callback, state, this.Id);
        }
        EndUnsubscribe(asyncResult: IAsyncResult): void {
            this.Service.EndUnsubscribe(asyncResult);
        }
    }
    class StreamingSubscriptionConnection implements IDisposable {
        private subscriptions: Dictionary<string, StreamingSubscription> = null;
        private connectionTimeout: number = 0;
        private session: ExchangeService = null;
        private isDisposed: boolean = false;
        private currentHangingRequest: GetStreamingEventsRequest = null;
        private lockObject: any = new any();
        OnNotificationEvent: NEvent<(sender: any, args: NotificationEventArgs) => void> = new NEvent<(sender: any, args: NotificationEventArgs) => void>();
        OnSubscriptionError: NEvent<(sender: any, args: SubscriptionErrorEventArgs) => void> = new NEvent<(sender: any, args: SubscriptionErrorEventArgs) => void>();
        OnDisconnect: NEvent<(sender: any, args: SubscriptionErrorEventArgs) => void> = new NEvent<(sender: any, args: SubscriptionErrorEventArgs) => void>();
        get CurrentSubscriptions(): IEnumerable<StreamingSubscription> {
            var list: List<StreamingSubscription> = new List<StreamingSubscription>();
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                list.AddRange(this.subscriptions.Values);
            }
            finally {
                Monitor.Exit(obj);
            }
            return list;
        }
        get IsOpen(): boolean {
            this.ThrowIfDisposed();
            return this.currentHangingRequest !== null && this.currentHangingRequest.IsConnected;
        }
        constructor(service: ExchangeService, lifetime: number);
        constructor(service: ExchangeService, subscriptions: IEnumerable<StreamingSubscription>, lifetime: number);
        constructor(service: ExchangeService, lifetimeOrSubscriptions: any, lifetime?: number) {
            super();
            if (arguments.length === 2 && (service === null || service instanceof ExchangeService) && (lifetimeOrSubscriptions === null || lifetimeOrSubscriptions.constructor === Number)) {
                this.constructor_0(service, lifetimeOrSubscriptions);
                return;
            }
            this.constructor_1(service, lifetimeOrSubscriptions, lifetime);
        }
        private constructor_0(service: ExchangeService, lifetime: number): void {
            EwsUtilities.ValidateParam(service, "service");
            EwsUtilities.ValidateClassVersion(service, ExchangeVersion.Exchange2010_SP1, super.GetType().Name);
            if (lifetime < 1 || lifetime > 30) {
                throw new ArgumentOutOfRangeException("lifetime");
            }
            this.session = service;
            this.subscriptions = new Dictionary<string, StreamingSubscription>();
            this.connectionTimeout = lifetime;
        }
        private constructor_1(service: ExchangeService, subscriptions: IEnumerable<StreamingSubscription>, lifetime: number): void {
            this.constructor_0(service, lifetime);
            EwsUtilities.ValidateParamCollection(subscriptions, "subscriptions");
            var enumerator: IEnumerator<StreamingSubscription> = subscriptions.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: StreamingSubscription = enumerator.Current;
                    this.subscriptions.Add(current.Id, current);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        AddSubscription(subscription: StreamingSubscription): void {
            this.ThrowIfDisposed();
            EwsUtilities.ValidateParam(subscription, "subscription");
            this.ValidateConnectionState(false, Strings.CannotAddSubscriptionToLiveConnection);
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                if (!this.subscriptions.ContainsKey(subscription.Id)) {
                    this.subscriptions.Add(subscription.Id, subscription);
                }
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        RemoveSubscription(subscription: StreamingSubscription): void {
            this.ThrowIfDisposed();
            EwsUtilities.ValidateParam(subscription, "subscription");
            this.ValidateConnectionState(false, Strings.CannotRemoveSubscriptionFromLiveConnection);
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                this.subscriptions.Remove(subscription.Id);
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        Open(): void {
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                this.ThrowIfDisposed();
                this.ValidateConnectionState(false, Strings.CannotCallConnectDuringLiveConnection);
                if (this.subscriptions.Count === 0) {
                    throw new ServiceLocalException(Strings.NoSubscriptionsOnConnection);
                }
                this.currentHangingRequest = new GetStreamingEventsRequest(this.session, this.HandleServiceResponseObject, this.subscriptions.Keys, this.connectionTimeout);
                this.currentHangingRequest.OnDisconnect.Add(this.OnRequestDisconnect);
                this.currentHangingRequest.InternalExecute();
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private OnRequestDisconnect(sender: any, args: HangingRequestDisconnectEventArgs): void {
            this.InternalOnDisconnect(args.Exception);
        }
        Close(): void {
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                this.ThrowIfDisposed();
                this.ValidateConnectionState(true, Strings.CannotCallDisconnectWithNoLiveConnection);
                this.currentHangingRequest.Disconnect();
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private InternalOnDisconnect(ex: Exception): void {
            if (this.OnDisconnect !== null) {
                this.OnDisconnect(this, new SubscriptionErrorEventArgs(null, ex));
            }
            this.currentHangingRequest = null;
        }
        private ValidateConnectionState(isConnectedExpected: boolean, errorMessage: string): void {
            if ((isConnectedExpected && !this.IsOpen) || (!isConnectedExpected && this.IsOpen)) {
                throw new ServiceLocalException(errorMessage);
            }
        }
        private HandleServiceResponseObject(response: any): void {
            var getStreamingEventsResponse: GetStreamingEventsResponse = ((response instanceof GetStreamingEventsResponse) ? <GetStreamingEventsResponse>response : null);
            if (getStreamingEventsResponse === null) {
                throw new ArgumentException();
            }
            if (getStreamingEventsResponse.Result === ServiceResult.Success || getStreamingEventsResponse.Result === ServiceResult.Warning) {
                if (getStreamingEventsResponse.Results.Notifications.Count > 0) {
                    this.IssueNotificationEvents(getStreamingEventsResponse);
                    return;
                }
            }
            else {
                if (getStreamingEventsResponse.Result === ServiceResult.Error) {
                    if (getStreamingEventsResponse.ErrorSubscriptionIds === null || getStreamingEventsResponse.ErrorSubscriptionIds.Count === 0) {
                        this.IssueGeneralFailure(getStreamingEventsResponse);
                        return;
                    }
                    this.IssueSubscriptionFailures(getStreamingEventsResponse);
                }
            }
        }
        private IssueSubscriptionFailures(gseResponse: GetStreamingEventsResponse): void {
            var exception: ServiceResponseException = new ServiceResponseException(gseResponse);
            var enumerator: List_Enumerator<string> = gseResponse.ErrorSubscriptionIds.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var streamingSubscription: StreamingSubscription = null;
                    var obj: any;
                    Monitor.Enter(obj = this.lockObject);
                    try {
                        if (this.subscriptions !== null && this.subscriptions.ContainsKey(current)) {
                            streamingSubscription = this.subscriptions.get_Item(current);
                        }
                    }
                    finally {
                        Monitor.Exit(obj);
                    }
                    if (streamingSubscription !== null) {
                        var args: SubscriptionErrorEventArgs = new SubscriptionErrorEventArgs(streamingSubscription, exception);
                        if (this.OnSubscriptionError !== null) {
                            this.OnSubscriptionError(this, args);
                        }
                    }
                    if (gseResponse.ErrorCode !== ServiceError.ErrorMissedNotificationEvents) {
                        var obj2: any;
                        Monitor.Enter(obj2 = this.lockObject);
                        try {
                            if (this.subscriptions !== null && this.subscriptions.ContainsKey(current)) {
                                this.subscriptions.Remove(current);
                            }
                        }
                        finally {
                            Monitor.Exit(obj2);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        private IssueGeneralFailure(gseResponse: GetStreamingEventsResponse): void {
            var args: SubscriptionErrorEventArgs = new SubscriptionErrorEventArgs(null, new ServiceResponseException(gseResponse));
            if (this.OnSubscriptionError !== null) {
                this.OnSubscriptionError(this, args);
            }
        }
        private IssueNotificationEvents(gseResponse: GetStreamingEventsResponse): void {
            var enumerator: IEnumerator<GetStreamingEventsResults_NotificationGroup> = gseResponse.Results.Notifications.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: GetStreamingEventsResults_NotificationGroup = enumerator.Current;
                    var streamingSubscription: StreamingSubscription = null;
                    var obj: any;
                    Monitor.Enter(obj = this.lockObject);
                    try {
                        if (this.subscriptions !== null && this.subscriptions.ContainsKey(current.SubscriptionId)) {
                            streamingSubscription = this.subscriptions.get_Item(current.SubscriptionId);
                        }
                    }
                    finally {
                        Monitor.Exit(obj);
                    }
                    if (streamingSubscription !== null) {
                        var args: NotificationEventArgs = new NotificationEventArgs(streamingSubscription, current.Events);
                        if (this.OnNotificationEvent !== null) {
                            this.OnNotificationEvent(this, args);
                        }
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        _StreamingSubscriptionConnection() {
            this.Dispose(false);
        }
        Dispose(): void;
        Dispose(suppressFinalizer: boolean): void;
        Dispose(suppressFinalizer?: boolean): void {
            if (arguments.length === 0) {
                this.Dispose_0();
                return;
            }
            this.Dispose_1(suppressFinalizer);
        }
        private Dispose_0(): void {
            this.Dispose(true);
        }
        private Dispose_1(suppressFinalizer: boolean): void {
            if (suppressFinalizer) {
                GC.SuppressFinalize(this);
            }
            var obj: any;
            Monitor.Enter(obj = this.lockObject);
            try {
                if (!this.isDisposed) {
                    if (this.currentHangingRequest !== null) {
                        this.currentHangingRequest = null;
                    }
                    this.subscriptions = null;
                    this.session = null;
                    this.isDisposed = true;
                }
            }
            finally {
                Monitor.Exit(obj);
            }
        }
        private ThrowIfDisposed(): void {
            if (this.isDisposed) {
                throw new ObjectDisposedException(super.GetType().FullName);
            }
        }
    }
    class SubscriptionErrorEventArgs extends EventArgs {
        Subscription: StreamingSubscription = null;
        Exception: Exception = null;
        constructor(subscription: StreamingSubscription, exception: Exception) {
            super();
            this.Subscription = subscription;
            this.Exception = exception;
        }
    }
    class ExtendedPropertyDefinition extends PropertyDefinitionBase {
        private static FieldFormat: string = "{0}: {1} ";
        private static PropertySetFieldName: string = "PropertySet";
        private static PropertySetIdFieldName: string = "PropertySetId";
        private static TagFieldName: string = "Tag";
        private static NameFieldName: string = "Name";
        private static IdFieldName: string = "Id";
        private static MapiTypeFieldName: string = "MapiType";
        private propertySet: Nullable<DefaultExtendedPropertySet> = null;
        private propertySetId: Nullable<Guid> = null;
        private tag: Nullable<number> = null;
        private name: string = null;
        private id: Nullable<number> = null;
        private mapiType: MapiPropertyType = 0;
        get Version(): ExchangeVersion {
            return ExchangeVersion.Exchange2007_SP1;
        }
        get PropertySet(): Nullable<DefaultExtendedPropertySet> {
            return this.propertySet;
        }
        get PropertySetId(): Nullable<Guid> {
            return this.propertySetId;
        }
        get Tag(): Nullable<number> {
            return this.tag;
        }
        get Name(): string {
            return this.name;
        }
        get Id(): Nullable<number> {
            return this.id;
        }
        get MapiType(): MapiPropertyType {
            return this.mapiType;
        }
        get Type(): Type {
            return MapiTypeConverter.MapiTypeConverterMap.get_Item(this.MapiType).Type;
        }
        constructor();
        constructor(mapiType: MapiPropertyType);
        constructor(tag: number, mapiType: MapiPropertyType);
        constructor(propertySet: DefaultExtendedPropertySet, name: string, mapiType: MapiPropertyType);
        constructor(propertySet: DefaultExtendedPropertySet, id: number, mapiType: MapiPropertyType);
        constructor(propertySetId: Guid, name: string, mapiType: MapiPropertyType);
        constructor(propertySetId: Guid, id: number, mapiType: MapiPropertyType);
        constructor(mapiTypeOrTagOrPropertySetOrPropertySetId?: any, mapiTypeOrNameOrId?: any, mapiType?: MapiPropertyType) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (mapiTypeOrTagOrPropertySetOrPropertySetId === null || mapiTypeOrTagOrPropertySetOrPropertySetId.constructor === Number)) {
                this.constructor_1(mapiTypeOrTagOrPropertySetOrPropertySetId);
                return;
            }
            if (arguments.length === 2 && (mapiTypeOrTagOrPropertySetOrPropertySetId === null || mapiTypeOrTagOrPropertySetOrPropertySetId.constructor === Number) && (mapiTypeOrNameOrId === null || mapiTypeOrNameOrId.constructor === Number)) {
                this.constructor_2(mapiTypeOrTagOrPropertySetOrPropertySetId, mapiTypeOrNameOrId);
                return;
            }
            if (arguments.length === 3 && (mapiTypeOrTagOrPropertySetOrPropertySetId === null || mapiTypeOrTagOrPropertySetOrPropertySetId.constructor === Number) && (mapiTypeOrNameOrId === null || mapiTypeOrNameOrId.constructor === String) && (mapiType === null || mapiType.constructor === Number)) {
                this.constructor_3(mapiTypeOrTagOrPropertySetOrPropertySetId, mapiTypeOrNameOrId, mapiType);
                return;
            }
            if (arguments.length === 3 && (mapiTypeOrTagOrPropertySetOrPropertySetId === null || mapiTypeOrTagOrPropertySetOrPropertySetId.constructor === Number) && (mapiTypeOrNameOrId === null || mapiTypeOrNameOrId.constructor === Number) && (mapiType === null || mapiType.constructor === Number)) {
                this.constructor_4(mapiTypeOrTagOrPropertySetOrPropertySetId, mapiTypeOrNameOrId, mapiType);
                return;
            }
            if (arguments.length === 3 && (mapiTypeOrTagOrPropertySetOrPropertySetId === null || mapiTypeOrTagOrPropertySetOrPropertySetId instanceof Guid) && (mapiTypeOrNameOrId === null || mapiTypeOrNameOrId.constructor === String) && (mapiType === null || mapiType.constructor === Number)) {
                this.constructor_5(mapiTypeOrTagOrPropertySetOrPropertySetId, mapiTypeOrNameOrId, mapiType);
                return;
            }
            this.constructor_6(mapiTypeOrTagOrPropertySetOrPropertySetId, mapiTypeOrNameOrId, mapiType);
        }
        private constructor_0(): void {
            this.mapiType = MapiPropertyType.String;
        }
        private constructor_1(mapiType: MapiPropertyType): void {
            this.constructor_0();
            this.mapiType = mapiType;
        }
        private constructor_2(tag: number, mapiType: MapiPropertyType): void {
            this.constructor_1(mapiType);
            if (tag < 0 || tag > 65535) {
                throw new ArgumentOutOfRangeException("tag", Strings.TagValueIsOutOfRange);
            }
            this.tag = new Nullable<number>(tag);
        }
        private constructor_3(propertySet: DefaultExtendedPropertySet, name: string, mapiType: MapiPropertyType): void {
            this.constructor_1(mapiType);
            EwsUtilities.ValidateParam(name, "name");
            this.propertySet = new Nullable<DefaultExtendedPropertySet>(propertySet);
            this.name = name;
        }
        private constructor_4(propertySet: DefaultExtendedPropertySet, id: number, mapiType: MapiPropertyType): void {
            this.constructor_1(mapiType);
            this.propertySet = new Nullable<DefaultExtendedPropertySet>(propertySet);
            this.id = new Nullable<number>(id);
        }
        private constructor_5(propertySetId: Guid, name: string, mapiType: MapiPropertyType): void {
            this.constructor_1(mapiType);
            EwsUtilities.ValidateParam(name, "name");
            this.propertySetId = new Nullable<Guid>(propertySetId);
            this.name = name;
        }
        private constructor_6(propertySetId: Guid, id: number, mapiType: MapiPropertyType): void {
            this.constructor_1(mapiType);
            this.propertySetId = new Nullable<Guid>(propertySetId);
            this.id = new Nullable<number>(id);
        }
        static IsEqualTo(extPropDef1: ExtendedPropertyDefinition, extPropDef2: ExtendedPropertyDefinition): boolean {
            return NObject.ReferenceEquals(extPropDef1, extPropDef2) || (ExtendedPropertyDefinition.op_Inequality(extPropDef1, null) && ExtendedPropertyDefinition.op_Inequality(extPropDef2, null) && extPropDef1.Id === extPropDef2.Id && extPropDef1.MapiType === extPropDef2.MapiType && extPropDef1.Tag === extPropDef2.Tag && extPropDef1.Name === extPropDef2.Name && extPropDef1.PropertySet === extPropDef2.PropertySet && extPropDef1.propertySetId === extPropDef2.propertySetId);
        }
        GetXmlElementName(): string {
            return "ExtendedFieldURI";
        }
        GetJsonType(): string {
            return "ExtendedPropertyUri";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            if (this.propertySet !== null) {
                writer.WriteAttributeValue("DistinguishedPropertySetId", this.propertySet.Value);
            }
            if (this.propertySetId !== null) {
                writer.WriteAttributeValue("PropertySetId", this.propertySetId.Value.ToString());
            }
            if (this.tag !== null) {
                writer.WriteAttributeValue("PropertyTag", this.tag.Value);
            }
            if (!NString.IsNullOrEmpty(this.name)) {
                writer.WriteAttributeValue("PropertyName", this.name);
            }
            if (this.id !== null) {
                writer.WriteAttributeValue("PropertyId", this.id.Value);
            }
            writer.WriteAttributeValue("PropertyType", this.mapiType);
        }
        AddJsonProperties(jsonPropertyDefinition: JsonObject, service: ExchangeService): void {
            if (this.propertySet !== null) {
                jsonPropertyDefinition.Add("DistinguishedPropertySetId", this.propertySet.Value);
            }
            if (this.propertySetId !== null) {
                jsonPropertyDefinition.Add("PropertySetId", this.propertySetId.Value.ToString());
            }
            if (this.tag !== null) {
                jsonPropertyDefinition.Add("PropertyTag", this.tag.Value);
            }
            if (!NString.IsNullOrEmpty(this.name)) {
                jsonPropertyDefinition.Add("PropertyName", this.name);
            }
            if (this.id !== null) {
                jsonPropertyDefinition.Add("PropertyId", this.id.Value);
            }
            jsonPropertyDefinition.Add("PropertyType", this.mapiType);
        }
        LoadFromXml(reader: EwsServiceXmlReader): void {
            var text: string = reader.ReadAttributeValue("DistinguishedPropertySetId");
            if (!NString.IsNullOrEmpty(text)) {
                this.propertySet = new Nullable<DefaultExtendedPropertySet>(<DefaultExtendedPropertySet>Enum.Parse(new Type("Number"), text, false));
            }
            text = reader.ReadAttributeValue("PropertySetId");
            if (!NString.IsNullOrEmpty(text)) {
                this.propertySetId = new Nullable<Guid>(new Guid(text));
            }
            text = reader.ReadAttributeValue("PropertyTag");
            if (!NString.IsNullOrEmpty(text)) {
                this.tag = new Nullable<number>(<number>Convert.ToUInt16(text, 16));
            }
            this.name = reader.ReadAttributeValue("PropertyName");
            text = reader.ReadAttributeValue("PropertyId");
            if (!NString.IsNullOrEmpty(text)) {
                this.id = new Nullable<number>(NNumber.Parse(text));
            }
            this.mapiType = reader.ReadAttributeValue<MapiPropertyType>("PropertyType");
        }
        LoadFromJson(jsonObject: JsonObject): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonObject.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var key: string;
                    switch (key = current) {
                        case "DistinguishedPropertySetId":
                            this.propertySet = new Nullable<DefaultExtendedPropertySet>(jsonObject.ReadEnumValue<DefaultExtendedPropertySet>(current));
                            break;
                        case "PropertySetId":
                            this.propertySetId = new Nullable<Guid>(new Guid(jsonObject.ReadAsString(current)));
                            break;
                        case "PropertyTag":
                            this.tag = new Nullable<number>(<number>Convert.ToUInt16(jsonObject.ReadAsString(current), 16));
                            break;
                        case "PropertyName":
                            this.name = jsonObject.ReadAsString(current);
                            break;
                        case "PropertyId":
                            this.id = new Nullable<number>(jsonObject.ReadAsInt(current));
                            break;
                        case "PropertyType":
                            this.mapiType = jsonObject.ReadEnumValue<MapiPropertyType>(current);
                            break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        static op_Equality(extPropDef1: ExtendedPropertyDefinition, extPropDef2: ExtendedPropertyDefinition): boolean {
            return ExtendedPropertyDefinition.IsEqualTo(extPropDef1, extPropDef2);
        }
        static op_Inequality(extPropDef1: ExtendedPropertyDefinition, extPropDef2: ExtendedPropertyDefinition): boolean {
            return !ExtendedPropertyDefinition.IsEqualTo(extPropDef1, extPropDef2);
        }
        Equals(obj: any): boolean {
            var extPropDef: ExtendedPropertyDefinition = ((obj instanceof ExtendedPropertyDefinition) ? <ExtendedPropertyDefinition>obj : null);
            return ExtendedPropertyDefinition.IsEqualTo(extPropDef, this);
        }
        GetHashCode(): number {
            return NString.GetHashCode(this.GetPrintableName());
        }
        GetPrintableName(): string {
            var stringBuilder: StringBuilder = new StringBuilder();
            stringBuilder.Append("{");
            stringBuilder.Append(this.FormatField<string>("Name", this.Name));
            stringBuilder.Append(this.FormatField<Nullable<MapiPropertyType>>("MapiType", new Nullable<MapiPropertyType>(this.MapiType)));
            stringBuilder.Append(this.FormatField<Nullable<number>>("Id", this.Id));
            stringBuilder.Append(this.FormatField<Nullable<DefaultExtendedPropertySet>>("PropertySet", this.PropertySet));
            stringBuilder.Append(this.FormatField<Nullable<Guid>>("PropertySetId", this.PropertySetId));
            stringBuilder.Append(this.FormatField<Nullable<number>>("Tag", this.Tag));
            stringBuilder.Append("}");
            return stringBuilder.ToString();
        }
        FormatField<T>(name: string, fieldValue: T): string {
            if (fieldValue === null) {
                return NString.Empty;
            }
            return NString.Format("{0}: {1} ", name, fieldValue.ToString());
        }
    }
    class GroupMemberPropertyDefinition extends ServiceObjectPropertyDefinition {
        private static FieldUri: string = "distributionlist:Members:Member";
        private key: string = null;
        set Key(value: string) {
            this.key = value;
        }
        get Key(): string {
            return this.key;
        }
        get Type(): Type {
            return new Type("String");
        }
        constructor(key: string);
        constructor();
        constructor(key?: string) {
            super("distributionlist:Members:Member");
            if (arguments.length === 1 && (key === null || key.constructor === String)) {
                this.constructor_0(key);
                return;
            }
            this.constructor_1();
        }
        private constructor_0(key: string): void {
            this.key = key;
        }
        private constructor_1(): void {
        }
        GetXmlElementName(): string {
            return "IndexedFieldURI";
        }
        GetJsonType(): string {
            return "DictionaryPropertyUri";
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("FieldIndex", this.Key);
        }
        AddJsonProperties(jsonPropertyDefinition: JsonObject, service: ExchangeService): void {
            super.AddJsonProperties(jsonPropertyDefinition, service);
            jsonPropertyDefinition.Add("FieldIndex", this.Key);
        }
        GetPrintableName(): string {
            return NString.Format("{0}:{1}", "distributionlist:Members:Member", this.Key);
        }
    }
    class ListValuePropertyDefinition<TPropertyValue> extends GenericPropertyDefinition<TPropertyValue>
    {
        constructor(xmlElementName: string, uri: string, flags: PropertyDefinitionFlags, version: ExchangeVersion) {
            super(xmlElementName, uri, flags, version);
        }
        Parse(value: string): any {
            var value2: string = NString.IsNullOrEmpty(value) ? value : NString.Replace(value, 32, /*' '*/44)/*','*/;
            return EwsUtilities.Parse<TPropertyValue>(value2);
        }
    }
    class ExchangeResourceManager extends ResourceManager {
        private static resourceManagers: HybridDictionary = new HybridDictionary();
        private static lockObject: any = new any();
        get BaseName(): string {
            return this.BaseName;
        }
        get AssemblyName(): string {
            return this.MainAssembly.GetName().Name;
        }
        static GetResourceManager(baseName: string, assembly: Assembly): ExchangeResourceManager {
            if (Assembly.op_Equality(assembly, null)) {
                throw new ArgumentNullException("assembly");
            }
            var key: string = baseName + assembly.GetName().Name;
            var obj: any;
            Monitor.Enter(obj = ExchangeResourceManager.lockObject);
            var result: ExchangeResourceManager;
            try {
                var exchangeResourceManager: ExchangeResourceManager = <ExchangeResourceManager>ExchangeResourceManager.resourceManagers.get_Item(key);
                if (exchangeResourceManager === null) {
                    exchangeResourceManager = new ExchangeResourceManager(baseName, assembly);
                    ExchangeResourceManager.resourceManagers.set_Item(key, exchangeResourceManager);
                }
                result = exchangeResourceManager;
            }
            finally {
                Monitor.Exit(obj);
            }
            return result;
        }
        constructor(baseName: string, assembly: Assembly) {
            super(baseName, assembly);
        }
        GetString(name: string): string;
        GetString(name: string, culture: CultureInfo): string;
        GetString(name: string, culture?: CultureInfo): string {
            if (arguments.length === 1 && (name === null || name.constructor === String)) {
                return this.GetString_0(name);
            }
            return this.GetString_1(name, culture);
        }
        private GetString_0(name: string): string {
            return this.GetString(name, CultureInfo.CurrentCulture);
        }
        private GetString_1(name: string, culture: CultureInfo): string {
            return super.GetString(name, culture);
        }
    }
    interface ILocalizedString {
        LocalizedString: LocalizedString;
    }
    class LocalizedString implements ISerializable, ILocalizedString, IFormattable, IEquatable<LocalizedString>
    {
        private Id: string = null;
        private Inserts: any[] = null;
        private ResourceManager: ExchangeResourceManager = null;
        static Empty: LocalizedString = null;
        get LocalizedString(): LocalizedString {
            return this;
        }
        get IsEmpty(): boolean {
            return null === this.Id;
        }
        get BaseId(): number {
            var text: string = ((this.ResourceManager !== null) ? this.ResourceManager.BaseName : NString.Empty) + this.Id;
            return NString.GetHashCode(text);
        }
        static op_Equality(s1: LocalizedString, s2: LocalizedString): boolean {
            return s1.Equals(s2);
        }
        static op_Inequality(s1: LocalizedString, s2: LocalizedString): boolean {
            return !s1.Equals(s2);
        }
        static op_Implicit(value: LocalizedString): string {
            return value.ToString();
        }
        static Join(separator: any, value: any[]): LocalizedString {
            if (value === null || value.length === 0) {
                return LocalizedString.Empty;
            }
            if (separator === null) {
                separator = NString.Empty;
            }
            var array: any[] = new Array<any>(value.length + 1);
            array[0] = separator;
            NArray.Copy(value, 0, array, 1, value.length);
            var stringBuilder: StringBuilder = new StringBuilder(6 * value.length);
            stringBuilder.Append("{");
            for (var i: number = 1; i < value.length; i = i + 1) {
                stringBuilder.Append(i);
                stringBuilder.Append("}{0}{");
            }
            stringBuilder.Append(value.length + "}");
            return new LocalizedString(stringBuilder.ToString(), array);
        }
        constructor(id: string, resourceManager: ExchangeResourceManager, inserts: any[]);
        constructor(value: string);
        constructor(format: string, inserts: any[]);
        constructor(info: SerializationInfo, context: StreamingContext);
        constructor(idOrValueOrFormatOrInfo: any, resourceManagerOrInsertsOrContext?: any, inserts?: any[]) {
            super();
            if (arguments.length === 3 && (idOrValueOrFormatOrInfo === null || idOrValueOrFormatOrInfo.constructor === String) && (resourceManagerOrInsertsOrContext === null || resourceManagerOrInsertsOrContext instanceof ExchangeResourceManager) && (inserts === null || inserts instanceof Array)) {
                this.constructor_0(idOrValueOrFormatOrInfo, resourceManagerOrInsertsOrContext, inserts);
                return;
            }
            if (arguments.length === 1 && (idOrValueOrFormatOrInfo === null || idOrValueOrFormatOrInfo.constructor === String)) {
                this.constructor_1(idOrValueOrFormatOrInfo);
                return;
            }
            if (arguments.length === 2 && (idOrValueOrFormatOrInfo === null || idOrValueOrFormatOrInfo.constructor === String) && (resourceManagerOrInsertsOrContext === null || resourceManagerOrInsertsOrContext instanceof Array)) {
                this.constructor_2(idOrValueOrFormatOrInfo, resourceManagerOrInsertsOrContext);
                return;
            }
            this.constructor_3(idOrValueOrFormatOrInfo, resourceManagerOrInsertsOrContext);
        }
        private constructor_0(id: string, resourceManager: ExchangeResourceManager, inserts: any[]): void {
            if (id === null) {
                throw new ArgumentNullException("id");
            }
            if (resourceManager === null) {
                throw new ArgumentNullException("resourceManager");
            }
            this.Id = id;
            this.ResourceManager = resourceManager;
            this.Inserts = ((inserts !== null && inserts.length > 0) ? inserts : null);
        }
        private constructor_1(value: string): void {
            this.Id = value;
            this.Inserts = null;
            this.ResourceManager = null;
        }
        private constructor_2(format: string, inserts: any[]): void {
            this.Id = format;
            this.Inserts = inserts;
            this.ResourceManager = null;
        }
        private constructor_3(info: SerializationInfo, context: StreamingContext): void {
            this.Inserts = <any[]>info.GetValue("inserts", new Type("Array"));
            this.ResourceManager = null;
            this.Id = null;
            try {
                var $string: string = info.GetString("baseName");
                var string2: string = info.GetString("assemblyName");
                var assembly: Assembly = Assembly.Load(string2);
                this.ResourceManager = ExchangeResourceManager.GetResourceManager($string, assembly);
                this.Id = info.GetString("id");
                if (this.ResourceManager.GetString(this.Id) === null) {
                    this.ResourceManager = null;
                }
            }
            catch (ex_87) {
                if (ex_87 instanceof SerializationException) {
                    this.ResourceManager = null;
                }
                else
                    if (ex_87 instanceof FileNotFoundException) {
                        this.ResourceManager = null;
                    }
                    else
                        if (ex_87 instanceof MissingManifestResourceException) {
                            this.ResourceManager = null;
                        }
                        else
                            throw ex_87;
            }
            if (this.ResourceManager === null) {
                this.Id = info.GetString("fallback");
            }
        }
        GetObjectData(info: SerializationInfo, context: StreamingContext): void {
            var array: any[] = null;
            if (this.Inserts !== null && this.Inserts.length > 0) {
                array = new Array<any>(this.Inserts.length);
                for (var i: number = 0; i < this.Inserts.length; i = i + 1) {
                    var obj: any = this.Inserts[i];
                    if (obj !== null) {
                        if (obj instanceof ILocalizedString) {
                            obj = (<ILocalizedString>obj).LocalizedString;
                        }
                        else {
                            if (!obj.GetType().IsSerializable && !(obj instanceof ISerializable)) {
                                var obj2: any = LocalizedString.TranslateObject(obj, CultureInfo.InvariantCulture);
                                if (obj2 === obj) {
                                    obj = NObject.GenericToString(obj);
                                }
                                else {
                                    obj = obj2;
                                }
                            }
                        }
                    }
                    array[i] = obj;
                }
            }
            info.AddValue("inserts", array);
            if (this.ResourceManager !== null) {
                info.AddValue("baseName", this.ResourceManager.BaseName);
                info.AddValue("assemblyName", this.ResourceManager.AssemblyName);
                info.AddValue("id", this.Id);
                info.AddValue("fallback", this.ResourceManager.GetString(this.Id, CultureInfo.InvariantCulture));
                return;
            }
            info.AddValue("fallback", this.Id);
        }
        ToString(): string;
        ToString(formatProvider: IFormatProvider): string;
        ToString(formatProvider?: IFormatProvider): string {
            if (arguments.length === 0) {
                return this.ToString_0();
            }
            return this.ToString_1(formatProvider);
        }
        private ToString_0(): string {
            return (<IFormattable>this).ToString(null, null);
        }
        private ToString_1(formatProvider: IFormatProvider): string {
            return (<IFormattable>this).ToString(null, formatProvider);
        }
        GetHashCode(): number {
            var num: number = (this.Id !== null) ? NString.GetHashCode(this.Id) : 0;
            var num2: number = (this.ResourceManager !== null) ? this.ResourceManager.GetHashCode() : 0;
            var num3: number = num ^ num2;
            if (this.Inserts !== null) {
                for (var i: number = 0; i < this.Inserts.length; i = i + 1) {
                    num3 = (num3 ^ i ^ ((this.Inserts[i] !== null) ? NObject.GenericGetHashCode(this.Inserts[i]) : 0));
                }
            }
            return num3;
        }
        Equals(obj: any): boolean;
        Equals(obj: LocalizedString): boolean;
        Equals(obj: any): boolean {
            if (arguments.length === 1 && (obj === null || obj.constructor === Object)) {
                return this.Equals_0(obj);
            }
            return this.Equals_1(obj);
        }
        private Equals_0(obj: any): boolean {
            return obj instanceof LocalizedString && this.Equals(<LocalizedString>obj);
        }
        private Equals_1(obj: LocalizedString): boolean {
            if (!NString.Equals(this.Id, obj.Id, StringComparison.OrdinalIgnoreCase)) {
                return false;
            }
            if (null !== this.ResourceManager ^ null !== obj.ResourceManager) {
                return false;
            }
            if (this.ResourceManager !== null && !NObject.GenericEquals(this.ResourceManager, obj.ResourceManager)) {
                return false;
            }
            if (null !== this.Inserts ^ null !== obj.Inserts) {
                return false;
            }
            if (this.Inserts !== null && obj.Inserts !== null) {
                if (this.Inserts.length !== obj.Inserts.length) {
                    return false;
                }
                for (var i: number = 0; i < this.Inserts.length; i = i + 1) {
                    if (null !== this.Inserts[i] ^ null !== obj.Inserts[i]) {
                        return false;
                    }
                    if (this.Inserts[i] !== null && obj.Inserts[i] !== null && !NObject.GenericEquals(this.Inserts[i], obj.Inserts[i])) {
                        return false;
                    }
                }
            }
            return true;
        }
        private static TranslateObject(badObject: any, formatProvider: IFormatProvider): any {
            var ex: Exception = ((badObject instanceof Exception) ? <Exception>badObject : null);
            if (ex !== null) {
                return ex.Message;
            }
            return badObject;
        }
    }
    class SearchFilter extends ComplexProperty {
        constructor() {
            super();
        }
        static LoadFromXml(reader: EwsServiceXmlReader): SearchFilter {
            reader.EnsureCurrentNodeIsStartElement();
            var localName: string = reader.LocalName;
            var searchFilterInstance: SearchFilter = SearchFilter.GetSearchFilterInstance(localName);
            if (searchFilterInstance !== null) {
                searchFilterInstance.LoadFromXml(reader, reader.LocalName);
            }
            return searchFilterInstance;
        }
        static LoadSearchFilterFromJson(jsonObject: JsonObject, service: ExchangeService): SearchFilter {
            var searchFilterInstance: SearchFilter = SearchFilter.GetSearchFilterInstance(jsonObject.ReadTypeString());
            if (searchFilterInstance !== null) {
                searchFilterInstance.LoadFromJson(jsonObject, service);
            }
            return searchFilterInstance;
        }
        static GetSearchFilterInstance(localName: string): SearchFilter {
            var result: SearchFilter;
            switch (localName) {
                case "Exists":
                    result = new SearchFilter_Exists();
                    return result;
                case "Contains":
                    result = new SearchFilter_ContainsSubstring();
                    return result;
                case "Excludes":
                    result = new SearchFilter_ExcludesBitmask();
                    return result;
                case "Not":
                    result = new SearchFilter_Not();
                    return result;
                case "And":
                    result = new SearchFilter_SearchFilterCollection(LogicalOperator.And);
                    return result;
                case "Or":
                    result = new SearchFilter_SearchFilterCollection(LogicalOperator.Or);
                    return result;
                case "IsEqualTo":
                    result = new SearchFilter_IsEqualTo();
                    return result;
                case "IsNotEqualTo":
                    result = new SearchFilter_IsNotEqualTo();
                    return result;
                case "IsGreaterThan":
                    result = new SearchFilter_IsGreaterThan();
                    return result;
                case "IsGreaterThanOrEqualTo":
                    result = new SearchFilter_IsGreaterThanOrEqualTo();
                    return result;
                case "IsLessThan":
                    result = new SearchFilter_IsLessThan();
                    return result;
                case "IsLessThanOrEqualTo":
                    result = new SearchFilter_IsLessThanOrEqualTo();
                    return result;
            }
            result = null;
            return result;
        }
        GetXmlElementName(): string {
            throw new NotSupportedException();
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetXmlElementName());
            return jsonObject;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            super.WriteToXml(writer, this.GetXmlElementName());
        }
    }
    class SearchFilter_SearchFilterCollection extends SearchFilter implements IEnumerable<SearchFilter>
    {
        private searchFilters: List<SearchFilter> = new List<SearchFilter>();
        private logicalOperator: LogicalOperator = 0;
        get Count(): number {
            return this.searchFilters.Count;
        }
        get_Item(index: number): SearchFilter {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.searchFilters.get_Item(index);
        }
        set_Item(index: number, value: SearchFilter): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            this.searchFilters.set_Item(index, value);
        }
        set LogicalOperator(value: LogicalOperator) {
            this.logicalOperator = value;
        }
        get LogicalOperator(): LogicalOperator {
            return this.logicalOperator;
        }
        constructor();
        constructor(logicalOperator: LogicalOperator);
        constructor(logicalOperator: LogicalOperator, searchFilters: SearchFilter[]);
        constructor(logicalOperator: LogicalOperator, searchFilters: IEnumerable<SearchFilter>);
        constructor(logicalOperator?: LogicalOperator, searchFilters?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (logicalOperator === null || logicalOperator.constructor === Number)) {
                this.constructor_1(logicalOperator);
                return;
            }
            if (arguments.length === 2 && (logicalOperator === null || logicalOperator.constructor === Number) && (searchFilters === null || searchFilters instanceof Array)) {
                this.constructor_2(logicalOperator, searchFilters);
                return;
            }
            this.constructor_3(logicalOperator, searchFilters);
        }
        private constructor_0(): void {
        }
        private constructor_1(logicalOperator: LogicalOperator): void {
            this.logicalOperator = logicalOperator;
        }
        private constructor_2(logicalOperator: LogicalOperator, searchFilters: SearchFilter[]): void {
            this.constructor_1(logicalOperator);
            this.AddRange(NArray.ToEnumerable(searchFilters));
        }
        private constructor_3(logicalOperator: LogicalOperator, searchFilters: IEnumerable<SearchFilter>): void {
            this.constructor_1(logicalOperator);
            this.AddRange(searchFilters);
        }
        InternalValidate(): void {
            for (var i: number = 0; i < this.Count; i = i + 1) {
                try {
                    this.get_Item(i).InternalValidate();
                }
                catch (innerException) {
                    if (innerException instanceof ServiceValidationException) {
                        throw new ServiceValidationException(NString.Format(Strings.SearchFilterAtIndexIsInvalid, i), innerException);
                    }
                    else
                        throw innerException;
                }
            }
        }
        private SearchFilterChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
        GetXmlElementName(): string {
            return LogicalOperator[this.LogicalOperator];
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            this.Add(SearchFilter.LoadFromXml(reader));
            return true;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var array: any[] = jsonProperty.ReadAsArray("Item");
            var array2: any[] = array;
            for (var i: number = 0; i < array2.length; i = i + 1) {
                var obj: any = array2[i];
                this.Add(SearchFilter.LoadSearchFilterFromJson(((obj instanceof JsonObject) ? <JsonObject>obj : null), service));
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            var enumerator: IEnumerator<SearchFilter> = this.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: SearchFilter = enumerator.Current;
                    current.WriteToXml(writer);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            if (this.Count === 1) {
                this.get_Item(0).WriteToXml(writer);
                return;
            }
            super.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            var list: List<any> = new List<any>();
            var enumerator: IEnumerator<SearchFilter> = this.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: SearchFilter = enumerator.Current;
                    list.Add(current.InternalToJson(service));
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            jsonObject.Add("Items", NArray.ToEnumerable(list.ToArray()));
            return jsonObject;
        }
        Add(searchFilter: SearchFilter): void {
            if (searchFilter === null) {
                throw new ArgumentNullException("searchFilter");
            }
            searchFilter.OnChange.Add(this.SearchFilterChanged);
            this.searchFilters.Add(searchFilter);
            this.Changed();
        }
        AddRange(searchFilters: IEnumerable<SearchFilter>): void {
            if (searchFilters === null) {
                throw new ArgumentNullException("searchFilters");
            }
            var enumerator: IEnumerator<SearchFilter> = searchFilters.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: SearchFilter = enumerator.Current;
                    current.OnChange.Add(this.SearchFilterChanged);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
            this.searchFilters.AddRange(searchFilters);
            this.Changed();
        }
        Clear(): void {
            if (this.Count > 0) {
                var enumerator: IEnumerator<SearchFilter> = this.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: SearchFilter = enumerator.Current;
                        current.OnChange.Remove(this.SearchFilterChanged);
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
                this.searchFilters.Clear();
                this.Changed();
            }
        }
        Contains(searchFilter: SearchFilter): boolean {
            return this.searchFilters.Contains(searchFilter);
        }
        Remove(searchFilter: SearchFilter): void {
            if (searchFilter === null) {
                throw new ArgumentNullException("searchFilter");
            }
            if (this.Contains(searchFilter)) {
                searchFilter.OnChange.Remove(this.SearchFilterChanged);
                this.searchFilters.Remove(searchFilter);
                this.Changed();
            }
        }
        RemoveAt(index: number): void {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            this.get_Item(index).OnChange.Remove(this.SearchFilterChanged);
            this.searchFilters.RemoveAt(index);
            this.Changed();
        }
        GetEnumerator(): IEnumerator<SearchFilter> {
            return this.searchFilters.GetEnumerator();
        }
    }
    class SearchFilter_Not extends SearchFilter {
        private searchFilter: SearchFilter = null;
        set SearchFilter(value: SearchFilter) {
            if (this.searchFilter !== null) {
                this.searchFilter.OnChange.Remove(this.SearchFilterChanged);
            }
            (() => {
                var _p0 = [
                    this.searchFilter
                ];
                var _r = this.SetFieldValue<SearchFilter>(_p0, value);
                this.searchFilter = _p0[0];
                return _r;
            })();
            if (this.searchFilter !== null) {
                this.searchFilter.OnChange.Add(this.SearchFilterChanged);
            }
        }
        get SearchFilter(): SearchFilter {
            return this.searchFilter;
        }
        constructor();
        constructor(searchFilter: SearchFilter);
        constructor(searchFilter?: SearchFilter) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(searchFilter);
        }
        private constructor_0(): void {
        }
        private constructor_1(searchFilter: SearchFilter): void {
            this.searchFilter = searchFilter;
        }
        private SearchFilterChanged(complexProperty: ComplexProperty): void {
            this.Changed();
        }
        InternalValidate(): void {
            if (this.searchFilter === null) {
                throw new ServiceValidationException(Strings.SearchFilterMustBeSet);
            }
        }
        GetXmlElementName(): string {
            return "Not";
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            this.searchFilter = SearchFilter.LoadFromXml(reader);
            return true;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.searchFilter = SearchFilter.LoadSearchFilterFromJson(jsonProperty.ReadAsJsonObject("Item"), service);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.SearchFilter.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            jsonObject.Add("Item", this.SearchFilter.InternalToJson(service));
            return jsonObject;
        }
    }
    class SearchFilter_PropertyBasedFilter extends SearchFilter {
        private propertyDefinition: PropertyDefinitionBase = null;
        set PropertyDefinition(value: PropertyDefinitionBase) {
            (() => {
                var _p0 = [
                    this.propertyDefinition
                ];
                var _r = this.SetFieldValue<PropertyDefinitionBase>(_p0, value);
                this.propertyDefinition = _p0[0];
                return _r;
            })();
        }
        get PropertyDefinition(): PropertyDefinitionBase {
            return this.propertyDefinition;
        }
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition?: PropertyDefinitionBase) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(propertyDefinition);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase): void {
            this.propertyDefinition = propertyDefinition;
        }
        InternalValidate(): void {
            if (this.propertyDefinition === null) {
                throw new ServiceValidationException(Strings.PropertyDefinitionPropertyMustBeSet);
            }
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            return (() => {
                var _p0 = [
                    this.propertyDefinition
                ];
                var _r = PropertyDefinitionBase.TryLoadFromXml(reader, _p0);
                this.propertyDefinition = _p0[0];
                return _r;
            })();
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.PropertyDefinition = PropertyDefinitionBase.TryLoadFromJson(jsonProperty.ReadAsJsonObject("Item"));
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            this.PropertyDefinition.WriteToXml(writer);
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            jsonObject.Add("Item", (<IJsonSerializable>this.PropertyDefinition).ToJson(service));
            return jsonObject;
        }
    }
    class SearchFilter_RelationalFilter extends SearchFilter_PropertyBasedFilter {
        private otherPropertyDefinition: PropertyDefinitionBase = null;
        private value: any = null;
        set OtherPropertyDefinition(value: PropertyDefinitionBase) {
            (() => {
                var _p0 = [
                    this.otherPropertyDefinition
                ];
                var _r = this.SetFieldValue<PropertyDefinitionBase>(_p0, value);
                this.otherPropertyDefinition = _p0[0];
                return _r;
            })();
            this.value = null;
        }
        get OtherPropertyDefinition(): PropertyDefinitionBase {
            return this.otherPropertyDefinition;
        }
        set Value(value: any) {
            (() => {
                var _p0 = [
                    this.value
                ];
                var _r = this.SetFieldValue<any>(_p0, value);
                this.value = _p0[0];
                return _r;
            })();
            this.otherPropertyDefinition = null;
        }
        get Value(): any {
            return this.value;
        }
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
            this.otherPropertyDefinition = otherPropertyDefinition;
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
            this.value = value;
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (this.otherPropertyDefinition === null && this.value === null) {
                throw new ServiceValidationException(Strings.EqualityComparisonFilterIsInvalid);
            }
            if (this.value !== null && !(this.value instanceof IConvertible) && !(this.value instanceof ISearchStringProvider)) {
                throw new ServiceValidationException(NString.Format(Strings.SearchFilterComparisonValueTypeIsNotSupported, this.value.GetType().Name));
            }
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag && reader.LocalName === "FieldURIOrConstant") {
                reader.Read();
                reader.EnsureCurrentNodeIsStartElement();
                if (reader.IsStartElement(XmlNamespace.Types, "Constant")) {
                    this.value = reader.ReadAttributeValue("Value");
                    flag = true;
                }
                else {
                    flag = (() => {
                        var _p0 = [
                            this.otherPropertyDefinition
                        ];
                        var _r = PropertyDefinitionBase.TryLoadFromXml(reader, _p0);
                        this.otherPropertyDefinition = _p0[0];
                        return _r;
                    })();
                }
            }
            return flag;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            var jsonObject: JsonObject = jsonProperty.ReadAsJsonObject("FieldURIOrConstant").ReadAsJsonObject("Item");
            if (jsonObject.ReadTypeString() === "Constant") {
                this.value = jsonObject.get_Item("Value");
                return;
            }
            this.otherPropertyDefinition = PropertyDefinitionBase.TryLoadFromJson(jsonProperty);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Types, "FieldURIOrConstant");
            if (this.Value !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "Constant");
                writer.WriteAttributeValue("Value", true, this.Value);
                writer.WriteEndElement();
            }
            else {
                this.OtherPropertyDefinition.WriteToXml(writer);
            }
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            var jsonObject2: JsonObject = new JsonObject();
            if (this.Value !== null) {
                var jsonObject3: JsonObject = new JsonObject();
                jsonObject3.Add("Value", this.Value);
                jsonObject3.AddTypeParameter("Constant");
                jsonObject2.Add("Item", jsonObject3);
            }
            else {
                jsonObject2.Add("Item", (<IJsonSerializable>this.OtherPropertyDefinition).ToJson(service));
            }
            jsonObject.Add("FieldURIOrConstant", jsonObject2);
            return jsonObject;
        }
    }
    class SearchFilter_IsLessThanOrEqualTo extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsLessThanOrEqualTo";
        }
    }
    class SearchFilter_IsLessThan extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsLessThan";
        }
    }
    class SearchFilter_IsGreaterThanOrEqualTo extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsGreaterThanOrEqualTo";
        }
    }
    class SearchFilter_IsGreaterThan extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsGreaterThan";
        }
    }
    class SearchFilter_IsNotEqualTo extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsNotEqualTo";
        }
    }
    class SearchFilter_IsEqualTo extends SearchFilter_RelationalFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition: PropertyDefinitionBase, value: any);
        constructor(propertyDefinition?: PropertyDefinitionBase, otherPropertyDefinitionOrValue?: any) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (otherPropertyDefinitionOrValue === null || otherPropertyDefinitionOrValue instanceof PropertyDefinitionBase)) {
                super(propertyDefinition, otherPropertyDefinitionOrValue);
                this.constructor_1(propertyDefinition, otherPropertyDefinitionOrValue);
                return;
            }
            super(propertyDefinition, otherPropertyDefinitionOrValue);
            this.constructor_2(propertyDefinition, otherPropertyDefinitionOrValue);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, otherPropertyDefinition: PropertyDefinitionBase): void {
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: any): void {
        }
        GetXmlElementName(): string {
            return "IsEqualTo";
        }
    }
    class SearchFilter_Exists extends SearchFilter_PropertyBasedFilter {
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase);
        constructor(propertyDefinition?: PropertyDefinitionBase) {
            if (arguments.length === 0) {
                super();
                this.constructor_0();
                return;
            }
            super(propertyDefinition);
            this.constructor_1(propertyDefinition);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase): void {
        }
        GetXmlElementName(): string {
            return "Exists";
        }
    }
    class SearchFilter_ExcludesBitmask extends SearchFilter_PropertyBasedFilter {
        private bitmask: number = 0;
        set Bitmask(value: number) {
            (() => {
                var _p0 = [
                    this.bitmask
                ];
                var _r = this.SetFieldValue<number>(_p0, value);
                this.bitmask = _p0[0];
                return _r;
            })();
        }
        get Bitmask(): number {
            return this.bitmask;
        }
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, bitmask: number);
        constructor(propertyDefinition?: PropertyDefinitionBase, bitmask?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(propertyDefinition, bitmask);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, bitmask: number): void {
            this.bitmask = bitmask;
        }
        GetXmlElementName(): string {
            return "Excludes";
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag && reader.LocalName === "Bitmask") {
                this.bitmask = Convert.ToInt32(reader.ReadAttributeValue("Value"), 16);
            }
            return flag;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            this.bitmask = Convert.ToInt32(jsonProperty.ReadAsJsonObject("Bitmask").ReadAsString("Value"), 16);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Types, "Bitmask");
            writer.WriteAttributeValue("Value", this.Bitmask);
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): any {
            var result: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Value", "0x" + NNumber.ToString(this.Bitmask, "X", CultureInfo.InvariantCulture));
            return result;
        }
    }
    class SearchFilter_ContainsSubstring extends SearchFilter_PropertyBasedFilter {
        private containmentMode: ContainmentMode = ContainmentMode.Substring;
        private comparisonMode: ComparisonMode = ComparisonMode.IgnoreCase;
        private value: string = null;
        set ContainmentMode(value: ContainmentMode) {
            (() => {
                var _p0 = [
                    this.containmentMode
                ];
                var _r = this.SetFieldValue<ContainmentMode>(_p0, value);
                this.containmentMode = _p0[0];
                return _r;
            })();
        }
        get ContainmentMode(): ContainmentMode {
            return this.containmentMode;
        }
        set ComparisonMode(value: ComparisonMode) {
            (() => {
                var _p0 = [
                    this.comparisonMode
                ];
                var _r = this.SetFieldValue<ComparisonMode>(_p0, value);
                this.comparisonMode = _p0[0];
                return _r;
            })();
        }
        get ComparisonMode(): ComparisonMode {
            return this.comparisonMode;
        }
        set Value(value: string) {
            (() => {
                var _p0 = [
                    this.value
                ];
                var _r = this.SetFieldValue<string>(_p0, value);
                this.value = _p0[0];
                return _r;
            })();
        }
        get Value(): string {
            return this.value;
        }
        constructor();
        constructor(propertyDefinition: PropertyDefinitionBase, value: string);
        constructor(propertyDefinition: PropertyDefinitionBase, value: string, containmentMode: ContainmentMode, comparisonMode: ComparisonMode);
        constructor(propertyDefinition?: PropertyDefinitionBase, value?: string, containmentMode?: ContainmentMode, comparisonMode?: ComparisonMode) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 2 && (propertyDefinition === null || propertyDefinition instanceof PropertyDefinitionBase) && (value === null || value.constructor === String)) {
                this.constructor_1(propertyDefinition, value);
                return;
            }
            this.constructor_2(propertyDefinition, value, containmentMode, comparisonMode);
        }
        private constructor_0(): void {
        }
        private constructor_1(propertyDefinition: PropertyDefinitionBase, value: string): void {
            this.value = value;
        }
        private constructor_2(propertyDefinition: PropertyDefinitionBase, value: string, containmentMode: ContainmentMode, comparisonMode: ComparisonMode): void {
            this.constructor_1(propertyDefinition, value);
            this.containmentMode = containmentMode;
            this.comparisonMode = comparisonMode;
        }
        InternalValidate(): void {
            super.InternalValidate();
            if (NString.IsNullOrEmpty(this.value)) {
                throw new ServiceValidationException(Strings.ValuePropertyMustBeSet);
            }
        }
        GetXmlElementName(): string {
            return "Contains";
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var flag: boolean = super.TryReadElementFromXml(reader);
            if (!flag && reader.LocalName === "Constant") {
                this.value = reader.ReadAttributeValue("Value");
                flag = true;
            }
            return flag;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            super.ReadAttributesFromXml(reader);
            this.containmentMode = reader.ReadAttributeValue<ContainmentMode>("ContainmentMode");
            try {
                this.comparisonMode = reader.ReadAttributeValue<ComparisonMode>("ContainmentComparison");
            }
            catch (ex_2B) {
                if (ex_2B instanceof ArgumentException) {
                    this.comparisonMode = ComparisonMode.IgnoreCaseAndNonSpacingCharacters;
                }
                else
                    throw ex_2B;
            }
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            super.LoadFromJson(jsonProperty, service);
            this.value = jsonProperty.ReadAsJsonObject("Constant").ReadAsString("Value");
            this.containmentMode = jsonProperty.ReadEnumValue<ContainmentMode>("ContainmentMode");
            this.comparisonMode = jsonProperty.ReadEnumValue<ComparisonMode>("ContainmentComparison");
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            super.WriteAttributesToXml(writer);
            writer.WriteAttributeValue("ContainmentMode", this.ContainmentMode);
            writer.WriteAttributeValue("ContainmentComparison", this.ComparisonMode);
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            super.WriteElementsToXml(writer);
            writer.WriteStartElement(XmlNamespace.Types, "Constant");
            writer.WriteAttributeValue("Value", this.Value);
            writer.WriteEndElement();
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = ((super.InternalToJson(service) instanceof JsonObject) ? <JsonObject>super.InternalToJson(service) : null);
            jsonObject.Add("ContainmentMode", this.ContainmentMode);
            jsonObject.Add("ContainmentComparison", this.ComparisonMode);
            var jsonObject2: JsonObject = new JsonObject();
            jsonObject2.Add("Value", this.Value);
            jsonObject.Add("Constant", jsonObject2);
            return jsonObject;
        }
    }
    class ViewBase {
        private propertySet: PropertySet = null;
        set PropertySet(value: PropertySet) {
            this.propertySet = value;
        }
        get PropertySet(): PropertySet {
            return this.propertySet;
        }
        constructor() {
            super();
        }
        InternalValidate(request: ServiceRequestBase): void {
            if (this.PropertySet !== null) {
                this.PropertySet.InternalValidate();
                this.PropertySet.ValidateForRequest(request, true);
            }
        }
        InternalWriteViewToXml(writer: EwsServiceXmlWriter): void {
            var maxEntriesReturned: Nullable<number> = this.GetMaxEntriesReturned();
            if (maxEntriesReturned !== null) {
                writer.WriteAttributeValue("MaxEntriesReturned", maxEntriesReturned.Value);
            }
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            throw new NotSupportedException();
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        GetViewXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetViewJsonTypeName(): string {
            return this.GetViewXmlElementName();
        }
        GetMaxEntriesReturned(): Nullable<number> {
            throw new NotSupportedException();
        }
        GetServiceObjectType(): ServiceObjectType {
            throw new NotSupportedException();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            throw new NotSupportedException();
        }
        WriteToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            this.GetPropertySetOrDefault().WriteToXml(writer, this.GetServiceObjectType());
            writer.WriteStartElement(XmlNamespace.Messages, this.GetViewXmlElementName());
            this.InternalWriteViewToXml(writer);
            writer.WriteEndElement();
            this.InternalWriteSearchSettingsToXml(writer, groupBy);
        }
        WriteShapeToJson(jsonRequest: JsonObject, service: ExchangeService): void {
            this.GetPropertySetOrDefault().WriteGetShapeToJson(jsonRequest, service, this.GetServiceObjectType());
        }
        WritePagingToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.AddTypeParameter(this.GetViewJsonTypeName());
            this.InternalWritePagingToJson(jsonObject, service);
            return jsonObject;
        }
        InternalWritePagingToJson(jsonView: JsonObject, service: ExchangeService): void {
            var maxEntriesReturned: Nullable<number> = this.GetMaxEntriesReturned();
            if (maxEntriesReturned !== null) {
                jsonView.Add("MaxEntriesReturned", maxEntriesReturned.Value);
            }
        }
        WriteGroupingToJson(service: ExchangeService, groupBy: Grouping): any {
            throw new NotSupportedException();
        }
        GetPropertySetOrDefault(): PropertySet {
            return this.PropertySet || PropertySet.FirstClassProperties;
        }
    }
    class CalendarView extends ViewBase {
        private traversal: ItemTraversal = 0;
        private maxItemsReturned: Nullable<number> = null;
        private startDate: DateTime = null;
        private endDate: DateTime = null;
        set StartDate(value: DateTime) {
            this.startDate = value;
        }
        get StartDate(): DateTime {
            return this.startDate;
        }
        set EndDate(value: DateTime) {
            this.endDate = value;
        }
        get EndDate(): DateTime {
            return this.endDate;
        }
        set MaxItemsReturned(value: Nullable<number>) {
            if (value !== null && value.Value <= 0) {
                throw new ArgumentException(Strings.ValueMustBeGreaterThanZero);
            }
            this.maxItemsReturned = value;
        }
        get MaxItemsReturned(): Nullable<number> {
            return this.maxItemsReturned;
        }
        set Traversal(value: ItemTraversal) {
            this.traversal = value;
        }
        get Traversal(): ItemTraversal {
            return this.traversal;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Traversal", this.Traversal);
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
        }
        WriteGroupingToJson(service: ExchangeService, groupBy: Grouping): any {
            return null;
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("Traversal", this.Traversal);
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Item;
        }
        constructor(startDate: DateTime, endDate: DateTime);
        constructor(startDate: DateTime, endDate: DateTime, maxItemsReturned: number);
        constructor(startDate: DateTime, endDate: DateTime, maxItemsReturned?: number) {
            super();
            if (arguments.length === 2 && (startDate === null || startDate instanceof DateTime) && (endDate === null || endDate instanceof DateTime)) {
                this.constructor_0(startDate, endDate);
                return;
            }
            this.constructor_1(startDate, endDate, maxItemsReturned);
        }
        private constructor_0(startDate: DateTime, endDate: DateTime): void {
            this.startDate = startDate;
            this.endDate = endDate;
        }
        private constructor_1(startDate: DateTime, endDate: DateTime, maxItemsReturned: number): void {
            this.constructor_0(startDate, endDate);
            this.MaxItemsReturned = new Nullable<number>(maxItemsReturned);
        }
        InternalValidate(request: ServiceRequestBase): void {
            super.InternalValidate(request);
            if (DateTime.op_LessThan(this.endDate, this.StartDate)) {
                throw new ServiceValidationException(Strings.EndDateMustBeGreaterThanStartDate);
            }
        }
        InternalWriteViewToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWriteViewToXml(writer);
            writer.WriteAttributeValue("StartDate", this.StartDate);
            writer.WriteAttributeValue("EndDate", this.EndDate);
        }
        InternalWritePagingToJson(jsonView: JsonObject, service: ExchangeService): void {
            super.InternalWritePagingToJson(jsonView, service);
            jsonView.Add("StartDate", this.StartDate);
            jsonView.Add("EndDate", this.EndDate);
        }
        GetViewXmlElementName(): string {
            return "CalendarView";
        }
        GetViewJsonTypeName(): string {
            return "CalendarPageView";
        }
        GetMaxEntriesReturned(): Nullable<number> {
            return this.MaxItemsReturned;
        }
    }
    class FindConversationResults {
        Conversations: Collection<Conversation> = null;
        HighlightTerms: Collection<HighlightTerm> = null;
        TotalCount: Nullable<number> = null;
        IndexedOffset: Nullable<number> = null;
        constructor() {
            super();
            this.Conversations = new Collection<Conversation>();
            this.HighlightTerms = new Collection<HighlightTerm>();
            this.TotalCount = null;
        }
    }
    class FindFoldersResults implements IEnumerable<Folder>
    {
        private totalCount: number = 0;
        private nextPageOffset: Nullable<number> = null;
        private moreAvailable: boolean = false;
        private folders: Collection<Folder> = new Collection<Folder>();
        set TotalCount(value: number) {
            this.totalCount = value;
        }
        get TotalCount(): number {
            return this.totalCount;
        }
        set NextPageOffset(value: Nullable<number>) {
            this.nextPageOffset = value;
        }
        get NextPageOffset(): Nullable<number> {
            return this.nextPageOffset;
        }
        set MoreAvailable(value: boolean) {
            this.moreAvailable = value;
        }
        get MoreAvailable(): boolean {
            return this.moreAvailable;
        }
        get Folders(): Collection<Folder> {
            return this.folders;
        }
        constructor() {
            super();
        }
        GetEnumerator(): IEnumerator<Folder> {
            return this.folders.GetEnumerator();
        }
    }
    class FindItemsResults<TItem> implements IEnumerable<TItem>
    {
        private totalCount: number = 0;
        private nextPageOffset: Nullable<number> = null;
        private moreAvailable: boolean = false;
        private items: Collection<TItem> = new Collection<TItem>();
        private highlightTerms: Collection<HighlightTerm> = new Collection<HighlightTerm>();
        set TotalCount(value: number) {
            this.totalCount = value;
        }
        get TotalCount(): number {
            return this.totalCount;
        }
        set NextPageOffset(value: Nullable<number>) {
            this.nextPageOffset = value;
        }
        get NextPageOffset(): Nullable<number> {
            return this.nextPageOffset;
        }
        set MoreAvailable(value: boolean) {
            this.moreAvailable = value;
        }
        get MoreAvailable(): boolean {
            return this.moreAvailable;
        }
        get Items(): Collection<TItem> {
            return this.items;
        }
        get HighlightTerms(): Collection<HighlightTerm> {
            return this.highlightTerms;
        }
        constructor() {
            super();
        }
        GetEnumerator(): IEnumerator<TItem> {
            return this.items.GetEnumerator();
        }
    }
    class PagedView extends ViewBase {
        private pageSize: number = 0;
        private offsetBasePoint: OffsetBasePoint = 0;
        private offset: number = 0;
        set PageSize(value: number) {
            if (value <= 0) {
                throw new ArgumentException(Strings.ValueMustBeGreaterThanZero);
            }
            this.pageSize = value;
        }
        get PageSize(): number {
            return this.pageSize;
        }
        set OffsetBasePoint(value: OffsetBasePoint) {
            this.offsetBasePoint = value;
        }
        get OffsetBasePoint(): OffsetBasePoint {
            return this.offsetBasePoint;
        }
        set Offset(value: number) {
            if (value >= 0) {
                this.offset = value;
                return;
            }
            throw new ArgumentException(Strings.OffsetMustBeGreaterThanZero);
        }
        get Offset(): number {
            return this.offset;
        }
        InternalWriteViewToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWriteViewToXml(writer);
            writer.WriteAttributeValue("Offset", this.Offset);
            writer.WriteAttributeValue("BasePoint", this.OffsetBasePoint);
        }
        InternalWritePagingToJson(jsonView: JsonObject, service: ExchangeService): void {
            super.InternalWritePagingToJson(jsonView, service);
            jsonView.Add("Offset", this.Offset);
            jsonView.Add("BasePoint", this.OffsetBasePoint);
        }
        GetMaxEntriesReturned(): Nullable<number> {
            return new Nullable<number>(this.PageSize);
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            if (groupBy !== null) {
                groupBy.WriteToXml(writer);
            }
        }
        WriteGroupingToJson(service: ExchangeService, groupBy: Grouping): any {
            if (groupBy !== null) {
                return (<IJsonSerializable>groupBy).ToJson(service);
            }
            return null;
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
        }
        InternalValidate(request: ServiceRequestBase): void {
            super.InternalValidate(request);
        }
        constructor(pageSize: number);
        constructor(pageSize: number, offset: number);
        constructor(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint);
        constructor(pageSize: number, offset?: number, offsetBasePoint?: OffsetBasePoint) {
            super();
            if (arguments.length === 1 && (pageSize === null || pageSize.constructor === Number)) {
                this.constructor_0(pageSize);
                return;
            }
            if (arguments.length === 2 && (pageSize === null || pageSize.constructor === Number) && (offset === null || offset.constructor === Number)) {
                this.constructor_1(pageSize, offset);
                return;
            }
            this.constructor_2(pageSize, offset, offsetBasePoint);
        }
        private constructor_0(pageSize: number): void {
            this.PageSize = pageSize;
        }
        private constructor_1(pageSize: number, offset: number): void {
            this.constructor_0(pageSize);
            this.Offset = offset;
        }
        private constructor_2(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint): void {
            this.constructor_1(pageSize, offset);
            this.OffsetBasePoint = offsetBasePoint;
        }
    }
    class ConversationIndexedItemView extends PagedView {
        private orderBy: OrderByCollection = new OrderByCollection();
        private traversal: Nullable<ConversationQueryTraversal> = null;
        private viewFilter: Nullable<ViewFilter> = null;
        get OrderBy(): OrderByCollection {
            return this.orderBy;
        }
        set Traversal(value: Nullable<ConversationQueryTraversal>) {
            this.traversal = value;
        }
        get Traversal(): Nullable<ConversationQueryTraversal> {
            return this.traversal;
        }
        set ViewFilter(value: Nullable<ViewFilter>) {
            this.viewFilter = value;
        }
        get ViewFilter(): Nullable<ViewFilter> {
            return this.viewFilter;
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Conversation;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            if (this.Traversal !== null) {
                writer.WriteAttributeValue("Traversal", this.Traversal);
            }
            if (this.ViewFilter !== null) {
                writer.WriteAttributeValue("ViewFilter", this.ViewFilter);
            }
        }
        GetViewXmlElementName(): string {
            return "IndexedPageItemView";
        }
        GetViewJsonTypeName(): string {
            return "IndexedPageView";
        }
        InternalValidate(request: ServiceRequestBase): void {
            super.InternalValidate(request);
            if (this.Traversal !== null) {
                EwsUtilities.ValidateEnumVersionValue(<Enum>this.traversal, request.Service.RequestedServerVersion);
            }
            if (this.ViewFilter !== null) {
                EwsUtilities.ValidateEnumVersionValue(<Enum>this.viewFilter, request.Service.RequestedServerVersion);
            }
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            super.InternalWriteSearchSettingsToXml(writer, groupBy);
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
            this.orderBy.WriteToXml(writer, "SortOrder");
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("SortOrder", (<IJsonSerializable>this.orderBy).ToJson(service));
            if (this.Traversal !== null) {
                jsonRequest.Add("Traversal", <Enum>this.Traversal);
            }
            if (this.ViewFilter !== null) {
                jsonRequest.Add("ViewFilter", <Enum>this.ViewFilter);
            }
        }
        WriteToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            writer.WriteStartElement(XmlNamespace.Messages, this.GetViewXmlElementName());
            this.InternalWriteViewToXml(writer);
            writer.WriteEndElement();
        }
        constructor(pageSize: number);
        constructor(pageSize: number, offset: number);
        constructor(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint);
        constructor(pageSize: number, offset?: number, offsetBasePoint?: OffsetBasePoint) {
            super(pageSize);
            if (arguments.length === 1 && (pageSize === null || pageSize.constructor === Number)) {
                this.constructor_0(pageSize);
                return;
            }
            if (arguments.length === 2 && (pageSize === null || pageSize.constructor === Number) && (offset === null || offset.constructor === Number)) {
                this.constructor_1(pageSize, offset);
                return;
            }
            this.constructor_2(pageSize, offset, offsetBasePoint);
        }
        private constructor_0(pageSize: number): void {
        }
        private constructor_1(pageSize: number, offset: number): void {
            this.Offset = offset;
        }
        private constructor_2(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint): void {
        }
    }
    class FolderView extends PagedView {
        private traversal: FolderTraversal = 0;
        set Traversal(value: FolderTraversal) {
            this.traversal = value;
        }
        get Traversal(): FolderTraversal {
            return this.traversal;
        }
        GetViewXmlElementName(): string {
            return "IndexedPageFolderView";
        }
        GetViewJsonTypeName(): string {
            return "IndexedPageView";
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Folder;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Traversal", this.Traversal);
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("Traversal", this.Traversal);
        }
        constructor(pageSize: number);
        constructor(pageSize: number, offset: number);
        constructor(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint);
        constructor(pageSize: number, offset?: number, offsetBasePoint?: OffsetBasePoint) {
            super(pageSize);
            if (arguments.length === 1 && (pageSize === null || pageSize.constructor === Number)) {
                this.constructor_0(pageSize);
                return;
            }
            if (arguments.length === 2 && (pageSize === null || pageSize.constructor === Number) && (offset === null || offset.constructor === Number)) {
                this.constructor_1(pageSize, offset);
                return;
            }
            this.constructor_2(pageSize, offset, offsetBasePoint);
        }
        private constructor_0(pageSize: number): void {
        }
        private constructor_1(pageSize: number, offset: number): void {
        }
        private constructor_2(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint): void {
        }
    }
    class GroupedFindItemsResults<TItem> implements IEnumerable<ItemGroup<TItem>>
    {
        private totalCount: number = 0;
        private nextPageOffset: Nullable<number> = null;
        private moreAvailable: boolean = false;
        private itemGroups: Collection<ItemGroup<TItem>> = new Collection<ItemGroup<TItem>>();
        set TotalCount(value: number) {
            this.totalCount = value;
        }
        get TotalCount(): number {
            return this.totalCount;
        }
        set NextPageOffset(value: Nullable<number>) {
            this.nextPageOffset = value;
        }
        get NextPageOffset(): Nullable<number> {
            return this.nextPageOffset;
        }
        set MoreAvailable(value: boolean) {
            this.moreAvailable = value;
        }
        get MoreAvailable(): boolean {
            return this.moreAvailable;
        }
        get ItemGroups(): Collection<ItemGroup<TItem>> {
            return this.itemGroups;
        }
        constructor() {
            super();
        }
        GetEnumerator(): IEnumerator<ItemGroup<TItem>> {
            return this.itemGroups.GetEnumerator();
        }
    }
    class Grouping implements ISelfValidate, IJsonSerializable {
        private sortDirection: SortDirection = 0;
        private groupOn: PropertyDefinitionBase = null;
        private aggregateOn: PropertyDefinitionBase = null;
        private aggregateType: AggregateType = 0;
        set SortDirection(value: SortDirection) {
            this.sortDirection = value;
        }
        get SortDirection(): SortDirection {
            return this.sortDirection;
        }
        set GroupOn(value: PropertyDefinitionBase) {
            this.groupOn = value;
        }
        get GroupOn(): PropertyDefinitionBase {
            return this.groupOn;
        }
        set AggregateOn(value: PropertyDefinitionBase) {
            this.aggregateOn = value;
        }
        get AggregateOn(): PropertyDefinitionBase {
            return this.aggregateOn;
        }
        set AggregateType(value: AggregateType) {
            this.aggregateType = value;
        }
        get AggregateType(): AggregateType {
            return this.aggregateType;
        }
        private InternalValidate(): void {
            EwsUtilities.ValidateParam(this.GroupOn, "GroupOn");
            EwsUtilities.ValidateParam(this.AggregateOn, "AggregateOn");
        }
        constructor();
        constructor(groupOn: PropertyDefinitionBase, sortDirection: SortDirection, aggregateOn: PropertyDefinitionBase, aggregateType: AggregateType);
        constructor(groupOn?: PropertyDefinitionBase, sortDirection?: SortDirection, aggregateOn?: PropertyDefinitionBase, aggregateType?: AggregateType) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(groupOn, sortDirection, aggregateOn, aggregateType);
        }
        private constructor_0(): void {
        }
        private constructor_1(groupOn: PropertyDefinitionBase, sortDirection: SortDirection, aggregateOn: PropertyDefinitionBase, aggregateType: AggregateType): void {
            this.constructor_0();
            EwsUtilities.ValidateParam(groupOn, "groupOn");
            EwsUtilities.ValidateParam(aggregateOn, "aggregateOn");
            this.groupOn = groupOn;
            this.sortDirection = sortDirection;
            this.aggregateOn = aggregateOn;
            this.aggregateType = aggregateType;
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Messages, "GroupBy");
            writer.WriteAttributeValue("Order", this.SortDirection);
            this.GroupOn.WriteToXml(writer);
            writer.WriteStartElement(XmlNamespace.Types, "AggregateOn");
            writer.WriteAttributeValue("Aggregate", this.AggregateType);
            this.AggregateOn.WriteToXml(writer);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
        ToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Order", this.SortDirection);
            throw new NotImplementedException();
        }
        Validate(): void {
            this.InternalValidate();
        }
    }
    class ItemGroup<TItem>
    {
        GroupIndex: string = null;
        Items: Collection<TItem> = null;
        constructor(groupIndex: string, items: IList<TItem>) {
            super();
            EwsUtilities.Assert(items !== null, "ItemGroup.ctor", "items is null");
            this.GroupIndex = groupIndex;
            this.Items = new Collection<TItem>(items);
        }
    }
    class ItemView extends PagedView {
        private traversal: ItemTraversal = 0;
        private orderBy: OrderByCollection = new OrderByCollection();
        set Traversal(value: ItemTraversal) {
            this.traversal = value;
        }
        get Traversal(): ItemTraversal {
            return this.traversal;
        }
        get OrderBy(): OrderByCollection {
            return this.orderBy;
        }
        GetViewXmlElementName(): string {
            return "IndexedPageItemView";
        }
        GetViewJsonTypeName(): string {
            return "IndexedPageView";
        }
        GetServiceObjectType(): ServiceObjectType {
            return ServiceObjectType.Item;
        }
        InternalValidate(request: ServiceRequestBase): void {
            super.InternalValidate(request);
            EwsUtilities.ValidateEnumVersionValue(this.traversal, request.Service.RequestedServerVersion);
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Traversal", this.Traversal);
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            super.InternalWriteSearchSettingsToXml(writer, groupBy);
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
            this.orderBy.WriteToXml(writer, "SortOrder");
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            jsonRequest.Add("Traversal", this.Traversal);
            var obj: any = (<IJsonSerializable>this.orderBy).ToJson(service);
            if (obj !== null) {
                jsonRequest.Add("SortOrder", obj);
            }
        }
        constructor(pageSize: number);
        constructor(pageSize: number, offset: number);
        constructor(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint);
        constructor(pageSize: number, offset?: number, offsetBasePoint?: OffsetBasePoint) {
            super(pageSize);
            if (arguments.length === 1 && (pageSize === null || pageSize.constructor === Number)) {
                this.constructor_0(pageSize);
                return;
            }
            if (arguments.length === 2 && (pageSize === null || pageSize.constructor === Number) && (offset === null || offset.constructor === Number)) {
                this.constructor_1(pageSize, offset);
                return;
            }
            this.constructor_2(pageSize, offset, offsetBasePoint);
        }
        private constructor_0(pageSize: number): void {
        }
        private constructor_1(pageSize: number, offset: number): void {
            this.Offset = offset;
        }
        private constructor_2(pageSize: number, offset: number, offsetBasePoint: OffsetBasePoint): void {
        }
    }
    class OrderByCollection implements IEnumerable<KeyValuePair<PropertyDefinitionBase, SortDirection>>, IJsonSerializable {
        private propDefSortOrderPairList: List<KeyValuePair<PropertyDefinitionBase, SortDirection>> = null;
        get Count(): number {
            return this.propDefSortOrderPairList.Count;
        }
        get_Item(index: number): KeyValuePair<PropertyDefinitionBase, SortDirection> {
            return this.propDefSortOrderPairList.get_Item(index);
        }
        constructor() {
            super();
            this.propDefSortOrderPairList = new List<KeyValuePair<PropertyDefinitionBase, SortDirection>>();
        }
        Add(propertyDefinition: PropertyDefinitionBase, sortDirection: SortDirection): void {
            if (this.Contains(propertyDefinition)) {
                throw new ServiceLocalException(NString.Format(Strings.PropertyAlreadyExistsInOrderByCollection, propertyDefinition.GetPrintableName()));
            }
            this.propDefSortOrderPairList.Add(new KeyValuePair<PropertyDefinitionBase, SortDirection>(propertyDefinition, sortDirection));
        }
        Clear(): void {
            this.propDefSortOrderPairList.Clear();
        }
        Contains(propertyDefinition: PropertyDefinitionBase): boolean {
            return this.propDefSortOrderPairList.Exists((pair: KeyValuePair<PropertyDefinitionBase, SortDirection>) => { return NObject.GenericEquals(pair.Key, propertyDefinition); });
        }
        Remove(propertyDefinition: PropertyDefinitionBase): boolean {
            var num: number = this.propDefSortOrderPairList.RemoveAll((pair: KeyValuePair<PropertyDefinitionBase, SortDirection>) => { return NObject.GenericEquals(pair.Key, propertyDefinition); });
            return num > 0;
        }
        RemoveAt(index: number): void {
            this.propDefSortOrderPairList.RemoveAt(index);
        }
        TryGetValue(propertyDefinition: PropertyDefinitionBase, sortDirection: SortDirection[]): boolean {
            var enumerator: List_Enumerator<KeyValuePair<PropertyDefinitionBase, SortDirection>> = this.propDefSortOrderPairList.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<PropertyDefinitionBase, SortDirection> = enumerator.Current;
                    if (NObject.GenericEquals(current.Value, propertyDefinition)) {
                        sortDirection[0] = current.Value;
                        return true;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            sortDirection[0] = SortDirection.Ascending;
            return false;
        }
        WriteToXml(writer: EwsServiceXmlWriter, xmlElementName: string): void {
            if (this.Count > 0) {
                writer.WriteStartElement(XmlNamespace.Messages, xmlElementName);
                var enumerator: IEnumerator<KeyValuePair<PropertyDefinitionBase, SortDirection>> = this.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: KeyValuePair<PropertyDefinitionBase, SortDirection> = enumerator.Current;
                        writer.WriteStartElement(XmlNamespace.Types, "FieldOrder");
                        writer.WriteAttributeValue("Order", current.Value);
                        current.Key.WriteToXml(writer);
                        writer.WriteEndElement();
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
                writer.WriteEndElement();
            }
        }
        ToJson(service: ExchangeService): any {
            if (this.Count > 0) {
                var list: List<any> = new List<any>();
                var enumerator: IEnumerator<KeyValuePair<PropertyDefinitionBase, SortDirection>> = this.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: KeyValuePair<PropertyDefinitionBase, SortDirection> = enumerator.Current;
                        var jsonObject: JsonObject = new JsonObject();
                        jsonObject.Add("Order", current.Value);
                        jsonObject.Add("Path", (<IJsonSerializable>current.Key).ToJson(service));
                        list.Add(jsonObject);
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
                return list.ToArray();
            }
            return null;
        }
        GetEnumerator(): IEnumerator<KeyValuePair<PropertyDefinitionBase, SortDirection>> {
            return this.propDefSortOrderPairList.GetEnumerator();
        }
    }
    class SeekToConditionItemView extends ViewBase {
        private pageSize: number = 0;
        private traversal: ItemTraversal = 0;
        private condition: SearchFilter = null;
        private offsetBasePoint: OffsetBasePoint = 0;
        private orderBy: OrderByCollection = new OrderByCollection();
        private serviceObjType: ServiceObjectType = 0;
        set PageSize(value: number) {
            if (value <= 0) {
                throw new ArgumentException(Strings.ValueMustBeGreaterThanZero);
            }
            this.pageSize = value;
        }
        get PageSize(): number {
            return this.pageSize;
        }
        set OffsetBasePoint(value: OffsetBasePoint) {
            this.offsetBasePoint = value;
        }
        get OffsetBasePoint(): OffsetBasePoint {
            return this.offsetBasePoint;
        }
        set Condition(value: SearchFilter) {
            if (value === null) {
                throw new ArgumentNullException("Condition");
            }
            this.condition = value;
        }
        get Condition(): SearchFilter {
            return this.condition;
        }
        set Traversal(value: ItemTraversal) {
            this.traversal = value;
        }
        get Traversal(): ItemTraversal {
            return this.traversal;
        }
        get OrderBy(): OrderByCollection {
            return this.orderBy;
        }
        GetServiceObjectType(): ServiceObjectType {
            return this.serviceObjType;
        }
        SetServiceObjectType(objType: ServiceObjectType): void {
            this.serviceObjType = objType;
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            if (this.serviceObjType === ServiceObjectType.Item) {
                writer.WriteAttributeValue("Traversal", this.Traversal);
            }
        }
        GetViewXmlElementName(): string {
            return "SeekToConditionPageItemView";
        }
        GetViewJsonTypeName(): string {
            return "SeekToConditionPageView";
        }
        InternalValidate(request: ServiceRequestBase): void {
            super.InternalValidate(request);
        }
        InternalWriteViewToXml(writer: EwsServiceXmlWriter): void {
            super.InternalWriteViewToXml(writer);
            writer.WriteAttributeValue("BasePoint", this.OffsetBasePoint);
            if (this.Condition !== null) {
                writer.WriteStartElement(XmlNamespace.Types, "Condition");
                this.Condition.WriteToXml(writer);
                writer.WriteEndElement();
            }
        }
        InternalWritePagingToJson(jsonView: JsonObject, service: ExchangeService): void {
            super.InternalWritePagingToJson(jsonView, service);
            jsonView.Add("BasePoint", this.OffsetBasePoint);
            if (this.Condition !== null) {
                var jsonObject: JsonObject = new JsonObject();
                jsonObject.Add("Item", this.Condition.InternalToJson(service));
                jsonView.Add("Condition", jsonObject);
            }
        }
        InternalWriteSearchSettingsToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            if (groupBy !== null) {
                groupBy.WriteToXml(writer);
            }
        }
        WriteGroupingToJson(service: ExchangeService, groupBy: Grouping): any {
            if (groupBy !== null) {
                return (<IJsonSerializable>groupBy).ToJson(service);
            }
            return null;
        }
        GetMaxEntriesReturned(): Nullable<number> {
            return new Nullable<number>(this.PageSize);
        }
        WriteOrderByToXml(writer: EwsServiceXmlWriter): void {
            this.orderBy.WriteToXml(writer, "SortOrder");
        }
        AddJsonProperties(jsonRequest: JsonObject, service: ExchangeService): void {
            if (this.serviceObjType === ServiceObjectType.Item) {
                jsonRequest.Add("Traversal", this.Traversal);
            }
            jsonRequest.Add("SortOrder", (<IJsonSerializable>this.orderBy).ToJson(service));
        }
        WriteToXml(writer: EwsServiceXmlWriter, groupBy: Grouping): void {
            if (this.serviceObjType === ServiceObjectType.Item) {
                super.GetPropertySetOrDefault().WriteToXml(writer, this.GetServiceObjectType());
            }
            writer.WriteStartElement(XmlNamespace.Messages, this.GetViewXmlElementName());
            this.InternalWriteViewToXml(writer);
            writer.WriteEndElement();
        }
        constructor(condition: SearchFilter, pageSize: number);
        constructor(condition: SearchFilter, pageSize: number, offsetBasePoint: OffsetBasePoint);
        constructor(condition: SearchFilter, pageSize: number, offsetBasePoint?: OffsetBasePoint) {
            super();
            if (arguments.length === 2 && (condition === null || condition instanceof SearchFilter) && (pageSize === null || pageSize.constructor === Number)) {
                this.constructor_0(condition, pageSize);
                return;
            }
            this.constructor_1(condition, pageSize, offsetBasePoint);
        }
        private constructor_0(condition: SearchFilter, pageSize: number): void {
            this.Condition = condition;
            this.PageSize = pageSize;
            this.serviceObjType = ServiceObjectType.Item;
        }
        private constructor_1(condition: SearchFilter, pageSize: number, offsetBasePoint: OffsetBasePoint): void {
            this.constructor_0(condition, pageSize);
            this.OffsetBasePoint = offsetBasePoint;
        }
    }
    class SecurityTimestamp {
        static DefaultTimestampValidityDurationString: string = "00:05:00";
        static DefaultFormat: string = "yyyy-MM-ddTHH:mm:ss.fffZ";
        static DefaultTimestampValidityDuration: TimeSpan = TimeSpan.Parse("00:05:00");
        static DefaultTimeToLive: TimeSpan = SecurityTimestamp.DefaultTimestampValidityDuration;
        private id: string = null;
        private digestAlgorithm: string = null;
        private digest: number[] = null;
        private computedCreationTimeUtc: number[] = null;
        private computedExpiryTimeUtc: number[] = null;
        private creationTimeUtc: DateTime = null;
        private expiryTimeUtc: DateTime = null;
        get CreationTimeUtc(): DateTime {
            return this.creationTimeUtc;
        }
        get ExpiryTimeUtc(): DateTime {
            return this.expiryTimeUtc;
        }
        get Id(): string {
            return this.id;
        }
        get DigestAlgorithm(): string {
            return this.digestAlgorithm;
        }
        constructor(creationTimeUtc: DateTime, expiryTimeUtc: DateTime, id: string);
        constructor(creationTimeUtc: DateTime, expiryTimeUtc: DateTime, id: string, digestAlgorithm: string, digest: number[]);
        constructor(creationTimeUtc: DateTime, expiryTimeUtc: DateTime, id: string, digestAlgorithm?: string, digest?: number[]) {
            super();
            if (arguments.length === 3 && (creationTimeUtc === null || creationTimeUtc instanceof DateTime) && (expiryTimeUtc === null || expiryTimeUtc instanceof DateTime) && (id === null || id.constructor === String)) {
                this.constructor_0(creationTimeUtc, expiryTimeUtc, id);
                return;
            }
            this.constructor_1(creationTimeUtc, expiryTimeUtc, id, digestAlgorithm, digest);
        }
        private constructor_0(creationTimeUtc: DateTime, expiryTimeUtc: DateTime, id: string): void {
            this.constructor_1(creationTimeUtc, expiryTimeUtc, id, null, null);
        }
        private constructor_1(creationTimeUtc: DateTime, expiryTimeUtc: DateTime, id: string, digestAlgorithm: string, digest: number[]): void {
            EwsUtilities.Assert(creationTimeUtc.Kind === DateTimeKind.Utc, "SecurityTimestamp.ctor", "creation time must be in UTC");
            EwsUtilities.Assert(expiryTimeUtc.Kind === DateTimeKind.Utc, "SecurityTimestamp.ctor", "expiry time must be in UTC");
            if (DateTime.op_GreaterThan(creationTimeUtc, expiryTimeUtc)) {
                throw new ArgumentOutOfRangeException("recordedExpiryTime");
            }
            this.creationTimeUtc = creationTimeUtc;
            this.expiryTimeUtc = expiryTimeUtc;
            this.id = id;
            this.digestAlgorithm = digestAlgorithm;
            this.digest = digest;
        }
        GetDigest(): number[] {
            return this.digest;
        }
        GetCreationTimeChars(): number[] {
            if (this.computedCreationTimeUtc === null) {
                this.computedCreationTimeUtc = (() => {
                    var _p0 = [
                        this.creationTimeUtc
                    ];
                    var _r = SecurityTimestamp.ToChars(_p0);
                    this.creationTimeUtc = _p0[0];
                    return _r;
                })();
            }
            return this.computedCreationTimeUtc;
        }
        GetExpiryTimeChars(): number[] {
            if (this.computedExpiryTimeUtc === null) {
                this.computedExpiryTimeUtc = (() => {
                    var _p0 = [
                        this.expiryTimeUtc
                    ];
                    var _r = SecurityTimestamp.ToChars(_p0);
                    this.expiryTimeUtc = _p0[0];
                    return _r;
                })();
            }
            return this.computedExpiryTimeUtc;
        }
        private static ToChars(utcTime: DateTime[]): number[];
        private static ToChars(n: number, buffer: number[], offset: number[], count: number): number[];
        private static ToChars(utcTimeOrN: any, buffer?: number[], offset?: number[], count?: number): number[] {
            if (arguments.length === 1 && (utcTimeOrN === null || utcTimeOrN instanceof Array)) {
                return SecurityTimestamp.ToChars_0(utcTimeOrN);
            }
            return SecurityTimestamp.ToChars_1(utcTimeOrN, buffer, offset[0], count);
        }
        private static ToChars_0(utcTime: DateTime[]): number[] {
            var array: number[] = new Array<number>("yyyy-MM-ddTHH:mm:ss.fffZ".length);
            var num: number = 0;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Year, array, _p0, 4);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 45/*'-'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Month, array, _p0, 2);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 45/*'-'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Day, array, _p0, 2);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 84/*'T'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Hour, array, _p0, 2);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 58/*':'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Minute, array, _p0, 2);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 58/*':'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Second, array, _p0, 2);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 46/*'.'*/;
            (() => {
                var _p0 = [
                    num
                ];
                var _r = SecurityTimestamp.ToChars(utcTime[0].Millisecond, array, _p0, 3);
                num = _p0[0];
                return _r;
            })();
            array[num++] = 90/*'Z'*/;
            return array;
        }
        private static ToChars_1(n: number, buffer: number[], offset: number[], count: number): void {
            for (var i: number = offset[0] + count - 1; i >= offset[0]; i = i - 1) {
                buffer[i] = <number>(48 + n % 10);
                n = n / 10;
            }
            EwsUtilities.Assert(n === 0, "SecurityTimestamp.ToChars", "Overflow in encoding timestamp field");
            offset[0] = offset[0] + count;
        }
        ToString(): string {
            return NString.Format(CultureInfo.InvariantCulture, "SecurityTimestamp: Id={0}, CreationTimeUtc={1}, ExpirationTimeUtc={2}", [
                this.Id, XmlConvert.ToString(this.CreationTimeUtc, 3), XmlConvert.ToString(this.ExpiryTimeUtc, 3)
            ]);
        }
    }
    class SafeXmlDocument extends XmlDocument {
        private settings: XmlReaderSettings = null;
        constructor();
        constructor(imp: XmlImplementation);
        constructor(nt: XmlNameTable);
        constructor(impOrNt?: any) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (impOrNt === null || impOrNt instanceof XmlImplementation)) {
                this.constructor_1(impOrNt);
                return;
            }
            this.constructor_2(impOrNt);
        }
        private constructor_0(): void {
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_XmlResolver(null);
            this.settings = xmlReaderSettings;
            super..ctor();
        }
        private constructor_1(imp: XmlImplementation): void {
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_XmlResolver(null);
            this.settings = xmlReaderSettings;
            super..ctor();
            throw new NotSupportedException("Not supported");
        }
        private constructor_2(nt: XmlNameTable): void {
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_XmlResolver(null);
            this.settings = xmlReaderSettings;
            super..ctor(nt);
        }
        Load(inStream: Stream): void;
        Load(filename: string): void;
        Load(txtReader: TextReader): void;
        Load(reader: XmlReader): void;
        Load(inStreamOrFilenameOrTxtReaderOrReader: any): void {
            if (arguments.length === 1 && (inStreamOrFilenameOrTxtReaderOrReader === null || inStreamOrFilenameOrTxtReaderOrReader instanceof Stream)) {
                this.Load_0(inStreamOrFilenameOrTxtReaderOrReader);
                return;
            }
            if (arguments.length === 1 && (inStreamOrFilenameOrTxtReaderOrReader === null || inStreamOrFilenameOrTxtReaderOrReader.constructor === String)) {
                this.Load_1(inStreamOrFilenameOrTxtReaderOrReader);
                return;
            }
            if (arguments.length === 1 && (inStreamOrFilenameOrTxtReaderOrReader === null || inStreamOrFilenameOrTxtReaderOrReader instanceof TextReader)) {
                this.Load_2(inStreamOrFilenameOrTxtReaderOrReader);
                return;
            }
            this.Load_3(inStreamOrFilenameOrTxtReaderOrReader);
        }
        private Load_0(inStream: Stream): void {
            var xmlReader: XmlReader = XmlReader.Create(inStream, this.settings);
            try {
                this.Load(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
        }
        private Load_1(filename: string): void {
            var xmlReader: XmlReader = XmlReader.Create(filename, this.settings);
            try {
                this.Load(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
        }
        private Load_2(txtReader: TextReader): void {
            var xmlReader: XmlReader = XmlReader.Create(txtReader, this.settings);
            try {
                this.Load(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
        }
        private Load_3(reader: XmlReader): void {
            if (reader.get_Settings() !== null && !reader.get_Settings().get_ProhibitDtd()) {
                throw new XmlDtdException();
            }
            try {
                super.Load(reader);
            }
            catch (ex) {
                if (ex instanceof XmlException) {
                    if (NString.StartsWith(ex.Message, "For security reasons DTD is prohibited in this XML document.", StringComparison.OrdinalIgnoreCase)) {
                        throw new XmlDtdException();
                    }
                }
                else
                    throw ex;
            }
        }
        LoadXml(xml: string): void {
            var xmlReader: XmlReader = XmlReader.Create(new StringReader(xml), this.settings);
            try {
                super.Load(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
        }
    }
    class SafeXmlFactory {
        private static defaultSettings: XmlReaderSettings = null;
        static CreateSafeXmlTextReader(stream: Stream): XmlTextReader;
        static CreateSafeXmlTextReader(url: string): XmlTextReader;
        static CreateSafeXmlTextReader(input: TextReader): XmlTextReader;
        static CreateSafeXmlTextReader(input: Stream, nt: XmlNameTable): XmlTextReader;
        static CreateSafeXmlTextReader(url: string, input: Stream): XmlTextReader;
        static CreateSafeXmlTextReader(url: string, input: TextReader): XmlTextReader;
        static CreateSafeXmlTextReader(url: string, nt: XmlNameTable): XmlTextReader;
        static CreateSafeXmlTextReader(input: TextReader, nt: XmlNameTable): XmlTextReader;
        static CreateSafeXmlTextReader(xmlFragment: Stream, fragType: XmlNodeType, context: XmlParserContext): XmlTextReader;
        static CreateSafeXmlTextReader(url: string, input: Stream, nt: XmlNameTable): XmlTextReader;
        static CreateSafeXmlTextReader(url: string, input: TextReader, nt: XmlNameTable): XmlTextReader;
        static CreateSafeXmlTextReader(xmlFragment: string, fragType: XmlNodeType, context: XmlParserContext): XmlTextReader;
        static CreateSafeXmlTextReader(streamOrUrlOrInputOrXmlFragment: any, ntOrInputOrFragType?: any, contextOrNt?: any): XmlTextReader {
            if (arguments.length === 1 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment instanceof Stream)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_0(streamOrUrlOrInputOrXmlFragment);
            }
            if (arguments.length === 1 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_1(streamOrUrlOrInputOrXmlFragment);
            }
            if (arguments.length === 1 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment instanceof TextReader)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_2(streamOrUrlOrInputOrXmlFragment);
            }
            if (arguments.length === 2 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment instanceof Stream) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof XmlNameTable)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_3(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType);
            }
            if (arguments.length === 2 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof Stream)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_4(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType);
            }
            if (arguments.length === 2 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof TextReader)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_5(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType);
            }
            if (arguments.length === 2 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof XmlNameTable)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_6(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType);
            }
            if (arguments.length === 2 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment instanceof TextReader) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof XmlNameTable)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_7(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType);
            }
            if (arguments.length === 3 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment instanceof Stream) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof XmlNodeType) && (contextOrNt === null || contextOrNt instanceof XmlParserContext)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_8(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType, contextOrNt);
            }
            if (arguments.length === 3 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof Stream) && (contextOrNt === null || contextOrNt instanceof XmlNameTable)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_9(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType, contextOrNt);
            }
            if (arguments.length === 3 && (streamOrUrlOrInputOrXmlFragment === null || streamOrUrlOrInputOrXmlFragment.constructor === String) && (ntOrInputOrFragType === null || ntOrInputOrFragType instanceof TextReader) && (contextOrNt === null || contextOrNt instanceof XmlNameTable)) {
                return SafeXmlFactory.CreateSafeXmlTextReader_10(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType, contextOrNt);
            }
            return SafeXmlFactory.CreateSafeXmlTextReader_11(streamOrUrlOrInputOrXmlFragment, ntOrInputOrFragType, contextOrNt);
        }
        private static CreateSafeXmlTextReader_0(stream: Stream): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(stream);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_1(url: string): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_2(input: TextReader): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(input);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_3(input: Stream, nt: XmlNameTable): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(input, nt);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_4(url: string, input: Stream): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url, input);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_5(url: string, input: TextReader): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url, input);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_6(url: string, nt: XmlNameTable): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url, nt);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_7(input: TextReader, nt: XmlNameTable): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(input, nt);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_8(xmlFragment: Stream, fragType: XmlNodeType, context: XmlParserContext): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(xmlFragment, fragType, context);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_9(url: string, input: Stream, nt: XmlNameTable): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url, input, nt);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_10(url: string, input: TextReader, nt: XmlNameTable): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(url, input, nt);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        private static CreateSafeXmlTextReader_11(xmlFragment: string, fragType: XmlNodeType, context: XmlParserContext): XmlTextReader {
            var xmlTextReader: XmlTextReader = new XmlTextReader(xmlFragment, fragType, context);
            xmlTextReader.set_ProhibitDtd(true);
            xmlTextReader.set_XmlResolver(null);
            return xmlTextReader;
        }
        static CreateXPathDocument(stream: Stream): XPathDocument;
        static CreateXPathDocument(uri: string): XPathDocument;
        static CreateXPathDocument(textReader: TextReader): XPathDocument;
        static CreateXPathDocument(reader: XmlReader): XPathDocument;
        static CreateXPathDocument(uri: string, space: XmlSpace): XPathDocument;
        static CreateXPathDocument(reader: XmlReader, space: XmlSpace): XPathDocument;
        static CreateXPathDocument(streamOrUriOrTextReaderOrReader: any, space?: XmlSpace): XPathDocument {
            if (arguments.length === 1 && (streamOrUriOrTextReaderOrReader === null || streamOrUriOrTextReaderOrReader instanceof Stream)) {
                return SafeXmlFactory.CreateXPathDocument_0(streamOrUriOrTextReaderOrReader);
            }
            if (arguments.length === 1 && (streamOrUriOrTextReaderOrReader === null || streamOrUriOrTextReaderOrReader.constructor === String)) {
                return SafeXmlFactory.CreateXPathDocument_1(streamOrUriOrTextReaderOrReader);
            }
            if (arguments.length === 1 && (streamOrUriOrTextReaderOrReader === null || streamOrUriOrTextReaderOrReader instanceof TextReader)) {
                return SafeXmlFactory.CreateXPathDocument_2(streamOrUriOrTextReaderOrReader);
            }
            if (arguments.length === 1 && (streamOrUriOrTextReaderOrReader === null || streamOrUriOrTextReaderOrReader instanceof XmlReader)) {
                return SafeXmlFactory.CreateXPathDocument_3(streamOrUriOrTextReaderOrReader);
            }
            if (arguments.length === 2 && (streamOrUriOrTextReaderOrReader === null || streamOrUriOrTextReaderOrReader.constructor === String) && (space === null || space instanceof XmlSpace)) {
                return SafeXmlFactory.CreateXPathDocument_4(streamOrUriOrTextReaderOrReader, space);
            }
            return SafeXmlFactory.CreateXPathDocument_5(streamOrUriOrTextReaderOrReader, space);
        }
        private static CreateXPathDocument_0(stream: Stream): XPathDocument {
            var xmlReader: XmlReader = XmlReader.Create(stream, SafeXmlFactory.defaultSettings);
            var result: XPathDocument;
            try {
                result = SafeXmlFactory.CreateXPathDocument(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static CreateXPathDocument_1(uri: string): XPathDocument {
            var xmlReader: XmlReader = XmlReader.Create(uri, SafeXmlFactory.defaultSettings);
            var result: XPathDocument;
            try {
                result = SafeXmlFactory.CreateXPathDocument(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static CreateXPathDocument_2(textReader: TextReader): XPathDocument {
            var xmlReader: XmlReader = XmlReader.Create(textReader, SafeXmlFactory.defaultSettings);
            var result: XPathDocument;
            try {
                result = SafeXmlFactory.CreateXPathDocument(xmlReader);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static CreateXPathDocument_3(reader: XmlReader): XPathDocument {
            if (reader.get_Settings() !== null && !reader.get_Settings().get_ProhibitDtd()) {
                throw new XmlDtdException();
            }
            return new XPathDocument(reader);
        }
        private static CreateXPathDocument_4(uri: string, space: XmlSpace): XPathDocument {
            var xmlReader: XmlReader = XmlReader.Create(uri, SafeXmlFactory.defaultSettings);
            var result: XPathDocument;
            try {
                result = SafeXmlFactory.CreateXPathDocument(xmlReader, space);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static CreateXPathDocument_5(reader: XmlReader, space: XmlSpace): XPathDocument {
            if (reader.get_Settings() !== null && !reader.get_Settings().get_ProhibitDtd()) {
                throw new XmlDtdException();
            }
            return new XPathDocument(reader, space);
        }
        static SafeXmlFactory_cctor(): void {
            // Note: this type is marked as 'beforefieldinit'.
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_XmlResolver(null);
            SafeXmlFactory.defaultSettings = xmlReaderSettings;
        }
    }
    class SafeXmlSchema extends XmlSchema {
        private static defaultSettings: XmlReaderSettings = null;
        static Read(stream: Stream, validationEventHandler: ValidationEventHandler): XmlSchema;
        static Read(reader: TextReader, validationEventHandler: ValidationEventHandler): XmlSchema;
        static Read(reader: XmlReader, validationEventHandler: ValidationEventHandler): XmlSchema;
        static Read(streamOrReader: any, validationEventHandler: ValidationEventHandler): XmlSchema {
            if (arguments.length === 2 && (streamOrReader === null || streamOrReader instanceof Stream) && (validationEventHandler === null || validationEventHandler instanceof ValidationEventHandler)) {
                return SafeXmlSchema.Read_0(streamOrReader, validationEventHandler);
            }
            if (arguments.length === 2 && (streamOrReader === null || streamOrReader instanceof TextReader) && (validationEventHandler === null || validationEventHandler instanceof ValidationEventHandler)) {
                return SafeXmlSchema.Read_1(streamOrReader, validationEventHandler);
            }
            return SafeXmlSchema.Read_2(streamOrReader, validationEventHandler);
        }
        private static Read_0(stream: Stream, validationEventHandler: ValidationEventHandler): XmlSchema {
            var xmlReader: XmlReader = XmlReader.Create(stream, SafeXmlSchema.defaultSettings);
            var result: XmlSchema;
            try {
                result = XmlSchema.Read(xmlReader, validationEventHandler);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static Read_1(reader: TextReader, validationEventHandler: ValidationEventHandler): XmlSchema {
            var xmlReader: XmlReader = XmlReader.Create(reader, SafeXmlSchema.defaultSettings);
            var result: XmlSchema;
            try {
                result = XmlSchema.Read(xmlReader, validationEventHandler);
            }
            finally {
                if (xmlReader !== null) {
                    xmlReader.Dispose();
                }
            }
            return result;
        }
        private static Read_2(reader: XmlReader, validationEventHandler: ValidationEventHandler): XmlSchema {
            if (reader.get_Settings() !== null && !reader.get_Settings().get_ProhibitDtd()) {
                throw new XmlDtdException();
            }
            return XmlSchema.Read(reader, validationEventHandler);
        }
        static SafeXmlSchema_cctor(): void {
            // Note: this type is marked as 'beforefieldinit'.
            var xmlReaderSettings: XmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.set_ProhibitDtd(true);
            xmlReaderSettings.set_XmlResolver(null);
            SafeXmlSchema.defaultSettings = xmlReaderSettings;
        }
    }
    class XmlDtdException extends XmlException {
        get Message(): string {
            return "For security reasons DTD is prohibited in this XML document.";
        }
        constructor() {
            super();
        }
    }
    class Change {
        private changeType: ChangeType = 0;
        private serviceObject: ServiceObject = null;
        private id: ServiceId = null;
        set ChangeType(value: ChangeType) {
            this.changeType = value;
        }
        get ChangeType(): ChangeType {
            return this.changeType;
        }
        set ServiceObject(value: ServiceObject) {
            this.serviceObject = value;
        }
        get ServiceObject(): ServiceObject {
            return this.serviceObject;
        }
        set Id(value: ServiceId) {
            this.id = value;
        }
        get Id(): ServiceId {
            if (this.ServiceObject === null) {
                return this.id;
            }
            return this.ServiceObject.GetId();
        }
        constructor() {
            super();
        }
        CreateId(): ServiceId {
            throw new NotSupportedException();
        }
    }
    class ChangeCollection<TChange> implements IEnumerable<TChange>
    {
        private changes: List<TChange> = new List<TChange>();
        private syncState: string = null;
        private moreChangesAvailable: boolean = false;
        get Count(): number {
            return this.changes.Count;
        }
        get_Item(index: number): TChange {
            if (index < 0 || index >= this.Count) {
                throw new ArgumentOutOfRangeException("index", Strings.IndexIsOutOfRange);
            }
            return this.changes.get_Item(index);
        }
        set SyncState(value: string) {
            this.syncState = value;
        }
        get SyncState(): string {
            return this.syncState;
        }
        set MoreChangesAvailable(value: boolean) {
            this.moreChangesAvailable = value;
        }
        get MoreChangesAvailable(): boolean {
            return this.moreChangesAvailable;
        }
        constructor() {
            super();
        }
        Add(change: TChange): void {
            EwsUtilities.Assert(change !== null, "ChangeList.Add", "change is null");
            this.changes.Add(change);
        }
        GetEnumerator(): IEnumerator<TChange> {
            return this.changes.GetEnumerator();
        }
    }
    class FolderChange extends Change {
        get Folder(): Folder {
            return <Folder>this.ServiceObject;
        }
        get FolderId(): FolderId {
            return <FolderId>this.Id;
        }
        constructor() {
            super();
        }
        CreateId(): ServiceId {
            return new FolderId();
        }
    }
    class ItemChange extends Change {
        private isRead: boolean = false;
        get Item(): Item {
            return <Item>this.ServiceObject;
        }
        set IsRead(value: boolean) {
            this.isRead = value;
        }
        get IsRead(): boolean {
            return this.isRead;
        }
        get ItemId(): ItemId {
            return <ItemId>this.Id;
        }
        constructor() {
            super();
        }
        CreateId(): ServiceId {
            return new ItemId();
        }
    }
    class PhoneCall extends ComplexProperty {
        private static SuccessfulResponseText: string = "OK";
        private static SuccessfulResponseCode: number = 200;
        private service: ExchangeService = null;
        private state: PhoneCallState = 0;
        private connectionFailureCause: ConnectionFailureCause = 0;
        private sipResponseText: string = null;
        private sipResponseCode: number = 0;
        private id: PhoneCallId = null;
        get State(): PhoneCallState {
            return this.state;
        }
        get ConnectionFailureCause(): ConnectionFailureCause {
            return this.connectionFailureCause;
        }
        get SIPResponseText(): string {
            return this.sipResponseText;
        }
        get SIPResponseCode(): number {
            return this.sipResponseCode;
        }
        constructor(service: ExchangeService);
        constructor(service: ExchangeService, id: PhoneCallId);
        constructor(service: ExchangeService, id?: PhoneCallId) {
            super();
            if (arguments.length === 1 && (service === null || service instanceof ExchangeService)) {
                this.constructor_0(service);
                return;
            }
            this.constructor_1(service, id);
        }
        private constructor_0(service: ExchangeService): void {
            EwsUtilities.Assert(service !== null, "PhoneCall.ctor", "service is null");
            this.service = service;
            this.state = PhoneCallState.Connecting;
            this.connectionFailureCause = ConnectionFailureCause.None;
            this.sipResponseText = "OK";
            this.sipResponseCode = 200;
        }
        private constructor_1(service: ExchangeService, id: PhoneCallId): void {
            this.constructor_0(service);
            this.id = id;
        }
        Refresh(): void {
            var phoneCallInformation: PhoneCall = this.service.UnifiedMessaging.GetPhoneCallInformation(this.id);
            this.state = phoneCallInformation.State;
            this.connectionFailureCause = phoneCallInformation.ConnectionFailureCause;
            this.sipResponseText = phoneCallInformation.SIPResponseText;
            this.sipResponseCode = phoneCallInformation.SIPResponseCode;
        }
        Disconnect(): void {
            if (this.state === PhoneCallState.Disconnected) {
                throw new ServiceLocalException(Strings.PhoneCallAlreadyDisconnected);
            }
            this.service.UnifiedMessaging.DisconnectPhoneCall(this.id);
            this.state = PhoneCallState.Disconnected;
        }
        TryReadElementFromXml(reader: EwsServiceXmlReader): boolean {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "PhoneCallState") {
                    this.state = reader.ReadElementValue<PhoneCallState>();
                    return true;
                }
                if (localName === "ConnectionFailureCause") {
                    this.connectionFailureCause = reader.ReadElementValue<ConnectionFailureCause>();
                    return true;
                }
                if (localName === "SIPResponseText") {
                    this.sipResponseText = reader.ReadElementValue();
                    return true;
                }
                if (localName === "SIPResponseCode") {
                    this.sipResponseCode = reader.ReadElementValue<number>();
                    return true;
                }
            }
            return false;
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            var enumerator: Dictionary_KeyCollection_Enumerator<string, any> = jsonProperty.Keys.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    var a: string;
                    if ((a = current) !== null) {
                        if (!(a === "PhoneCallState")) {
                            if (!(a === "ConnectionFailureCause")) {
                                if (!(a === "SIPResponseText")) {
                                    if (a === "SIPResponseCode") {
                                        this.sipResponseCode = jsonProperty.ReadAsInt(current);
                                    }
                                }
                                else {
                                    this.sipResponseText = jsonProperty.ReadAsString(current);
                                }
                            }
                            else {
                                this.connectionFailureCause = jsonProperty.ReadEnumValue<ConnectionFailureCause>(current);
                            }
                        }
                        else {
                            this.state = jsonProperty.ReadEnumValue<PhoneCallState>(current);
                        }
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
    }
    class PhoneCallId extends ComplexProperty {
        private id: string = null;
        set Id(value: string) {
            this.id = value;
        }
        get Id(): string {
            return this.id;
        }
        constructor();
        constructor(id: string);
        constructor(id?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(id);
        }
        private constructor_0(): void {
        }
        private constructor_1(id: string): void {
            this.id = id;
        }
        ReadAttributesFromXml(reader: EwsServiceXmlReader): void {
            this.id = reader.ReadAttributeValue("Id");
        }
        LoadFromJson(jsonProperty: JsonObject, service: ExchangeService): void {
            this.id = jsonProperty.ReadAsString("Id");
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("Id", this.id);
        }
        WriteToXml(writer: EwsServiceXmlWriter): void {
            this.WriteToXml(writer, "PhoneCallId");
        }
        InternalToJson(service: ExchangeService): any {
            var jsonObject: JsonObject = new JsonObject();
            jsonObject.Add("Id", this.id);
            return jsonObject;
        }
    }
    class UnifiedMessaging {
        private service: ExchangeService = null;
        constructor(service: ExchangeService) {
            super();
            this.service = service;
        }
        PlayOnPhone(itemId: ItemId, dialString: string): PhoneCall {
            EwsUtilities.ValidateParam(itemId, "itemId");
            EwsUtilities.ValidateParam(dialString, "dialString");
            var playOnPhoneRequest: PlayOnPhoneRequest = new PlayOnPhoneRequest(this.service);
            playOnPhoneRequest.DialString = dialString;
            playOnPhoneRequest.ItemId = itemId;
            var playOnPhoneResponse: PlayOnPhoneResponse = playOnPhoneRequest.Execute();
            return new PhoneCall(this.service, playOnPhoneResponse.PhoneCallId);
        }
        GetPhoneCallInformation(id: PhoneCallId): PhoneCall {
            var getPhoneCallRequest: GetPhoneCallRequest = new GetPhoneCallRequest(this.service);
            getPhoneCallRequest.Id = id;
            var getPhoneCallResponse: GetPhoneCallResponse = getPhoneCallRequest.Execute();
            return getPhoneCallResponse.PhoneCall;
        }
        DisconnectPhoneCall(id: PhoneCallId): void {
            var disconnectPhoneCallRequest: DisconnectPhoneCallRequest = new DisconnectPhoneCallRequest(this.service);
            disconnectPhoneCallRequest.Id = id;
            disconnectPhoneCallRequest.Execute();
        }
    }
    class AlternateMailbox {
        private type: string = null;
        private displayName: string = null;
        private legacyDN: string = null;
        private server: string = null;
        private smtpAddress: string = null;
        private ownerSmtpAddress: string = null;
        set Type(value: string) {
            this.type = value;
        }
        get Type(): string {
            return this.type;
        }
        set DisplayName(value: string) {
            this.displayName = value;
        }
        get DisplayName(): string {
            return this.displayName;
        }
        set LegacyDN(value: string) {
            this.legacyDN = value;
        }
        get LegacyDN(): string {
            return this.legacyDN;
        }
        set Server(value: string) {
            this.server = value;
        }
        get Server(): string {
            return this.server;
        }
        set SmtpAddress(value: string) {
            this.smtpAddress = value;
        }
        get SmtpAddress(): string {
            return this.smtpAddress;
        }
        set OwnerSmtpAddress(value: string) {
            this.ownerSmtpAddress = value;
        }
        get OwnerSmtpAddress(): string {
            return this.ownerSmtpAddress;
        }
        constructor() {
            super();
        }
        static LoadFromXml(reader: EwsXmlReader): AlternateMailbox {
            var alternateMailbox: AlternateMailbox = new AlternateMailbox();
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (_PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x600000c - 1 === null)
                    {
                        var expr_34: Dictionary<string, number> = new Dictionary<string, number>(6);
                        expr_34.Add("Type", 0);
                        expr_34.Add("DisplayName", 1);
                        expr_34.Add("LegacyDN", 2);
                        expr_34.Add("Server", 3);
                        expr_34.Add("SmtpAddress", 4);
                        expr_34.Add("OwnerSmtpAddress", 5);
                        _PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x600000c - 1 = expr_34;
                    }
                    var num: number;
                    if ((() => {
                        var _p0 = [
                            num
                        ];
                        var _r = _PrivateImplementationDetails_{70549B87-FCC0 - 4468 - A58C - F62EC848C70D}.$$method0x600000c-1.TryGetValue(localName, _p0);
                        num = _p0[0];
                        return _r;
                    })()) {
                        switch (num) {
                            case 0:
                                alternateMailbox.Type = reader.ReadElementValue<string>();
                                break;
                            case 1:
                                alternateMailbox.DisplayName = reader.ReadElementValue<string>();
                                break;
                            case 2:
                                alternateMailbox.LegacyDN = reader.ReadElementValue<string>();
                                break;
                            case 3:
                                alternateMailbox.Server = reader.ReadElementValue<string>();
                                break;
                            case 4:
                                alternateMailbox.SmtpAddress = reader.ReadElementValue<string>();
                                break;
                            case 5:
                                alternateMailbox.OwnerSmtpAddress = reader.ReadElementValue<string>();
                                break;
                        }
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "AlternateMailbox"));
            return alternateMailbox;
        }
    }
    class AlternateMailboxCollection {
        Entries: List<AlternateMailbox> = null;
        constructor() {
            super();
            this.Entries = new List<AlternateMailbox>();
        }
        static LoadFromXml(reader: EwsXmlReader): AlternateMailboxCollection {
            var alternateMailboxCollection: AlternateMailboxCollection = new AlternateMailboxCollection();
            do {
                reader.Read();
                if (reader.NodeType === 1 && reader.LocalName === "AlternateMailbox") {
                    alternateMailboxCollection.Entries.Add(AlternateMailbox.LoadFromXml(reader));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "AlternateMailboxes"));
            return alternateMailboxCollection;
        }
    }
    class AutodiscoverDnsClient {
        private static AutoDiscoverSrvPrefix: string = "_autodiscover._tcp.";
        private static SslPort: number = 443;
        private static randomTieBreakerSelector: Random = new Random();
        private service: AutodiscoverService = null;
        constructor(service: AutodiscoverService) {
            super();
            this.service = service;
        }
        FindAutodiscoverHostFromSrv(domain: string): string {
            var domain2: string = "_autodiscover._tcp." + domain;
            var dnsSrvRecord: DnsSrvRecord = this.FindBestMatchingSrvRecord(domain2);
            if (dnsSrvRecord === null || NString.IsNullOrEmpty(dnsSrvRecord.NameTarget)) {
                this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, "No appropriate SRV record was found.");
                return null;
            }
            this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("DNS query for SRV record for domain {0} found {1}", domain, dnsSrvRecord.NameTarget));
            return dnsSrvRecord.NameTarget;
        }
        private FindBestMatchingSrvRecord(domain: string): DnsSrvRecord {
            var list: List<DnsSrvRecord>;
            try {
                list = DnsClient.DnsQuery<DnsSrvRecord>(domain, this.service.DnsServerAddress);
            }
            catch (ex) {
                if (ex instanceof DnsException) {
                    var logEntry: string = NString.Format("DnsQuery returned error error '{0}' error code 0x{1:X8}.", ex.Message, ex.NativeErrorCode);
                    this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, logEntry);
                    var result: DnsSrvRecord = null;
                    return result;
                }
                else
                    if (ex instanceof SecurityException) {
                        this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("DnsQuery cannot be called. Security error: {0}.", ex2.Message));
                        var result: DnsSrvRecord = null;
                        return result;
                    }
                    else
                        throw ex;
            }
            this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} SRV records were returned.", list.Count));
            var priority: number = -2147483648;
            var weight: number = -2147483648;
            var flag: boolean = false;
            var enumerator: List_Enumerator<DnsSrvRecord> = list.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: DnsSrvRecord = enumerator.Current;
                    if (current.Port === 443) {
                        priority = current.Priority;
                        weight = current.Weight;
                        flag = true;
                        break;
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (!flag) {
                this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, "No appropriate SRV records were found.");
                return null;
            }
            var list2: List<DnsSrvRecord> = list.FindAll((record: DnsSrvRecord) => { return record.Port === 443 && record.Priority === priority && record.Weight === weight; });
            EwsUtilities.Assert(list.Count > 0, "AutodiscoverDnsClient.FindBestMatchingSrvRecord", "At least one DNS SRV record must match the criteria.");
            var num: number = (list2.Count > 1) ? AutodiscoverDnsClient.randomTieBreakerSelector.Next(list2.Count) : 0;
            var dnsSrvRecord: DnsSrvRecord = list2.get_Item(num);
            var logEntry2: string = NString.Format("Returning SRV record {0} of {1} records. Target: {2}, Priority: {3}, Weight: {4}", [
                num, list.Count, dnsSrvRecord.NameTarget, dnsSrvRecord.Priority, dnsSrvRecord.Weight
            ]);
            this.service.TraceMessage(TraceFlags.AutodiscoverConfiguration, logEntry2);
            return dnsSrvRecord;
        }
    }
    class AutodiscoverError {
        private time: string = null;
        private id: string = null;
        private errorCode: number = 0;
        private message: string = null;
        private debugData: string = null;
        get Time(): string {
            return this.time;
        }
        get Id(): string {
            return this.id;
        }
        get ErrorCode(): number {
            return this.errorCode;
        }
        get Message(): string {
            return this.message;
        }
        get DebugData(): string {
            return this.debugData;
        }
        constructor() {
            super();
        }
        static Parse(reader: EwsXmlReader): AutodiscoverError {
            var autodiscoverError: AutodiscoverError = new AutodiscoverError();
            autodiscoverError.time = reader.ReadAttributeValue("Time");
            autodiscoverError.id = reader.ReadAttributeValue("Id");
            do {
                var IL_9A: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                if ((localName = reader.LocalName) !== null) {
                                    if (localName === "ErrorCode") {
                                        autodiscoverError.errorCode = reader.ReadElementValue<number>();
                                        _goto = IL_9A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "Message") {
                                        autodiscoverError.message = reader.ReadElementValue();
                                        _goto = IL_9A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "DebugData") {
                                        autodiscoverError.debugData = reader.ReadElementValue();
                                        _goto = IL_9A;
                                        continue _GOTO_LOOP;
                                    }
                                }
                                reader.SkipCurrentElement();
                            }
                            _goto = IL_9A;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, "Error"));
            return autodiscoverError;
        }
    }
    class AutodiscoverResponse {
        private errorCode: AutodiscoverErrorCode = 0;
        private errorMessage: string = null;
        private redirectionUrl: Uri = null;
        set ErrorCode(value: AutodiscoverErrorCode) {
            this.errorCode = value;
        }
        get ErrorCode(): AutodiscoverErrorCode {
            return this.errorCode;
        }
        set ErrorMessage(value: string) {
            this.errorMessage = value;
        }
        get ErrorMessage(): string {
            return this.errorMessage;
        }
        set RedirectionUrl(value: Uri) {
            this.redirectionUrl = value;
        }
        get RedirectionUrl(): Uri {
            return this.redirectionUrl;
        }
        constructor() {
            super();
            this.errorCode = AutodiscoverErrorCode.NoError;
            this.errorMessage = Strings.NoError;
        }
        LoadFromXml(reader: EwsXmlReader, endElementName: string): void {
            var localName: string;
            if ((localName = reader.LocalName) !== null) {
                if (localName === "ErrorCode") {
                    this.ErrorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
                    return;
                }
                if (!(localName === "ErrorMessage")) {
                    return;
                }
                this.ErrorMessage = reader.ReadElementValue();
            }
        }
    }
    class AutodiscoverResponseCollection<TResponse> extends AutodiscoverResponse implements IEnumerable<TResponse>
    {
        private responses: List<TResponse> = null;
        get Count(): number {
            return this.responses.Count;
        }
        get_Item(index: number): TResponse {
            return this.responses.get_Item(index);
        }
        get Responses(): List<TResponse> {
            return this.responses;
        }
        constructor() {
            super();
            this.responses = new List<TResponse>();
        }
        LoadFromXml(reader: EwsXmlReader, endElementName: string): void {
            do {
                reader.Read();
                if (reader.NodeType === 1) {
                    if (reader.LocalName === this.GetResponseCollectionXmlElementName()) {
                        this.LoadResponseCollectionFromXml(reader);
                    }
                    else {
                        super.LoadFromXml(reader, endElementName);
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, endElementName));
        }
        private LoadResponseCollectionFromXml(reader: EwsXmlReader): void {
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === this.GetResponseInstanceXmlElementName()) {
                        var item: TResponse = this.CreateResponseInstance();
                        item.LoadFromXml(reader, this.GetResponseInstanceXmlElementName());
                        this.Responses.Add(item);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Autodiscover, this.GetResponseCollectionXmlElementName()));
            }
        }
        GetResponseCollectionXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetResponseInstanceXmlElementName(): string {
            throw new NotSupportedException();
        }
        CreateResponseInstance(): TResponse {
            throw new NotSupportedException();
        }
        GetEnumerator(): IEnumerator<TResponse> {
            return this.responses.GetEnumerator();
        }
    }
    class ComparisonHelpers {
        static CaseInsensitiveContains(collection: ICollection, match: string): boolean {
            var enumerator: IEnumerator = collection.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: any = enumerator.Current;
                    var text: string = ((current instanceof string) ? <string>current : null);
                    if (text !== null && NString.Compare(text, match, StringComparison.OrdinalIgnoreCase) === 0) {
                        return true;
                    }
                }
            }
            finally {
                var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                if (disposable !== null) {
                    disposable.Dispose();
                }
            }
            return false;
        }
        constructor() {
            super();
        }
    }
    class AutodiscoverService extends ExchangeServiceBase {
        private static AutodiscoverLegacyPath: string = "/autodiscover/autodiscover.xml";
        private static AutodiscoverLegacyUrl: string = "{0}://{1}/autodiscover/autodiscover.xml";
        private static AutodiscoverLegacyHttpsUrl: string = "https://{0}/autodiscover/autodiscover.xml";
        private static AutodiscoverLegacyHttpUrl: string = "http://{0}/autodiscover/autodiscover.xml";
        private static AutodiscoverSoapHttpsUrl: string = "https://{0}/autodiscover/autodiscover.svc";
        private static AutodiscoverSoapWsSecurityHttpsUrl: string = "https://{0}/autodiscover/autodiscover.svc/wssecurity";
        private static AutodiscoverSoapWsSecuritySymmetricKeyHttpsUrl: string = "https://{0}/autodiscover/autodiscover.svc/wssecurity/symmetrickey";
        private static AutodiscoverSoapWsSecurityX509CertHttpsUrl: string = "https://{0}/autodiscover/autodiscover.svc/wssecurity/x509cert";
        private static AutodiscoverRequestNamespace: string = "http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006";
        static AutodiscoverMaxRedirections: number = 10;
        private static AutodiscoverSoapEnabledHeaderName: string = "X-SOAP-Enabled";
        private static AutodiscoverWsSecurityEnabledHeaderName: string = "X-WSSecurity-Enabled";
        private static AutodiscoverWsSecuritySymmetricKeyEnabledHeaderName: string = "X-WSSecurity-SymmetricKey-Enabled";
        private static AutodiscoverWsSecurityX509CertEnabledHeaderName: string = "X-WSSecurity-X509Cert-Enabled";
        private static AutodiscoverOAuthEnabledHeaderName: string = "X-OAuth-Enabled";
        private static MinimumRequestVersionForAutoDiscoverSoapService: ExchangeVersion = ExchangeVersion.Exchange2010;
        private static LegacyPathRegex: Regex = new Regex("/autodiscover/([^/]+/)*autodiscover.xml", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        private domain: string = null;
        private isExternal: Nullable<boolean> = null;
        private url: Uri = null;
        private redirectionUrlValidationCallback: (redirectionUrl: string) => boolean = null;
        private dnsClient: AutodiscoverDnsClient = null;
        private dnsServerAddress: IPAddress = null;
        private enableScpLookup: boolean = false;
        set Domain(value: string) {
            EwsUtilities.ValidateDomainNameAllowNull(value, "Domain");
            if (value !== null) {
                this.url = null;
            }
            this.domain = value;
        }
        get Domain(): string {
            return this.domain;
        }
        set Url(value: Uri) {
            if (Uri.op_Inequality(value, null)) {
                this.domain = value.Host;
            }
            this.url = value;
        }
        get Url(): Uri {
            return this.url;
        }
        set IsExternal(value: Nullable<boolean>) {
            this.isExternal = value;
        }
        get IsExternal(): Nullable<boolean> {
            return this.isExternal;
        }
        set RedirectionUrlValidationCallback(value: (redirectionUrl: string) => boolean) {
            this.redirectionUrlValidationCallback = value;
        }
        get RedirectionUrlValidationCallback(): (redirectionUrl: string) => boolean {
            return this.redirectionUrlValidationCallback;
        }
        set DnsServerAddress(value: IPAddress) {
            this.dnsServerAddress = value;
        }
        get DnsServerAddress(): IPAddress {
            return this.dnsServerAddress;
        }
        set EnableScpLookup(value: boolean) {
            this.enableScpLookup = value;
        }
        get EnableScpLookup(): boolean {
            return this.enableScpLookup;
        }
        GetScpUrlsForDomainCallback: (arg: string) => ICollection<string> = null;
        private DefaultAutodiscoverRedirectionUrlValidationCallback(redirectionUrl: string): boolean {
            throw new AutodiscoverLocalException(NString.Format(Strings.AutodiscoverRedirectBlocked, redirectionUrl));
        }
        private GetLegacyUserSettingsAtUrl<TSettings>(emailAddress: string, url: Uri): TSettings {
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Trying to call Autodiscover for {0} on {1}.", emailAddress, url));
            var tSettings: TSettings = Activator.CreateInstance<TSettings>();
            var ewsHttpWebRequest: IEwsHttpWebRequest = this.PrepareHttpWebRequestForUrl(url);
            super.TraceHttpRequestHeaders(TraceFlags.AutodiscoverRequestHttpHeaders, ewsHttpWebRequest);
            var requestStream: Stream = ewsHttpWebRequest.GetRequestStream();
            try {
                if (super.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest)) {
                    var memoryStream: MemoryStream = new MemoryStream();
                    try {
                        var streamWriter: StreamWriter = new StreamWriter(memoryStream);
                        try {
                            this.WriteLegacyAutodiscoverRequest(emailAddress, tSettings, streamWriter);
                            streamWriter.Flush();
                            super.TraceXml(TraceFlags.AutodiscoverRequest, memoryStream);
                            EwsUtilities.CopyStream(memoryStream, requestStream);
                        }
                        finally {
                            if (streamWriter !== null) {
                                (<IDisposable>streamWriter).Dispose();
                            }
                        }
                        goto IL_B4;
                    }
                    finally {
                        if (memoryStream !== null) {
                            (<IDisposable>memoryStream).Dispose();
                        }
                    }
                }
                var streamWriter2: StreamWriter = new StreamWriter(requestStream);
                try {
                    this.WriteLegacyAutodiscoverRequest(emailAddress, tSettings, streamWriter2);
                }
                finally {
                    if (streamWriter2 !== null) {
                        (<IDisposable>streamWriter2).Dispose();
                    }
                }
                IL_B4: ;
            }
            finally {
                if (requestStream !== null) {
                    (<IDisposable>requestStream).Dispose();
                }
            }
            var response: IEwsHttpWebResponse = ewsHttpWebRequest.GetResponse();
            var result: TSettings;
            try {
                var redirectUrl: Uri;
                if ((() => {
                    var _p0 = [
                        redirectUrl
                    ];
                    var _r = this.TryGetRedirectionResponse(response, _p0);
                    redirectUrl = _p0[0];
                    return _r;
                })()) {
                    tSettings.MakeRedirectionResponse(redirectUrl);
                    result = tSettings;
                }
                else {
                    var responseStream: Stream = response.GetResponseStream();
                    try {
                        if (super.IsTraceEnabledFor(TraceFlags.AutodiscoverResponse)) {
                            var memoryStream2: MemoryStream = new MemoryStream();
                            try {
                                EwsUtilities.CopyStream(responseStream, memoryStream2);
                                memoryStream2.Position = 0;
                                this.TraceResponse(response, memoryStream2);
                                var ewsXmlReader: EwsXmlReader = new EwsXmlReader(memoryStream2);
                                ewsXmlReader.Read(17);
                                tSettings.LoadFromXml(ewsXmlReader);
                                goto IL_172;
                            }
                            finally {
                                if (memoryStream2 !== null) {
                                    (<IDisposable>memoryStream2).Dispose();
                                }
                            }
                        }
                        var ewsXmlReader2: EwsXmlReader = new EwsXmlReader(responseStream);
                        ewsXmlReader2.Read(17);
                        tSettings.LoadFromXml(ewsXmlReader2);
                        IL_172: ;
                    }
                    finally {
                        if (responseStream !== null) {
                            (<IDisposable>responseStream).Dispose();
                        }
                    }
                    result = tSettings;
                }
            }
            finally {
                if (response !== null) {
                    response.Dispose();
                }
            }
            return result;
        }
        private WriteLegacyAutodiscoverRequest(emailAddress: string, settings: ConfigurationSettingsBase, writer: StreamWriter): void {
            writer.Write(NString.Format("<Autodiscover xmlns=\"{0}\">", "http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"));
            writer.Write("<Request>");
            writer.Write(NString.Format("<EMailAddress>{0}</EMailAddress>", emailAddress));
            writer.Write(NString.Format("<AcceptableResponseSchema>{0}</AcceptableResponseSchema>", settings.GetNamespace()));
            writer.Write("</Request>");
            writer.Write("</Autodiscover>");
        }
        private GetRedirectUrl(domainName: string): Uri {
            var text: string = NString.Format("http://{0}/autodiscover/autodiscover.xml", "autodiscover." + domainName);
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Trying to get Autodiscover redirection URL from {0}.", text));
            var ewsHttpWebRequest: IEwsHttpWebRequest = this.HttpWebRequestFactory.CreateRequest(new Uri(text));
            ewsHttpWebRequest.Method = "GET";
            ewsHttpWebRequest.AllowAutoRedirect = false;
            ewsHttpWebRequest.PreAuthenticate = false;
            var ewsHttpWebResponse: IEwsHttpWebResponse = null;
            try {
                ewsHttpWebResponse = ewsHttpWebRequest.GetResponse();
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Request error: {0}", ex.Message));
                    if (ex.Response !== null) {
                        ewsHttpWebResponse = this.HttpWebRequestFactory.CreateExceptionResponse(ex);
                    }
                }
                else
                    if (ex instanceof IOException) {
                        super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("I/O error: {0}", ex2.Message));
                    }
                    else
                        throw ex;
            }
            if (ewsHttpWebResponse !== null) {
                var ewsHttpWebResponse2: IEwsHttpWebResponse = ewsHttpWebResponse;
                try {
                    var result: Uri;
                    if ((() => {
                        var _p0 = [
                            result
                        ];
                        var _r = this.TryGetRedirectionResponse(ewsHttpWebResponse, _p0);
                        result = _p0[0];
                        return _r;
                    })()) {
                        return result;
                    }
                }
                finally {
                    if (ewsHttpWebResponse2 !== null) {
                        ewsHttpWebResponse2.Dispose();
                    }
                }
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, "No Autodiscover redirection URL was returned.");
            return null;
        }
        private TryGetRedirectionResponse(response: IEwsHttpWebResponse, redirectUrl: Uri[]): boolean {
            redirectUrl[0] = null;
            if (AutodiscoverRequest.IsRedirectionResponse(response)) {
                var text: string = response.Headers.get_Item(HttpResponseHeader.Location);
                if (!NString.IsNullOrEmpty(text)) {
                    try {
                        redirectUrl[0] = new Uri(response.ResponseUri, text);
                        var match: Match = AutodiscoverService.LegacyPathRegex.Match(redirectUrl[0].AbsolutePath);
                        if (redirectUrl[0].Scheme === Uri.UriSchemeHttps && match.Success) {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Redirection URL found: '{0}'", redirectUrl[0]));
                            var result: boolean = true;
                            return result;
                        }
                    }
                    catch (ex_7A) {
                        if (ex_7A instanceof UriFormatException) {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Invalid redirection URL was returned: '{0}'", text));
                            var result: boolean = false;
                            return result;
                        }
                        else
                            throw ex_7A;
                    }
                    return false;
                }
            }
            return false;
        }
        GetLegacyUserSettings<TSettings>(emailAddress: string): TSettings {
            if (Uri.op_Inequality(this.Url, null)) {
                var match: Match = AutodiscoverService.LegacyPathRegex.Match(this.Url.AbsolutePath);
                if (match.Success) {
                    return this.GetLegacyUserSettingsAtUrl<TSettings>(emailAddress, this.Url);
                }
                var uri: Uri = new Uri(this.Url, "/autodiscover/autodiscover.xml");
                return this.GetLegacyUserSettingsAtUrl<TSettings>(emailAddress, uri);
            }
            else {
                if (!NString.IsNullOrEmpty(this.Domain)) {
                    var uri2: Uri = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.xml", this.Domain));
                    return this.GetLegacyUserSettingsAtUrl<TSettings>(emailAddress, uri2);
                }
                var num: number = 1;
                var redirectionEmailAddresses: List<string> = new List<string>();
                return (() => {
                    var _p0 = [
                        num
                    ];
                    var _r = this.InternalGetLegacyUserSettings<TSettings>(emailAddress, redirectionEmailAddresses, _p0);
                    num = _p0[0];
                    return _r;
                })();
            }
        }
        private InternalGetLegacyUserSettings(emailAddress: string, redirectionEmailAddresses: List<string>, currentHop: number[]): TSettings;
        private InternalGetLegacyUserSettings(emailAddress: string, requestedSettings: List<UserSettingName>): TSettings;
        private InternalGetLegacyUserSettings(emailAddress: string, redirectionEmailAddressesOrRequestedSettings: any, currentHop?: number[]): TSettings {
            if (arguments.length === 3 && (emailAddress === null || emailAddress.constructor === String) && (redirectionEmailAddressesOrRequestedSettings === null || redirectionEmailAddressesOrRequestedSettings instanceof List) && (currentHop[0] === null || currentHop[0] instanceof Array)) {
                return this.InternalGetLegacyUserSettings_0(emailAddress, redirectionEmailAddressesOrRequestedSettings, currentHop[0]);
            }
            return this.InternalGetLegacyUserSettings_1(emailAddress, redirectionEmailAddressesOrRequestedSettings);
        }
        private InternalGetLegacyUserSettings_0<TSettings>(emailAddress: string, redirectionEmailAddresses: List<string>, currentHop: number[]): TSettings {
            var domainName: string = EwsUtilities.DomainFromEmailAddress(emailAddress);
            var num: number;
            var autodiscoverServiceUrls: List<Uri> = (() => {
                var _p0 = [
                    num
                ];
                var _r = this.GetAutodiscoverServiceUrls(domainName, _p0);
                num = _p0[0];
                return _r;
            })();
            if (autodiscoverServiceUrls.Count === 0) {
                throw new ServiceValidationException(Strings.AutodiscoverServiceRequestRequiresDomainOrUrl);
            }
            this.isExternal = new Nullable<boolean>(true);
            var num2: number = 0;
            var ex: Exception = null;
            var tSettings: TSettings = null;
            do {
                var uri: Uri = autodiscoverServiceUrls.get_Item(num2);
                var flag: boolean = num2 < num;
                try {
                    tSettings = this.GetLegacyUserSettingsAtUrl<TSettings>(emailAddress, uri);
                    switch (tSettings.ResponseType) {
                        case AutodiscoverResponseType.Error:
                            if (!flag) {
                                throw new AutodiscoverRemoteException(Strings.AutodiscoverError, tSettings.Error);
                            }
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, "Error returned by Autodiscover service found via SCP, treating as inconclusive.");
                            ex = new AutodiscoverRemoteException(Strings.AutodiscoverError, tSettings.Error);
                            num2 = num2 + 1;
                            break;
                        case AutodiscoverResponseType.RedirectUrl:
                            if (currentHop[0] >= 10) {
                                throw new AutodiscoverLocalException(Strings.MaximumRedirectionHopsExceeded);
                            }
                            currentHop[0] = currentHop[0] + 1;
                            super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service returned redirection URL '{0}'.", tSettings.RedirectTarget));
                            autodiscoverServiceUrls.set_Item(num2, new Uri(tSettings.RedirectTarget));
                            break;
                        case AutodiscoverResponseType.RedirectAddress:
                            if (currentHop[0] < 10) {
                                currentHop[0] = currentHop[0] + 1;
                                super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service returned redirection email address '{0}'.", tSettings.RedirectTarget));
                                this.DisableScpLookupIfDuplicateRedirection(tSettings.RedirectTarget, redirectionEmailAddresses);
                                var result: TSettings = (() => {
                                    var _p0 = [
                                        currentHop[0]
                                    ];
                                    var _r = this.InternalGetLegacyUserSettings<TSettings>(tSettings.RedirectTarget, redirectionEmailAddresses, _p0);
                                    currentHop[0] = _p0[0];
                                    return _r;
                                })();
                                return result;
                            }
                            throw new AutodiscoverLocalException(Strings.MaximumRedirectionHopsExceeded);
                        case AutodiscoverResponseType.Success:
                            {
                                if (flag) {
                                    this.IsExternal = new Nullable<boolean>(false);
                                }
                                this.Url = uri;
                                var result: TSettings = tSettings;
                                return result;
                            }
                        default:
                            EwsUtilities.Assert(false, "Autodiscover.GetConfigurationSettings", "An unexpected error has occured. This code path should never be reached.");
                            break;
                    }
                }
                catch (ex2) {
                    if (ex2 instanceof WebException) {
                        if (ex2.Response !== null) {
                            var ewsHttpWebResponse: IEwsHttpWebResponse = this.HttpWebRequestFactory.CreateExceptionResponse(ex2);
                            var uri2: Uri;
                            if ((() => {
                                var _p0 = [
                                    uri2
                                ];
                                var _r = this.TryGetRedirectionResponse(ewsHttpWebResponse, _p0);
                                uri2 = _p0[0];
                                return _r;
                            })()) {
                                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Host returned a redirection to url {0}", uri2));
                                currentHop[0] = currentHop[0] + 1;
                                autodiscoverServiceUrls.set_Item(num2, uri2);
                            }
                            else {
                                this.ProcessHttpErrorResponse(ewsHttpWebResponse, ex2);
                                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: {1} ({2})", this.url, ex2.GetType().Name, ex2.Message));
                                num2 = num2 + 1;
                            }
                        }
                        else {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: {1} ({2})", this.url, ex2.GetType().Name, ex2.Message));
                            num2 = num2 + 1;
                        }
                    }
                    else
                        if (ex2 instanceof XmlException) {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: XML parsing error: {1}", this.url, ex3.Message));
                            num2 = num2 + 1;
                        }
                        else
                            if (ex2 instanceof IOException) {
                                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: I/O error: {1}", this.url, ex4.Message));
                                num2 = num2 + 1;
                            }
                            else
                                throw ex2;
                }
            }
            while (num2 < autodiscoverServiceUrls.Count);
            var uri3: Uri = this.GetRedirectUrl(domainName);
            if (Uri.op_Inequality(uri3, null) && (() => {
                var _p0 = [
                    tSettings
                ];
                var _r = this.TryLastChanceHostRedirection<TSettings>(emailAddress, uri3, _p0);
                tSettings = _p0[0];
                return _r;
            })()) {
                return tSettings;
            }
            uri3 = this.GetRedirectionUrlFromDnsSrvRecord(domainName);
            if (Uri.op_Inequality(uri3, null) && (() => {
                var _p0 = [
                    tSettings
                ];
                var _r = this.TryLastChanceHostRedirection<TSettings>(emailAddress, uri3, _p0);
                tSettings = _p0[0];
                return _r;
            })()) {
                return tSettings;
            }
            if (ex !== null) {
                throw ex;
            }
            throw new AutodiscoverLocalException(Strings.AutodiscoverCouldNotBeLocated);
        }
        GetRedirectionUrlFromDnsSrvRecord(domainName: string): Uri {
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Trying to get Autodiscover host from DNS SRV record for {0}.", domainName));
            var text: string = this.dnsClient.FindAutodiscoverHostFromSrv(domainName);
            if (!NString.IsNullOrEmpty(text)) {
                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Autodiscover host {0} was returned.", text));
                return new Uri(NString.Format("https://{0}/autodiscover/autodiscover.xml", text));
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, "No matching Autodiscover DNS SRV records were found.");
            return null;
        }
        private TryLastChanceHostRedirection<TSettings>(emailAddress: string, redirectionUrl: Uri, settings: TSettings[]): boolean {
            settings[0] = null;
            var redirectionEmailAddresses: List<string> = new List<string>();
            if (this.CallRedirectionUrlValidationCallback(redirectionUrl.ToString())) {
                for (var i: number = 0; i < 10; i = i + 1) {
                    var IL_1DE: number = 1;
                    var _goto: number = 0;
                    _GOTO_LOOP:
                    while (true) {
                        switch (_goto) {
                            default:
                                try {
                                    settings[0] = this.GetLegacyUserSettingsAtUrl<TSettings>(emailAddress, redirectionUrl);
                                    var result: boolean;
                                    switch (settings[0].ResponseType) {
                                        case AutodiscoverResponseType.Error:
                                            throw new AutodiscoverRemoteException(Strings.AutodiscoverError, settings[0].Error);
                                        case AutodiscoverResponseType.RedirectUrl:
                                            try {
                                                redirectionUrl = new Uri(settings[0].RedirectTarget);
                                                _goto = IL_1DE;
                                                continue _GOTO_LOOP;
                                            }
                                            catch (ex_C1) {
                                                if (ex_C1 instanceof UriFormatException) {
                                                    super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Service returned invalid redirection URL {0}", settings[0].RedirectTarget));
                                                    result = false;
                                                    return result;
                                                }
                                                else
                                                    throw ex_C1;
                                            }
                                            break;
                                            _goto = IL_1DE;
                                            continue _GOTO_LOOP;
                                        case AutodiscoverResponseType.RedirectAddress:
                                            this.DisableScpLookupIfDuplicateRedirection(settings[0].RedirectTarget, redirectionEmailAddresses);
                                            settings[0] = (() => {
                                                var _p0 = [
                                                    i
                                                ];
                                                var _r = this.InternalGetLegacyUserSettings<TSettings>(emailAddress, redirectionEmailAddresses, _p0);
                                                i = _p0[0];
                                                return _r;
                                            })();
                                            result = true;
                                            return result;
                                        case AutodiscoverResponseType.Success:
                                            result = true;
                                            return result;
                                    }
                                    var logEntry: string = NString.Format("Autodiscover call at {0} failed with error {1}, target {2}", redirectionUrl, settings[0].ResponseType, settings[0].RedirectTarget);
                                    super.TraceMessage(TraceFlags.AutodiscoverConfiguration, logEntry);
                                    result = false;
                                    return result;
                                }
                                catch (ex) {
                                    if (ex instanceof WebException) {
                                        if (ex.Response !== null) {
                                            var ewsHttpWebResponse: IEwsHttpWebResponse = this.HttpWebRequestFactory.CreateExceptionResponse(ex);
                                            if ((() => {
                                                var _p0 = [
                                                    redirectionUrl
                                                ];
                                                var _r = this.TryGetRedirectionResponse(ewsHttpWebResponse, _p0);
                                                redirectionUrl = _p0[0];
                                                return _r;
                                            })()) {
                                                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Host returned a redirection to url {0}", redirectionUrl));
                                                _goto = IL_1DE;
                                                continue _GOTO_LOOP;
                                            }
                                            this.ProcessHttpErrorResponse(ewsHttpWebResponse, ex);
                                        }
                                        super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: {1} ({2})", this.url, ex.GetType().Name, ex.Message));
                                        var result: boolean = false;
                                        return result;
                                    }
                                    else
                                        if (ex instanceof XmlException) {
                                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: XML parsing error: {1}", redirectionUrl, ex2.Message));
                                            var result: boolean = false;
                                            return result;
                                        }
                                        else
                                            if (ex instanceof IOException) {
                                                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("{0} failed: I/O error: {1}", redirectionUrl, ex3.Message));
                                                var result: boolean = false;
                                                return result;
                                            }
                                            else
                                                throw ex;
                                }
                                _goto = IL_1DE;
                                continue _GOTO_LOOP;
                            case 1:
                                break _GOTO_LOOP;
                        }
                    }
                }
            }
            return false;
        }
        private DisableScpLookupIfDuplicateRedirection(emailAddress: string, redirectionEmailAddresses: List<string>): void {
            emailAddress = NString.ToLowerInvariant(emailAddress);
            if (redirectionEmailAddresses.Contains(emailAddress)) {
                this.EnableScpLookup = false;
                return;
            }
            redirectionEmailAddresses.Add(emailAddress);
        }
        private InternalGetLegacyUserSettings_1(emailAddress: string, requestedSettings: List<UserSettingName>): GetUserSettingsResponse {
            if (this.Credentials !== null && this.Credentials instanceof WSSecurityBasedCredentials) {
                throw new AutodiscoverLocalException(Strings.WLIDCredentialsCannotBeUsedWithLegacyAutodiscover);
            }
            var legacyUserSettings: OutlookConfigurationSettings = this.GetLegacyUserSettings<OutlookConfigurationSettings>(emailAddress);
            return legacyUserSettings.ConvertSettings(emailAddress, requestedSettings);
        }
        InternalGetSoapUserSettings(smtpAddress: string, requestedSettings: List<UserSettingName>): GetUserSettingsResponse {
            var list: List<string> = new List<string>();
            list.Add(smtpAddress);
            var list2: List<string> = new List<string>();
            list2.Add(NString.ToLowerInvariant(smtpAddress));
            for (var i: number = 0; i < 10; i = i + 1) {
                var getUserSettingsResponse: GetUserSettingsResponse = this.GetUserSettings(list, requestedSettings).get_Item(0);
                switch (getUserSettingsResponse.ErrorCode) {
                    case AutodiscoverErrorCode.NoError:
                        return getUserSettingsResponse;
                    case AutodiscoverErrorCode.RedirectAddress:
                        super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service returned redirection email address '{0}'.", getUserSettingsResponse.RedirectTarget));
                        list.Clear();
                        list.Add(NString.ToLowerInvariant(getUserSettingsResponse.RedirectTarget));
                        this.Url = null;
                        this.Domain = null;
                        this.DisableScpLookupIfDuplicateRedirection(getUserSettingsResponse.RedirectTarget, list2);
                        break;
                    case AutodiscoverErrorCode.RedirectUrl:
                        super.TraceMessage(TraceFlags.AutodiscoverResponse, NString.Format("Autodiscover service returned redirection URL '{0}'.", getUserSettingsResponse.RedirectTarget));
                        this.Url = this.Credentials.AdjustUrl(new Uri(getUserSettingsResponse.RedirectTarget));
                        break;
                    default:
                        return getUserSettingsResponse;
                }
            }
            throw new AutodiscoverLocalException(Strings.AutodiscoverCouldNotBeLocated);
        }
        GetUserSettings(smtpAddresses: List<string>, settings: List<UserSettingName>): GetUserSettingsResponseCollection;
        GetUserSettings(userSmtpAddress: string, userSettingNames: UserSettingName[]): GetUserSettingsResponseCollection;
        GetUserSettings(smtpAddressesOrUserSmtpAddress: any, settingsOrUserSettingNames: any): GetUserSettingsResponseCollection {
            if (arguments.length === 2 && (smtpAddressesOrUserSmtpAddress === null || smtpAddressesOrUserSmtpAddress instanceof List) && (settingsOrUserSettingNames === null || settingsOrUserSettingNames instanceof List)) {
                return this.GetUserSettings_0(smtpAddressesOrUserSmtpAddress, settingsOrUserSettingNames);
            }
            return this.GetUserSettings_1(smtpAddressesOrUserSmtpAddress, settingsOrUserSettingNames);
        }
        private GetUserSettings_0(smtpAddresses: List<string>, settings: List<UserSettingName>): GetUserSettingsResponseCollection {
            EwsUtilities.ValidateParam(smtpAddresses, "smtpAddresses");
            EwsUtilities.ValidateParam(settings, "settings");
            return this.GetSettings<GetUserSettingsResponseCollection, UserSettingName>(smtpAddresses, settings, null, this.InternalGetUserSettings, () => { return EwsUtilities.DomainFromEmailAddress(smtpAddresses.get_Item(0)); });
        }
        private GetSettings<TGetSettingsResponseCollection, TSettingName>(identities: List<string>, settings: List<TSettingName>, requestedVersion: Nullable<ExchangeVersion>, getSettingsMethod: (smtpAddresses: List<string>, settings: List<TSettingName>, requestedVersion: Nullable<ExchangeVersion>, autodiscoverUrl: Uri&) => TGetSettingsResponseCollection, getDomainMethod: () => string): TGetSettingsResponseCollection {
            if (this.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                throw new ServiceVersionException(NString.Format(Strings.AutodiscoverServiceIncompatibleWithRequestVersion, ExchangeVersion.Exchange2010));
            }
            if (Uri.op_Inequality(this.Url, null)) {
                var uri: Uri = this.Url;
                var result: TGetSettingsResponseCollection = (() => {
                    var _p0 = [
                        uri
                    ];
                    var _r = getSettingsMethod(identities, settings, requestedVersion, _p0);
                    uri = _p0[0];
                    return _r;
                })();
                this.Url = uri;
                return result;
            }
            if (!NString.IsNullOrEmpty(this.Domain)) {
                var autodiscoverEndpointUrl: Uri = this.GetAutodiscoverEndpointUrl(this.Domain);
                var result: TGetSettingsResponseCollection = (() => {
                    var _p0 = [
                        autodiscoverEndpointUrl
                    ];
                    var _r = getSettingsMethod(identities, settings, requestedVersion, _p0);
                    autodiscoverEndpointUrl = _p0[0];
                    return _r;
                })();
                this.Url = autodiscoverEndpointUrl;
                return result;
            }
            this.IsExternal = new Nullable<boolean>(true);
            var domainName: string = getDomainMethod();
            var num: number;
            var autodiscoverServiceHosts: List<string> = (() => {
                var _p0 = [
                    num
                ];
                var _r = this.GetAutodiscoverServiceHosts(domainName, _p0);
                num = _p0[0];
                return _r;
            })();
            if (autodiscoverServiceHosts.Count === 0) {
                throw new ServiceValidationException(Strings.AutodiscoverServiceRequestRequiresDomainOrUrl);
            }
            var uri2: Uri;
            for (var i: number = 0; i < autodiscoverServiceHosts.Count; i = i + 1) {
                var host: string = autodiscoverServiceHosts.get_Item(i);
                var flag: boolean = i < num;
                if ((() => {
                    var _p0 = [
                        uri2
                    ];
                    var _r = this.TryGetAutodiscoverEndpointUrl(host, _p0);
                    uri2 = _p0[0];
                    return _r;
                })()) {
                    try {
                        var result: TGetSettingsResponseCollection = (() => {
                            var _p0 = [
                                uri2
                            ];
                            var _r = getSettingsMethod(identities, settings, requestedVersion, _p0);
                            uri2 = _p0[0];
                            return _r;
                        })();
                        this.Url = uri2;
                        if (flag) {
                            this.IsExternal = new Nullable<boolean>(false);
                        }
                        return result;
                    }
                    catch (ex_109) {
                        if (ex_109 instanceof AutodiscoverResponseException) {
                        }
                        else
                            if (ex_109 instanceof ServiceRequestException) {
                            }
                            else
                                throw ex_109;
                    }
                }
            }
            uri2 = this.GetRedirectUrl(domainName);
            if (Uri.op_Inequality(uri2, null) && this.CallRedirectionUrlValidationCallback(uri2.ToString()) && (() => {
                var _p0 = [
                    uri2
                ];
                var _r = this.TryGetAutodiscoverEndpointUrl(uri2.Host, _p0);
                uri2 = _p0[0];
                return _r;
            })()) {
                var result: TGetSettingsResponseCollection = (() => {
                    var _p0 = [
                        uri2
                    ];
                    var _r = getSettingsMethod(identities, settings, requestedVersion, _p0);
                    uri2 = _p0[0];
                    return _r;
                })();
                this.Url = uri2;
                return result;
            }
            uri2 = this.GetRedirectionUrlFromDnsSrvRecord(domainName);
            if (Uri.op_Inequality(uri2, null) && this.CallRedirectionUrlValidationCallback(uri2.ToString()) && (() => {
                var _p0 = [
                    uri2
                ];
                var _r = this.TryGetAutodiscoverEndpointUrl(uri2.Host, _p0);
                uri2 = _p0[0];
                return _r;
            })()) {
                var result: TGetSettingsResponseCollection = (() => {
                    var _p0 = [
                        uri2
                    ];
                    var _r = getSettingsMethod(identities, settings, requestedVersion, _p0);
                    uri2 = _p0[0];
                    return _r;
                })();
                this.Url = uri2;
                return result;
            }
            throw new AutodiscoverLocalException(Strings.AutodiscoverCouldNotBeLocated);
        }
        private InternalGetUserSettings(smtpAddresses: List<string>, settings: List<UserSettingName>, requestedVersion: Nullable<ExchangeVersion>, autodiscoverUrl: Uri[]): GetUserSettingsResponseCollection {
            for (var i: number = 0; i < 10; i = i + 1) {
                var getUserSettingsRequest: GetUserSettingsRequest = new GetUserSettingsRequest(this, autodiscoverUrl[0]);
                getUserSettingsRequest.SmtpAddresses = smtpAddresses;
                getUserSettingsRequest.Settings = settings;
                var getUserSettingsResponseCollection: GetUserSettingsResponseCollection = getUserSettingsRequest.Execute();
                if (getUserSettingsResponseCollection.ErrorCode !== AutodiscoverErrorCode.RedirectUrl || !Uri.op_Inequality(getUserSettingsResponseCollection.RedirectionUrl, null)) {
                    return getUserSettingsResponseCollection;
                }
                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Request to {0} returned redirection to {1}", autodiscoverUrl[0].ToString(), getUserSettingsResponseCollection.RedirectionUrl));
                autodiscoverUrl[0] = getUserSettingsResponseCollection.RedirectionUrl;
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Maximum number of redirection hops {0} exceeded", 10));
            throw new AutodiscoverLocalException(Strings.MaximumRedirectionHopsExceeded);
        }
        GetDomainSettings(domains: List<string>, settings: List<DomainSettingName>, requestedVersion: Nullable<ExchangeVersion>): GetDomainSettingsResponseCollection;
        GetDomainSettings(domain: string, requestedVersion: Nullable<ExchangeVersion>, domainSettingNames: DomainSettingName[]): GetDomainSettingsResponseCollection;
        GetDomainSettings(domains: IEnumerable<string>, requestedVersion: Nullable<ExchangeVersion>, domainSettingNames: DomainSettingName[]): GetDomainSettingsResponseCollection;
        GetDomainSettings(domainsOrDomain: any, settingsOrRequestedVersion: any, requestedVersionOrDomainSettingNames: any): GetDomainSettingsResponseCollection {
            if (arguments.length === 3 && (domainsOrDomain === null || domainsOrDomain instanceof List) && (settingsOrRequestedVersion === null || settingsOrRequestedVersion instanceof List) && (requestedVersionOrDomainSettingNames === null || requestedVersionOrDomainSettingNames instanceof Array)) {
                return this.GetDomainSettings_0(domainsOrDomain, settingsOrRequestedVersion, requestedVersionOrDomainSettingNames);
            }
            if (arguments.length === 3 && (domainsOrDomain === null || domainsOrDomain.constructor === String) && (settingsOrRequestedVersion === null || settingsOrRequestedVersion instanceof Array) && (requestedVersionOrDomainSettingNames === null || requestedVersionOrDomainSettingNames instanceof Array)) {
                return this.GetDomainSettings_1(domainsOrDomain, settingsOrRequestedVersion, requestedVersionOrDomainSettingNames);
            }
            return this.GetDomainSettings_2(domainsOrDomain, settingsOrRequestedVersion, requestedVersionOrDomainSettingNames);
        }
        private GetDomainSettings_0(domains: List<string>, settings: List<DomainSettingName>, requestedVersion: Nullable<ExchangeVersion>): GetDomainSettingsResponseCollection {
            EwsUtilities.ValidateParam(domains, "domains");
            EwsUtilities.ValidateParam(settings, "settings");
            return this.GetSettings<GetDomainSettingsResponseCollection, DomainSettingName>(domains, settings, requestedVersion, this.InternalGetDomainSettings, () => { return domains.get_Item(0); });
        }
        private InternalGetDomainSettings(domains: List<string>, settings: List<DomainSettingName>, requestedVersion: Nullable<ExchangeVersion>, autodiscoverUrl: Uri[]): GetDomainSettingsResponseCollection {
            for (var i: number = 0; i < 10; i = i + 1) {
                var getDomainSettingsRequest: GetDomainSettingsRequest = new GetDomainSettingsRequest(this, autodiscoverUrl[0]);
                getDomainSettingsRequest.Domains = domains;
                getDomainSettingsRequest.Settings = settings;
                getDomainSettingsRequest.RequestedVersion = requestedVersion;
                var getDomainSettingsResponseCollection: GetDomainSettingsResponseCollection = getDomainSettingsRequest.Execute();
                if (getDomainSettingsResponseCollection.ErrorCode !== AutodiscoverErrorCode.RedirectUrl || !Uri.op_Inequality(getDomainSettingsResponseCollection.RedirectionUrl, null)) {
                    return getDomainSettingsResponseCollection;
                }
                autodiscoverUrl[0] = getDomainSettingsResponseCollection.RedirectionUrl;
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Maximum number of redirection hops {0} exceeded", 10));
            throw new AutodiscoverLocalException(Strings.MaximumRedirectionHopsExceeded);
        }
        private GetAutodiscoverEndpointUrl(host: string): Uri {
            var result: Uri;
            if ((() => {
                var _p0 = [
                    result
                ];
                var _r = this.TryGetAutodiscoverEndpointUrl(host, _p0);
                result = _p0[0];
                return _r;
            })()) {
                return result;
            }
            throw new AutodiscoverLocalException(Strings.NoSoapOrWsSecurityEndpointAvailable);
        }
        private TryGetAutodiscoverEndpointUrl(host: string, url: Uri[]): boolean {
            url[0] = null;
            var autodiscoverEndpoints: AutodiscoverEndpoints;
            if (!(() => {
                var _p0 = [
                    host
                ];
                var _p1 = [
                    autodiscoverEndpoints
                ];
                var _r = this.TryGetEnabledEndpointsForHost(_p0, _p1);
                host = _p0[0];
                autodiscoverEndpoints = _p1[0];
                return _r;
            })()) {
                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No Autodiscover endpoints are available for host {0}", host));
                return false;
            }
            url[0] = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.svc", host));
            if ((autodiscoverEndpoints & AutodiscoverEndpoints.Soap) !== AutodiscoverEndpoints.Soap && (autodiscoverEndpoints & AutodiscoverEndpoints.WsSecurity) !== AutodiscoverEndpoints.WsSecurity && (autodiscoverEndpoints & AutodiscoverEndpoints.WSSecuritySymmetricKey) !== AutodiscoverEndpoints.WSSecuritySymmetricKey && (autodiscoverEndpoints & AutodiscoverEndpoints.WSSecurityX509Cert) !== AutodiscoverEndpoints.WSSecurityX509Cert && (autodiscoverEndpoints & AutodiscoverEndpoints.OAuth) !== AutodiscoverEndpoints.OAuth) {
                super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No Autodiscover endpoints are available  for host {0}", host));
                return false;
            }
            if (this.Credentials instanceof WindowsLiveCredentials) {
                if ((autodiscoverEndpoints & AutodiscoverEndpoints.WsSecurity) !== AutodiscoverEndpoints.WsSecurity) {
                    super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No Autodiscover WS-Security endpoint is available for host {0}", host));
                    return false;
                }
                url[0] = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.svc/wssecurity", host));
            }
            else {
                if (this.Credentials instanceof PartnerTokenCredentials) {
                    if ((autodiscoverEndpoints & AutodiscoverEndpoints.WSSecuritySymmetricKey) !== AutodiscoverEndpoints.WSSecuritySymmetricKey) {
                        super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No Autodiscover WS-Security/SymmetricKey endpoint is available for host {0}", host));
                        return false;
                    }
                    url[0] = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.svc/wssecurity/symmetrickey", host));
                }
                else {
                    if (this.Credentials instanceof X509CertificateCredentials) {
                        if ((autodiscoverEndpoints & AutodiscoverEndpoints.WSSecurityX509Cert) !== AutodiscoverEndpoints.WSSecurityX509Cert) {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("No Autodiscover WS-Security/X509Cert endpoint is available for host {0}", host));
                            return false;
                        }
                        url[0] = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.svc/wssecurity/x509cert", host));
                    }
                    else {
                        if (this.Credentials instanceof OAuthCredentials) {
                            url[0] = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.svc", host));
                        }
                    }
                }
            }
            return true;
        }
        private DefaultGetScpUrlsForDomain(domainName: string): ICollection<string> {
            var directoryHelper: DirectoryHelper = new DirectoryHelper(this);
            return directoryHelper.GetAutodiscoverScpUrlsForDomain(domainName);
        }
        GetAutodiscoverServiceUrls(domainName: string, scpHostCount: number[]): List<Uri> {
            var list: List<Uri> = new List<Uri>();
            if (this.enableScpLookup) {
                var func: (arg: string) => ICollection<string> = this.GetScpUrlsForDomainCallback || this.DefaultGetScpUrlsForDomain;
                var collection: ICollection<string> = func(domainName);
                var enumerator: IEnumerator<string> = collection.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: string = enumerator.Current;
                        list.Add(new Uri(current));
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
            scpHostCount[0] = list.Count;
            list.Add(new Uri(NString.Format("https://{0}/autodiscover/autodiscover.xml", domainName)));
            list.Add(new Uri(NString.Format("https://{0}/autodiscover/autodiscover.xml", "autodiscover." + domainName)));
            return list;
        }
        GetAutodiscoverServiceHosts(domainName: string, scpHostCount: number[]): List<string> {
            var list: List<string> = new List<string>();
            var enumerator: List_Enumerator<Uri> = (() => {
                var _p0 = [
                    scpHostCount[0]
                ];
                var _r = this.GetAutodiscoverServiceUrls(domainName, _p0);
                scpHostCount[0] = _p0[0];
                return _r;
            })().GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: Uri = enumerator.Current;
                    list.Add(current.Host);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            return list;
        }
        private TryGetEnabledEndpointsForHost(host: string[], endpoints: AutodiscoverEndpoints[]): boolean {
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Determining which endpoints are enabled for host {0}", host[0]));
            var i: number = 0;
            while (i < 10) {
                var uri: Uri = new Uri(NString.Format("https://{0}/autodiscover/autodiscover.xml", host[0]));
                endpoints[0] = AutodiscoverEndpoints.None;
                var ewsHttpWebRequest: IEwsHttpWebRequest = this.HttpWebRequestFactory.CreateRequest(uri);
                ewsHttpWebRequest.Method = "GET";
                ewsHttpWebRequest.AllowAutoRedirect = false;
                ewsHttpWebRequest.PreAuthenticate = false;
                ewsHttpWebRequest.UseDefaultCredentials = false;
                var ewsHttpWebResponse: IEwsHttpWebResponse = null;
                try {
                    ewsHttpWebResponse = ewsHttpWebRequest.GetResponse();
                }
                catch (ex) {
                    if (ex instanceof WebException) {
                        super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Request error: {0}", ex.Message));
                        if (ex.Response !== null) {
                            ewsHttpWebResponse = this.HttpWebRequestFactory.CreateExceptionResponse(ex);
                        }
                    }
                    else
                        if (ex instanceof IOException) {
                            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("I/O error: {0}", ex2.Message));
                        }
                        else
                            throw ex;
                }
                if (ewsHttpWebResponse !== null) {
                    var IL_12A: number = 1;
                    var _goto: number = 0;
                    _GOTO_LOOP:
                    while (true) {
                        switch (_goto) {
                            default:
                                var ewsHttpWebResponse2: IEwsHttpWebResponse = ewsHttpWebResponse;
                                try {
                                    var uri2: Uri;
                                    if ((() => {
                                        var _p0 = [
                                            uri2
                                        ];
                                        var _r = this.TryGetRedirectionResponse(ewsHttpWebResponse, _p0);
                                        uri2 = _p0[0];
                                        return _r;
                                    })()) {
                                        super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Host returned redirection to host '{0}'", uri2.Host));
                                        host[0] = uri2.Host;
                                        _goto = IL_12A;
                                        continue _GOTO_LOOP;
                                    }
                                    endpoints[0] = this.GetEndpointsFromHttpWebResponse(ewsHttpWebResponse);
                                    super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Host returned enabled endpoint flags: {0}", endpoints[0]));
                                    return true;
                                }
                                finally {
                                    if (ewsHttpWebResponse2 !== null) {
                                        ewsHttpWebResponse2.Dispose();
                                    }
                                }
                                return false;
                            case 1:
                                i = i + 1;
                                continue;
                                break _GOTO_LOOP;
                        }
                    }
                }
                return false;
            }
            super.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Maximum number of redirection hops {0} exceeded", 10));
            throw new AutodiscoverLocalException(Strings.MaximumRedirectionHopsExceeded);
        }
        private GetEndpointsFromHttpWebResponse(response: IEwsHttpWebResponse): AutodiscoverEndpoints {
            var autodiscoverEndpoints: AutodiscoverEndpoints = AutodiscoverEndpoints.Legacy;
            if (!NString.IsNullOrEmpty(response.Headers.get_Item("X-SOAP-Enabled"))) {
                autodiscoverEndpoints = (autodiscoverEndpoints | AutodiscoverEndpoints.Soap);
            }
            if (!NString.IsNullOrEmpty(response.Headers.get_Item("X-WSSecurity-Enabled"))) {
                autodiscoverEndpoints = (autodiscoverEndpoints | AutodiscoverEndpoints.WsSecurity);
            }
            if (!NString.IsNullOrEmpty(response.Headers.get_Item("X-WSSecurity-SymmetricKey-Enabled"))) {
                autodiscoverEndpoints = (autodiscoverEndpoints | AutodiscoverEndpoints.WSSecuritySymmetricKey);
            }
            if (!NString.IsNullOrEmpty(response.Headers.get_Item("X-WSSecurity-X509Cert-Enabled"))) {
                autodiscoverEndpoints = (autodiscoverEndpoints | AutodiscoverEndpoints.WSSecurityX509Cert);
            }
            if (!NString.IsNullOrEmpty(response.Headers.get_Item("X-OAuth-Enabled"))) {
                autodiscoverEndpoints = (autodiscoverEndpoints | AutodiscoverEndpoints.OAuth);
            }
            return autodiscoverEndpoints;
        }
        TraceResponse(response: IEwsHttpWebResponse, memoryStream: MemoryStream): void {
            super.ProcessHttpResponseHeaders(TraceFlags.AutodiscoverResponseHttpHeaders, response);
            if (this.TraceEnabled) {
                if (!NString.IsNullOrEmpty(response.ContentType) && (NString.StartsWith(response.ContentType, "text/", StringComparison.OrdinalIgnoreCase) || NString.StartsWith(response.ContentType, "application/soap", StringComparison.OrdinalIgnoreCase))) {
                    super.TraceXml(TraceFlags.AutodiscoverResponse, memoryStream);
                    return;
                }
                super.TraceMessage(TraceFlags.AutodiscoverResponse, "Non-textual response");
            }
        }
        PrepareHttpWebRequestForUrl(url: Uri): IEwsHttpWebRequest {
            return super.PrepareHttpWebRequestForUrl(url, false, false);
        }
        private CallRedirectionUrlValidationCallback(redirectionUrl: string): boolean {
            var autodiscoverRedirectionUrlValidationCallback: (redirectionUrl: string) => boolean = (this.RedirectionUrlValidationCallback === null) ? this.DefaultAutodiscoverRedirectionUrlValidationCallback : this.RedirectionUrlValidationCallback;
            return autodiscoverRedirectionUrlValidationCallback(redirectionUrl);
        }
        ProcessHttpErrorResponse(httpWebResponse: IEwsHttpWebResponse, webException: WebException): void {
            super.InternalProcessHttpErrorResponse(httpWebResponse, webException, TraceFlags.AutodiscoverResponseHttpHeaders, TraceFlags.AutodiscoverResponse);
        }
        constructor();
        constructor(requestedServerVersion: ExchangeVersion);
        constructor(domain: string);
        constructor(domain: string, requestedServerVersion: ExchangeVersion);
        constructor(url: Uri);
        constructor(url: Uri, requestedServerVersion: ExchangeVersion);
        constructor(url: Uri, domain: string);
        constructor(url: Uri, domain: string, requestedServerVersion: ExchangeVersion);
        constructor(service: ExchangeServiceBase, requestedServerVersion: ExchangeVersion);
        constructor(service: ExchangeServiceBase);
        constructor(requestedServerVersionOrDomainOrUrlOrService?: any, requestedServerVersionOrDomain?: any, requestedServerVersion?: ExchangeVersion) {
            super(ExchangeVersion.Exchange2010);
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            if (arguments.length === 1 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService.constructor === Number)) {
                this.constructor_1(requestedServerVersionOrDomainOrUrlOrService);
                return;
            }
            if (arguments.length === 1 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService.constructor === String)) {
                this.constructor_2(requestedServerVersionOrDomainOrUrlOrService);
                return;
            }
            if (arguments.length === 2 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService.constructor === String) && (requestedServerVersionOrDomain === null || requestedServerVersionOrDomain.constructor === Number)) {
                this.constructor_3(requestedServerVersionOrDomainOrUrlOrService, requestedServerVersionOrDomain);
                return;
            }
            if (arguments.length === 1 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService instanceof Uri)) {
                this.constructor_4(requestedServerVersionOrDomainOrUrlOrService);
                return;
            }
            if (arguments.length === 2 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService instanceof Uri) && (requestedServerVersionOrDomain === null || requestedServerVersionOrDomain.constructor === Number)) {
                this.constructor_5(requestedServerVersionOrDomainOrUrlOrService, requestedServerVersionOrDomain);
                return;
            }
            if (arguments.length === 2 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService instanceof Uri) && (requestedServerVersionOrDomain === null || requestedServerVersionOrDomain.constructor === String)) {
                this.constructor_6(requestedServerVersionOrDomainOrUrlOrService, requestedServerVersionOrDomain);
                return;
            }
            if (arguments.length === 3 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService instanceof Uri) && (requestedServerVersionOrDomain === null || requestedServerVersionOrDomain.constructor === String) && (requestedServerVersion === null || requestedServerVersion.constructor === Number)) {
                this.constructor_7(requestedServerVersionOrDomainOrUrlOrService, requestedServerVersionOrDomain, requestedServerVersion);
                return;
            }
            if (arguments.length === 2 && (requestedServerVersionOrDomainOrUrlOrService === null || requestedServerVersionOrDomainOrUrlOrService instanceof ExchangeServiceBase) && (requestedServerVersionOrDomain === null || requestedServerVersionOrDomain.constructor === Number)) {
                this.constructor_8(requestedServerVersionOrDomainOrUrlOrService, requestedServerVersionOrDomain);
                return;
            }
            this.constructor_9(requestedServerVersionOrDomainOrUrlOrService);
        }
        private constructor_0(): void {
            this.constructor_1(ExchangeVersion.Exchange2010);
        }
        private constructor_1(requestedServerVersion: ExchangeVersion): void {
            this.constructor_7(null, null, requestedServerVersion);
        }
        private constructor_2(domain: string): void {
            this.constructor_6(null, domain);
        }
        private constructor_3(domain: string, requestedServerVersion: ExchangeVersion): void {
            this.constructor_7(null, domain, requestedServerVersion);
        }
        private constructor_4(url: Uri): void {
            this.constructor_6(url, url.Host);
        }
        private constructor_5(url: Uri, requestedServerVersion: ExchangeVersion): void {
            this.constructor_7(url, url.Host, requestedServerVersion);
        }
        private constructor_6(url: Uri, domain: string): void {
            this.isExternal = new Nullable<boolean>(true);
            this.enableScpLookup = true;
            super..ctor();
            EwsUtilities.ValidateDomainNameAllowNull(domain, "domain");
            this.url = url;
            this.domain = domain;
            this.dnsClient = new AutodiscoverDnsClient(this);
        }
        private constructor_7(url: Uri, domain: string, requestedServerVersion: ExchangeVersion): void {
            this.isExternal = new Nullable<boolean>(true);
            this.enableScpLookup = true;
            super..ctor(requestedServerVersion);
            EwsUtilities.ValidateDomainNameAllowNull(domain, "domain");
            this.url = url;
            this.domain = domain;
            this.dnsClient = new AutodiscoverDnsClient(this);
        }
        private constructor_8(service: ExchangeServiceBase, requestedServerVersion: ExchangeVersion): void {
            this.isExternal = new Nullable<boolean>(true);
            this.enableScpLookup = true;
            super..ctor(service, requestedServerVersion);
            this.dnsClient = new AutodiscoverDnsClient(this);
        }
        private constructor_9(service: ExchangeServiceBase): void {
            this.constructor_8(service, service.RequestedServerVersion);
        }
        private GetUserSettings_1(userSmtpAddress: string, userSettingNames: UserSettingName[]): GetUserSettingsResponse {
            var list: List<UserSettingName> = new List<UserSettingName>(userSettingNames);
            if (NString.IsNullOrEmpty(userSmtpAddress)) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverSmtpAddress);
            }
            if (list.Count === 0) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverSettingsCount);
            }
            if (this.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                return this.InternalGetLegacyUserSettings(userSmtpAddress, list);
            }
            return this.InternalGetSoapUserSettings(userSmtpAddress, list);
        }
        GetUsersSettings(userSmtpAddresses: IEnumerable<string>, userSettingNames: UserSettingName[]): GetUserSettingsResponseCollection {
            if (this.RequestedServerVersion < ExchangeVersion.Exchange2010) {
                throw new ServiceVersionException(NString.Format(Strings.AutodiscoverServiceIncompatibleWithRequestVersion, ExchangeVersion.Exchange2010));
            }
            var smtpAddresses: List<string> = new List<string>(userSmtpAddresses);
            var settings: List<UserSettingName> = new List<UserSettingName>(userSettingNames);
            return this.GetUserSettings(smtpAddresses, settings);
        }
        private GetDomainSettings_1(domain: string, requestedVersion: Nullable<ExchangeVersion>, domainSettingNames: DomainSettingName[]): GetDomainSettingsResponse {
            var list: List<string> = new List<string>(1);
            list.Add(domain);
            var settings: List<DomainSettingName> = new List<DomainSettingName>(domainSettingNames);
            return this.GetDomainSettings(list, settings, requestedVersion).get_Item(0);
        }
        private GetDomainSettings_2(domains: IEnumerable<string>, requestedVersion: Nullable<ExchangeVersion>, domainSettingNames: DomainSettingName[]): GetDomainSettingsResponseCollection {
            var settings: List<DomainSettingName> = new List<DomainSettingName>(domainSettingNames);
            return this.GetDomainSettings(new List<string>(domains), settings, requestedVersion);
        }
        TryGetPartnerAccess(targetTenantDomain: string, partnerAccessCredentials: ExchangeCredentials[], targetTenantAutodiscoverUrl: Uri[]): boolean {
            EwsUtilities.ValidateNonBlankStringParam(targetTenantDomain, "targetTenantDomain");
            if (Uri.op_Equality(this.Url, null)) {
                throw new ServiceValidationException(Strings.PartnerTokenRequestRequiresUrl);
            }
            if (this.RequestedServerVersion < ExchangeVersion.Exchange2010_SP1) {
                throw new ServiceVersionException(NString.Format(Strings.PartnerTokenIncompatibleWithRequestVersion, ExchangeVersion.Exchange2010_SP1));
            }
            partnerAccessCredentials[0] = null;
            targetTenantAutodiscoverUrl[0] = null;
            var text: string = targetTenantDomain;
            if (!NString.Contains(text, "@")) {
                text = "SystemMailbox{e0dc1c29-89c3-4034-b678-e6c29d823ed9}@" + targetTenantDomain;
            }
            var getUserSettingsRequest: GetUserSettingsRequest = new GetUserSettingsRequest(this, this.Url, true);
            getUserSettingsRequest.SmtpAddresses = new List<string>([
                text
            ]);
            getUserSettingsRequest.Settings = new List<UserSettingName>([
                UserSettingName.ExternalEwsUrl
            ]);
            var getUserSettingsResponseCollection: GetUserSettingsResponseCollection = null;
            try {
                getUserSettingsResponseCollection = getUserSettingsRequest.Execute();
            }
            catch (ex_BC) {
                if (ex_BC instanceof ServiceRequestException) {
                    var result: boolean = false;
                    return result;
                }
                else
                    if (ex_BC instanceof ServiceRemoteException) {
                        var result: boolean = false;
                        return result;
                    }
                    else
                        throw ex_BC;
            }
            if (NString.IsNullOrEmpty(getUserSettingsRequest.PartnerToken) || NString.IsNullOrEmpty(getUserSettingsRequest.PartnerTokenReference)) {
                return false;
            }
            if (getUserSettingsResponseCollection.ErrorCode === AutodiscoverErrorCode.NoError) {
                var getUserSettingsResponse: GetUserSettingsResponse = getUserSettingsResponseCollection.Responses.get_Item(0);
                if (getUserSettingsResponse.ErrorCode === AutodiscoverErrorCode.NoError) {
                    targetTenantAutodiscoverUrl[0] = this.Url;
                }
                else {
                    if (getUserSettingsResponse.ErrorCode !== AutodiscoverErrorCode.RedirectUrl) {
                        return false;
                    }
                    targetTenantAutodiscoverUrl[0] = new Uri(getUserSettingsResponse.RedirectTarget);
                }
                partnerAccessCredentials[0] = new PartnerTokenCredentials(getUserSettingsRequest.PartnerToken, getUserSettingsRequest.PartnerTokenReference);
                targetTenantAutodiscoverUrl[0] = partnerAccessCredentials[0].AdjustUrl(targetTenantAutodiscoverUrl[0]);
                return true;
            }
            return false;
        }
    }
    class DirectoryHelper {
        private static AutodiscoverMaxScpHops: number = 10;
        private static ScpUrlGuidString: string = "77378F46-2C66-4aa9-A6A6-3E7A48B19596";
        private static ScpPtrGuidString: string = "67661d7F-8FC4-4fa7-BFAC-E1D7794C1F68";
        private static ScpFilterString: string = "(&(objectClass=serviceConnectionPoint)(|(keywords=67661d7F-8FC4-4fa7-BFAC-E1D7794C1F68)(keywords=77378F46-2C66-4aa9-A6A6-3E7A48B19596)))";
        private service: ExchangeServiceBase = null;
        get Service(): ExchangeServiceBase {
            return this.service;
        }
        GetAutodiscoverScpUrlsForDomain(domainName: string): List<string> {
            var num: number = 10;
            var result: List<string>;
            try {
                result = (() => {
                    var _p0 = [
                        num
                    ];
                    var _r = this.GetScpUrlList(domainName, null, _p0);
                    num = _p0[0];
                    return _r;
                })();
            }
            catch (ex) {
                if (ex instanceof InvalidOperationException) {
                    this.TraceMessage(NString.Format("LDAP call failed, exception: {0}", ex.ToString()));
                    result = new List<string>();
                }
                else
                    if (ex instanceof NotSupportedException) {
                        this.TraceMessage(NString.Format("LDAP call failed, exception: {0}", ex2.ToString()));
                        result = new List<string>();
                    }
                    else
                        if (ex instanceof COMException) {
                            this.TraceMessage(NString.Format("LDAP call failed, exception: {0}", ex3.ToString()));
                            result = new List<string>();
                        }
                        else
                            throw ex;
            }
            return result;
        }
        private GetScpUrlList(domainName: string, ldapPath: string, maxHops: number[]): List<string> {
            if (maxHops[0] <= 0) {
                throw new ServiceLocalException(Strings.MaxScpHopsExceeded);
            }
            maxHops[0] = maxHops[0] - 1;
            this.TraceMessage(NString.Format("Starting SCP lookup for domainName='{0}', root path='{1}'", domainName, ldapPath));
            var text: string = null;
            var text2: string = null;
            var text3: string = null;
            var list: List<string> = new List<string>();
            var text4: string = (ldapPath === null) ? "LDAP://RootDSE" : (ldapPath + "/RootDSE");
            var directoryEntry: DirectoryEntry = new DirectoryEntry(text4);
            try {
                text3 = (((directoryEntry.get_Properties().get_Item("configurationNamingContext").get_Value() instanceof string) ? <string>directoryEntry.get_Properties().get_Item("configurationNamingContext").get_Value() : null));
            }
            finally {
                if (directoryEntry !== null) {
                    directoryEntry.Dispose();
                }
            }
            var searchResultCollection: SearchResultCollection = null;
            try {
                var directoryEntry2: DirectoryEntry = new DirectoryEntry("LDAP://" + text3);
                try {
                    var directorySearcher: DirectorySearcher = new DirectorySearcher(directoryEntry2);
                    try {
                        directorySearcher.set_Filter("(&(objectClass=serviceConnectionPoint)(|(keywords=67661d7F-8FC4-4fa7-BFAC-E1D7794C1F68)(keywords=77378F46-2C66-4aa9-A6A6-3E7A48B19596)))");
                        directorySearcher.get_PropertiesToLoad().Add("keywords");
                        directorySearcher.get_PropertiesToLoad().Add("serviceBindingInformation");
                        this.TraceMessage(NString.Format("Searching for SCP entries in {0}", directoryEntry2.get_Path()));
                        searchResultCollection = directorySearcher.FindAll();
                    }
                    finally {
                        if (directorySearcher !== null) {
                            directorySearcher.Dispose();
                        }
                    }
                }
                finally {
                    if (directoryEntry2 !== null) {
                        directoryEntry2.Dispose();
                    }
                }
                var text5: string = "Domain=" + domainName;
                this.TraceMessage(NString.Format("Scanning for SCP pointers {0}", text5));
                var enumerator: IEnumerator = searchResultCollection.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var searchResult: SearchResult = <SearchResult>enumerator.Current;
                        var resultPropertyValueCollection: ResultPropertyValueCollection = searchResult.get_Properties().get_Item("keywords");
                        if (ComparisonHelpers.CaseInsensitiveContains(resultPropertyValueCollection, "67661d7F-8FC4-4fa7-BFAC-E1D7794C1F68")) {
                            var text6: string = ((searchResult.get_Properties().get_Item("serviceBindingInformation").get_Item(0) instanceof string) ? <string>searchResult.get_Properties().get_Item("serviceBindingInformation").get_Item(0) : null);
                            if (ComparisonHelpers.CaseInsensitiveContains(resultPropertyValueCollection, text5)) {
                                this.TraceMessage(NString.Format("SCP pointer for '{0}' is found in '{1}', restarting seach in '{2}'", text5, searchResult.get_Path(), text6));
                                var scpUrlList: List<string> = (() => {
                                    var _p0 = [
                                        maxHops[0]
                                    ];
                                    var _r = this.GetScpUrlList(domainName, text6, _p0);
                                    maxHops[0] = _p0[0];
                                    return _r;
                                })();
                                return scpUrlList;
                            }
                            if (resultPropertyValueCollection.Count === 1 && NString.IsNullOrEmpty(text2)) {
                                text2 = text6;
                                this.TraceMessage(NString.Format("Fallback SCP pointer='{0}' for '{1}' is found in '{2}' and saved.", text2, text5, searchResult.get_Path()));
                            }
                        }
                    }
                }
                finally {
                    var disposable: IDisposable = ((enumerator instanceof IDisposable) ? <IDisposable>enumerator : null);
                    if (disposable !== null) {
                        disposable.Dispose();
                    }
                }
                this.TraceMessage(NString.Format("No SCP pointers found for '{0}' in configPath='{1}'", text5, text3));
                var siteName: string = this.GetSiteName();
                if (!NString.IsNullOrEmpty(siteName)) {
                    var text7: string = "Site=";
                    var text8: string = text7 + siteName;
                    var list2: List<string> = new List<string>();
                    this.TraceMessage(NString.Format("Scanning for SCP urls for the current computer {0}", text8));
                    var enumerator2: IEnumerator = searchResultCollection.GetEnumerator();
                    try {
                        while (enumerator2.MoveNext()) {
                            var searchResult2: SearchResult = <SearchResult>enumerator2.Current;
                            var resultPropertyValueCollection2: ResultPropertyValueCollection = searchResult2.get_Properties().get_Item("keywords");
                            if (ComparisonHelpers.CaseInsensitiveContains(resultPropertyValueCollection2, "77378F46-2C66-4aa9-A6A6-3E7A48B19596") && searchResult2.get_Properties().get_Item("serviceBindingInformation").Count > 0) {
                                text = (((searchResult2.get_Properties().get_Item("serviceBindingInformation").get_Item(0) instanceof string) ? <string>searchResult2.get_Properties().get_Item("serviceBindingInformation").get_Item(0) : null));
                                if (ComparisonHelpers.CaseInsensitiveContains(resultPropertyValueCollection2, text8)) {
                                    if (!ComparisonHelpers.CaseInsensitiveContains(list, text)) {
                                        this.TraceMessage(NString.Format("Adding (prio 1) '{0}' for the '{1}' from '{2}' to the top of the list (exact match)", text, text8, searchResult2.get_Path()));
                                        list.Add(text);
                                    }
                                }
                                else {
                                    var flag: boolean = false;
                                    var enumerator3: IEnumerator = resultPropertyValueCollection2.GetEnumerator();
                                    try {
                                        while (enumerator3.MoveNext()) {
                                            var text9: string = <string>enumerator3.Current;
                                            flag = (flag || NString.StartsWith(text9, text7, StringComparison.OrdinalIgnoreCase));
                                        }
                                    }
                                    finally {
                                        var disposable2: IDisposable = ((enumerator3 instanceof IDisposable) ? <IDisposable>enumerator3 : null);
                                        if (disposable2 !== null) {
                                            disposable2.Dispose();
                                        }
                                    }
                                    if (!ComparisonHelpers.CaseInsensitiveContains(list2, text)) {
                                        if (!flag) {
                                            this.TraceMessage(NString.Format("Adding (prio 2) '{0}' from '{1}' to the middle of the list (wildcard)", text, searchResult2.get_Path()));
                                            list2.Insert(0, text);
                                        }
                                        else {
                                            this.TraceMessage(NString.Format("Adding (prio 3) '{0}' from '{1}' to the end of the list (site mismatch)", text, searchResult2.get_Path()));
                                            list2.Add(text);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    finally {
                        var disposable3: IDisposable = ((enumerator2 instanceof IDisposable) ? <IDisposable>enumerator2 : null);
                        if (disposable3 !== null) {
                            disposable3.Dispose();
                        }
                    }
                    if (list2.Count > 0) {
                        var enumerator4: List_Enumerator<string> = list2.GetEnumerator();
                        try {
                            while (enumerator4.MoveNext()) {
                                var current: string = enumerator4.Current;
                                if (!ComparisonHelpers.CaseInsensitiveContains(list, current)) {
                                    list.Add(current);
                                }
                            }
                        }
                        finally {
                            (<IDisposable>enumerator4).Dispose();
                        }
                    }
                }
            }
            finally {
                if (searchResultCollection !== null) {
                    searchResultCollection.Dispose();
                }
            }
            if (list.Count === 0 && !NString.IsNullOrEmpty(text2)) {
                this.TraceMessage(NString.Format("Restarting search for domain '{0}' in SCP fallback pointer '{1}'", domainName, text2));
                return (() => {
                    var _p0 = [
                        maxHops[0]
                    ];
                    var _r = this.GetScpUrlList(domainName, text2, _p0);
                    maxHops[0] = _p0[0];
                    return _r;
                })();
            }
            return list;
        }
        private GetSiteName(): string {
            var result: string;
            try {
                var computerSite: ActiveDirectorySite = ActiveDirectorySite.GetComputerSite();
                try {
                    result = computerSite.get_Name();
                }
                finally {
                    if (computerSite !== null) {
                        computerSite.Dispose();
                    }
                }
            }
            catch (ex_19) {
                if (ex_19 instanceof ActiveDirectoryObjectNotFoundException) {
                    result = null;
                }
                else
                    if (ex_19 instanceof ActiveDirectoryOperationException) {
                        result = null;
                    }
                    else
                        if (ex_19 instanceof ActiveDirectoryServerDownException) {
                            result = null;
                        }
                        else
                            throw ex_19;
            }
            return result;
        }
        private TraceMessage(message: string): void {
            this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, message);
        }
        constructor(service: ExchangeServiceBase) {
            super();
            this.service = service;
        }
    }
    class DomainSettingError {
        private errorCode: AutodiscoverErrorCode = 0;
        private errorMessage: string = null;
        private settingName: string = null;
        get ErrorCode(): AutodiscoverErrorCode {
            return this.errorCode;
        }
        get ErrorMessage(): string {
            return this.errorMessage;
        }
        get SettingName(): string {
            return this.settingName;
        }
        constructor() {
            super();
        }
        LoadFromXml(reader: EwsXmlReader): void {
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "ErrorCode")) {
                        if (!(localName === "ErrorMessage")) {
                            if (localName === "SettingName") {
                                this.settingName = reader.ReadElementValue();
                            }
                        }
                        else {
                            this.errorMessage = reader.ReadElementValue();
                        }
                    }
                    else {
                        this.errorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DomainSettingError"));
        }
    }
    class ProtocolConnection {
        private encryptionMethod: string = null;
        private hostname: string = null;
        private port: number = 0;
        set EncryptionMethod(value: string) {
            this.encryptionMethod = value;
        }
        get EncryptionMethod(): string {
            return this.encryptionMethod;
        }
        set Hostname(value: string) {
            this.hostname = value;
        }
        get Hostname(): string {
            return this.hostname;
        }
        set Port(value: number) {
            this.port = value;
        }
        get Port(): number {
            return this.port;
        }
        constructor();
        constructor(encryptionMethod: string, hostname: string, port: number);
        constructor(encryptionMethod?: string, hostname?: string, port?: number) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(encryptionMethod, hostname, port);
        }
        private constructor_0(): void {
        }
        static LoadFromXml(reader: EwsXmlReader): ProtocolConnection {
            var protocolConnection: ProtocolConnection = new ProtocolConnection();
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "EncryptionMethod")) {
                        if (!(localName === "Hostname")) {
                            if (localName === "Port") {
                                protocolConnection.Port = reader.ReadElementValue<number>();
                            }
                        }
                        else {
                            protocolConnection.Hostname = reader.ReadElementValue<string>();
                        }
                    }
                    else {
                        protocolConnection.EncryptionMethod = reader.ReadElementValue<string>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "ProtocolConnection"));
            return protocolConnection;
        }
        private constructor_1(encryptionMethod: string, hostname: string, port: number): void {
            this.encryptionMethod = encryptionMethod;
            this.hostname = hostname;
            this.port = port;
        }
    }
    class ProtocolConnectionCollection {
        private connections: List<ProtocolConnection> = null;
        set Connections(value: List<ProtocolConnection>) {
            this.connections = value;
        }
        get Connections(): List<ProtocolConnection> {
            return this.connections;
        }
        constructor() {
            super();
            this.connections = new List<ProtocolConnection>();
        }
        static LoadFromXml(reader: EwsXmlReader): ProtocolConnectionCollection {
            var protocolConnectionCollection: ProtocolConnectionCollection = new ProtocolConnectionCollection();
            do {
                reader.Read();
                if (reader.NodeType === 1 && reader.LocalName === "ProtocolConnection") {
                    var protocolConnection: ProtocolConnection = ProtocolConnection.LoadFromXml(reader);
                    if (protocolConnection !== null) {
                        protocolConnectionCollection.Connections.Add(protocolConnection);
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "ProtocolConnections"));
            return protocolConnectionCollection;
        }
    }
    class AutodiscoverRequest {
        private service: AutodiscoverService = null;
        private url: Uri = null;
        get Service(): AutodiscoverService {
            return this.service;
        }
        get Url(): Uri {
            return this.url;
        }
        constructor(service: AutodiscoverService, url: Uri) {
            super();
            this.service = service;
            this.url = url;
        }
        static IsRedirectionResponse(httpWebResponse: IEwsHttpWebResponse): boolean {
            return httpWebResponse.StatusCode === HttpStatusCode.Found || httpWebResponse.StatusCode === HttpStatusCode.MovedPermanently || httpWebResponse.StatusCode === HttpStatusCode.TemporaryRedirect || httpWebResponse.StatusCode === HttpStatusCode.SeeOther;
        }
        Validate(): void {
            this.Service.Validate();
        }
        InternalExecute(): AutodiscoverResponse {
            this.Validate();
            var result: AutodiscoverResponse;
            try {
                var ewsHttpWebRequest: IEwsHttpWebRequest = this.Service.PrepareHttpWebRequestForUrl(this.Url);
                this.Service.TraceHttpRequestHeaders(TraceFlags.AutodiscoverRequestHttpHeaders, ewsHttpWebRequest);
                var flag: boolean = this.Service.Credentials !== null && this.Service.Credentials.NeedSignature;
                var flag2: boolean = this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest);
                var requestStream: Stream = ewsHttpWebRequest.GetRequestStream();
                try {
                    var memoryStream: MemoryStream = new MemoryStream();
                    try {
                        var ewsServiceXmlWriter: EwsServiceXmlWriter = new EwsServiceXmlWriter(this.Service, memoryStream);
                        try {
                            ewsServiceXmlWriter.RequireWSSecurityUtilityNamespace = flag;
                            this.WriteSoapRequest(this.Url, ewsServiceXmlWriter);
                        }
                        finally {
                            if (ewsServiceXmlWriter !== null) {
                                (<IDisposable>ewsServiceXmlWriter).Dispose();
                            }
                        }
                        if (flag) {
                            this.service.Credentials.Sign(memoryStream);
                        }
                        if (flag2) {
                            memoryStream.Position = 0;
                            this.Service.TraceXml(TraceFlags.AutodiscoverRequest, memoryStream);
                        }
                        EwsUtilities.CopyStream(memoryStream, requestStream);
                    }
                    finally {
                        if (memoryStream !== null) {
                            (<IDisposable>memoryStream).Dispose();
                        }
                    }
                }
                finally {
                    if (requestStream !== null) {
                        (<IDisposable>requestStream).Dispose();
                    }
                }
                var response: IEwsHttpWebResponse = ewsHttpWebRequest.GetResponse();
                try {
                    if (AutodiscoverRequest.IsRedirectionResponse(response)) {
                        var autodiscoverResponse: AutodiscoverResponse = this.CreateRedirectionResponse(response);
                        if (autodiscoverResponse === null) {
                            throw new ServiceRemoteException(Strings.InvalidRedirectionResponseReturned);
                        }
                        result = autodiscoverResponse;
                    }
                    else {
                        var responseStream: Stream = AutodiscoverRequest.GetResponseStream(response);
                        try {
                            var memoryStream2: MemoryStream = new MemoryStream();
                            try {
                                EwsUtilities.CopyStream(responseStream, memoryStream2);
                                memoryStream2.Position = 0;
                                this.Service.TraceResponse(response, memoryStream2);
                                var ewsXmlReader: EwsXmlReader = new EwsXmlReader(memoryStream2);
                                ewsXmlReader.Read();
                                if (ewsXmlReader.NodeType === 17) {
                                    ewsXmlReader.ReadStartElement(XmlNamespace.Soap, "Envelope");
                                }
                                else {
                                    if (ewsXmlReader.NodeType !== 1 || ewsXmlReader.LocalName !== "Envelope" || ewsXmlReader.NamespaceUri !== EwsUtilities.GetNamespaceUri(XmlNamespace.Soap)) {
                                        throw new ServiceXmlDeserializationException(Strings.InvalidAutodiscoverServiceResponse);
                                    }
                                }
                                this.ReadSoapHeaders(ewsXmlReader);
                                var autodiscoverResponse2: AutodiscoverResponse = this.ReadSoapBody(ewsXmlReader);
                                ewsXmlReader.ReadEndElement(XmlNamespace.Soap, "Envelope");
                                if (autodiscoverResponse2.ErrorCode !== AutodiscoverErrorCode.NoError) {
                                    throw new AutodiscoverResponseException(autodiscoverResponse2.ErrorCode, autodiscoverResponse2.ErrorMessage);
                                }
                                result = autodiscoverResponse2;
                            }
                            finally {
                                if (memoryStream2 !== null) {
                                    (<IDisposable>memoryStream2).Dispose();
                                }
                            }
                        }
                        finally {
                            if (responseStream !== null) {
                                (<IDisposable>responseStream).Dispose();
                            }
                        }
                    }
                }
                finally {
                    if (response !== null) {
                        response.Dispose();
                    }
                }
            }
            catch (ex) {
                if (ex instanceof WebException) {
                    if (ex.Status === WebExceptionStatus.ProtocolError && ex.Response !== null) {
                        var ewsHttpWebResponse: IEwsHttpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(ex);
                        if (AutodiscoverRequest.IsRedirectionResponse(ewsHttpWebResponse)) {
                            this.Service.ProcessHttpResponseHeaders(TraceFlags.AutodiscoverResponseHttpHeaders, ewsHttpWebResponse);
                            var autodiscoverResponse3: AutodiscoverResponse = this.CreateRedirectionResponse(ewsHttpWebResponse);
                            if (autodiscoverResponse3 !== null) {
                                result = autodiscoverResponse3;
                                return result;
                            }
                        }
                        else {
                            this.ProcessWebException(ex);
                        }
                    }
                    throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex.Message), ex);
                }
                else
                    if (ex instanceof XmlException) {
                        this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("XML parsing error: {0}", ex2.Message));
                        throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex2.Message), ex2);
                    }
                    else
                        if (ex instanceof IOException) {
                            this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("I/O error: {0}", ex3.Message));
                            throw new ServiceRequestException(NString.Format(Strings.ServiceRequestFailed, ex3.Message), ex3);
                        }
                        else
                            throw ex;
            }
            return result;
        }
        private ProcessWebException(webException: WebException): void {
            if (webException.Response !== null) {
                var ewsHttpWebResponse: IEwsHttpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(webException);
                if (ewsHttpWebResponse.StatusCode === HttpStatusCode.InternalServerError) {
                    var IL_B6: number = 1;
                    var _goto: number = 0;
                    _GOTO_LOOP:
                    while (true) {
                        switch (_goto) {
                            default:
                                var soapFaultDetails: SoapFaultDetails;
                                if (this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest)) {
                                    var memoryStream: MemoryStream = new MemoryStream();
                                    try {
                                        var responseStream: Stream = AutodiscoverRequest.GetResponseStream(ewsHttpWebResponse);
                                        try {
                                            EwsUtilities.CopyStream(responseStream, memoryStream);
                                            memoryStream.Position = 0;
                                        }
                                        finally {
                                            if (responseStream !== null) {
                                                (<IDisposable>responseStream).Dispose();
                                            }
                                        }
                                        this.Service.TraceResponse(ewsHttpWebResponse, memoryStream);
                                        var reader: EwsXmlReader = new EwsXmlReader(memoryStream);
                                        soapFaultDetails = this.ReadSoapFault(reader);
                                        _goto = IL_B6;
                                        continue _GOTO_LOOP;
                                    }
                                    finally {
                                        if (memoryStream !== null) {
                                            (<IDisposable>memoryStream).Dispose();
                                        }
                                    }
                                }
                                var responseStream2: Stream = AutodiscoverRequest.GetResponseStream(ewsHttpWebResponse);
                                try {
                                    var reader2: EwsXmlReader = new EwsXmlReader(responseStream2);
                                    soapFaultDetails = this.ReadSoapFault(reader2);
                                }
                                finally {
                                    if (responseStream2 !== null) {
                                        (<IDisposable>responseStream2).Dispose();
                                    }
                                }
                                _goto = IL_B6;
                                continue _GOTO_LOOP;
                            case 1:
                                if (soapFaultDetails !== null) {
                                    throw new ServiceResponseException(new ServiceResponse(soapFaultDetails));
                                }
                                break _GOTO_LOOP;
                        }
                    }
                }
                else {
                    this.Service.ProcessHttpErrorResponse(ewsHttpWebResponse, webException);
                }
            }
        }
        private CreateRedirectionResponse(httpWebResponse: IEwsHttpWebResponse): AutodiscoverResponse {
            var IL_AD: number = 1;
            var _goto: number = 0;
            _GOTO_LOOP:
            while (true) {
                switch (_goto) {
                    default:
                        var text: string = httpWebResponse.Headers.get_Item(HttpResponseHeader.Location);
                        if (!NString.IsNullOrEmpty(text)) {
                            try {
                                var uri: Uri = new Uri(this.Url, text);
                                if (uri.Scheme === Uri.UriSchemeHttp || uri.Scheme === Uri.UriSchemeHttps) {
                                    var autodiscoverResponse: AutodiscoverResponse = this.CreateServiceResponse();
                                    autodiscoverResponse.ErrorCode = AutodiscoverErrorCode.RedirectUrl;
                                    autodiscoverResponse.RedirectionUrl = uri;
                                    return autodiscoverResponse;
                                }
                                this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Invalid redirection URL '{0}' returned by Autodiscover service.", uri));
                                _goto = IL_AD;
                                continue _GOTO_LOOP;
                            }
                            catch (ex_7E) {
                                if (ex_7E instanceof UriFormatException) {
                                    this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, NString.Format("Invalid redirection location '{0}' returned by Autodiscover service.", text));
                                    _goto = IL_AD;
                                    continue _GOTO_LOOP;
                                }
                                else
                                    throw ex_7E;
                            }
                        }
                        this.Service.TraceMessage(TraceFlags.AutodiscoverConfiguration, "Redirection response returned by Autodiscover service without redirection location.");
                        _goto = IL_AD;
                        continue _GOTO_LOOP;
                    case 1:
                        return null;
                }
            }
        }
        private ReadSoapFault(reader: EwsXmlReader): SoapFaultDetails {
            var soapFaultDetails: SoapFaultDetails = null;
            try {
                reader.Read();
                if (reader.NodeType === 17) {
                    reader.Read();
                }
                if (!reader.IsStartElement() || reader.LocalName !== "Envelope") {
                    var result: SoapFaultDetails = soapFaultDetails;
                    return result;
                }
                var namespaceFromUri: XmlNamespace = EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
                if (namespaceFromUri === XmlNamespace.NotSpecified) {
                    var result: SoapFaultDetails = soapFaultDetails;
                    return result;
                }
                reader.Read();
                if (reader.IsStartElement(namespaceFromUri, "Header")) {
                    do {
                        reader.Read();
                    }
                    while (!reader.IsEndElement(namespaceFromUri, "Header"));
                    reader.Read();
                }
                if (reader.IsStartElement(namespaceFromUri, "Body")) {
                    do {
                        reader.Read();
                        if (reader.IsStartElement(namespaceFromUri, "Fault")) {
                            soapFaultDetails = SoapFaultDetails.Parse(reader, namespaceFromUri);
                        }
                    }
                    while (!reader.IsEndElement(namespaceFromUri, "Body"));
                }
                reader.ReadEndElement(namespaceFromUri, "Envelope");
            }
            catch (ex_C0) {
                if (ex_C0 instanceof XmlException) {
                }
                else
                    throw ex_C0;
            }
            return soapFaultDetails;
        }
        WriteSoapRequest(requestUrl: Uri, writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Soap, "Envelope");
            writer.WriteAttributeValue("xmlns", "a", "http://schemas.microsoft.com/exchange/2010/Autodiscover");
            writer.WriteAttributeValue("xmlns", "wsa", "http://www.w3.org/2005/08/addressing");
            writer.WriteAttributeValue("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance");
            if (writer.RequireWSSecurityUtilityNamespace) {
                writer.WriteAttributeValue("xmlns", "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
            }
            writer.WriteStartElement(XmlNamespace.Soap, "Header");
            if (this.Service.Credentials !== null) {
                this.Service.Credentials.EmitExtraSoapHeaderNamespaceAliases(writer.InternalWriter);
            }
            writer.WriteElementValue(XmlNamespace.Autodiscover, "RequestedServerVersion", ExchangeVersion[this.Service.RequestedServerVersion]);
            writer.WriteElementValue(XmlNamespace.WSAddressing, "Action", this.GetWsAddressingActionName());
            writer.WriteElementValue(XmlNamespace.WSAddressing, "To", requestUrl.AbsoluteUri);
            this.WriteExtraCustomSoapHeadersToXml(writer);
            if (this.Service.Credentials !== null) {
                this.Service.Credentials.SerializeWSSecurityHeaders(writer.InternalWriter);
            }
            this.Service.DoOnSerializeCustomSoapHeaders(writer.InternalWriter);
            writer.WriteEndElement();
            writer.WriteStartElement(XmlNamespace.Soap, "Body");
            this.WriteBodyToXml(writer);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.Flush();
        }
        WriteExtraCustomSoapHeadersToXml(writer: EwsServiceXmlWriter): void {
        }
        WriteBodyToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Autodiscover, this.GetRequestXmlElementName());
            this.WriteAttributesToXml(writer);
            this.WriteElementsToXml(writer);
            writer.WriteEndElement();
        }
        static GetResponseStream(response: IEwsHttpWebResponse): Stream {
            var contentEncoding: string = response.ContentEncoding;
            var responseStream: Stream = response.GetResponseStream();
            if (NString.Contains(NString.ToLowerInvariant(contentEncoding), "gzip")) {
                return new GZipStream(responseStream, CompressionMode.Decompress);
            }
            if (NString.Contains(NString.ToLowerInvariant(contentEncoding), "deflate")) {
                return new DeflateStream(responseStream, CompressionMode.Decompress);
            }
            return responseStream;
        }
        ReadSoapHeaders(reader: EwsXmlReader): void {
            reader.ReadStartElement(XmlNamespace.Soap, "Header");
            do {
                reader.Read();
                this.ReadSoapHeader(reader);
            }
            while (!reader.IsEndElement(XmlNamespace.Soap, "Header"));
        }
        ReadSoapHeader(reader: EwsXmlReader): void {
            if (reader.IsStartElement(XmlNamespace.Autodiscover, "ServerVersionInfo")) {
                this.service.ServerInfo = this.ReadServerVersionInfo(reader);
            }
        }
        private ReadServerVersionInfo(reader: EwsXmlReader): ExchangeServerInfo {
            var exchangeServerInfo: ExchangeServerInfo = new ExchangeServerInfo();
            do {
                reader.Read();
                var localName: string;
                if (reader.IsStartElement() && (localName = reader.LocalName) !== null) {
                    if (!(localName === "MajorVersion")) {
                        if (!(localName === "MinorVersion")) {
                            if (!(localName === "MajorBuildNumber")) {
                                if (!(localName === "MinorBuildNumber")) {
                                    if (localName === "Version") {
                                        exchangeServerInfo.VersionString = reader.ReadElementValue();
                                    }
                                }
                                else {
                                    exchangeServerInfo.MinorBuildNumber = reader.ReadElementValue<number>();
                                }
                            }
                            else {
                                exchangeServerInfo.MajorBuildNumber = reader.ReadElementValue<number>();
                            }
                        }
                        else {
                            exchangeServerInfo.MinorVersion = reader.ReadElementValue<number>();
                        }
                    }
                    else {
                        exchangeServerInfo.MajorVersion = reader.ReadElementValue<number>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "ServerVersionInfo"));
            return exchangeServerInfo;
        }
        ReadSoapBody(reader: EwsXmlReader): AutodiscoverResponse {
            reader.ReadStartElement(XmlNamespace.Soap, "Body");
            var result: AutodiscoverResponse = this.LoadFromXml(reader);
            reader.ReadEndElement(XmlNamespace.Soap, "Body");
            return result;
        }
        LoadFromXml(reader: EwsXmlReader): AutodiscoverResponse {
            var responseXmlElementName: string = this.GetResponseXmlElementName();
            reader.ReadStartElement(XmlNamespace.Autodiscover, responseXmlElementName);
            var autodiscoverResponse: AutodiscoverResponse = this.CreateServiceResponse();
            autodiscoverResponse.LoadFromXml(reader, responseXmlElementName);
            return autodiscoverResponse;
        }
        GetRequestXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetResponseXmlElementName(): string {
            throw new NotSupportedException();
        }
        GetWsAddressingActionName(): string {
            throw new NotSupportedException();
        }
        CreateServiceResponse(): AutodiscoverResponse {
            throw new NotSupportedException();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            throw new NotSupportedException();
        }
    }
    class GetDomainSettingsRequest extends AutodiscoverRequest {
        private static GetDomainSettingsActionUri: string = "http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetDomainSettings";
        private domains: List<string> = null;
        private settings: List<DomainSettingName> = null;
        private requestedVersion: Nullable<ExchangeVersion> = null;
        set Domains(value: List<string>) {
            this.domains = value;
        }
        get Domains(): List<string> {
            return this.domains;
        }
        set Settings(value: List<DomainSettingName>) {
            this.settings = value;
        }
        get Settings(): List<DomainSettingName> {
            return this.settings;
        }
        set RequestedVersion(value: Nullable<ExchangeVersion>) {
            this.requestedVersion = value;
        }
        get RequestedVersion(): Nullable<ExchangeVersion> {
            return this.requestedVersion;
        }
        constructor(service: AutodiscoverService, url: Uri) {
            super(service, url);
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.Domains, "domains");
            EwsUtilities.ValidateParam(this.Settings, "settings");
            if (this.Settings.Count === 0) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverSettingsCount);
            }
            if (this.domains.Count === 0) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverDomainsCount);
            }
            var enumerator: List_Enumerator<string> = this.domains.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    if (NString.IsNullOrEmpty(current)) {
                        throw new ServiceValidationException(Strings.InvalidAutodiscoverDomain);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        Execute(): GetDomainSettingsResponseCollection {
            var getDomainSettingsResponseCollection: GetDomainSettingsResponseCollection = <GetDomainSettingsResponseCollection>super.InternalExecute();
            if (getDomainSettingsResponseCollection.ErrorCode === AutodiscoverErrorCode.NoError) {
                this.PostProcessResponses(getDomainSettingsResponseCollection);
            }
            return getDomainSettingsResponseCollection;
        }
        private PostProcessResponses(responses: GetDomainSettingsResponseCollection): void {
            for (var i: number = 0; i < responses.Count; i = i + 1) {
                responses.get_Item(i).Domain = this.Domains.get_Item(i);
            }
        }
        GetRequestXmlElementName(): string {
            return "GetDomainSettingsRequestMessage";
        }
        GetResponseXmlElementName(): string {
            return "GetDomainSettingsResponseMessage";
        }
        GetWsAddressingActionName(): string {
            return "http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetDomainSettings";
        }
        CreateServiceResponse(): AutodiscoverResponse {
            return new GetDomainSettingsResponseCollection();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("xmlns", "a", "http://schemas.microsoft.com/exchange/2010/Autodiscover");
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Autodiscover, "Request");
            writer.WriteStartElement(XmlNamespace.Autodiscover, "Domains");
            var enumerator: List_Enumerator<string> = this.Domains.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    if (!NString.IsNullOrEmpty(current)) {
                        writer.WriteElementValue(XmlNamespace.Autodiscover, "Domain", current);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            writer.WriteStartElement(XmlNamespace.Autodiscover, "RequestedSettings");
            var enumerator2: List_Enumerator<DomainSettingName> = this.settings.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: DomainSettingName = enumerator2.Current;
                    writer.WriteElementValue(XmlNamespace.Autodiscover, "Setting", current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            writer.WriteEndElement();
            if (this.requestedVersion !== null) {
                writer.WriteElementValue(XmlNamespace.Autodiscover, "RequestedVersion", this.requestedVersion.Value);
            }
            writer.WriteEndElement();
        }
    }
    class GetUserSettingsRequest extends AutodiscoverRequest {
        private static GetUserSettingsActionUri: string = "http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetUserSettings";
        private expectPartnerToken: boolean = false;
        SmtpAddresses: List<string> = null;
        Settings: List<UserSettingName> = null;
        PartnerToken: string = null;
        PartnerTokenReference: string = null;
        constructor(service: AutodiscoverService, url: Uri);
        constructor(service: AutodiscoverService, url: Uri, expectPartnerToken: boolean);
        constructor(service: AutodiscoverService, url: Uri, expectPartnerToken?: boolean) {
            super(service, url);
            if (arguments.length === 2 && (service === null || service instanceof AutodiscoverService) && (url === null || url instanceof Uri)) {
                this.constructor_0(service, url);
                return;
            }
            this.constructor_1(service, url, expectPartnerToken);
        }
        private constructor_0(service: AutodiscoverService, url: Uri): void {
            this.constructor_1(service, url, false);
        }
        private constructor_1(service: AutodiscoverService, url: Uri, expectPartnerToken: boolean): void {
            this.expectPartnerToken = expectPartnerToken;
            if (expectPartnerToken && !(url.Scheme === "https")) {
                throw new ServiceValidationException(Strings.HttpsIsRequired);
            }
        }
        Validate(): void {
            super.Validate();
            EwsUtilities.ValidateParam(this.SmtpAddresses, "smtpAddresses");
            EwsUtilities.ValidateParam(this.Settings, "settings");
            if (this.Settings.Count === 0) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverSettingsCount);
            }
            if (this.SmtpAddresses.Count === 0) {
                throw new ServiceValidationException(Strings.InvalidAutodiscoverSmtpAddressesCount);
            }
            var enumerator: List_Enumerator<string> = this.SmtpAddresses.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    if (NString.IsNullOrEmpty(current)) {
                        throw new ServiceValidationException(Strings.InvalidAutodiscoverSmtpAddress);
                    }
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
        }
        Execute(): GetUserSettingsResponseCollection {
            var getUserSettingsResponseCollection: GetUserSettingsResponseCollection = <GetUserSettingsResponseCollection>super.InternalExecute();
            if (getUserSettingsResponseCollection.ErrorCode === AutodiscoverErrorCode.NoError) {
                this.PostProcessResponses(getUserSettingsResponseCollection);
            }
            return getUserSettingsResponseCollection;
        }
        private PostProcessResponses(responses: GetUserSettingsResponseCollection): void {
            for (var i: number = 0; i < responses.Count; i = i + 1) {
                responses.get_Item(i).SmtpAddress = this.SmtpAddresses.get_Item(i);
            }
        }
        GetRequestXmlElementName(): string {
            return "GetUserSettingsRequestMessage";
        }
        GetResponseXmlElementName(): string {
            return "GetUserSettingsResponseMessage";
        }
        GetWsAddressingActionName(): string {
            return "http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetUserSettings";
        }
        CreateServiceResponse(): AutodiscoverResponse {
            return new GetUserSettingsResponseCollection();
        }
        WriteAttributesToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteAttributeValue("xmlns", "a", "http://schemas.microsoft.com/exchange/2010/Autodiscover");
        }
        WriteExtraCustomSoapHeadersToXml(writer: EwsServiceXmlWriter): void {
            if (this.expectPartnerToken) {
                writer.WriteElementValue(XmlNamespace.Autodiscover, "BinarySecret", Convert.ToBase64String(ExchangeServiceBase.SessionKey));
            }
        }
        WriteElementsToXml(writer: EwsServiceXmlWriter): void {
            writer.WriteStartElement(XmlNamespace.Autodiscover, "Request");
            writer.WriteStartElement(XmlNamespace.Autodiscover, "Users");
            var enumerator: List_Enumerator<string> = this.SmtpAddresses.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: string = enumerator.Current;
                    writer.WriteStartElement(XmlNamespace.Autodiscover, "User");
                    if (!NString.IsNullOrEmpty(current)) {
                        writer.WriteElementValue(XmlNamespace.Autodiscover, "Mailbox", current);
                    }
                    writer.WriteEndElement();
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            writer.WriteEndElement();
            writer.WriteStartElement(XmlNamespace.Autodiscover, "RequestedSettings");
            var enumerator2: List_Enumerator<UserSettingName> = this.Settings.GetEnumerator();
            try {
                while (enumerator2.MoveNext()) {
                    var current2: UserSettingName = enumerator2.Current;
                    writer.WriteElementValue(XmlNamespace.Autodiscover, "Setting", current2);
                }
            }
            finally {
                (<IDisposable>enumerator2).Dispose();
            }
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
        ReadSoapHeader(reader: EwsXmlReader): void {
            super.ReadSoapHeader(reader);
            if (this.expectPartnerToken) {
                if (reader.IsStartElement(XmlNamespace.Autodiscover, "PartnerToken")) {
                    this.PartnerToken = reader.ReadInnerXml();
                }
                if (reader.IsStartElement(XmlNamespace.Autodiscover, "PartnerTokenReference")) {
                    this.PartnerTokenReference = reader.ReadInnerXml();
                }
            }
        }
    }
    class GetDomainSettingsResponse extends AutodiscoverResponse {
        private domain: string = null;
        private redirectTarget: string = null;
        private settings: Dictionary<DomainSettingName, any> = null;
        private domainSettingErrors: Collection<DomainSettingError> = null;
        set Domain(value: string) {
            this.domain = value;
        }
        get Domain(): string {
            return this.domain;
        }
        get RedirectTarget(): string {
            return this.redirectTarget;
        }
        get Settings(): IDictionary<DomainSettingName, any> {
            return this.settings;
        }
        get DomainSettingErrors(): Collection<DomainSettingError> {
            return this.domainSettingErrors;
        }
        constructor() {
            super();
            this.domain = NString.Empty;
            this.settings = new Dictionary<DomainSettingName, any>();
            this.domainSettingErrors = new Collection<DomainSettingError>();
        }
        LoadFromXml(reader: EwsXmlReader, endElementName: string): void {
            do {
                var IL_6A: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                if ((localName = reader.LocalName) !== null) {
                                    if (localName === "RedirectTarget") {
                                        this.redirectTarget = reader.ReadElementValue();
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "DomainSettingErrors") {
                                        this.LoadDomainSettingErrorsFromXml(reader);
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "DomainSettings") {
                                        this.LoadDomainSettingsFromXml(reader);
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                }
                                super.LoadFromXml(reader, endElementName);
                            }
                            _goto = IL_6A;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, endElementName));
        }
        LoadDomainSettingsFromXml(reader: EwsXmlReader): void {
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === "DomainSetting") {
                        var text: string = reader.ReadAttributeValue(XmlNamespace.XmlSchemaInstance, "type");
                        var a: string;
                        if ((a = text) !== null && a === "DomainStringSetting") {
                            this.ReadSettingFromXml(reader);
                        }
                        else {
                            EwsUtilities.Assert(false, "GetDomainSettingsResponse.LoadDomainSettingsFromXml", NString.Format("Invalid setting class '{0}' returned", text));
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DomainSettings"));
            }
        }
        private ReadSettingFromXml(reader: EwsXmlReader): void {
            var domainSettingName: Nullable<DomainSettingName> = new Nullable<DomainSettingName>();
            var value: any = null;
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "Name")) {
                        if (localName === "Value") {
                            value = reader.ReadElementValue();
                        }
                    }
                    else {
                        domainSettingName = new Nullable<DomainSettingName>(reader.ReadElementValue<DomainSettingName>());
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DomainSetting"));
            EwsUtilities.Assert(domainSettingName !== null, "GetDomainSettingsResponse.ReadSettingFromXml", "Missing name element in domain setting");
            this.settings.Add(domainSettingName.Value, value);
        }
        private LoadDomainSettingErrorsFromXml(reader: EwsXmlReader): void {
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === "DomainSettingError") {
                        var domainSettingError: DomainSettingError = new DomainSettingError();
                        domainSettingError.LoadFromXml(reader);
                        this.domainSettingErrors.Add(domainSettingError);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DomainSettingErrors"));
            }
        }
    }
    class GetDomainSettingsResponseCollection extends AutodiscoverResponseCollection<GetDomainSettingsResponse>
    {
        constructor() {
            super();
        }
        CreateResponseInstance(): GetDomainSettingsResponse {
            return new GetDomainSettingsResponse();
        }
        GetResponseCollectionXmlElementName(): string {
            return "DomainResponses";
        }
        GetResponseInstanceXmlElementName(): string {
            return "DomainResponse";
        }
    }
    class GetUserSettingsResponse extends AutodiscoverResponse {
        SmtpAddress: string = null;
        RedirectTarget: string = null;
        Settings: IDictionary<UserSettingName, any> = null;
        UserSettingErrors: Collection<UserSettingError> = null;
        constructor() {
            super();
            this.SmtpAddress = NString.Empty;
            this.Settings = new Dictionary<UserSettingName, any>();
            this.UserSettingErrors = new Collection<UserSettingError>();
        }
        TryGetSettingValue<T>(setting: UserSettingName, value: T[]): boolean {
            var obj: any;
            if ((() => {
                var _p0 = [
                    obj
                ];
                var _r = this.Settings.TryGetValue(setting, _p0);
                obj = _p0[0];
                return _r;
            })()) {
                value[0] = <T>(<any>obj);
                return true;
            }
            value[0] = null;
            return false;
        }
        LoadFromXml(reader: EwsXmlReader, endElementName: string): void {
            do {
                var IL_6A: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                if ((localName = reader.LocalName) !== null) {
                                    if (localName === "RedirectTarget") {
                                        this.RedirectTarget = reader.ReadElementValue();
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "UserSettingErrors") {
                                        this.LoadUserSettingErrorsFromXml(reader);
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "UserSettings") {
                                        this.LoadUserSettingsFromXml(reader);
                                        _goto = IL_6A;
                                        continue _GOTO_LOOP;
                                    }
                                }
                                super.LoadFromXml(reader, endElementName);
                            }
                            _goto = IL_6A;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, endElementName));
        }
        LoadUserSettingsFromXml(reader: EwsXmlReader): void {
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === "UserSetting") {
                        var text: string = reader.ReadAttributeValue(XmlNamespace.XmlSchemaInstance, "type");
                        var a: string;
                        if ((a = text) !== null && (a === "StringSetting" || a === "WebClientUrlCollectionSetting" || a === "AlternateMailboxCollectionSetting" || a === "ProtocolConnectionCollectionSetting" || a === "DocumentSharingLocationCollectionSetting")) {
                            this.ReadSettingFromXml(reader);
                        }
                        else {
                            EwsUtilities.Assert(false, "GetUserSettingsResponse.LoadUserSettingsFromXml", NString.Format("Invalid setting class '{0}' returned", text));
                        }
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Autodiscover, "UserSettings"));
            }
        }
        private ReadSettingFromXml(reader: EwsXmlReader): void {
            var value: string = null;
            var value2: any = null;
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "Name")) {
                        if (!(localName === "Value")) {
                            if (!(localName === "WebClientUrls")) {
                                if (!(localName === "ProtocolConnections")) {
                                    if (!(localName === "AlternateMailboxes")) {
                                        if (localName === "DocumentSharingLocations") {
                                            value2 = DocumentSharingLocationCollection.LoadFromXml(reader);
                                        }
                                    }
                                    else {
                                        value2 = AlternateMailboxCollection.LoadFromXml(reader);
                                    }
                                }
                                else {
                                    value2 = ProtocolConnectionCollection.LoadFromXml(reader);
                                }
                            }
                            else {
                                value2 = WebClientUrlCollection.LoadFromXml(reader);
                            }
                        }
                        else {
                            value2 = reader.ReadElementValue();
                        }
                    }
                    else {
                        value = reader.ReadElementValue<string>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "UserSetting"));
            try {
                var key: UserSettingName = EwsUtilities.Parse<UserSettingName>(value);
                this.Settings.Add(key, value2);
            }
            catch (ex_CF) {
                if (ex_CF instanceof ArgumentException) {
                    EwsUtilities.Assert(false, "GetUserSettingsResponse.ReadSettingFromXml", "Unexpected or empty name element in user setting");
                }
                else
                    throw ex_CF;
            }
        }
        private LoadUserSettingErrorsFromXml(reader: EwsXmlReader): void {
            if (!reader.IsEmptyElement) {
                do {
                    reader.Read();
                    if (reader.NodeType === 1 && reader.LocalName === "UserSettingError") {
                        var userSettingError: UserSettingError = new UserSettingError();
                        userSettingError.LoadFromXml(reader);
                        this.UserSettingErrors.Add(userSettingError);
                    }
                }
                while (!reader.IsEndElement(XmlNamespace.Autodiscover, "UserSettingErrors"));
            }
        }
    }
    class GetUserSettingsResponseCollection extends AutodiscoverResponseCollection<GetUserSettingsResponse>
    {
        constructor() {
            super();
        }
        CreateResponseInstance(): GetUserSettingsResponse {
            return new GetUserSettingsResponse();
        }
        GetResponseCollectionXmlElementName(): string {
            return "UserResponses";
        }
        GetResponseInstanceXmlElementName(): string {
            return "UserResponse";
        }
    }
    class DocumentSharingLocation {
        private serviceUrl: string = null;
        private locationUrl: string = null;
        private displayName: string = null;
        private supportedFileExtensions: IEnumerable<string> = null;
        private externalAccessAllowed: boolean = false;
        private anonymousAccessAllowed: boolean = false;
        private canModifyPermissions: boolean = false;
        private isDefault: boolean = false;
        set ServiceUrl(value: string) {
            this.serviceUrl = value;
        }
        get ServiceUrl(): string {
            return this.serviceUrl;
        }
        set LocationUrl(value: string) {
            this.locationUrl = value;
        }
        get LocationUrl(): string {
            return this.locationUrl;
        }
        set DisplayName(value: string) {
            this.displayName = value;
        }
        get DisplayName(): string {
            return this.displayName;
        }
        set SupportedFileExtensions(value: IEnumerable<string>) {
            this.supportedFileExtensions = value;
        }
        get SupportedFileExtensions(): IEnumerable<string> {
            return this.supportedFileExtensions;
        }
        set ExternalAccessAllowed(value: boolean) {
            this.externalAccessAllowed = value;
        }
        get ExternalAccessAllowed(): boolean {
            return this.externalAccessAllowed;
        }
        set AnonymousAccessAllowed(value: boolean) {
            this.anonymousAccessAllowed = value;
        }
        get AnonymousAccessAllowed(): boolean {
            return this.anonymousAccessAllowed;
        }
        set CanModifyPermissions(value: boolean) {
            this.canModifyPermissions = value;
        }
        get CanModifyPermissions(): boolean {
            return this.canModifyPermissions;
        }
        set IsDefault(value: boolean) {
            this.isDefault = value;
        }
        get IsDefault(): boolean {
            return this.isDefault;
        }
        constructor() {
            super();
        }
        static LoadFromXml(reader: EwsXmlReader): DocumentSharingLocation {
            var documentSharingLocation: DocumentSharingLocation = new DocumentSharingLocation();
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (_PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x6000149 - 1 === null)
                    {
                        var expr_34: Dictionary<string, number> = new Dictionary<string, number>(8);
                        expr_34.Add("ServiceUrl", 0);
                        expr_34.Add("LocationUrl", 1);
                        expr_34.Add("DisplayName", 2);
                        expr_34.Add("SupportedFileExtensions", 3);
                        expr_34.Add("ExternalAccessAllowed", 4);
                        expr_34.Add("AnonymousAccessAllowed", 5);
                        expr_34.Add("CanModifyPermissions", 6);
                        expr_34.Add("IsDefault", 7);
                        _PrivateImplementationDetails_{70549B87- FCC0 - 4468 - A58C - F62EC848C70D }.$$method0x6000149 - 1 = expr_34;
                    }
                    var num: number;
                    if ((() => {
                        var _p0 = [
                            num
                        ];
                        var _r = _PrivateImplementationDetails_{70549B87-FCC0 - 4468 - A58C - F62EC848C70D}.$$method0x6000149-1.TryGetValue(localName, _p0);
                        num = _p0[0];
                        return _r;
                    })()) {
                        switch (num) {
                            case 0:
                                documentSharingLocation.ServiceUrl = reader.ReadElementValue<string>();
                                break;
                            case 1:
                                documentSharingLocation.LocationUrl = reader.ReadElementValue<string>();
                                break;
                            case 2:
                                documentSharingLocation.DisplayName = reader.ReadElementValue<string>();
                                break;
                            case 3:
                                {
                                    var list: List<string> = new List<string>();
                                    reader.Read();
                                    while (reader.IsStartElement(XmlNamespace.Autodiscover, "FileExtension")) {
                                        var item: string = reader.ReadElementValue<string>();
                                        list.Add(item);
                                        reader.Read();
                                    }
                                    documentSharingLocation.SupportedFileExtensions = list;
                                    break;
                                }
                            case 4:
                                documentSharingLocation.ExternalAccessAllowed = reader.ReadElementValue<boolean>();
                                break;
                            case 5:
                                documentSharingLocation.AnonymousAccessAllowed = reader.ReadElementValue<boolean>();
                                break;
                            case 6:
                                documentSharingLocation.CanModifyPermissions = reader.ReadElementValue<boolean>();
                                break;
                            case 7:
                                documentSharingLocation.IsDefault = reader.ReadElementValue<boolean>();
                                break;
                        }
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DocumentSharingLocation"));
            return documentSharingLocation;
        }
    }
    class DocumentSharingLocationCollection {
        Entries: List<DocumentSharingLocation> = null;
        constructor() {
            super();
            this.Entries = new List<DocumentSharingLocation>();
        }
        static LoadFromXml(reader: EwsXmlReader): DocumentSharingLocationCollection {
            var documentSharingLocationCollection: DocumentSharingLocationCollection = new DocumentSharingLocationCollection();
            do {
                reader.Read();
                if (reader.NodeType === 1 && reader.LocalName === "DocumentSharingLocation") {
                    var item: DocumentSharingLocation = DocumentSharingLocation.LoadFromXml(reader);
                    documentSharingLocationCollection.Entries.Add(item);
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "DocumentSharingLocations"));
            return documentSharingLocationCollection;
        }
    }
    class UserSettingError {
        ErrorCode: AutodiscoverErrorCode = 0;
        ErrorMessage: string = null;
        SettingName: string = null;
        constructor();
        constructor(errorCode: AutodiscoverErrorCode, errorMessage: string, settingName: string);
        constructor(errorCode?: AutodiscoverErrorCode, errorMessage?: string, settingName?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(errorCode, errorMessage, settingName);
        }
        private constructor_0(): void {
        }
        private constructor_1(errorCode: AutodiscoverErrorCode, errorMessage: string, settingName: string): void {
            this.ErrorCode = errorCode;
            this.ErrorMessage = errorMessage;
            this.SettingName = settingName;
        }
        LoadFromXml(reader: EwsXmlReader): void {
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "ErrorCode")) {
                        if (!(localName === "ErrorMessage")) {
                            if (localName === "SettingName") {
                                this.SettingName = reader.ReadElementValue();
                            }
                        }
                        else {
                            this.ErrorMessage = reader.ReadElementValue();
                        }
                    }
                    else {
                        this.ErrorCode = reader.ReadElementValue<AutodiscoverErrorCode>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "UserSettingError"));
        }
    }
    class WebClientUrl {
        private authenticationMethods: string = null;
        private url: string = null;
        set AuthenticationMethods(value: string) {
            this.authenticationMethods = value;
        }
        get AuthenticationMethods(): string {
            return this.authenticationMethods;
        }
        set Url(value: string) {
            this.url = value;
        }
        get Url(): string {
            return this.url;
        }
        constructor();
        constructor(authenticationMethods: string, url: string);
        constructor(authenticationMethods?: string, url?: string) {
            super();
            if (arguments.length === 0) {
                this.constructor_0();
                return;
            }
            this.constructor_1(authenticationMethods, url);
        }
        private constructor_0(): void {
        }
        private constructor_1(authenticationMethods: string, url: string): void {
            this.authenticationMethods = authenticationMethods;
            this.url = url;
        }
        static LoadFromXml(reader: EwsXmlReader): WebClientUrl {
            var webClientUrl: WebClientUrl = new WebClientUrl();
            do {
                reader.Read();
                var localName: string;
                if (reader.NodeType === 1 && (localName = reader.LocalName) !== null) {
                    if (!(localName === "AuthenticationMethods")) {
                        if (localName === "Url") {
                            webClientUrl.Url = reader.ReadElementValue<string>();
                        }
                    }
                    else {
                        webClientUrl.AuthenticationMethods = reader.ReadElementValue<string>();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "WebClientUrl"));
            return webClientUrl;
        }
    }
    class WebClientUrlCollection {
        private urls: List<WebClientUrl> = null;
        get Urls(): List<WebClientUrl> {
            return this.urls;
        }
        constructor() {
            super();
            this.urls = new List<WebClientUrl>();
        }
        static LoadFromXml(reader: EwsXmlReader): WebClientUrlCollection {
            var webClientUrlCollection: WebClientUrlCollection = new WebClientUrlCollection();
            do {
                reader.Read();
                if (reader.NodeType === 1 && reader.LocalName === "WebClientUrl") {
                    webClientUrlCollection.Urls.Add(WebClientUrl.LoadFromXml(reader));
                }
            }
            while (!reader.IsEndElement(XmlNamespace.Autodiscover, "WebClientUrls"));
            return webClientUrlCollection;
        }
    }
    class ConfigurationSettingsBase {
        private error: AutodiscoverError = null;
        ResponseType: AutodiscoverResponseType = 0;
        RedirectTarget: string = null;
        get Error(): AutodiscoverError {
            return this.error;
        }
        constructor() {
            super();
        }
        TryReadCurrentXmlElement(reader: EwsXmlReader): boolean {
            if (reader.LocalName === "Error") {
                this.error = AutodiscoverError.Parse(reader);
                return true;
            }
            return false;
        }
        LoadFromXml(reader: EwsXmlReader): void {
            reader.ReadStartElement(XmlNamespace.NotSpecified, "Autodiscover");
            reader.ReadStartElement(XmlNamespace.NotSpecified, "Response");
            do {
                reader.Read();
                if (reader.IsStartElement() && !this.TryReadCurrentXmlElement(reader)) {
                    reader.SkipCurrentElement();
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, "Response"));
            reader.ReadEndElement(XmlNamespace.NotSpecified, "Autodiscover");
        }
        GetNamespace(): string {
            throw new NotSupportedException();
        }
        MakeRedirectionResponse(redirectUrl: Uri): void {
            throw new NotSupportedException();
        }
        ConvertSettings(smtpAddress: string, requestedSettings: List<UserSettingName>): GetUserSettingsResponse {
            throw new NotSupportedException();
        }
    }
    class OutlookAccount {
        private static Settings: string = "settings";
        private static RedirectAddr: string = "redirectAddr";
        private static RedirectUrl: string = "redirectUrl";
        private protocols: Dictionary<OutlookProtocolType, OutlookProtocol> = null;
        private alternateMailboxes: AlternateMailboxCollection = null;
        AccountType: string = null;
        ResponseType: AutodiscoverResponseType = 0;
        RedirectTarget: string = null;
        constructor() {
            super();
            this.protocols = new Dictionary<OutlookProtocolType, OutlookProtocol>();
            this.alternateMailboxes = new AlternateMailboxCollection();
        }
        LoadFromXml(reader: EwsXmlReader): void {
            while (true) {
                var IL_19B: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                switch (localName = reader.LocalName) {
                                    case "AccountType":
                                        this.AccountType = reader.ReadElementValue();
                                        _goto = IL_19B;
                                        continue _GOTO_LOOP;
                                    case "Action":
                                        var text: string = reader.ReadElementValue();
                                        var a: string;
                                        if ((a = text) !== null) {
                                            if (a === "settings") {
                                                this.ResponseType = AutodiscoverResponseType.Success;
                                                _goto = IL_19B;
                                                continue _GOTO_LOOP;
                                            }
                                            if (a === "redirectUrl") {
                                                this.ResponseType = AutodiscoverResponseType.RedirectUrl;
                                                _goto = IL_19B;
                                                continue _GOTO_LOOP;
                                            }
                                            if (a === "redirectAddr") {
                                                this.ResponseType = AutodiscoverResponseType.RedirectAddress;
                                                _goto = IL_19B;
                                                continue _GOTO_LOOP;
                                            }
                                        }
                                        this.ResponseType = AutodiscoverResponseType.Error;
                                        _goto = IL_19B;
                                        continue _GOTO_LOOP;
                                    case "Protocol":
                                        var outlookProtocol: OutlookProtocol = new OutlookProtocol();
                                        outlookProtocol.LoadFromXml(reader);
                                        if (this.protocols.ContainsKey(outlookProtocol.ProtocolType)) {
                                            throw new ServiceLocalException(Strings.InvalidAutodiscoverServiceResponse);
                                        }
                                        this.protocols.Add(outlookProtocol.ProtocolType, outlookProtocol);
                                        _goto = IL_19B;
                                        continue _GOTO_LOOP;
                                    case "RedirectAddr":
                                    case "RedirectUrl":
                                        this.RedirectTarget = reader.ReadElementValue();
                                        _goto = IL_19B;
                                        continue _GOTO_LOOP;
                                    case "AlternateMailboxes":
                                        var item: AlternateMailbox = AlternateMailbox.LoadFromXml(reader);
                                        this.alternateMailboxes.Entries.Add(item);
                                        _goto = IL_19B;
                                        continue _GOTO_LOOP;
                                }
                                reader.SkipCurrentElement();
                            }
                            _goto = IL_19B;
                            continue _GOTO_LOOP;
                        case 1:
                            if (reader.IsEndElement(XmlNamespace.NotSpecified, "Account")) {
                                return;
                            }
                            break _GOTO_LOOP;
                    }
                }
            }
            throw new ServiceLocalException(Strings.InvalidAutodiscoverServiceResponse);
        }
        ConvertToUserSettings(requestedSettings: List<UserSettingName>, response: GetUserSettingsResponse): void {
            var enumerator: Dictionary_ValueCollection_Enumerator<OutlookProtocolType, OutlookProtocol> = this.protocols.Values.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: OutlookProtocol = enumerator.Current;
                    current.ConvertToUserSettings(requestedSettings, response);
                }
            }
            finally {
                (<IDisposable>enumerator).Dispose();
            }
            if (requestedSettings.Contains(UserSettingName.AlternateMailboxes)) {
                response.Settings.set_Item(UserSettingName.AlternateMailboxes, this.alternateMailboxes);
            }
        }
    }
    class OutlookConfigurationSettings extends ConfigurationSettingsBase {
        private static allOutlookProviderSettings: LazyMember<List<UserSettingName>> = new LazyMember<List<UserSettingName>>(() => {
            var list: List<UserSettingName> = new List<UserSettingName>();
            list.AddRange(OutlookUser.AvailableUserSettings);
            list.AddRange(OutlookProtocol.AvailableUserSettings);
            list.Add(UserSettingName.AlternateMailboxes);
            return list;
        });
        private user: OutlookUser = null;
        private account: OutlookAccount = null;
        get ResponseType(): AutodiscoverResponseType {
            if (this.account !== null) {
                return this.account.ResponseType;
            }
            return AutodiscoverResponseType.Error;
        }
        get RedirectTarget(): string {
            return this.account.RedirectTarget;
        }
        constructor() {
            super();
            this.user = new OutlookUser();
            this.account = new OutlookAccount();
        }
        static IsAvailableUserSetting(setting: UserSettingName): boolean {
            return OutlookConfigurationSettings.allOutlookProviderSettings.Member.Contains(setting);
        }
        GetNamespace(): string {
            return "http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a";
        }
        MakeRedirectionResponse(redirectUrl: Uri): void {
            var outlookAccount: OutlookAccount = new OutlookAccount();
            outlookAccount.RedirectTarget = redirectUrl.ToString();
            outlookAccount.ResponseType = AutodiscoverResponseType.RedirectUrl;
            this.account = outlookAccount;
        }
        TryReadCurrentXmlElement(reader: EwsXmlReader): boolean {
            if (!super.TryReadCurrentXmlElement(reader)) {
                var localName: string;
                if ((localName = reader.LocalName) !== null) {
                    if (localName === "User") {
                        this.user.LoadFromXml(reader);
                        return true;
                    }
                    if (localName === "Account") {
                        this.account.LoadFromXml(reader);
                        return true;
                    }
                }
                reader.SkipCurrentElement();
                return false;
            }
            return true;
        }
        ConvertSettings(smtpAddress: string, requestedSettings: List<UserSettingName>): GetUserSettingsResponse {
            var getUserSettingsResponse: GetUserSettingsResponse = new GetUserSettingsResponse();
            getUserSettingsResponse.SmtpAddress = smtpAddress;
            if (this.Error !== null) {
                getUserSettingsResponse.ErrorCode = AutodiscoverErrorCode.InternalServerError;
                getUserSettingsResponse.ErrorMessage = this.Error.Message;
            }
            else {
                switch (this.ResponseType) {
                    case AutodiscoverResponseType.Error:
                        getUserSettingsResponse.ErrorCode = AutodiscoverErrorCode.InternalServerError;
                        getUserSettingsResponse.ErrorMessage = Strings.InvalidAutodiscoverServiceResponse;
                        break;
                    case AutodiscoverResponseType.RedirectUrl:
                        getUserSettingsResponse.ErrorCode = AutodiscoverErrorCode.RedirectUrl;
                        getUserSettingsResponse.ErrorMessage = NString.Empty;
                        getUserSettingsResponse.RedirectTarget = this.RedirectTarget;
                        break;
                    case AutodiscoverResponseType.RedirectAddress:
                        getUserSettingsResponse.ErrorCode = AutodiscoverErrorCode.RedirectAddress;
                        getUserSettingsResponse.ErrorMessage = NString.Empty;
                        getUserSettingsResponse.RedirectTarget = this.RedirectTarget;
                        break;
                    case AutodiscoverResponseType.Success:
                        getUserSettingsResponse.ErrorCode = AutodiscoverErrorCode.NoError;
                        getUserSettingsResponse.ErrorMessage = NString.Empty;
                        this.user.ConvertToUserSettings(requestedSettings, getUserSettingsResponse);
                        this.account.ConvertToUserSettings(requestedSettings, getUserSettingsResponse);
                        this.ReportUnsupportedSettings(requestedSettings, getUserSettingsResponse);
                        break;
                    default:
                        EwsUtilities.Assert(false, "OutlookConfigurationSettings.ConvertSettings", "An unexpected error has occured. This code path should never be reached.");
                        break;
                }
            }
            return getUserSettingsResponse;
        }
        private ReportUnsupportedSettings(requestedSettings: List<UserSettingName>, response: GetUserSettingsResponse): void {
            var enumerable: IEnumerable<UserSettingName> = Enumerable.Where<UserSettingName>(requestedSettings, (setting: UserSettingName) => { return !OutlookConfigurationSettings.IsAvailableUserSetting(setting); });
            var enumerator: IEnumerator<UserSettingName> = enumerable.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: UserSettingName = enumerator.Current;
                    var userSettingError: UserSettingError = new UserSettingError();
                    userSettingError.ErrorCode = AutodiscoverErrorCode.InvalidSetting;
                    userSettingError.SettingName = UserSettingName[current];
                    userSettingError.ErrorMessage = NString.Format(Strings.AutodiscoverInvalidSettingForOutlookProvider, UserSettingName[current]);
                    var item: UserSettingError = userSettingError;
                    response.UserSettingErrors.Add(item);
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
    }
    class OutlookProtocol {
        private static EXCH: string = "EXCH";
        private static EXPR: string = "EXPR";
        private static WEB: string = "WEB";
        private static commonProtocolSettings: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var dictionary: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            dictionary.Add(UserSettingName.EcpDeliveryReportUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlMt; });
            dictionary.Add(UserSettingName.EcpEmailSubscriptionsUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlAggr; });
            dictionary.Add(UserSettingName.EcpPublishingUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlPublish; });
            dictionary.Add(UserSettingName.EcpPhotoUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlPhoto; });
            dictionary.Add(UserSettingName.EcpRetentionPolicyTagsUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlRet; });
            dictionary.Add(UserSettingName.EcpTextMessagingUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlSms; });
            dictionary.Add(UserSettingName.EcpVoicemailUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlUm; });
            dictionary.Add(UserSettingName.EcpConnectUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlConnect; });
            dictionary.Add(UserSettingName.EcpTeamMailboxUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlTm; });
            dictionary.Add(UserSettingName.EcpTeamMailboxCreatingUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlTmCreating; });
            dictionary.Add(UserSettingName.EcpTeamMailboxEditingUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlTmEditing; });
            dictionary.Add(UserSettingName.EcpExtensionInstallationUrlFragment, (p: OutlookProtocol) => { return p.ecpUrlExtInstall; });
            dictionary.Add(UserSettingName.SiteMailboxCreationURL, (p: OutlookProtocol) => { return p.siteMailboxCreationURL; });
            return dictionary;
        });
        private static internalProtocolSettings: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var dictionary: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            dictionary.Add(UserSettingName.ActiveDirectoryServer, (p: OutlookProtocol) => { return p.activeDirectoryServer; });
            dictionary.Add(UserSettingName.CrossOrganizationSharingEnabled, (p: OutlookProtocol) => { return NBoolean.ToString(p.sharingEnabled); });
            dictionary.Add(UserSettingName.InternalEcpUrl, (p: OutlookProtocol) => { return p.ecpUrl; });
            dictionary.Add(UserSettingName.InternalEcpDeliveryReportUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlMt); });
            dictionary.Add(UserSettingName.InternalEcpEmailSubscriptionsUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlAggr); });
            dictionary.Add(UserSettingName.InternalEcpPublishingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlPublish); });
            dictionary.Add(UserSettingName.InternalEcpPhotoUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlPhoto); });
            dictionary.Add(UserSettingName.InternalEcpRetentionPolicyTagsUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlRet); });
            dictionary.Add(UserSettingName.InternalEcpTextMessagingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlSms); });
            dictionary.Add(UserSettingName.InternalEcpVoicemailUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlUm); });
            dictionary.Add(UserSettingName.InternalEcpConnectUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlConnect); });
            dictionary.Add(UserSettingName.InternalEcpTeamMailboxUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTm); });
            dictionary.Add(UserSettingName.InternalEcpTeamMailboxCreatingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmCreating); });
            dictionary.Add(UserSettingName.InternalEcpTeamMailboxEditingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmEditing); });
            dictionary.Add(UserSettingName.InternalEcpTeamMailboxHidingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmHiding); });
            dictionary.Add(UserSettingName.InternalEcpExtensionInstallationUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlExtInstall); });
            dictionary.Add(UserSettingName.InternalEwsUrl, (p: OutlookProtocol) => { return p.exchangeWebServicesUrl || p.availabilityServiceUrl; });
            dictionary.Add(UserSettingName.InternalEmwsUrl, (p: OutlookProtocol) => { return p.exchangeManagementWebServicesUrl; });
            dictionary.Add(UserSettingName.InternalMailboxServerDN, (p: OutlookProtocol) => { return p.serverDN; });
            dictionary.Add(UserSettingName.InternalRpcClientServer, (p: OutlookProtocol) => { return p.server; });
            dictionary.Add(UserSettingName.InternalOABUrl, (p: OutlookProtocol) => { return p.offlineAddressBookUrl; });
            dictionary.Add(UserSettingName.InternalUMUrl, (p: OutlookProtocol) => { return p.unifiedMessagingUrl; });
            dictionary.Add(UserSettingName.MailboxDN, (p: OutlookProtocol) => { return p.mailboxDN; });
            dictionary.Add(UserSettingName.PublicFolderServer, (p: OutlookProtocol) => { return p.publicFolderServer; });
            dictionary.Add(UserSettingName.InternalServerExclusiveConnect, (p: OutlookProtocol) => { return p.serverExclusiveConnect; });
            return dictionary;
        });
        private static externalProtocolSettings: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var dictionary: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            dictionary.Add(UserSettingName.ExternalEcpDeliveryReportUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlRet); });
            dictionary.Add(UserSettingName.ExternalEcpEmailSubscriptionsUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlAggr); });
            dictionary.Add(UserSettingName.ExternalEcpPublishingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlPublish); });
            dictionary.Add(UserSettingName.ExternalEcpPhotoUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlPhoto); });
            dictionary.Add(UserSettingName.ExternalEcpRetentionPolicyTagsUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlRet); });
            dictionary.Add(UserSettingName.ExternalEcpTextMessagingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlSms); });
            dictionary.Add(UserSettingName.ExternalEcpUrl, (p: OutlookProtocol) => { return p.ecpUrl; });
            dictionary.Add(UserSettingName.ExternalEcpVoicemailUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlUm); });
            dictionary.Add(UserSettingName.ExternalEcpConnectUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlConnect); });
            dictionary.Add(UserSettingName.ExternalEcpTeamMailboxUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTm); });
            dictionary.Add(UserSettingName.ExternalEcpTeamMailboxCreatingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmCreating); });
            dictionary.Add(UserSettingName.ExternalEcpTeamMailboxEditingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmEditing); });
            dictionary.Add(UserSettingName.ExternalEcpTeamMailboxHidingUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlTmHiding); });
            dictionary.Add(UserSettingName.ExternalEcpExtensionInstallationUrl, (p: OutlookProtocol) => { return p.ConvertEcpFragmentToUrl(p.ecpUrlExtInstall); });
            dictionary.Add(UserSettingName.ExternalEwsUrl, (p: OutlookProtocol) => { return p.exchangeWebServicesUrl || p.availabilityServiceUrl; });
            dictionary.Add(UserSettingName.ExternalEmwsUrl, (p: OutlookProtocol) => { return p.exchangeManagementWebServicesUrl; });
            dictionary.Add(UserSettingName.ExternalMailboxServer, (p: OutlookProtocol) => { return p.server; });
            dictionary.Add(UserSettingName.ExternalMailboxServerAuthenticationMethods, (p: OutlookProtocol) => { return p.authPackage; });
            dictionary.Add(UserSettingName.ExternalMailboxServerRequiresSSL, (p: OutlookProtocol) => { return NBoolean.ToString(p.sslEnabled); });
            dictionary.Add(UserSettingName.ExternalOABUrl, (p: OutlookProtocol) => { return p.offlineAddressBookUrl; });
            dictionary.Add(UserSettingName.ExternalUMUrl, (p: OutlookProtocol) => { return p.unifiedMessagingUrl; });
            dictionary.Add(UserSettingName.ExchangeRpcUrl, (p: OutlookProtocol) => { return p.exchangeRpcUrl; });
            dictionary.Add(UserSettingName.EwsPartnerUrl, (p: OutlookProtocol) => { return p.exchangeWebServicesPartnerUrl; });
            dictionary.Add(UserSettingName.ExternalServerExclusiveConnect, (p: OutlookProtocol) => { return NBoolean.ToString(p.serverExclusiveConnect); });
            dictionary.Add(UserSettingName.CertPrincipalName, (p: OutlookProtocol) => { return p.certPrincipalName; });
            dictionary.Add(UserSettingName.GroupingInformation, (p: OutlookProtocol) => { return p.groupingInformation; });
            return dictionary;
        });
        private static internalProtocolConverterDictionary: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var results: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            Enumerable.ToList<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>>(OutlookProtocol.commonProtocolSettings.Member).ForEach((kv: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>) => {
                results.Add(kv.Key, kv.Value);
            });
            Enumerable.ToList<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>>(OutlookProtocol.internalProtocolSettings.Member).ForEach((kv: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>) => {
                results.Add(kv.Key, kv.Value);
            });
            return results;
        });
        private static externalProtocolConverterDictionary: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var results: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            Enumerable.ToList<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>>(OutlookProtocol.commonProtocolSettings.Member).ForEach((kv: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>) => {
                results.Add(kv.Key, kv.Value);
            });
            Enumerable.ToList<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>>(OutlookProtocol.externalProtocolSettings.Member).ForEach((kv: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>) => {
                results.Add(kv.Key, kv.Value);
            });
            return results;
        });
        private static webProtocolConverterDictionary: LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookProtocol) => any>>(() => {
            var dictionary: Dictionary<UserSettingName, (arg: OutlookProtocol) => any> = new Dictionary<UserSettingName, (arg: OutlookProtocol) => any>();
            dictionary.Add(UserSettingName.InternalWebClientUrls, (p: OutlookProtocol) => { return p.internalOutlookWebAccessUrls; });
            dictionary.Add(UserSettingName.ExternalWebClientUrls, (p: OutlookProtocol) => { return p.externalOutlookWebAccessUrls; });
            return dictionary;
        });
        private static availableUserSettings: LazyMember<List<UserSettingName>> = new LazyMember<List<UserSettingName>>(() => {
            var list: List<UserSettingName> = new List<UserSettingName>();
            list.AddRange(OutlookProtocol.commonProtocolSettings.Member.Keys);
            list.AddRange(OutlookProtocol.internalProtocolSettings.Member.Keys);
            list.AddRange(OutlookProtocol.externalProtocolSettings.Member.Keys);
            list.AddRange(OutlookProtocol.webProtocolConverterDictionary.Member.Keys);
            return list;
        });
        private static protocolNameToTypeMap: LazyMember<Dictionary<string, OutlookProtocolType>> = new LazyMember<Dictionary<string, OutlookProtocolType>>(() => {
            var dictionary: Dictionary<string, OutlookProtocolType> = new Dictionary<string, OutlookProtocolType>();
            dictionary.Add("EXCH", OutlookProtocolType.Rpc);
            dictionary.Add("EXPR", OutlookProtocolType.RpcOverHttp);
            dictionary.Add("WEB", OutlookProtocolType.Web);
            return dictionary;
        });
        private activeDirectoryServer: string = null;
        private authPackage: string = null;
        private availabilityServiceUrl: string = null;
        private ecpUrl: string = null;
        private ecpUrlAggr: string = null;
        private ecpUrlMt: string = null;
        private ecpUrlPublish: string = null;
        private ecpUrlPhoto: string = null;
        private ecpUrlConnect: string = null;
        private ecpUrlRet: string = null;
        private ecpUrlSms: string = null;
        private ecpUrlUm: string = null;
        private ecpUrlTm: string = null;
        private ecpUrlTmCreating: string = null;
        private ecpUrlTmEditing: string = null;
        private ecpUrlTmHiding: string = null;
        private siteMailboxCreationURL: string = null;
        private ecpUrlExtInstall: string = null;
        private exchangeWebServicesUrl: string = null;
        private exchangeManagementWebServicesUrl: string = null;
        private mailboxDN: string = null;
        private offlineAddressBookUrl: string = null;
        private exchangeRpcUrl: string = null;
        private exchangeWebServicesPartnerUrl: string = null;
        private publicFolderServer: string = null;
        private server: string = null;
        private serverDN: string = null;
        private unifiedMessagingUrl: string = null;
        private sharingEnabled: boolean = false;
        private sslEnabled: boolean = false;
        private serverExclusiveConnect: boolean = false;
        private certPrincipalName: string = null;
        private groupingInformation: string = null;
        private externalOutlookWebAccessUrls: WebClientUrlCollection = null;
        private internalOutlookWebAccessUrls: WebClientUrlCollection = null;
        ProtocolType: OutlookProtocolType = 0;
        private get ConverterDictionary(): Dictionary<UserSettingName, (arg: OutlookProtocol) => any> {
            switch (this.ProtocolType) {
                case OutlookProtocolType.Rpc:
                    return OutlookProtocol.internalProtocolConverterDictionary.Member;
                case OutlookProtocolType.RpcOverHttp:
                    return OutlookProtocol.externalProtocolConverterDictionary.Member;
                case OutlookProtocolType.Web:
                    return OutlookProtocol.webProtocolConverterDictionary.Member;
                default:
                    return null;
            }
        }
        static get AvailableUserSettings(): List<UserSettingName> {
            return OutlookProtocol.availableUserSettings.Member;
        }
        constructor() {
            super();
            this.internalOutlookWebAccessUrls = new WebClientUrlCollection();
            this.externalOutlookWebAccessUrls = new WebClientUrlCollection();
        }
        LoadFromXml(reader: EwsXmlReader): void {
            do {
                var IL_572: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                switch (localName = reader.LocalName) {
                                    case "Type":
                                        this.ProtocolType = OutlookProtocol.ProtocolNameToType(reader.ReadElementValue());
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "AuthPackage":
                                        this.authPackage = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "Server":
                                        this.server = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "ServerDN":
                                        this.serverDN = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "ServerVersion":
                                        reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "AD":
                                        this.activeDirectoryServer = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "MdbDN":
                                        this.mailboxDN = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EwsUrl":
                                        this.exchangeWebServicesUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EmwsUrl":
                                        this.exchangeManagementWebServicesUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "ASUrl":
                                        this.availabilityServiceUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "OOFUrl":
                                        reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "UMUrl":
                                        this.unifiedMessagingUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "OABUrl":
                                        this.offlineAddressBookUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "PublicFolderServer":
                                        this.publicFolderServer = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "Internal":
                                        OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.internalOutlookWebAccessUrls, reader.LocalName);
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "External":
                                        OutlookProtocol.LoadWebClientUrlsFromXml(reader, this.externalOutlookWebAccessUrls, reader.LocalName);
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "SSL":
                                        {
                                            var text: string = reader.ReadElementValue();
                                            this.sslEnabled = (text === "On");
                                            _goto = IL_572;
                                            continue _GOTO_LOOP;
                                        }
                                    case "SharingUrl":
                                        this.sharingEnabled = (reader.ReadElementValue().length > 0);
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl":
                                        this.ecpUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-um":
                                        this.ecpUrlUm = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-aggr":
                                        this.ecpUrlAggr = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-sms":
                                        this.ecpUrlSms = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-mt":
                                        this.ecpUrlMt = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-ret":
                                        this.ecpUrlRet = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-publish":
                                        this.ecpUrlPublish = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-photo":
                                        this.ecpUrlPhoto = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "ExchangeRpcUrl":
                                        this.exchangeRpcUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EwsPartnerUrl":
                                        this.exchangeWebServicesPartnerUrl = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-connect":
                                        this.ecpUrlConnect = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-tm":
                                        this.ecpUrlTm = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-tmCreating":
                                        this.ecpUrlTmCreating = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-tmEditing":
                                        this.ecpUrlTmEditing = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-tmHiding":
                                        this.ecpUrlTmHiding = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "SiteMailboxCreationURL":
                                        this.siteMailboxCreationURL = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "EcpUrl-extinstall":
                                        this.ecpUrlExtInstall = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "ServerExclusiveConnect":
                                        {
                                            var text2: string = reader.ReadElementValue();
                                            this.serverExclusiveConnect = (text2 === "On");
                                            _goto = IL_572;
                                            continue _GOTO_LOOP;
                                        }
                                    case "CertPrincipalName":
                                        this.certPrincipalName = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                    case "GroupingInformation":
                                        this.groupingInformation = reader.ReadElementValue();
                                        _goto = IL_572;
                                        continue _GOTO_LOOP;
                                }
                                reader.SkipCurrentElement();
                            }
                            _goto = IL_572;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, "Protocol"));
        }
        private static ProtocolNameToType(protocolName: string): OutlookProtocolType {
            var result: OutlookProtocolType;
            if (!(() => {
                var _p0 = [
                    result
                ];
                var _r = OutlookProtocol.protocolNameToTypeMap.Member.TryGetValue(protocolName, _p0);
                result = _p0[0];
                return _r;
            })()) {
                result = OutlookProtocolType.Unknown;
            }
            return result;
        }
        private static LoadWebClientUrlsFromXml(reader: EwsXmlReader, webClientUrls: WebClientUrlCollection, elementName: string): void {
            do {
                reader.Read();
                if (reader.NodeType === 1) {
                    var localName: string;
                    if ((localName = reader.LocalName) !== null && localName === "OWAUrl") {
                        var authenticationMethods: string = reader.ReadAttributeValue("AuthenticationMethod");
                        var url: string = reader.ReadElementValue();
                        var item: WebClientUrl = new WebClientUrl(authenticationMethods, url);
                        webClientUrls.Urls.Add(item);
                    }
                    else {
                        reader.SkipCurrentElement();
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, elementName));
        }
        private ConvertEcpFragmentToUrl(fragment: string): string {
            if (!NString.IsNullOrEmpty(this.ecpUrl) && !NString.IsNullOrEmpty(fragment)) {
                return this.ecpUrl + fragment;
            }
            return null;
        }
        ConvertToUserSettings(requestedSettings: List<UserSettingName>, response: GetUserSettingsResponse): void {
            if (this.ConverterDictionary !== null) {
                var enumerable: IEnumerable<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>> = Enumerable.Where<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>>(this.ConverterDictionary, (converter: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>) => { return requestedSettings.Contains(converter.Key); });
                var enumerator: IEnumerator<KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any>> = enumerable.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        var current: KeyValuePair<UserSettingName, (arg: OutlookProtocol) => any> = enumerator.Current;
                        var obj: any = current.Value(this);
                        if (obj !== null) {
                            response.Settings.set_Item(current.Key, obj);
                        }
                    }
                }
                finally {
                    if (enumerator !== null) {
                        enumerator.Dispose();
                    }
                }
            }
        }
    }
    class OutlookUser {
        private static converterDictionary: LazyMember<Dictionary<UserSettingName, (arg: OutlookUser) => string>> = new LazyMember<Dictionary<UserSettingName, (arg: OutlookUser) => string>>(() => {
            var dictionary: Dictionary<UserSettingName, (arg: OutlookUser) => string> = new Dictionary<UserSettingName, (arg: OutlookUser) => string>();
            dictionary.Add(UserSettingName.UserDisplayName, (u: OutlookUser) => { return u.displayName; });
            dictionary.Add(UserSettingName.UserDN, (u: OutlookUser) => { return u.legacyDN; });
            dictionary.Add(UserSettingName.UserDeploymentId, (u: OutlookUser) => { return u.deploymentId; });
            dictionary.Add(UserSettingName.AutoDiscoverSMTPAddress, (u: OutlookUser) => { return u.autodiscoverAMTPAddress; });
            return dictionary;
        });
        private displayName: string = null;
        private legacyDN: string = null;
        private deploymentId: string = null;
        private autodiscoverAMTPAddress: string = null;
        static get AvailableUserSettings(): IEnumerable<UserSettingName> {
            return OutlookUser.converterDictionary.Member.Keys;
        }
        constructor() {
            super();
        }
        LoadFromXml(reader: EwsXmlReader): void {
            do {
                var IL_8D: number = 1;
                var _goto: number = 0;
                _GOTO_LOOP:
                while (true) {
                    switch (_goto) {
                        default:
                            reader.Read();
                            if (reader.NodeType === 1) {
                                var localName: string;
                                if ((localName = reader.LocalName) !== null) {
                                    if (localName === "DisplayName") {
                                        this.displayName = reader.ReadElementValue();
                                        _goto = IL_8D;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "LegacyDN") {
                                        this.legacyDN = reader.ReadElementValue();
                                        _goto = IL_8D;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "DeploymentId") {
                                        this.deploymentId = reader.ReadElementValue();
                                        _goto = IL_8D;
                                        continue _GOTO_LOOP;
                                    }
                                    if (localName === "AutoDiscoverSMTPAddress") {
                                        this.autodiscoverAMTPAddress = reader.ReadElementValue();
                                        _goto = IL_8D;
                                        continue _GOTO_LOOP;
                                    }
                                }
                                reader.SkipCurrentElement();
                            }
                            _goto = IL_8D;
                            continue _GOTO_LOOP;
                        case 1:
                            break _GOTO_LOOP;
                    }
                }
            }
            while (!reader.IsEndElement(XmlNamespace.NotSpecified, "User"));
        }
        ConvertToUserSettings(requestedSettings: List<UserSettingName>, response: GetUserSettingsResponse): void {
            var enumerable: IEnumerable<KeyValuePair<UserSettingName, (arg: OutlookUser) => string>> = Enumerable.Where<KeyValuePair<UserSettingName, (arg: OutlookUser) => string>>(OutlookUser.converterDictionary.Member, (converter: KeyValuePair<UserSettingName, (arg: OutlookUser) => string>) => { return requestedSettings.Contains(converter.Key); });
            var enumerator: IEnumerator<KeyValuePair<UserSettingName, (arg: OutlookUser) => string>> = enumerable.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    var current: KeyValuePair<UserSettingName, (arg: OutlookUser) => string> = enumerator.Current;
                    var value: string = current.Value(this);
                    if (!NString.IsNullOrEmpty(value)) {
                        response.Settings.set_Item(current.Key, value);
                    }
                }
            }
            finally {
                if (enumerator !== null) {
                    enumerator.Dispose();
                }
            }
        }
    }
    enum AutodiscoverErrorCode {
        NoError,
        RedirectAddress,
        RedirectUrl,
        InvalidUser,
        InvalidRequest,
        InvalidSetting,
        SettingIsNotAvailable,
        ServerBusy,
        InvalidDomain,
        NotFederated,
        InternalServerError
    }
    enum AutodiscoverResponseType {
        Error,
        RedirectUrl,
        RedirectAddress,
        Success
    }
    enum DomainSettingName {
        ExternalEwsUrl,
        ExternalEwsVersion
    }
    enum OutlookProtocolType {
        Rpc,
        RpcOverHttp,
        Web,
        Unknown
    }
    enum UserSettingName {
        UserDisplayName,
        UserDN,
        UserDeploymentId,
        InternalMailboxServer,
        InternalRpcClientServer,
        InternalMailboxServerDN,
        InternalEcpUrl,
        InternalEcpVoicemailUrl,
        InternalEcpEmailSubscriptionsUrl,
        InternalEcpTextMessagingUrl,
        InternalEcpDeliveryReportUrl,
        InternalEcpRetentionPolicyTagsUrl,
        InternalEcpPublishingUrl,
        InternalEcpPhotoUrl,
        InternalEcpConnectUrl,
        InternalEcpTeamMailboxUrl,
        InternalEcpTeamMailboxCreatingUrl,
        InternalEcpTeamMailboxEditingUrl,
        InternalEcpTeamMailboxHidingUrl,
        InternalEcpExtensionInstallationUrl,
        InternalEwsUrl,
        InternalEmwsUrl,
        InternalOABUrl,
        InternalPhotosUrl,
        InternalUMUrl,
        InternalWebClientUrls,
        MailboxDN,
        PublicFolderServer,
        ActiveDirectoryServer,
        ExternalMailboxServer,
        ExternalMailboxServerRequiresSSL,
        ExternalMailboxServerAuthenticationMethods,
        EcpVoicemailUrlFragment,
        EcpEmailSubscriptionsUrlFragment,
        EcpTextMessagingUrlFragment,
        EcpDeliveryReportUrlFragment,
        EcpRetentionPolicyTagsUrlFragment,
        EcpPublishingUrlFragment,
        EcpPhotoUrlFragment,
        EcpConnectUrlFragment,
        EcpTeamMailboxUrlFragment,
        EcpTeamMailboxCreatingUrlFragment,
        EcpTeamMailboxEditingUrlFragment,
        EcpExtensionInstallationUrlFragment,
        ExternalEcpUrl,
        ExternalEcpVoicemailUrl,
        ExternalEcpEmailSubscriptionsUrl,
        ExternalEcpTextMessagingUrl,
        ExternalEcpDeliveryReportUrl,
        ExternalEcpRetentionPolicyTagsUrl,
        ExternalEcpPublishingUrl,
        ExternalEcpPhotoUrl,
        ExternalEcpConnectUrl,
        ExternalEcpTeamMailboxUrl,
        ExternalEcpTeamMailboxCreatingUrl,
        ExternalEcpTeamMailboxEditingUrl,
        ExternalEcpTeamMailboxHidingUrl,
        ExternalEcpExtensionInstallationUrl,
        ExternalEwsUrl,
        ExternalEmwsUrl,
        ExternalOABUrl,
        ExternalPhotosUrl,
        ExternalUMUrl,
        ExternalWebClientUrls,
        CrossOrganizationSharingEnabled,
        AlternateMailboxes,
        CasVersion,
        EwsSupportedSchemas,
        InternalPop3Connections,
        ExternalPop3Connections,
        InternalImap4Connections,
        ExternalImap4Connections,
        InternalSmtpConnections,
        ExternalSmtpConnections,
        InternalServerExclusiveConnect,
        ExternalEwsVersion,
        MobileMailboxPolicy,
        DocumentSharingLocations,
        UserMSOnline,
        InternalMailboxServerAuthenticationMethods,
        MailboxVersion,
        SPMySiteHostURL,
        SiteMailboxCreationURL,
        InternalRpcHttpServer,
        InternalRpcHttpConnectivityRequiresSsl,
        InternalRpcHttpAuthenticationMethod,
        ExternalServerExclusiveConnect,
        ExchangeRpcUrl,
        ShowGalAsDefaultView,
        AutoDiscoverSMTPAddress,
        InteropExternalEwsUrl,
        InteropExternalEwsVersion,
        PublicFolderInformation,
        RedirectUrl,
        EwsPartnerUrl,
        CertPrincipalName,
        GroupingInformation
    }
    class AutodiscoverRemoteException extends ServiceRemoteException {
        private error: AutodiscoverError = null;
        get Error(): AutodiscoverError {
            return this.error;
        }
        constructor(error: AutodiscoverError);
        constructor(message: string, error: AutodiscoverError);
        constructor(message: string, error: AutodiscoverError, innerException: Exception);
        constructor(errorOrMessage: any, error?: AutodiscoverError, innerException?: Exception) {
            super();
            if (arguments.length === 1 && (errorOrMessage === null || errorOrMessage instanceof AutodiscoverError)) {
                this.constructor_0(errorOrMessage);
                return;
            }
            if (arguments.length === 2 && (errorOrMessage === null || errorOrMessage.constructor === String) && (error === null || error instanceof AutodiscoverError)) {
                this.constructor_1(errorOrMessage, error);
                return;
            }
            this.constructor_2(errorOrMessage, error, innerException);
        }
        private constructor_0(error: AutodiscoverError): void {
            this.error = error;
        }
        private constructor_1(message: string, error: AutodiscoverError): void {
            this.error = error;
        }
        private constructor_2(message: string, error: AutodiscoverError, innerException: Exception): void {
            this.error = error;
        }
    }
    class AutodiscoverResponseException extends ServiceRemoteException {
        private errorCode: AutodiscoverErrorCode = 0;
        get ErrorCode(): AutodiscoverErrorCode {
            return this.errorCode;
        }
        constructor(errorCode: AutodiscoverErrorCode, message: string) {
            super(message);
            this.errorCode = errorCode;
        }
    }
    class DnsClient {
        private static Win32Success: number = 0;
        private static typeToDnsTypeMap: LazyMember<Dictionary<Type, DnsRecordType>> = new LazyMember<Dictionary<Type, DnsRecordType>>(() => {
            var dictionary: Dictionary<Type, DnsRecordType> = new Dictionary<Type, DnsRecordType>();
            dictionary.Add(new Type("DnsSrvRecord"), DnsRecordType.SRV);
            return dictionary;
        });
        static DnsQuery<T>(domain: string, dnsServerAddress: IPAddress): List<T> {
            var list: List<T> = new List<T>();
            var recordType: DnsRecordType = DnsClient.typeToDnsTypeMap.Member.get_Item(new Type("T"));
            var zero: number = number.Zero;
            try {
                var num: number = (() => {
                    var _p0 = [
                        zero
                    ];
                    var _r = DnsNativeMethods.DnsQuery(domain, dnsServerAddress, recordType, _p0);
                    zero = _p0[0];
                    return _r;
                })();
                if (num !== 0) {
                    throw new DnsException(num);
                }
                var intPtr: number = zero;
                while (!NObject.GenericEquals(intPtr, number.Zero)) {
                    var header: DnsRecordHeader = <DnsRecordHeader>Marshal.PtrToStructure(intPtr, new Type("DnsRecordHeader"));
                    var item: T = Activator.CreateInstance<T>();
                    if (header.RecordType === item.RecordType) {
                        item.Load(header, intPtr);
                        list.Add(item);
                    }
                    intPtr = header.NextRecord;
                }
            }
            finally {
                if (zero !== number.Zero) {
                    DnsNativeMethods.FreeDnsQueryResults(zero);
                }
            }
            return list;
        }
        constructor() {
            super();
        }
    }
    class DnsNativeMethods {
        static DNSAPI: string = "dnsapi.dll";
        static DnsQuery(pszName: string, wType: DnsRecordType, options: DnsNativeMethods_DnsQueryOptions, aipServers: number, ppQueryResults: number[], pReserved: number): number;
        static DnsQuery(domain: string, dnsServerAddress: IPAddress, recordType: DnsRecordType, ppQueryResults: number[]): number;
        static DnsQuery(pszNameOrDomain: string, wTypeOrDnsServerAddress: any, optionsOrRecordType: any, aipServersOrPpQueryResults: any, ppQueryResults?: number[], pReserved?: number): number {
            if (arguments.length === 6 && (pszNameOrDomain === null || pszNameOrDomain.constructor === String) && (wTypeOrDnsServerAddress === null || wTypeOrDnsServerAddress.constructor === Number) && (optionsOrRecordType === null || optionsOrRecordType.constructor === Number) && (aipServersOrPpQueryResults === null || aipServersOrPpQueryResults.constructor === Number) && (ppQueryResults[0] === null || ppQueryResults[0] instanceof Array) && (pReserved === null || pReserved.constructor === Number)) {
                return DnsNativeMethods.DnsQuery_0(pszNameOrDomain, wTypeOrDnsServerAddress, optionsOrRecordType, aipServersOrPpQueryResults, ppQueryResults[0], pReserved);
            }
            return DnsNativeMethods.DnsQuery_1(pszNameOrDomain, wTypeOrDnsServerAddress, optionsOrRecordType, aipServersOrPpQueryResults);
        }
        private static DnsQuery_0(pszName: string, wType: DnsRecordType, options: DnsNativeMethods_DnsQueryOptions, aipServers: number, ppQueryResults: number[], pReserved: number): number {
            throw new NotSupportedException();
        }
        static DnsRecordListFree(ptrRecords: number, freeType: DnsNativeMethods_FreeType): void {
            throw new NotSupportedException();
        }
        static AllocDnsServerList(dnsServerAddress: IPAddress): number {
            var intPtr: number = number.Zero;
            if (dnsServerAddress !== null) {
                var serverAddress: number = BitConverter.ToInt32(dnsServerAddress.GetAddressBytes(), 0);
                var dnsServerList: DnsNativeMethods_DnsServerList;
                dnsServerList.AddressCount = 1;
                dnsServerList.ServerAddress = serverAddress;
                intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dnsServerList));
                Marshal.StructureToPtr(dnsServerList, intPtr, false);
            }
            return intPtr;
        }
        private static DnsQuery_1(domain: string, dnsServerAddress: IPAddress, recordType: DnsRecordType, ppQueryResults: number[]): number {
            var intPtr: number = number.Zero;
            var result: number;
            try {
                intPtr = DnsNativeMethods.AllocDnsServerList(dnsServerAddress);
                result = (() => {
                    var _p0 = [
                        ppQueryResults[0]
                    ];
                    var _r = DnsNativeMethods.DnsQuery(domain, recordType, DnsNativeMethods_DnsQueryOptions.DNS_QUERY_STANDARD, intPtr, _p0, 0);
                    ppQueryResults[0] = _p0[0];
                    return _r;
                })();
            }
            finally {
                Marshal.FreeHGlobal(intPtr);
            }
            return result;
        }
        static FreeDnsQueryResults(ptrRecords: number): void {
            DnsNativeMethods.DnsRecordListFree(ptrRecords, DnsNativeMethods_FreeType.RecordList);
        }
        constructor() {
            super();
        }
    }
    class DnsNativeMethods_DnsServerList {
        AddressCount: number = 0;
        ServerAddress: number = 0;
        constructor() {
            super();
        }
    }
    enum DnsNativeMethods_DnsQueryOptions {
        DNS_QUERY_STANDARD
    }
    enum DnsNativeMethods_FreeType {
        RecordList = 1
    }
    class DnsRecord {
        private name: string = null;
        private timeToLive: number = 0;
        RecordType: DnsRecordType = 0;
        get Name(): string {
            return this.name;
        }
        get TimeToLive(): TimeSpan {
            return TimeSpan.FromSeconds(this.timeToLive);
        }
        Load(header: DnsRecordHeader, dataPointer: number): void {
            this.name = header.Name;
            this.timeToLive = Math.max(1, header.Ttl);
        }
        constructor() {
            super();
        }
    }
    class DnsRecordHeader {
        NextRecord: number = null;
        Name: string = null;
        RecordType: DnsRecordType = 0;
        DataLength: number = 0;
        Flags: number = 0;
        Ttl: number = 0;
        Reserved: number = 0;
        constructor() {
            super();
        }
    }
    class DnsSrvRecord extends DnsRecord {
        target: string = null;
        priority: number = 0;
        weight: number = 0;
        port: number = 0;
        get RecordType(): DnsRecordType {
            return DnsRecordType.SRV;
        }
        get NameTarget(): string {
            return this.target;
        }
        get Priority(): number {
            return this.priority;
        }
        get Weight(): number {
            return this.weight;
        }
        get Port(): number {
            return this.port;
        }
        Load(header: DnsRecordHeader, dataPointer: number): void {
            super.Load(header, dataPointer);
            var win32DnsSrvRecord: DnsSrvRecord_Win32DnsSrvRecord = <DnsSrvRecord_Win32DnsSrvRecord>Marshal.PtrToStructure(dataPointer, new Type("DnsSrvRecord_Win32DnsSrvRecord"));
            this.target = win32DnsSrvRecord.NameTarget;
            this.priority = <number>win32DnsSrvRecord.Priority;
            this.weight = <number>win32DnsSrvRecord.Weight;
            this.port = <number>win32DnsSrvRecord.Port;
        }
        constructor() {
            super();
        }
    }
    class DnsSrvRecord_Win32DnsSrvRecord {
        Header: DnsRecordHeader = null;
        NameTarget: string = null;
        Priority: number = 0;
        Weight: number = 0;
        Port: number = 0;
        Pad: number = 0;
        constructor() {
            super();
        }
    }
    enum DnsRecordType {
        A = 1,
        CNAME = 5,
        SOA,
        PTR = 12,
        MX = 15,
        TXT,
        AAAA = 28,
        SRV = 33
    }
    class DnsException extends Win32Exception {
        constructor(errorCode: number) {
            super(errorCode);
        }
    }
    class Strings {
        static stringIDs: Dictionary<number, string> = null;
        static ResourceManager: ExchangeResourceManager = null;
        static get CannotRemoveSubscriptionFromLiveConnection(): LocalizedString {
            return new LocalizedString("CannotRemoveSubscriptionFromLiveConnection", Strings.ResourceManager, new Array<any>(0));
        }
        static get ReadAccessInvalidForNonCalendarFolder(): LocalizedString {
            return new LocalizedString("ReadAccessInvalidForNonCalendarFolder", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyDefinitionPropertyMustBeSet(): LocalizedString {
            return new LocalizedString("PropertyDefinitionPropertyMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get ArgumentIsBlankString(): LocalizedString {
            return new LocalizedString("ArgumentIsBlankString", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverDomainsCount(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverDomainsCount", Strings.ResourceManager, new Array<any>(0));
        }
        static get MinutesMustBeBetween0And1439(): LocalizedString {
            return new LocalizedString("MinutesMustBeBetween0And1439", Strings.ResourceManager, new Array<any>(0));
        }
        static get DeleteInvalidForUnsavedUserConfiguration(): LocalizedString {
            return new LocalizedString("DeleteInvalidForUnsavedUserConfiguration", Strings.ResourceManager, new Array<any>(0));
        }
        static get PeriodNotFound(): LocalizedString {
            return new LocalizedString("PeriodNotFound", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverSmtpAddress(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverSmtpAddress", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidOAuthToken(): LocalizedString {
            return new LocalizedString("InvalidOAuthToken", Strings.ResourceManager, new Array<any>(0));
        }
        static get MaxScpHopsExceeded(): LocalizedString {
            return new LocalizedString("MaxScpHopsExceeded", Strings.ResourceManager, new Array<any>(0));
        }
        static get ContactGroupMemberCannotBeUpdatedWithoutBeingLoadedFirst(): LocalizedString {
            return new LocalizedString("ContactGroupMemberCannotBeUpdatedWithoutBeingLoadedFirst", Strings.ResourceManager, new Array<any>(0));
        }
        static get CurrentPositionNotElementStart(): LocalizedString {
            return new LocalizedString("CurrentPositionNotElementStart", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotConvertBetweenTimeZones(): LocalizedString {
            return new LocalizedString("CannotConvertBetweenTimeZones", Strings.ResourceManager, new Array<any>(0));
        }
        static get FrequencyMustBeBetween1And1440(): LocalizedString {
            return new LocalizedString("FrequencyMustBeBetween1And1440", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotSetDelegateFolderPermissionLevelToCustom(): LocalizedString {
            return new LocalizedString("CannotSetDelegateFolderPermissionLevelToCustom", Strings.ResourceManager, new Array<any>(0));
        }
        static get PartnerTokenIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("PartnerTokenIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverRequest(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverRequest", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAsyncResult(): LocalizedString {
            return new LocalizedString("InvalidAsyncResult", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidMailboxType(): LocalizedString {
            return new LocalizedString("InvalidMailboxType", Strings.ResourceManager, new Array<any>(0));
        }
        static get AttachmentCollectionNotLoaded(): LocalizedString {
            return new LocalizedString("AttachmentCollectionNotLoaded", Strings.ResourceManager, new Array<any>(0));
        }
        static get ParameterIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("ParameterIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get DayOfWeekIndexMustBeSpecifiedForRecurrencePattern(): LocalizedString {
            return new LocalizedString("DayOfWeekIndexMustBeSpecifiedForRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get WLIDCredentialsCannotBeUsedWithLegacyAutodiscover(): LocalizedString {
            return new LocalizedString("WLIDCredentialsCannotBeUsedWithLegacyAutodiscover", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyCannotBeUpdated(): LocalizedString {
            return new LocalizedString("PropertyCannotBeUpdated", Strings.ResourceManager, new Array<any>(0));
        }
        static get IncompatibleTypeForArray(): LocalizedString {
            return new LocalizedString("IncompatibleTypeForArray", Strings.ResourceManager, new Array<any>(0));
        }
        static get PercentCompleteMustBeBetween0And100(): LocalizedString {
            return new LocalizedString("PercentCompleteMustBeBetween0And100", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverServiceIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("AutodiscoverServiceIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverSmtpAddressesCount(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverSmtpAddressesCount", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServiceUrlMustBeSet(): LocalizedString {
            return new LocalizedString("ServiceUrlMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get ItemTypeNotCompatible(): LocalizedString {
            return new LocalizedString("ItemTypeNotCompatible", Strings.ResourceManager, new Array<any>(0));
        }
        static get AttachmentItemTypeMismatch(): LocalizedString {
            return new LocalizedString("AttachmentItemTypeMismatch", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnsupportedWebProtocol(): LocalizedString {
            return new LocalizedString("UnsupportedWebProtocol", Strings.ResourceManager, new Array<any>(0));
        }
        static get EnumValueIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("EnumValueIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnexpectedElement(): LocalizedString {
            return new LocalizedString("UnexpectedElement", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidOrderBy(): LocalizedString {
            return new LocalizedString("InvalidOrderBy", Strings.ResourceManager, new Array<any>(0));
        }
        static get NoAppropriateConstructorForItemClass(): LocalizedString {
            return new LocalizedString("NoAppropriateConstructorForItemClass", Strings.ResourceManager, new Array<any>(0));
        }
        static get SearchFilterAtIndexIsInvalid(): LocalizedString {
            return new LocalizedString("SearchFilterAtIndexIsInvalid", Strings.ResourceManager, new Array<any>(0));
        }
        static get DeletingThisObjectTypeNotAuthorized(): LocalizedString {
            return new LocalizedString("DeletingThisObjectTypeNotAuthorized", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyCannotBeDeleted(): LocalizedString {
            return new LocalizedString("PropertyCannotBeDeleted", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValuePropertyMustBeSet(): LocalizedString {
            return new LocalizedString("ValuePropertyMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get TagValueIsOutOfRange(): LocalizedString {
            return new LocalizedString("TagValueIsOutOfRange", Strings.ResourceManager, new Array<any>(0));
        }
        static get ItemToUpdateCannotBeNullOrNew(): LocalizedString {
            return new LocalizedString("ItemToUpdateCannotBeNullOrNew", Strings.ResourceManager, new Array<any>(0));
        }
        static get SearchParametersRootFolderIdsEmpty(): LocalizedString {
            return new LocalizedString("SearchParametersRootFolderIdsEmpty", Strings.ResourceManager, new Array<any>(0));
        }
        static get MailboxQueriesParameterIsNotSpecified(): LocalizedString {
            return new LocalizedString("MailboxQueriesParameterIsNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get FolderPermissionHasInvalidUserId(): LocalizedString {
            return new LocalizedString("FolderPermissionHasInvalidUserId", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverDomain(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverDomain", Strings.ResourceManager, new Array<any>(0));
        }
        static get MailboxesParameterIsNotSpecified(): LocalizedString {
            return new LocalizedString("MailboxesParameterIsNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get ParentFolderDoesNotHaveId(): LocalizedString {
            return new LocalizedString("ParentFolderDoesNotHaveId", Strings.ResourceManager, new Array<any>(0));
        }
        static get DayOfMonthMustBeSpecifiedForRecurrencePattern(): LocalizedString {
            return new LocalizedString("DayOfMonthMustBeSpecifiedForRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get ClassIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("ClassIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get CertificateHasNoPrivateKey(): LocalizedString {
            return new LocalizedString("CertificateHasNoPrivateKey", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidOrUnsupportedTimeZoneDefinition(): LocalizedString {
            return new LocalizedString("InvalidOrUnsupportedTimeZoneDefinition", Strings.ResourceManager, new Array<any>(0));
        }
        static get HourMustBeBetween0And23(): LocalizedString {
            return new LocalizedString("HourMustBeBetween0And23", Strings.ResourceManager, new Array<any>(0));
        }
        static get TimeoutMustBeBetween1And1440(): LocalizedString {
            return new LocalizedString("TimeoutMustBeBetween1And1440", Strings.ResourceManager, new Array<any>(0));
        }
        static get CredentialsRequired(): LocalizedString {
            return new LocalizedString("CredentialsRequired", Strings.ResourceManager, new Array<any>(0));
        }
        static get MustLoadOrAssignPropertyBeforeAccess(): LocalizedString {
            return new LocalizedString("MustLoadOrAssignPropertyBeforeAccess", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverServiceResponse(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverServiceResponse", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotCallConnectDuringLiveConnection(): LocalizedString {
            return new LocalizedString("CannotCallConnectDuringLiveConnection", Strings.ResourceManager, new Array<any>(0));
        }
        static get ObjectDoesNotHaveId(): LocalizedString {
            return new LocalizedString("ObjectDoesNotHaveId", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotAddSubscriptionToLiveConnection(): LocalizedString {
            return new LocalizedString("CannotAddSubscriptionToLiveConnection", Strings.ResourceManager, new Array<any>(0));
        }
        static get MaxChangesMustBeBetween1And512(): LocalizedString {
            return new LocalizedString("MaxChangesMustBeBetween1And512", Strings.ResourceManager, new Array<any>(0));
        }
        static get AttributeValueCannotBeSerialized(): LocalizedString {
            return new LocalizedString("AttributeValueCannotBeSerialized", Strings.ResourceManager, new Array<any>(0));
        }
        static get SearchFilterMustBeSet(): LocalizedString {
            return new LocalizedString("SearchFilterMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get EndDateMustBeGreaterThanStartDate(): LocalizedString {
            return new LocalizedString("EndDateMustBeGreaterThanStartDate", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidDateTime(): LocalizedString {
            return new LocalizedString("InvalidDateTime", Strings.ResourceManager, new Array<any>(0));
        }
        static get UpdateItemsDoesNotAllowAttachments(): LocalizedString {
            return new LocalizedString("UpdateItemsDoesNotAllowAttachments", Strings.ResourceManager, new Array<any>(0));
        }
        static get TimeoutMustBeGreaterThanZero(): LocalizedString {
            return new LocalizedString("TimeoutMustBeGreaterThanZero", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverInvalidSettingForOutlookProvider(): LocalizedString {
            return new LocalizedString("AutodiscoverInvalidSettingForOutlookProvider", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidRedirectionResponseReturned(): LocalizedString {
            return new LocalizedString("InvalidRedirectionResponseReturned", Strings.ResourceManager, new Array<any>(0));
        }
        static get ExpectedStartElement(): LocalizedString {
            return new LocalizedString("ExpectedStartElement", Strings.ResourceManager, new Array<any>(0));
        }
        static get DaysOfTheWeekNotSpecified(): LocalizedString {
            return new LocalizedString("DaysOfTheWeekNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get FolderToUpdateCannotBeNullOrNew(): LocalizedString {
            return new LocalizedString("FolderToUpdateCannotBeNullOrNew", Strings.ResourceManager, new Array<any>(0));
        }
        static get PartnerTokenRequestRequiresUrl(): LocalizedString {
            return new LocalizedString("PartnerTokenRequestRequiresUrl", Strings.ResourceManager, new Array<any>(0));
        }
        static get NumberOfOccurrencesMustBeGreaterThanZero(): LocalizedString {
            return new LocalizedString("NumberOfOccurrencesMustBeGreaterThanZero", Strings.ResourceManager, new Array<any>(0));
        }
        static get JsonSerializationNotImplemented(): LocalizedString {
            return new LocalizedString("JsonSerializationNotImplemented", Strings.ResourceManager, new Array<any>(0));
        }
        static get StartTimeZoneRequired(): LocalizedString {
            return new LocalizedString("StartTimeZoneRequired", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyAlreadyExistsInOrderByCollection(): LocalizedString {
            return new LocalizedString("PropertyAlreadyExistsInOrderByCollection", Strings.ResourceManager, new Array<any>(0));
        }
        static get ItemAttachmentMustBeNamed(): LocalizedString {
            return new LocalizedString("ItemAttachmentMustBeNamed", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAutodiscoverSettingsCount(): LocalizedString {
            return new LocalizedString("InvalidAutodiscoverSettingsCount", Strings.ResourceManager, new Array<any>(0));
        }
        static get LoadingThisObjectTypeNotSupported(): LocalizedString {
            return new LocalizedString("LoadingThisObjectTypeNotSupported", Strings.ResourceManager, new Array<any>(0));
        }
        static get UserIdForDelegateUserNotSpecified(): LocalizedString {
            return new LocalizedString("UserIdForDelegateUserNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get PhoneCallAlreadyDisconnected(): LocalizedString {
            return new LocalizedString("PhoneCallAlreadyDisconnected", Strings.ResourceManager, new Array<any>(0));
        }
        static get OperationDoesNotSupportAttachments(): LocalizedString {
            return new LocalizedString("OperationDoesNotSupportAttachments", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnsupportedTimeZonePeriodTransitionTarget(): LocalizedString {
            return new LocalizedString("UnsupportedTimeZonePeriodTransitionTarget", Strings.ResourceManager, new Array<any>(0));
        }
        static get IEnumerableDoesNotContainThatManyObject(): LocalizedString {
            return new LocalizedString("IEnumerableDoesNotContainThatManyObject", Strings.ResourceManager, new Array<any>(0));
        }
        static get UpdateItemsDoesNotSupportNewOrUnchangedItems(): LocalizedString {
            return new LocalizedString("UpdateItemsDoesNotSupportNewOrUnchangedItems", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValidationFailed(): LocalizedString {
            return new LocalizedString("ValidationFailed", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidRecurrencePattern(): LocalizedString {
            return new LocalizedString("InvalidRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get TimeWindowStartTimeMustBeGreaterThanEndTime(): LocalizedString {
            return new LocalizedString("TimeWindowStartTimeMustBeGreaterThanEndTime", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAttributeValue(): LocalizedString {
            return new LocalizedString("InvalidAttributeValue", Strings.ResourceManager, new Array<any>(0));
        }
        static get FileAttachmentContentIsNotSet(): LocalizedString {
            return new LocalizedString("FileAttachmentContentIsNotSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverDidNotReturnEwsUrl(): LocalizedString {
            return new LocalizedString("AutodiscoverDidNotReturnEwsUrl", Strings.ResourceManager, new Array<any>(0));
        }
        static get RecurrencePatternMustHaveStartDate(): LocalizedString {
            return new LocalizedString("RecurrencePatternMustHaveStartDate", Strings.ResourceManager, new Array<any>(0));
        }
        static get OccurrenceIndexMustBeGreaterThanZero(): LocalizedString {
            return new LocalizedString("OccurrenceIndexMustBeGreaterThanZero", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServiceResponseDoesNotContainXml(): LocalizedString {
            return new LocalizedString("ServiceResponseDoesNotContainXml", Strings.ResourceManager, new Array<any>(0));
        }
        static get ItemIsOutOfDate(): LocalizedString {
            return new LocalizedString("ItemIsOutOfDate", Strings.ResourceManager, new Array<any>(0));
        }
        static get MinuteMustBeBetween0And59(): LocalizedString {
            return new LocalizedString("MinuteMustBeBetween0And59", Strings.ResourceManager, new Array<any>(0));
        }
        static get NoSoapOrWsSecurityEndpointAvailable(): LocalizedString {
            return new LocalizedString("NoSoapOrWsSecurityEndpointAvailable", Strings.ResourceManager, new Array<any>(0));
        }
        static get ElementNotFound(): LocalizedString {
            return new LocalizedString("ElementNotFound", Strings.ResourceManager, new Array<any>(0));
        }
        static get IndexIsOutOfRange(): LocalizedString {
            return new LocalizedString("IndexIsOutOfRange", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyIsReadOnly(): LocalizedString {
            return new LocalizedString("PropertyIsReadOnly", Strings.ResourceManager, new Array<any>(0));
        }
        static get AttachmentCreationFailed(): LocalizedString {
            return new LocalizedString("AttachmentCreationFailed", Strings.ResourceManager, new Array<any>(0));
        }
        static get DayOfMonthMustBeBetween1And31(): LocalizedString {
            return new LocalizedString("DayOfMonthMustBeBetween1And31", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServiceRequestFailed(): LocalizedString {
            return new LocalizedString("ServiceRequestFailed", Strings.ResourceManager, new Array<any>(0));
        }
        static get DelegateUserHasInvalidUserId(): LocalizedString {
            return new LocalizedString("DelegateUserHasInvalidUserId", Strings.ResourceManager, new Array<any>(0));
        }
        static get SearchFilterComparisonValueTypeIsNotSupported(): LocalizedString {
            return new LocalizedString("SearchFilterComparisonValueTypeIsNotSupported", Strings.ResourceManager, new Array<any>(0));
        }
        static get ElementValueCannotBeSerialized(): LocalizedString {
            return new LocalizedString("ElementValueCannotBeSerialized", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyValueMustBeSpecifiedForRecurrencePattern(): LocalizedString {
            return new LocalizedString("PropertyValueMustBeSpecifiedForRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get NonSummaryPropertyCannotBeUsed(): LocalizedString {
            return new LocalizedString("NonSummaryPropertyCannotBeUsed", Strings.ResourceManager, new Array<any>(0));
        }
        static get HoldIdParameterIsNotSpecified(): LocalizedString {
            return new LocalizedString("HoldIdParameterIsNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get TransitionGroupNotFound(): LocalizedString {
            return new LocalizedString("TransitionGroupNotFound", Strings.ResourceManager, new Array<any>(0));
        }
        static get ObjectTypeNotSupported(): LocalizedString {
            return new LocalizedString("ObjectTypeNotSupported", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidTimeoutValue(): LocalizedString {
            return new LocalizedString("InvalidTimeoutValue", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverRedirectBlocked(): LocalizedString {
            return new LocalizedString("AutodiscoverRedirectBlocked", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertySetCannotBeModified(): LocalizedString {
            return new LocalizedString("PropertySetCannotBeModified", Strings.ResourceManager, new Array<any>(0));
        }
        static get DayOfTheWeekMustBeSpecifiedForRecurrencePattern(): LocalizedString {
            return new LocalizedString("DayOfTheWeekMustBeSpecifiedForRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServiceObjectAlreadyHasId(): LocalizedString {
            return new LocalizedString("ServiceObjectAlreadyHasId", Strings.ResourceManager, new Array<any>(0));
        }
        static get MethodIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("MethodIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get OperationNotSupportedForPropertyDefinitionType(): LocalizedString {
            return new LocalizedString("OperationNotSupportedForPropertyDefinitionType", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidElementStringValue(): LocalizedString {
            return new LocalizedString("InvalidElementStringValue", Strings.ResourceManager, new Array<any>(0));
        }
        static get CollectionIsEmpty(): LocalizedString {
            return new LocalizedString("CollectionIsEmpty", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidFrequencyValue(): LocalizedString {
            return new LocalizedString("InvalidFrequencyValue", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnexpectedEndOfXmlDocument(): LocalizedString {
            return new LocalizedString("UnexpectedEndOfXmlDocument", Strings.ResourceManager, new Array<any>(0));
        }
        static get FolderTypeNotCompatible(): LocalizedString {
            return new LocalizedString("FolderTypeNotCompatible", Strings.ResourceManager, new Array<any>(0));
        }
        static get RequestIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("RequestIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyTypeIncompatibleWhenUpdatingCollection(): LocalizedString {
            return new LocalizedString("PropertyTypeIncompatibleWhenUpdatingCollection", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServerVersionNotSupported(): LocalizedString {
            return new LocalizedString("ServerVersionNotSupported", Strings.ResourceManager, new Array<any>(0));
        }
        static get DurationMustBeSpecifiedWhenScheduled(): LocalizedString {
            return new LocalizedString("DurationMustBeSpecifiedWhenScheduled", Strings.ResourceManager, new Array<any>(0));
        }
        static get NoError(): LocalizedString {
            return new LocalizedString("NoError", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotUpdateNewUserConfiguration(): LocalizedString {
            return new LocalizedString("CannotUpdateNewUserConfiguration", Strings.ResourceManager, new Array<any>(0));
        }
        static get ObjectTypeIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("ObjectTypeIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get NullStringArrayElementInvalid(): LocalizedString {
            return new LocalizedString("NullStringArrayElementInvalid", Strings.ResourceManager, new Array<any>(0));
        }
        static get HttpsIsRequired(): LocalizedString {
            return new LocalizedString("HttpsIsRequired", Strings.ResourceManager, new Array<any>(0));
        }
        static get MergedFreeBusyIntervalMustBeSmallerThanTimeWindow(): LocalizedString {
            return new LocalizedString("MergedFreeBusyIntervalMustBeSmallerThanTimeWindow", Strings.ResourceManager, new Array<any>(0));
        }
        static get SecondMustBeBetween0And59(): LocalizedString {
            return new LocalizedString("SecondMustBeBetween0And59", Strings.ResourceManager, new Array<any>(0));
        }
        static get AtLeastOneAttachmentCouldNotBeDeleted(): LocalizedString {
            return new LocalizedString("AtLeastOneAttachmentCouldNotBeDeleted", Strings.ResourceManager, new Array<any>(0));
        }
        static get IdAlreadyInList(): LocalizedString {
            return new LocalizedString("IdAlreadyInList", Strings.ResourceManager, new Array<any>(0));
        }
        static get BothSearchFilterAndQueryStringCannotBeSpecified(): LocalizedString {
            return new LocalizedString("BothSearchFilterAndQueryStringCannotBeSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get AdditionalPropertyIsNull(): LocalizedString {
            return new LocalizedString("AdditionalPropertyIsNull", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidEmailAddress(): LocalizedString {
            return new LocalizedString("InvalidEmailAddress", Strings.ResourceManager, new Array<any>(0));
        }
        static get MaximumRedirectionHopsExceeded(): LocalizedString {
            return new LocalizedString("MaximumRedirectionHopsExceeded", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverCouldNotBeLocated(): LocalizedString {
            return new LocalizedString("AutodiscoverCouldNotBeLocated", Strings.ResourceManager, new Array<any>(0));
        }
        static get NoSubscriptionsOnConnection(): LocalizedString {
            return new LocalizedString("NoSubscriptionsOnConnection", Strings.ResourceManager, new Array<any>(0));
        }
        static get PermissionLevelInvalidForNonCalendarFolder(): LocalizedString {
            return new LocalizedString("PermissionLevelInvalidForNonCalendarFolder", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidAuthScheme(): LocalizedString {
            return new LocalizedString("InvalidAuthScheme", Strings.ResourceManager, new Array<any>(0));
        }
        static get JsonDeserializationNotImplemented(): LocalizedString {
            return new LocalizedString("JsonDeserializationNotImplemented", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValuePropertyNotLoaded(): LocalizedString {
            return new LocalizedString("ValuePropertyNotLoaded", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyIncompatibleWithRequestVersion(): LocalizedString {
            return new LocalizedString("PropertyIncompatibleWithRequestVersion", Strings.ResourceManager, new Array<any>(0));
        }
        static get OffsetMustBeGreaterThanZero(): LocalizedString {
            return new LocalizedString("OffsetMustBeGreaterThanZero", Strings.ResourceManager, new Array<any>(0));
        }
        static get CreateItemsDoesNotAllowAttachments(): LocalizedString {
            return new LocalizedString("CreateItemsDoesNotAllowAttachments", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyDefinitionTypeMismatch(): LocalizedString {
            return new LocalizedString("PropertyDefinitionTypeMismatch", Strings.ResourceManager, new Array<any>(0));
        }
        static get IntervalMustBeGreaterOrEqualToOne(): LocalizedString {
            return new LocalizedString("IntervalMustBeGreaterOrEqualToOne", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotSetPermissionLevelToCustom(): LocalizedString {
            return new LocalizedString("CannotSetPermissionLevelToCustom", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotAddRequestHeader(): LocalizedString {
            return new LocalizedString("CannotAddRequestHeader", Strings.ResourceManager, new Array<any>(0));
        }
        static get ArrayMustHaveAtLeastOneElement(): LocalizedString {
            return new LocalizedString("ArrayMustHaveAtLeastOneElement", Strings.ResourceManager, new Array<any>(0));
        }
        static get MonthMustBeSpecifiedForRecurrencePattern(): LocalizedString {
            return new LocalizedString("MonthMustBeSpecifiedForRecurrencePattern", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValueOfTypeCannotBeConverted(): LocalizedString {
            return new LocalizedString("ValueOfTypeCannotBeConverted", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValueCannotBeConverted(): LocalizedString {
            return new LocalizedString("ValueCannotBeConverted", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServerErrorAndStackTraceDetails(): LocalizedString {
            return new LocalizedString("ServerErrorAndStackTraceDetails", Strings.ResourceManager, new Array<any>(0));
        }
        static get FolderPermissionLevelMustBeSet(): LocalizedString {
            return new LocalizedString("FolderPermissionLevelMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverError(): LocalizedString {
            return new LocalizedString("AutodiscoverError", Strings.ResourceManager, new Array<any>(0));
        }
        static get ArrayMustHaveSingleDimension(): LocalizedString {
            return new LocalizedString("ArrayMustHaveSingleDimension", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidPropertyValueNotInRange(): LocalizedString {
            return new LocalizedString("InvalidPropertyValueNotInRange", Strings.ResourceManager, new Array<any>(0));
        }
        static get RegenerationPatternsOnlyValidForTasks(): LocalizedString {
            return new LocalizedString("RegenerationPatternsOnlyValidForTasks", Strings.ResourceManager, new Array<any>(0));
        }
        static get ItemAttachmentCannotBeUpdated(): LocalizedString {
            return new LocalizedString("ItemAttachmentCannotBeUpdated", Strings.ResourceManager, new Array<any>(0));
        }
        static get EqualityComparisonFilterIsInvalid(): LocalizedString {
            return new LocalizedString("EqualityComparisonFilterIsInvalid", Strings.ResourceManager, new Array<any>(0));
        }
        static get AutodiscoverServiceRequestRequiresDomainOrUrl(): LocalizedString {
            return new LocalizedString("AutodiscoverServiceRequestRequiresDomainOrUrl", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidUser(): LocalizedString {
            return new LocalizedString("InvalidUser", Strings.ResourceManager, new Array<any>(0));
        }
        static get AccountIsLocked(): LocalizedString {
            return new LocalizedString("AccountIsLocked", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidDomainName(): LocalizedString {
            return new LocalizedString("InvalidDomainName", Strings.ResourceManager, new Array<any>(0));
        }
        static get TooFewServiceReponsesReturned(): LocalizedString {
            return new LocalizedString("TooFewServiceReponsesReturned", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotSubscribeToStatusEvents(): LocalizedString {
            return new LocalizedString("CannotSubscribeToStatusEvents", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidSortByPropertyForMailboxSearch(): LocalizedString {
            return new LocalizedString("InvalidSortByPropertyForMailboxSearch", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnexpectedElementType(): LocalizedString {
            return new LocalizedString("UnexpectedElementType", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValueMustBeGreaterThanZero(): LocalizedString {
            return new LocalizedString("ValueMustBeGreaterThanZero", Strings.ResourceManager, new Array<any>(0));
        }
        static get AttachmentCannotBeUpdated(): LocalizedString {
            return new LocalizedString("AttachmentCannotBeUpdated", Strings.ResourceManager, new Array<any>(0));
        }
        static get CreateItemsDoesNotHandleExistingItems(): LocalizedString {
            return new LocalizedString("CreateItemsDoesNotHandleExistingItems", Strings.ResourceManager, new Array<any>(0));
        }
        static get MultipleContactPhotosInAttachment(): LocalizedString {
            return new LocalizedString("MultipleContactPhotosInAttachment", Strings.ResourceManager, new Array<any>(0));
        }
        static get InvalidRecurrenceRange(): LocalizedString {
            return new LocalizedString("InvalidRecurrenceRange", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotSetBothImpersonatedAndPrivilegedUser(): LocalizedString {
            return new LocalizedString("CannotSetBothImpersonatedAndPrivilegedUser", Strings.ResourceManager, new Array<any>(0));
        }
        static get NewMessagesWithAttachmentsCannotBeSentDirectly(): LocalizedString {
            return new LocalizedString("NewMessagesWithAttachmentsCannotBeSentDirectly", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotCallDisconnectWithNoLiveConnection(): LocalizedString {
            return new LocalizedString("CannotCallDisconnectWithNoLiveConnection", Strings.ResourceManager, new Array<any>(0));
        }
        static get IdPropertyMustBeSet(): LocalizedString {
            return new LocalizedString("IdPropertyMustBeSet", Strings.ResourceManager, new Array<any>(0));
        }
        static get ValuePropertyNotAssigned(): LocalizedString {
            return new LocalizedString("ValuePropertyNotAssigned", Strings.ResourceManager, new Array<any>(0));
        }
        static get ZeroLengthArrayInvalid(): LocalizedString {
            return new LocalizedString("ZeroLengthArrayInvalid", Strings.ResourceManager, new Array<any>(0));
        }
        static get HoldMailboxesParameterIsNotSpecified(): LocalizedString {
            return new LocalizedString("HoldMailboxesParameterIsNotSpecified", Strings.ResourceManager, new Array<any>(0));
        }
        static get CannotSaveNotNewUserConfiguration(): LocalizedString {
            return new LocalizedString("CannotSaveNotNewUserConfiguration", Strings.ResourceManager, new Array<any>(0));
        }
        static get ServiceObjectDoesNotHaveId(): LocalizedString {
            return new LocalizedString("ServiceObjectDoesNotHaveId", Strings.ResourceManager, new Array<any>(0));
        }
        static get PropertyCollectionSizeMismatch(): LocalizedString {
            return new LocalizedString("PropertyCollectionSizeMismatch", Strings.ResourceManager, new Array<any>(0));
        }
        static get XsDurationCouldNotBeParsed(): LocalizedString {
            return new LocalizedString("XsDurationCouldNotBeParsed", Strings.ResourceManager, new Array<any>(0));
        }
        static get UnknownTimeZonePeriodTransitionType(): LocalizedString {
            return new LocalizedString("UnknownTimeZonePeriodTransitionType", Strings.ResourceManager, new Array<any>(0));
        }
        static Strings_cctor(): void {
            Strings.stringIDs = new Dictionary<number, string>(192);
            Strings.ResourceManager = ExchangeResourceManager.GetResourceManager("Microsoft.Exchange.WebServices.Strings", new Type("Strings").Assembly);
            Strings.stringIDs.Add(1631423810, "CannotRemoveSubscriptionFromLiveConnection");
            Strings.stringIDs.Add(3355844483, "ReadAccessInvalidForNonCalendarFolder");
            Strings.stringIDs.Add(1413133863, "PropertyDefinitionPropertyMustBeSet");
            Strings.stringIDs.Add(2808916828, "ArgumentIsBlankString");
            Strings.stringIDs.Add(2110564001, "InvalidAutodiscoverDomainsCount");
            Strings.stringIDs.Add(3846446647, "MinutesMustBeBetween0And1439");
            Strings.stringIDs.Add(3725066606, "DeleteInvalidForUnsavedUserConfiguration");
            Strings.stringIDs.Add(732877372, "PeriodNotFound");
            Strings.stringIDs.Add(742945049, "InvalidAutodiscoverSmtpAddress");
            Strings.stringIDs.Add(2371807741, "InvalidOAuthToken");
            Strings.stringIDs.Add(540781291, "MaxScpHopsExceeded");
            Strings.stringIDs.Add(412932664, "ContactGroupMemberCannotBeUpdatedWithoutBeingLoadedFirst");
            Strings.stringIDs.Add(3932722495, "CurrentPositionNotElementStart");
            Strings.stringIDs.Add(1762296216, "CannotConvertBetweenTimeZones");
            Strings.stringIDs.Add(2947629837, "FrequencyMustBeBetween1And1440");
            Strings.stringIDs.Add(4255072555, "CannotSetDelegateFolderPermissionLevelToCustom");
            Strings.stringIDs.Add(231532733, "PartnerTokenIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(216906786, "InvalidAutodiscoverRequest");
            Strings.stringIDs.Add(2795977038, "InvalidAsyncResult");
            Strings.stringIDs.Add(1875536889, "InvalidMailboxType");
            Strings.stringIDs.Add(368467777, "AttachmentCollectionNotLoaded");
            Strings.stringIDs.Add(1937216341, "ParameterIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(814325722, "DayOfWeekIndexMustBeSpecifiedForRecurrencePattern");
            Strings.stringIDs.Add(365885070, "WLIDCredentialsCannotBeUsedWithLegacyAutodiscover");
            Strings.stringIDs.Add(2534953608, "PropertyCannotBeUpdated");
            Strings.stringIDs.Add(3820761979, "IncompatibleTypeForArray");
            Strings.stringIDs.Add(3936886128, "PercentCompleteMustBeBetween0And100");
            Strings.stringIDs.Add(460414997, "AutodiscoverServiceIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(1774410042, "InvalidAutodiscoverSmtpAddressesCount");
            Strings.stringIDs.Add(1922401890, "ServiceUrlMustBeSet");
            Strings.stringIDs.Add(4181025268, "ItemTypeNotCompatible");
            Strings.stringIDs.Add(1516841384, "AttachmentItemTypeMismatch");
            Strings.stringIDs.Add(3620572079, "UnsupportedWebProtocol");
            Strings.stringIDs.Add(777131942, "EnumValueIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(2080190431, "UnexpectedElement");
            Strings.stringIDs.Add(162617974, "InvalidOrderBy");
            Strings.stringIDs.Add(3730786468, "NoAppropriateConstructorForItemClass");
            Strings.stringIDs.Add(1334400254, "SearchFilterAtIndexIsInvalid");
            Strings.stringIDs.Add(3957228737, "DeletingThisObjectTypeNotAuthorized");
            Strings.stringIDs.Add(2011990502, "PropertyCannotBeDeleted");
            Strings.stringIDs.Add(49538054, "ValuePropertyMustBeSet");
            Strings.stringIDs.Add(4177209255, "TagValueIsOutOfRange");
            Strings.stringIDs.Add(893972063, "ItemToUpdateCannotBeNullOrNew");
            Strings.stringIDs.Add(2492696699, "SearchParametersRootFolderIdsEmpty");
            Strings.stringIDs.Add(2182404464, "MailboxQueriesParameterIsNotSpecified");
            Strings.stringIDs.Add(3079787672, "FolderPermissionHasInvalidUserId");
            Strings.stringIDs.Add(95137117, "InvalidAutodiscoverDomain");
            Strings.stringIDs.Add(1274908260, "MailboxesParameterIsNotSpecified");
            Strings.stringIDs.Add(3207115397, "ParentFolderDoesNotHaveId");
            Strings.stringIDs.Add(190140884, "DayOfMonthMustBeSpecifiedForRecurrencePattern");
            Strings.stringIDs.Add(886236812, "ClassIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(956539910, "CertificateHasNoPrivateKey");
            Strings.stringIDs.Add(2660350763, "InvalidOrUnsupportedTimeZoneDefinition");
            Strings.stringIDs.Add(980862610, "HourMustBeBetween0And23");
            Strings.stringIDs.Add(1864811546, "TimeoutMustBeBetween1And1440");
            Strings.stringIDs.Add(107509017, "CredentialsRequired");
            Strings.stringIDs.Add(1301287431, "MustLoadOrAssignPropertyBeforeAccess");
            Strings.stringIDs.Add(2421645987, "InvalidAutodiscoverServiceResponse");
            Strings.stringIDs.Add(3637880390, "CannotCallConnectDuringLiveConnection");
            Strings.stringIDs.Add(1990317298, "ObjectDoesNotHaveId");
            Strings.stringIDs.Add(2374077290, "CannotAddSubscriptionToLiveConnection");
            Strings.stringIDs.Add(3989266019, "MaxChangesMustBeBetween1And512");
            Strings.stringIDs.Add(3745271395, "AttributeValueCannotBeSerialized");
            Strings.stringIDs.Add(2182989540, "SearchFilterMustBeSet");
            Strings.stringIDs.Add(2696927076, "EndDateMustBeGreaterThanStartDate");
            Strings.stringIDs.Add(3410810540, "InvalidDateTime");
            Strings.stringIDs.Add(2505974152, "UpdateItemsDoesNotAllowAttachments");
            Strings.stringIDs.Add(3210574608, "TimeoutMustBeGreaterThanZero");
            Strings.stringIDs.Add(81925120, "AutodiscoverInvalidSettingForOutlookProvider");
            Strings.stringIDs.Add(706868687, "InvalidRedirectionResponseReturned");
            Strings.stringIDs.Add(3728006586, "ExpectedStartElement");
            Strings.stringIDs.Add(2925351706, "DaysOfTheWeekNotSpecified");
            Strings.stringIDs.Add(2887145506, "FolderToUpdateCannotBeNullOrNew");
            Strings.stringIDs.Add(1709653493, "PartnerTokenRequestRequiresUrl");
            Strings.stringIDs.Add(4020293177, "NumberOfOccurrencesMustBeGreaterThanZero");
            Strings.stringIDs.Add(537341821, "JsonSerializationNotImplemented");
            Strings.stringIDs.Add(263088904, "StartTimeZoneRequired");
            Strings.stringIDs.Add(2291792901, "PropertyAlreadyExistsInOrderByCollection");
            Strings.stringIDs.Add(2209938519, "ItemAttachmentMustBeNamed");
            Strings.stringIDs.Add(2688936715, "InvalidAutodiscoverSettingsCount");
            Strings.stringIDs.Add(1313605428, "LoadingThisObjectTypeNotSupported");
            Strings.stringIDs.Add(3460610998, "UserIdForDelegateUserNotSpecified");
            Strings.stringIDs.Add(2720737469, "PhoneCallAlreadyDisconnected");
            Strings.stringIDs.Add(1464025756, "OperationDoesNotSupportAttachments");
            Strings.stringIDs.Add(98512741, "UnsupportedTimeZonePeriodTransitionTarget");
            Strings.stringIDs.Add(474853648, "IEnumerableDoesNotContainThatManyObject");
            Strings.stringIDs.Add(953072612, "UpdateItemsDoesNotSupportNewOrUnchangedItems");
            Strings.stringIDs.Add(1341796948, "ValidationFailed");
            Strings.stringIDs.Add(3636462697, "InvalidRecurrencePattern");
            Strings.stringIDs.Add(4170253059, "TimeWindowStartTimeMustBeGreaterThanEndTime");
            Strings.stringIDs.Add(369811396, "InvalidAttributeValue");
            Strings.stringIDs.Add(2449142619, "FileAttachmentContentIsNotSet");
            Strings.stringIDs.Add(628121484, "AutodiscoverDidNotReturnEwsUrl");
            Strings.stringIDs.Add(423461609, "RecurrencePatternMustHaveStartDate");
            Strings.stringIDs.Add(1396112272, "OccurrenceIndexMustBeGreaterThanZero");
            Strings.stringIDs.Add(1981959699, "ServiceResponseDoesNotContainXml");
            Strings.stringIDs.Add(2560682386, "ItemIsOutOfDate");
            Strings.stringIDs.Add(3637133283, "MinuteMustBeBetween0And59");
            Strings.stringIDs.Add(3954825173, "NoSoapOrWsSecurityEndpointAvailable");
            Strings.stringIDs.Add(3189440097, "ElementNotFound");
            Strings.stringIDs.Add(4223767916, "IndexIsOutOfRange");
            Strings.stringIDs.Add(869119007, "PropertyIsReadOnly");
            Strings.stringIDs.Add(2817837707, "AttachmentCreationFailed");
            Strings.stringIDs.Add(3133762315, "DayOfMonthMustBeBetween1And31");
            Strings.stringIDs.Add(2091738407, "ServiceRequestFailed");
            Strings.stringIDs.Add(129422921, "DelegateUserHasInvalidUserId");
            Strings.stringIDs.Add(1069581653, "SearchFilterComparisonValueTypeIsNotSupported");
            Strings.stringIDs.Add(4258284629, "ElementValueCannotBeSerialized");
            Strings.stringIDs.Add(2924950297, "PropertyValueMustBeSpecifiedForRecurrencePattern");
            Strings.stringIDs.Add(2436895661, "NonSummaryPropertyCannotBeUsed");
            Strings.stringIDs.Add(134310332, "HoldIdParameterIsNotSpecified");
            Strings.stringIDs.Add(21384399, "TransitionGroupNotFound");
            Strings.stringIDs.Add(4144876524, "ObjectTypeNotSupported");
            Strings.stringIDs.Add(3454211069, "InvalidTimeoutValue");
            Strings.stringIDs.Add(3339063014, "AutodiscoverRedirectBlocked");
            Strings.stringIDs.Add(3717641032, "PropertySetCannotBeModified");
            Strings.stringIDs.Add(3877446129, "DayOfTheWeekMustBeSpecifiedForRecurrencePattern");
            Strings.stringIDs.Add(3918321785, "ServiceObjectAlreadyHasId");
            Strings.stringIDs.Add(4274338115, "MethodIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(2727810523, "OperationNotSupportedForPropertyDefinitionType");
            Strings.stringIDs.Add(3934659801, "InvalidElementStringValue");
            Strings.stringIDs.Add(500353177, "CollectionIsEmpty");
            Strings.stringIDs.Add(885177846, "InvalidFrequencyValue");
            Strings.stringIDs.Add(546825189, "UnexpectedEndOfXmlDocument");
            Strings.stringIDs.Add(3578997681, "FolderTypeNotCompatible");
            Strings.stringIDs.Add(3451337077, "RequestIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(4148083232, "PropertyTypeIncompatibleWhenUpdatingCollection");
            Strings.stringIDs.Add(603284986, "ServerVersionNotSupported");
            Strings.stringIDs.Add(666454105, "DurationMustBeSpecifiedWhenScheduled");
            Strings.stringIDs.Add(1005127777, "NoError");
            Strings.stringIDs.Add(3972010693, "CannotUpdateNewUserConfiguration");
            Strings.stringIDs.Add(2438108153, "ObjectTypeIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(3604837092, "NullStringArrayElementInvalid");
            Strings.stringIDs.Add(333950754, "HttpsIsRequired");
            Strings.stringIDs.Add(2480357954, "MergedFreeBusyIntervalMustBeSmallerThanTimeWindow");
            Strings.stringIDs.Add(328519365, "SecondMustBeBetween0And59");
            Strings.stringIDs.Add(3596957401, "AtLeastOneAttachmentCouldNotBeDeleted");
            Strings.stringIDs.Add(1233804470, "IdAlreadyInList");
            Strings.stringIDs.Add(3295662635, "BothSearchFilterAndQueryStringCannotBeSpecified");
            Strings.stringIDs.Add(3383788511, "AdditionalPropertyIsNull");
            Strings.stringIDs.Add(2316486059, "InvalidEmailAddress");
            Strings.stringIDs.Add(1588497945, "MaximumRedirectionHopsExceeded");
            Strings.stringIDs.Add(3097538091, "AutodiscoverCouldNotBeLocated");
            Strings.stringIDs.Add(2715578908, "NoSubscriptionsOnConnection");
            Strings.stringIDs.Add(1063351272, "PermissionLevelInvalidForNonCalendarFolder");
            Strings.stringIDs.Add(2845550636, "InvalidAuthScheme");
            Strings.stringIDs.Add(311071154, "JsonDeserializationNotImplemented");
            Strings.stringIDs.Add(2743202310, "ValuePropertyNotLoaded");
            Strings.stringIDs.Add(843308875, "PropertyIncompatibleWithRequestVersion");
            Strings.stringIDs.Add(2437116628, "OffsetMustBeGreaterThanZero");
            Strings.stringIDs.Add(690508625, "CreateItemsDoesNotAllowAttachments");
            Strings.stringIDs.Add(2445370550, "PropertyDefinitionTypeMismatch");
            Strings.stringIDs.Add(2129318611, "IntervalMustBeGreaterOrEqualToOne");
            Strings.stringIDs.Add(961741172, "CannotSetPermissionLevelToCustom");
            Strings.stringIDs.Add(2921139860, "CannotAddRequestHeader");
            Strings.stringIDs.Add(4264880578, "ArrayMustHaveAtLeastOneElement");
            Strings.stringIDs.Add(567828041, "MonthMustBeSpecifiedForRecurrencePattern");
            Strings.stringIDs.Add(3869807514, "ValueOfTypeCannotBeConverted");
            Strings.stringIDs.Add(788051255, "ValueCannotBeConverted");
            Strings.stringIDs.Add(1481761255, "ServerErrorAndStackTraceDetails");
            Strings.stringIDs.Add(2586079185, "FolderPermissionLevelMustBeSet");
            Strings.stringIDs.Add(4003396996, "AutodiscoverError");
            Strings.stringIDs.Add(3066801652, "ArrayMustHaveSingleDimension");
            Strings.stringIDs.Add(2233059550, "InvalidPropertyValueNotInRange");
            Strings.stringIDs.Add(1453973661, "RegenerationPatternsOnlyValidForTasks");
            Strings.stringIDs.Add(914733855, "ItemAttachmentCannotBeUpdated");
            Strings.stringIDs.Add(1467147488, "EqualityComparisonFilterIsInvalid");
            Strings.stringIDs.Add(2950491364, "AutodiscoverServiceRequestRequiresDomainOrUrl");
            Strings.stringIDs.Add(3929050450, "InvalidUser");
            Strings.stringIDs.Add(2901788841, "AccountIsLocked");
            Strings.stringIDs.Add(2762661174, "InvalidDomainName");
            Strings.stringIDs.Add(710118117, "TooFewServiceReponsesReturned");
            Strings.stringIDs.Add(463464377, "CannotSubscribeToStatusEvents");
            Strings.stringIDs.Add(1066736932, "InvalidSortByPropertyForMailboxSearch");
            Strings.stringIDs.Add(2100812591, "UnexpectedElementType");
            Strings.stringIDs.Add(691200302, "ValueMustBeGreaterThanZero");
            Strings.stringIDs.Add(2292458752, "AttachmentCannotBeUpdated");
            Strings.stringIDs.Add(3912371609, "CreateItemsDoesNotHandleExistingItems");
            Strings.stringIDs.Add(2967125165, "MultipleContactPhotosInAttachment");
            Strings.stringIDs.Add(3387532664, "InvalidRecurrenceRange");
            Strings.stringIDs.Add(4210899574, "CannotSetBothImpersonatedAndPrivilegedUser");
            Strings.stringIDs.Add(1565629292, "NewMessagesWithAttachmentsCannotBeSentDirectly");
            Strings.stringIDs.Add(3633425214, "CannotCallDisconnectWithNoLiveConnection");
            Strings.stringIDs.Add(3940556486, "IdPropertyMustBeSet");
            Strings.stringIDs.Add(1562822901, "ValuePropertyNotAssigned");
            Strings.stringIDs.Add(4061174908, "ZeroLengthArrayInvalid");
            Strings.stringIDs.Add(3345946933, "HoldMailboxesParameterIsNotSpecified");
            Strings.stringIDs.Add(2270311116, "CannotSaveNotNewUserConfiguration");
            Strings.stringIDs.Add(2111195463, "ServiceObjectDoesNotHaveId");
            Strings.stringIDs.Add(491519754, "PropertyCollectionSizeMismatch");
            Strings.stringIDs.Add(2861470707, "XsDurationCouldNotBeParsed");
            Strings.stringIDs.Add(2279096081, "UnknownTimeZonePeriodTransitionType");
        }
        static GetLocalizedString(key: Strings_IDs): LocalizedString {
            return new LocalizedString(Strings.stringIDs.get_Item(<number>key), Strings.ResourceManager, new Array<any>(0));
        }
    }
    enum Strings_IDs {
        CannotRemoveSubscriptionFromLiveConnection = 1631423810,
        ReadAccessInvalidForNonCalendarFolder = 3355844483,
        PropertyDefinitionPropertyMustBeSet = 1413133863,
        ArgumentIsBlankString = 2808916828,
        InvalidAutodiscoverDomainsCount = 2110564001,
        MinutesMustBeBetween0And1439 = 3846446647,
        DeleteInvalidForUnsavedUserConfiguration = 3725066606,
        PeriodNotFound = 732877372,
        InvalidAutodiscoverSmtpAddress = 742945049,
        InvalidOAuthToken = 2371807741,
        MaxScpHopsExceeded = 540781291,
        ContactGroupMemberCannotBeUpdatedWithoutBeingLoadedFirst = 412932664,
        CurrentPositionNotElementStart = 3932722495,
        CannotConvertBetweenTimeZones = 1762296216,
        FrequencyMustBeBetween1And1440 = 2947629837,
        CannotSetDelegateFolderPermissionLevelToCustom = 4255072555,
        PartnerTokenIncompatibleWithRequestVersion = 231532733,
        InvalidAutodiscoverRequest = 216906786,
        InvalidAsyncResult = 2795977038,
        InvalidMailboxType = 1875536889,
        AttachmentCollectionNotLoaded = 368467777,
        ParameterIncompatibleWithRequestVersion = 1937216341,
        DayOfWeekIndexMustBeSpecifiedForRecurrencePattern = 814325722,
        WLIDCredentialsCannotBeUsedWithLegacyAutodiscover = 365885070,
        PropertyCannotBeUpdated = 2534953608,
        IncompatibleTypeForArray = 3820761979,
        PercentCompleteMustBeBetween0And100 = 3936886128,
        AutodiscoverServiceIncompatibleWithRequestVersion = 460414997,
        InvalidAutodiscoverSmtpAddressesCount = 1774410042,
        ServiceUrlMustBeSet = 1922401890,
        ItemTypeNotCompatible = 4181025268,
        AttachmentItemTypeMismatch = 1516841384,
        UnsupportedWebProtocol = 3620572079,
        EnumValueIncompatibleWithRequestVersion = 777131942,
        UnexpectedElement = 2080190431,
        InvalidOrderBy = 162617974,
        NoAppropriateConstructorForItemClass = 3730786468,
        SearchFilterAtIndexIsInvalid = 1334400254,
        DeletingThisObjectTypeNotAuthorized = 3957228737,
        PropertyCannotBeDeleted = 2011990502,
        ValuePropertyMustBeSet = 49538054,
        TagValueIsOutOfRange = 4177209255,
        ItemToUpdateCannotBeNullOrNew = 893972063,
        SearchParametersRootFolderIdsEmpty = 2492696699,
        MailboxQueriesParameterIsNotSpecified = 2182404464,
        FolderPermissionHasInvalidUserId = 3079787672,
        InvalidAutodiscoverDomain = 95137117,
        MailboxesParameterIsNotSpecified = 1274908260,
        ParentFolderDoesNotHaveId = 3207115397,
        DayOfMonthMustBeSpecifiedForRecurrencePattern = 190140884,
        ClassIncompatibleWithRequestVersion = 886236812,
        CertificateHasNoPrivateKey = 956539910,
        InvalidOrUnsupportedTimeZoneDefinition = 2660350763,
        HourMustBeBetween0And23 = 980862610,
        TimeoutMustBeBetween1And1440 = 1864811546,
        CredentialsRequired = 107509017,
        MustLoadOrAssignPropertyBeforeAccess = 1301287431,
        InvalidAutodiscoverServiceResponse = 2421645987,
        CannotCallConnectDuringLiveConnection = 3637880390,
        ObjectDoesNotHaveId = 1990317298,
        CannotAddSubscriptionToLiveConnection = 2374077290,
        MaxChangesMustBeBetween1And512 = 3989266019,
        AttributeValueCannotBeSerialized = 3745271395,
        SearchFilterMustBeSet = 2182989540,
        EndDateMustBeGreaterThanStartDate = 2696927076,
        InvalidDateTime = 3410810540,
        UpdateItemsDoesNotAllowAttachments = 2505974152,
        TimeoutMustBeGreaterThanZero = 3210574608,
        AutodiscoverInvalidSettingForOutlookProvider = 81925120,
        InvalidRedirectionResponseReturned = 706868687,
        ExpectedStartElement = 3728006586,
        DaysOfTheWeekNotSpecified = 2925351706,
        FolderToUpdateCannotBeNullOrNew = 2887145506,
        PartnerTokenRequestRequiresUrl = 1709653493,
        NumberOfOccurrencesMustBeGreaterThanZero = 4020293177,
        JsonSerializationNotImplemented = 537341821,
        StartTimeZoneRequired = 263088904,
        PropertyAlreadyExistsInOrderByCollection = 2291792901,
        ItemAttachmentMustBeNamed = 2209938519,
        InvalidAutodiscoverSettingsCount = 2688936715,
        LoadingThisObjectTypeNotSupported = 1313605428,
        UserIdForDelegateUserNotSpecified = 3460610998,
        PhoneCallAlreadyDisconnected = 2720737469,
        OperationDoesNotSupportAttachments = 1464025756,
        UnsupportedTimeZonePeriodTransitionTarget = 98512741,
        IEnumerableDoesNotContainThatManyObject = 474853648,
        UpdateItemsDoesNotSupportNewOrUnchangedItems = 953072612,
        ValidationFailed = 1341796948,
        InvalidRecurrencePattern = 3636462697,
        TimeWindowStartTimeMustBeGreaterThanEndTime = 4170253059,
        InvalidAttributeValue = 369811396,
        FileAttachmentContentIsNotSet = 2449142619,
        AutodiscoverDidNotReturnEwsUrl = 628121484,
        RecurrencePatternMustHaveStartDate = 423461609,
        OccurrenceIndexMustBeGreaterThanZero = 1396112272,
        ServiceResponseDoesNotContainXml = 1981959699,
        ItemIsOutOfDate = 2560682386,
        MinuteMustBeBetween0And59 = 3637133283,
        NoSoapOrWsSecurityEndpointAvailable = 3954825173,
        ElementNotFound = 3189440097,
        IndexIsOutOfRange = 4223767916,
        PropertyIsReadOnly = 869119007,
        AttachmentCreationFailed = 2817837707,
        DayOfMonthMustBeBetween1And31 = 3133762315,
        ServiceRequestFailed = 2091738407,
        DelegateUserHasInvalidUserId = 129422921,
        SearchFilterComparisonValueTypeIsNotSupported = 1069581653,
        ElementValueCannotBeSerialized = 4258284629,
        PropertyValueMustBeSpecifiedForRecurrencePattern = 2924950297,
        NonSummaryPropertyCannotBeUsed = 2436895661,
        HoldIdParameterIsNotSpecified = 134310332,
        TransitionGroupNotFound = 21384399,
        ObjectTypeNotSupported = 4144876524,
        InvalidTimeoutValue = 3454211069,
        AutodiscoverRedirectBlocked = 3339063014,
        PropertySetCannotBeModified = 3717641032,
        DayOfTheWeekMustBeSpecifiedForRecurrencePattern = 3877446129,
        ServiceObjectAlreadyHasId = 3918321785,
        MethodIncompatibleWithRequestVersion = 4274338115,
        OperationNotSupportedForPropertyDefinitionType = 2727810523,
        InvalidElementStringValue = 3934659801,
        CollectionIsEmpty = 500353177,
        InvalidFrequencyValue = 885177846,
        UnexpectedEndOfXmlDocument = 546825189,
        FolderTypeNotCompatible = 3578997681,
        RequestIncompatibleWithRequestVersion = 3451337077,
        PropertyTypeIncompatibleWhenUpdatingCollection = 4148083232,
        ServerVersionNotSupported = 603284986,
        DurationMustBeSpecifiedWhenScheduled = 666454105,
        NoError = 1005127777,
        CannotUpdateNewUserConfiguration = 3972010693,
        ObjectTypeIncompatibleWithRequestVersion = 2438108153,
        NullStringArrayElementInvalid = 3604837092,
        HttpsIsRequired = 333950754,
        MergedFreeBusyIntervalMustBeSmallerThanTimeWindow = 2480357954,
        SecondMustBeBetween0And59 = 328519365,
        AtLeastOneAttachmentCouldNotBeDeleted = 3596957401,
        IdAlreadyInList = 1233804470,
        BothSearchFilterAndQueryStringCannotBeSpecified = 3295662635,
        AdditionalPropertyIsNull = 3383788511,
        InvalidEmailAddress = 2316486059,
        MaximumRedirectionHopsExceeded = 1588497945,
        AutodiscoverCouldNotBeLocated = 3097538091,
        NoSubscriptionsOnConnection = 2715578908,
        PermissionLevelInvalidForNonCalendarFolder = 1063351272,
        InvalidAuthScheme = 2845550636,
        JsonDeserializationNotImplemented = 311071154,
        ValuePropertyNotLoaded = 2743202310,
        PropertyIncompatibleWithRequestVersion = 843308875,
        OffsetMustBeGreaterThanZero = 2437116628,
        CreateItemsDoesNotAllowAttachments = 690508625,
        PropertyDefinitionTypeMismatch = 2445370550,
        IntervalMustBeGreaterOrEqualToOne = 2129318611,
        CannotSetPermissionLevelToCustom = 961741172,
        CannotAddRequestHeader = 2921139860,
        ArrayMustHaveAtLeastOneElement = 4264880578,
        MonthMustBeSpecifiedForRecurrencePattern = 567828041,
        ValueOfTypeCannotBeConverted = 3869807514,
        ValueCannotBeConverted = 788051255,
        ServerErrorAndStackTraceDetails = 1481761255,
        FolderPermissionLevelMustBeSet = 2586079185,
        AutodiscoverError = 4003396996,
        ArrayMustHaveSingleDimension = 3066801652,
        InvalidPropertyValueNotInRange = 2233059550,
        RegenerationPatternsOnlyValidForTasks = 1453973661,
        ItemAttachmentCannotBeUpdated = 914733855,
        EqualityComparisonFilterIsInvalid = 1467147488,
        AutodiscoverServiceRequestRequiresDomainOrUrl = 2950491364,
        InvalidUser = 3929050450,
        AccountIsLocked = 2901788841,
        InvalidDomainName = 2762661174,
        TooFewServiceReponsesReturned = 710118117,
        CannotSubscribeToStatusEvents = 463464377,
        InvalidSortByPropertyForMailboxSearch = 1066736932,
        UnexpectedElementType = 2100812591,
        ValueMustBeGreaterThanZero = 691200302,
        AttachmentCannotBeUpdated = 2292458752,
        CreateItemsDoesNotHandleExistingItems = 3912371609,
        MultipleContactPhotosInAttachment = 2967125165,
        InvalidRecurrenceRange = 3387532664,
        CannotSetBothImpersonatedAndPrivilegedUser = 4210899574,
        NewMessagesWithAttachmentsCannotBeSentDirectly = 1565629292,
        CannotCallDisconnectWithNoLiveConnection = 3633425214,
        IdPropertyMustBeSet = 3940556486,
        ValuePropertyNotAssigned = 1562822901,
        ZeroLengthArrayInvalid = 4061174908,
        HoldMailboxesParameterIsNotSpecified = 3345946933,
        CannotSaveNotNewUserConfiguration = 2270311116,
        ServiceObjectDoesNotHaveId = 2111195463,
        PropertyCollectionSizeMismatch = 491519754,
        XsDurationCouldNotBeParsed = 2861470707,
        UnknownTimeZonePeriodTransitionType = 2279096081
    }

    class dsajdgajdgasjdgja {
        JsonTokenizer.JsonTokenizer_cctor();
        DiscoverySchemaChanges.DiscoverySchemaChanges_cctor();
        SafeXmlFactory.SafeXmlFactory_cctor();
        SafeXmlSchema.SafeXmlSchema_cctor();
        Strings.Strings_cctor();
    }

}