@itwin/core-backend 5.7.0-dev.1 → 5.7.0-dev.11
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.
- package/CHANGELOG.md +13 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +37 -14
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +111 -23
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +108 -2
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +1 -2
- package/lib/cjs/StashManager.d.ts.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +76 -55
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +116 -29
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +240 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -0
- package/lib/cjs/internal/IntegrityCheck.js +193 -0
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -0
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +37 -14
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +111 -23
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +108 -2
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/StashManager.d.ts +1 -2
- package/lib/esm/StashManager.d.ts.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +76 -55
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +116 -29
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +240 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -0
- package/lib/esm/internal/IntegrityCheck.js +187 -0
- package/lib/esm/internal/IntegrityCheck.js.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +201 -12
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +72 -2
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +9 -9
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +173 -2
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +89 -0
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.d.ts +2 -0
- package/lib/esm/test/standalone/IntegrityCheck.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/IntegrityCheck.test.js +385 -0
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -0
- package/package.json +14 -14
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { assert } from "chai";
|
|
6
6
|
import * as path from "path";
|
|
7
|
+
import * as fs from "fs";
|
|
7
8
|
import { Code } from "@itwin/core-common";
|
|
8
|
-
import { DefinitionElement, Element, InformationContentElement, RepositoryLink, SpatialViewDefinition, UrlLink, ViewDefinition3d, } from "../../core-backend";
|
|
9
|
+
import { DefinitionElement, ECDb, Element, IModelHost, IModelJsFs, InformationContentElement, RepositoryLink, SpatialViewDefinition, UrlLink, ViewDefinition3d, } from "../../core-backend";
|
|
9
10
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
10
11
|
import { KnownTestLocations } from "../KnownTestLocations";
|
|
11
|
-
import { SchemaKey } from "@itwin/ecschema-metadata";
|
|
12
|
+
import { EntityClass, SchemaContext, SchemaJsonLocater, SchemaKey, SchemaMatchType } from "@itwin/ecschema-metadata";
|
|
12
13
|
describe("IModel Schema Context", () => {
|
|
13
14
|
let imodel;
|
|
14
15
|
before(() => {
|
|
@@ -92,4 +93,73 @@ describe("IModel Schema Context", () => {
|
|
|
92
93
|
assert.isDefined(expectedString);
|
|
93
94
|
});
|
|
94
95
|
});
|
|
96
|
+
// --- Reproduction Test for Issue #8047 ---
|
|
97
|
+
describe("getDerivedClasses returns only loaded schemas", () => {
|
|
98
|
+
const outputDir = path.join(__dirname, "output_8047");
|
|
99
|
+
const ecdbPath = path.join(outputDir, "test_8047.ecdb");
|
|
100
|
+
before(async () => {
|
|
101
|
+
// Ensure IModelHost is startup (idempotent check)
|
|
102
|
+
if (!IModelHost.isValid) {
|
|
103
|
+
await IModelHost.startup();
|
|
104
|
+
}
|
|
105
|
+
if (!fs.existsSync(outputDir)) {
|
|
106
|
+
fs.mkdirSync(outputDir);
|
|
107
|
+
}
|
|
108
|
+
if (fs.existsSync(ecdbPath)) {
|
|
109
|
+
IModelJsFs.unlinkSync(ecdbPath);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
after(async () => {
|
|
113
|
+
if (fs.existsSync(outputDir)) {
|
|
114
|
+
IModelJsFs.removeSync(outputDir);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it("should find derived classes in referencing schemas ONLY if referencing schema is loaded", async () => {
|
|
118
|
+
const ecdb = new ECDb();
|
|
119
|
+
ecdb.createDb(ecdbPath);
|
|
120
|
+
// 1. Create Schema 1 (The Parent)
|
|
121
|
+
const schemaXml1 = `<?xml version="1.0" encoding="UTF-8"?>
|
|
122
|
+
<ECSchema schemaName="TestSchema1" alias="Test1" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
|
|
123
|
+
<ECEntityClass typeName="ParentClass" />
|
|
124
|
+
</ECSchema>`;
|
|
125
|
+
const schemaPath1 = path.join(outputDir, "TestSchema1.01.00.00.xml");
|
|
126
|
+
fs.writeFileSync(schemaPath1, schemaXml1);
|
|
127
|
+
ecdb.importSchema(schemaPath1);
|
|
128
|
+
// 2. Create Schema 2 (The Child) - References Schema 1
|
|
129
|
+
const schemaXml2 = `<?xml version="1.0" encoding="UTF-8"?>
|
|
130
|
+
<ECSchema schemaName="TestSchema2" alias="Test2" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
|
|
131
|
+
<ECSchemaReference name="TestSchema1" version="01.00.00" alias="t1" />
|
|
132
|
+
<ECEntityClass typeName="ChildClass">
|
|
133
|
+
<BaseClass>t1:ParentClass</BaseClass>
|
|
134
|
+
</ECEntityClass>
|
|
135
|
+
</ECSchema>`;
|
|
136
|
+
const schemaPath2 = path.join(outputDir, "TestSchema2.01.00.00.xml");
|
|
137
|
+
fs.writeFileSync(schemaPath2, schemaXml2);
|
|
138
|
+
ecdb.importSchema(schemaPath2);
|
|
139
|
+
ecdb.saveChanges();
|
|
140
|
+
// 3. Setup the Context
|
|
141
|
+
const context = new SchemaContext();
|
|
142
|
+
const locater = new SchemaJsonLocater((name) => ecdb.getSchemaProps(name));
|
|
143
|
+
context.addLocater(locater);
|
|
144
|
+
// 4. Get the Parent Class
|
|
145
|
+
const testSchema1 = await context.getSchema(new SchemaKey("TestSchema1"), SchemaMatchType.Latest);
|
|
146
|
+
if (!testSchema1)
|
|
147
|
+
throw new Error("Failed to load TestSchema1");
|
|
148
|
+
const parentClass = await testSchema1.getItem("ParentClass", EntityClass);
|
|
149
|
+
if (!parentClass)
|
|
150
|
+
throw new Error("Failed to load ParentClass");
|
|
151
|
+
// TEST CASE A: Verify it returns 0 when Schema 2 is unloaded (Reproducing the "Bug")
|
|
152
|
+
let derivedClasses = await parentClass.getDerivedClasses();
|
|
153
|
+
const countUnloaded = derivedClasses ? derivedClasses.length : 0;
|
|
154
|
+
assert.equal(countUnloaded, 0, "Should verify that 0 classes are found when referencing schema is unloaded");
|
|
155
|
+
// TEST CASE B: Verify the workaround (Load Schema 2)
|
|
156
|
+
await context.getSchema(new SchemaKey("TestSchema2"), SchemaMatchType.Latest);
|
|
157
|
+
derivedClasses = await parentClass.getDerivedClasses();
|
|
158
|
+
// This confirms the system works as intended IF you load the schema
|
|
159
|
+
assert.isDefined(derivedClasses);
|
|
160
|
+
assert.equal(derivedClasses.length, 1, "Should find 1 derived class after referencing schema is loaded");
|
|
161
|
+
assert.equal(derivedClasses[0].name, "ChildClass");
|
|
162
|
+
ecdb.closeDb();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
95
165
|
//# sourceMappingURL=IModelSchemaContext.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelSchemaContext.test.js","sourceRoot":"","sources":["../../../../src/test/schema/IModelSchemaContext.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport * as path from \"path\";\r\nimport { Code } from \"@itwin/core-common\";\r\nimport {\r\n DefinitionElement,\r\n Element,\r\n InformationContentElement,\r\n RepositoryLink,\r\n SnapshotDb, SpatialViewDefinition, UrlLink, ViewDefinition3d,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { SchemaKey } from \"@itwin/ecschema-metadata\";\r\n\r\ndescribe(\"IModel Schema Context\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"IModelSchemaContext\", \"IModelSchemaContext.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n assert.exists(imodel);\r\n });\r\n\r\n after(() => {\r\n imodel?.close();\r\n });\r\n\r\n it(\"should verify the Entity metadata of known element subclasses\", async () => {\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel.elements.getElement(code1);\r\n assert.exists(el);\r\n if (el) {\r\n const ecClass = await el.getMetaData();\r\n assert.exists(ecClass);\r\n assert.equal(ecClass.schema.name, el.schemaName);\r\n assert.equal(ecClass.name, el.className);\r\n\r\n // I happen to know that this is a BisCore:RepositoryLink\r\n assert.equal(ecClass.fullName, RepositoryLink.schemaItemKey.fullName);\r\n // Check the metadata on the class itself\r\n const baseClass = await ecClass.baseClass;\r\n assert.exists(ecClass.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, UrlLink.schemaItemKey.fullName);\r\n assert.exists(ecClass.customAttributes);\r\n assert.isTrue(ecClass.customAttributes?.has(\"BisCore.ClassHasHandler\"));\r\n // Check the metadata on the one property that RepositoryLink defines, RepositoryGuid\r\n const property = await ecClass.getProperty(\"repositoryGuid\");\r\n assert.exists(property);\r\n if (undefined === property)\r\n return;\r\n\r\n if(!property.isPrimitive())\r\n assert.fail(\"Property is not primitive\");\r\n\r\n assert.equal(property.extendedTypeName, \"BeGuid\");\r\n assert.isTrue(property.customAttributes?.has(\"CoreCustomAttributes.HiddenProperty\"));\r\n }\r\n const el2 = imodel.elements.getElement(\"0x34\");\r\n assert.exists(el2);\r\n if (el2) {\r\n const metaData = await el2.getMetaData();\r\n assert.exists(metaData);\r\n if (undefined === metaData)\r\n return;\r\n assert.equal(metaData.fullName, el2.schemaItemKey.fullName);\r\n // I happen to know that this is a BisCore.SpatialViewDefinition\r\n assert.equal(metaData.fullName, SpatialViewDefinition.schemaItemKey.fullName);\r\n\r\n const baseClass = await metaData.baseClass;\r\n assert.exists(metaData.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, ViewDefinition3d.schemaItemKey.fullName);\r\n const prop = metaData.getPropertySync(\"modelSelector\");\r\n assert.isDefined(prop);\r\n if(!prop?.isNavigation())\r\n assert.fail(\"Property is not navigation property\");\r\n\r\n assert.equal((await prop.relationshipClass).fullName, \"BisCore.SpatialViewDefinitionUsesModelSelector\");\r\n }\r\n });\r\n\r\n it(\"should verify Entity metadata with both base class and mixin properties\", async () => {\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestDomain.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n\r\n const testDomain = await imodel.schemaContext.getSchema(new SchemaKey(\"TestDomain\", 1,0,0));\r\n const testDomainClass = await testDomain!.getEntityClass(\"TestDomainClass\");\r\n const baseClassFullNames = Array.from(testDomainClass!.getAllBaseClassesSync() ?? []).map(baseClass => baseClass.fullName);\r\n assert.equal(baseClassFullNames.length, 4);\r\n assert.equal(baseClassFullNames[0], DefinitionElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[1], InformationContentElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[2], Element.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[3], \"TestDomain.IMixin\");\r\n\r\n // Verify that the forEach method which is called when constructing an entity\r\n // is picking up all expected properties.\r\n const properties = Array.from(await testDomainClass!.getProperties());\r\n const testData = properties.map(property => property.name);\r\n const expectedString = testData.find((testString: string) => {\r\n return testString === \"TestMixinProperty\";\r\n });\r\n\r\n assert.isDefined(expectedString);\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"IModelSchemaContext.test.js","sourceRoot":"","sources":["../../../../src/test/schema/IModelSchemaContext.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { Code } from \"@itwin/core-common\";\r\nimport {\r\n DefinitionElement,\r\n ECDb,\r\n Element,\r\n IModelHost,\r\n IModelJsFs,\r\n InformationContentElement,\r\n RepositoryLink,\r\n SnapshotDb, SpatialViewDefinition, UrlLink, ViewDefinition3d,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { EntityClass, SchemaContext, SchemaJsonLocater, SchemaKey, SchemaMatchType } from \"@itwin/ecschema-metadata\";\r\n\r\ndescribe(\"IModel Schema Context\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"IModelSchemaContext\", \"IModelSchemaContext.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n assert.exists(imodel);\r\n });\r\n\r\n after(() => {\r\n imodel?.close();\r\n });\r\n\r\n it(\"should verify the Entity metadata of known element subclasses\", async () => {\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel.elements.getElement(code1);\r\n assert.exists(el);\r\n if (el) {\r\n const ecClass = await el.getMetaData();\r\n assert.exists(ecClass);\r\n assert.equal(ecClass.schema.name, el.schemaName);\r\n assert.equal(ecClass.name, el.className);\r\n\r\n // I happen to know that this is a BisCore:RepositoryLink\r\n assert.equal(ecClass.fullName, RepositoryLink.schemaItemKey.fullName);\r\n // Check the metadata on the class itself\r\n const baseClass = await ecClass.baseClass;\r\n assert.exists(ecClass.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, UrlLink.schemaItemKey.fullName);\r\n assert.exists(ecClass.customAttributes);\r\n assert.isTrue(ecClass.customAttributes?.has(\"BisCore.ClassHasHandler\"));\r\n // Check the metadata on the one property that RepositoryLink defines, RepositoryGuid\r\n const property = await ecClass.getProperty(\"repositoryGuid\");\r\n assert.exists(property);\r\n if (undefined === property)\r\n return;\r\n\r\n if(!property.isPrimitive())\r\n assert.fail(\"Property is not primitive\");\r\n\r\n assert.equal(property.extendedTypeName, \"BeGuid\");\r\n assert.isTrue(property.customAttributes?.has(\"CoreCustomAttributes.HiddenProperty\"));\r\n }\r\n const el2 = imodel.elements.getElement(\"0x34\");\r\n assert.exists(el2);\r\n if (el2) {\r\n const metaData = await el2.getMetaData();\r\n assert.exists(metaData);\r\n if (undefined === metaData)\r\n return;\r\n assert.equal(metaData.fullName, el2.schemaItemKey.fullName);\r\n // I happen to know that this is a BisCore.SpatialViewDefinition\r\n assert.equal(metaData.fullName, SpatialViewDefinition.schemaItemKey.fullName);\r\n\r\n const baseClass = await metaData.baseClass;\r\n assert.exists(metaData.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, ViewDefinition3d.schemaItemKey.fullName);\r\n const prop = metaData.getPropertySync(\"modelSelector\");\r\n assert.isDefined(prop);\r\n if(!prop?.isNavigation())\r\n assert.fail(\"Property is not navigation property\");\r\n\r\n assert.equal((await prop.relationshipClass).fullName, \"BisCore.SpatialViewDefinitionUsesModelSelector\");\r\n }\r\n });\r\n\r\n it(\"should verify Entity metadata with both base class and mixin properties\", async () => {\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestDomain.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n\r\n const testDomain = await imodel.schemaContext.getSchema(new SchemaKey(\"TestDomain\", 1,0,0));\r\n const testDomainClass = await testDomain!.getEntityClass(\"TestDomainClass\");\r\n const baseClassFullNames = Array.from(testDomainClass!.getAllBaseClassesSync() ?? []).map(baseClass => baseClass.fullName);\r\n assert.equal(baseClassFullNames.length, 4);\r\n assert.equal(baseClassFullNames[0], DefinitionElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[1], InformationContentElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[2], Element.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[3], \"TestDomain.IMixin\");\r\n\r\n // Verify that the forEach method which is called when constructing an entity\r\n // is picking up all expected properties.\r\n const properties = Array.from(await testDomainClass!.getProperties());\r\n const testData = properties.map(property => property.name);\r\n const expectedString = testData.find((testString: string) => {\r\n return testString === \"TestMixinProperty\";\r\n });\r\n\r\n assert.isDefined(expectedString);\r\n });\r\n});\r\n\r\n// --- Reproduction Test for Issue #8047 ---\r\ndescribe(\"getDerivedClasses returns only loaded schemas\", () => {\r\n const outputDir = path.join(__dirname, \"output_8047\");\r\n const ecdbPath = path.join(outputDir, \"test_8047.ecdb\");\r\n\r\n before(async () => {\r\n // Ensure IModelHost is startup (idempotent check)\r\n if (!IModelHost.isValid) {\r\n await IModelHost.startup();\r\n }\r\n if (!fs.existsSync(outputDir)) {\r\n fs.mkdirSync(outputDir);\r\n }\r\n if (fs.existsSync(ecdbPath)) {\r\n IModelJsFs.unlinkSync(ecdbPath);\r\n }\r\n });\r\n\r\n after(async () => {\r\n if (fs.existsSync(outputDir)) {\r\n IModelJsFs.removeSync(outputDir);\r\n }\r\n });\r\n\r\n it(\"should find derived classes in referencing schemas ONLY if referencing schema is loaded\", async () => {\r\n const ecdb = new ECDb();\r\n ecdb.createDb(ecdbPath);\r\n\r\n // 1. Create Schema 1 (The Parent)\r\n const schemaXml1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestSchema1\" alias=\"Test1\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECEntityClass typeName=\"ParentClass\" />\r\n </ECSchema>`;\r\n const schemaPath1 = path.join(outputDir, \"TestSchema1.01.00.00.xml\");\r\n fs.writeFileSync(schemaPath1, schemaXml1);\r\n ecdb.importSchema(schemaPath1);\r\n\r\n // 2. Create Schema 2 (The Child) - References Schema 1\r\n const schemaXml2 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestSchema2\" alias=\"Test2\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"TestSchema1\" version=\"01.00.00\" alias=\"t1\" />\r\n <ECEntityClass typeName=\"ChildClass\">\r\n <BaseClass>t1:ParentClass</BaseClass>\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n const schemaPath2 = path.join(outputDir, \"TestSchema2.01.00.00.xml\");\r\n fs.writeFileSync(schemaPath2, schemaXml2);\r\n ecdb.importSchema(schemaPath2);\r\n ecdb.saveChanges();\r\n\r\n // 3. Setup the Context\r\n const context = new SchemaContext();\r\n const locater = new SchemaJsonLocater((name: string) => ecdb.getSchemaProps(name));\r\n context.addLocater(locater);\r\n\r\n // 4. Get the Parent Class\r\n const testSchema1 = await context.getSchema(new SchemaKey(\"TestSchema1\"), SchemaMatchType.Latest);\r\n if (!testSchema1) throw new Error(\"Failed to load TestSchema1\");\r\n const parentClass = await testSchema1.getItem(\"ParentClass\", EntityClass);\r\n if (!parentClass) throw new Error(\"Failed to load ParentClass\");\r\n\r\n // TEST CASE A: Verify it returns 0 when Schema 2 is unloaded (Reproducing the \"Bug\")\r\n let derivedClasses = await parentClass.getDerivedClasses();\r\n const countUnloaded = derivedClasses ? derivedClasses.length : 0;\r\n assert.equal(countUnloaded, 0, \"Should verify that 0 classes are found when referencing schema is unloaded\");\r\n\r\n // TEST CASE B: Verify the workaround (Load Schema 2)\r\n await context.getSchema(new SchemaKey(\"TestSchema2\"), SchemaMatchType.Latest);\r\n\r\n derivedClasses = await parentClass.getDerivedClasses();\r\n\r\n // This confirms the system works as intended IF you load the schema\r\n assert.isDefined(derivedClasses);\r\n assert.equal(derivedClasses!.length, 1, \"Should find 1 derived class after referencing schema is loaded\");\r\n assert.equal(derivedClasses![0].name, \"ChildClass\");\r\n\r\n ecdb.closeDb();\r\n });\r\n});\r\n"]}
|
|
@@ -8,7 +8,7 @@ import * as chai from "chai";
|
|
|
8
8
|
import { assert } from "chai";
|
|
9
9
|
import * as chaiAsPromised from "chai-as-promised";
|
|
10
10
|
import { HubWrappers, KnownTestLocations } from "..";
|
|
11
|
-
import { ChannelControl, IModelHost, SpatialCategory, SqliteChangesetReader } from "../../core-backend";
|
|
11
|
+
import { ChannelControl, IModelHost, SpatialCategory, SqliteChangesetReader, } from "../../core-backend";
|
|
12
12
|
import { HubMock } from "../../internal/HubMock";
|
|
13
13
|
import { IModelTestUtils, TestUserType } from "../IModelTestUtils";
|
|
14
14
|
import { Point3d } from "@itwin/core-geometry";
|
|
@@ -90,18 +90,18 @@ describe("Change merge method", () => {
|
|
|
90
90
|
const events = new Map();
|
|
91
91
|
const b1 = await ctx.openB1();
|
|
92
92
|
events.set(b1.briefcaseId, []);
|
|
93
|
-
b1.txns.onRebaseTxnBegin.addListener((args) => {
|
|
93
|
+
b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
94
94
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
95
95
|
});
|
|
96
|
-
b1.txns.onRebaseTxnEnd.addListener((args) => {
|
|
96
|
+
b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
97
97
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
98
98
|
});
|
|
99
99
|
const b2 = await ctx.openB2();
|
|
100
100
|
events.set(b2.briefcaseId, []);
|
|
101
|
-
b2.txns.onRebaseTxnBegin.addListener((args) => {
|
|
101
|
+
b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
102
102
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
103
103
|
});
|
|
104
|
-
b2.txns.onRebaseTxnEnd.addListener((args) => {
|
|
104
|
+
b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
105
105
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
106
106
|
});
|
|
107
107
|
const e1 = await insertPhysicalObject(b1);
|
|
@@ -219,18 +219,18 @@ describe("Change merge method", () => {
|
|
|
219
219
|
const events = new Map();
|
|
220
220
|
const b1 = await ctx.openB1();
|
|
221
221
|
events.set(b1.briefcaseId, []);
|
|
222
|
-
b1.txns.onRebaseTxnBegin.addListener((args) => {
|
|
222
|
+
b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
223
223
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
224
224
|
});
|
|
225
|
-
b1.txns.onRebaseTxnEnd.addListener((args) => {
|
|
225
|
+
b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
226
226
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
227
227
|
});
|
|
228
228
|
const b2 = await ctx.openB2();
|
|
229
229
|
events.set(b2.briefcaseId, []);
|
|
230
|
-
b2.txns.onRebaseTxnBegin.addListener((args) => {
|
|
230
|
+
b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
231
231
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
232
232
|
});
|
|
233
|
-
b2.txns.onRebaseTxnEnd.addListener((args) => {
|
|
233
|
+
b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
234
234
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
235
235
|
});
|
|
236
236
|
const e1 = await insertPhysicalObject(b1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,MAAM,EAEN,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,EAEL,cAAc,EAEd,UAAU,EACV,eAAe,EACf,qBAAqB,EAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEzB,KAAK,UAAU,iBAAiB,CAAI,IAAsB,EAAE,GAAY;IACtE,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,GAAG,CAAC,CAAC;AAClE,CAAC;AAGD,KAAK,UAAU,oBAAoB,CAAC,CAAc,EAAE,GAAW,EAAE,cAAsB;IACrF,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC;IACtC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,GAAG,GAAG;QACV,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACV;QACD,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,iBAAiB,EAAE,EAAE;QACrB,UAAU,EAAE,YAAY;QACxB,WAAW,EAAE,aAAa;QAC1B,aAAa,EAAE,KAAK,EAAE,IAAiC,EAAE,MAAa,EAAE,EAAE;YACxE,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACpJ,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAC/D,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,MAAa,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,MAAa,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,MAAa,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAChF,CAAA;IAED,KAAK,UAAU,oBAAoB,CAAC,CAAc;QAChD,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,OAAO,CAAC,QAAQ,EAAE,CAAA;QAClB,8BAA8B;IAChC,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC9B,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACrF,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChF,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9E,GAAG,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtK,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,wCAAwC,CACxE,EAAE,EACF,eAAe,CAAC,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAC1D,IAAI,CAAC,CAAC;QACR,MAAM,UAAU,GAAoB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAkB,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7F,MAAM,eAAe,GAAG,eAAe,CAAC,4BAA4B,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QAC5G,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAC5C,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,EAAE,EACb,eAAe,CAAC,KAAK,EACrB,IAAI,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAC/C,CAAC;QACF,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD;;;WAGG;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8E,CAAC;QAErG,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAE5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAGH,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,mDAAmD;QACnD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,6CAA6C,CAAC,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,6CAA6C,CAAC,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAGhE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,6CAA6C,CAAC,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,6CAA6C,CAAC,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAGhE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;QAC1D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,2CAA2C,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,2CAA2C,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,2CAA2C,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,2CAA2C,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAE5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAE5D,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8E,CAAC;QAErG,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAE5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAGH,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,eAAe;QACf,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;QAC1D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAE5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAE5D,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAE9B,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAExB,MAAM,iBAAiB,CACrB,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EACpD,+CAA+C,CAAC,CAAC;QAEnD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAEvF,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACpF,EAAE,CAAC,cAAc,EAAE,CAAC;QAEpB,kCAAkC;QAClC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YACjC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAiC,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;4BAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;4BACnI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;4BACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;4BACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;4BACjF,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC7F,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,mCAAmC;wBACvE,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAE/B,yCAAyC;QACzC,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/E,mDAAmD;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtE,yDAAyD;QACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAI/F,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAE/F,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAE9B,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAExB,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,kCAAkC;QAClC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YACjC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAiC,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;4BAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;4BACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;4BACjF,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC7F,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,oCAAoC;wBACxE,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAE/F,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAuB,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACxF,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9D,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3E,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9B,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAuB,EAAE,CAAC,CAAC;QAErE,4EAA4E;QAC5E,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAExB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n IModelHost,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n TxnProps\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\n\r\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\r\n await b.locks.acquireLocks({ exclusive: el1 });\r\n const props = b.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n b.elements.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(b: BriefcaseDb,) {\r\n await b.locks.acquireLocks({ shared: ctx.modelId });\r\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n //await IModelHost.shutdown();\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n dictionary.iModel,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1.elements.updateElement(eb1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2.elements.deleteElement(e1);\r\n b2.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance,\r\n TxnProps\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n IModelHost,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\n\r\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\r\n await b.locks.acquireLocks({ exclusive: el1 });\r\n const props = b.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n b.elements.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(b: BriefcaseDb,) {\r\n await b.locks.acquireLocks({ shared: ctx.modelId });\r\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n //await IModelHost.shutdown();\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n dictionary.iModel,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1.elements.updateElement(eb1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2.elements.deleteElement(e1);\r\n b2.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
|