@fluid-experimental/property-changeset 2.71.0 → 2.72.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/changeset_operations/array.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/**\n * @fileoverview Helper functions and classes to work with array ChangeSets\n */\nimport { constants, ConsoleUtils } from \"@fluid-experimental/property-common\";\nimport cloneDeep from \"lodash/cloneDeep.js\";\nimport isEqual from \"lodash/isEqual.js\";\nimport isNumber from \"lodash/isNumber.js\";\nimport isString from \"lodash/isString.js\";\n\n// @ts-ignore\nimport { ApplyChangeSetOptions, ConflictInfo, SerializedChangeSet } from \"../changeset.js\";\nimport { TypeIdHelper } from \"../helpers/typeidHelper.js\";\n\nimport {\n\tArrayChangeSetIterator,\n\tGenericOperation,\n\tInsertOperation,\n\tModifyOperation,\n\tNOPOperation,\n\tNoneNOPOperation,\n\tRemoveOperation,\n\tarrayInsertList,\n\tarrayModifyList,\n\tarrayRemoveList,\n} from \"./arrayChangesetIterator.js\";\nimport { ConflictType } from \"./changesetConflictTypes.js\";\n\nconst { MSG } = constants;\nconst { isPrimitiveType } = TypeIdHelper;\n\n/**\n * The range combinations of two change sets (A and B)\n * This can either be complete operations, parts of complete operations or overlapping segments\n * @enum number\n */\nenum ArrayChangeSetRangeType {\n\t/**\n\t * A complete operation of change set A.\n\t */\n\tcompleteA,\n\n\t/**\n\t * A complete operation of change set B.\n\t */\n\tcompleteB,\n\n\t/**\n\t * A partial operation of change set A.\n\t */\n\tpartOfA,\n\n\t/**\n\t * A partial operation of change set B.\n\t */\n\tpartOfB,\n\n\t/**\n\t * A complete operation of change set A overlapping with a partial operation of change set B.\n\t */\n\tcompleteApartOfB,\n\n\t/**\n\t * A complete operation of change set B overlapping with a partial operation of change set A.\n\t */\n\tcompleteBpartOfA,\n\n\t/**\n\t * A complete operation of change set A overlapping a complete operation of change set B.\n\t */\n\tcompleteAcompleteB,\n\n\t/**\n\t * A partial operation of change set A, a partial operation of change set B.\n\t */\n\tpartOfApartOfB,\n}\n\ninterface SegmentType<T = GenericOperation, K = GenericOperation, L = GenericOperation> {\n\tbegin?: number;\n\top?: T;\n\tflag?: ArrayChangeSetRangeType;\n\topA?: K;\n\topB?: L;\n\tremoveInsertOperationA?: arrayRemoveList | arrayInsertList;\n}\n\n/**\n * A range of an array operation\n */\n// TODO: Cleaning up these types using discriminated union\nexport interface OperationRangeDescription<T = GenericOperation> {\n\topA?: any;\n\topB?: any;\n\tinsertAlreadyProcessed?: boolean;\n\tremoveInsertOperationB?: arrayRemoveList | arrayInsertList;\n\tremoveInsertOperation?: arrayRemoveList | arrayInsertList;\n\tremoveInsertOperationA?: arrayRemoveList | arrayInsertList;\n\top?: T;\n\tbegin?: number;\n\tend?: number;\n\tflag?: ArrayChangeSetRangeType;\n}\n\n/**\n * A range of an insert array operation\n */\nexport interface OperationRangeInsert extends OperationRangeDescription<InsertOperation> {\n\tremoveInsertOperationB?: arrayInsertList;\n\tremoveInsertOperation?: arrayInsertList;\n\tremoveInsertOperationA?: arrayInsertList;\n}\n\n/**\n * A range of a remove array operation\n */\nexport interface OperationRangeRemove extends OperationRangeDescription<RemoveOperation> {\n\tremoveInsertOperationB?: arrayRemoveList;\n\tremoveInsertOperation?: arrayRemoveList;\n\tremoveInsertOperationA?: arrayRemoveList;\n}\n\n/**\n * A range of a modify array operation\n */\nexport interface OperationRangeModify\n\textends Omit<\n\t\tOperationRangeDescription<ModifyOperation>,\n\t\t\"removeInsertOperationB\" | \"removeInsertOperation\" | \"removeInsertOperationA\"\n\t> {}\n\n/**\n * A range of a NOP array operation\n */\nexport interface OperationRangeNOP\n\textends Omit<\n\t\tOperationRangeDescription<NOPOperation>,\n\t\t\"removeInsertOperationB\" | \"removeInsertOperation\" | \"removeInsertOperationA\"\n\t> {}\n\n/**\n * A range of a none NOP array operation\n */\nexport type OperationRangeNoneNOP =\n\t| OperationRangeInsert\n\t| OperationRangeRemove\n\t| OperationRangeModify;\n\nexport type OperationRange = OperationRangeNoneNOP | OperationRangeNOP;\n\n/**\n * Computes a range for an operation of the current change set\n * @param io_operation - Input\n * @param in_aOffset - The offset that needs to be added to transform the operation\n * @param io_resultingRange - The computed range\n */\nconst getRangeForCurrentStateOperation = function (\n\tio_operation: GenericOperation,\n\tin_aOffset: number,\n\tio_resultingRange: OperationRange,\n) {\n\tif (!io_operation) {\n\t\treturn;\n\t}\n\tif (io_operation.type === ArrayChangeSetIterator.types.NOP) {\n\t\tconst dummyOp: NOPOperation = {\n\t\t\ttype: ArrayChangeSetIterator.types.NOP,\n\t\t\toffset: in_aOffset,\n\t\t};\n\t\tio_resultingRange.begin = undefined;\n\t\tio_resultingRange.end = undefined;\n\t\tio_resultingRange.op = dummyOp;\n\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\treturn;\n\t}\n\n\tio_operation.operation[0] += in_aOffset;\n\tswitch (io_operation.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.REMOVE:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0];\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\t(io_resultingRange as OperationRangeRemove).removeInsertOperation =\n\t\t\t\tio_operation.removeInsertOperation;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\treturn;\n\t\tdefault:\n\t\t\tthrow new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n\t}\n};\n\nconst getOpLength = (op: arrayRemoveList) => (isNumber(op[1]) ? op[1] : op[1].length);\n\n/**\n * Computes the impact range for a given operation of the applied change set\n * @param in_operation - The op\n * @param io_resultingRange - The computed range\n * @param in_flag - The flag for the resulting range, default is 'complete B'\n * @param in_options - Optional additional parameters\n */\nconst getRangeForAppliedOperation = function (\n\tin_operation: GenericOperation,\n\tio_resultingRange: OperationRangeDescription,\n\tin_flag?: ArrayChangeSetRangeType,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_operation || in_operation.type === ArrayChangeSetIterator.types.NOP) {\n\t\tio_resultingRange.begin = undefined;\n\t\tio_resultingRange.end = undefined;\n\t\tio_resultingRange.op = undefined;\n\t\tio_resultingRange.flag = undefined;\n\t\treturn;\n\t}\n\tif (!io_resultingRange.op) {\n\t\tio_resultingRange.op = {} as any;\n\t}\n\tio_resultingRange.op.type = in_operation.type;\n\tio_resultingRange.op.offset = in_operation.offset;\n\tif (!io_resultingRange.op.operation) {\n\t\tio_resultingRange.op.operation = [];\n\t}\n\tio_resultingRange.op.operation[0] = in_operation.operation[0];\n\n\tio_resultingRange.begin = in_operation.operation[0];\n\tio_resultingRange.op._absoluteBegin = in_operation.operation[0];\n\tio_resultingRange.flag = in_flag !== undefined ? in_flag : ArrayChangeSetRangeType.completeB;\n\n\tswitch (in_operation.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT:\n\t\t\tio_resultingRange.end = in_operation.operation[0];\n\t\t\tio_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\tconst metaInformation = in_options.applyAfterMetaInformation.get(\n\t\t\t\t\tin_operation.operation[1],\n\t\t\t\t);\n\t\t\t\tif (metaInformation) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(\n\t\t\t\t\t\tio_resultingRange.op.operation[1],\n\t\t\t\t\t\tmetaInformation,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.REMOVE:\n\t\t\tlet numberOfRemovedElements = getOpLength(in_operation.operation);\n\n\t\t\tio_resultingRange.end = in_operation.operation[0] + numberOfRemovedElements;\n\t\t\tio_resultingRange.op.operation[1] = Array.isArray(in_operation.operation[1])\n\t\t\t\t? in_operation.operation[1].slice()\n\t\t\t\t: in_operation.operation[1];\n\t\t\tio_resultingRange.removeInsertOperation = in_operation.removeInsertOperation;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tio_resultingRange.end = in_operation.operation[0] + in_operation.operation[1].length;\n\t\t\tio_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n\t\t\tif (in_operation.operation[2] !== undefined) {\n\t\t\t\tio_resultingRange.op.operation[2] = in_operation.operation[2].slice();\n\t\t\t}\n\t\t\treturn;\n\t\tdefault:\n\t\t\tthrow new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n\t}\n};\n\n/**\n * Splits the second and third parameter in an array remove or modify operation into two segments.\n * This treats the three possible cases array, string and length that are allowed in a remove operation\n *\n * @param in_firstResult - Place where the first half is stored\n * @param in_secondResult - Place where the second half is stored\n * @param in_data - The original operation\n * @param in_start - Index at which the operation is split\n * @private\n */\nconst _splitArrayParameter = function (\n\tin_firstResult: arrayModifyList | arrayRemoveList,\n\tin_secondResult: arrayModifyList | arrayRemoveList,\n\tin_data: arrayModifyList | arrayRemoveList,\n\tin_start: number,\n) {\n\tlet firstTmp: any;\n\tif (isString(in_data[1])) {\n\t\tfirstTmp = in_data[1].substr(0, in_start);\n\t\tin_secondResult[1] = in_data[1].substr(in_start);\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = firstTmp;\n\t\t}\n\t\tif (in_data[2] !== undefined && isString(in_data[2])) {\n\t\t\tfirstTmp = in_data[2].substr(0, in_start);\n\t\t\tin_secondResult[2] = in_data[2].substr(in_start);\n\t\t\tif (in_firstResult) {\n\t\t\t\tin_firstResult[2] = firstTmp;\n\t\t\t}\n\t\t}\n\t} else if (Array.isArray(in_data[1])) {\n\t\tfirstTmp = in_data[1].splice(0, in_start);\n\t\tin_secondResult[1] = in_data[1];\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = firstTmp;\n\t\t}\n\t\tif (in_data[2] !== undefined && Array.isArray(in_data[2])) {\n\t\t\tfirstTmp = in_data[2].splice(0, in_start);\n\t\t\tin_secondResult[2] = in_data[2];\n\t\t\tif (in_firstResult) {\n\t\t\t\tin_firstResult[2] = firstTmp;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = in_start;\n\t\t}\n\t\tin_secondResult[1] = in_data[1] - in_start;\n\t}\n};\n\n/**\n * Splits an operation for the splitOverlapping function\n *\n * @param in_targetRange - The range to split\n * @param in_targetOperation - The target operation into which the split range is written\n * @param lengthUsedInResultSegment - The length of the range to split\n * @param in_updateOffset - Should the offset in the target range be updated?\n */\nconst _splitOperation = function (\n\tin_targetRange: OperationRangeDescription<NoneNOPOperation>,\n\tin_targetOperation: NoneNOPOperation,\n\tlengthUsedInResultSegment: number,\n\tin_updateOffset: boolean,\n) {\n\t_splitArrayParameter(\n\t\tin_targetOperation.operation,\n\t\tin_targetRange.op.operation,\n\t\tin_targetRange.op.operation,\n\t\tlengthUsedInResultSegment,\n\t);\n\n\tif (in_updateOffset) {\n\t\tif (in_targetRange.op.type === ArrayChangeSetIterator.types.INSERT) {\n\t\t\tin_targetRange.op.offset += lengthUsedInResultSegment;\n\t\t}\n\t\tif (in_targetRange.op.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\t\tin_targetRange.op.offset -= lengthUsedInResultSegment;\n\t\t}\n\t}\n};\n\n/**\n * Copies an array operation\n * @param in_sourceOperation - The source operation\n * @param in_targetOperation - The target operation which will be overwritten\n */\nconst _copyOperation = function (\n\tin_sourceOperation: NoneNOPOperation,\n\tin_targetOperation: NoneNOPOperation,\n) {\n\tif (in_sourceOperation.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\tin_targetOperation.operation[1] = in_sourceOperation.operation[1];\n\t} else {\n\t\tin_targetOperation.operation[1] = in_sourceOperation.operation[1].slice();\n\t\tif (in_sourceOperation.operation[2] !== undefined) {\n\t\t\tin_targetOperation.operation[2] = in_sourceOperation.operation[2].slice();\n\t\t}\n\t}\n};\n\n/**\n * cut overlapping ranges in non-overlapping and completely overlapping segments\n * ranges of length 0 just cut lengthy ranges\n * @param io_rangeA - Input A\n * @param io_rangeB - Input B\n * @param io_resultingSegment - The resulting overlapping segment\n * @param in_rebasing - Is this function called for rebasing - we have to implement two different\n * behaviors of this function: one for squashing and one for rebasing, because an insert-insert\n * operation in squashing should be separte segments, while for rebasing, we need one segment\n * for both inserts to be able to report a conflict.\n * overlapping range or\n * (partial) A or B\n */\n\nconst splitOverlapping = function (\n\tio_rangeA: OperationRangeInsert | OperationRangeRemove,\n\tio_rangeB: OperationRangeInsert | OperationRangeRemove,\n\tio_resultingSegment: OperationRangeInsert | OperationRangeRemove,\n\tin_rebasing: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (io_rangeA.removeInsertOperation) {\n\t\tio_resultingSegment.removeInsertOperationA = io_rangeA.removeInsertOperation;\n\t} else {\n\t\tdelete io_resultingSegment.removeInsertOperationA;\n\t}\n\tif (io_rangeB.removeInsertOperation) {\n\t\tio_resultingSegment.removeInsertOperationB = io_rangeB.removeInsertOperation;\n\t} else {\n\t\tdelete io_resultingSegment.removeInsertOperationB;\n\t}\n\n\tif (io_rangeB.begin === undefined) {\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeA.end;\n\t\tio_resultingSegment.op = io_rangeA.op;\n\t\tio_resultingSegment.flag = io_rangeA.flag;\n\t\treturn;\n\t}\n\n\tif (\n\t\tio_rangeB.removeInsertOperation &&\n\t\tio_rangeB.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t(io_rangeA.begin === undefined ||\n\t\t\tio_rangeB.removeInsertOperation[0] < io_rangeA.begin - io_rangeA.op.offset) &&\n\t\tio_rangeB.removeInsertOperation[0] < io_rangeB.begin &&\n\t\t!io_rangeB.insertAlreadyProcessed\n\t) {\n\t\tio_resultingSegment.begin = io_rangeB.removeInsertOperation[0];\n\t\tio_resultingSegment.end = io_rangeB.removeInsertOperation[0];\n\t\t(io_resultingSegment as OperationRangeInsert).op = {\n\t\t\ttype: ArrayChangeSetIterator.types.INSERT,\n\t\t\toperation: io_rangeB.removeInsertOperation as arrayInsertList,\n\t\t\toffset: io_rangeB.op.offset,\n\t\t};\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeB;\n\t\tio_rangeB.insertAlreadyProcessed = true;\n\t\treturn;\n\t}\n\n\tif (io_rangeA.begin === undefined) {\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeB.end;\n\t\tio_resultingSegment.op = io_rangeB.op;\n\t\tio_resultingSegment.flag = io_rangeB.flag;\n\t\treturn;\n\t}\n\tio_resultingSegment.opA = undefined;\n\tio_resultingSegment.opB = undefined;\n\tio_resultingSegment.op = undefined;\n\n\t// We have an overlapping remove and insert operation at the same position\n\t// in a squash operation. In that case, we try to create a more efficient\n\t// ChangeSet by detecting cases, in which the remove and insert cancel out\n\t// (which we can detect for a reversible ChangeSet).\n\t// TODO: In the most general case, we should convert the overlapping remove\n\t// insert operations into the most optimal modify operation, but this\n\t// would require the computation of the edit distance between the two\n\t// operations, which could only be done efficiently for named properties.\n\tlet nextInsertOffset = 0;\n\tif (io_rangeA.removeInsertOperation) {\n\t\tnextInsertOffset = getOpLength(io_rangeA.removeInsertOperation);\n\t}\n\tif (\n\t\t!in_rebasing &&\n\t\tio_rangeA.begin <= io_rangeB.begin &&\n\t\tio_rangeA.begin + nextInsertOffset >= io_rangeB.begin &&\n\t\tio_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\tArray.isArray(io_rangeA.op.operation[1]) && // This is a reversible remove operation\n\t\tio_rangeB.op.type === ArrayChangeSetIterator.types.INSERT\n\t) {\n\t\t// Are the two operations canceling out?\n\t\tlet startOffset = 0;\n\t\tlet rangeStart = 0;\n\t\tlet matchFound = false;\n\t\tlet rangeLength = io_rangeB.op.operation[1].length;\n\t\tconst operationMetaInfo =\n\t\t\tin_options &&\n\t\t\tin_options.applyAfterMetaInformation &&\n\t\t\tin_options.applyAfterMetaInformation.get(io_rangeB.op.operation[1]);\n\t\tif (operationMetaInfo && operationMetaInfo.rebasedRemoveInsertRanges) {\n\t\t\tif (operationMetaInfo.currentInsertOffset === undefined) {\n\t\t\t\toperationMetaInfo.currentInsertOffset = 0;\n\t\t\t\toperationMetaInfo.currentRemoveOffset = 0;\n\t\t\t}\n\t\t\tlet i = 0;\n\t\t\tfor (; i < operationMetaInfo.rebasedRemoveInsertRanges.length; i++) {\n\t\t\t\tif (\n\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart >=\n\t\t\t\t\toperationMetaInfo.currentInsertOffset\n\t\t\t\t) {\n\t\t\t\t\tstartOffset =\n\t\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].originalStartPosition -\n\t\t\t\t\t\tio_rangeA.op.operation[0] +\n\t\t\t\t\t\tio_rangeA.op.offset +\n\t\t\t\t\t\tio_rangeB.op.offset;\n\t\t\t\t\trangeStart =\n\t\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart -\n\t\t\t\t\t\toperationMetaInfo.currentInsertOffset;\n\t\t\t\t\trangeLength = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeLength;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tio_rangeA.op.operation[1].length - startOffset >= rangeLength &&\n\t\t\t\t\t\tisEqual(\n\t\t\t\t\t\t\tio_rangeA.op.operation[1].slice(startOffset, startOffset + rangeLength),\n\t\t\t\t\t\t\tio_rangeB.op.operation[1].slice(rangeStart, rangeStart + rangeLength),\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tmatchFound = true;\n\n\t\t\t\t\t\t// If we have an remove / insert operation in the range A we have to make sure,\n\t\t\t\t\t\t// the insert happens at the correct position within the remove range after canceling\n\t\t\t\t\t\t// out the insert/remove combination.\n\t\t\t\t\t\t// We decide this, based on the position of the insert in iterator B relative to the insert\n\t\t\t\t\t\t// in iterator A. If the insert in iterator B is behind the insert in iteraator A, we have\n\t\t\t\t\t\t// to move the insert from A to the beginning of the remove range, since it has to placed\n\t\t\t\t\t\t// before the canceled range.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnextInsertOffset > 0 &&\n\t\t\t\t\t\t\tio_rangeB.begin >= io_rangeA.begin + nextInsertOffset\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst newStartOffset =\n\t\t\t\t\t\t\t\tio_rangeA.op.operation[0] + startOffset - io_rangeA.op.offset;\n\n\t\t\t\t\t\t\t// We don't want to shift the insertion backwards, if it already is before the position of the\n\t\t\t\t\t\t\t// canceled entry\n\t\t\t\t\t\t\tio_rangeA.removeInsertOperation[0] = Math.min(\n\t\t\t\t\t\t\t\tio_rangeA.removeInsertOperation[0],\n\t\t\t\t\t\t\t\tnewStartOffset,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (\n\t\t\t\tio_rangeA.op.operation[1].length === rangeLength &&\n\t\t\t\tisEqual(io_rangeA.op.operation[1], io_rangeB.op.operation[1])\n\t\t\t) {\n\t\t\t\tmatchFound = true;\n\t\t\t}\n\t\t}\n\t\tif (matchFound) {\n\t\t\tif (startOffset > 0) {\n\t\t\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\t\t\tio_resultingSegment.end = io_rangeA.begin;\n\n\t\t\t\tio_resultingSegment.op = {\n\t\t\t\t\ttype: io_rangeA.op.type,\n\t\t\t\t\toperation: [] as any,\n\t\t\t\t};\n\t\t\t\tio_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n\t\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\t_splitArrayParameter(\n\t\t\t\t\tio_resultingSegment.op.operation,\n\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\tstartOffset,\n\t\t\t\t);\n\t\t\t\tio_rangeA.op.operation[0] += startOffset;\n\t\t\t\toperationMetaInfo.currentRemoveOffset += startOffset;\n\t\t\t\treturn;\n\t\t\t} else if (rangeStart > 0) {\n\t\t\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\t\t\tio_resultingSegment.end = rangeStart;\n\n\t\t\t\tio_resultingSegment.op = {\n\t\t\t\t\ttype: io_rangeB.op.type,\n\t\t\t\t\toperation: [] as any,\n\t\t\t\t};\n\t\t\t\tio_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\n\t\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\t_splitArrayParameter(\n\t\t\t\t\tio_resultingSegment.op.operation,\n\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\trangeStart,\n\t\t\t\t);\n\t\t\t\toperationMetaInfo.currentInsertOffset += rangeStart;\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tif (operationMetaInfo) {\n\t\t\t\t\toperationMetaInfo.currentRemoveOffset += rangeLength;\n\t\t\t\t\toperationMetaInfo.currentInsertOffset += rangeLength;\n\t\t\t\t}\n\n\t\t\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\t\t\tio_resultingSegment.end = io_rangeA.end;\n\t\t\t\tio_resultingSegment.op = undefined; // This is used to indicate that we don't need any operation\n\n\t\t\t\tif (io_rangeB.op.operation[1].length === rangeLength) {\n\t\t\t\t\tio_resultingSegment.flag =\n\t\t\t\t\t\tio_rangeA.op.operation[1].length === rangeLength\n\t\t\t\t\t\t\t? ArrayChangeSetRangeType.completeAcompleteB\n\t\t\t\t\t\t\t: ArrayChangeSetRangeType.completeBpartOfA;\n\t\t\t\t} else {\n\t\t\t\t\tio_resultingSegment.flag =\n\t\t\t\t\t\tio_rangeA.op.operation[1].length === rangeLength\n\t\t\t\t\t\t\t? ArrayChangeSetRangeType.completeApartOfB\n\t\t\t\t\t\t\t: ArrayChangeSetRangeType.partOfApartOfB;\n\t\t\t\t}\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\tif (\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t\t) {\n\t\t\t\t\t_splitArrayParameter(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\t\trangeLength,\n\t\t\t\t\t);\n\t\t\t\t\tio_rangeA.op.operation[0] += rangeLength;\n\t\t\t\t}\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\tif (\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t\t) {\n\t\t\t\t\t_splitArrayParameter(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\t\trangeLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\tio_rangeA.end < io_rangeB.begin || // please see in_rebasing comments in the function description\n\t\t((!in_rebasing || io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n\t\t\tio_rangeA.end === io_rangeB.begin)\n\t) {\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeA.end;\n\t\tio_resultingSegment.op = io_rangeA.op;\n\t\tio_resultingSegment.flag = io_rangeA.flag;\n\n\t\t// We need to store the length of the adjacent remove operation for later squashes\n\t\tif (\n\t\t\tin_rebasing &&\n\t\t\tio_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t\tio_rangeA.end === io_rangeB.begin\n\t\t) {\n\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\tlet length = io_rangeB.op.operation[1];\n\t\t\t\tif (!isNumber(length)) {\n\t\t\t\t\tlength = length.length;\n\t\t\t\t}\n\n\t\t\t\tin_options.applyAfterMetaInformation.set(io_rangeB.op.operation[1], {\n\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\trangeLength: length,\n\t\t\t\t\t\t\toriginalStartPosition: io_rangeA.end + io_rangeB.op.offset,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\tio_rangeB.end < io_rangeA.begin || // please see in_rebasing comments in the function description\n\t\t(!in_rebasing && io_rangeB.end === io_rangeA.begin)\n\t) {\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeB.end;\n\t\tio_resultingSegment.op = io_rangeB.op;\n\t\tio_resultingSegment.flag = io_rangeB.flag;\n\t\treturn;\n\t}\n\t// handle real overlaps:\n\tif (io_rangeA.begin < io_rangeB.begin) {\n\t\t// take A up to the begin of B\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeB.begin;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.op = {\n\t\t\ttype: io_rangeA.op.type,\n\t\t\toperation: [] as any,\n\t\t};\n\t\tio_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n\t\t// cut the remaining segment entry\n\t\t_splitOperation(\n\t\t\tio_rangeA,\n\t\t\tio_resultingSegment.op,\n\t\t\tio_rangeB.begin - io_rangeA.begin,\n\t\t\ttrue,\n\t\t);\n\n\t\tio_rangeA.begin = io_rangeB.begin;\n\t\tio_rangeA.op.operation[0] = io_rangeB.begin;\n\t} else if (io_rangeA.begin === io_rangeB.begin) {\n\t\t// find the largest common range:\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = undefined;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.opA = {\n\t\t\ttype: io_rangeA.op.type,\n\t\t\toperation: [],\n\t\t\t_absoluteBegin: io_rangeA.op._absoluteBegin,\n\t\t};\n\t\tio_resultingSegment.opA.operation[0] = io_rangeA.op.operation[0];\n\t\tio_resultingSegment.opB = {\n\t\t\ttype: io_rangeB.op.type,\n\t\t\toperation: [],\n\t\t\toffset: io_rangeB.op.offset,\n\t\t};\n\t\tio_resultingSegment.opB.operation[0] = io_rangeB.op.operation[0];\n\n\t\t// who ends first, A or B?\n\t\tif (io_rangeA.end < io_rangeB.end) {\n\t\t\t// segment A ends first, it is consumed by the resulting merged segment!\n\t\t\t// a part of segment B remains and needs updates\n\t\t\tio_resultingSegment.end = io_rangeA.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeApartOfB;\n\n\t\t\t// cut the remaining segment B entries (segment A needs no update!)\n\t\t\t_splitOperation(\n\t\t\t\tio_rangeB,\n\t\t\t\tio_resultingSegment.opB,\n\t\t\t\tio_rangeA.end - io_rangeA.begin,\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\t// just copy opA\n\t\t\t_copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\n\t\t\tio_rangeB.begin = io_rangeA.end;\n\t\t\tio_rangeB.op.operation[0] = io_rangeA.end;\n\t\t} else if (io_rangeA.end > io_rangeB.end) {\n\t\t\t// segment B ends first, it is consumed by the resulting merged segment!\n\t\t\t// a part of segment A remains and needs updates\n\t\t\tio_resultingSegment.end = io_rangeB.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeBpartOfA;\n\n\t\t\t// cut the remaining segment A entry\n\t\t\t_splitOperation(\n\t\t\t\tio_rangeA,\n\t\t\t\tio_resultingSegment.opA,\n\t\t\t\tio_rangeB.end - io_rangeB.begin,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\t// just copy opB\n\t\t\t_copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\n\t\t\tio_rangeA.begin = io_rangeB.end;\n\t\t\tio_rangeA.op.operation[0] = io_rangeB.end;\n\t\t}\n\t\tif (io_rangeA.end === io_rangeB.end) {\n\t\t\tio_resultingSegment.end = io_rangeB.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeAcompleteB;\n\t\t\t// both are fully used, no cut needed!\n\n\t\t\t// copy ops\n\t\t\t_copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\t\t\t_copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\t\t}\n\t} else if (io_rangeB.begin < io_rangeA.begin) {\n\t\t// take B up to the begin of A\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeA.begin;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.op = {\n\t\t\ttype: io_rangeB.op.type,\n\t\t\toperation: [] as any,\n\t\t};\n\t\tio_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n\t\t// cut the remaining segment entry\n\t\t_splitOperation(\n\t\t\tio_rangeB,\n\t\t\tio_resultingSegment.op,\n\t\t\tio_rangeA.begin - io_rangeB.begin,\n\t\t\tfalse,\n\t\t);\n\n\t\tio_rangeB.begin = io_rangeA.begin;\n\t\tio_rangeB.op.operation[0] = io_rangeA.begin;\n\t\tio_rangeB.op.offset = 0;\n\t}\n};\n\n/**\n * merge in_op with the last op of that category in io_changeset (if possible)\n * e.g. merge an delete [1,3] with delete [3,2] to delete [1,5]\n * @param in_op - The op to merge\n * @param io_changeset - The changeset to merge the op to\n * @param in_targetIndex - The transformed target index offset\n * @returns true if the merge was possible and executed\n */\nconst mergeWithLastIfPossible = function (\n\tin_op: GenericOperation,\n\tio_changeset: SerializedChangeSet,\n\tin_targetIndex: number,\n\tin_options?: ApplyChangeSetOptions,\n): boolean {\n\tlet lastOp;\n\tswitch (in_op.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tif (io_changeset.insert.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastOp = io_changeset.insert[io_changeset.insert.length - 1];\n\t\t\tif (lastOp[0] === in_targetIndex) {\n\t\t\t\t// If we merge two segments, we also have to merge the attached meta information and store mappings for the\n\t\t\t\t// sub-ranges of the merged segment\n\t\t\t\tlet mergedRangeMetaInformation;\n\t\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\t\tconst previousMetaInfo = in_options.applyAfterMetaInformation.get(lastOp[1]);\n\t\t\t\t\tconst currentMetaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n\t\t\t\t\tif (previousMetaInfo || currentMetaInfo) {\n\t\t\t\t\t\t// Get the range information attached to the segments that get merged\n\t\t\t\t\t\tconst previousRange =\n\t\t\t\t\t\t\t(previousMetaInfo && previousMetaInfo.rebasedRemoveInsertRanges) || [];\n\t\t\t\t\t\tconst nextRange =\n\t\t\t\t\t\t\t(currentMetaInfo && currentMetaInfo.rebasedRemoveInsertRanges) || [];\n\n\t\t\t\t\t\t// Update the start index\n\t\t\t\t\t\tfor (let i = 0; i < nextRange.length; i++) {\n\t\t\t\t\t\t\tnextRange[i].rangeStart += lastOp[1].length;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (let i = 0; i < nextRange.length; i++) {\n\t\t\t\t\t\t\tpreviousRange.push(nextRange[i]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmergedRangeMetaInformation = previousRange;\n\n\t\t\t\t\t\t// Remove the old entries from the meta information\n\t\t\t\t\t\tin_options.applyAfterMetaInformation.delete(lastOp[1]);\n\t\t\t\t\t\tin_options.applyAfterMetaInformation.delete(in_op.operation[1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// merge with last insert\n\t\t\t\tif (isString(in_op.operation[1])) {\n\t\t\t\t\tfor (let i = 0; i < in_op.operation[1].length; i++) {\n\t\t\t\t\t\tlastOp[1] += in_op.operation[1][i];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < in_op.operation[1].length; i++) {\n\t\t\t\t\t\tlastOp[1].push(in_op.operation[1][i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Store the updated meta-information\n\t\t\t\tif (mergedRangeMetaInformation) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(lastOp[1], {\n\t\t\t\t\t\trebasedRemoveInsertRanges: mergedRangeMetaInformation,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// We cannot perform merges for removes here, as those\n\t\t\t// also depend on the insert positions, which might not\n\t\t\t// yet have been processed when the remove is processed.\n\t\t\t// We handle these in a post processing step instead\n\t\t\tthrow new Error(\"Should never happen\");\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tif (io_changeset.modify.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastOp = io_changeset.modify[io_changeset.modify.length - 1];\n\t\t\tif (lastOp[0] + lastOp[1].length === in_targetIndex) {\n\t\t\t\t// merge with last modify\n\t\t\t\tlastOp[1] = lastOp[1].concat(in_op.operation[1]);\n\t\t\t\tif (lastOp[2] !== undefined) {\n\t\t\t\t\tlastOp[2] = lastOp[2].concat(in_op.operation[2]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${in_op.type}`);\n\t}\n\treturn true;\n};\n\ninterface RemoveOpInfo {\n\tposition: number;\n\toffsetIncremented: boolean;\n\tlength: number;\n}\n\n/**\n * push an operation to a changeset, will try to merge the op if possible\n * @param in_op - The operation we want to push\n * @param io_changeset - The target\n * @param the - The current offset\n * @param in_options - Optional additional parameters\n * @param in_lastIteratorARemove - The information about the last remove operation in iterator A\n * @param in_segment - The segment this operation is part of\n */\nconst pushOp = function (\n\tin_op: GenericOperation,\n\tio_changeset: SerializedChangeSet,\n\tin_indexOffset: number,\n\tin_options?: ApplyChangeSetOptions,\n\tin_lastIteratorARemove?: RemoveOpInfo,\n\tin_segment?: SegmentType,\n) {\n\tlet writeTargetIndex;\n\tif (ArrayChangeSetIterator.types.NOP !== in_op.type) {\n\t\twriteTargetIndex = in_op.operation[0] - in_indexOffset;\n\n\t\t// We have to update the write target index, if we have an insert at the\n\t\t// position of a remove. In that case, we have to move the insert to the beginning\n\t\t// of the remove range, to make sure, it will give consistent results with individually\n\t\t// rebasing the two changsets (first rebasing an insert at the beginning of the remove the\n\t\t// wouldn't have an effect on rebased changeset and then rebasing it with respect to the\n\t\t// insert would move it befind the insert. If we do this rebase with respect to the combined\n\t\t// CS, we must have the insert before the remove to make sure it is taken into account)\n\t\tif (\n\t\t\tArrayChangeSetIterator.types.INSERT === in_op.type &&\n\t\t\tin_lastIteratorARemove !== undefined &&\n\t\t\tin_segment.flag === ArrayChangeSetRangeType.completeB\n\t\t) {\n\t\t\tif (\n\t\t\t\tin_lastIteratorARemove.position == in_op.operation[0] &&\n\t\t\t\tin_lastIteratorARemove.offsetIncremented\n\t\t\t) {\n\t\t\t\twriteTargetIndex -= in_lastIteratorARemove.length;\n\t\t\t}\n\t\t}\n\t\tif (writeTargetIndex < 0) {\n\t\t\twriteTargetIndex = 0; // TODO: investigate negative index!\n\t\t}\n\t}\n\tswitch (in_op.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tif (\n\t\t\t\tin_options &&\n\t\t\t\tin_options.applyAfterMetaInformation &&\n\t\t\t\t!isNumber(in_op.operation[1])\n\t\t\t) {\n\t\t\t\t// If we don't have any meta information yet, we add an entry with the correct offset applied\n\t\t\t\tconst metaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n\t\t\t\tif (!metaInfo) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(in_op.operation[1], {\n\t\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\t\trangeLength: in_op.operation[1].length,\n\t\t\t\t\t\t\t\toriginalStartPosition: in_op.operation[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n\t\t\t\tio_changeset.insert.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// Note: we don't merge removes here, since those depend on not yet processed inserts.\n\t\t\t// This is done in a post processing step instead\n\n\t\t\t// our segmentation method currently can produce length zero remove segments\n\t\t\t// this is by by design and those filtered out here\n\t\t\tconst length = getOpLength(in_op.operation);\n\t\t\tif (length > 0) {\n\t\t\t\tio_changeset.remove.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n\t\t\t\tif (in_op.operation[2] !== undefined) {\n\t\t\t\t\tio_changeset.modify.push([writeTargetIndex, in_op.operation[1], in_op.operation[2]]);\n\t\t\t\t} else {\n\t\t\t\t\tio_changeset.modify.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.NOP: {\n\t\t\t// nothing to do\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${(in_op as any).type}`);\n\t}\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n * @param in_segment - The two ops to be combined\n * @param in_isPrimitiveType - Is it an array of primitive types\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n */\nconst handleCombinations = function (in_segment: SegmentType, in_isPrimitiveType: boolean) {\n\tconst opA = in_segment.opA;\n\tconst opB = in_segment.opB;\n\tswitch (opA.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\t// this combination is not reachable since this case has already been handled before\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"this combination should not occur in handleCombinations - this is a bug\",\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// Attention: B removes A completely, kill A to avoid zero inserts\n\t\t\t\t\tconst opBLen = isNumber(opB.operation[1])\n\t\t\t\t\t\t? opB.operation[1]\n\t\t\t\t\t\t: opB.operation[1].length;\n\t\t\t\t\tif (opBLen !== opA.operation[1].length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"handleCombinations: insert-remove: unequal number of affected entries\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// we have to apply modify of B to As insert\n\t\t\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t\t\t// since the length of A and B is equal in here\n\t\t\t\t\t\t// we can just insert the modified values instead\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// the array element is a complex types\n\t\t\t\t\t\t// we have to recursively call the modify\n\t\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\t\t// TypeIds MUST be stored in the entries\n\t\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tthis.performApplyAfterOnPropertyWithTypeid(\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topB.operation = opA.operation;\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// this combination is not reachable since this case has already been handled before\n\t\t\tconsole.error(\"this combination should not occur in handleCombinations - this is a bug\");\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t// If we have a reversible changeset, we\n\t\t\t\t// have to keep the previous state from before the\n\t\t\t\t// apply after\n\t\t\t\tif (opA.operation[2] !== undefined) {\n\t\t\t\t\t(opB as ModifyOperation).operation[2] = opA.operation[2];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// we have to deal with complex types here!\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\t// TypeIds MUST be stored in the entries\n\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.performApplyAfterOnPropertyWithTypeid(\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\topB.operation = opA.operation;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n\t}\n};\n\n/**\n * Tests if 2 arrays of the same length, containing primitive values, contain the same values.\n *\n * @param in_arr1 - First array to compare\n * @param in_arr2 - Second array to compare\n * @returns True if arrays contain the same values, false otherwise\n */\nconst arraysHaveSameValues = function (\n\tin_arr1: arrayModifyList[1],\n\tin_arr2: arrayModifyList[1],\n): boolean {\n\t// We assume arrays are of same length\n\tconst len = in_arr1.length;\n\tif (len !== in_arr2.length) {\n\t\treturn false;\n\t}\n\n\tlet i;\n\t// For (u)int64, values are arrays of 2 elements\n\tif (len > 0 && in_arr1[0].length === 2) {\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (in_arr1[i][0] !== in_arr2[i][0] || in_arr1[i][1] !== in_arr2[i][1]) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (in_arr1[i] !== in_arr2[i]) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn i === len;\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n *\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n *\n * ```\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n * ```\n *\n * gets rebased to:\n *\n * ```\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n * ```\n *\n * conflict default behavior in ()\n *\n * ```\n * -------|-----------------+------------------+------------------|\n * \\Own| insert | modify | remove |\n * \\ | | | |\n * other\\ | | | |\n * ------\\|-----------------+------------------+------------------|\n * | conflicting | non-conflicting | non-conflicting |\n * insert | inserts | change | change |\n * | (i. other after)| | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | merge recursively| conflict |\n * modify | change | (note the user) | (delete modify |\n * | | | in other) |\n * | | | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | non-conflicting | non-conflicting |\n * remove | change | change | change |\n * | [rem orig. data]| (note the user) | [rem dupl. rem] |\n * -------|-----------------+------------------+------------------|\n * ```\n *\n * @param {{opA:{}, opB:{}}} in_segment - The two ops to be combined\n * @param {Array.<property-changeset.ChangeSet.ConflictInfo>} out_conflicts - A list of paths that resulted in\n * conflicts together with the type of the conflict\n * @param {string} in_basePath - Base path to get to the property processed by this function\n * @param {boolean} in_isPrimitiveType - is it an array of primitive types\n * @param {Object} [in_options] - Optional additional parameters\n * @param {Map} [in_options.applyAfterMetaInformation] - Additional meta information which help later to obtain\n * more compact changeset during the apply operation\n */\nconst handleRebaseCombinations = function (\n\tin_segment: SegmentType,\n\tout_conflicts: ConflictInfo[],\n\tin_basePath: string,\n\tin_isPrimitiveType: string,\n\tin_options: ApplyChangeSetOptions,\n) {\n\tconst opA = in_segment.opA;\n\tconst opB = in_segment.opB;\n\tif (opB.type === ArrayChangeSetIterator.types.INSERT) {\n\t\tconst originalStartPosition = opB.operation[0] + opB.offset;\n\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\tlet length: number;\n\t\t\tconst insertEntries = opB.operation[1];\n\t\t\tif (!isNumber(insertEntries)) {\n\t\t\t\tlength = insertEntries.length;\n\n\t\t\t\tin_options.applyAfterMetaInformation.set(insertEntries, {\n\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\trangeLength: length,\n\t\t\t\t\t\t\toriginalStartPosition,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst handleInsert = (insertOp: Omit<InsertOperation, \"type\">, baseOp: InsertOperation) => {\n\t\t// conflicting inserts - report conflict, insert both\n\t\tdelete insertOp._absoluteBegin;\n\t\tdelete baseOp.offset;\n\t\tconst conflict = {\n\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\ttype: ConflictType.INSERTED_ENTRY_WITH_SAME_KEY, // todo\n\t\t\tconflictingChange: cloneDeep(baseOp),\n\t\t};\n\t\tout_conflicts.push(conflict);\n\n\t\t// move to the right side of the insert\n\t\tbaseOp.operation[0] += insertOp.operation[1].length;\n\t};\n\tswitch (opA.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\thandleInsert(opA, opB);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// non-conflicting insert - just keep B\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// non-conflicting insert - just keep B\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\tif (opA._absoluteBegin !== opA.operation[0]) {\n\t\t\t\t\t\t// Move the insert operation to the beginning of the removed range\n\t\t\t\t\t\topB.operation[0] -= opA.operation[0] - opA._absoluteBegin;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we have a range with a remove / insert operation, we have\n\t\t\t\t\t// to take the insert operation within the base changeset\n\t\t\t\t\t// into account during rebasing, moving the rebased operation\n\t\t\t\t\t// behind this insert\n\t\t\t\t\tif (\n\t\t\t\t\t\tin_segment.removeInsertOperationA &&\n\t\t\t\t\t\tin_segment.removeInsertOperationA[0] === opB.operation[0]\n\t\t\t\t\t) {\n\t\t\t\t\t\thandleInsert(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toperation: in_segment.removeInsertOperationA as arrayInsertList,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\topB,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// Remove already in A, no need to add the same again -> write nop\n\n\t\t\t\t\tconst opBLen = isNumber(opB.operation[1])\n\t\t\t\t\t\t? opB.operation[1]\n\t\t\t\t\t\t: opB.operation[1].length;\n\t\t\t\t\tconst opALen = isNumber(opA.operation[1])\n\t\t\t\t\t\t? opA.operation[1]\n\t\t\t\t\t\t: opA.operation[1].length;\n\n\t\t\t\t\tif (opBLen !== opALen) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"handleRebaseCombinations: remove-remove: unequal number of affected entries, \" +\n\t\t\t\t\t\t\t\t\"this should never happen! Probably a bug in splitRange.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// trying to modify something that was removed ->\n\t\t\t\t\t// replace the modify with a NOP and report a conflict\n\n\t\t\t\t\tif (opB.operation[1].length > 0) {\n\t\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\t\ttype: ConflictType.ENTRY_MODIFIED_AFTER_REMOVE,\n\t\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t\t}\n\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t// just use opB and notify accordingly\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY && opB.operation[1].length > 0) {\n\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t};\n\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t\t// If opB new value is same as opA new value, replace the modify with a NOP\n\t\t\t\t\t// TODO: The real operation that we should do here is not to only test if both arrays are\n\t\t\t\t\t// completely identical, but if any value is identical and if so split the range\n\t\t\t\t\t// into multiple ones.\n\t\t\t\t\t// Ex. [[0, [30, 20, 10]]] over [[0, [10, 20, 30]]] should become [[0, [30]], [2, [10]]].\n\t\t\t\t\t// This does not seem easily doable in the current code.\n\t\t\t\t\tif (arraysHaveSameValues(opA.operation[1], opB.operation[1])) {\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\t\topB.operation = null;\n\t\t\t\t\t\t// If any, change the opB old value by the opA new value\n\t\t\t\t\t} else if (opB.operation[2]) {\n\t\t\t\t\t\topB.operation[2] = opA.operation[1].slice();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// WARNING: 'operation[1]' is 'string | number | genericArray'. The cast to 'number'\n\t\t\t\t// preserves the JavaScript coercion behavior, which was permitted prior to TS5.\n\t\t\t\tif (\n\t\t\t\t\topB.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t\t\t\t(opB.operation[1] as number) > 0\n\t\t\t\t) {\n\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\ttype: ConflictType.REMOVE_AFTER_MODIFY,\n\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t};\n\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// we have to deal with complex types here!\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.rebaseChangeSetForPropertyEntryWithTypeid(\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t`${in_basePath}[${i}]`,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tout_conflicts,\n\t\t\t\t\t\t\tin_options,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n\t}\n};\n\n/**\n * apply a range's operation to the changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applySegment = function (\n\tin_segment: SegmentType,\n\tio_changeset: SerializedChangeSet,\n\tin_currentIndexOffset: number,\n\tlastIteratorARemove: RemoveOpInfo,\n\tin_isPrimitiveType: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_segment) {\n\t\tthrow Error(\"applySegment: in_segment is undefined!\");\n\t}\n\n\t// No operation needs to be performed\n\tif (\n\t\tin_segment.op === undefined &&\n\t\tin_segment.opA === undefined &&\n\t\tin_segment.opB === undefined\n\t) {\n\t\treturn;\n\t}\n\tif (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfApartOfB\n\t) {\n\t\t// just push it\n\t\tpushOp(\n\t\t\tin_segment.op,\n\t\t\tio_changeset,\n\t\t\tin_currentIndexOffset,\n\t\t\tin_options,\n\t\t\tlastIteratorARemove,\n\t\t\tin_segment,\n\t\t);\n\t} else {\n\t\t// combinations: pAB, AB or ApB\n\t\thandleCombinations.call(this, in_segment, in_isPrimitiveType); // modifies in_segment.opB to save garbage\n\t\tpushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n\t}\n};\n\n/**\n * apply a range's operation to the rebased changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_basePath - Base path to get to the property processed by this function\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applyRebaseSegment = function (\n\tin_segment: SegmentType,\n\tio_changeset: SerializedChangeSet,\n\tin_currentIndexOffset: number,\n\tout_conflicts: ConflictInfo[],\n\tin_basePath: string,\n\tin_isPrimitiveType: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_segment) {\n\t\tthrow Error(\"applySegment: in_segment is undefined!\");\n\t}\n\tif (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfB\n\t) {\n\t\t// not touching anything of A, just push it\n\t\tpushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options);\n\t} else if (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfA\n\t) {\n\t\t// do nothing (we are rebasing B, not A)\n\t} else {\n\t\t// combinations: pAB, AB or ApB\n\t\thandleRebaseCombinations.call(\n\t\t\tthis,\n\t\t\tin_segment,\n\t\t\tout_conflicts,\n\t\t\tin_basePath,\n\t\t\tin_isPrimitiveType,\n\t\t\tin_options,\n\t\t); // modifies in_segment.opB to save garbage\n\t\tpushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n\t}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ChangeSetArrayFunctions {\n\t/**\n\t * Applies a changeset to a given array property. The ChangeSet is assumed to be relative to the same\n\t * property root and it will be applied behind the base ChangeSet (assuming that the changes are relative to the\n\t * state after the base ChangeSet has been applied. It will change the base ChangeSet.)\n\t *\n\t * @param io_basePropertyChanges - The ChangeSet describing the initial state\n\t * @param in_appliedPropertyChanges - The ChangeSet to apply to this state\n\t * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n\t */\n\texport function _performApplyAfterOnPropertyArray(\n\t\tio_basePropertyChanges: SerializedChangeSet,\n\t\tin_appliedPropertyChanges: SerializedChangeSet,\n\t\tin_typeid: string,\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tConsoleUtils.assert(in_typeid, \"_performApplyAfterOnPropertyArray: typeid missing\");\n\t\tConsoleUtils.assert(!isString(io_basePropertyChanges), io_basePropertyChanges);\n\t\tConsoleUtils.assert(!isString(in_appliedPropertyChanges), in_appliedPropertyChanges);\n\n\t\tconst isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n\t\t// Iterator to process the changes in the ChangeSet in the correct order\n\t\tconst iteratorA = new ArrayChangeSetIterator(io_basePropertyChanges);\n\t\tconst iteratorB = new ArrayChangeSetIterator(in_appliedPropertyChanges);\n\n\t\tconst rangeA: OperationRangeRemove | OperationRangeInsert = {};\n\t\tconst rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\n\t\tconst opA = iteratorA.opDescription;\n\t\tconst opB = iteratorB.opDescription;\n\n\t\tgetRangeForCurrentStateOperation(opA, opA.offset ? opA.offset : 0, rangeA);\n\t\tgetRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\n\t\tconst resultPropertyChanges: SerializedChangeSet = {};\n\t\tresultPropertyChanges.insert = [];\n\t\tresultPropertyChanges.modify = [];\n\t\tresultPropertyChanges.remove = [];\n\t\tresultPropertyChanges.writeOffset = 0;\n\n\t\tlet currentIndexOffset = 0;\n\t\tlet lastIteratorARemove;\n\t\tconst segment: OperationRangeRemove | OperationRangeInsert = {};\n\t\tlet skipIteratorBOperation;\n\n\t\tconst advanceIteratorB = () => {\n\t\t\tif (\n\t\t\t\t(opB as any).removeInsertOperation &&\n\t\t\t\tsegment.op !== undefined &&\n\t\t\t\tskipIteratorBOperation === undefined &&\n\t\t\t\tsegment.op.operation === (opB as any).removeInsertOperation\n\t\t\t) {\n\t\t\t\tskipIteratorBOperation = segment.op.operation;\n\t\t\t} else {\n\t\t\t\titeratorB.next();\n\t\t\t\tif (skipIteratorBOperation && opB.operation === skipIteratorBOperation) {\n\t\t\t\t\titeratorB.next();\n\t\t\t\t}\n\t\t\t\tskipIteratorBOperation = undefined;\n\t\t\t\tgetRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\t\t\t}\n\t\t};\n\n\t\t// create ranges for A and B: A is the current state and B is the change set to be applied\n\t\tlet lastIndexOffset = 0;\n\t\tlet canceledSegmentBegin;\n\t\tlet lastOpWasNop = false;\n\n\t\twhile (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n\t\t\t// produce first segment:\n\t\t\tsplitOverlapping(rangeA, rangeB, segment, false, in_options);\n\n\t\t\tlet indexOffset = currentIndexOffset;\n\n\t\t\tif (\n\t\t\t\tlastOpWasNop &&\n\t\t\t\t(rangeA.begin === undefined || rangeA.begin >= segment.begin) &&\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB &&\n\t\t\t\tsegment.op.type === ArrayChangeSetIterator.types.INSERT &&\n\t\t\t\tsegment.op.operation[0] === canceledSegmentBegin\n\t\t\t) {\n\t\t\t\tindexOffset = lastIndexOffset;\n\t\t\t}\n\n\t\t\tapplySegment.call(\n\t\t\t\tthis,\n\t\t\t\tsegment,\n\t\t\t\tresultPropertyChanges,\n\t\t\t\tindexOffset,\n\t\t\t\tlastIteratorARemove,\n\t\t\t\tisPrimitiveTypeid,\n\t\t\t);\n\t\t\tlastOpWasNop =\n\t\t\t\tsegment.opB !== undefined && segment.opB.type === ArrayChangeSetIterator.types.NOP;\n\t\t\tif (lastOpWasNop) {\n\t\t\t\tcanceledSegmentBegin = segment.begin;\n\t\t\t}\n\n\t\t\t// increase pointers if necessary\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeA ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t) {\n\t\t\t\t// We keep track of the last remove operation, because this information is needed\n\t\t\t\t// in pushOp to move inserts to the beginning of a remove range. The problem is\n\t\t\t\t// that the insert is processed after the remove and in that case the iterator\n\t\t\t\t// offset has already been incremented by the remove. Therefore, the insert would\n\t\t\t\t// be placed behind the remove. We detect this case and correct the offset accordingly\n\t\t\t\t// in pushOp\n\t\t\t\tif (opA.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\t\t\t\tif (!lastIteratorARemove || lastIteratorARemove.position !== opA.operation[0]) {\n\t\t\t\t\t\tlastIteratorARemove = {\n\t\t\t\t\t\t\tposition: opA.operation[0],\n\t\t\t\t\t\t\tlength: getOpLength(opA.operation),\n\t\t\t\t\t\t\toffsetIncremented: false,\n\t\t\t\t\t\t\tcurrentIndex: opA.operation[0],\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// If there is already an insert operation at the beginning of the remove range\n\t\t\t\t\t\t// we have to adjust the position to the end of this operation (an insert that is\n\t\t\t\t\t\t// applied at the position of the remove would be shifted behind this insert)\n\t\t\t\t\t\tif (opA.removeInsertOperation) {\n\t\t\t\t\t\t\tif (opA.removeInsertOperation[0] + opA.offset === lastIteratorARemove.position) {\n\t\t\t\t\t\t\t\tlastIteratorARemove.position += getOpLength(opA.removeInsertOperation);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet moreAs = iteratorA.next();\n\n\t\t\t\t// The offset will only be incremented as soon as the iterator reaches an operation at a different index.\n\t\t\t\t// We detect this case and keep track, whether the remove has already been added to the offset or not.\n\t\t\t\tif (\n\t\t\t\t\tlastIteratorARemove &&\n\t\t\t\t\t((opA as any).operation === undefined ||\n\t\t\t\t\t\t(opA as any).operation[0] !== lastIteratorARemove.currentIndex)\n\t\t\t\t) {\n\t\t\t\t\tlastIteratorARemove.offsetIncremented = true;\n\t\t\t\t}\n\t\t\t\tgetRangeForCurrentStateOperation(\n\t\t\t\t\titeratorA.opDescription,\n\t\t\t\t\tmoreAs ? opA.offset : 0,\n\t\t\t\t\trangeA,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t) {\n\t\t\t\tadvanceIteratorB();\n\t\t\t}\n\t\t\tif (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n\t\t\t\tlet moreAs = iteratorA.next();\n\t\t\t\tgetRangeForCurrentStateOperation(opA, moreAs ? opA.offset : 0, rangeA);\n\t\t\t\tadvanceIteratorB();\n\t\t\t}\n\n\t\t\tif (opA.offset !== undefined) {\n\t\t\t\t// the correct index offset for the next operation is given by A's offset\n\t\t\t\tlastIndexOffset = currentIndexOffset;\n\t\t\t\tcurrentIndexOffset = opA.offset;\n\t\t\t}\n\t\t}\n\n\t\t// write back:\n\t\tif (resultPropertyChanges.insert.length > 0) {\n\t\t\tio_basePropertyChanges.insert = resultPropertyChanges.insert;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.insert;\n\t\t}\n\t\tif (resultPropertyChanges.modify.length > 0) {\n\t\t\tio_basePropertyChanges.modify = resultPropertyChanges.modify;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.modify;\n\t\t}\n\n\t\tif (resultPropertyChanges.remove.length > 0) {\n\t\t\t// Merge remove operations (but only, if there is no\n\t\t\t// insert inbetween the two removes)\n\t\t\tconst insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n\t\t\tconst mergedRemoves = [];\n\t\t\tfor (const remove of resultPropertyChanges.remove) {\n\t\t\t\tconst lastRemove = mergedRemoves[mergedRemoves.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastRemove &&\n\t\t\t\t\tlastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n\t\t\t\t\t!insertPosition.has(remove[0])\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(remove[1])) {\n\t\t\t\t\t\tlastRemove[1] = lastRemove[1].concat(remove[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastRemove[1] += remove[1];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmergedRemoves.push(remove);\n\t\t\t\t}\n\t\t\t}\n\t\t\tio_basePropertyChanges.remove = mergedRemoves;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.remove;\n\t\t}\n\t}\n\n\t/**\n\t * Performs the rebase operation for array changes\n\t *\n\t * @param in_ownPropertyChangeSet -The ChangeSet for the property stored in this object\n\t * @param io_rebasePropertyChangeSet - The ChangeSet for the property to be rebased\n\t * @param in_basePath - Base path to get to the property processed by this function\n\t * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n\t * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n\t */\n\texport function _rebaseArrayChangeSetForProperty(\n\t\tin_ownPropertyChangeSet: SerializedChangeSet,\n\t\tio_rebasePropertyChangeSet: SerializedChangeSet,\n\t\tin_basePath: string,\n\t\tout_conflicts: ConflictInfo[],\n\t\tin_typeid: string,\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tconst isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n\t\t// Iterator to process the changes in the ChangeSet in the correct order\n\t\tconst iteratorA = new ArrayChangeSetIterator(in_ownPropertyChangeSet);\n\t\tconst iteratorB = new ArrayChangeSetIterator(io_rebasePropertyChangeSet);\n\n\t\tconst opA = iteratorA.opDescription;\n\n\t\tconst rangeA: OperationRangeRemove | OperationRangeInsert = {};\n\t\tgetRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n\t\tconst rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\n\t\tconst resultPropertyChanges: SerializedChangeSet = {};\n\t\tresultPropertyChanges.insert = [];\n\t\tresultPropertyChanges.modify = [];\n\t\tresultPropertyChanges.remove = [];\n\t\tresultPropertyChanges.writeOffset = 0;\n\n\t\tlet currentIndexOffset = 0;\n\t\tconst segment: OperationRangeRemove | OperationRangeInsert = {};\n\n\t\t// create ranges for A and B: A is the current state and B is the change set to be applied\n\t\twhile (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n\t\t\tsplitOverlapping(rangeA, rangeB, segment, true, in_options);\n\n\t\t\tapplyRebaseSegment.call(\n\t\t\t\tthis,\n\t\t\t\tsegment,\n\t\t\t\tresultPropertyChanges,\n\t\t\t\tcurrentIndexOffset,\n\t\t\t\tout_conflicts,\n\t\t\t\tin_basePath,\n\t\t\t\tisPrimitiveTypeid,\n\t\t\t\tin_options,\n\t\t\t);\n\n\t\t\t// increase pointers if necessary\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeA ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t) {\n\t\t\t\titeratorA.next();\n\t\t\t\tgetRangeForAppliedOperation(\n\t\t\t\t\topA,\n\t\t\t\t\trangeA,\n\t\t\t\t\tArrayChangeSetRangeType.completeA,\n\t\t\t\t\tin_options,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t) {\n\t\t\t\titeratorB.next();\n\t\t\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\t\t\t}\n\t\t\tif (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n\t\t\t\titeratorA.next();\n\t\t\t\tgetRangeForAppliedOperation(\n\t\t\t\t\topA,\n\t\t\t\t\trangeA,\n\t\t\t\t\tArrayChangeSetRangeType.completeA,\n\t\t\t\t\tin_options,\n\t\t\t\t);\n\t\t\t\titeratorB.next();\n\t\t\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\t\t\t}\n\n\t\t\tif (opA.offset !== undefined) {\n\t\t\t\t// the correct index offset for the next operation is given by A's offset\n\t\t\t\tcurrentIndexOffset = -opA.offset;\n\t\t\t}\n\t\t}\n\n\t\t// write back:\n\t\tif (resultPropertyChanges.insert.length > 0) {\n\t\t\tio_rebasePropertyChangeSet.insert = resultPropertyChanges.insert;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.insert;\n\t\t}\n\t\tif (resultPropertyChanges.modify.length > 0) {\n\t\t\tio_rebasePropertyChangeSet.modify = resultPropertyChanges.modify;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.modify;\n\t\t}\n\t\tif (resultPropertyChanges.remove.length > 0) {\n\t\t\t// Merge remove operations (but only, if there is no\n\t\t\t// insert in between the two removes)\n\t\t\tconst insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n\t\t\tconst mergedRemoves = [];\n\t\t\tfor (const remove of resultPropertyChanges.remove) {\n\t\t\t\tconst lastRemove = mergedRemoves[mergedRemoves.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastRemove &&\n\t\t\t\t\tlastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n\t\t\t\t\t!insertPosition.has(remove[0])\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(remove[1])) {\n\t\t\t\t\t\tlastRemove[1] = lastRemove[1].concat(remove[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastRemove[1] += remove[1];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmergedRemoves.push(remove);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tio_rebasePropertyChangeSet.remove = mergedRemoves;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.remove;\n\t\t}\n\t}\n\n\t/**\n\t * Performs the rebase operation for string changes\n\t *\n\t *\n\t * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n\t * Other is the modified, rebased (on own) changeset.\n\t *\n\t * ```\n\t * BASE\n\t * / \\\n\t * / \\\n\t * OWN OTHER\n\t * ```\n\t *\n\t * gets rebased to:\n\t *\n\t * ```\n\t * BASE\n\t * /\n\t * OWN\n\t * \\\n\t * OTHER\n\t * ```\n\t *\n\t * conflict default behavior in ()\n\t *\n\t * ```\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * \\Own| insert | modify | remove | String set |\n\t * \\ | | | | |\n\t * other\\ | | | | |\n\t * ------\\|-----------------+------------------+------------------|----------------|\n\t * | conflicting | non-conflicting | non-conflicting | conflict |\n\t * insert | inserts | change | change |(ignore insert) |\n\t * | (i. other after)| | | |\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * | non-conflicting | conflict | conflict | conflict |\n\t * modify | change |(notify the user) | (delete modify |(ignore modify) |\n\t * | | | in other) | |\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * | non-conflicting | non-conflicting | non-conflicting | conflict |\n\t * remove | change | change | change |(ignore remove) |\n\t * -------|-----------------+------------------+------------------+----------------|\n\t * Str. | | conflict | |\n\t * set | 'other's set overwrites whatever happend before |\n\t * | | | | |\n\t * --------------------------------------------------------------------------------|\n\t * ```\n\t *\n\t * @param in_ownPropertyChangeSet - The ChangeSet for the property stored in this object\n\t * @param io_rebasePropertyChangeSetParent - The Array containing the ChangeSet for the property to be rebased\n\t * @param in_key - The key to the ChangeSet in io_rebasePropertyChangeSetParent we are rebasing on\n\t * @param in_basePath - Base path to get to the property processed by this function\n\t * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n\t */\n\texport function _rebaseChangeSetForString(\n\t\tin_ownPropertyChangeSet: SerializedChangeSet,\n\t\tio_rebasePropertyChangeSetParent: SerializedChangeSet,\n\t\tin_key: string,\n\t\tin_basePath: string,\n\t\tout_conflicts: ConflictInfo[],\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tif (\n\t\t\tisString(io_rebasePropertyChangeSetParent[in_key]) ||\n\t\t\t(io_rebasePropertyChangeSetParent[in_key] &&\n\t\t\t\tio_rebasePropertyChangeSetParent[in_key].hasOwnProperty(\"value\"))\n\t\t) {\n\t\t\t// other overwrites any old changes, we ignore them and report the conflict\n\t\t\tlet conflict = {\n\t\t\t\tpath: in_basePath,\n\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\tconflictingChange: cloneDeep(in_ownPropertyChangeSet),\n\t\t\t};\n\t\t\tout_conflicts.push(conflict);\n\t\t\t// If value is the same, delete the entry\n\t\t\tlet ownValue = in_ownPropertyChangeSet;\n\t\t\tif (typeof ownValue === \"object\") {\n\t\t\t\townValue = ownValue.value;\n\t\t\t}\n\t\t\tlet rebaseValue = io_rebasePropertyChangeSetParent[in_key];\n\t\t\tif (typeof rebaseValue === \"object\") {\n\t\t\t\trebaseValue = rebaseValue.value;\n\t\t\t}\n\t\t\tif (ownValue === rebaseValue) {\n\t\t\t\tdelete io_rebasePropertyChangeSetParent[in_key];\n\t\t\t}\n\t\t} else if (\n\t\t\tisString(in_ownPropertyChangeSet) ||\n\t\t\t(in_ownPropertyChangeSet && in_ownPropertyChangeSet.hasOwnProperty(\"value\"))\n\t\t) {\n\t\t\t// we have a conflict since we cannot allow insert/remove/modify on an unknown state\n\t\t\t// we just ignore other's modifications and take own's set\n\t\t\tlet conflict = {\n\t\t\t\tpath: in_basePath,\n\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\tconflictingChange: cloneDeep(io_rebasePropertyChangeSetParent[in_key]),\n\t\t\t};\n\t\t\tout_conflicts.push(conflict);\n\t\t\tio_rebasePropertyChangeSetParent[in_key] = in_ownPropertyChangeSet;\n\t\t} else {\n\t\t\t// both have no 'set' just array ops -> use array rebase!\n\t\t\tthis._rebaseArrayChangeSetForProperty(\n\t\t\t\tin_ownPropertyChangeSet,\n\t\t\t\tio_rebasePropertyChangeSetParent[in_key],\n\t\t\t\tin_basePath,\n\t\t\t\tout_conflicts,\n\t\t\t\t\"String\",\n\t\t\t\tin_options,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/changeset_operations/array.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/**\n * @fileoverview Helper functions and classes to work with array ChangeSets\n */\nimport { constants, ConsoleUtils } from \"@fluid-experimental/property-common\";\n\nimport cloneDeep from \"lodash/cloneDeep.js\";\nimport isEqual from \"lodash/isEqual.js\";\nimport isNumber from \"lodash/isNumber.js\";\nimport isString from \"lodash/isString.js\";\n\n// @ts-ignore\nimport { ApplyChangeSetOptions, ConflictInfo, SerializedChangeSet } from \"../changeset.js\";\nimport { TypeIdHelper } from \"../helpers/typeidHelper.js\";\n\nimport {\n\tArrayChangeSetIterator,\n\tGenericOperation,\n\tInsertOperation,\n\tModifyOperation,\n\tNOPOperation,\n\tNoneNOPOperation,\n\tRemoveOperation,\n\tarrayInsertList,\n\tarrayModifyList,\n\tarrayRemoveList,\n} from \"./arrayChangesetIterator.js\";\nimport { ConflictType } from \"./changesetConflictTypes.js\";\n\nconst { MSG } = constants;\nconst { isPrimitiveType } = TypeIdHelper;\n\n/**\n * The range combinations of two change sets (A and B)\n * This can either be complete operations, parts of complete operations or overlapping segments\n * @enum number\n */\nenum ArrayChangeSetRangeType {\n\t/**\n\t * A complete operation of change set A.\n\t */\n\tcompleteA,\n\n\t/**\n\t * A complete operation of change set B.\n\t */\n\tcompleteB,\n\n\t/**\n\t * A partial operation of change set A.\n\t */\n\tpartOfA,\n\n\t/**\n\t * A partial operation of change set B.\n\t */\n\tpartOfB,\n\n\t/**\n\t * A complete operation of change set A overlapping with a partial operation of change set B.\n\t */\n\tcompleteApartOfB,\n\n\t/**\n\t * A complete operation of change set B overlapping with a partial operation of change set A.\n\t */\n\tcompleteBpartOfA,\n\n\t/**\n\t * A complete operation of change set A overlapping a complete operation of change set B.\n\t */\n\tcompleteAcompleteB,\n\n\t/**\n\t * A partial operation of change set A, a partial operation of change set B.\n\t */\n\tpartOfApartOfB,\n}\n\ninterface SegmentType<T = GenericOperation, K = GenericOperation, L = GenericOperation> {\n\tbegin?: number;\n\top?: T;\n\tflag?: ArrayChangeSetRangeType;\n\topA?: K;\n\topB?: L;\n\tremoveInsertOperationA?: arrayRemoveList | arrayInsertList;\n}\n\n/**\n * A range of an array operation\n */\n// TODO: Cleaning up these types using discriminated union\nexport interface OperationRangeDescription<T = GenericOperation> {\n\topA?: any;\n\topB?: any;\n\tinsertAlreadyProcessed?: boolean;\n\tremoveInsertOperationB?: arrayRemoveList | arrayInsertList;\n\tremoveInsertOperation?: arrayRemoveList | arrayInsertList;\n\tremoveInsertOperationA?: arrayRemoveList | arrayInsertList;\n\top?: T;\n\tbegin?: number;\n\tend?: number;\n\tflag?: ArrayChangeSetRangeType;\n}\n\n/**\n * A range of an insert array operation\n */\nexport interface OperationRangeInsert extends OperationRangeDescription<InsertOperation> {\n\tremoveInsertOperationB?: arrayInsertList;\n\tremoveInsertOperation?: arrayInsertList;\n\tremoveInsertOperationA?: arrayInsertList;\n}\n\n/**\n * A range of a remove array operation\n */\nexport interface OperationRangeRemove extends OperationRangeDescription<RemoveOperation> {\n\tremoveInsertOperationB?: arrayRemoveList;\n\tremoveInsertOperation?: arrayRemoveList;\n\tremoveInsertOperationA?: arrayRemoveList;\n}\n\n/**\n * A range of a modify array operation\n */\nexport interface OperationRangeModify\n\textends Omit<\n\t\tOperationRangeDescription<ModifyOperation>,\n\t\t\"removeInsertOperationB\" | \"removeInsertOperation\" | \"removeInsertOperationA\"\n\t> {}\n\n/**\n * A range of a NOP array operation\n */\nexport interface OperationRangeNOP\n\textends Omit<\n\t\tOperationRangeDescription<NOPOperation>,\n\t\t\"removeInsertOperationB\" | \"removeInsertOperation\" | \"removeInsertOperationA\"\n\t> {}\n\n/**\n * A range of a none NOP array operation\n */\nexport type OperationRangeNoneNOP =\n\t| OperationRangeInsert\n\t| OperationRangeRemove\n\t| OperationRangeModify;\n\nexport type OperationRange = OperationRangeNoneNOP | OperationRangeNOP;\n\n/**\n * Computes a range for an operation of the current change set\n * @param io_operation - Input\n * @param in_aOffset - The offset that needs to be added to transform the operation\n * @param io_resultingRange - The computed range\n */\nconst getRangeForCurrentStateOperation = function (\n\tio_operation: GenericOperation,\n\tin_aOffset: number,\n\tio_resultingRange: OperationRange,\n) {\n\tif (!io_operation) {\n\t\treturn;\n\t}\n\tif (io_operation.type === ArrayChangeSetIterator.types.NOP) {\n\t\tconst dummyOp: NOPOperation = {\n\t\t\ttype: ArrayChangeSetIterator.types.NOP,\n\t\t\toffset: in_aOffset,\n\t\t};\n\t\tio_resultingRange.begin = undefined;\n\t\tio_resultingRange.end = undefined;\n\t\tio_resultingRange.op = dummyOp;\n\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\treturn;\n\t}\n\n\tio_operation.operation[0] += in_aOffset;\n\tswitch (io_operation.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.REMOVE:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0];\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\t(io_resultingRange as OperationRangeRemove).removeInsertOperation =\n\t\t\t\tio_operation.removeInsertOperation;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tio_resultingRange.begin = io_operation.operation[0];\n\t\t\tio_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n\t\t\tio_resultingRange.op = io_operation;\n\t\t\tio_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n\t\t\treturn;\n\t\tdefault:\n\t\t\tthrow new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n\t}\n};\n\nconst getOpLength = (op: arrayRemoveList) => (isNumber(op[1]) ? op[1] : op[1].length);\n\n/**\n * Computes the impact range for a given operation of the applied change set\n * @param in_operation - The op\n * @param io_resultingRange - The computed range\n * @param in_flag - The flag for the resulting range, default is 'complete B'\n * @param in_options - Optional additional parameters\n */\nconst getRangeForAppliedOperation = function (\n\tin_operation: GenericOperation,\n\tio_resultingRange: OperationRangeDescription,\n\tin_flag?: ArrayChangeSetRangeType,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_operation || in_operation.type === ArrayChangeSetIterator.types.NOP) {\n\t\tio_resultingRange.begin = undefined;\n\t\tio_resultingRange.end = undefined;\n\t\tio_resultingRange.op = undefined;\n\t\tio_resultingRange.flag = undefined;\n\t\treturn;\n\t}\n\tif (!io_resultingRange.op) {\n\t\tio_resultingRange.op = {} as any;\n\t}\n\tio_resultingRange.op.type = in_operation.type;\n\tio_resultingRange.op.offset = in_operation.offset;\n\tif (!io_resultingRange.op.operation) {\n\t\tio_resultingRange.op.operation = [];\n\t}\n\tio_resultingRange.op.operation[0] = in_operation.operation[0];\n\n\tio_resultingRange.begin = in_operation.operation[0];\n\tio_resultingRange.op._absoluteBegin = in_operation.operation[0];\n\tio_resultingRange.flag = in_flag !== undefined ? in_flag : ArrayChangeSetRangeType.completeB;\n\n\tswitch (in_operation.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT:\n\t\t\tio_resultingRange.end = in_operation.operation[0];\n\t\t\tio_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\tconst metaInformation = in_options.applyAfterMetaInformation.get(\n\t\t\t\t\tin_operation.operation[1],\n\t\t\t\t);\n\t\t\t\tif (metaInformation) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(\n\t\t\t\t\t\tio_resultingRange.op.operation[1],\n\t\t\t\t\t\tmetaInformation,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.REMOVE:\n\t\t\tlet numberOfRemovedElements = getOpLength(in_operation.operation);\n\n\t\t\tio_resultingRange.end = in_operation.operation[0] + numberOfRemovedElements;\n\t\t\tio_resultingRange.op.operation[1] = Array.isArray(in_operation.operation[1])\n\t\t\t\t? in_operation.operation[1].slice()\n\t\t\t\t: in_operation.operation[1];\n\t\t\tio_resultingRange.removeInsertOperation = in_operation.removeInsertOperation;\n\t\t\treturn;\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tio_resultingRange.end = in_operation.operation[0] + in_operation.operation[1].length;\n\t\t\tio_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n\t\t\tif (in_operation.operation[2] !== undefined) {\n\t\t\t\tio_resultingRange.op.operation[2] = in_operation.operation[2].slice();\n\t\t\t}\n\t\t\treturn;\n\t\tdefault:\n\t\t\tthrow new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n\t}\n};\n\n/**\n * Splits the second and third parameter in an array remove or modify operation into two segments.\n * This treats the three possible cases array, string and length that are allowed in a remove operation\n *\n * @param in_firstResult - Place where the first half is stored\n * @param in_secondResult - Place where the second half is stored\n * @param in_data - The original operation\n * @param in_start - Index at which the operation is split\n * @private\n */\nconst _splitArrayParameter = function (\n\tin_firstResult: arrayModifyList | arrayRemoveList,\n\tin_secondResult: arrayModifyList | arrayRemoveList,\n\tin_data: arrayModifyList | arrayRemoveList,\n\tin_start: number,\n) {\n\tlet firstTmp: any;\n\tif (isString(in_data[1])) {\n\t\tfirstTmp = in_data[1].substr(0, in_start);\n\t\tin_secondResult[1] = in_data[1].substr(in_start);\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = firstTmp;\n\t\t}\n\t\tif (in_data[2] !== undefined && isString(in_data[2])) {\n\t\t\tfirstTmp = in_data[2].substr(0, in_start);\n\t\t\tin_secondResult[2] = in_data[2].substr(in_start);\n\t\t\tif (in_firstResult) {\n\t\t\t\tin_firstResult[2] = firstTmp;\n\t\t\t}\n\t\t}\n\t} else if (Array.isArray(in_data[1])) {\n\t\tfirstTmp = in_data[1].splice(0, in_start);\n\t\tin_secondResult[1] = in_data[1];\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = firstTmp;\n\t\t}\n\t\tif (in_data[2] !== undefined && Array.isArray(in_data[2])) {\n\t\t\tfirstTmp = in_data[2].splice(0, in_start);\n\t\t\tin_secondResult[2] = in_data[2];\n\t\t\tif (in_firstResult) {\n\t\t\t\tin_firstResult[2] = firstTmp;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (in_firstResult) {\n\t\t\tin_firstResult[1] = in_start;\n\t\t}\n\t\tin_secondResult[1] = in_data[1] - in_start;\n\t}\n};\n\n/**\n * Splits an operation for the splitOverlapping function\n *\n * @param in_targetRange - The range to split\n * @param in_targetOperation - The target operation into which the split range is written\n * @param lengthUsedInResultSegment - The length of the range to split\n * @param in_updateOffset - Should the offset in the target range be updated?\n */\nconst _splitOperation = function (\n\tin_targetRange: OperationRangeDescription<NoneNOPOperation>,\n\tin_targetOperation: NoneNOPOperation,\n\tlengthUsedInResultSegment: number,\n\tin_updateOffset: boolean,\n) {\n\t_splitArrayParameter(\n\t\tin_targetOperation.operation,\n\t\tin_targetRange.op.operation,\n\t\tin_targetRange.op.operation,\n\t\tlengthUsedInResultSegment,\n\t);\n\n\tif (in_updateOffset) {\n\t\tif (in_targetRange.op.type === ArrayChangeSetIterator.types.INSERT) {\n\t\t\tin_targetRange.op.offset += lengthUsedInResultSegment;\n\t\t}\n\t\tif (in_targetRange.op.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\t\tin_targetRange.op.offset -= lengthUsedInResultSegment;\n\t\t}\n\t}\n};\n\n/**\n * Copies an array operation\n * @param in_sourceOperation - The source operation\n * @param in_targetOperation - The target operation which will be overwritten\n */\nconst _copyOperation = function (\n\tin_sourceOperation: NoneNOPOperation,\n\tin_targetOperation: NoneNOPOperation,\n) {\n\tif (in_sourceOperation.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\tin_targetOperation.operation[1] = in_sourceOperation.operation[1];\n\t} else {\n\t\tin_targetOperation.operation[1] = in_sourceOperation.operation[1].slice();\n\t\tif (in_sourceOperation.operation[2] !== undefined) {\n\t\t\tin_targetOperation.operation[2] = in_sourceOperation.operation[2].slice();\n\t\t}\n\t}\n};\n\n/**\n * cut overlapping ranges in non-overlapping and completely overlapping segments\n * ranges of length 0 just cut lengthy ranges\n * @param io_rangeA - Input A\n * @param io_rangeB - Input B\n * @param io_resultingSegment - The resulting overlapping segment\n * @param in_rebasing - Is this function called for rebasing - we have to implement two different\n * behaviors of this function: one for squashing and one for rebasing, because an insert-insert\n * operation in squashing should be separte segments, while for rebasing, we need one segment\n * for both inserts to be able to report a conflict.\n * overlapping range or\n * (partial) A or B\n */\n\nconst splitOverlapping = function (\n\tio_rangeA: OperationRangeInsert | OperationRangeRemove,\n\tio_rangeB: OperationRangeInsert | OperationRangeRemove,\n\tio_resultingSegment: OperationRangeInsert | OperationRangeRemove,\n\tin_rebasing: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (io_rangeA.removeInsertOperation) {\n\t\tio_resultingSegment.removeInsertOperationA = io_rangeA.removeInsertOperation;\n\t} else {\n\t\tdelete io_resultingSegment.removeInsertOperationA;\n\t}\n\tif (io_rangeB.removeInsertOperation) {\n\t\tio_resultingSegment.removeInsertOperationB = io_rangeB.removeInsertOperation;\n\t} else {\n\t\tdelete io_resultingSegment.removeInsertOperationB;\n\t}\n\n\tif (io_rangeB.begin === undefined) {\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeA.end;\n\t\tio_resultingSegment.op = io_rangeA.op;\n\t\tio_resultingSegment.flag = io_rangeA.flag;\n\t\treturn;\n\t}\n\n\tif (\n\t\tio_rangeB.removeInsertOperation &&\n\t\tio_rangeB.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t(io_rangeA.begin === undefined ||\n\t\t\tio_rangeB.removeInsertOperation[0] < io_rangeA.begin - io_rangeA.op.offset) &&\n\t\tio_rangeB.removeInsertOperation[0] < io_rangeB.begin &&\n\t\t!io_rangeB.insertAlreadyProcessed\n\t) {\n\t\tio_resultingSegment.begin = io_rangeB.removeInsertOperation[0];\n\t\tio_resultingSegment.end = io_rangeB.removeInsertOperation[0];\n\t\t(io_resultingSegment as OperationRangeInsert).op = {\n\t\t\ttype: ArrayChangeSetIterator.types.INSERT,\n\t\t\toperation: io_rangeB.removeInsertOperation as arrayInsertList,\n\t\t\toffset: io_rangeB.op.offset,\n\t\t};\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeB;\n\t\tio_rangeB.insertAlreadyProcessed = true;\n\t\treturn;\n\t}\n\n\tif (io_rangeA.begin === undefined) {\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeB.end;\n\t\tio_resultingSegment.op = io_rangeB.op;\n\t\tio_resultingSegment.flag = io_rangeB.flag;\n\t\treturn;\n\t}\n\tio_resultingSegment.opA = undefined;\n\tio_resultingSegment.opB = undefined;\n\tio_resultingSegment.op = undefined;\n\n\t// We have an overlapping remove and insert operation at the same position\n\t// in a squash operation. In that case, we try to create a more efficient\n\t// ChangeSet by detecting cases, in which the remove and insert cancel out\n\t// (which we can detect for a reversible ChangeSet).\n\t// TODO: In the most general case, we should convert the overlapping remove\n\t// insert operations into the most optimal modify operation, but this\n\t// would require the computation of the edit distance between the two\n\t// operations, which could only be done efficiently for named properties.\n\tlet nextInsertOffset = 0;\n\tif (io_rangeA.removeInsertOperation) {\n\t\tnextInsertOffset = getOpLength(io_rangeA.removeInsertOperation);\n\t}\n\tif (\n\t\t!in_rebasing &&\n\t\tio_rangeA.begin <= io_rangeB.begin &&\n\t\tio_rangeA.begin + nextInsertOffset >= io_rangeB.begin &&\n\t\tio_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\tArray.isArray(io_rangeA.op.operation[1]) && // This is a reversible remove operation\n\t\tio_rangeB.op.type === ArrayChangeSetIterator.types.INSERT\n\t) {\n\t\t// Are the two operations canceling out?\n\t\tlet startOffset = 0;\n\t\tlet rangeStart = 0;\n\t\tlet matchFound = false;\n\t\tlet rangeLength = io_rangeB.op.operation[1].length;\n\t\tconst operationMetaInfo =\n\t\t\tin_options &&\n\t\t\tin_options.applyAfterMetaInformation &&\n\t\t\tin_options.applyAfterMetaInformation.get(io_rangeB.op.operation[1]);\n\t\tif (operationMetaInfo && operationMetaInfo.rebasedRemoveInsertRanges) {\n\t\t\tif (operationMetaInfo.currentInsertOffset === undefined) {\n\t\t\t\toperationMetaInfo.currentInsertOffset = 0;\n\t\t\t\toperationMetaInfo.currentRemoveOffset = 0;\n\t\t\t}\n\t\t\tlet i = 0;\n\t\t\tfor (; i < operationMetaInfo.rebasedRemoveInsertRanges.length; i++) {\n\t\t\t\tif (\n\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart >=\n\t\t\t\t\toperationMetaInfo.currentInsertOffset\n\t\t\t\t) {\n\t\t\t\t\tstartOffset =\n\t\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].originalStartPosition -\n\t\t\t\t\t\tio_rangeA.op.operation[0] +\n\t\t\t\t\t\tio_rangeA.op.offset +\n\t\t\t\t\t\tio_rangeB.op.offset;\n\t\t\t\t\trangeStart =\n\t\t\t\t\t\toperationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart -\n\t\t\t\t\t\toperationMetaInfo.currentInsertOffset;\n\t\t\t\t\trangeLength = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeLength;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tio_rangeA.op.operation[1].length - startOffset >= rangeLength &&\n\t\t\t\t\t\tisEqual(\n\t\t\t\t\t\t\tio_rangeA.op.operation[1].slice(startOffset, startOffset + rangeLength),\n\t\t\t\t\t\t\tio_rangeB.op.operation[1].slice(rangeStart, rangeStart + rangeLength),\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tmatchFound = true;\n\n\t\t\t\t\t\t// If we have an remove / insert operation in the range A we have to make sure,\n\t\t\t\t\t\t// the insert happens at the correct position within the remove range after canceling\n\t\t\t\t\t\t// out the insert/remove combination.\n\t\t\t\t\t\t// We decide this, based on the position of the insert in iterator B relative to the insert\n\t\t\t\t\t\t// in iterator A. If the insert in iterator B is behind the insert in iteraator A, we have\n\t\t\t\t\t\t// to move the insert from A to the beginning of the remove range, since it has to placed\n\t\t\t\t\t\t// before the canceled range.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnextInsertOffset > 0 &&\n\t\t\t\t\t\t\tio_rangeB.begin >= io_rangeA.begin + nextInsertOffset\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst newStartOffset =\n\t\t\t\t\t\t\t\tio_rangeA.op.operation[0] + startOffset - io_rangeA.op.offset;\n\n\t\t\t\t\t\t\t// We don't want to shift the insertion backwards, if it already is before the position of the\n\t\t\t\t\t\t\t// canceled entry\n\t\t\t\t\t\t\tio_rangeA.removeInsertOperation[0] = Math.min(\n\t\t\t\t\t\t\t\tio_rangeA.removeInsertOperation[0],\n\t\t\t\t\t\t\t\tnewStartOffset,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (\n\t\t\t\tio_rangeA.op.operation[1].length === rangeLength &&\n\t\t\t\tisEqual(io_rangeA.op.operation[1], io_rangeB.op.operation[1])\n\t\t\t) {\n\t\t\t\tmatchFound = true;\n\t\t\t}\n\t\t}\n\t\tif (matchFound) {\n\t\t\tif (startOffset > 0) {\n\t\t\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\t\t\tio_resultingSegment.end = io_rangeA.begin;\n\n\t\t\t\tio_resultingSegment.op = {\n\t\t\t\t\ttype: io_rangeA.op.type,\n\t\t\t\t\toperation: [] as any,\n\t\t\t\t};\n\t\t\t\tio_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n\t\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\t_splitArrayParameter(\n\t\t\t\t\tio_resultingSegment.op.operation,\n\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\tstartOffset,\n\t\t\t\t);\n\t\t\t\tio_rangeA.op.operation[0] += startOffset;\n\t\t\t\toperationMetaInfo.currentRemoveOffset += startOffset;\n\t\t\t\treturn;\n\t\t\t} else if (rangeStart > 0) {\n\t\t\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\t\t\tio_resultingSegment.end = rangeStart;\n\n\t\t\t\tio_resultingSegment.op = {\n\t\t\t\t\ttype: io_rangeB.op.type,\n\t\t\t\t\toperation: [] as any,\n\t\t\t\t};\n\t\t\t\tio_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\n\t\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\t_splitArrayParameter(\n\t\t\t\t\tio_resultingSegment.op.operation,\n\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\trangeStart,\n\t\t\t\t);\n\t\t\t\toperationMetaInfo.currentInsertOffset += rangeStart;\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tif (operationMetaInfo) {\n\t\t\t\t\toperationMetaInfo.currentRemoveOffset += rangeLength;\n\t\t\t\t\toperationMetaInfo.currentInsertOffset += rangeLength;\n\t\t\t\t}\n\n\t\t\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\t\t\tio_resultingSegment.end = io_rangeA.end;\n\t\t\t\tio_resultingSegment.op = undefined; // This is used to indicate that we don't need any operation\n\n\t\t\t\tif (io_rangeB.op.operation[1].length === rangeLength) {\n\t\t\t\t\tio_resultingSegment.flag =\n\t\t\t\t\t\tio_rangeA.op.operation[1].length === rangeLength\n\t\t\t\t\t\t\t? ArrayChangeSetRangeType.completeAcompleteB\n\t\t\t\t\t\t\t: ArrayChangeSetRangeType.completeBpartOfA;\n\t\t\t\t} else {\n\t\t\t\t\tio_resultingSegment.flag =\n\t\t\t\t\t\tio_rangeA.op.operation[1].length === rangeLength\n\t\t\t\t\t\t\t? ArrayChangeSetRangeType.completeApartOfB\n\t\t\t\t\t\t\t: ArrayChangeSetRangeType.partOfApartOfB;\n\t\t\t\t}\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\tif (\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t\t) {\n\t\t\t\t\t_splitArrayParameter(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\t\tio_rangeA.op.operation,\n\t\t\t\t\t\trangeLength,\n\t\t\t\t\t);\n\t\t\t\t\tio_rangeA.op.operation[0] += rangeLength;\n\t\t\t\t}\n\n\t\t\t\t// cut the remaining segment entry\n\t\t\t\tif (\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n\t\t\t\t\tio_resultingSegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t\t) {\n\t\t\t\t\t_splitArrayParameter(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\t\tio_rangeB.op.operation,\n\t\t\t\t\t\trangeLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\tio_rangeA.end < io_rangeB.begin || // please see in_rebasing comments in the function description\n\t\t((!in_rebasing || io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n\t\t\tio_rangeA.end === io_rangeB.begin)\n\t) {\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeA.end;\n\t\tio_resultingSegment.op = io_rangeA.op;\n\t\tio_resultingSegment.flag = io_rangeA.flag;\n\n\t\t// We need to store the length of the adjacent remove operation for later squashes\n\t\tif (\n\t\t\tin_rebasing &&\n\t\t\tio_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t\tio_rangeA.end === io_rangeB.begin\n\t\t) {\n\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\tlet length = io_rangeB.op.operation[1];\n\t\t\t\tif (!isNumber(length)) {\n\t\t\t\t\tlength = length.length;\n\t\t\t\t}\n\n\t\t\t\tin_options.applyAfterMetaInformation.set(io_rangeB.op.operation[1], {\n\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\trangeLength: length,\n\t\t\t\t\t\t\toriginalStartPosition: io_rangeA.end + io_rangeB.op.offset,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\tio_rangeB.end < io_rangeA.begin || // please see in_rebasing comments in the function description\n\t\t(!in_rebasing && io_rangeB.end === io_rangeA.begin)\n\t) {\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeB.end;\n\t\tio_resultingSegment.op = io_rangeB.op;\n\t\tio_resultingSegment.flag = io_rangeB.flag;\n\t\treturn;\n\t}\n\t// handle real overlaps:\n\tif (io_rangeA.begin < io_rangeB.begin) {\n\t\t// take A up to the begin of B\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = io_rangeB.begin;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.op = {\n\t\t\ttype: io_rangeA.op.type,\n\t\t\toperation: [] as any,\n\t\t};\n\t\tio_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n\t\t// cut the remaining segment entry\n\t\t_splitOperation(\n\t\t\tio_rangeA,\n\t\t\tio_resultingSegment.op,\n\t\t\tio_rangeB.begin - io_rangeA.begin,\n\t\t\ttrue,\n\t\t);\n\n\t\tio_rangeA.begin = io_rangeB.begin;\n\t\tio_rangeA.op.operation[0] = io_rangeB.begin;\n\t} else if (io_rangeA.begin === io_rangeB.begin) {\n\t\t// find the largest common range:\n\t\tio_resultingSegment.begin = io_rangeA.begin;\n\t\tio_resultingSegment.end = undefined;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.opA = {\n\t\t\ttype: io_rangeA.op.type,\n\t\t\toperation: [],\n\t\t\t_absoluteBegin: io_rangeA.op._absoluteBegin,\n\t\t};\n\t\tio_resultingSegment.opA.operation[0] = io_rangeA.op.operation[0];\n\t\tio_resultingSegment.opB = {\n\t\t\ttype: io_rangeB.op.type,\n\t\t\toperation: [],\n\t\t\toffset: io_rangeB.op.offset,\n\t\t};\n\t\tio_resultingSegment.opB.operation[0] = io_rangeB.op.operation[0];\n\n\t\t// who ends first, A or B?\n\t\tif (io_rangeA.end < io_rangeB.end) {\n\t\t\t// segment A ends first, it is consumed by the resulting merged segment!\n\t\t\t// a part of segment B remains and needs updates\n\t\t\tio_resultingSegment.end = io_rangeA.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeApartOfB;\n\n\t\t\t// cut the remaining segment B entries (segment A needs no update!)\n\t\t\t_splitOperation(\n\t\t\t\tio_rangeB,\n\t\t\t\tio_resultingSegment.opB,\n\t\t\t\tio_rangeA.end - io_rangeA.begin,\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\t// just copy opA\n\t\t\t_copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\n\t\t\tio_rangeB.begin = io_rangeA.end;\n\t\t\tio_rangeB.op.operation[0] = io_rangeA.end;\n\t\t} else if (io_rangeA.end > io_rangeB.end) {\n\t\t\t// segment B ends first, it is consumed by the resulting merged segment!\n\t\t\t// a part of segment A remains and needs updates\n\t\t\tio_resultingSegment.end = io_rangeB.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeBpartOfA;\n\n\t\t\t// cut the remaining segment A entry\n\t\t\t_splitOperation(\n\t\t\t\tio_rangeA,\n\t\t\t\tio_resultingSegment.opA,\n\t\t\t\tio_rangeB.end - io_rangeB.begin,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\t// just copy opB\n\t\t\t_copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\n\t\t\tio_rangeA.begin = io_rangeB.end;\n\t\t\tio_rangeA.op.operation[0] = io_rangeB.end;\n\t\t}\n\t\tif (io_rangeA.end === io_rangeB.end) {\n\t\t\tio_resultingSegment.end = io_rangeB.end;\n\t\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.completeAcompleteB;\n\t\t\t// both are fully used, no cut needed!\n\n\t\t\t// copy ops\n\t\t\t_copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\t\t\t_copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\t\t}\n\t} else if (io_rangeB.begin < io_rangeA.begin) {\n\t\t// take B up to the begin of A\n\t\tio_resultingSegment.begin = io_rangeB.begin;\n\t\tio_resultingSegment.end = io_rangeA.begin;\n\n\t\t// to avoid deepCopy, we just copy the necessary parts of the op:\n\t\tio_resultingSegment.op = {\n\t\t\ttype: io_rangeB.op.type,\n\t\t\toperation: [] as any,\n\t\t};\n\t\tio_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\t\tio_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n\t\t// cut the remaining segment entry\n\t\t_splitOperation(\n\t\t\tio_rangeB,\n\t\t\tio_resultingSegment.op,\n\t\t\tio_rangeA.begin - io_rangeB.begin,\n\t\t\tfalse,\n\t\t);\n\n\t\tio_rangeB.begin = io_rangeA.begin;\n\t\tio_rangeB.op.operation[0] = io_rangeA.begin;\n\t\tio_rangeB.op.offset = 0;\n\t}\n};\n\n/**\n * merge in_op with the last op of that category in io_changeset (if possible)\n * e.g. merge an delete [1,3] with delete [3,2] to delete [1,5]\n * @param in_op - The op to merge\n * @param io_changeset - The changeset to merge the op to\n * @param in_targetIndex - The transformed target index offset\n * @returns true if the merge was possible and executed\n */\nconst mergeWithLastIfPossible = function (\n\tin_op: GenericOperation,\n\tio_changeset: SerializedChangeSet,\n\tin_targetIndex: number,\n\tin_options?: ApplyChangeSetOptions,\n): boolean {\n\tlet lastOp;\n\tswitch (in_op.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tif (io_changeset.insert.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastOp = io_changeset.insert[io_changeset.insert.length - 1];\n\t\t\tif (lastOp[0] === in_targetIndex) {\n\t\t\t\t// If we merge two segments, we also have to merge the attached meta information and store mappings for the\n\t\t\t\t// sub-ranges of the merged segment\n\t\t\t\tlet mergedRangeMetaInformation;\n\t\t\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\t\t\tconst previousMetaInfo = in_options.applyAfterMetaInformation.get(lastOp[1]);\n\t\t\t\t\tconst currentMetaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n\t\t\t\t\tif (previousMetaInfo || currentMetaInfo) {\n\t\t\t\t\t\t// Get the range information attached to the segments that get merged\n\t\t\t\t\t\tconst previousRange =\n\t\t\t\t\t\t\t(previousMetaInfo && previousMetaInfo.rebasedRemoveInsertRanges) || [];\n\t\t\t\t\t\tconst nextRange =\n\t\t\t\t\t\t\t(currentMetaInfo && currentMetaInfo.rebasedRemoveInsertRanges) || [];\n\n\t\t\t\t\t\t// Update the start index\n\t\t\t\t\t\tfor (let i = 0; i < nextRange.length; i++) {\n\t\t\t\t\t\t\tnextRange[i].rangeStart += lastOp[1].length;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (let i = 0; i < nextRange.length; i++) {\n\t\t\t\t\t\t\tpreviousRange.push(nextRange[i]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmergedRangeMetaInformation = previousRange;\n\n\t\t\t\t\t\t// Remove the old entries from the meta information\n\t\t\t\t\t\tin_options.applyAfterMetaInformation.delete(lastOp[1]);\n\t\t\t\t\t\tin_options.applyAfterMetaInformation.delete(in_op.operation[1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// merge with last insert\n\t\t\t\tif (isString(in_op.operation[1])) {\n\t\t\t\t\tfor (let i = 0; i < in_op.operation[1].length; i++) {\n\t\t\t\t\t\tlastOp[1] += in_op.operation[1][i];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < in_op.operation[1].length; i++) {\n\t\t\t\t\t\tlastOp[1].push(in_op.operation[1][i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Store the updated meta-information\n\t\t\t\tif (mergedRangeMetaInformation) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(lastOp[1], {\n\t\t\t\t\t\trebasedRemoveInsertRanges: mergedRangeMetaInformation,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// We cannot perform merges for removes here, as those\n\t\t\t// also depend on the insert positions, which might not\n\t\t\t// yet have been processed when the remove is processed.\n\t\t\t// We handle these in a post processing step instead\n\t\t\tthrow new Error(\"Should never happen\");\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY:\n\t\t\tif (io_changeset.modify.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastOp = io_changeset.modify[io_changeset.modify.length - 1];\n\t\t\tif (lastOp[0] + lastOp[1].length === in_targetIndex) {\n\t\t\t\t// merge with last modify\n\t\t\t\tlastOp[1] = lastOp[1].concat(in_op.operation[1]);\n\t\t\t\tif (lastOp[2] !== undefined) {\n\t\t\t\t\tlastOp[2] = lastOp[2].concat(in_op.operation[2]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${in_op.type}`);\n\t}\n\treturn true;\n};\n\ninterface RemoveOpInfo {\n\tposition: number;\n\toffsetIncremented: boolean;\n\tlength: number;\n}\n\n/**\n * push an operation to a changeset, will try to merge the op if possible\n * @param in_op - The operation we want to push\n * @param io_changeset - The target\n * @param the - The current offset\n * @param in_options - Optional additional parameters\n * @param in_lastIteratorARemove - The information about the last remove operation in iterator A\n * @param in_segment - The segment this operation is part of\n */\nconst pushOp = function (\n\tin_op: GenericOperation,\n\tio_changeset: SerializedChangeSet,\n\tin_indexOffset: number,\n\tin_options?: ApplyChangeSetOptions,\n\tin_lastIteratorARemove?: RemoveOpInfo,\n\tin_segment?: SegmentType,\n) {\n\tlet writeTargetIndex;\n\tif (ArrayChangeSetIterator.types.NOP !== in_op.type) {\n\t\twriteTargetIndex = in_op.operation[0] - in_indexOffset;\n\n\t\t// We have to update the write target index, if we have an insert at the\n\t\t// position of a remove. In that case, we have to move the insert to the beginning\n\t\t// of the remove range, to make sure, it will give consistent results with individually\n\t\t// rebasing the two changsets (first rebasing an insert at the beginning of the remove the\n\t\t// wouldn't have an effect on rebased changeset and then rebasing it with respect to the\n\t\t// insert would move it befind the insert. If we do this rebase with respect to the combined\n\t\t// CS, we must have the insert before the remove to make sure it is taken into account)\n\t\tif (\n\t\t\tArrayChangeSetIterator.types.INSERT === in_op.type &&\n\t\t\tin_lastIteratorARemove !== undefined &&\n\t\t\tin_segment.flag === ArrayChangeSetRangeType.completeB\n\t\t) {\n\t\t\tif (\n\t\t\t\tin_lastIteratorARemove.position == in_op.operation[0] &&\n\t\t\t\tin_lastIteratorARemove.offsetIncremented\n\t\t\t) {\n\t\t\t\twriteTargetIndex -= in_lastIteratorARemove.length;\n\t\t\t}\n\t\t}\n\t\tif (writeTargetIndex < 0) {\n\t\t\twriteTargetIndex = 0; // TODO: investigate negative index!\n\t\t}\n\t}\n\tswitch (in_op.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tif (\n\t\t\t\tin_options &&\n\t\t\t\tin_options.applyAfterMetaInformation &&\n\t\t\t\t!isNumber(in_op.operation[1])\n\t\t\t) {\n\t\t\t\t// If we don't have any meta information yet, we add an entry with the correct offset applied\n\t\t\t\tconst metaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n\t\t\t\tif (!metaInfo) {\n\t\t\t\t\tin_options.applyAfterMetaInformation.set(in_op.operation[1], {\n\t\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\t\trangeLength: in_op.operation[1].length,\n\t\t\t\t\t\t\t\toriginalStartPosition: in_op.operation[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n\t\t\t\tio_changeset.insert.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// Note: we don't merge removes here, since those depend on not yet processed inserts.\n\t\t\t// This is done in a post processing step instead\n\n\t\t\t// our segmentation method currently can produce length zero remove segments\n\t\t\t// this is by by design and those filtered out here\n\t\t\tconst length = getOpLength(in_op.operation);\n\t\t\tif (length > 0) {\n\t\t\t\tio_changeset.remove.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n\t\t\t\tif (in_op.operation[2] !== undefined) {\n\t\t\t\t\tio_changeset.modify.push([writeTargetIndex, in_op.operation[1], in_op.operation[2]]);\n\t\t\t\t} else {\n\t\t\t\t\tio_changeset.modify.push([writeTargetIndex, in_op.operation[1]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.NOP: {\n\t\t\t// nothing to do\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${(in_op as any).type}`);\n\t}\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n * @param in_segment - The two ops to be combined\n * @param in_isPrimitiveType - Is it an array of primitive types\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n */\nconst handleCombinations = function (in_segment: SegmentType, in_isPrimitiveType: boolean) {\n\tconst opA = in_segment.opA;\n\tconst opB = in_segment.opB;\n\tswitch (opA.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\t// this combination is not reachable since this case has already been handled before\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"this combination should not occur in handleCombinations - this is a bug\",\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// Attention: B removes A completely, kill A to avoid zero inserts\n\t\t\t\t\tconst opBLen = isNumber(opB.operation[1])\n\t\t\t\t\t\t? opB.operation[1]\n\t\t\t\t\t\t: opB.operation[1].length;\n\t\t\t\t\tif (opBLen !== opA.operation[1].length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"handleCombinations: insert-remove: unequal number of affected entries\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// we have to apply modify of B to As insert\n\t\t\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t\t\t// since the length of A and B is equal in here\n\t\t\t\t\t\t// we can just insert the modified values instead\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// the array element is a complex types\n\t\t\t\t\t\t// we have to recursively call the modify\n\t\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\t\t// TypeIds MUST be stored in the entries\n\t\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tthis.performApplyAfterOnPropertyWithTypeid(\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topB.operation = opA.operation;\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t// this combination is not reachable since this case has already been handled before\n\t\t\tconsole.error(\"this combination should not occur in handleCombinations - this is a bug\");\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t// If we have a reversible changeset, we\n\t\t\t\t// have to keep the previous state from before the\n\t\t\t\t// apply after\n\t\t\t\tif (opA.operation[2] !== undefined) {\n\t\t\t\t\t(opB as ModifyOperation).operation[2] = opA.operation[2];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// we have to deal with complex types here!\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\t// TypeIds MUST be stored in the entries\n\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.performApplyAfterOnPropertyWithTypeid(\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\topB.operation = opA.operation;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n\t}\n};\n\n/**\n * Tests if 2 arrays of the same length, containing primitive values, contain the same values.\n *\n * @param in_arr1 - First array to compare\n * @param in_arr2 - Second array to compare\n * @returns True if arrays contain the same values, false otherwise\n */\nconst arraysHaveSameValues = function (\n\tin_arr1: arrayModifyList[1],\n\tin_arr2: arrayModifyList[1],\n): boolean {\n\t// We assume arrays are of same length\n\tconst len = in_arr1.length;\n\tif (len !== in_arr2.length) {\n\t\treturn false;\n\t}\n\n\tlet i;\n\t// For (u)int64, values are arrays of 2 elements\n\tif (len > 0 && in_arr1[0].length === 2) {\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (in_arr1[i][0] !== in_arr2[i][0] || in_arr1[i][1] !== in_arr2[i][1]) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (in_arr1[i] !== in_arr2[i]) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn i === len;\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n *\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n *\n * ```\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n * ```\n *\n * gets rebased to:\n *\n * ```\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n * ```\n *\n * conflict default behavior in ()\n *\n * ```\n * -------|-----------------+------------------+------------------|\n * \\Own| insert | modify | remove |\n * \\ | | | |\n * other\\ | | | |\n * ------\\|-----------------+------------------+------------------|\n * | conflicting | non-conflicting | non-conflicting |\n * insert | inserts | change | change |\n * | (i. other after)| | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | merge recursively| conflict |\n * modify | change | (note the user) | (delete modify |\n * | | | in other) |\n * | | | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | non-conflicting | non-conflicting |\n * remove | change | change | change |\n * | [rem orig. data]| (note the user) | [rem dupl. rem] |\n * -------|-----------------+------------------+------------------|\n * ```\n *\n * @param {{opA:{}, opB:{}}} in_segment - The two ops to be combined\n * @param {Array.<property-changeset.ChangeSet.ConflictInfo>} out_conflicts - A list of paths that resulted in\n * conflicts together with the type of the conflict\n * @param {string} in_basePath - Base path to get to the property processed by this function\n * @param {boolean} in_isPrimitiveType - is it an array of primitive types\n * @param {Object} [in_options] - Optional additional parameters\n * @param {Map} [in_options.applyAfterMetaInformation] - Additional meta information which help later to obtain\n * more compact changeset during the apply operation\n */\nconst handleRebaseCombinations = function (\n\tin_segment: SegmentType,\n\tout_conflicts: ConflictInfo[],\n\tin_basePath: string,\n\tin_isPrimitiveType: string,\n\tin_options: ApplyChangeSetOptions,\n) {\n\tconst opA = in_segment.opA;\n\tconst opB = in_segment.opB;\n\tif (opB.type === ArrayChangeSetIterator.types.INSERT) {\n\t\tconst originalStartPosition = opB.operation[0] + opB.offset;\n\t\tif (in_options && in_options.applyAfterMetaInformation) {\n\t\t\tlet length: number;\n\t\t\tconst insertEntries = opB.operation[1];\n\t\t\tif (!isNumber(insertEntries)) {\n\t\t\t\tlength = insertEntries.length;\n\n\t\t\t\tin_options.applyAfterMetaInformation.set(insertEntries, {\n\t\t\t\t\trebasedRemoveInsertRanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trangeStart: 0,\n\t\t\t\t\t\t\trangeLength: length,\n\t\t\t\t\t\t\toriginalStartPosition,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst handleInsert = (insertOp: Omit<InsertOperation, \"type\">, baseOp: InsertOperation) => {\n\t\t// conflicting inserts - report conflict, insert both\n\t\tdelete insertOp._absoluteBegin;\n\t\tdelete baseOp.offset;\n\t\tconst conflict = {\n\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\ttype: ConflictType.INSERTED_ENTRY_WITH_SAME_KEY, // todo\n\t\t\tconflictingChange: cloneDeep(baseOp),\n\t\t};\n\t\tout_conflicts.push(conflict);\n\n\t\t// move to the right side of the insert\n\t\tbaseOp.operation[0] += insertOp.operation[1].length;\n\t};\n\tswitch (opA.type) {\n\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\thandleInsert(opA, opB);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// non-conflicting insert - just keep B\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// non-conflicting insert - just keep B\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\tswitch (opB.type) {\n\t\t\t\tcase ArrayChangeSetIterator.types.INSERT: {\n\t\t\t\t\tif (opA._absoluteBegin !== opA.operation[0]) {\n\t\t\t\t\t\t// Move the insert operation to the beginning of the removed range\n\t\t\t\t\t\topB.operation[0] -= opA.operation[0] - opA._absoluteBegin;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we have a range with a remove / insert operation, we have\n\t\t\t\t\t// to take the insert operation within the base changeset\n\t\t\t\t\t// into account during rebasing, moving the rebased operation\n\t\t\t\t\t// behind this insert\n\t\t\t\t\tif (\n\t\t\t\t\t\tin_segment.removeInsertOperationA &&\n\t\t\t\t\t\tin_segment.removeInsertOperationA[0] === opB.operation[0]\n\t\t\t\t\t) {\n\t\t\t\t\t\thandleInsert(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toperation: in_segment.removeInsertOperationA as arrayInsertList,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\topB,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.REMOVE: {\n\t\t\t\t\t// Remove already in A, no need to add the same again -> write nop\n\n\t\t\t\t\tconst opBLen = isNumber(opB.operation[1])\n\t\t\t\t\t\t? opB.operation[1]\n\t\t\t\t\t\t: opB.operation[1].length;\n\t\t\t\t\tconst opALen = isNumber(opA.operation[1])\n\t\t\t\t\t\t? opA.operation[1]\n\t\t\t\t\t\t: opA.operation[1].length;\n\n\t\t\t\t\tif (opBLen !== opALen) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"handleRebaseCombinations: remove-remove: unequal number of affected entries, \" +\n\t\t\t\t\t\t\t\t\"this should never happen! Probably a bug in splitRange.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\t\t\t// trying to modify something that was removed ->\n\t\t\t\t\t// replace the modify with a NOP and report a conflict\n\n\t\t\t\t\tif (opB.operation[1].length > 0) {\n\t\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\t\ttype: ConflictType.ENTRY_MODIFIED_AFTER_REMOVE,\n\t\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t\t}\n\n\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\topB.operation = null;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase ArrayChangeSetIterator.types.MODIFY: {\n\t\t\tif (in_isPrimitiveType) {\n\t\t\t\t// just use opB and notify accordingly\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY && opB.operation[1].length > 0) {\n\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t};\n\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t\t// If opB new value is same as opA new value, replace the modify with a NOP\n\t\t\t\t\t// TODO: The real operation that we should do here is not to only test if both arrays are\n\t\t\t\t\t// completely identical, but if any value is identical and if so split the range\n\t\t\t\t\t// into multiple ones.\n\t\t\t\t\t// Ex. [[0, [30, 20, 10]]] over [[0, [10, 20, 30]]] should become [[0, [30]], [2, [10]]].\n\t\t\t\t\t// This does not seem easily doable in the current code.\n\t\t\t\t\tif (arraysHaveSameValues(opA.operation[1], opB.operation[1])) {\n\t\t\t\t\t\t(opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n\t\t\t\t\t\topB.operation = null;\n\t\t\t\t\t\t// If any, change the opB old value by the opA new value\n\t\t\t\t\t} else if (opB.operation[2]) {\n\t\t\t\t\t\topB.operation[2] = opA.operation[1].slice();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// WARNING: 'operation[1]' is 'string | number | genericArray'. The cast to 'number'\n\t\t\t\t// preserves the JavaScript coercion behavior, which was permitted prior to TS5.\n\t\t\t\tif (\n\t\t\t\t\topB.type === ArrayChangeSetIterator.types.REMOVE &&\n\t\t\t\t\t(opB.operation[1] as number) > 0\n\t\t\t\t) {\n\t\t\t\t\tdelete opA._absoluteBegin;\n\t\t\t\t\tdelete opB.offset;\n\t\t\t\t\tlet conflict = {\n\t\t\t\t\t\tpath: in_basePath, // TODO: We have to report the range or per element\n\t\t\t\t\t\ttype: ConflictType.REMOVE_AFTER_MODIFY,\n\t\t\t\t\t\tconflictingChange: cloneDeep(opB),\n\t\t\t\t\t};\n\t\t\t\t\tout_conflicts.push(conflict);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// we have to deal with complex types here!\n\t\t\t\tif (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n\t\t\t\t\tfor (let i = 0; i < opB.operation[1].length; ++i) {\n\t\t\t\t\t\tConsoleUtils.assert(\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t\"Malformed Operation. Missing typeid\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.rebaseChangeSetForPropertyEntryWithTypeid(\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\topA.operation[1],\n\t\t\t\t\t\t\topB.operation[1],\n\t\t\t\t\t\t\topA.operation[1][i].typeid,\n\t\t\t\t\t\t\t`${in_basePath}[${i}]`,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tout_conflicts,\n\t\t\t\t\t\t\tin_options,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n\t}\n};\n\n/**\n * apply a range's operation to the changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applySegment = function (\n\tin_segment: SegmentType,\n\tio_changeset: SerializedChangeSet,\n\tin_currentIndexOffset: number,\n\tlastIteratorARemove: RemoveOpInfo,\n\tin_isPrimitiveType: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_segment) {\n\t\tthrow Error(\"applySegment: in_segment is undefined!\");\n\t}\n\n\t// No operation needs to be performed\n\tif (\n\t\tin_segment.op === undefined &&\n\t\tin_segment.opA === undefined &&\n\t\tin_segment.opB === undefined\n\t) {\n\t\treturn;\n\t}\n\tif (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfApartOfB\n\t) {\n\t\t// just push it\n\t\tpushOp(\n\t\t\tin_segment.op,\n\t\t\tio_changeset,\n\t\t\tin_currentIndexOffset,\n\t\t\tin_options,\n\t\t\tlastIteratorARemove,\n\t\t\tin_segment,\n\t\t);\n\t} else {\n\t\t// combinations: pAB, AB or ApB\n\t\thandleCombinations.call(this, in_segment, in_isPrimitiveType); // modifies in_segment.opB to save garbage\n\t\tpushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n\t}\n};\n\n/**\n * apply a range's operation to the rebased changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_basePath - Base path to get to the property processed by this function\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applyRebaseSegment = function (\n\tin_segment: SegmentType,\n\tio_changeset: SerializedChangeSet,\n\tin_currentIndexOffset: number,\n\tout_conflicts: ConflictInfo[],\n\tin_basePath: string,\n\tin_isPrimitiveType: boolean,\n\tin_options?: ApplyChangeSetOptions,\n) {\n\tif (!in_segment) {\n\t\tthrow Error(\"applySegment: in_segment is undefined!\");\n\t}\n\tif (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeB ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfB\n\t) {\n\t\t// not touching anything of A, just push it\n\t\tpushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options);\n\t} else if (\n\t\tin_segment.flag === ArrayChangeSetRangeType.completeA ||\n\t\tin_segment.flag === ArrayChangeSetRangeType.partOfA\n\t) {\n\t\t// do nothing (we are rebasing B, not A)\n\t} else {\n\t\t// combinations: pAB, AB or ApB\n\t\thandleRebaseCombinations.call(\n\t\t\tthis,\n\t\t\tin_segment,\n\t\t\tout_conflicts,\n\t\t\tin_basePath,\n\t\t\tin_isPrimitiveType,\n\t\t\tin_options,\n\t\t); // modifies in_segment.opB to save garbage\n\t\tpushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n\t}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ChangeSetArrayFunctions {\n\t/**\n\t * Applies a changeset to a given array property. The ChangeSet is assumed to be relative to the same\n\t * property root and it will be applied behind the base ChangeSet (assuming that the changes are relative to the\n\t * state after the base ChangeSet has been applied. It will change the base ChangeSet.)\n\t *\n\t * @param io_basePropertyChanges - The ChangeSet describing the initial state\n\t * @param in_appliedPropertyChanges - The ChangeSet to apply to this state\n\t * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n\t */\n\texport function _performApplyAfterOnPropertyArray(\n\t\tio_basePropertyChanges: SerializedChangeSet,\n\t\tin_appliedPropertyChanges: SerializedChangeSet,\n\t\tin_typeid: string,\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tConsoleUtils.assert(in_typeid, \"_performApplyAfterOnPropertyArray: typeid missing\");\n\t\tConsoleUtils.assert(!isString(io_basePropertyChanges), io_basePropertyChanges);\n\t\tConsoleUtils.assert(!isString(in_appliedPropertyChanges), in_appliedPropertyChanges);\n\n\t\tconst isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n\t\t// Iterator to process the changes in the ChangeSet in the correct order\n\t\tconst iteratorA = new ArrayChangeSetIterator(io_basePropertyChanges);\n\t\tconst iteratorB = new ArrayChangeSetIterator(in_appliedPropertyChanges);\n\n\t\tconst rangeA: OperationRangeRemove | OperationRangeInsert = {};\n\t\tconst rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\n\t\tconst opA = iteratorA.opDescription;\n\t\tconst opB = iteratorB.opDescription;\n\n\t\tgetRangeForCurrentStateOperation(opA, opA.offset ? opA.offset : 0, rangeA);\n\t\tgetRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\n\t\tconst resultPropertyChanges: SerializedChangeSet = {};\n\t\tresultPropertyChanges.insert = [];\n\t\tresultPropertyChanges.modify = [];\n\t\tresultPropertyChanges.remove = [];\n\t\tresultPropertyChanges.writeOffset = 0;\n\n\t\tlet currentIndexOffset = 0;\n\t\tlet lastIteratorARemove;\n\t\tconst segment: OperationRangeRemove | OperationRangeInsert = {};\n\t\tlet skipIteratorBOperation;\n\n\t\tconst advanceIteratorB = () => {\n\t\t\tif (\n\t\t\t\t(opB as any).removeInsertOperation &&\n\t\t\t\tsegment.op !== undefined &&\n\t\t\t\tskipIteratorBOperation === undefined &&\n\t\t\t\tsegment.op.operation === (opB as any).removeInsertOperation\n\t\t\t) {\n\t\t\t\tskipIteratorBOperation = segment.op.operation;\n\t\t\t} else {\n\t\t\t\titeratorB.next();\n\t\t\t\tif (skipIteratorBOperation && opB.operation === skipIteratorBOperation) {\n\t\t\t\t\titeratorB.next();\n\t\t\t\t}\n\t\t\t\tskipIteratorBOperation = undefined;\n\t\t\t\tgetRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\t\t\t}\n\t\t};\n\n\t\t// create ranges for A and B: A is the current state and B is the change set to be applied\n\t\tlet lastIndexOffset = 0;\n\t\tlet canceledSegmentBegin;\n\t\tlet lastOpWasNop = false;\n\n\t\twhile (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n\t\t\t// produce first segment:\n\t\t\tsplitOverlapping(rangeA, rangeB, segment, false, in_options);\n\n\t\t\tlet indexOffset = currentIndexOffset;\n\n\t\t\tif (\n\t\t\t\tlastOpWasNop &&\n\t\t\t\t(rangeA.begin === undefined || rangeA.begin >= segment.begin) &&\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB &&\n\t\t\t\tsegment.op.type === ArrayChangeSetIterator.types.INSERT &&\n\t\t\t\tsegment.op.operation[0] === canceledSegmentBegin\n\t\t\t) {\n\t\t\t\tindexOffset = lastIndexOffset;\n\t\t\t}\n\n\t\t\tapplySegment.call(\n\t\t\t\tthis,\n\t\t\t\tsegment,\n\t\t\t\tresultPropertyChanges,\n\t\t\t\tindexOffset,\n\t\t\t\tlastIteratorARemove,\n\t\t\t\tisPrimitiveTypeid,\n\t\t\t);\n\t\t\tlastOpWasNop =\n\t\t\t\tsegment.opB !== undefined && segment.opB.type === ArrayChangeSetIterator.types.NOP;\n\t\t\tif (lastOpWasNop) {\n\t\t\t\tcanceledSegmentBegin = segment.begin;\n\t\t\t}\n\n\t\t\t// increase pointers if necessary\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeA ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t) {\n\t\t\t\t// We keep track of the last remove operation, because this information is needed\n\t\t\t\t// in pushOp to move inserts to the beginning of a remove range. The problem is\n\t\t\t\t// that the insert is processed after the remove and in that case the iterator\n\t\t\t\t// offset has already been incremented by the remove. Therefore, the insert would\n\t\t\t\t// be placed behind the remove. We detect this case and correct the offset accordingly\n\t\t\t\t// in pushOp\n\t\t\t\tif (opA.type === ArrayChangeSetIterator.types.REMOVE) {\n\t\t\t\t\tif (!lastIteratorARemove || lastIteratorARemove.position !== opA.operation[0]) {\n\t\t\t\t\t\tlastIteratorARemove = {\n\t\t\t\t\t\t\tposition: opA.operation[0],\n\t\t\t\t\t\t\tlength: getOpLength(opA.operation),\n\t\t\t\t\t\t\toffsetIncremented: false,\n\t\t\t\t\t\t\tcurrentIndex: opA.operation[0],\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// If there is already an insert operation at the beginning of the remove range\n\t\t\t\t\t\t// we have to adjust the position to the end of this operation (an insert that is\n\t\t\t\t\t\t// applied at the position of the remove would be shifted behind this insert)\n\t\t\t\t\t\tif (opA.removeInsertOperation) {\n\t\t\t\t\t\t\tif (opA.removeInsertOperation[0] + opA.offset === lastIteratorARemove.position) {\n\t\t\t\t\t\t\t\tlastIteratorARemove.position += getOpLength(opA.removeInsertOperation);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet moreAs = iteratorA.next();\n\n\t\t\t\t// The offset will only be incremented as soon as the iterator reaches an operation at a different index.\n\t\t\t\t// We detect this case and keep track, whether the remove has already been added to the offset or not.\n\t\t\t\tif (\n\t\t\t\t\tlastIteratorARemove &&\n\t\t\t\t\t((opA as any).operation === undefined ||\n\t\t\t\t\t\t(opA as any).operation[0] !== lastIteratorARemove.currentIndex)\n\t\t\t\t) {\n\t\t\t\t\tlastIteratorARemove.offsetIncremented = true;\n\t\t\t\t}\n\t\t\t\tgetRangeForCurrentStateOperation(\n\t\t\t\t\titeratorA.opDescription,\n\t\t\t\t\tmoreAs ? opA.offset : 0,\n\t\t\t\t\trangeA,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t) {\n\t\t\t\tadvanceIteratorB();\n\t\t\t}\n\t\t\tif (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n\t\t\t\tlet moreAs = iteratorA.next();\n\t\t\t\tgetRangeForCurrentStateOperation(opA, moreAs ? opA.offset : 0, rangeA);\n\t\t\t\tadvanceIteratorB();\n\t\t\t}\n\n\t\t\tif (opA.offset !== undefined) {\n\t\t\t\t// the correct index offset for the next operation is given by A's offset\n\t\t\t\tlastIndexOffset = currentIndexOffset;\n\t\t\t\tcurrentIndexOffset = opA.offset;\n\t\t\t}\n\t\t}\n\n\t\t// write back:\n\t\tif (resultPropertyChanges.insert.length > 0) {\n\t\t\tio_basePropertyChanges.insert = resultPropertyChanges.insert;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.insert;\n\t\t}\n\t\tif (resultPropertyChanges.modify.length > 0) {\n\t\t\tio_basePropertyChanges.modify = resultPropertyChanges.modify;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.modify;\n\t\t}\n\n\t\tif (resultPropertyChanges.remove.length > 0) {\n\t\t\t// Merge remove operations (but only, if there is no\n\t\t\t// insert inbetween the two removes)\n\t\t\tconst insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n\t\t\tconst mergedRemoves = [];\n\t\t\tfor (const remove of resultPropertyChanges.remove) {\n\t\t\t\tconst lastRemove = mergedRemoves[mergedRemoves.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastRemove &&\n\t\t\t\t\tlastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n\t\t\t\t\t!insertPosition.has(remove[0])\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(remove[1])) {\n\t\t\t\t\t\tlastRemove[1] = lastRemove[1].concat(remove[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastRemove[1] += remove[1];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmergedRemoves.push(remove);\n\t\t\t\t}\n\t\t\t}\n\t\t\tio_basePropertyChanges.remove = mergedRemoves;\n\t\t} else {\n\t\t\tdelete io_basePropertyChanges.remove;\n\t\t}\n\t}\n\n\t/**\n\t * Performs the rebase operation for array changes\n\t *\n\t * @param in_ownPropertyChangeSet -The ChangeSet for the property stored in this object\n\t * @param io_rebasePropertyChangeSet - The ChangeSet for the property to be rebased\n\t * @param in_basePath - Base path to get to the property processed by this function\n\t * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n\t * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n\t */\n\texport function _rebaseArrayChangeSetForProperty(\n\t\tin_ownPropertyChangeSet: SerializedChangeSet,\n\t\tio_rebasePropertyChangeSet: SerializedChangeSet,\n\t\tin_basePath: string,\n\t\tout_conflicts: ConflictInfo[],\n\t\tin_typeid: string,\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tconst isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n\t\t// Iterator to process the changes in the ChangeSet in the correct order\n\t\tconst iteratorA = new ArrayChangeSetIterator(in_ownPropertyChangeSet);\n\t\tconst iteratorB = new ArrayChangeSetIterator(io_rebasePropertyChangeSet);\n\n\t\tconst opA = iteratorA.opDescription;\n\n\t\tconst rangeA: OperationRangeRemove | OperationRangeInsert = {};\n\t\tgetRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n\t\tconst rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\n\t\tconst resultPropertyChanges: SerializedChangeSet = {};\n\t\tresultPropertyChanges.insert = [];\n\t\tresultPropertyChanges.modify = [];\n\t\tresultPropertyChanges.remove = [];\n\t\tresultPropertyChanges.writeOffset = 0;\n\n\t\tlet currentIndexOffset = 0;\n\t\tconst segment: OperationRangeRemove | OperationRangeInsert = {};\n\n\t\t// create ranges for A and B: A is the current state and B is the change set to be applied\n\t\twhile (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n\t\t\tsplitOverlapping(rangeA, rangeB, segment, true, in_options);\n\n\t\t\tapplyRebaseSegment.call(\n\t\t\t\tthis,\n\t\t\t\tsegment,\n\t\t\t\tresultPropertyChanges,\n\t\t\t\tcurrentIndexOffset,\n\t\t\t\tout_conflicts,\n\t\t\t\tin_basePath,\n\t\t\t\tisPrimitiveTypeid,\n\t\t\t\tin_options,\n\t\t\t);\n\n\t\t\t// increase pointers if necessary\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeA ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeApartOfB\n\t\t\t) {\n\t\t\t\titeratorA.next();\n\t\t\t\tgetRangeForAppliedOperation(\n\t\t\t\t\topA,\n\t\t\t\t\trangeA,\n\t\t\t\t\tArrayChangeSetRangeType.completeA,\n\t\t\t\t\tin_options,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeB ||\n\t\t\t\tsegment.flag === ArrayChangeSetRangeType.completeBpartOfA\n\t\t\t) {\n\t\t\t\titeratorB.next();\n\t\t\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\t\t\t}\n\t\t\tif (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n\t\t\t\titeratorA.next();\n\t\t\t\tgetRangeForAppliedOperation(\n\t\t\t\t\topA,\n\t\t\t\t\trangeA,\n\t\t\t\t\tArrayChangeSetRangeType.completeA,\n\t\t\t\t\tin_options,\n\t\t\t\t);\n\t\t\t\titeratorB.next();\n\t\t\t\tgetRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\t\t\t}\n\n\t\t\tif (opA.offset !== undefined) {\n\t\t\t\t// the correct index offset for the next operation is given by A's offset\n\t\t\t\tcurrentIndexOffset = -opA.offset;\n\t\t\t}\n\t\t}\n\n\t\t// write back:\n\t\tif (resultPropertyChanges.insert.length > 0) {\n\t\t\tio_rebasePropertyChangeSet.insert = resultPropertyChanges.insert;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.insert;\n\t\t}\n\t\tif (resultPropertyChanges.modify.length > 0) {\n\t\t\tio_rebasePropertyChangeSet.modify = resultPropertyChanges.modify;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.modify;\n\t\t}\n\t\tif (resultPropertyChanges.remove.length > 0) {\n\t\t\t// Merge remove operations (but only, if there is no\n\t\t\t// insert in between the two removes)\n\t\t\tconst insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n\t\t\tconst mergedRemoves = [];\n\t\t\tfor (const remove of resultPropertyChanges.remove) {\n\t\t\t\tconst lastRemove = mergedRemoves[mergedRemoves.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastRemove &&\n\t\t\t\t\tlastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n\t\t\t\t\t!insertPosition.has(remove[0])\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(remove[1])) {\n\t\t\t\t\t\tlastRemove[1] = lastRemove[1].concat(remove[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastRemove[1] += remove[1];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmergedRemoves.push(remove);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tio_rebasePropertyChangeSet.remove = mergedRemoves;\n\t\t} else {\n\t\t\tdelete io_rebasePropertyChangeSet.remove;\n\t\t}\n\t}\n\n\t/**\n\t * Performs the rebase operation for string changes\n\t *\n\t *\n\t * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n\t * Other is the modified, rebased (on own) changeset.\n\t *\n\t * ```\n\t * BASE\n\t * / \\\n\t * / \\\n\t * OWN OTHER\n\t * ```\n\t *\n\t * gets rebased to:\n\t *\n\t * ```\n\t * BASE\n\t * /\n\t * OWN\n\t * \\\n\t * OTHER\n\t * ```\n\t *\n\t * conflict default behavior in ()\n\t *\n\t * ```\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * \\Own| insert | modify | remove | String set |\n\t * \\ | | | | |\n\t * other\\ | | | | |\n\t * ------\\|-----------------+------------------+------------------|----------------|\n\t * | conflicting | non-conflicting | non-conflicting | conflict |\n\t * insert | inserts | change | change |(ignore insert) |\n\t * | (i. other after)| | | |\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * | non-conflicting | conflict | conflict | conflict |\n\t * modify | change |(notify the user) | (delete modify |(ignore modify) |\n\t * | | | in other) | |\n\t * -------|-----------------+------------------+------------------|----------------|\n\t * | non-conflicting | non-conflicting | non-conflicting | conflict |\n\t * remove | change | change | change |(ignore remove) |\n\t * -------|-----------------+------------------+------------------+----------------|\n\t * Str. | | conflict | |\n\t * set | 'other's set overwrites whatever happend before |\n\t * | | | | |\n\t * --------------------------------------------------------------------------------|\n\t * ```\n\t *\n\t * @param in_ownPropertyChangeSet - The ChangeSet for the property stored in this object\n\t * @param io_rebasePropertyChangeSetParent - The Array containing the ChangeSet for the property to be rebased\n\t * @param in_key - The key to the ChangeSet in io_rebasePropertyChangeSetParent we are rebasing on\n\t * @param in_basePath - Base path to get to the property processed by this function\n\t * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n\t */\n\texport function _rebaseChangeSetForString(\n\t\tin_ownPropertyChangeSet: SerializedChangeSet,\n\t\tio_rebasePropertyChangeSetParent: SerializedChangeSet,\n\t\tin_key: string,\n\t\tin_basePath: string,\n\t\tout_conflicts: ConflictInfo[],\n\t\tin_options?: ApplyChangeSetOptions,\n\t) {\n\t\tif (\n\t\t\tisString(io_rebasePropertyChangeSetParent[in_key]) ||\n\t\t\t(io_rebasePropertyChangeSetParent[in_key] &&\n\t\t\t\tio_rebasePropertyChangeSetParent[in_key].hasOwnProperty(\"value\"))\n\t\t) {\n\t\t\t// other overwrites any old changes, we ignore them and report the conflict\n\t\t\tlet conflict = {\n\t\t\t\tpath: in_basePath,\n\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\tconflictingChange: cloneDeep(in_ownPropertyChangeSet),\n\t\t\t};\n\t\t\tout_conflicts.push(conflict);\n\t\t\t// If value is the same, delete the entry\n\t\t\tlet ownValue = in_ownPropertyChangeSet;\n\t\t\tif (typeof ownValue === \"object\") {\n\t\t\t\townValue = ownValue.value;\n\t\t\t}\n\t\t\tlet rebaseValue = io_rebasePropertyChangeSetParent[in_key];\n\t\t\tif (typeof rebaseValue === \"object\") {\n\t\t\t\trebaseValue = rebaseValue.value;\n\t\t\t}\n\t\t\tif (ownValue === rebaseValue) {\n\t\t\t\tdelete io_rebasePropertyChangeSetParent[in_key];\n\t\t\t}\n\t\t} else if (\n\t\t\tisString(in_ownPropertyChangeSet) ||\n\t\t\t(in_ownPropertyChangeSet && in_ownPropertyChangeSet.hasOwnProperty(\"value\"))\n\t\t) {\n\t\t\t// we have a conflict since we cannot allow insert/remove/modify on an unknown state\n\t\t\t// we just ignore other's modifications and take own's set\n\t\t\tlet conflict = {\n\t\t\t\tpath: in_basePath,\n\t\t\t\ttype: ConflictType.COLLIDING_SET,\n\t\t\t\tconflictingChange: cloneDeep(io_rebasePropertyChangeSetParent[in_key]),\n\t\t\t};\n\t\t\tout_conflicts.push(conflict);\n\t\t\tio_rebasePropertyChangeSetParent[in_key] = in_ownPropertyChangeSet;\n\t\t} else {\n\t\t\t// both have no 'set' just array ops -> use array rebase!\n\t\t\tthis._rebaseArrayChangeSetForProperty(\n\t\t\t\tin_ownPropertyChangeSet,\n\t\t\t\tio_rebasePropertyChangeSetParent[in_key],\n\t\t\t\tin_basePath,\n\t\t\t\tout_conflicts,\n\t\t\t\t\"String\",\n\t\t\t\tin_options,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"arrayChangesetIterator.d.ts","sourceRoot":"","sources":["../../src/changeset_operations/arrayChangesetIterator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAIlE,KAAK,YAAY,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,EAAE,CAAC;AACrF,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GACxB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,GAC/B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACxC,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAChB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,GAAG,WAAW,CAAC;IACzE,IAAI,EAAE,2BAA2B,CAAC,GAAG,CAAC;IACtC,SAAS,CAAC,EAAE,EAAE,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;AACnF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAE/D;;;;;GAKG;AACH,qBAAa,sBAAsB;IAClC,MAAM,CAAC,KAAK,qCAA+B;IAE3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;IACrF,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,oBAAoB,CAAS;IAErC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,GAAG,CAAmB;IAE9B,IAAW,aAAa,IAAI,gBAAgB,CAE3C;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED;;OAEG;gBACS,YAAY,EAAE,mBAAmB;IA0B7C;;;OAGG;IACH,IAAI,IAAI,OAAO;IA8If;;OAEG;IACH,KAAK,IAAI,OAAO;IAIhB,OAAO,CAAC,aAAa;CAUrB"}
1
+ {"version":3,"file":"arrayChangesetIterator.d.ts","sourceRoot":"","sources":["../../src/changeset_operations/arrayChangesetIterator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAIlE,KAAK,YAAY,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,EAAE,CAAC;AACrF,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GACxB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,GAC/B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACxC,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC5D,IAAI,EAAE,2BAA2B,CAAC,MAAM,CAAC;IACzC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,SAAS,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAChB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,GAAG,WAAW,CAAC;IACzE,IAAI,EAAE,2BAA2B,CAAC,GAAG,CAAC;IACtC,SAAS,CAAC,EAAE,EAAE,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;AACnF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAE/D;;;;;GAKG;AACH,qBAAa,sBAAsB;IAClC,MAAM,CAAC,KAAK,qCAA+B;IAE3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;IACrF,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,oBAAoB,CAAS;IAErC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,GAAG,CAAmB;IAE9B,IAAW,aAAa,IAAI,gBAAgB,CAE3C;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED;;OAEG;gBACS,YAAY,EAAE,mBAAmB;IA0B7C;;;OAGG;IACH,IAAI,IAAI,OAAO;IA8If;;OAEG;IACH,KAAK,IAAI,OAAO;IAIhB,OAAO,CAAC,aAAa;CAUrB"}