@itwin/core-backend 5.5.0-dev.1 → 5.5.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/lib/cjs/BackendHubAccess.js.map +1 -1
  2. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  3. package/lib/cjs/BisCoreSchema.js.map +1 -1
  4. package/lib/cjs/BlobContainerService.js.map +1 -1
  5. package/lib/cjs/BriefcaseManager.js.map +1 -1
  6. package/lib/cjs/CatalogDb.js.map +1 -1
  7. package/lib/cjs/Category.js.map +1 -1
  8. package/lib/cjs/ChangeSummaryManager.js +2 -2
  9. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  10. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  11. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  12. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  13. package/lib/cjs/ChannelControl.js.map +1 -1
  14. package/lib/cjs/CheckpointManager.js.map +1 -1
  15. package/lib/cjs/ClassRegistry.js +5 -5
  16. package/lib/cjs/ClassRegistry.js.map +1 -1
  17. package/lib/cjs/CloudSqlite.js.map +1 -1
  18. package/lib/cjs/CodeService.js.map +1 -1
  19. package/lib/cjs/CodeSpecs.js.map +1 -1
  20. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  21. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  22. package/lib/cjs/DevTools.js.map +1 -1
  23. package/lib/cjs/DisplayStyle.js.map +1 -1
  24. package/lib/cjs/ECDb.js.map +1 -1
  25. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  26. package/lib/cjs/ECSqlStatement.js.map +1 -1
  27. package/lib/cjs/Element.js.map +1 -1
  28. package/lib/cjs/ElementAspect.js.map +1 -1
  29. package/lib/cjs/ElementGraphics.js.map +1 -1
  30. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  31. package/lib/cjs/Entity.js.map +1 -1
  32. package/lib/cjs/EntityReferences.js.map +1 -1
  33. package/lib/cjs/ExportGraphics.js.map +1 -1
  34. package/lib/cjs/ExternalSource.js.map +1 -1
  35. package/lib/cjs/FontFile.js.map +1 -1
  36. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  37. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  38. package/lib/cjs/GeometrySummary.js +47 -47
  39. package/lib/cjs/GeometrySummary.js.map +1 -1
  40. package/lib/cjs/IModelDb.js +8 -8
  41. package/lib/cjs/IModelDb.js.map +1 -1
  42. package/lib/cjs/IModelDbFonts.js.map +1 -1
  43. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  44. package/lib/cjs/IModelHost.js.map +1 -1
  45. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  46. package/lib/cjs/IModelJsFs.js.map +1 -1
  47. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  48. package/lib/cjs/IpcHost.js.map +1 -1
  49. package/lib/cjs/LineStyle.js.map +1 -1
  50. package/lib/cjs/LocalHub.js +1 -1
  51. package/lib/cjs/LocalHub.js.map +1 -1
  52. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  53. package/lib/cjs/LockControl.js.map +1 -1
  54. package/lib/cjs/Material.js.map +1 -1
  55. package/lib/cjs/Model.js.map +1 -1
  56. package/lib/cjs/NativeAppStorage.js.map +1 -1
  57. package/lib/cjs/NativeHost.js.map +1 -1
  58. package/lib/cjs/NavigationRelationship.js.map +1 -1
  59. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  60. package/lib/cjs/PropertyStore.js.map +1 -1
  61. package/lib/cjs/Relationship.js.map +1 -1
  62. package/lib/cjs/RpcBackend.js.map +1 -1
  63. package/lib/cjs/SQLiteDb.js.map +1 -1
  64. package/lib/cjs/Schema.js.map +1 -1
  65. package/lib/cjs/SchemaSync.js.map +1 -1
  66. package/lib/cjs/SchemaUtils.js.map +1 -1
  67. package/lib/cjs/SheetIndex.js.map +1 -1
  68. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  69. package/lib/cjs/SqliteStatement.js.map +1 -1
  70. package/lib/cjs/StashManager.js.map +1 -1
  71. package/lib/cjs/Texture.js.map +1 -1
  72. package/lib/cjs/TileStorage.js.map +1 -1
  73. package/lib/cjs/TxnManager.js.map +1 -1
  74. package/lib/cjs/ViewDefinition.js.map +1 -1
  75. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  76. package/lib/cjs/ViewStore.js.map +1 -1
  77. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  78. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  79. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  80. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  81. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  82. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  83. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  84. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  85. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  86. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  87. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  88. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  89. package/lib/cjs/core-backend.js.map +1 -1
  90. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  91. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  92. package/lib/cjs/domains/GenericElements.js.map +1 -1
  93. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  94. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  95. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  96. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  97. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  98. package/lib/cjs/internal/HubMock.js.map +1 -1
  99. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  100. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  101. package/lib/cjs/internal/NoLocks.js.map +1 -1
  102. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  103. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  104. package/lib/cjs/internal/Symbols.js.map +1 -1
  105. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  106. package/lib/cjs/internal/cross-package.js.map +1 -1
  107. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  108. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  109. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  110. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  111. package/lib/cjs/rpc/multipart.js.map +1 -1
  112. package/lib/cjs/rpc/tracing.js.map +1 -1
  113. package/lib/cjs/rpc/web/logging.js.map +1 -1
  114. package/lib/cjs/rpc/web/request.js.map +1 -1
  115. package/lib/cjs/rpc/web/response.js.map +1 -1
  116. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  117. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  118. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  119. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  120. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  121. package/lib/cjs/workspace/Settings.js.map +1 -1
  122. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  123. package/lib/cjs/workspace/Workspace.js.map +1 -1
  124. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  125. package/lib/esm/BackendHubAccess.js.map +1 -1
  126. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  127. package/lib/esm/BisCoreSchema.js.map +1 -1
  128. package/lib/esm/BlobContainerService.js.map +1 -1
  129. package/lib/esm/BriefcaseManager.js.map +1 -1
  130. package/lib/esm/CatalogDb.js.map +1 -1
  131. package/lib/esm/Category.js.map +1 -1
  132. package/lib/esm/ChangeSummaryManager.js +2 -2
  133. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  134. package/lib/esm/ChangedElementsDb.js.map +1 -1
  135. package/lib/esm/ChangesetECAdaptor.js +248 -248
  136. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  137. package/lib/esm/ChannelControl.js.map +1 -1
  138. package/lib/esm/CheckpointManager.js.map +1 -1
  139. package/lib/esm/ClassRegistry.js +5 -5
  140. package/lib/esm/ClassRegistry.js.map +1 -1
  141. package/lib/esm/CloudSqlite.js.map +1 -1
  142. package/lib/esm/CodeService.js.map +1 -1
  143. package/lib/esm/CodeSpecs.js.map +1 -1
  144. package/lib/esm/ConcurrentQuery.js.map +1 -1
  145. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  146. package/lib/esm/DevTools.js.map +1 -1
  147. package/lib/esm/DisplayStyle.js.map +1 -1
  148. package/lib/esm/ECDb.js.map +1 -1
  149. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  150. package/lib/esm/ECSqlStatement.js.map +1 -1
  151. package/lib/esm/Element.js.map +1 -1
  152. package/lib/esm/ElementAspect.js.map +1 -1
  153. package/lib/esm/ElementGraphics.js.map +1 -1
  154. package/lib/esm/ElementTreeWalker.js.map +1 -1
  155. package/lib/esm/Entity.js.map +1 -1
  156. package/lib/esm/EntityReferences.js.map +1 -1
  157. package/lib/esm/ExportGraphics.js.map +1 -1
  158. package/lib/esm/ExternalSource.js.map +1 -1
  159. package/lib/esm/FontFile.js.map +1 -1
  160. package/lib/esm/GeoCoordConfig.js.map +1 -1
  161. package/lib/esm/GeographicCRSServices.js.map +1 -1
  162. package/lib/esm/GeometrySummary.js +47 -47
  163. package/lib/esm/GeometrySummary.js.map +1 -1
  164. package/lib/esm/IModelDb.js +8 -8
  165. package/lib/esm/IModelDb.js.map +1 -1
  166. package/lib/esm/IModelDbFonts.js.map +1 -1
  167. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  168. package/lib/esm/IModelHost.js.map +1 -1
  169. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  170. package/lib/esm/IModelJsFs.js.map +1 -1
  171. package/lib/esm/ImageSourceConversion.js.map +1 -1
  172. package/lib/esm/IpcHost.js.map +1 -1
  173. package/lib/esm/LineStyle.js.map +1 -1
  174. package/lib/esm/LocalHub.js +1 -1
  175. package/lib/esm/LocalHub.js.map +1 -1
  176. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  177. package/lib/esm/LockControl.js.map +1 -1
  178. package/lib/esm/Material.js.map +1 -1
  179. package/lib/esm/Model.js.map +1 -1
  180. package/lib/esm/NativeAppStorage.js.map +1 -1
  181. package/lib/esm/NativeHost.js.map +1 -1
  182. package/lib/esm/NavigationRelationship.js.map +1 -1
  183. package/lib/esm/PromiseMemoizer.js.map +1 -1
  184. package/lib/esm/PropertyStore.js.map +1 -1
  185. package/lib/esm/Relationship.js.map +1 -1
  186. package/lib/esm/RpcBackend.js.map +1 -1
  187. package/lib/esm/SQLiteDb.js.map +1 -1
  188. package/lib/esm/Schema.js.map +1 -1
  189. package/lib/esm/SchemaSync.js.map +1 -1
  190. package/lib/esm/SchemaUtils.js.map +1 -1
  191. package/lib/esm/SheetIndex.js.map +1 -1
  192. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  193. package/lib/esm/SqliteStatement.js.map +1 -1
  194. package/lib/esm/StashManager.js.map +1 -1
  195. package/lib/esm/Texture.js.map +1 -1
  196. package/lib/esm/TileStorage.js.map +1 -1
  197. package/lib/esm/TxnManager.js.map +1 -1
  198. package/lib/esm/ViewDefinition.js.map +1 -1
  199. package/lib/esm/ViewStateHydrator.js.map +1 -1
  200. package/lib/esm/ViewStore.js.map +1 -1
  201. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  202. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  203. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  204. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  205. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  206. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  207. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  208. package/lib/esm/core-backend.js.map +1 -1
  209. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  210. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  211. package/lib/esm/domains/GenericElements.js.map +1 -1
  212. package/lib/esm/domains/GenericSchema.js.map +1 -1
  213. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  214. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  215. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  216. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  217. package/lib/esm/internal/HubMock.js.map +1 -1
  218. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  219. package/lib/esm/internal/NativePlatform.js.map +1 -1
  220. package/lib/esm/internal/NoLocks.js.map +1 -1
  221. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  222. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  223. package/lib/esm/internal/Symbols.js.map +1 -1
  224. package/lib/esm/internal/annotations/fields.js.map +1 -1
  225. package/lib/esm/internal/cross-package.js.map +1 -1
  226. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  227. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  228. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  229. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  230. package/lib/esm/rpc/multipart.js.map +1 -1
  231. package/lib/esm/rpc/tracing.js.map +1 -1
  232. package/lib/esm/rpc/web/logging.js.map +1 -1
  233. package/lib/esm/rpc/web/request.js.map +1 -1
  234. package/lib/esm/rpc/web/response.js.map +1 -1
  235. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  236. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  237. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  238. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  239. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  240. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  241. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  242. package/lib/esm/test/AttachDb.test.js +11 -11
  243. package/lib/esm/test/AttachDb.test.js.map +1 -1
  244. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  245. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  246. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  247. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  248. package/lib/esm/test/IModelHost.test.js.map +1 -1
  249. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  250. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  251. package/lib/esm/test/IpcHost.test.js.map +1 -1
  252. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  253. package/lib/esm/test/PrintElementTree.js.map +1 -1
  254. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  255. package/lib/esm/test/RevisionUtility.js.map +1 -1
  256. package/lib/esm/test/SchemaUtils.test.js +25 -25
  257. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  258. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  259. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  260. package/lib/esm/test/TestUtils.js.map +1 -1
  261. package/lib/esm/test/annotations/Fields.test.js +53 -53
  262. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  263. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  264. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  265. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  266. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  267. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  268. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  269. package/lib/esm/test/categories/Category.test.js.map +1 -1
  270. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  271. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  272. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  273. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
  274. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  275. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  276. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  277. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  278. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  279. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  280. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  281. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  282. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  283. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  284. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  285. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  286. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  287. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  288. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  289. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  290. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  291. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  292. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  293. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  294. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  295. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  296. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  297. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  298. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  299. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  300. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  301. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  302. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  303. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  304. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  305. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  306. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  307. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  308. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  309. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  310. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  311. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  312. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  313. package/lib/esm/test/hubaccess/Rebase.test.js +40 -40
  314. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  315. package/lib/esm/test/imageData.js.map +1 -1
  316. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  317. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  318. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  319. package/lib/esm/test/imodel/IModel.test.js +44 -44
  320. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  321. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  322. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  323. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  324. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  325. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
  326. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
  327. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  328. package/lib/esm/test/index.js.map +1 -1
  329. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  330. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  331. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  332. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  333. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  334. package/lib/esm/test/rpc/response.test.js.map +1 -1
  335. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  336. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  337. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  338. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  339. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  340. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  341. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  342. package/lib/esm/test/standalone/ChangesetReader.test.js +124 -124
  343. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  344. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  345. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  346. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  347. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  348. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  349. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  350. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  351. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  352. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  353. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  354. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  355. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  356. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  357. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  358. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  359. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  360. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  361. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  362. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  363. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  364. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  365. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  366. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  367. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  368. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  369. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  370. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  371. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  372. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  373. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  374. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  375. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  376. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  377. package/lib/esm/workspace/Settings.js.map +1 -1
  378. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  379. package/lib/esm/workspace/Workspace.js.map +1 -1
  380. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  381. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"ElementAspect.test.js","sourceRoot":"","sources":["../../../../src/test/element/ElementAspect.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,IAAI,EAAc,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAiD,MAAM,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClH,OAAO,EACI,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,GACpI,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAE7B,IAAI,MAAkB,CAAC;IAEvB,MAAM,CAAC,GAAG,EAAE;QACV,uKAAuK;QACvK,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,eAAe,CAAC,iBAAiB,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QACjG,MAAM,GAAG,eAAe,CAAC,sBAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,eAAe,CAAC,CAAC;QAElD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,2CAA2C,CAAC,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,2CAA2C,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,2MAA2M,CAAC,CAAC;QAEnP,qCAAqC;QACrC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,2CAA2C,CAAC,CAAC,CAAC,CAAC,CAAC;QAClI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,mBAAmB,YAAY,mBAAmB,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,aAAa,EAAE,2CAA2C,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,2MAA2M,CAAC,CAAC;QAE/P,2CAA2C;QAC3C,MAAM,QAAQ,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,YAAY,mBAAmB,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,2CAA2C,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,2MAA2M,CAAC,CAAC;QAEpP,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,uLAAuL,CAAC,CAAC;QAE/N,qCAAqC;QACrC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,mBAAmB,YAAY,mBAAmB,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,uLAAuL,CAAC,CAAC;QAE3O,2CAA2C;QAC3C,MAAM,QAAQ,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,YAAY,mBAAmB,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;QACzE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,uLAAuL,CAAC,CAAC;QAEhO,MAAM,aAAa,GAA0B,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACvH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;YAChH,uDAAuD;YACvD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;+MAC+J,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEjO,MAAM,aAAa,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC1H,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,kBAAkB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACpD,uDAAuD;YACvD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;8LAC8I,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEhN,qCAAqC;QACrC,MAAM,yBAAyB,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;QACtI,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,kBAAkB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACpD,uDAAuD;YACvD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAE;8LACkI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEhN,MAAM,aAAa,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;QACjH,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,kBAAkB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACpD,uDAAuD;YACvD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,kBAAkB,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;yLACyI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAE3M,MAAM,YAAY,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC/G,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAClI,uDAAuD;YACvD,MAAM,OAAO,GAAkB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;;;8LAG+I,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEhN,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC,MAAM,EAAE,2EAA2E,CAAC,CAAC;QACpL,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC,MAAM,EAAE,0EAA0E,CAAC,CAAC;QAClL,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;QAEnH,4IAA4I;QAC5I,6KAA6K;QAC7K,MAAM,UAAU,GAAG;;;;;+MAKwL,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEhO,MAAM,OAAO,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QACrG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;QAElD,MAAM,UAAU,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAY,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,eAAe,CAAC,CAAC;QAGlD,MAAM,WAAW,GAAU;YACzB,aAAa,EAAE,0CAA0C;YACzD,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAC3B,uBAAuB,EAAE,wBAAwB;SAClD,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAO,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QACjG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;;0MAEgK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5N,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAElC,IAAI,KAAK,GAAY,KAAK,CAAC;QAC3B,IAAI,UAAU,GAAW,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,UAAU,EAAE,CAAC;YACb,IAAI,MAAM,CAAC,KAAK,CAAC,uBAAuB,KAAK,WAAW,CAAC,uBAAuB,EAAE,CAAC;gBACjF,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErB,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,uBAAuB,GAAG,gCAAgC,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3D,MAAM,cAAc,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC1G,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,uBAAuB,EAAE,gCAAgC,CAAC,CAAC;QACzG,8BAA8B;QAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;;kNAEiK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,8BAA8B;QAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;8LACoJ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAClN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,OAAO,GAAY,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,OAAO,YAAY,eAAe,CAAC,CAAC;QAElD,MAAM,WAAW,GAAG;YAClB,aAAa,EAAE,2CAA2C;YAC1D,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAC3B,wBAAwB,EAAE,yBAAyB;SACpD,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,0MAA0M,CAAC,CAAC;QAElP,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,GAAG,iCAAiC,CAAC;QAC9E,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,cAAc,GAAoB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC1G,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,EAAE,iCAAiC,CAAC,CAAC;QAClG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,kNAAkN,CAAC,CAAC;QAEjQ,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;YACpF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAAC;QAChG,IAAI,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACnG,MAAM,SAAS,GAAe,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAC7H,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAE3C,MAAM,WAAW,GAA8B;YAC7C,aAAa,EAAE,oBAAoB,CAAC,aAAa;YACjD,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YAC1B,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE;YACnC,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,KAAK;SACf,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAoB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QACpG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,6RAA6R,CAAC,CAAC;QACrU,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;QACpI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,CAAC;QACzG,IAAI,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAC5G,MAAM,EAAE,GAAe,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;QACvH,MAAM,EAAE,GAAe,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAEvH,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC;QAEtB,MAAM,WAAW,GAA8B;YAC7C,aAAa,EAAE,oBAAoB,CAAC,aAAa;YACjD,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACnB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACjB,UAAU,EAAE,EAAE;YACd,IAAI;SACL,CAAC;QACF,MAAM,CAAC,GAA8B,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;QAClG,MAAM,EAAE,GAA8B,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;QACnG,MAAM,CAAC,GAA8B,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;QAClG,MAAM,CAAC,GAA8B,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;QAClG,MAAM,GAAG,GAA8B,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAEjH,MAAM,aAAa,GAAqC;YACtD,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YAC7B,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,oCAAoC;YACnE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,oBAAoB;YACpD,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YAC7B,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;SAChC,CAAC;QACF,MAAM,aAAa,GAAqC;YACtD,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,qCAAqC;YACpE,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;SAC9B,CAAC;QACF,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAE,SAAoC,EAAW,EAAE;YAC1F,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;mBAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;mBAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;mBACnF,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC;mBAClD,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;mBACtC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC;mBAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,IAAmB,EAAE,SAA2C,EAAW,EAAE;YAChG,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC;QACxE,CAAC,CAAC;QAEF,MAAM,SAAS,GAAoB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;;;;+PAImN,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAEjR,MAAM,SAAS,GAAoB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;gQACoN,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAElR,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACrG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;QAClG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,iCAAiC,CAAC,CAAC;QAExE,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAE5D,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,iBAAiB,CAAC,eAAe,EAAE,2BAA2B,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;QAE7K,MAAM,cAAc,GAAG,cAAc,CAAC;QAEtC,0BAA0B;QAC1B,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEpD,sDAAsD;QACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACvD,WAAW,EAAE,sBAAsB;YACnC,UAAU,EAAE,cAAc;SAC3B,CAAC,CAAC;QACH,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAEzE,4BAA4B;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,2BAA2B,EAAE,0CAA0C,CAAC,CAAC;QAE5G,gCAAgC;QAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAE,MAAc,CAAC,KAAK,EAAE,cAAc,EAAE,4CAA4C,CAAC,CAAC;QAElG,iDAAiD;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,iBAAiB,CAAC,0FAA0F,CAAC,CAAC;QACtI,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAErF,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,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\nimport { assert, expect } from \"chai\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { ElementAspectProps, ExternalSourceAspectProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport {\r\n Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, ExternalSourceAspect, PhysicalElement, SnapshotDb, SpatialCategory,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\ndescribe(\"ElementAspect\", () => {\r\n\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n // NOTE: see ElementAspectTests.PresentationRuleScenarios in DgnPlatform\\Tests\\DgnProject\\NonPublished\\ElementAspect_Test.cpp for how ElementAspectTest.bim was created\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"ElementAspectTest.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ElementAspectTest.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n iModel.close();\r\n });\r\n\r\n it(\"should be able to get aspects from test file\", () => {\r\n const element = iModel.elements.getElement(\"0x17\");\r\n assert.exists(element);\r\n assert.isTrue(element instanceof PhysicalElement);\r\n\r\n const aspect1: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestUniqueAspectNoHandler\")[0];\r\n assert.exists(aspect1);\r\n assert.isTrue(aspect1 instanceof ElementUniqueAspect);\r\n assert.equal(aspect1.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\r\n assert.equal(aspect1.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\r\n assert.equal(aspect1.asAny.length, 1);\r\n assert.equal(JSON.stringify(aspect1), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n // Test getAspects with dot separator\r\n const aspect1DotSeparator: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestUniqueAspectNoHandler\")[0];\r\n assert.exists(aspect1DotSeparator);\r\n assert.isTrue(aspect1DotSeparator instanceof ElementUniqueAspect);\r\n assert.equal(aspect1DotSeparator.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\r\n assert.equal(aspect1DotSeparator.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\r\n assert.equal(aspect1DotSeparator.asAny.length, 1);\r\n assert.equal(JSON.stringify(aspect1DotSeparator), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n // cross-check getAspects against getAspect\r\n const aspect1X: ElementAspect = iModel.elements.getAspect(aspect1.id);\r\n assert.exists(aspect1X);\r\n assert.isTrue(aspect1X instanceof ElementUniqueAspect);\r\n assert.equal(aspect1X.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\r\n assert.equal(aspect1X.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\r\n assert.equal(aspect1X.asAny.length, 1);\r\n assert.equal(JSON.stringify(aspect1X), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n const aspect2: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestUniqueAspect\")[0];\r\n assert.exists(aspect2);\r\n assert.isTrue(aspect2 instanceof ElementUniqueAspect);\r\n assert.equal(aspect2.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\r\n assert.equal(aspect2.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\r\n assert.isUndefined(aspect2.asAny.length);\r\n assert.equal(JSON.stringify(aspect2), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n // Test getAspects with dot separator\r\n const aspect2DotSeparator: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestUniqueAspect\")[0];\r\n assert.exists(aspect2DotSeparator);\r\n assert.isTrue(aspect2DotSeparator instanceof ElementUniqueAspect);\r\n assert.equal(aspect2DotSeparator.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\r\n assert.equal(aspect2DotSeparator.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\r\n assert.isUndefined(aspect2DotSeparator.asAny.length);\r\n assert.equal(JSON.stringify(aspect2DotSeparator), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n // cross-check getAspects against getAspect\r\n const aspect2X: ElementAspect = iModel.elements.getAspect(aspect2.id);\r\n assert.exists(aspect2X);\r\n assert.isTrue(aspect2X instanceof ElementUniqueAspect);\r\n assert.equal(aspect2X.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\r\n assert.equal(aspect2X.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\r\n assert.isUndefined(aspect2X.asAny.length);\r\n assert.equal(JSON.stringify(aspect2X), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\r\n\r\n const uniqueAspects: ElementUniqueAspect[] = iModel.elements.getAspects(element.id, ElementUniqueAspect.classFullName);\r\n assert.equal(uniqueAspects.length, 2);\r\n uniqueAspects.forEach((aspect) => {\r\n assert.isTrue(aspect.classFullName === aspect1.classFullName || aspect.classFullName === aspect2.classFullName);\r\n // cross-check against getting the aspects individually\r\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\r\n assert.exists(aspectX);\r\n assert.equal(aspectX.schemaName, aspect.schemaName);\r\n assert.equal(aspectX.className, aspect.className);\r\n });\r\n assert.equal(JSON.stringify(uniqueAspects), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const multiAspectsA: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestMultiAspectNoHandler\");\r\n assert.exists(multiAspectsA);\r\n assert.isArray(multiAspectsA);\r\n assert.equal(multiAspectsA.length, 2);\r\n multiAspectsA.forEach((aspect) => {\r\n assert.isTrue(aspect instanceof ElementMultiAspect);\r\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\r\n assert.equal(aspect.className, \"TestMultiAspectNoHandler\");\r\n assert.exists(aspect.asAny.testMultiAspectProperty);\r\n // cross-check against getting the aspects individually\r\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\r\n assert.exists(aspectX);\r\n assert.equal(aspectX.schemaName, aspect.schemaName);\r\n assert.equal(aspectX.className, aspect.className);\r\n assert.exists(aspectX.asAny.testMultiAspectProperty);\r\n assert.equal(aspectX.asAny.testMultiAspectProperty, aspect.asAny.testMultiAspectProperty);\r\n });\r\n assert.equal(JSON.stringify(multiAspectsA), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n // Test getAspects with dot separator\r\n const multiAspectsADotSeparator: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestMultiAspectNoHandler\");\r\n assert.exists(multiAspectsADotSeparator);\r\n assert.isArray(multiAspectsADotSeparator);\r\n assert.equal(multiAspectsADotSeparator.length, 2);\r\n multiAspectsADotSeparator.forEach((aspect) => {\r\n assert.isTrue(aspect instanceof ElementMultiAspect);\r\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\r\n assert.equal(aspect.className, \"TestMultiAspectNoHandler\");\r\n assert.exists(aspect.asAny.testMultiAspectProperty);\r\n // cross-check against getting the aspects individually\r\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\r\n assert.exists(aspectX);\r\n assert.equal(aspectX.schemaName, aspect.schemaName);\r\n assert.equal(aspectX.className, aspect.className);\r\n assert.exists(aspectX.asAny.testMultiAspectProperty);\r\n assert.equal(aspectX.asAny.testMultiAspectProperty, aspect.asAny.testMultiAspectProperty);\r\n });\r\n assert.equal(JSON.stringify(multiAspectsADotSeparator), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const multiAspectsB: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestMultiAspect\");\r\n assert.exists(multiAspectsB);\r\n assert.isArray(multiAspectsB);\r\n assert.equal(multiAspectsB.length, 2);\r\n multiAspectsB.forEach((aspect) => {\r\n assert.isTrue(aspect instanceof ElementMultiAspect);\r\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\r\n assert.equal(aspect.className, \"TestMultiAspect\");\r\n assert.exists(aspect.asAny.testMultiAspectProperty);\r\n // cross-check against getting the aspects individually\r\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\r\n assert.isTrue(aspectX instanceof ElementMultiAspect);\r\n assert.equal(aspectX.schemaName, \"DgnPlatformTest\");\r\n assert.equal(aspectX.className, \"TestMultiAspect\");\r\n assert.exists(aspectX.asAny.testMultiAspectProperty);\r\n });\r\n assert.equal(JSON.stringify(multiAspectsB), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const multiAspects: ElementAspect[] = iModel.elements.getAspects(element.id, ElementMultiAspect.classFullName);\r\n assert.equal(multiAspects.length, 4);\r\n multiAspects.forEach((aspect) => {\r\n assert.isTrue(aspect.classFullName === multiAspectsA[0].classFullName || aspect.classFullName === multiAspectsB[0].classFullName);\r\n // cross-check against getting the aspects individually\r\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\r\n assert.exists(aspectX);\r\n assert.equal(aspectX.schemaName, aspect.schemaName);\r\n assert.equal(aspectX.className, aspect.className);\r\n });\r\n assert.equal(JSON.stringify(multiAspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const rootSubject = iModel.elements.getRootSubject();\r\n assert.equal(0, iModel.elements.getAspects(rootSubject.id, \"DgnPlatformTest:TestUniqueAspect\").length, \"Don't expect DgnPlatformTest:TestUniqueAspect aspects on the root Subject\");\r\n assert.equal(0, iModel.elements.getAspects(rootSubject.id, \"DgnPlatformTest:TestMultiAspect\").length, \"Don't expect DgnPlatformTest:TestMultiAspect aspects on the root Subject\");\r\n assert.equal(0, iModel.elements.getAspects(rootSubject.id).length, \"Don't expect any aspects on the root Subject\");\r\n\r\n // The 'Element' property is introduced by ElementUniqueAspect and ElementMultiAspect, but is not available at the ElementAspect base class.\r\n // Since we're now using instance queries to query ElementUniqueAspect and ElementMultiAspect directly in getAspects(), we can provide ElementAspect to the function as well.\r\n const aspectList = `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`.replace(/\\s+/g, \"\");\r\n\r\n const aspects: ElementAspect[] = iModel.elements.getAspects(element.id, ElementAspect.classFullName);\r\n assert.equal(aspects.length, 6);\r\n assert.equal(JSON.stringify(aspects), aspectList);\r\n\r\n const allAspects: ElementAspect[] = iModel.elements.getAspects(element.id);\r\n assert.equal(allAspects.length, 6);\r\n assert.equal(JSON.stringify(allAspects), aspectList);\r\n });\r\n\r\n it(\"should be able to insert, update, and delete MultiAspects\", () => {\r\n const element: Element = iModel.elements.getElement(\"0x17\");\r\n assert.exists(element);\r\n assert.isTrue(element instanceof PhysicalElement);\r\n\r\n interface Props extends ElementAspectProps { testMultiAspectProperty: string }\r\n const aspectProps: Props = {\r\n classFullName: \"DgnPlatformTest:TestMultiAspectNoHandler\",\r\n element: { id: element.id },\r\n testMultiAspectProperty: \"MultiAspectInsertTest1\",\r\n };\r\n iModel.elements.insertAspect(aspectProps);\r\n let aspects: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.isAtLeast(aspects.length, 1);\r\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x21\",\"testMultiAspectProperty\":\"MultiAspectInsertTest1\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\r\n const numAspects = aspects.length;\r\n\r\n let found: boolean = false;\r\n let foundIndex: number = -1;\r\n for (const aspect of aspects) {\r\n foundIndex++;\r\n if (aspect.asAny.testMultiAspectProperty === aspectProps.testMultiAspectProperty) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n assert.isTrue(found);\r\n\r\n aspects[foundIndex].asAny.testMultiAspectProperty = \"MultiAspectInsertTest1-Updated\";\r\n iModel.elements.updateAspect(aspects[foundIndex].toJSON());\r\n\r\n const aspectsUpdated: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.equal(aspectsUpdated.length, aspects.length);\r\n assert.equal(aspectsUpdated[foundIndex].asAny.testMultiAspectProperty, \"MultiAspectInsertTest1-Updated\");\r\n // Check if aspect was updated\r\n assert.equal(JSON.stringify(aspectsUpdated), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x21\",\"testMultiAspectProperty\":\"MultiAspectInsertTest1-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n iModel.elements.deleteAspect(aspects[foundIndex].id);\r\n aspects = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.equal(numAspects, aspects.length + 1);\r\n // Check if aspect was deleted\r\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\r\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\r\n });\r\n\r\n it(\"should be able to insert, update, and delete UniqueAspects\", () => {\r\n const element: Element = iModel.elements.getElement(\"0x17\");\r\n assert.exists(element);\r\n assert.isTrue(element instanceof PhysicalElement);\r\n\r\n const aspectProps = {\r\n classFullName: \"DgnPlatformTest:TestUniqueAspectNoHandler\",\r\n element: { id: element.id },\r\n testUniqueAspectProperty: \"UniqueAspectInsertTest1\",\r\n };\r\n iModel.elements.insertAspect(aspectProps);\r\n const aspects: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.isTrue(aspects.length === 1);\r\n assert.equal(aspects[0].asAny.testUniqueAspectProperty, aspectProps.testUniqueAspectProperty);\r\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"UniqueAspectInsertTest1\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`);\r\n\r\n aspects[0].asAny.testUniqueAspectProperty = \"UniqueAspectInsertTest1-Updated\";\r\n iModel.elements.updateAspect(aspects[0].toJSON());\r\n const aspectsUpdated: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.equal(aspectsUpdated.length, 1);\r\n assert.equal(aspectsUpdated[0].asAny.testUniqueAspectProperty, \"UniqueAspectInsertTest1-Updated\");\r\n assert.equal(JSON.stringify(aspectsUpdated), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"UniqueAspectInsertTest1-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`);\r\n\r\n iModel.elements.deleteAspect(aspects[0].id);\r\n try {\r\n const noAspects = iModel.elements.getAspects(element.id, aspectProps.classFullName);\r\n assert.equal(noAspects.length, 0);\r\n assert.isTrue(false, \"Expected this line to be skipped\");\r\n } catch (error) {\r\n assert.isTrue(error instanceof Error);\r\n }\r\n });\r\n\r\n it(\"should be able to insert ExternalSourceAspects\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ExternalSourceAspect.bim\");\r\n let iModelDb = SnapshotDb.createEmpty(fileName, { rootSubject: { name: \"ExternalSourceAspect\" } });\r\n const elementId: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category\", new SubCategoryAppearance());\r\n assert.isTrue(Id64.isValidId64(elementId));\r\n\r\n const aspectProps: ExternalSourceAspectProps = {\r\n classFullName: ExternalSourceAspect.classFullName,\r\n element: { id: elementId },\r\n scope: { id: IModel.rootSubjectId },\r\n identifier: \"A\",\r\n kind: \"Letter\",\r\n checksum: \"1\",\r\n version: \"1.0\",\r\n };\r\n const aspect = new ExternalSourceAspect(aspectProps, iModelDb);\r\n expect(aspect).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\r\n iModelDb.elements.insertAspect(aspectProps);\r\n\r\n const aspectJson = aspect.toJSON();\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n iModelDb = SnapshotDb.openFile(fileName);\r\n\r\n const aspects: ElementAspect[] = iModelDb.elements.getAspects(elementId, aspectProps.classFullName);\r\n assert.equal(aspects.length, 1);\r\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x21\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"version\":\"1.0\",\"checksum\":\"1\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`);\r\n expect(aspects[0]).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\r\n\r\n expect(aspectJson).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\r\n\r\n assert(aspectProps.scope !== undefined);\r\n const foundAspects = ExternalSourceAspect.findAllBySource(iModelDb, aspectProps.scope.id, aspectProps.kind, aspectProps.identifier);\r\n assert.equal(foundAspects.length, 1);\r\n const foundAspect = foundAspects[0];\r\n assert.equal(foundAspect.aspectId, aspects[0].id);\r\n assert.equal(foundAspect.elementId, aspect.element.id);\r\n });\r\n\r\n it(\"should be able to insert multiple ExternalSourceAspects\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"MultipleElementAspects\", \"ExternalSourceAspect.bim\");\r\n let iModelDb = SnapshotDb.createEmpty(fileName, { rootSubject: { name: \"MultipleExternalSourceAspects\" } });\r\n const e1: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category1\", new SubCategoryAppearance());\r\n const e2: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category2\", new SubCategoryAppearance());\r\n\r\n const scopeId1 = IModel.rootSubjectId;\r\n const scopeId2 = e1;\r\n const kind = \"Letter\";\r\n const kind2 = \"Kind2\";\r\n\r\n const aspectProps: ExternalSourceAspectProps = {\r\n classFullName: ExternalSourceAspect.classFullName,\r\n element: { id: \"\" },\r\n scope: { id: \"\" },\r\n identifier: \"\",\r\n kind,\r\n };\r\n const a: ExternalSourceAspectProps = { ...aspectProps, identifier: \"A\", scope: { id: scopeId1 } };\r\n const a2: ExternalSourceAspectProps = { ...aspectProps, identifier: \"A\", scope: { id: scopeId2 } };\r\n const b: ExternalSourceAspectProps = { ...aspectProps, identifier: \"B\", scope: { id: scopeId1 } };\r\n const c: ExternalSourceAspectProps = { ...aspectProps, identifier: \"C\", scope: { id: scopeId1 } };\r\n const ck2: ExternalSourceAspectProps = { ...aspectProps, identifier: \"C\", scope: { id: scopeId1 }, kind: kind2 };\r\n\r\n const e1AspectProps: Array<ExternalSourceAspectProps> = [\r\n { ...a, element: { id: e1 } },\r\n { ...a, element: { id: e1 } }, // add a second aspect \"A\" in scope1\r\n { ...a2, element: { id: e1 } }, // add \"A\" in scope2\r\n { ...b, element: { id: e1 } },\r\n { ...ck2, element: { id: e1 } },\r\n ];\r\n const e2AspectProps: Array<ExternalSourceAspectProps> = [\r\n { ...a, element: { id: e2 } }, // element2 also has an \"A\" in scope1\r\n { ...c, element: { id: e2 } },\r\n ];\r\n e1AspectProps.forEach((aspect) => iModelDb.elements.insertAspect(aspect));\r\n e2AspectProps.forEach((aspect) => iModelDb.elements.insertAspect(aspect));\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n iModelDb = SnapshotDb.openFile(fileName);\r\n\r\n const equalProps = (aspect: ElementAspect, wantProps: ExternalSourceAspectProps): boolean => {\r\n return (aspect.element.id === wantProps.element.id)\r\n && (aspect.asAny.scope.id === wantProps.scope.id)\r\n && (aspect.asAny.scope.relClassName.endsWith(\"ElementScopesExternalSourceIdentifier\"))\r\n && (aspect.asAny.identifier === wantProps.identifier)\r\n && (aspect.asAny.kind === wantProps.kind)\r\n && (aspect.asAny.checksum === wantProps.checksum)\r\n && (aspect.asAny.version === wantProps.version);\r\n };\r\n const findInProps = (have: ElementAspect, wantArray: Array<ExternalSourceAspectProps>): boolean => {\r\n return wantArray.find((want) => equalProps(have, want)) !== undefined;\r\n };\r\n\r\n const e1Aspects: ElementAspect[] = iModelDb.elements.getAspects(e1, aspectProps.classFullName);\r\n assert.equal(e1Aspects.length, e1AspectProps.length);\r\n e1Aspects.forEach((x) => {\r\n assert.isTrue(findInProps(x, e1AspectProps));\r\n });\r\n assert.equal(JSON.stringify(e1Aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x21\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x22\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x23\",\"scope\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x24\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"B\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x25\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"C\",\"kind\":\"Kind2\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const e2Aspects: ElementAspect[] = iModelDb.elements.getAspects(e2, aspectProps.classFullName);\r\n assert.equal(e2Aspects.length, e2AspectProps.length);\r\n e2Aspects.forEach((x) => {\r\n assert.isTrue(findInProps(x, e2AspectProps));\r\n });\r\n assert.equal(JSON.stringify(e2Aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x26\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x13\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\r\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x27\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"C\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x13\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\r\n\r\n const allA = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"A\");\r\n assert.equal(allA.filter((x) => x.elementId === e1).length, 2, \"there are two A's in scope 1 on e1\");\r\n assert.equal(allA.filter((x) => x.elementId === e2).length, 1, \"there is one A in scope 1 on e2\");\r\n assert.equal(allA.length, 3);\r\n\r\n const allA2 = ExternalSourceAspect.findAllBySource(iModelDb, scopeId2, kind, \"A\");\r\n assert.equal(allA2.length, 1);\r\n assert.equal(allA2[0].elementId, e1, \"there is one A in scope 2 on e1\");\r\n\r\n const allB = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"B\");\r\n assert.equal(allB.length, 1);\r\n assert.equal(allB[0].elementId, e1, \"there is one B on e1\");\r\n\r\n const allC = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"C\");\r\n assert.equal(allC.length, 1);\r\n assert.equal(allC[0].elementId, e2, \"there is one C of kind1 on e2\");\r\n\r\n const allCK2 = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind2, \"C\");\r\n assert.equal(allCK2.length, 1);\r\n assert.equal(allCK2[0].elementId, e1, \"there is one C of kind 2 on e1\");\r\n\r\n assert.equal(ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"<notfound>\").length, 0);\r\n });\r\n\r\n it(\"should create ChannelRootAspect with correct relationship class\", async () => {\r\n const iModelDb = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ChannelRootAspectTest.bim\"), { rootSubject: { name: \"ChannelRootAspectTest\" } });\r\n\r\n const testChannelKey = \"test-channel\";\r\n\r\n // Enable the test channel\r\n iModelDb.channels.addAllowedChannel(testChannelKey);\r\n\r\n // Create a channel subject using insertChannelSubject\r\n const subjectId = iModelDb.channels.insertChannelSubject({\r\n subjectName: \"Test Channel Subject\",\r\n channelKey: testChannelKey,\r\n });\r\n iModelDb.saveChanges();\r\n assert.isTrue(Id64.isValidId64(subjectId), \"Subject ID should be valid\");\r\n\r\n // Get the ChannelRootAspect\r\n const aspects = iModelDb.elements.getAspects(subjectId, \"BisCore:ChannelRootAspect\");\r\n assert.equal(aspects.length, 1, \"Should be exactly one as it's a unique aspect\");\r\n\r\n const aspect = aspects[0];\r\n assert.exists(aspect);\r\n assert.equal(aspect.classFullName, \"BisCore:ChannelRootAspect\", \"Aspect class should be ChannelRootAspect\");\r\n\r\n // Verify the relationship class\r\n expect(aspect.element.relClassName).to.equal(\"BisCore.ElementOwnsChannelRootAspect\");\r\n assert.equal((aspect as any).owner, testChannelKey, \"Channel owner should match the channel key\");\r\n\r\n // Query the db to confirm the relationship class\r\n const reader = iModelDb.createQueryReader(\"select ec_classname(Element.RelECClassId) as relClassName from BisCore.ChannelRootAspect\");\r\n expect(await reader.step()).to.be.true;\r\n expect(reader.current.relClassName).to.equal(\"BisCore:ElementOwnsChannelRootAspect\");\r\n\r\n iModelDb.close();\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ElementAspect.test.js","sourceRoot":"","sources":["../../../../src/test/element/ElementAspect.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { ElementAspectProps, ExternalSourceAspectProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\nimport {\n Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, ExternalSourceAspect, PhysicalElement, SnapshotDb, SpatialCategory,\n} from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"ElementAspect\", () => {\n\n let iModel: SnapshotDb;\n\n before(() => {\n // NOTE: see ElementAspectTests.PresentationRuleScenarios in DgnPlatform\\Tests\\DgnProject\\NonPublished\\ElementAspect_Test.cpp for how ElementAspectTest.bim was created\n const seedFileName = IModelTestUtils.resolveAssetFile(\"ElementAspectTest.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ElementAspectTest.bim\");\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n iModel.close();\n });\n\n it(\"should be able to get aspects from test file\", () => {\n const element = iModel.elements.getElement(\"0x17\");\n assert.exists(element);\n assert.isTrue(element instanceof PhysicalElement);\n\n const aspect1: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestUniqueAspectNoHandler\")[0];\n assert.exists(aspect1);\n assert.isTrue(aspect1 instanceof ElementUniqueAspect);\n assert.equal(aspect1.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\n assert.equal(aspect1.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\n assert.equal(aspect1.asAny.length, 1);\n assert.equal(JSON.stringify(aspect1), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n // Test getAspects with dot separator\n const aspect1DotSeparator: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestUniqueAspectNoHandler\")[0];\n assert.exists(aspect1DotSeparator);\n assert.isTrue(aspect1DotSeparator instanceof ElementUniqueAspect);\n assert.equal(aspect1DotSeparator.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\n assert.equal(aspect1DotSeparator.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\n assert.equal(aspect1DotSeparator.asAny.length, 1);\n assert.equal(JSON.stringify(aspect1DotSeparator), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n // cross-check getAspects against getAspect\n const aspect1X: ElementAspect = iModel.elements.getAspect(aspect1.id);\n assert.exists(aspect1X);\n assert.isTrue(aspect1X instanceof ElementUniqueAspect);\n assert.equal(aspect1X.classFullName, \"DgnPlatformTest:TestUniqueAspectNoHandler\");\n assert.equal(aspect1X.asAny.testUniqueAspectProperty, \"Aspect1-Updated\");\n assert.equal(aspect1X.asAny.length, 1);\n assert.equal(JSON.stringify(aspect1X), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n const aspect2: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestUniqueAspect\")[0];\n assert.exists(aspect2);\n assert.isTrue(aspect2 instanceof ElementUniqueAspect);\n assert.equal(aspect2.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\n assert.equal(aspect2.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\n assert.isUndefined(aspect2.asAny.length);\n assert.equal(JSON.stringify(aspect2), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n // Test getAspects with dot separator\n const aspect2DotSeparator: ElementAspect = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestUniqueAspect\")[0];\n assert.exists(aspect2DotSeparator);\n assert.isTrue(aspect2DotSeparator instanceof ElementUniqueAspect);\n assert.equal(aspect2DotSeparator.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\n assert.equal(aspect2DotSeparator.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\n assert.isUndefined(aspect2DotSeparator.asAny.length);\n assert.equal(JSON.stringify(aspect2DotSeparator), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n // cross-check getAspects against getAspect\n const aspect2X: ElementAspect = iModel.elements.getAspect(aspect2.id);\n assert.exists(aspect2X);\n assert.isTrue(aspect2X instanceof ElementUniqueAspect);\n assert.equal(aspect2X.classFullName, \"DgnPlatformTest:TestUniqueAspect\");\n assert.equal(aspect2X.asAny.testUniqueAspectProperty, \"Aspect2-Updated\");\n assert.isUndefined(aspect2X.asAny.length);\n assert.equal(JSON.stringify(aspect2X), `{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}`);\n\n const uniqueAspects: ElementUniqueAspect[] = iModel.elements.getAspects(element.id, ElementUniqueAspect.classFullName);\n assert.equal(uniqueAspects.length, 2);\n uniqueAspects.forEach((aspect) => {\n assert.isTrue(aspect.classFullName === aspect1.classFullName || aspect.classFullName === aspect2.classFullName);\n // cross-check against getting the aspects individually\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\n assert.exists(aspectX);\n assert.equal(aspectX.schemaName, aspect.schemaName);\n assert.equal(aspectX.className, aspect.className);\n });\n assert.equal(JSON.stringify(uniqueAspects), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}},\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`.replace(/\\s+/g, \"\"));\n\n const multiAspectsA: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestMultiAspectNoHandler\");\n assert.exists(multiAspectsA);\n assert.isArray(multiAspectsA);\n assert.equal(multiAspectsA.length, 2);\n multiAspectsA.forEach((aspect) => {\n assert.isTrue(aspect instanceof ElementMultiAspect);\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\n assert.equal(aspect.className, \"TestMultiAspectNoHandler\");\n assert.exists(aspect.asAny.testMultiAspectProperty);\n // cross-check against getting the aspects individually\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\n assert.exists(aspectX);\n assert.equal(aspectX.schemaName, aspect.schemaName);\n assert.equal(aspectX.className, aspect.className);\n assert.exists(aspectX.asAny.testMultiAspectProperty);\n assert.equal(aspectX.asAny.testMultiAspectProperty, aspect.asAny.testMultiAspectProperty);\n });\n assert.equal(JSON.stringify(multiAspectsA), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\n\n // Test getAspects with dot separator\n const multiAspectsADotSeparator: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest.TestMultiAspectNoHandler\");\n assert.exists(multiAspectsADotSeparator);\n assert.isArray(multiAspectsADotSeparator);\n assert.equal(multiAspectsADotSeparator.length, 2);\n multiAspectsADotSeparator.forEach((aspect) => {\n assert.isTrue(aspect instanceof ElementMultiAspect);\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\n assert.equal(aspect.className, \"TestMultiAspectNoHandler\");\n assert.exists(aspect.asAny.testMultiAspectProperty);\n // cross-check against getting the aspects individually\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\n assert.exists(aspectX);\n assert.equal(aspectX.schemaName, aspect.schemaName);\n assert.equal(aspectX.className, aspect.className);\n assert.exists(aspectX.asAny.testMultiAspectProperty);\n assert.equal(aspectX.asAny.testMultiAspectProperty, aspect.asAny.testMultiAspectProperty);\n });\n assert.equal(JSON.stringify(multiAspectsADotSeparator), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\n\n const multiAspectsB: ElementAspect[] = iModel.elements.getAspects(element.id, \"DgnPlatformTest:TestMultiAspect\");\n assert.exists(multiAspectsB);\n assert.isArray(multiAspectsB);\n assert.equal(multiAspectsB.length, 2);\n multiAspectsB.forEach((aspect) => {\n assert.isTrue(aspect instanceof ElementMultiAspect);\n assert.equal(aspect.schemaName, \"DgnPlatformTest\");\n assert.equal(aspect.className, \"TestMultiAspect\");\n assert.exists(aspect.asAny.testMultiAspectProperty);\n // cross-check against getting the aspects individually\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\n assert.isTrue(aspectX instanceof ElementMultiAspect);\n assert.equal(aspectX.schemaName, \"DgnPlatformTest\");\n assert.equal(aspectX.className, \"TestMultiAspect\");\n assert.exists(aspectX.asAny.testMultiAspectProperty);\n });\n assert.equal(JSON.stringify(multiAspectsB), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\n\n const multiAspects: ElementAspect[] = iModel.elements.getAspects(element.id, ElementMultiAspect.classFullName);\n assert.equal(multiAspects.length, 4);\n multiAspects.forEach((aspect) => {\n assert.isTrue(aspect.classFullName === multiAspectsA[0].classFullName || aspect.classFullName === multiAspectsB[0].classFullName);\n // cross-check against getting the aspects individually\n const aspectX: ElementAspect = iModel.elements.getAspect(aspect.id);\n assert.exists(aspectX);\n assert.equal(aspectX.schemaName, aspect.schemaName);\n assert.equal(aspectX.className, aspect.className);\n });\n assert.equal(JSON.stringify(multiAspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\n\n const rootSubject = iModel.elements.getRootSubject();\n assert.equal(0, iModel.elements.getAspects(rootSubject.id, \"DgnPlatformTest:TestUniqueAspect\").length, \"Don't expect DgnPlatformTest:TestUniqueAspect aspects on the root Subject\");\n assert.equal(0, iModel.elements.getAspects(rootSubject.id, \"DgnPlatformTest:TestMultiAspect\").length, \"Don't expect DgnPlatformTest:TestMultiAspect aspects on the root Subject\");\n assert.equal(0, iModel.elements.getAspects(rootSubject.id).length, \"Don't expect any aspects on the root Subject\");\n\n // The 'Element' property is introduced by ElementUniqueAspect and ElementMultiAspect, but is not available at the ElementAspect base class.\n // Since we're now using instance queries to query ElementUniqueAspect and ElementMultiAspect directly in getAspects(), we can provide ElementAspect to the function as well.\n const aspectList = `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x2\",\"testMultiAspectProperty\":\"Aspect5-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspect\",\"id\":\"0x3\",\"testMultiAspectProperty\":\"Aspect6-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspect\",\"id\":\"0x1\",\"testUniqueAspectProperty\":\"Aspect2-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}},\n {\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"Aspect1-Updated\",\"length\":1,\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`.replace(/\\s+/g, \"\");\n\n const aspects: ElementAspect[] = iModel.elements.getAspects(element.id, ElementAspect.classFullName);\n assert.equal(aspects.length, 6);\n assert.equal(JSON.stringify(aspects), aspectList);\n\n const allAspects: ElementAspect[] = iModel.elements.getAspects(element.id);\n assert.equal(allAspects.length, 6);\n assert.equal(JSON.stringify(allAspects), aspectList);\n });\n\n it(\"should be able to insert, update, and delete MultiAspects\", () => {\n const element: Element = iModel.elements.getElement(\"0x17\");\n assert.exists(element);\n assert.isTrue(element instanceof PhysicalElement);\n\n interface Props extends ElementAspectProps { testMultiAspectProperty: string }\n const aspectProps: Props = {\n classFullName: \"DgnPlatformTest:TestMultiAspectNoHandler\",\n element: { id: element.id },\n testMultiAspectProperty: \"MultiAspectInsertTest1\",\n };\n iModel.elements.insertAspect(aspectProps);\n let aspects: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.isAtLeast(aspects.length, 1);\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x21\",\"testMultiAspectProperty\":\"MultiAspectInsertTest1\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\n const numAspects = aspects.length;\n\n let found: boolean = false;\n let foundIndex: number = -1;\n for (const aspect of aspects) {\n foundIndex++;\n if (aspect.asAny.testMultiAspectProperty === aspectProps.testMultiAspectProperty) {\n found = true;\n break;\n }\n }\n assert.isTrue(found);\n\n aspects[foundIndex].asAny.testMultiAspectProperty = \"MultiAspectInsertTest1-Updated\";\n iModel.elements.updateAspect(aspects[foundIndex].toJSON());\n\n const aspectsUpdated: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.equal(aspectsUpdated.length, aspects.length);\n assert.equal(aspectsUpdated[foundIndex].asAny.testMultiAspectProperty, \"MultiAspectInsertTest1-Updated\");\n // Check if aspect was updated\n assert.equal(JSON.stringify(aspectsUpdated), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x21\",\"testMultiAspectProperty\":\"MultiAspectInsertTest1-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\n\n iModel.elements.deleteAspect(aspects[foundIndex].id);\n aspects = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.equal(numAspects, aspects.length + 1);\n // Check if aspect was deleted\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x4\",\"testMultiAspectProperty\":\"Aspect3-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}},\n {\"classFullName\":\"DgnPlatformTest:TestMultiAspectNoHandler\",\"id\":\"0x5\",\"testMultiAspectProperty\":\"Aspect4-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"DgnPlatformTest.TestElement\"}}]`.replace(/\\s+/g, \"\"));\n });\n\n it(\"should be able to insert, update, and delete UniqueAspects\", () => {\n const element: Element = iModel.elements.getElement(\"0x17\");\n assert.exists(element);\n assert.isTrue(element instanceof PhysicalElement);\n\n const aspectProps = {\n classFullName: \"DgnPlatformTest:TestUniqueAspectNoHandler\",\n element: { id: element.id },\n testUniqueAspectProperty: \"UniqueAspectInsertTest1\",\n };\n iModel.elements.insertAspect(aspectProps);\n const aspects: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.isTrue(aspects.length === 1);\n assert.equal(aspects[0].asAny.testUniqueAspectProperty, aspectProps.testUniqueAspectProperty);\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"UniqueAspectInsertTest1\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`);\n\n aspects[0].asAny.testUniqueAspectProperty = \"UniqueAspectInsertTest1-Updated\";\n iModel.elements.updateAspect(aspects[0].toJSON());\n const aspectsUpdated: ElementAspect[] = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.equal(aspectsUpdated.length, 1);\n assert.equal(aspectsUpdated[0].asAny.testUniqueAspectProperty, \"UniqueAspectInsertTest1-Updated\");\n assert.equal(JSON.stringify(aspectsUpdated), `[{\"classFullName\":\"DgnPlatformTest:TestUniqueAspectNoHandler\",\"id\":\"0x6\",\"testUniqueAspectProperty\":\"UniqueAspectInsertTest1-Updated\",\"element\":{\"id\":\"0x17\",\"relClassName\":\"BisCore.ElementOwnsUniqueAspect\"}}]`);\n\n iModel.elements.deleteAspect(aspects[0].id);\n try {\n const noAspects = iModel.elements.getAspects(element.id, aspectProps.classFullName);\n assert.equal(noAspects.length, 0);\n assert.isTrue(false, \"Expected this line to be skipped\");\n } catch (error) {\n assert.isTrue(error instanceof Error);\n }\n });\n\n it(\"should be able to insert ExternalSourceAspects\", () => {\n const fileName = IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ExternalSourceAspect.bim\");\n let iModelDb = SnapshotDb.createEmpty(fileName, { rootSubject: { name: \"ExternalSourceAspect\" } });\n const elementId: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category\", new SubCategoryAppearance());\n assert.isTrue(Id64.isValidId64(elementId));\n\n const aspectProps: ExternalSourceAspectProps = {\n classFullName: ExternalSourceAspect.classFullName,\n element: { id: elementId },\n scope: { id: IModel.rootSubjectId },\n identifier: \"A\",\n kind: \"Letter\",\n checksum: \"1\",\n version: \"1.0\",\n };\n const aspect = new ExternalSourceAspect(aspectProps, iModelDb);\n expect(aspect).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\n iModelDb.elements.insertAspect(aspectProps);\n\n const aspectJson = aspect.toJSON();\n iModelDb.saveChanges();\n iModelDb.close();\n iModelDb = SnapshotDb.openFile(fileName);\n\n const aspects: ElementAspect[] = iModelDb.elements.getAspects(elementId, aspectProps.classFullName);\n assert.equal(aspects.length, 1);\n assert.equal(JSON.stringify(aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x21\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"version\":\"1.0\",\"checksum\":\"1\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`);\n expect(aspects[0]).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\n\n expect(aspectJson).to.deep.subsetEqual(aspectProps, { normalizeClassNameProps: true });\n\n assert(aspectProps.scope !== undefined);\n const foundAspects = ExternalSourceAspect.findAllBySource(iModelDb, aspectProps.scope.id, aspectProps.kind, aspectProps.identifier);\n assert.equal(foundAspects.length, 1);\n const foundAspect = foundAspects[0];\n assert.equal(foundAspect.aspectId, aspects[0].id);\n assert.equal(foundAspect.elementId, aspect.element.id);\n });\n\n it(\"should be able to insert multiple ExternalSourceAspects\", () => {\n const fileName = IModelTestUtils.prepareOutputFile(\"MultipleElementAspects\", \"ExternalSourceAspect.bim\");\n let iModelDb = SnapshotDb.createEmpty(fileName, { rootSubject: { name: \"MultipleExternalSourceAspects\" } });\n const e1: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category1\", new SubCategoryAppearance());\n const e2: Id64String = SpatialCategory.insert(iModelDb, IModel.dictionaryId, \"Category2\", new SubCategoryAppearance());\n\n const scopeId1 = IModel.rootSubjectId;\n const scopeId2 = e1;\n const kind = \"Letter\";\n const kind2 = \"Kind2\";\n\n const aspectProps: ExternalSourceAspectProps = {\n classFullName: ExternalSourceAspect.classFullName,\n element: { id: \"\" },\n scope: { id: \"\" },\n identifier: \"\",\n kind,\n };\n const a: ExternalSourceAspectProps = { ...aspectProps, identifier: \"A\", scope: { id: scopeId1 } };\n const a2: ExternalSourceAspectProps = { ...aspectProps, identifier: \"A\", scope: { id: scopeId2 } };\n const b: ExternalSourceAspectProps = { ...aspectProps, identifier: \"B\", scope: { id: scopeId1 } };\n const c: ExternalSourceAspectProps = { ...aspectProps, identifier: \"C\", scope: { id: scopeId1 } };\n const ck2: ExternalSourceAspectProps = { ...aspectProps, identifier: \"C\", scope: { id: scopeId1 }, kind: kind2 };\n\n const e1AspectProps: Array<ExternalSourceAspectProps> = [\n { ...a, element: { id: e1 } },\n { ...a, element: { id: e1 } }, // add a second aspect \"A\" in scope1\n { ...a2, element: { id: e1 } }, // add \"A\" in scope2\n { ...b, element: { id: e1 } },\n { ...ck2, element: { id: e1 } },\n ];\n const e2AspectProps: Array<ExternalSourceAspectProps> = [\n { ...a, element: { id: e2 } }, // element2 also has an \"A\" in scope1\n { ...c, element: { id: e2 } },\n ];\n e1AspectProps.forEach((aspect) => iModelDb.elements.insertAspect(aspect));\n e2AspectProps.forEach((aspect) => iModelDb.elements.insertAspect(aspect));\n iModelDb.saveChanges();\n iModelDb.close();\n iModelDb = SnapshotDb.openFile(fileName);\n\n const equalProps = (aspect: ElementAspect, wantProps: ExternalSourceAspectProps): boolean => {\n return (aspect.element.id === wantProps.element.id)\n && (aspect.asAny.scope.id === wantProps.scope.id)\n && (aspect.asAny.scope.relClassName.endsWith(\"ElementScopesExternalSourceIdentifier\"))\n && (aspect.asAny.identifier === wantProps.identifier)\n && (aspect.asAny.kind === wantProps.kind)\n && (aspect.asAny.checksum === wantProps.checksum)\n && (aspect.asAny.version === wantProps.version);\n };\n const findInProps = (have: ElementAspect, wantArray: Array<ExternalSourceAspectProps>): boolean => {\n return wantArray.find((want) => equalProps(have, want)) !== undefined;\n };\n\n const e1Aspects: ElementAspect[] = iModelDb.elements.getAspects(e1, aspectProps.classFullName);\n assert.equal(e1Aspects.length, e1AspectProps.length);\n e1Aspects.forEach((x) => {\n assert.isTrue(findInProps(x, e1AspectProps));\n });\n assert.equal(JSON.stringify(e1Aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x21\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x22\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x23\",\"scope\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x24\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"B\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x25\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"C\",\"kind\":\"Kind2\",\"element\":{\"id\":\"0x11\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\n\n const e2Aspects: ElementAspect[] = iModelDb.elements.getAspects(e2, aspectProps.classFullName);\n assert.equal(e2Aspects.length, e2AspectProps.length);\n e2Aspects.forEach((x) => {\n assert.isTrue(findInProps(x, e2AspectProps));\n });\n assert.equal(JSON.stringify(e2Aspects), `[{\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x26\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"A\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x13\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}},\n {\"classFullName\":\"BisCore:ExternalSourceAspect\",\"id\":\"0x27\",\"scope\":{\"id\":\"0x1\",\"relClassName\":\"BisCore.ElementScopesExternalSourceIdentifier\"},\"identifier\":\"C\",\"kind\":\"Letter\",\"element\":{\"id\":\"0x13\",\"relClassName\":\"BisCore.ElementOwnsMultiAspects\"}}]`.replace(/\\s+/g, \"\"));\n\n const allA = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"A\");\n assert.equal(allA.filter((x) => x.elementId === e1).length, 2, \"there are two A's in scope 1 on e1\");\n assert.equal(allA.filter((x) => x.elementId === e2).length, 1, \"there is one A in scope 1 on e2\");\n assert.equal(allA.length, 3);\n\n const allA2 = ExternalSourceAspect.findAllBySource(iModelDb, scopeId2, kind, \"A\");\n assert.equal(allA2.length, 1);\n assert.equal(allA2[0].elementId, e1, \"there is one A in scope 2 on e1\");\n\n const allB = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"B\");\n assert.equal(allB.length, 1);\n assert.equal(allB[0].elementId, e1, \"there is one B on e1\");\n\n const allC = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"C\");\n assert.equal(allC.length, 1);\n assert.equal(allC[0].elementId, e2, \"there is one C of kind1 on e2\");\n\n const allCK2 = ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind2, \"C\");\n assert.equal(allCK2.length, 1);\n assert.equal(allCK2[0].elementId, e1, \"there is one C of kind 2 on e1\");\n\n assert.equal(ExternalSourceAspect.findAllBySource(iModelDb, scopeId1, kind, \"<notfound>\").length, 0);\n });\n\n it(\"should create ChannelRootAspect with correct relationship class\", async () => {\n const iModelDb = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"ElementAspect\", \"ChannelRootAspectTest.bim\"), { rootSubject: { name: \"ChannelRootAspectTest\" } });\n\n const testChannelKey = \"test-channel\";\n\n // Enable the test channel\n iModelDb.channels.addAllowedChannel(testChannelKey);\n\n // Create a channel subject using insertChannelSubject\n const subjectId = iModelDb.channels.insertChannelSubject({\n subjectName: \"Test Channel Subject\",\n channelKey: testChannelKey,\n });\n iModelDb.saveChanges();\n assert.isTrue(Id64.isValidId64(subjectId), \"Subject ID should be valid\");\n\n // Get the ChannelRootAspect\n const aspects = iModelDb.elements.getAspects(subjectId, \"BisCore:ChannelRootAspect\");\n assert.equal(aspects.length, 1, \"Should be exactly one as it's a unique aspect\");\n\n const aspect = aspects[0];\n assert.exists(aspect);\n assert.equal(aspect.classFullName, \"BisCore:ChannelRootAspect\", \"Aspect class should be ChannelRootAspect\");\n\n // Verify the relationship class\n expect(aspect.element.relClassName).to.equal(\"BisCore.ElementOwnsChannelRootAspect\");\n assert.equal((aspect as any).owner, testChannelKey, \"Channel owner should match the channel key\");\n\n // Query the db to confirm the relationship class\n const reader = iModelDb.createQueryReader(\"select ec_classname(Element.RelECClassId) as relClassName from BisCore.ChannelRootAspect\");\n expect(await reader.step()).to.be.true;\n expect(reader.current.relClassName).to.equal(\"BisCore:ElementOwnsChannelRootAspect\");\n\n iModelDb.close();\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ElementDependencyGraph.test.js","sourceRoot":"","sources":["../../../../src/test/element/ElementDependencyGraph.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/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\nimport { assert } from \"chai\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport { Guid, Id64Array, Id64String, Logger, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n CodeScopeSpec, CodeSpec, ColorByName, DomainOptions, GeometryStreamBuilder, IModel, RelatedElementProps, RelationshipProps, SubCategoryAppearance,\r\n UpgradeOptions,\r\n} from \"@itwin/core-common\";\r\nimport { LineSegment3d, Point3d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { _nativeDb, ChannelControl, ElementDrivesElementProps, IModelJsFs, PhysicalModel, SpatialCategory, StandaloneDb } from \"../../core-backend\";\r\nimport { IModelTestUtils, TestElementDrivesElement, TestPhysicalObject, TestPhysicalObjectProps } from \"../IModelTestUtils\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\n\r\nexport function copyFile(newName: string, pathToCopy: string): string {\r\n const newPath = path.join(path.dirname(pathToCopy), newName);\r\n try {\r\n fs.unlinkSync(newPath);\r\n } catch {\r\n }\r\n fs.copyFileSync(pathToCopy, newPath);\r\n return newPath;\r\n}\r\n\r\nfunction assertRels(list: RelationshipProps[], rels: ElementDrivesElementProps[]) {\r\n assert.equal(list.length, rels.length);\r\n for (let i = 0; i < rels.length; ++i) {\r\n assert.equal(list[i].id, rels[i].id);\r\n }\r\n}\r\n\r\nclass DependencyCallbackResults {\r\n public beforeOutputs: Id64Array = [];\r\n public allInputsHandled: Id64Array = [];\r\n public rootChanged: RelationshipProps[] = [];\r\n public deletedDependency: RelationshipProps[] = [];\r\n}\r\n\r\ninterface DbInfo {\r\n seedFileName: string;\r\n codeSpecId: Id64String;\r\n physicalModelId: Id64String;\r\n spatialCategoryId: Id64String;\r\n}\r\n\r\nclass TestHelper {\r\n public db: StandaloneDb;\r\n public dres = new DependencyCallbackResults();\r\n private removals: VoidFunction[] = [];\r\n private codeSpecId: Id64String = \"\";\r\n private physicalModelId: Id64String = \"\";\r\n private spatialCategoryid: Id64String = \"\";\r\n\r\n constructor(testName: string, dbInfo: DbInfo) {\r\n this.codeSpecId = dbInfo.codeSpecId;\r\n this.physicalModelId = dbInfo.physicalModelId;\r\n this.spatialCategoryid = dbInfo.spatialCategoryId;\r\n\r\n const writeDbFileName = copyFile(`${testName}.bim`, dbInfo.seedFileName);\r\n this.db = StandaloneDb.openFile(writeDbFileName, OpenMode.ReadWrite);\r\n assert.isTrue(this.db !== undefined);\r\n this.db.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n this.db[_nativeDb].enableTxnTesting();\r\n assert.equal(this.db[_nativeDb].addChildPropagatesChangesToParentRelationship(\"TestBim\", \"ChildPropagatesChangesToParent\"), 0);\r\n this.setElementDependencyGraphCallbacks();\r\n }\r\n\r\n public terminate() {\r\n this.db.close();\r\n assert.isFalse(this.db.isOpen);\r\n this.removeElementDependencyGraphCallbacks();\r\n }\r\n\r\n public makeElement(codeValue: string, parent?: RelatedElementProps): TestPhysicalObjectProps {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(5, 0, 0)));\r\n\r\n return {\r\n classFullName: \"TestBim:TestPhysicalObject\",\r\n model: this.physicalModelId,\r\n category: this.spatialCategoryid,\r\n code: { spec: this.codeSpecId, scope: this.physicalModelId, value: codeValue },\r\n intProperty: 100,\r\n placement: {\r\n origin: new Point3d(0, 0, 0),\r\n angles: new YawPitchRollAngles(),\r\n },\r\n geom: builder.geometryStream,\r\n parent,\r\n };\r\n }\r\n\r\n public insertElement(codeValue: string, parent?: RelatedElementProps): Id64String {\r\n return this.db.elements.insertElement(this.makeElement(codeValue, parent));\r\n }\r\n\r\n public updateElement(elid: Id64String, newLabel: string) {\r\n const ed2 = this.db.elements.getElement({ id: elid });\r\n ed2.userLabel = newLabel;\r\n this.db.elements.updateElement(ed2.toJSON());\r\n }\r\n\r\n public fmtElem(elId: Id64String) { return this.db.elements.getElement(elId).code.value; }\r\n public fmtRel(props: RelationshipProps) { return `${props.classFullName} ${this.fmtElem(props.sourceId)} --> ${this.fmtElem(props.targetId)}`; }\r\n\r\n public resetDependencyResults() {\r\n this.dres = new DependencyCallbackResults();\r\n }\r\n\r\n public setElementDependencyGraphCallbacks() {\r\n this.removals.push(TestElementDrivesElement.deletedDependency.addListener((evProps) => {\r\n Logger.logTrace(\"EDGTest\", `_onDeletedDependency ${this.fmtRel(evProps)}`);\r\n this.dres.deletedDependency.push(evProps);\r\n }));\r\n this.removals.push(TestElementDrivesElement.rootChanged.addListener((evProps, _im) => {\r\n Logger.logTrace(\"EDGTest\", `_onRootChanged ${this.fmtRel(evProps)}`);\r\n this.dres.rootChanged.push(evProps);\r\n }));\r\n this.removals.push(TestPhysicalObject.beforeOutputsHandled.addListener((elId) => {\r\n Logger.logTrace(\"EDGTest\", `_onBeforeOutputsHandled ${this.fmtElem(elId)}`);\r\n this.dres.beforeOutputs.push(elId);\r\n }));\r\n this.removals.push(TestPhysicalObject.allInputsHandled.addListener((elId) => {\r\n Logger.logTrace(\"EDGTest\", `_onAllInputsHandled ${this.fmtElem(elId)}`);\r\n this.dres.allInputsHandled.push(elId);\r\n }));\r\n }\r\n\r\n public removeElementDependencyGraphCallbacks() {\r\n this.removals.forEach((drop) => drop());\r\n }\r\n}\r\n\r\ndescribe(\"ElementDependencyGraph\", () => {\r\n let testFileName: string;\r\n let dbInfo: DbInfo;\r\n\r\n const performUpgrade = (pathname: string) => {\r\n const nativeDb = new IModelNative.platform.DgnDb();\r\n const upgradeOptions: UpgradeOptions = {\r\n domain: DomainOptions.Upgrade,\r\n schemaLockHeld: true,\r\n };\r\n nativeDb.openIModel(pathname, OpenMode.ReadWrite, upgradeOptions);\r\n nativeDb.deleteAllTxns();\r\n nativeDb.closeFile();\r\n };\r\n\r\n before(async () => {\r\n IModelTestUtils.registerTestBimSchema();\r\n // make a unique name for the output file so this test can be run in parallel\r\n testFileName = IModelTestUtils.prepareOutputFile(\"ElementDependencyGraph\", `${Guid.createValue()}.bim`);\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const schemaFileName = IModelTestUtils.resolveAssetFile(\"TestBim.ecschema.xml\");\r\n IModelJsFs.copySync(seedFileName, testFileName);\r\n performUpgrade(testFileName);\r\n const imodel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\r\n await imodel.importSchemas([schemaFileName]); // will throw an exception if import fails\r\n imodel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const physicalModelId = PhysicalModel.insert(imodel, IModel.rootSubjectId, \"EDGTestModel\");\r\n const codeSpecId = imodel.codeSpecs.insert(CodeSpec.create(imodel, \"EDGTestCodeSpec\", CodeScopeSpec.Type.Model));\r\n const spatialCategoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, \"EDGTestSpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\r\n dbInfo = { physicalModelId, codeSpecId, spatialCategoryId, seedFileName: testFileName };\r\n imodel.saveChanges(\"\");\r\n imodel[_nativeDb].deleteAllTxns();\r\n imodel.close();\r\n });\r\n\r\n after(() => {\r\n IModelJsFs.removeSync(testFileName);\r\n });\r\n\r\n it(\"should invokeCallbacks EDE only\", () => {\r\n const helper = new TestHelper(\"EDE\", dbInfo);\r\n\r\n const e1id = helper.insertElement(\"e1\");\r\n const e2id = helper.insertElement(\"e2\");\r\n const e3id = helper.insertElement(\"e3\");\r\n helper.db.saveChanges(); // get the elements into the iModel\r\n\r\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\r\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\r\n for (const ede of [ede_1_2, ede_2_3]) {\r\n ede.insert();\r\n }\r\n\r\n // The full graph:\r\n // e1 --> e2 --> e3\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges(); // this will react to EDE inserts only.\r\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\r\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON()]); // we send out this callback even if only the relationship itself is new or changed.\r\n\r\n helper.updateElement(e1id, \"change e1\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id]);\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON()]);\r\n\r\n helper.terminate();\r\n });\r\n\r\n it(\"should invokeCallbacks through parents only\", () => {\r\n const helper = new TestHelper(\"Parents\", dbInfo);\r\n\r\n const p2id = helper.insertElement(\"p2\");\r\n const e1id = helper.insertElement(\"e1\", { id: p2id, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\r\n helper.db.saveChanges(); // get the elements into the iModel\r\n\r\n // The full graph:\r\n // .-parent-> p2\r\n // /\r\n // e1\r\n //\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\r\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\r\n assertRels(helper.dres.rootChanged, []); // we send out this callback even if only the relationship itself is new or changed.\r\n\r\n helper.updateElement(e1id, \"change e1\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [p2id]);\r\n assertRels(helper.dres.rootChanged, []);\r\n\r\n helper.updateElement(p2id, \"change p2\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, []); // only called on directly changed root elements\r\n assert.deepEqual(helper.dres.allInputsHandled, []);\r\n assertRels(helper.dres.rootChanged, []);\r\n\r\n helper.terminate();\r\n });\r\n\r\n it(\"should invokeCallbacks through EDEs and parents\", () => {\r\n const helper = new TestHelper(\"EDEsAndParents\", dbInfo);\r\n\r\n const p2id = helper.insertElement(\"p2\");\r\n const p3id = helper.insertElement(\"p3\");\r\n const e1id = helper.insertElement(\"e1\", { id: p2id, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\r\n const e2id = helper.insertElement(\"e2\");\r\n const e3id = helper.insertElement(\"e3\");\r\n helper.db.saveChanges(); // get the elements into the iModel\r\n\r\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\r\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\r\n const ede_p2_p3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, p2id, p3id);\r\n for (const ede of [ede_1_2, ede_2_3, ede_p2_p3]) {\r\n ede.insert();\r\n }\r\n\r\n // db[_nativeDb].writeFullElementDependencyGraphToFile(`${writeDbFileName}.dot`);\r\n\r\n // The full graph:\r\n // .-parent-> p2 -EDE-> p3\r\n // /\r\n // e1 -EDE-> e2 -EDE-> e3\r\n //\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges(); // this will react to EDE inserts only.\r\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\r\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_p2_p3.toJSON()]); // we send out this callback even if only the relationship itself is new or changed.\r\n\r\n helper.updateElement(e1id, \"change e1\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, p2id, e3id, p3id]);\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_p2_p3.toJSON()]);\r\n\r\n helper.updateElement(p2id, \"change p2\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [p2id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [p3id]);\r\n assertRels(helper.dres.rootChanged, [ede_p2_p3.toJSON()]);\r\n\r\n helper.updateElement(e2id, \"change e2\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e2id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [e3id]);\r\n assertRels(helper.dres.rootChanged, [ede_2_3.toJSON()]);\r\n\r\n helper.terminate();\r\n });\r\n\r\n it(\"should invokeCallbacks through parents - geomodeler schema\", () => {\r\n const helper = new TestHelper(\"GeoModeler\", dbInfo);\r\n\r\n // The full graph:\r\n // BoreholeSource -EDE-> GroundGeneration\r\n // / parent\r\n // Borehole\r\n // / parent\r\n // Material -EDE-> MaterialDepthRange\r\n\r\n const boreholeSource = helper.insertElement(\"BoreholeSource\");\r\n const borehole = helper.insertElement(\"Borehole\", { id: boreholeSource, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\r\n const materialDepthRange = helper.insertElement(\"MaterialDepthRange\", { id: borehole, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\r\n const material = helper.insertElement(\"Material\");\r\n const groundGeneration = helper.insertElement(\"GroundGeneration\");\r\n helper.db.saveChanges(); // get the elements into the iModel\r\n\r\n const ede_material_materialDepthRange = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, material, materialDepthRange);\r\n const ede_boreholeSource_groundGeneration = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, boreholeSource, groundGeneration);\r\n for (const ede of [ede_material_materialDepthRange, ede_boreholeSource_groundGeneration]) {\r\n ede.insert();\r\n }\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n helper.updateElement(material, \"change material\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [material]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [materialDepthRange, borehole, boreholeSource, groundGeneration]);\r\n assertRels(helper.dres.rootChanged, [ede_material_materialDepthRange.toJSON(), ede_boreholeSource_groundGeneration.toJSON()]);\r\n\r\n helper.terminate();\r\n });\r\n\r\n it(\"should invokeCallbacks many:1\", () => {\r\n const helper = new TestHelper(\"ManyToOne\", dbInfo);\r\n\r\n const e1id = helper.insertElement(\"e1\");\r\n const e11id = helper.insertElement(\"e11\");\r\n const e2id = helper.insertElement(\"e2\");\r\n const e21id = helper.insertElement(\"e21\");\r\n const e3id = helper.insertElement(\"e3\");\r\n const e4id = helper.insertElement(\"e4\");\r\n\r\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\r\n const ede_11_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e11id, e2id);\r\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\r\n const ede_21_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e21id, e3id);\r\n const ede_3_4 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e3id, e4id);\r\n for (const ede of [ede_1_2, ede_11_2, ede_2_3, ede_21_3, ede_3_4]) {\r\n ede.insert();\r\n }\r\n\r\n // The full graph:\r\n // e21\r\n // \\\r\n // e1 --> e2 --> e3 --> e4\r\n // /\r\n // e11\r\n\r\n // On the very first validation, everything is new and is considered directly changed\r\n // resulting graph:\r\n // e21\r\n // \\\r\n // e1 --> e2 --> e3 --> e4\r\n // /\r\n // e11\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n assert.deepEqual(helper.dres.beforeOutputs, [e1id, e11id, e21id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_11_2.toJSON(), ede_2_3.toJSON(), ede_21_3.toJSON(), ede_3_4.toJSON()]);\r\n\r\n // modify e4 directly. That is a leaf. None of its inputs are changed.\r\n // resulting subgraph:\r\n // *\r\n // e4\r\n //\r\n //\r\n helper.updateElement(e4id, \"change e4\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, []); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, []);\r\n assertRels(helper.dres.rootChanged, []);\r\n\r\n // modify e3 directly.\r\n // resulting subgraph:\r\n //\r\n //\r\n // *\r\n // e3 --> e4\r\n //\r\n //\r\n helper.updateElement(e3id, \"change e3\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e3id]); // only called on directly changed root elements.\r\n assert.deepEqual(helper.dres.allInputsHandled, [e4id]);\r\n assertRels(helper.dres.rootChanged, [ede_3_4.toJSON()]);\r\n\r\n // modify e2 directly. That is a node in middle of the graph. None of its inputs is modified.\r\n // resulting subgraph:\r\n //\r\n // *\r\n // e2 --> e3 --> e4\r\n //\r\n //\r\n //\r\n helper.updateElement(e2id, \"change e2\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e2id]); // only called on directly changed root elements\r\n assert.deepEqual(helper.dres.allInputsHandled, [e3id, e4id]);\r\n assertRels(helper.dres.rootChanged, [ede_2_3.toJSON(), ede_3_4.toJSON()]);\r\n\r\n // Modify e1 directly. That should propagate to the rest of the nodes. Each should get an _onAllInputsHandled callback\r\n // resulting graph:\r\n //\r\n // *\r\n // e1 --> e2 --> e3 --> e4\r\n //\r\n helper.updateElement(e1id, \"change e1\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements\r\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\r\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_3_4.toJSON()]);\r\n\r\n // Modify e11 directly. That should propagate to the rest of the nodes. Each should get an _onAllInputsHandled callback\r\n // resulting graph:\r\n //\r\n // > e2 --> e3 --> e4\r\n // /\r\n // e11\r\n // *\r\n //\r\n // Note that the e1 -> e2 and e21 -> e3 edges are NOT in the sub-graph. These edges should be validated, nevertheless -- TBD\r\n helper.updateElement(e11id, \"change e11\");\r\n\r\n helper.resetDependencyResults();\r\n helper.db.saveChanges();\r\n\r\n // assert.deepEqual(helper.dres.directChange, []); // only called on directly changed non-root elements that have no directly changed inputs\r\n assert.deepEqual(helper.dres.beforeOutputs, [e11id]); // only called on directly changed root elements\r\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\r\n assertRels(helper.dres.rootChanged, [ede_11_2.toJSON(), ede_2_3.toJSON(), ede_3_4.toJSON()]);\r\n // assertRels(helper.dres.validateOutput, [ede_1_2, ede_21_3]); // this callback is made only on rels that not in the graph but share an output with another rel or have an output that was directly changed\r\n\r\n helper.terminate();\r\n });\r\n\r\n});\r\n"]}
1
+ {"version":3,"file":"ElementDependencyGraph.test.js","sourceRoot":"","sources":["../../../../src/test/element/ElementDependencyGraph.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,yDAAyD;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAyB,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,EAA0C,qBAAqB,GAElJ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,cAAc,EAA6B,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpJ,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,kBAAkB,EAA2B,MAAM,oBAAoB,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,UAAkB;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IACD,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAyB,EAAE,IAAiC;IAC9E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,yBAAyB;IACtB,aAAa,GAAc,EAAE,CAAC;IAC9B,gBAAgB,GAAc,EAAE,CAAC;IACjC,WAAW,GAAwB,EAAE,CAAC;IACtC,iBAAiB,GAAwB,EAAE,CAAC;CACpD;AASD,MAAM,UAAU;IACP,EAAE,CAAe;IACjB,IAAI,GAAG,IAAI,yBAAyB,EAAE,CAAC;IACtC,QAAQ,GAAmB,EAAE,CAAC;IAC9B,UAAU,GAAe,EAAE,CAAC;IAC5B,eAAe,GAAe,EAAE,CAAC;IACjC,iBAAiB,GAAe,EAAE,CAAC;IAE3C,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAElD,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,QAAQ,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACzE,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAErE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,6CAA6C,CAAC,SAAS,EAAE,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/H,IAAI,CAAC,kCAAkC,EAAE,CAAC;IAC5C,CAAC;IAEM,SAAS;QACd,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,qCAAqC,EAAE,CAAC;IAC/C,CAAC;IAEM,WAAW,CAAC,SAAiB,EAAE,MAA4B;QAChE,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC5C,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5F,OAAO;YACL,aAAa,EAAE,4BAA4B;YAC3C,KAAK,EAAE,IAAI,CAAC,eAAe;YAC3B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;YAChC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;YAC9E,WAAW,EAAE,GAAG;YAChB,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM,EAAE,IAAI,kBAAkB,EAAE;aACjC;YACD,IAAI,EAAE,OAAO,CAAC,cAAc;YAC5B,MAAM;SACP,CAAC;IACJ,CAAC;IAEM,aAAa,CAAC,SAAiB,EAAE,MAA4B;QAClE,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEM,aAAa,CAAC,IAAgB,EAAE,QAAgB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEM,OAAO,CAAC,IAAgB,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,MAAM,CAAC,KAAwB,IAAI,OAAO,GAAG,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3I,sBAAsB;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAEM,kCAAkC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;YACnF,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9E,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,2BAA2B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1E,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,uBAAuB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAEM,qCAAqC;QAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,YAAoB,CAAC;IACzB,IAAI,MAAc,CAAC;IAEnB,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnD,MAAM,cAAc,GAAmB;YACrC,MAAM,EAAE,aAAa,CAAC,OAAO;YAC7B,cAAc,EAAE,IAAI;SACrB,CAAC;QACF,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAClE,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,eAAe,CAAC,qBAAqB,EAAE,CAAC;QACxC,6EAA6E;QAC7E,YAAY,GAAG,eAAe,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxG,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,eAAe,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;QAChF,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAChD,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvE,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACxF,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjH,MAAM,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,wBAAwB,EAAE,IAAI,qBAAqB,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnK,MAAM,GAAG,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,mCAAmC;QAE5D,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;QAED,kBAAkB;QAClB,oBAAoB;QAEpB,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,uCAAuC;QAChE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,6EAA6E;QAC9H,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,iCAAiC;QACrF,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,oFAAoF;QAE/J,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1E,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC9G,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,mCAAmC;QAE5D,kBAAkB;QAClB,oBAAoB;QACpB,OAAO;QACP,MAAM;QACN,EAAE;QACF,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,6EAA6E;QAC9H,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,iCAAiC;QACrF,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,oFAAoF;QAE7H,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAExC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,gDAAgD;QACjG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACnD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC9G,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,mCAAmC;QAE5D,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnG,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;QAED,iFAAiF;QAEjF,kBAAkB;QAClB,8BAA8B;QAC9B,OAAO;QACP,0BAA0B;QAC1B,EAAE;QACF,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,uCAAuC;QAChE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,6EAA6E;QAC9H,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,iCAAiC;QACrF,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,oFAAoF;QAEnL,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACzE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9F,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEpD,kBAAkB;QAClB,gFAAgF;QAChF,kDAAkD;QAClD,4CAA4C;QAC5C,4CAA4C;QAC5C,qCAAqC;QAErC,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAClI,MAAM,kBAAkB,GAAG,MAAM,CAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAChJ,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,mCAAmC;QAE5D,MAAM,+BAA+B,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC3I,MAAM,mCAAmC,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACnJ,KAAK,MAAM,GAAG,IAAI,CAAC,+BAA+B,EAAE,mCAAmC,CAAC,EAAE,CAAC;YACzF,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;QAED,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAElD,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iDAAiD;QAC1G,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACjH,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,+BAA+B,CAAC,MAAM,EAAE,EAAE,mCAAmC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9H,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACnG,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACnG,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAA2B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;QAED,kBAAkB;QAClB,aAAa;QACb,eAAe;QACf,2BAA2B;QAC3B,SAAS;QACT,OAAO;QAEP,qFAAqF;QACrF,mBAAmB;QACnB,aAAa;QACb,eAAe;QACf,2BAA2B;QAC3B,SAAS;QACT,OAAO;QACP,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACpH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAElI,sEAAsE;QACtE,sBAAsB;QACtB,yBAAyB;QACzB,0BAA0B;QAC1B,EAAE;QACF,EAAE;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,iDAAiD;QAClG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACnD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAExC,sBAAsB;QACtB,sBAAsB;QACtB,EAAE;QACF,EAAE;QACF,kBAAkB;QAClB,0BAA0B;QAC1B,EAAE;QACF,EAAE;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAExD,6FAA6F;QAC7F,sBAAsB;QACtB,EAAE;QACF,YAAY;QACZ,2BAA2B;QAC3B,EAAE;QACF,EAAE;QACF,EAAE;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gDAAgD;QACrG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1E,sHAAsH;QACtH,mBAAmB;QACnB,EAAE;QACF,OAAO;QACP,6BAA6B;QAC7B,EAAE;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gDAAgD;QACrG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE5F,uHAAuH;QACvH,mBAAmB;QACnB,EAAE;QACF,2BAA2B;QAC3B,SAAS;QACT,OAAO;QACP,KAAK;QACL,EAAE;QACF,4HAA4H;QAC5H,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE1C,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAExB,4IAA4I;QAC5I,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gDAAgD;QACtG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7F,4MAA4M;QAE5M,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { assert } from \"chai\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { Guid, Id64Array, Id64String, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport {\n CodeScopeSpec, CodeSpec, ColorByName, DomainOptions, GeometryStreamBuilder, IModel, RelatedElementProps, RelationshipProps, SubCategoryAppearance,\n UpgradeOptions,\n} from \"@itwin/core-common\";\nimport { LineSegment3d, Point3d, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport { _nativeDb, ChannelControl, ElementDrivesElementProps, IModelJsFs, PhysicalModel, SpatialCategory, StandaloneDb } from \"../../core-backend\";\nimport { IModelTestUtils, TestElementDrivesElement, TestPhysicalObject, TestPhysicalObjectProps } from \"../IModelTestUtils\";\nimport { IModelNative } from \"../../internal/NativePlatform\";\n\nexport function copyFile(newName: string, pathToCopy: string): string {\n const newPath = path.join(path.dirname(pathToCopy), newName);\n try {\n fs.unlinkSync(newPath);\n } catch {\n }\n fs.copyFileSync(pathToCopy, newPath);\n return newPath;\n}\n\nfunction assertRels(list: RelationshipProps[], rels: ElementDrivesElementProps[]) {\n assert.equal(list.length, rels.length);\n for (let i = 0; i < rels.length; ++i) {\n assert.equal(list[i].id, rels[i].id);\n }\n}\n\nclass DependencyCallbackResults {\n public beforeOutputs: Id64Array = [];\n public allInputsHandled: Id64Array = [];\n public rootChanged: RelationshipProps[] = [];\n public deletedDependency: RelationshipProps[] = [];\n}\n\ninterface DbInfo {\n seedFileName: string;\n codeSpecId: Id64String;\n physicalModelId: Id64String;\n spatialCategoryId: Id64String;\n}\n\nclass TestHelper {\n public db: StandaloneDb;\n public dres = new DependencyCallbackResults();\n private removals: VoidFunction[] = [];\n private codeSpecId: Id64String = \"\";\n private physicalModelId: Id64String = \"\";\n private spatialCategoryid: Id64String = \"\";\n\n constructor(testName: string, dbInfo: DbInfo) {\n this.codeSpecId = dbInfo.codeSpecId;\n this.physicalModelId = dbInfo.physicalModelId;\n this.spatialCategoryid = dbInfo.spatialCategoryId;\n\n const writeDbFileName = copyFile(`${testName}.bim`, dbInfo.seedFileName);\n this.db = StandaloneDb.openFile(writeDbFileName, OpenMode.ReadWrite);\n assert.isTrue(this.db !== undefined);\n this.db.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n this.db[_nativeDb].enableTxnTesting();\n assert.equal(this.db[_nativeDb].addChildPropagatesChangesToParentRelationship(\"TestBim\", \"ChildPropagatesChangesToParent\"), 0);\n this.setElementDependencyGraphCallbacks();\n }\n\n public terminate() {\n this.db.close();\n assert.isFalse(this.db.isOpen);\n this.removeElementDependencyGraphCallbacks();\n }\n\n public makeElement(codeValue: string, parent?: RelatedElementProps): TestPhysicalObjectProps {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(5, 0, 0)));\n\n return {\n classFullName: \"TestBim:TestPhysicalObject\",\n model: this.physicalModelId,\n category: this.spatialCategoryid,\n code: { spec: this.codeSpecId, scope: this.physicalModelId, value: codeValue },\n intProperty: 100,\n placement: {\n origin: new Point3d(0, 0, 0),\n angles: new YawPitchRollAngles(),\n },\n geom: builder.geometryStream,\n parent,\n };\n }\n\n public insertElement(codeValue: string, parent?: RelatedElementProps): Id64String {\n return this.db.elements.insertElement(this.makeElement(codeValue, parent));\n }\n\n public updateElement(elid: Id64String, newLabel: string) {\n const ed2 = this.db.elements.getElement({ id: elid });\n ed2.userLabel = newLabel;\n this.db.elements.updateElement(ed2.toJSON());\n }\n\n public fmtElem(elId: Id64String) { return this.db.elements.getElement(elId).code.value; }\n public fmtRel(props: RelationshipProps) { return `${props.classFullName} ${this.fmtElem(props.sourceId)} --> ${this.fmtElem(props.targetId)}`; }\n\n public resetDependencyResults() {\n this.dres = new DependencyCallbackResults();\n }\n\n public setElementDependencyGraphCallbacks() {\n this.removals.push(TestElementDrivesElement.deletedDependency.addListener((evProps) => {\n Logger.logTrace(\"EDGTest\", `_onDeletedDependency ${this.fmtRel(evProps)}`);\n this.dres.deletedDependency.push(evProps);\n }));\n this.removals.push(TestElementDrivesElement.rootChanged.addListener((evProps, _im) => {\n Logger.logTrace(\"EDGTest\", `_onRootChanged ${this.fmtRel(evProps)}`);\n this.dres.rootChanged.push(evProps);\n }));\n this.removals.push(TestPhysicalObject.beforeOutputsHandled.addListener((elId) => {\n Logger.logTrace(\"EDGTest\", `_onBeforeOutputsHandled ${this.fmtElem(elId)}`);\n this.dres.beforeOutputs.push(elId);\n }));\n this.removals.push(TestPhysicalObject.allInputsHandled.addListener((elId) => {\n Logger.logTrace(\"EDGTest\", `_onAllInputsHandled ${this.fmtElem(elId)}`);\n this.dres.allInputsHandled.push(elId);\n }));\n }\n\n public removeElementDependencyGraphCallbacks() {\n this.removals.forEach((drop) => drop());\n }\n}\n\ndescribe(\"ElementDependencyGraph\", () => {\n let testFileName: string;\n let dbInfo: DbInfo;\n\n const performUpgrade = (pathname: string) => {\n const nativeDb = new IModelNative.platform.DgnDb();\n const upgradeOptions: UpgradeOptions = {\n domain: DomainOptions.Upgrade,\n schemaLockHeld: true,\n };\n nativeDb.openIModel(pathname, OpenMode.ReadWrite, upgradeOptions);\n nativeDb.deleteAllTxns();\n nativeDb.closeFile();\n };\n\n before(async () => {\n IModelTestUtils.registerTestBimSchema();\n // make a unique name for the output file so this test can be run in parallel\n testFileName = IModelTestUtils.prepareOutputFile(\"ElementDependencyGraph\", `${Guid.createValue()}.bim`);\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\n const schemaFileName = IModelTestUtils.resolveAssetFile(\"TestBim.ecschema.xml\");\n IModelJsFs.copySync(seedFileName, testFileName);\n performUpgrade(testFileName);\n const imodel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\n await imodel.importSchemas([schemaFileName]); // will throw an exception if import fails\n imodel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const physicalModelId = PhysicalModel.insert(imodel, IModel.rootSubjectId, \"EDGTestModel\");\n const codeSpecId = imodel.codeSpecs.insert(CodeSpec.create(imodel, \"EDGTestCodeSpec\", CodeScopeSpec.Type.Model));\n const spatialCategoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, \"EDGTestSpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\n dbInfo = { physicalModelId, codeSpecId, spatialCategoryId, seedFileName: testFileName };\n imodel.saveChanges(\"\");\n imodel[_nativeDb].deleteAllTxns();\n imodel.close();\n });\n\n after(() => {\n IModelJsFs.removeSync(testFileName);\n });\n\n it(\"should invokeCallbacks EDE only\", () => {\n const helper = new TestHelper(\"EDE\", dbInfo);\n\n const e1id = helper.insertElement(\"e1\");\n const e2id = helper.insertElement(\"e2\");\n const e3id = helper.insertElement(\"e3\");\n helper.db.saveChanges(); // get the elements into the iModel\n\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\n for (const ede of [ede_1_2, ede_2_3]) {\n ede.insert();\n }\n\n // The full graph:\n // e1 --> e2 --> e3\n\n helper.resetDependencyResults();\n helper.db.saveChanges(); // this will react to EDE inserts only.\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON()]); // we send out this callback even if only the relationship itself is new or changed.\n\n helper.updateElement(e1id, \"change e1\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id]);\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON()]);\n\n helper.terminate();\n });\n\n it(\"should invokeCallbacks through parents only\", () => {\n const helper = new TestHelper(\"Parents\", dbInfo);\n\n const p2id = helper.insertElement(\"p2\");\n const e1id = helper.insertElement(\"e1\", { id: p2id, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\n helper.db.saveChanges(); // get the elements into the iModel\n\n // The full graph:\n // .-parent-> p2\n // /\n // e1\n //\n helper.resetDependencyResults();\n helper.db.saveChanges();\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\n assertRels(helper.dres.rootChanged, []); // we send out this callback even if only the relationship itself is new or changed.\n\n helper.updateElement(e1id, \"change e1\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [p2id]);\n assertRels(helper.dres.rootChanged, []);\n\n helper.updateElement(p2id, \"change p2\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, []); // only called on directly changed root elements\n assert.deepEqual(helper.dres.allInputsHandled, []);\n assertRels(helper.dres.rootChanged, []);\n\n helper.terminate();\n });\n\n it(\"should invokeCallbacks through EDEs and parents\", () => {\n const helper = new TestHelper(\"EDEsAndParents\", dbInfo);\n\n const p2id = helper.insertElement(\"p2\");\n const p3id = helper.insertElement(\"p3\");\n const e1id = helper.insertElement(\"e1\", { id: p2id, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\n const e2id = helper.insertElement(\"e2\");\n const e3id = helper.insertElement(\"e3\");\n helper.db.saveChanges(); // get the elements into the iModel\n\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\n const ede_p2_p3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, p2id, p3id);\n for (const ede of [ede_1_2, ede_2_3, ede_p2_p3]) {\n ede.insert();\n }\n\n // db[_nativeDb].writeFullElementDependencyGraphToFile(`${writeDbFileName}.dot`);\n\n // The full graph:\n // .-parent-> p2 -EDE-> p3\n // /\n // e1 -EDE-> e2 -EDE-> e3\n //\n helper.resetDependencyResults();\n helper.db.saveChanges(); // this will react to EDE inserts only.\n assert.deepEqual(helper.dres.beforeOutputs, []); // only roots get this callback, and only if they have been directly changed.\n assert.deepEqual(helper.dres.allInputsHandled, []); // No input elements have changed\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_p2_p3.toJSON()]); // we send out this callback even if only the relationship itself is new or changed.\n\n helper.updateElement(e1id, \"change e1\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, p2id, e3id, p3id]);\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_p2_p3.toJSON()]);\n\n helper.updateElement(p2id, \"change p2\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [p2id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [p3id]);\n assertRels(helper.dres.rootChanged, [ede_p2_p3.toJSON()]);\n\n helper.updateElement(e2id, \"change e2\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e2id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [e3id]);\n assertRels(helper.dres.rootChanged, [ede_2_3.toJSON()]);\n\n helper.terminate();\n });\n\n it(\"should invokeCallbacks through parents - geomodeler schema\", () => {\n const helper = new TestHelper(\"GeoModeler\", dbInfo);\n\n // The full graph:\n // BoreholeSource -EDE-> GroundGeneration\n // / parent\n // Borehole\n // / parent\n // Material -EDE-> MaterialDepthRange\n\n const boreholeSource = helper.insertElement(\"BoreholeSource\");\n const borehole = helper.insertElement(\"Borehole\", { id: boreholeSource, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\n const materialDepthRange = helper.insertElement(\"MaterialDepthRange\", { id: borehole, relClassName: \"TestBim.ChildPropagatesChangesToParent\" });\n const material = helper.insertElement(\"Material\");\n const groundGeneration = helper.insertElement(\"GroundGeneration\");\n helper.db.saveChanges(); // get the elements into the iModel\n\n const ede_material_materialDepthRange = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, material, materialDepthRange);\n const ede_boreholeSource_groundGeneration = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, boreholeSource, groundGeneration);\n for (const ede of [ede_material_materialDepthRange, ede_boreholeSource_groundGeneration]) {\n ede.insert();\n }\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n helper.updateElement(material, \"change material\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [material]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [materialDepthRange, borehole, boreholeSource, groundGeneration]);\n assertRels(helper.dres.rootChanged, [ede_material_materialDepthRange.toJSON(), ede_boreholeSource_groundGeneration.toJSON()]);\n\n helper.terminate();\n });\n\n it(\"should invokeCallbacks many:1\", () => {\n const helper = new TestHelper(\"ManyToOne\", dbInfo);\n\n const e1id = helper.insertElement(\"e1\");\n const e11id = helper.insertElement(\"e11\");\n const e2id = helper.insertElement(\"e2\");\n const e21id = helper.insertElement(\"e21\");\n const e3id = helper.insertElement(\"e3\");\n const e4id = helper.insertElement(\"e4\");\n\n const ede_1_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e1id, e2id);\n const ede_11_2 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e11id, e2id);\n const ede_2_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e2id, e3id);\n const ede_21_3 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e21id, e3id);\n const ede_3_4 = TestElementDrivesElement.create<TestElementDrivesElement>(helper.db, e3id, e4id);\n for (const ede of [ede_1_2, ede_11_2, ede_2_3, ede_21_3, ede_3_4]) {\n ede.insert();\n }\n\n // The full graph:\n // e21\n // \\\n // e1 --> e2 --> e3 --> e4\n // /\n // e11\n\n // On the very first validation, everything is new and is considered directly changed\n // resulting graph:\n // e21\n // \\\n // e1 --> e2 --> e3 --> e4\n // /\n // e11\n helper.resetDependencyResults();\n helper.db.saveChanges();\n assert.deepEqual(helper.dres.beforeOutputs, [e1id, e11id, e21id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_11_2.toJSON(), ede_2_3.toJSON(), ede_21_3.toJSON(), ede_3_4.toJSON()]);\n\n // modify e4 directly. That is a leaf. None of its inputs are changed.\n // resulting subgraph:\n // *\n // e4\n //\n //\n helper.updateElement(e4id, \"change e4\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, []); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, []);\n assertRels(helper.dres.rootChanged, []);\n\n // modify e3 directly.\n // resulting subgraph:\n //\n //\n // *\n // e3 --> e4\n //\n //\n helper.updateElement(e3id, \"change e3\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e3id]); // only called on directly changed root elements.\n assert.deepEqual(helper.dres.allInputsHandled, [e4id]);\n assertRels(helper.dres.rootChanged, [ede_3_4.toJSON()]);\n\n // modify e2 directly. That is a node in middle of the graph. None of its inputs is modified.\n // resulting subgraph:\n //\n // *\n // e2 --> e3 --> e4\n //\n //\n //\n helper.updateElement(e2id, \"change e2\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e2id]); // only called on directly changed root elements\n assert.deepEqual(helper.dres.allInputsHandled, [e3id, e4id]);\n assertRels(helper.dres.rootChanged, [ede_2_3.toJSON(), ede_3_4.toJSON()]);\n\n // Modify e1 directly. That should propagate to the rest of the nodes. Each should get an _onAllInputsHandled callback\n // resulting graph:\n //\n // *\n // e1 --> e2 --> e3 --> e4\n //\n helper.updateElement(e1id, \"change e1\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n assert.deepEqual(helper.dres.beforeOutputs, [e1id]); // only called on directly changed root elements\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\n assertRels(helper.dres.rootChanged, [ede_1_2.toJSON(), ede_2_3.toJSON(), ede_3_4.toJSON()]);\n\n // Modify e11 directly. That should propagate to the rest of the nodes. Each should get an _onAllInputsHandled callback\n // resulting graph:\n //\n // > e2 --> e3 --> e4\n // /\n // e11\n // *\n //\n // Note that the e1 -> e2 and e21 -> e3 edges are NOT in the sub-graph. These edges should be validated, nevertheless -- TBD\n helper.updateElement(e11id, \"change e11\");\n\n helper.resetDependencyResults();\n helper.db.saveChanges();\n\n // assert.deepEqual(helper.dres.directChange, []); // only called on directly changed non-root elements that have no directly changed inputs\n assert.deepEqual(helper.dres.beforeOutputs, [e11id]); // only called on directly changed root elements\n assert.deepEqual(helper.dres.allInputsHandled, [e2id, e3id, e4id]);\n assertRels(helper.dres.rootChanged, [ede_11_2.toJSON(), ede_2_3.toJSON(), ede_3_4.toJSON()]);\n // assertRels(helper.dres.validateOutput, [ede_1_2, ede_21_3]); // this callback is made only on rels that not in the graph but share an output with another rel or have an output that was directly changed\n\n helper.terminate();\n });\n\n});\n"]}