@fluidframework/merge-tree 2.4.0-297027 → 2.4.0-297385

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/api-report/merge-tree.legacy.alpha.api.md +0 -1
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/localReference.d.ts +1 -1
  6. package/dist/localReference.d.ts.map +1 -1
  7. package/dist/localReference.js.map +1 -1
  8. package/dist/mergeTree.d.ts +7 -7
  9. package/dist/mergeTree.d.ts.map +1 -1
  10. package/dist/mergeTree.js +33 -5
  11. package/dist/mergeTree.js.map +1 -1
  12. package/dist/mergeTreeNodes.d.ts +27 -8
  13. package/dist/mergeTreeNodes.d.ts.map +1 -1
  14. package/dist/mergeTreeNodes.js +0 -17
  15. package/dist/mergeTreeNodes.js.map +1 -1
  16. package/dist/revertibles.d.ts.map +1 -1
  17. package/dist/revertibles.js +4 -2
  18. package/dist/revertibles.js.map +1 -1
  19. package/dist/snapshotV1.d.ts.map +1 -1
  20. package/dist/snapshotV1.js +0 -2
  21. package/dist/snapshotV1.js.map +1 -1
  22. package/dist/snapshotlegacy.d.ts.map +1 -1
  23. package/dist/snapshotlegacy.js +0 -1
  24. package/dist/snapshotlegacy.js.map +1 -1
  25. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  26. package/dist/test/client.applyMsg.spec.js +3 -3
  27. package/dist/test/client.applyMsg.spec.js.map +1 -1
  28. package/dist/test/client.localReference.spec.js.map +1 -1
  29. package/dist/test/client.rollback.spec.js.map +1 -1
  30. package/dist/test/mergeTree.annotate.spec.js +29 -19
  31. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  32. package/dist/test/obliterate.spec.js.map +1 -1
  33. package/dist/test/revertibleFarm.spec.js.map +1 -1
  34. package/dist/zamboni.js +2 -1
  35. package/dist/zamboni.js.map +1 -1
  36. package/lib/index.d.ts +1 -1
  37. package/lib/index.d.ts.map +1 -1
  38. package/lib/index.js.map +1 -1
  39. package/lib/localReference.d.ts +1 -1
  40. package/lib/localReference.d.ts.map +1 -1
  41. package/lib/localReference.js.map +1 -1
  42. package/lib/mergeTree.d.ts +7 -7
  43. package/lib/mergeTree.d.ts.map +1 -1
  44. package/lib/mergeTree.js +35 -7
  45. package/lib/mergeTree.js.map +1 -1
  46. package/lib/mergeTreeNodes.d.ts +27 -8
  47. package/lib/mergeTreeNodes.d.ts.map +1 -1
  48. package/lib/mergeTreeNodes.js +0 -17
  49. package/lib/mergeTreeNodes.js.map +1 -1
  50. package/lib/revertibles.d.ts.map +1 -1
  51. package/lib/revertibles.js +5 -3
  52. package/lib/revertibles.js.map +1 -1
  53. package/lib/snapshotV1.d.ts.map +1 -1
  54. package/lib/snapshotV1.js +0 -2
  55. package/lib/snapshotV1.js.map +1 -1
  56. package/lib/snapshotlegacy.d.ts.map +1 -1
  57. package/lib/snapshotlegacy.js +0 -1
  58. package/lib/snapshotlegacy.js.map +1 -1
  59. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  60. package/lib/test/client.applyMsg.spec.js +3 -3
  61. package/lib/test/client.applyMsg.spec.js.map +1 -1
  62. package/lib/test/client.localReference.spec.js.map +1 -1
  63. package/lib/test/client.rollback.spec.js.map +1 -1
  64. package/lib/test/mergeTree.annotate.spec.js +29 -19
  65. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  66. package/lib/test/obliterate.spec.js.map +1 -1
  67. package/lib/test/revertibleFarm.spec.js.map +1 -1
  68. package/lib/zamboni.js +2 -1
  69. package/lib/zamboni.js.map +1 -1
  70. package/package.json +17 -17
  71. package/src/index.ts +1 -0
  72. package/src/localReference.ts +5 -5
  73. package/src/mergeTree.ts +92 -53
  74. package/src/mergeTreeNodes.ts +35 -29
  75. package/src/revertibles.ts +12 -5
  76. package/src/snapshotV1.ts +0 -2
  77. package/src/snapshotlegacy.ts +0 -1
  78. package/src/zamboni.ts +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tAttributionKey,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IAttributionCollection } from \"./attributionCollection.js\";\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport type { IJSONSegment } from \"./ops.js\";\nimport { PropertySet, matchProperties } from \"./properties.js\";\nimport {\n\tIJSONSegmentWithMergeInfo,\n\tJsonSegmentSpecs,\n\tMergeTreeChunkV1,\n\tMergeTreeHeaderMetadata,\n\tserializeAsMaxSupportedVersion,\n\ttoLatestVersion,\n\ttype VersionedMergeTreeChunk,\n} from \"./snapshotChunks.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\n\nexport class SnapshotV1 {\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly chunkSize: number = 10000;\n\n\tprivate readonly header: MergeTreeHeaderMetadata;\n\tprivate readonly segments: JsonSegmentSpecs[];\n\tprivate readonly segmentLengths: number[];\n\tprivate readonly attributionCollections: IAttributionCollection<AttributionKey>[];\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly getLongClientId: (id: number) => string,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n\t\tconst { currentSeq, minSeq } = mergeTree.collabWindow;\n\t\tthis.header = {\n\t\t\tminSequenceNumber: minSeq,\n\t\t\tsequenceNumber: currentSeq,\n\t\t\torderedChunkMetadata: [],\n\t\t\ttotalLength: 0,\n\t\t\ttotalSegmentCount: 0,\n\t\t};\n\n\t\tthis.segments = [];\n\t\tthis.segmentLengths = [];\n\t\tthis.attributionCollections = [];\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: JsonSegmentSpecs[],\n\t\tallLengths: number[],\n\t\tattributionCollections: IAttributionCollection<AttributionKey>[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkV1 {\n\t\tconst segments: JsonSegmentSpecs[] = [];\n\t\tconst collections: {\n\t\t\tattribution: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}[] = [];\n\t\tlet length = 0;\n\t\tlet segmentCount = 0;\n\t\tlet hasAttribution = false;\n\t\twhile (length < approxSequenceLength && startIndex + segmentCount < allSegments.length) {\n\t\t\tconst pseg = allSegments[startIndex + segmentCount];\n\t\t\tsegments.push(pseg);\n\t\t\tlength += allLengths[startIndex + segmentCount];\n\t\t\tif (attributionCollections[startIndex + segmentCount]) {\n\t\t\t\thasAttribution = true;\n\t\t\t\tcollections.push({\n\t\t\t\t\tattribution: attributionCollections[startIndex + segmentCount],\n\t\t\t\t\tcachedLength: allLengths[startIndex + segmentCount],\n\t\t\t\t});\n\t\t\t}\n\t\t\tsegmentCount++;\n\t\t}\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\t!hasAttribution || attributionSerializer !== undefined,\n\t\t\t0x55a /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\n\t\treturn {\n\t\t\tversion: \"1\",\n\t\t\tsegmentCount,\n\t\t\tlength,\n\t\t\tsegments,\n\t\t\tstartIndex,\n\t\t\theaderMetadata: undefined,\n\t\t\tattribution: hasAttribution\n\t\t\t\t? attributionSerializer?.serializeAttributionCollections(collections)\n\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(serializer: IFluidSerializer, bind: IFluidHandle): ISummaryTreeWithStats {\n\t\tconst chunks: MergeTreeChunkV1[] = [];\n\t\tthis.header.totalSegmentCount = 0;\n\t\tthis.header.totalLength = 0;\n\t\tdo {\n\t\t\tconst chunk = this.getSeqLengthSegs(\n\t\t\t\tthis.segments,\n\t\t\t\tthis.segmentLengths,\n\t\t\t\tthis.attributionCollections,\n\t\t\t\tthis.chunkSize,\n\t\t\t\tthis.header.totalSegmentCount,\n\t\t\t);\n\t\t\tchunks.push(chunk);\n\t\t\tthis.header.totalSegmentCount += chunk.segmentCount;\n\t\t\tthis.header.totalLength += chunk.length;\n\t\t} while (this.header.totalSegmentCount < this.segments.length);\n\n\t\t// The do while loop should have added at least one chunk\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst headerChunk = chunks.shift()!;\n\t\theaderChunk.headerMetadata = this.header;\n\t\theaderChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n\t\tconst blobs: [key: string, content: string][] = [];\n\t\tfor (const [index, chunk] of chunks.entries()) {\n\t\t\tconst id = `${SnapshotLegacy.body}_${index}`;\n\t\t\tthis.header.orderedChunkMetadata.push({ id });\n\t\t\tblobs.push([\n\t\t\t\tid,\n\t\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\t\tid,\n\t\t\t\t\tchunk,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\theaderChunk,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\t\tfor (const value of blobs) {\n\t\t\tbuilder.addBlob(value[0], value[1]);\n\t\t}\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync(): JsonSegmentSpecs[] {\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst minSeq = this.header.minSequenceNumber;\n\n\t\tlet originalSegments = 0;\n\t\tlet segmentsAfterCombine = 0;\n\n\t\t// Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n\t\tconst pushSegRaw = (\n\t\t\tjson: JsonSegmentSpecs,\n\t\t\tlength: number,\n\t\t\tattribution: IAttributionCollection<AttributionKey> | undefined,\n\t\t): void => {\n\t\t\tsegmentsAfterCombine += 1;\n\t\t\tthis.segments.push(json);\n\t\t\tthis.segmentLengths.push(length);\n\t\t\tif (attribution) {\n\t\t\t\tthis.attributionCollections.push(attribution);\n\t\t\t}\n\t\t};\n\n\t\t// Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n\t\tconst pushSeg = (segment?: ISegment): void => {\n\t\t\tif (segment) {\n\t\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t\t}\n\t\t\t\tpushSegRaw(\n\t\t\t\t\tsegment.toJSONObject() as JsonSegmentSpecs,\n\t\t\t\t\tsegment.cachedLength,\n\t\t\t\t\tsegment.attribution,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (segment: ISegment): boolean => {\n\t\t\t// Elide segments that do not need to be included in the snapshot. A segment may be elided if\n\t\t\t// either condition is true:\n\t\t\t// a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n\t\t\t// there is a pending insert op that will deliver the segment on reconnection.\n\t\t\t// b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n\t\t\t// segment, and therefore we can discard it.\n\t\t\tif (\n\t\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.removedSeq! <= minSeq ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.movedSeq! <= minSeq\n\t\t\t) {\n\t\t\t\tif (segment.seq !== UnassignedSequenceNumber) {\n\t\t\t\t\toriginalSegments += 1;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\toriginalSegments += 1;\n\n\t\t\t// Next determine if the snapshot needs to preserve information required for merging the segment\n\t\t\t// (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n\t\t\t// have a pending remove.)\n\t\t\tif (\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.seq! <= minSeq && // Segment is below the MSN, and...\n\t\t\t\t(segment.removedSeq === undefined || // .. Segment has not been removed, or...\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber) && // .. Removal op to be delivered on reconnect\n\t\t\t\t(segment.movedSeq === undefined || segment.movedSeq === UnassignedSequenceNumber)\n\t\t\t) {\n\t\t\t\t// This segment is below the MSN, which means that future ops will not reference it. Attempt to\n\t\t\t\t// coalesce the new segment with the previous (if any).\n\t\t\t\tif (!prev) {\n\t\t\t\t\t// We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n\t\t\t\t\tprev = segment;\n\t\t\t\t} else if (\n\t\t\t\t\tprev.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prev.properties, segment.properties)\n\t\t\t\t) {\n\t\t\t\t\t// We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n\t\t\t\t\t// modifying the segment instances currently in the MergeTree.\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\t// The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n\t\t\t\t\t// and make the current segment the new candidate for coalescing.\n\t\t\t\t\tpushSeg(prev);\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// This segment needs to preserve its metadata as it may be referenced by future ops. It's ineligible\n\t\t\t\t// for coalescing, so emit the 'prev' segment now (if any).\n\t\t\t\tpushSeg(prev);\n\t\t\t\tprev = undefined;\n\n\t\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t\t}\n\t\t\t\tconst raw: IJSONSegmentWithMergeInfo & { removedClient?: string } = {\n\t\t\t\t\tjson: segment.toJSONObject() as IJSONSegment,\n\t\t\t\t};\n\t\t\t\t// If the segment insertion is above the MSN, record the insertion merge info.\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tif (segment.seq! > minSeq) {\n\t\t\t\t\traw.seq = segment.seq;\n\t\t\t\t\traw.client = this.getLongClientId(segment.clientId);\n\t\t\t\t}\n\t\t\t\t// We have already dispensed with removed segments below the MSN and removed segments with unassigned\n\t\t\t\t// sequence numbers. Any remaining removal info should be preserved.\n\t\t\t\tif (segment.removedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n\t\t\t\t\t\t0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */,\n\t\t\t\t\t);\n\t\t\t\t\traw.removedSeq = segment.removedSeq;\n\n\t\t\t\t\t// back compat for when we split overlap and removed client\n\t\t\t\t\traw.removedClient =\n\t\t\t\t\t\tsegment.removedClientIds === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: this.getLongClientId(segment.removedClientIds[0]);\n\n\t\t\t\t\traw.removedClientIds = segment.removedClientIds?.map((id) =>\n\t\t\t\t\t\tthis.getLongClientId(id),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (segment.movedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.movedSeq !== UnassignedSequenceNumber && segment.movedSeq > minSeq,\n\t\t\t\t\t\t0x873 /* On move info preservation, segment has invalid moved sequence number! */,\n\t\t\t\t\t);\n\t\t\t\t\traw.movedSeq = segment.movedSeq;\n\t\t\t\t\traw.movedSeqs = segment.movedSeqs;\n\t\t\t\t\traw.movedClientIds = segment.movedClientIds?.map((id) => this.getLongClientId(id));\n\t\t\t\t}\n\n\t\t\t\t// Sanity check that we are preserving either the seq > minSeq or a (re)moved segment's info.\n\t\t\t\tassert(\n\t\t\t\t\t(raw.seq !== undefined && raw.client !== undefined) ||\n\t\t\t\t\t\t(raw.removedSeq !== undefined && raw.removedClientIds !== undefined) ||\n\t\t\t\t\t\t(raw.movedSeq !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds.length > 0 &&\n\t\t\t\t\t\t\traw.movedSeqs !== undefined &&\n\t\t\t\t\t\t\traw.movedSeqs.length > 0),\n\t\t\t\t\t0x066 /* \"Corrupted preservation of segment metadata!\" */,\n\t\t\t\t);\n\n\t\t\t\t// Record the segment with its required metadata.\n\t\t\t\tpushSegRaw(raw, segment.cachedLength, segment.attribution);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\twalkAllChildSegments(mergeTree.root, extractSegment);\n\n\t\t// If the last segment in the walk was coalescable, push it now.\n\t\tpushSeg(prev);\n\n\t\t// To reduce potential spam from this telemetry, we sample only a small\n\t\t// percentage of summaries\n\t\tif (Math.abs(originalSegments - segmentsAfterCombine) > 500 && Math.random() < 0.005) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"MergeTreeV1SummarizeSegmentCount\",\n\t\t\t\toriginalSegments,\n\t\t\t\tsegmentsAfterCombine,\n\t\t\t\tsegmentsLen: this.segments.length,\n\t\t\t});\n\t\t}\n\n\t\treturn this.segments;\n\t}\n\n\tpublic static async loadChunk(\n\t\tstorage: IChannelStorageService,\n\t\tpath: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): Promise<MergeTreeChunkV1> {\n\t\tconst blob = await storage.readBlob(path);\n\t\tconst chunkAsString = bufferToString(blob, \"utf8\");\n\t\treturn SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n\t}\n\n\tpublic static processChunk(\n\t\tpath: string,\n\t\tchunk: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): MergeTreeChunkV1 {\n\t\tconst chunkObj: VersionedMergeTreeChunk = serializer\n\t\t\t? (serializer.parse(chunk) as VersionedMergeTreeChunk)\n\t\t\t: (JSON.parse(chunk) as VersionedMergeTreeChunk);\n\t\treturn toLatestVersion(path, chunkObj, logger, options);\n\t}\n}\n"]}
1
+ {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tAttributionKey,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IAttributionCollection } from \"./attributionCollection.js\";\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport type { IJSONSegment } from \"./ops.js\";\nimport { PropertySet, matchProperties } from \"./properties.js\";\nimport {\n\tIJSONSegmentWithMergeInfo,\n\tJsonSegmentSpecs,\n\tMergeTreeChunkV1,\n\tMergeTreeHeaderMetadata,\n\tserializeAsMaxSupportedVersion,\n\ttoLatestVersion,\n\ttype VersionedMergeTreeChunk,\n} from \"./snapshotChunks.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\n\nexport class SnapshotV1 {\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly chunkSize: number = 10000;\n\n\tprivate readonly header: MergeTreeHeaderMetadata;\n\tprivate readonly segments: JsonSegmentSpecs[];\n\tprivate readonly segmentLengths: number[];\n\tprivate readonly attributionCollections: IAttributionCollection<AttributionKey>[];\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly getLongClientId: (id: number) => string,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n\t\tconst { currentSeq, minSeq } = mergeTree.collabWindow;\n\t\tthis.header = {\n\t\t\tminSequenceNumber: minSeq,\n\t\t\tsequenceNumber: currentSeq,\n\t\t\torderedChunkMetadata: [],\n\t\t\ttotalLength: 0,\n\t\t\ttotalSegmentCount: 0,\n\t\t};\n\n\t\tthis.segments = [];\n\t\tthis.segmentLengths = [];\n\t\tthis.attributionCollections = [];\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: JsonSegmentSpecs[],\n\t\tallLengths: number[],\n\t\tattributionCollections: IAttributionCollection<AttributionKey>[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkV1 {\n\t\tconst segments: JsonSegmentSpecs[] = [];\n\t\tconst collections: {\n\t\t\tattribution: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}[] = [];\n\t\tlet length = 0;\n\t\tlet segmentCount = 0;\n\t\tlet hasAttribution = false;\n\t\twhile (length < approxSequenceLength && startIndex + segmentCount < allSegments.length) {\n\t\t\tconst pseg = allSegments[startIndex + segmentCount];\n\t\t\tsegments.push(pseg);\n\t\t\tlength += allLengths[startIndex + segmentCount];\n\t\t\tif (attributionCollections[startIndex + segmentCount]) {\n\t\t\t\thasAttribution = true;\n\t\t\t\tcollections.push({\n\t\t\t\t\tattribution: attributionCollections[startIndex + segmentCount],\n\t\t\t\t\tcachedLength: allLengths[startIndex + segmentCount],\n\t\t\t\t});\n\t\t\t}\n\t\t\tsegmentCount++;\n\t\t}\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\t!hasAttribution || attributionSerializer !== undefined,\n\t\t\t0x55a /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\n\t\treturn {\n\t\t\tversion: \"1\",\n\t\t\tsegmentCount,\n\t\t\tlength,\n\t\t\tsegments,\n\t\t\tstartIndex,\n\t\t\theaderMetadata: undefined,\n\t\t\tattribution: hasAttribution\n\t\t\t\t? attributionSerializer?.serializeAttributionCollections(collections)\n\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(serializer: IFluidSerializer, bind: IFluidHandle): ISummaryTreeWithStats {\n\t\tconst chunks: MergeTreeChunkV1[] = [];\n\t\tthis.header.totalSegmentCount = 0;\n\t\tthis.header.totalLength = 0;\n\t\tdo {\n\t\t\tconst chunk = this.getSeqLengthSegs(\n\t\t\t\tthis.segments,\n\t\t\t\tthis.segmentLengths,\n\t\t\t\tthis.attributionCollections,\n\t\t\t\tthis.chunkSize,\n\t\t\t\tthis.header.totalSegmentCount,\n\t\t\t);\n\t\t\tchunks.push(chunk);\n\t\t\tthis.header.totalSegmentCount += chunk.segmentCount;\n\t\t\tthis.header.totalLength += chunk.length;\n\t\t} while (this.header.totalSegmentCount < this.segments.length);\n\n\t\t// The do while loop should have added at least one chunk\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst headerChunk = chunks.shift()!;\n\t\theaderChunk.headerMetadata = this.header;\n\t\theaderChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n\t\tconst blobs: [key: string, content: string][] = [];\n\t\tfor (const [index, chunk] of chunks.entries()) {\n\t\t\tconst id = `${SnapshotLegacy.body}_${index}`;\n\t\t\tthis.header.orderedChunkMetadata.push({ id });\n\t\t\tblobs.push([\n\t\t\t\tid,\n\t\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\t\tid,\n\t\t\t\t\tchunk,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\theaderChunk,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\t\tfor (const value of blobs) {\n\t\t\tbuilder.addBlob(value[0], value[1]);\n\t\t}\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync(): JsonSegmentSpecs[] {\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst minSeq = this.header.minSequenceNumber;\n\n\t\tlet originalSegments = 0;\n\t\tlet segmentsAfterCombine = 0;\n\n\t\t// Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n\t\tconst pushSegRaw = (\n\t\t\tjson: JsonSegmentSpecs,\n\t\t\tlength: number,\n\t\t\tattribution: IAttributionCollection<AttributionKey> | undefined,\n\t\t): void => {\n\t\t\tsegmentsAfterCombine += 1;\n\t\t\tthis.segments.push(json);\n\t\t\tthis.segmentLengths.push(length);\n\t\t\tif (attribution) {\n\t\t\t\tthis.attributionCollections.push(attribution);\n\t\t\t}\n\t\t};\n\n\t\t// Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n\t\tconst pushSeg = (segment?: ISegment): void => {\n\t\t\tif (segment) {\n\t\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t}\n\t\t\t\tpushSegRaw(\n\t\t\t\t\tsegment.toJSONObject() as JsonSegmentSpecs,\n\t\t\t\t\tsegment.cachedLength,\n\t\t\t\t\tsegment.attribution,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (segment: ISegment): boolean => {\n\t\t\t// Elide segments that do not need to be included in the snapshot. A segment may be elided if\n\t\t\t// either condition is true:\n\t\t\t// a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n\t\t\t// there is a pending insert op that will deliver the segment on reconnection.\n\t\t\t// b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n\t\t\t// segment, and therefore we can discard it.\n\t\t\tif (\n\t\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.removedSeq! <= minSeq ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.movedSeq! <= minSeq\n\t\t\t) {\n\t\t\t\tif (segment.seq !== UnassignedSequenceNumber) {\n\t\t\t\t\toriginalSegments += 1;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\toriginalSegments += 1;\n\n\t\t\t// Next determine if the snapshot needs to preserve information required for merging the segment\n\t\t\t// (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n\t\t\t// have a pending remove.)\n\t\t\tif (\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.seq! <= minSeq && // Segment is below the MSN, and...\n\t\t\t\t(segment.removedSeq === undefined || // .. Segment has not been removed, or...\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber) && // .. Removal op to be delivered on reconnect\n\t\t\t\t(segment.movedSeq === undefined || segment.movedSeq === UnassignedSequenceNumber)\n\t\t\t) {\n\t\t\t\t// This segment is below the MSN, which means that future ops will not reference it. Attempt to\n\t\t\t\t// coalesce the new segment with the previous (if any).\n\t\t\t\tif (!prev) {\n\t\t\t\t\t// We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n\t\t\t\t\tprev = segment;\n\t\t\t\t} else if (\n\t\t\t\t\tprev.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prev.properties, segment.properties)\n\t\t\t\t) {\n\t\t\t\t\t// We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n\t\t\t\t\t// modifying the segment instances currently in the MergeTree.\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\t// The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n\t\t\t\t\t// and make the current segment the new candidate for coalescing.\n\t\t\t\t\tpushSeg(prev);\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// This segment needs to preserve its metadata as it may be referenced by future ops. It's ineligible\n\t\t\t\t// for coalescing, so emit the 'prev' segment now (if any).\n\t\t\t\tpushSeg(prev);\n\t\t\t\tprev = undefined;\n\n\t\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t}\n\t\t\t\tconst raw: IJSONSegmentWithMergeInfo & { removedClient?: string } = {\n\t\t\t\t\tjson: segment.toJSONObject() as IJSONSegment,\n\t\t\t\t};\n\t\t\t\t// If the segment insertion is above the MSN, record the insertion merge info.\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tif (segment.seq! > minSeq) {\n\t\t\t\t\traw.seq = segment.seq;\n\t\t\t\t\traw.client = this.getLongClientId(segment.clientId);\n\t\t\t\t}\n\t\t\t\t// We have already dispensed with removed segments below the MSN and removed segments with unassigned\n\t\t\t\t// sequence numbers. Any remaining removal info should be preserved.\n\t\t\t\tif (segment.removedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n\t\t\t\t\t\t0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */,\n\t\t\t\t\t);\n\t\t\t\t\traw.removedSeq = segment.removedSeq;\n\n\t\t\t\t\t// back compat for when we split overlap and removed client\n\t\t\t\t\traw.removedClient =\n\t\t\t\t\t\tsegment.removedClientIds === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: this.getLongClientId(segment.removedClientIds[0]);\n\n\t\t\t\t\traw.removedClientIds = segment.removedClientIds?.map((id) =>\n\t\t\t\t\t\tthis.getLongClientId(id),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (segment.movedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.movedSeq !== UnassignedSequenceNumber && segment.movedSeq > minSeq,\n\t\t\t\t\t\t0x873 /* On move info preservation, segment has invalid moved sequence number! */,\n\t\t\t\t\t);\n\t\t\t\t\traw.movedSeq = segment.movedSeq;\n\t\t\t\t\traw.movedSeqs = segment.movedSeqs;\n\t\t\t\t\traw.movedClientIds = segment.movedClientIds?.map((id) => this.getLongClientId(id));\n\t\t\t\t}\n\n\t\t\t\t// Sanity check that we are preserving either the seq > minSeq or a (re)moved segment's info.\n\t\t\t\tassert(\n\t\t\t\t\t(raw.seq !== undefined && raw.client !== undefined) ||\n\t\t\t\t\t\t(raw.removedSeq !== undefined && raw.removedClientIds !== undefined) ||\n\t\t\t\t\t\t(raw.movedSeq !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds.length > 0 &&\n\t\t\t\t\t\t\traw.movedSeqs !== undefined &&\n\t\t\t\t\t\t\traw.movedSeqs.length > 0),\n\t\t\t\t\t0x066 /* \"Corrupted preservation of segment metadata!\" */,\n\t\t\t\t);\n\n\t\t\t\t// Record the segment with its required metadata.\n\t\t\t\tpushSegRaw(raw, segment.cachedLength, segment.attribution);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\twalkAllChildSegments(mergeTree.root, extractSegment);\n\n\t\t// If the last segment in the walk was coalescable, push it now.\n\t\tpushSeg(prev);\n\n\t\t// To reduce potential spam from this telemetry, we sample only a small\n\t\t// percentage of summaries\n\t\tif (Math.abs(originalSegments - segmentsAfterCombine) > 500 && Math.random() < 0.005) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"MergeTreeV1SummarizeSegmentCount\",\n\t\t\t\toriginalSegments,\n\t\t\t\tsegmentsAfterCombine,\n\t\t\t\tsegmentsLen: this.segments.length,\n\t\t\t});\n\t\t}\n\n\t\treturn this.segments;\n\t}\n\n\tpublic static async loadChunk(\n\t\tstorage: IChannelStorageService,\n\t\tpath: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): Promise<MergeTreeChunkV1> {\n\t\tconst blob = await storage.readBlob(path);\n\t\tconst chunkAsString = bufferToString(blob, \"utf8\");\n\t\treturn SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n\t}\n\n\tpublic static processChunk(\n\t\tpath: string,\n\t\tchunk: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): MergeTreeChunkV1 {\n\t\tconst chunkObj: VersionedMergeTreeChunk = serializer\n\t\t\t? (serializer.parse(chunk) as VersionedMergeTreeChunk)\n\t\t\t: (JSON.parse(chunk) as VersionedMergeTreeChunk);\n\t\treturn toLatestVersion(path, chunkObj, logger, options);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EACN,mBAAmB,EAEnB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAmB/C;;GAEG;AACH,qBAAa,cAAc;IAoBlB,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAtBjC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAG3B,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,mBAAmB,EACpB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAOjC,OAAO,CAAC,gBAAgB;IAgDxB;;;OAGG;IACH,IAAI,CACH,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GAChB,qBAAqB;IAiExB,WAAW,IAAI,QAAQ,EAAE;CAuFzB"}
1
+ {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EACN,mBAAmB,EAEnB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAmB/C;;GAEG;AACH,qBAAa,cAAc;IAoBlB,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAtBjC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAG3B,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,mBAAmB,EACpB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAOjC,OAAO,CAAC,gBAAgB;IAgDxB;;;OAGG;IACH,IAAI,CACH,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GAChB,qBAAqB;IAiExB,WAAW,IAAI,QAAQ,EAAE;CAsFzB"}
@@ -122,7 +122,6 @@ export class SnapshotLegacy {
122
122
  totalLength += segment.cachedLength;
123
123
  if (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {
124
124
  segment.properties = undefined;
125
- segment.propertyManager = undefined;
126
125
  }
127
126
  this.segments.push(segment);
128
127
  });
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\nimport {\n\tJsonSegmentSpecs,\n\tMergeTreeChunkLegacy,\n\tserializeAsMinSupportedVersion,\n} from \"./snapshotChunks.js\";\n\ninterface SnapshotHeader {\n\tchunkCount?: number;\n\tsegmentsTotalLength: number;\n\tindexOffset?: number;\n\tsegmentsOffset?: number;\n\tseq: number;\n\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\tminSeq?: number;\n}\n\n/**\n * @internal\n */\nexport class SnapshotLegacy {\n\tpublic static readonly header = \"header\";\n\tpublic static readonly body = \"body\";\n\tprivate static readonly catchupOps = \"catchupOps\";\n\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly sizeOfFirstChunk: number = 10000;\n\n\tprivate header: SnapshotHeader | undefined;\n\tprivate seq: number | undefined;\n\tprivate segments: ISegment[] | undefined;\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize =\n\t\t\tmergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: ISegment[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkLegacy {\n\t\tconst segs: ISegment[] = [];\n\t\tlet sequenceLength = 0;\n\t\tlet segCount = 0;\n\t\tlet segsWithAttribution = 0;\n\t\twhile (\n\t\t\tsequenceLength < approxSequenceLength &&\n\t\t\tstartIndex + segCount < allSegments.length\n\t\t) {\n\t\t\tconst pseg = allSegments[startIndex + segCount];\n\t\t\tsegs.push(pseg);\n\t\t\tif (pseg.attribution) {\n\t\t\t\tsegsWithAttribution++;\n\t\t\t}\n\t\t\tsequenceLength += pseg.cachedLength;\n\t\t\tsegCount++;\n\t\t}\n\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || segsWithAttribution === segCount,\n\t\t\t0x4bf /* all or no segments should have attribution */,\n\t\t);\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || attributionSerializer !== undefined,\n\t\t\t0x559 /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\t\treturn {\n\t\t\tversion: undefined,\n\t\t\tchunkStartSegmentIndex: startIndex,\n\t\t\tchunkSegmentCount: segCount,\n\t\t\tchunkLengthChars: sequenceLength,\n\t\t\ttotalLengthChars: this.header!.segmentsTotalLength,\n\t\t\ttotalSegmentCount: allSegments.length,\n\t\t\tchunkSequenceNumber: this.header!.seq,\n\t\t\tsegmentTexts: segs.map((seg) => seg.toJSONObject() as JsonSegmentSpecs),\n\t\t\tattribution:\n\t\t\t\tsegsWithAttribution > 0 || this.mergeTree.attributionPolicy?.isAttached\n\t\t\t\t\t? attributionSerializer?.serializeAttributionCollections(segs)\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t\tserializer: IFluidSerializer,\n\t\tbind: IFluidHandle,\n\t): ISummaryTreeWithStats {\n\t\tconst chunk1 = this.getSeqLengthSegs(this.segments!, this.chunkSize);\n\t\tlet length: number = chunk1.chunkLengthChars;\n\t\tlet segments: number = chunk1.chunkSegmentCount;\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\tchunk1,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\n\t\tif (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n\t\t\tconst chunk2 = this.getSeqLengthSegs(\n\t\t\t\tthis.segments!,\n\t\t\t\tthis.header!.segmentsTotalLength,\n\t\t\t\tchunk1.chunkSegmentCount,\n\t\t\t);\n\t\t\tlength += chunk2.chunkLengthChars;\n\t\t\tsegments += chunk2.chunkSegmentCount;\n\t\t\tbuilder.addBlob(\n\t\t\t\tSnapshotLegacy.body,\n\t\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\t\tSnapshotLegacy.body,\n\t\t\t\t\tchunk2,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert(\n\t\t\tlength === this.header!.segmentsTotalLength,\n\t\t\t0x05d /* \"emit: mismatch in segmentsTotalLength\" */,\n\t\t);\n\n\t\tassert(\n\t\t\tsegments === chunk1.totalSegmentCount,\n\t\t\t0x05e /* \"emit: mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n\t\t\t// Messages used to have a \"term\" property which has since been removed.\n\t\t\t// It is benign so it doesn't really need to be deleted here, but doing so permits snapshot tests\n\t\t\t// to pass with an exact match (and matching the updated definition of ISequencedDocumentMessage).\n\t\t\tfor (const message of catchUpMsgs) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\tdelete (message as any).term;\n\t\t\t}\n\t\t\tbuilder.addBlob(\n\t\t\t\tthis.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n\t\t\t\tserializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),\n\t\t\t);\n\t\t}\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync(): ISegment[] {\n\t\tconst collabWindow = this.mergeTree.collabWindow;\n\t\tthis.seq = collabWindow.minSeq;\n\t\tthis.header = {\n\t\t\tsegmentsTotalLength: this.mergeTree.getLength(\n\t\t\t\tthis.mergeTree.collabWindow.minSeq,\n\t\t\t\tNonCollabClient,\n\t\t\t),\n\t\t\tseq: this.mergeTree.collabWindow.minSeq,\n\t\t};\n\n\t\tlet originalSegments = 0;\n\n\t\tconst segs: ISegment[] = [];\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\trefSeq: number,\n\t\t\tclientId: number,\n\t\t\tstart: number | undefined,\n\t\t\tend: number | undefined,\n\t\t): boolean => {\n\t\t\tif (\n\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\tsegment.seq! <= this.seq! &&\n\t\t\t\t(segment.removedSeq === undefined ||\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber ||\n\t\t\t\t\tsegment.removedSeq > this.seq!)\n\t\t\t) {\n\t\t\t\toriginalSegments += 1;\n\t\t\t\tif (prev?.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tsegs.push(prev);\n\t\t\t\t\t}\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.mergeTree.mapRange(extractSegment, this.seq, NonCollabClient, undefined);\n\t\tif (prev) {\n\t\t\tsegs.push(prev);\n\t\t}\n\n\t\tthis.segments = [];\n\t\tlet totalLength: number = 0;\n\t\tsegs.map((segment) => {\n\t\t\ttotalLength += segment.cachedLength;\n\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\tsegment.properties = undefined;\n\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t}\n\t\t\tthis.segments!.push(segment);\n\t\t});\n\n\t\t// To reduce potential spam from this telemetry, we sample only a small\n\t\t// percentage of summaries\n\t\tif (Math.abs(originalSegments - segs.length) > 500 && Math.random() < 0.005) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"MergeTreeLegacySummarizeSegmentCount\",\n\t\t\t\toriginalSegments,\n\t\t\t\tsegmentsAfterCombine: segs.length,\n\t\t\t\tsegmentsLen: this.segments.length,\n\t\t\t});\n\t\t}\n\n\t\t// We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n\t\t// When this condition happens, we might not write out all segments in getSeqLengthSegs()\n\t\t// when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n\t\t// In the meantime, this code makes sure we will write out all segments properly\n\n\t\tif (this.header.segmentsTotalLength !== totalLength) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"SegmentsTotalLengthMismatch\",\n\t\t\t\ttotalLength,\n\t\t\t\tsegmentsTotalLength: this.header.segmentsTotalLength,\n\t\t\t});\n\t\t\tthis.header.segmentsTotalLength = totalLength;\n\t\t}\n\n\t\treturn this.segments;\n\t}\n}\n"]}
1
+ {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\nimport {\n\tJsonSegmentSpecs,\n\tMergeTreeChunkLegacy,\n\tserializeAsMinSupportedVersion,\n} from \"./snapshotChunks.js\";\n\ninterface SnapshotHeader {\n\tchunkCount?: number;\n\tsegmentsTotalLength: number;\n\tindexOffset?: number;\n\tsegmentsOffset?: number;\n\tseq: number;\n\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\tminSeq?: number;\n}\n\n/**\n * @internal\n */\nexport class SnapshotLegacy {\n\tpublic static readonly header = \"header\";\n\tpublic static readonly body = \"body\";\n\tprivate static readonly catchupOps = \"catchupOps\";\n\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly sizeOfFirstChunk: number = 10000;\n\n\tprivate header: SnapshotHeader | undefined;\n\tprivate seq: number | undefined;\n\tprivate segments: ISegment[] | undefined;\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize =\n\t\t\tmergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: ISegment[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkLegacy {\n\t\tconst segs: ISegment[] = [];\n\t\tlet sequenceLength = 0;\n\t\tlet segCount = 0;\n\t\tlet segsWithAttribution = 0;\n\t\twhile (\n\t\t\tsequenceLength < approxSequenceLength &&\n\t\t\tstartIndex + segCount < allSegments.length\n\t\t) {\n\t\t\tconst pseg = allSegments[startIndex + segCount];\n\t\t\tsegs.push(pseg);\n\t\t\tif (pseg.attribution) {\n\t\t\t\tsegsWithAttribution++;\n\t\t\t}\n\t\t\tsequenceLength += pseg.cachedLength;\n\t\t\tsegCount++;\n\t\t}\n\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || segsWithAttribution === segCount,\n\t\t\t0x4bf /* all or no segments should have attribution */,\n\t\t);\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || attributionSerializer !== undefined,\n\t\t\t0x559 /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\t\treturn {\n\t\t\tversion: undefined,\n\t\t\tchunkStartSegmentIndex: startIndex,\n\t\t\tchunkSegmentCount: segCount,\n\t\t\tchunkLengthChars: sequenceLength,\n\t\t\ttotalLengthChars: this.header!.segmentsTotalLength,\n\t\t\ttotalSegmentCount: allSegments.length,\n\t\t\tchunkSequenceNumber: this.header!.seq,\n\t\t\tsegmentTexts: segs.map((seg) => seg.toJSONObject() as JsonSegmentSpecs),\n\t\t\tattribution:\n\t\t\t\tsegsWithAttribution > 0 || this.mergeTree.attributionPolicy?.isAttached\n\t\t\t\t\t? attributionSerializer?.serializeAttributionCollections(segs)\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t\tserializer: IFluidSerializer,\n\t\tbind: IFluidHandle,\n\t): ISummaryTreeWithStats {\n\t\tconst chunk1 = this.getSeqLengthSegs(this.segments!, this.chunkSize);\n\t\tlet length: number = chunk1.chunkLengthChars;\n\t\tlet segments: number = chunk1.chunkSegmentCount;\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\tchunk1,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\n\t\tif (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n\t\t\tconst chunk2 = this.getSeqLengthSegs(\n\t\t\t\tthis.segments!,\n\t\t\t\tthis.header!.segmentsTotalLength,\n\t\t\t\tchunk1.chunkSegmentCount,\n\t\t\t);\n\t\t\tlength += chunk2.chunkLengthChars;\n\t\t\tsegments += chunk2.chunkSegmentCount;\n\t\t\tbuilder.addBlob(\n\t\t\t\tSnapshotLegacy.body,\n\t\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\t\tSnapshotLegacy.body,\n\t\t\t\t\tchunk2,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert(\n\t\t\tlength === this.header!.segmentsTotalLength,\n\t\t\t0x05d /* \"emit: mismatch in segmentsTotalLength\" */,\n\t\t);\n\n\t\tassert(\n\t\t\tsegments === chunk1.totalSegmentCount,\n\t\t\t0x05e /* \"emit: mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n\t\t\t// Messages used to have a \"term\" property which has since been removed.\n\t\t\t// It is benign so it doesn't really need to be deleted here, but doing so permits snapshot tests\n\t\t\t// to pass with an exact match (and matching the updated definition of ISequencedDocumentMessage).\n\t\t\tfor (const message of catchUpMsgs) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\tdelete (message as any).term;\n\t\t\t}\n\t\t\tbuilder.addBlob(\n\t\t\t\tthis.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n\t\t\t\tserializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),\n\t\t\t);\n\t\t}\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync(): ISegment[] {\n\t\tconst collabWindow = this.mergeTree.collabWindow;\n\t\tthis.seq = collabWindow.minSeq;\n\t\tthis.header = {\n\t\t\tsegmentsTotalLength: this.mergeTree.getLength(\n\t\t\t\tthis.mergeTree.collabWindow.minSeq,\n\t\t\t\tNonCollabClient,\n\t\t\t),\n\t\t\tseq: this.mergeTree.collabWindow.minSeq,\n\t\t};\n\n\t\tlet originalSegments = 0;\n\n\t\tconst segs: ISegment[] = [];\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\trefSeq: number,\n\t\t\tclientId: number,\n\t\t\tstart: number | undefined,\n\t\t\tend: number | undefined,\n\t\t): boolean => {\n\t\t\tif (\n\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\tsegment.seq! <= this.seq! &&\n\t\t\t\t(segment.removedSeq === undefined ||\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber ||\n\t\t\t\t\tsegment.removedSeq > this.seq!)\n\t\t\t) {\n\t\t\t\toriginalSegments += 1;\n\t\t\t\tif (prev?.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tsegs.push(prev);\n\t\t\t\t\t}\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.mergeTree.mapRange(extractSegment, this.seq, NonCollabClient, undefined);\n\t\tif (prev) {\n\t\t\tsegs.push(prev);\n\t\t}\n\n\t\tthis.segments = [];\n\t\tlet totalLength: number = 0;\n\t\tsegs.map((segment) => {\n\t\t\ttotalLength += segment.cachedLength;\n\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\tsegment.properties = undefined;\n\t\t\t}\n\t\t\tthis.segments!.push(segment);\n\t\t});\n\n\t\t// To reduce potential spam from this telemetry, we sample only a small\n\t\t// percentage of summaries\n\t\tif (Math.abs(originalSegments - segs.length) > 500 && Math.random() < 0.005) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"MergeTreeLegacySummarizeSegmentCount\",\n\t\t\t\toriginalSegments,\n\t\t\t\tsegmentsAfterCombine: segs.length,\n\t\t\t\tsegmentsLen: this.segments.length,\n\t\t\t});\n\t\t}\n\n\t\t// We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n\t\t// When this condition happens, we might not write out all segments in getSeqLengthSegs()\n\t\t// when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n\t\t// In the meantime, this code makes sure we will write out all segments properly\n\n\t\tif (this.header.segmentsTotalLength !== totalLength) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"SegmentsTotalLengthMismatch\",\n\t\t\t\ttotalLength,\n\t\t\t\tsegmentsTotalLength: this.header.segmentsTotalLength,\n\t\t\t});\n\t\t\tthis.header.segmentsTotalLength = totalLength;\n\t\t}\n\n\t\treturn this.segments;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.annotateMarker.spec.js","sourceRoot":"","sources":["../../src/test/client.annotateMarker.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAU,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,MAAM,eAAe,GAAG,WAAW,CAAC;IACpC,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC1B,cAAc,CAAC;YACd,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,uBAAuB;YAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE;YAC9B,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE;gBAChE,CAAC,mBAAmB,CAAC,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAiB,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,UAAU,CAAC,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { UniversalSequenceNumber } from \"../constants.js\";\nimport { Marker, reservedMarkerIdKey } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { insertSegments } from \"./testUtils.js\";\n\ndescribe(\"TestClient\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tinsertSegments({\n\t\t\tmergeTree: client.mergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: client.getClientId(),\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tdescribe(\".annotateMarker\", () => {\n\t\tit(\"annotate valid marker\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"123\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst markerInfo = client.getContainingSegment(0);\n\t\t\tconst marker = markerInfo.segment as Marker;\n\t\t\tconst annotateOp = client.annotateMarker(marker, { foo: \"bar\" });\n\t\t\tassert(annotateOp);\n\t\t\tassert(marker.properties);\n\t\t\tassert(marker.properties.foo, \"bar\");\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.annotateMarker.spec.js","sourceRoot":"","sources":["../../src/test/client.annotateMarker.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAU,mBAAmB,EAAqB,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,MAAM,eAAe,GAAG,WAAW,CAAC;IACpC,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC1B,cAAc,CAAC;YACd,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,uBAAuB;YAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE;YAC9B,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE;gBAChE,CAAC,mBAAmB,CAAC,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAiB,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,UAAU,CAAC,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { UniversalSequenceNumber } from \"../constants.js\";\nimport { Marker, reservedMarkerIdKey, type ISegmentLeaf } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { insertSegments } from \"./testUtils.js\";\n\ndescribe(\"TestClient\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tinsertSegments({\n\t\t\tmergeTree: client.mergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: client.getClientId(),\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tdescribe(\".annotateMarker\", () => {\n\t\tit(\"annotate valid marker\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"123\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst markerInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\t\t\tconst marker = markerInfo.segment as Marker;\n\t\t\tconst annotateOp = client.annotateMarker(marker, { foo: \"bar\" });\n\t\t\tassert(annotateOp);\n\t\t\tassert(marker.properties);\n\t\t\tassert(marker.properties.foo, \"bar\");\n\t\t});\n\t});\n});\n"]}
@@ -81,7 +81,7 @@ describe("client.applyMsg", () => {
81
81
  for (let i = 0; i < client.getText().length; i++) {
82
82
  const segmentInfo = client.getContainingSegment(i);
83
83
  assert.notEqual(segmentInfo.segment?.seq, UnassignedSequenceNumber, "all segments should be acked");
84
- assert(segmentInfo.segment?.segmentGroups.empty, "there should be no outstanding segmentGroups");
84
+ assert(segmentInfo.segment?.segmentGroups?.empty !== false, "there should be no outstanding segmentGroups");
85
85
  }
86
86
  });
87
87
  it("insertTextLocal", () => {
@@ -152,10 +152,10 @@ describe("client.applyMsg", () => {
152
152
  const initialText = client.getText();
153
153
  const initialLength = initialText.length;
154
154
  assert.equal(segmentInfo.segment?.removedSeq, undefined);
155
- assert(segmentInfo.segment?.segmentGroups.empty);
155
+ assert(segmentInfo.segment?.segmentGroups?.empty !== false);
156
156
  const removeOp = client.removeRangeLocal(start, end);
157
157
  assert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);
158
- assert.equal(segmentInfo.segment?.segmentGroups.size, 1);
158
+ assert.equal(segmentInfo.segment?.segmentGroups?.size, 1);
159
159
  const remoteMessage = client.makeOpMessage(removeOp, 17);
160
160
  remoteMessage.clientId = "remoteClient";
161
161
  client.applyMsg(remoteMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6DAA6D;AAE7D,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEtF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,MAAM,eAAe,GAAG,WAAW,CAAC;IACpC,MAAM,gBAAgB,GAAG,YAAY,CAAC;IACtC,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;QACJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,QAAQ,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC7E,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBAED,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBAED,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC7E,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE;wBAChD,GAAG,EAAE,GAAG,CAAC,EAAE;qBACX,CAAC,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACT,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC5C,CAAC;YACF,CAAC;QACF,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC;YAClD,MAAM,CACL,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,KAAK,SAAS,EAC1D,kDAAkD,CAClD,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACf,KAAK,CAAC,CAAC;oBACP,KAAK,CAAC,CAAC,CAAC,CAAC;wBACR,MAAM,CAAC,KAAK,CACX,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,cAAc,EAClB,mCAAmC,CACnC,CAAC;wBACF,MAAM;oBACP,CAAC;oBAED,KAAK,CAAC,CAAC;oBACP,KAAK,CAAC,CAAC,CAAC,CAAC;wBACR,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,EAAE,oCAAoC,CAAC,CAAC;wBAChF,MAAM;oBACP,CAAC;oBAED,QAAQ;gBACT,CAAC;YACF,CAAC;QACF,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAEnD,MAAM,CAAC,QAAQ,CACd,WAAW,CAAC,OAAO,EAAE,GAAG,EACxB,wBAAwB,EACxB,8BAA8B,CAC9B,CAAC;YACF,MAAM,CACL,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,EACxC,8CAA8C,CAC9C,CAAC;QACH,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;QAEjE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;QAExE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,KAAK;SACV,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAElD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QAEpC,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,KAAK;SACV,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,IAAI,WAAW,GAAW,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QAClD,MAAM,QAAQ,GAAgC,EAAE,CAAC;QACjD,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG;gBACb,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,KAAK;aACV,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAEpE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;YAElE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,CAAC;QACd,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;QAEzC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,GAAG,cAAc,CAAC;QAExC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAE/B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,aAAa,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,OAAO,EAAE,EAChB,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;QACtC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,YAAY,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/E,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG;YAChB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YAC3D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAC1D,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACvE,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SACtE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAClF,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC;YACpF,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SAChE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;YACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SAChE,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,QAAQ,CAAC,IAAI,CACZ,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CACnE,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE7E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG,2BAA2B,CAC1C,EAAE,YAAY,EAAE,aAAa,EAAE,EAC/B,GAAG,EACH,GAAG,EACH,GAAG,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAChE,CAAC;QACF,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAE3E,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;oBACxD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3B,gFAAgF;QAChF,4CAA4C;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAE5E,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;oBACxD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAE,CAAC;QACxF,MAAM,GAAG,GAAG,OAAO,CAAC,wBAAwB,EAAG,CAAC;QAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CACrC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,EAChD,EAAE,GAAG,CACL,CAAC;QACF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,EAAE,GAAG,CAAC;QAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAElE,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAElD,6DAA6D;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE;YACzC,uBAAuB,EAAE,cAAc,CAAC,uBAAuB;YAC/D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAE,GAAG,CAAC,OAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE3D,oFAAoF;QACpF,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7E,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE;YACrC,uBAAuB,EAAE,cAAc,CAAC,uBAAuB;YAC/D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAkC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAE9E,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CACjE,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE5E,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CACjE,CAAC;QAEF,kBAAkB;QAClB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACb,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACP,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;QAEH,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAChE,CAAC;QAEF,2BAA2B;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxB,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACP,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;QAEH,wCAAwC;QACxC,MAAM,GAAG,GAAG;YACX,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAE;YACtC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,EAAG;SACzC,CAAC;QACF,MAAM,GAAG,GAAG;YACX,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAE;YACtC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,EAAG;SACzC,CAAC;QAEF,uBAAuB;QACvB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,4BAA4B,CACjD,OAAO,EACP,MAAM,EACN,aAAa,CAAC,MAAM,EACpB,SAAS,CACT,CAAC;QAEF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG;YACf,WAAW,EAAE,CAAC,IAAI,EAAQ,EAAE;gBAC3B,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACvC,YAAY,EAAE,CAAC;YAChB,CAAC;YACD,UAAU,EAAE,CAAC,IAAI,EAAQ,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACvC,WAAW,EAAE,CAAC;YACf,CAAC;SACD,CAAC;QAEF,gCAAgC;QAChC,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE;YAClD,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnE,8CAA8C;QAC9C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAExF,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAe,EAAE,CAAC;QACnC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACtD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAElD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,2CAA2C,CAAC,CAAC;QAC7E,CAAC;QACD,8BAA8B;QAC9B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACxD,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,GAAG,GAAgC,EAAE,CAAC;YAC5C,WAAW,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YACxD,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,EAC7C,CAAC,EACD,CAAC,EACD,eAAe,EACf,CAAC,CACD,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC;YACrC,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,eAAe;YACf,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC9E,IAAI,mBAAuC,CAAC;YAC5C,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;YACpF,MAAM,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,GAAG,GAAgC,EAAE,CAAC;YAC5C,WAAW,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YACxD,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;YAC1D,mBAAmB,GAAG,CAAC,CAAC;YAExB,MAAM,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACpE,iGAAiG;YACjG,gFAAgF;YAChF,8GAA8G;YAC9G,kEAAkE;YAClE,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;YAErF,GAAG,CAAC,IAAI,CACP,YAAY,CAAC,aAAa,CACzB,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC;YACtC,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,gBAAgB;YAChB,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAExD,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,mBAAmB,CAC9B,aAAc,EACd,WAAW,CAAC,wBAAwB,EAAG,CACvC;YACD,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,eAAe;YACf,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YACF,mBAAmB,GAAG,EAAE,CAAC;YAEzB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\tsegmentInfo.segment?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups.empty,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment(0);\n\n\t\tassert.equal(segmentInfo.segment?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(segmentInfo.segment?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegment[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, ISegmentLeaf, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\tsegmentInfo.segment?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups?.empty !== false,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tassert.equal(segmentInfo.segment?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(segmentInfo.segment?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment<ISegmentLeaf>(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegment[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}