private void SetEnumerateLinksParams(long linkPageStart, long linkPageEnd, int linkRangeStart, int objectsInLinkPage, TenantFullSyncState expectedState)
 {
     ExTraceGlobals.TenantFullSyncTracer.TraceDebug((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken.SetEnumerateLinksParams entering");
     ExTraceGlobals.TenantFullSyncTracer.TraceDebug <int>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken.SetEnumerateLinksParams objectsInLinkPage = {0}", objectsInLinkPage);
     if (objectsInLinkPage == 0)
     {
         ExTraceGlobals.TenantFullSyncTracer.TraceError((long)this.TenantExternalDirectoryId.GetHashCode(), "objectsInLinkPage != 0");
         throw new ArgumentOutOfRangeException("objectsInLinkPage");
     }
     ExTraceGlobals.TenantFullSyncTracer.TraceDebug <string, string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken.SetEnumerateLinksParams this.State = {0}, expectedState = {1}", this.State.ToString(), expectedState.ToString());
     if (this.State != expectedState)
     {
         ExTraceGlobals.TenantFullSyncTracer.TraceError((long)this.TenantExternalDirectoryId.GetHashCode(), "this.State != expectedState");
         throw new InvalidOperationException("State");
     }
     ExTraceGlobals.TenantFullSyncTracer.TraceDebug <long, long>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken.SetEnumerateLinksParams linkPageStart = {0}, linkPageEnd = {1}", linkPageStart, linkPageEnd);
     if (linkPageStart > linkPageEnd)
     {
         ExTraceGlobals.TenantFullSyncTracer.TraceError((long)this.TenantExternalDirectoryId.GetHashCode(), "linkPageStart > linkPageEnd");
         throw new ArgumentOutOfRangeException("linkPageStart");
     }
     if ((long)objectsInLinkPage > linkPageEnd - linkPageStart + 1L)
     {
         ExTraceGlobals.TenantFullSyncTracer.TraceError((long)this.TenantExternalDirectoryId.GetHashCode(), "objectsInLinkPage > (linkPageEnd - linkPageStart + 1)");
         throw new ArgumentOutOfRangeException("linkPageEnd");
     }
     this.LinkPageStart     = linkPageStart;
     this.LinkPageEnd       = linkPageEnd;
     this.LinkRangeStart    = linkRangeStart;
     this.ObjectsInLinkPage = objectsInLinkPage;
 }
        protected TenantFullSyncPageToken(byte[] tokenBytes)
        {
            Exception ex = null;

            try
            {
                using (BackSyncCookieReader backSyncCookieReader = BackSyncCookieReader.Create(tokenBytes, typeof(TenantFullSyncPageToken)))
                {
                    this.Version                   = (int)backSyncCookieReader.GetNextAttributeValue();
                    this.ServiceInstanceId         = new ServiceInstanceId((string)backSyncCookieReader.GetNextAttributeValue());
                    this.Timestamp                 = DateTime.FromBinary((long)backSyncCookieReader.GetNextAttributeValue());
                    this.LastReadFailureStartTime  = DateTime.FromBinary((long)backSyncCookieReader.GetNextAttributeValue());
                    this.InvocationId              = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    this.TenantExternalDirectoryId = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    this.TenantObjectGuid          = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    this.State = (TenantFullSyncState)backSyncCookieReader.GetNextAttributeValue();
                    this.ObjectUpdateSequenceNumber    = (long)backSyncCookieReader.GetNextAttributeValue();
                    this.TombstoneUpdateSequenceNumber = (long)backSyncCookieReader.GetNextAttributeValue();
                    byte[] array = (byte[])backSyncCookieReader.GetNextAttributeValue();
                    if (array != null)
                    {
                        this.PendingWatermarks = WatermarkMap.Parse(array);
                    }
                    this.PendingWatermarksInvocationId = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    byte[] array2 = (byte[])backSyncCookieReader.GetNextAttributeValue();
                    if (array2 != null)
                    {
                        this.Watermarks = WatermarkMap.Parse(array2);
                    }
                    this.WatermarksInvocationId = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    this.LinkPageStart          = (long)backSyncCookieReader.GetNextAttributeValue();
                    this.LinkPageEnd            = (long)backSyncCookieReader.GetNextAttributeValue();
                    this.LinkRangeStart         = (int)backSyncCookieReader.GetNextAttributeValue();
                    this.ObjectsInLinkPage      = (int)backSyncCookieReader.GetNextAttributeValue();
                    string[] array3 = (string[])backSyncCookieReader.GetNextAttributeValue();
                    this.ErrorObjectsAndFailureCounts = ((array3 != null) ? BackSyncCookie.ParseErrorObjectsAndFailureCounts(array3) : new Dictionary <string, int>());
                    this.SequenceStartTimestamp       = DateTime.FromBinary((long)backSyncCookieReader.GetNextAttributeValue());
                    this.SequenceId = (Guid)backSyncCookieReader.GetNextAttributeValue();
                    byte[] array4 = (byte[])backSyncCookieReader.GetNextAttributeValue();
                    if (array4 != null)
                    {
                        this.TenantScopedBackSyncCookie = BackSyncCookie.Parse(array4);
                        this.InvocationId = this.TenantScopedBackSyncCookie.InvocationId;
                    }
                    this.UseContainerizedUsnChangedIndex       = (bool)backSyncCookieReader.GetNextAttributeValue();
                    this.SoftDeletedObjectUpdateSequenceNumber = (long)backSyncCookieReader.GetNextAttributeValue();
                    this.PreviousState = (TenantFullSyncState)backSyncCookieReader.GetNextAttributeValue();
                }
            }
            catch (ArgumentException ex2)
            {
                ExTraceGlobals.TenantFullSyncTracer.TraceError <string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken ArgumentException {0}", ex2.ToString());
                ex = ex2;
            }
            catch (IOException ex3)
            {
                ExTraceGlobals.TenantFullSyncTracer.TraceError <string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken IOException {0}", ex3.ToString());
                ex = ex3;
            }
            catch (FormatException ex4)
            {
                ExTraceGlobals.TenantFullSyncTracer.TraceError <string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken FormatException {0}", ex4.ToString());
                ex = ex4;
            }
            catch (InvalidCookieException ex5)
            {
                ExTraceGlobals.TenantFullSyncTracer.TraceError <string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken InvalidCookieException {0}", ex5.ToString());
                ex = ex5;
            }
            if (ex != null)
            {
                ExTraceGlobals.TenantFullSyncTracer.TraceError <string>((long)this.TenantExternalDirectoryId.GetHashCode(), "TenantFullSyncPageToken throw InvalidCookieException {0}", ex.ToString());
                throw new InvalidCookieException(ex);
            }
        }