@woosh/meep-engine 2.35.15 → 2.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/core/binary/BinaryBuffer.js +42 -17
  2. package/core/bvh2/BinaryNode.js +1 -1
  3. package/core/bvh2/aabb3/AABB3.js +2 -2
  4. package/core/bvh2/aabb3/aabb3_array_combine.js +20 -0
  5. package/core/bvh2/aabb3/aabb3_array_intersects_frustum_array.js +20 -0
  6. package/core/bvh2/aabb3/aabb3_array_intersects_ray.js +1 -0
  7. package/core/bvh2/aabb3/aabb3_array_intersects_ray_array.js +14 -0
  8. package/core/bvh2/{aabb3_combined_surface_area.js → aabb3/aabb3_combined_surface_area.js} +3 -3
  9. package/core/bvh2/aabb3/aabb3_intersects_frustum_array.js +1 -19
  10. package/core/bvh2/bvh3/BVHNodeProxy.js +53 -0
  11. package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +848 -0
  12. package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.spec.js +142 -0
  13. package/core/bvh2/bvh3/bvh_query_leaves_generic.js +79 -0
  14. package/core/bvh2/bvh3/bvh_query_leaves_ray.js +95 -0
  15. package/core/bvh2/bvh3/query/BVHQuery.js +11 -0
  16. package/core/bvh2/bvh3/query/BVHQueryIntersectsFrustum.js +36 -0
  17. package/core/bvh2/bvh3/query/BVHQueryIntersectsRay.js +36 -0
  18. package/core/collection/array/copyArray.js +2 -2
  19. package/core/collection/array/typed/uint_array_for_count.js +17 -0
  20. package/core/collection/table/RowFirstTable.js +25 -7
  21. package/core/collection/table/RowFirstTableSpec.js +4 -4
  22. package/core/geom/3d/aabb/aabb3_matrix4_project.spec.js +1 -1
  23. package/{engine/graphics/util → core/geom/3d/aabb}/computeBoundingBoxFromVertexData.js +1 -1
  24. package/core/geom/3d/compose_matrix4_array.js +53 -0
  25. package/{engine/graphics/util → core/geom/3d}/decompose_matrix_4_array.js +0 -0
  26. package/core/geom/Vector1.js +2 -3
  27. package/engine/asset/loaders/GLTFAssetLoader.js +3 -0
  28. package/engine/asset/loaders/gltf/GLTFAssetTransformMikkTSpaceTangents.js +27 -0
  29. package/engine/ecs/EntityComponentDataset.js +7 -4
  30. package/engine/ecs/foliage/InstancedFoliage.js +1 -1
  31. package/engine/ecs/foliage/ViewState.js +1 -1
  32. package/engine/ecs/transform/Transform.js +2 -2
  33. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +5 -0
  34. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +46 -12
  35. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +81 -95
  36. package/engine/graphics/ecs/mesh-v2/render/ShadedGeometryRendererContext.js +16 -5
  37. package/engine/graphics/ecs/mesh-v2/sample/load_gltf.js +1 -0
  38. package/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +3 -4
  39. package/engine/graphics/ecs/path/PathDisplaySystem.js +2 -1
  40. package/engine/graphics/ecs/path/testPathDisplaySystem.js +8 -8
  41. package/engine/graphics/ecs/path/tube/CapType.d.ts +5 -0
  42. package/engine/graphics/ecs/path/tube/CapType.js +9 -0
  43. package/engine/graphics/ecs/path/tube/TubePathStyle.d.ts +2 -0
  44. package/engine/graphics/ecs/path/tube/TubePathStyle.js +10 -1
  45. package/engine/graphics/ecs/path/tube/build/GeometryOutput.js +90 -0
  46. package/engine/graphics/ecs/path/tube/build/build_geometry_catmullrom.js +3 -2
  47. package/engine/graphics/ecs/path/tube/build/build_geometry_linear.js +1 -1
  48. package/engine/graphics/ecs/path/tube/build/computeFrenetFrames.js +1 -2
  49. package/engine/graphics/ecs/path/tube/build/makeTubeGeometry.js +353 -91
  50. package/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +390 -0
  51. package/engine/graphics/geometry/MikkT/MikkTSpace.js +2210 -0
  52. package/engine/graphics/geometry/MikkT/MikkTSpace.spec.js +22 -0
  53. package/engine/graphics/geometry/MikkT/buffer_geometry_ensure_tangents.js +34 -0
  54. package/engine/graphics/geometry/MikkT/buffer_geometry_generate_tangents.js +28 -0
  55. package/engine/graphics/{compute_geometry_polycount.js → geometry/compute_geometry_polycount.js} +0 -0
  56. package/engine/graphics/geometry/skining/computeSkinnedMeshBoundingVolumes.js +1 -1
  57. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -18
  58. package/engine/graphics/micron/format/MicronGeometry.js +7 -4
  59. package/engine/graphics/micron/format/micron_build_proxy_geometry.js +203 -0
  60. package/engine/graphics/micron/format/serialization/collection/geometry_collection_serialization.js +83 -0
  61. package/engine/graphics/micron/plugin/GLTFAssetTransformer.js +63 -19
  62. package/engine/graphics/micron/plugin/GLTF_MICRON_ID_FIELD.js +5 -0
  63. package/engine/graphics/micron/plugin/MicronRenderPlugin.js +0 -4
  64. package/engine/graphics/micron/prototypeMicronProxyBuild.js +227 -0
  65. package/engine/graphics/micron/render/refinement/ActivePatchList.js +2 -2
  66. package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +2 -2
  67. package/engine/graphics/render/forward_plus/LightManager.js +5 -5
  68. package/engine/graphics/render/forward_plus/data/channelCountToThreIntegerTextureType.js +3 -3
  69. package/engine/graphics/texture/channelCountToThreeTextureFormat.js +2 -2
  70. package/engine/graphics/util/composeMatrix4.js +1 -53
  71. package/engine/graphics/util/composeMatrix4RotationScale.js +1 -1
  72. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +1 -1
  73. package/engine/intelligence/blackboard/AbstractBlackboard.js +9 -0
  74. package/engine/navigation/grid/FastBinaryHeap.js +13 -2
  75. package/engine/notify/Notification.js +1 -1
  76. package/engine/ui/notification/ViewEmitter.js +7 -1
  77. package/engine/ui/notification/notificationGenerator.js +1 -1
  78. package/engine/ui/scene/SceneGUIContext.js +11 -130
  79. package/engine/ui/scene/initializeNotifications.js +141 -0
  80. package/package.json +1 -1
  81. package/view/elements/notify/NotificationView.js +1 -2
@@ -0,0 +1,390 @@
1
+ import { EngineHarness } from "../../../../EngineHarness.js";
2
+ import { EngineConfiguration } from "../../../../EngineConfiguration.js";
3
+ import GUIElementSystem from "../../../../ecs/gui/GUIElementSystem.js";
4
+ import HeadsUpDisplaySystem from "../../../../ecs/gui/hud/HeadsUpDisplaySystem.js";
5
+ import ScriptSystem from "../../../../ecs/systems/ScriptSystem.js";
6
+ import FacingDirectionSystem from "../../../../../../model/game/ecs/system/FacingDirectionSystem.js";
7
+ import PathFollowingSystem from "../../../../navigation/ecs/path_following/PathFollowingSystem.js";
8
+ import SteeringSystem from "../../../../ecs/systems/SteeringSystem.js";
9
+ import MotionSystem from "../../../../ecs/systems/MotionSystem.js";
10
+ import TagSystem from "../../../../ecs/systems/TagSystem.js";
11
+ import { AttachmentSystem } from "../../../../ecs/attachment/AttachmentSystem.js";
12
+ import { SoundEmitterSystem } from "../../../../sound/ecs/emitter/SoundEmitterSystem.js";
13
+ import SoundControllerSystem from "../../../../sound/ecs/SoundControllerSystem.js";
14
+ import SoundListenerSystem from "../../../../sound/ecs/SoundListenerSystem.js";
15
+ import TimerSystem from "../../../../ecs/systems/TimerSystem.js";
16
+ import AnimationSystem from "../../../../ecs/systems/AnimationSystem.js";
17
+ import TopDownCameraControllerSystem from "../../camera/topdown/TopDownCameraControllerSystem.js";
18
+ import { TopDownCameraLanderSystem } from "../../camera/topdown/TopDownCameraLanderSystem.js";
19
+ import { CameraSystem } from "../../camera/CameraSystem.js";
20
+ import { MeshSystem } from "../../mesh/MeshSystem.js";
21
+ import ClingToTerrainSystem from "../../../../ecs/terrain/ecs/ClingToTerrainSystem.js";
22
+ import TerrainSystem from "../../../../ecs/terrain/ecs/TerrainSystem.js";
23
+ import WaterSystem from "../../water/WaterSystem.js";
24
+ import Trail2DSystem from "../../trail2d/Trail2DSystem.js";
25
+ import { Foliage2System } from "../../../../ecs/foliage/ecs/Foliage2System.js";
26
+ import ViewportPositionSystem from "../../../../ecs/gui/position/ViewportPositionSystem.js";
27
+ import { GridPosition2TransformSystem } from "../../../../grid/systems/GridPosition2TransformSystem.js";
28
+ import { Transform2GridPositionSystem } from "../../../../grid/transform2grid/Transform2GridPositionSystem.js";
29
+ import SynchronizePositionSystem from "../../../../ecs/systems/SynchronizePositionSystem.js";
30
+ import GridObstacleSystem from "../../../../grid/systems/GridObstacleSystem.js";
31
+ import GridPositionSystem from "../../../../grid/systems/GridPositionSystem.js";
32
+ import InputControllerSystem from "../../../../input/ecs/systems/InputControllerSystem.js";
33
+ import { InputSystem } from "../../../../input/ecs/systems/InputSystem.js";
34
+ import MeshHighlightSystem from "../../highlight/system/MeshHighlightSystem.js";
35
+ import LightSystem from "../../light/LightSystem.js";
36
+ import AnimationControllerSystem from "../../animation/AnimationControllerSystem.js";
37
+ import { AnimationGraphSystem } from "../../animation/animator/AnimationGraphSystem.js";
38
+ import { BehaviorSystem } from "../../../../intelligence/behavior/ecs/BehaviorSystem.js";
39
+ import { SerializationMetadataSystem } from "../../../../ecs/systems/SerializationMetadataSystem.js";
40
+ import { InverseKinematicsSystem } from "../../../../ecs/animation/InverseKinematicsSystem.js";
41
+ import { PathDisplaySystem } from "../PathDisplaySystem.js";
42
+ import { AmbientOcclusionPostProcessEffect } from "../../../render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js";
43
+ import { GameAssetType } from "../../../../asset/GameAssetType.js";
44
+ import { GLTFAssetLoader } from "../../../../asset/loaders/GLTFAssetLoader.js";
45
+ import { JsonAssetLoader } from "../../../../asset/loaders/JsonAssetLoader.js";
46
+ import { TextureAssetLoader } from "../../../../asset/loaders/texture/TextureAssetLoader.js";
47
+ import { ImageRGBADataLoader } from "../../../../asset/loaders/image/ImageRGBADataLoader.js";
48
+ import { ShadedGeometrySystem } from "../../mesh-v2/ShadedGeometrySystem.js";
49
+ import { makeEngineOptionsModel } from "../../../../../../model/game/options/makeEngineOptionsModel.js";
50
+ import { enableEditor } from "../../../../../editor/enableEditor.js";
51
+ import { CanvasView } from "../../../../../view/elements/CanvasView.js";
52
+ import { computeCatmullRomSpline } from "../../../../navigation/ecs/components/computeCatmullRomSpline.js";
53
+ import { EntityPathStyle } from "../entity/EntityPathStyle.js";
54
+ import { EntityPathMarkerDefinition } from "../entity/EntityPathMarkerDefinition.js";
55
+ import { EntityBlueprint } from "../../../../ecs/EntityBlueprint.js";
56
+ import { Transform } from "../../../../ecs/transform/Transform.js";
57
+ import Mesh from "../../mesh/Mesh.js";
58
+ import { Animation } from "../../../../ecs/animation/Animation.js";
59
+ import Highlight from "../../highlight/Highlight.js";
60
+ import { TubePathStyle } from "./TubePathStyle.js";
61
+ import { TubeMaterialType } from "./TubeMaterialType.js";
62
+ import { MatcapMaterialDefinition } from "./MatcapMaterialDefinition.js";
63
+ import Path from "../../../../navigation/ecs/components/Path.js";
64
+ import { InterpolationType } from "../../../../navigation/ecs/components/InterpolationType.js";
65
+ import Vector3 from "../../../../../core/geom/Vector3.js";
66
+ import { RibbonPathStyle } from "../ribbon/RibbonPathStyle.js";
67
+ import { PathDisplay } from "../PathDisplay.js";
68
+ import { PathDisplaySpec } from "../PathDisplaySpec.js";
69
+ import { PathDisplayType } from "../PathDisplayType.js";
70
+ import EntityBuilder from "../../../../ecs/EntityBuilder.js";
71
+ import { BehaviorComponent } from "../../../../intelligence/behavior/ecs/BehaviorComponent.js";
72
+ import { pingpong } from "../../../../../core/math/pingpong.js";
73
+ import { PathEvents } from "../../../../navigation/ecs/components/PathEvents.js";
74
+
75
+ const engineHarness = new EngineHarness();
76
+
77
+ function makeConfig(engine) {
78
+
79
+ const config = new EngineConfiguration();
80
+
81
+ /**
82
+ *
83
+ * @type {SoundEngine}
84
+ */
85
+ const sound = engine.sound;
86
+ const graphics = engine.graphics;
87
+ const assetManager = engine.assetManager;
88
+ const devices = engine.devices;
89
+
90
+ const guiSystem = new GUIElementSystem(engine.gui.view, engine);
91
+ const headsUpDisplaySystem = new HeadsUpDisplaySystem(graphics);
92
+
93
+ config.systems.push(
94
+ new ScriptSystem(),
95
+ new FacingDirectionSystem(),
96
+ new PathFollowingSystem(),
97
+ new SteeringSystem(),
98
+ new MotionSystem(),
99
+ new TagSystem(),
100
+ new AttachmentSystem(),
101
+ new SoundEmitterSystem(assetManager, sound.destination, sound.context),
102
+ new SoundControllerSystem(),
103
+ new SoundListenerSystem(sound.context),
104
+ new TimerSystem(),
105
+ guiSystem,
106
+ new AnimationSystem(graphics.viewport.size),
107
+ new TopDownCameraControllerSystem(graphics),
108
+ new TopDownCameraLanderSystem(),
109
+ new CameraSystem(graphics.scene, graphics),
110
+ new MeshSystem(engine),
111
+ new ClingToTerrainSystem(),
112
+ new TerrainSystem(graphics, assetManager),
113
+ new WaterSystem(graphics),
114
+ new Trail2DSystem(engine),
115
+ new Foliage2System(assetManager, graphics),
116
+ new ViewportPositionSystem(graphics.viewport.size),
117
+ new GridPosition2TransformSystem(),
118
+ new Transform2GridPositionSystem(),
119
+ new SynchronizePositionSystem(),
120
+ new GridObstacleSystem(),
121
+ new GridPositionSystem(),
122
+ new InputControllerSystem(devices),
123
+ new InputSystem(devices),
124
+ new MeshHighlightSystem(engine),
125
+ new LightSystem(engine, {
126
+ shadowResolution: 1024
127
+ }),
128
+ new AnimationControllerSystem(),
129
+ new AnimationGraphSystem(graphics.viewport.size),
130
+ headsUpDisplaySystem,
131
+ new BehaviorSystem(engine),
132
+ new SerializationMetadataSystem(),
133
+ new InverseKinematicsSystem(),
134
+ new PathDisplaySystem(engine),
135
+ );
136
+
137
+ // Plugins
138
+
139
+ config.addPlugin(AmbientOcclusionPostProcessEffect)
140
+
141
+ // Knowledge
142
+
143
+ // Assets
144
+
145
+ config.addLoader(GameAssetType.ModelGLTF, new GLTFAssetLoader());
146
+ config.addLoader(GameAssetType.ModelGLTF_JSON, new GLTFAssetLoader());
147
+ config.addLoader(GameAssetType.JSON, new JsonAssetLoader());
148
+ config.addLoader(GameAssetType.Texture, new TextureAssetLoader());
149
+ config.addLoader(GameAssetType.Image, new ImageRGBADataLoader());
150
+
151
+ return config;
152
+ }
153
+
154
+ /**
155
+ *
156
+ * @param {EngineHarness} harness
157
+ * @return {Promise<void>}
158
+ */
159
+ async function init(harness) {
160
+ const engine = harness.engine;
161
+
162
+ // engine.entityManager.addSystem(new RenderSystem(engine.graphics));
163
+ engine.entityManager.addSystem(new ShadedGeometrySystem(engine));
164
+
165
+ makeEngineOptionsModel(engine.options, engine);
166
+
167
+ await makeConfig(engine).apply(engine);
168
+
169
+ enableEditor(engine);
170
+
171
+ await harness.initialize();
172
+
173
+ main(engine);
174
+ }
175
+
176
+ function catmullRom(points) {
177
+ const cv = new CanvasView();
178
+
179
+ cv.size.set(500, 500);
180
+
181
+ cv.link();
182
+
183
+ cv.css({
184
+ position: "absolute",
185
+ left: 0,
186
+ right: 0,
187
+ zIndex: 99999
188
+ });
189
+
190
+ const sample = [];
191
+
192
+ const ctx = cv.context2d;
193
+ ctx.strokeStyle = "rgba(255,255,255,1)";
194
+ ctx.lineWidth = 2;
195
+ ctx.beginPath();
196
+
197
+ const draw_scale = 50;
198
+
199
+ const result = [];
200
+ const sampleCount = 50;
201
+
202
+ computeCatmullRomSpline(result, points, points.length / 3, 3, sampleCount, 0.5);
203
+
204
+ for (let i = 0; i < sampleCount; i++) {
205
+ const x = result[i * 3];
206
+ const y = result[i * 3 + 1];
207
+ const z = result[i * 3 + 2];
208
+
209
+ ctx.lineTo(x * draw_scale, z * draw_scale);
210
+
211
+ }
212
+ ctx.stroke();
213
+
214
+ document.body.appendChild(cv.el);
215
+ }
216
+
217
+ function sample_style_entity() {
218
+ const style = new EntityPathStyle();
219
+ style.spacing = 0.6;
220
+ style.marker_start = EntityPathMarkerDefinition.from({
221
+ blueprint: EntityBlueprint.from([
222
+ Transform.fromJSON({}),
223
+ Mesh.fromJSON({
224
+ url: "data/models/arrow-symbols/arrow4/model-green.gltf",
225
+ castShadow: true,
226
+ receiveShadow: true
227
+ })
228
+ ]),
229
+ transform: Transform.fromJSON({
230
+ scale: {
231
+ x: 0.3,
232
+ y: 0.3,
233
+ z: 0.3
234
+ },
235
+ rotation: {
236
+ x: 0.5,
237
+ y: -0.5,
238
+ z: 0.5,
239
+ w: 0.5
240
+ },
241
+ position: {
242
+ x: 0,
243
+ y: 1,
244
+ z: 0
245
+ }
246
+ })
247
+ });
248
+ style.marker_end = EntityPathMarkerDefinition.from({
249
+ blueprint: EntityBlueprint.from([
250
+ Transform.fromJSON({}),
251
+ Mesh.fromJSON({
252
+ url: "data/models/arrow-symbols/arrow4/model-red.gltf",
253
+ castShadow: true,
254
+ receiveShadow: true
255
+ })
256
+ ]),
257
+ transform: Transform.fromJSON({
258
+ scale: {
259
+ x: 0.3,
260
+ y: 0.3,
261
+ z: 0.3
262
+ },
263
+ rotation: {
264
+ x: 0.5,
265
+ y: -0.5,
266
+ z: 0.5,
267
+ w: 0.5
268
+ },
269
+ position: {
270
+ x: 0,
271
+ y: 1,
272
+ z: 0
273
+ }
274
+ })
275
+ });
276
+ style.marker_main = EntityPathMarkerDefinition.from({
277
+ blueprint: EntityBlueprint.from([
278
+ Transform.fromJSON({}),
279
+ Mesh.fromJSON({
280
+ url: "data/models/Barel-Roll Droid/handpainted.gltf",
281
+ castShadow: true,
282
+ receiveShadow: true
283
+ }),
284
+ Animation.fromJSON({
285
+ clips: [
286
+ {
287
+ name: "fly",
288
+ repeatCount: Infinity
289
+ }
290
+ ]
291
+ }),
292
+ Highlight.fromOne(1, 0, 0, 1)
293
+ ]),
294
+ transform: Transform.fromJSON({
295
+ scale: {
296
+ x: 0.2,
297
+ y: 0.2,
298
+ z: 0.2
299
+ },
300
+ position: {
301
+ x: 0,
302
+ y: 1,
303
+ z: 0
304
+ }
305
+ })
306
+ });
307
+
308
+ return style;
309
+ }
310
+
311
+ function sample_style_tube() {
312
+ const style = new TubePathStyle();
313
+
314
+ style.color.setRGB(1, 1, 1);
315
+ style.material_type = TubeMaterialType.Matcap;
316
+ style.material = new MatcapMaterialDefinition();
317
+ // style.material.texture = 'data/textures/matcap/matcap-porcelain-white.jpg';
318
+ style.material.texture = "data/textures/matcap/nidorx/3E2335_D36A1B_8E4A2E_2842A5.jpg";
319
+
320
+ style.width = 0.1;
321
+
322
+ style.path_mask = [
323
+ 0, 1,
324
+ ];
325
+
326
+ return style;
327
+ }
328
+
329
+
330
+ function main(engine) {
331
+ EngineHarness.buildBasics({ engine });
332
+
333
+ const _p = new Path();
334
+ _p.interpolation = InterpolationType.CatmullRom;
335
+ // _p.interpolation = InterpolationType.Linear;
336
+
337
+ // _p.setPositionsFromVectorArray(Path.smoothPath([
338
+ // new Vector3(3, 1, 1),
339
+ // new Vector3(3, 1, 3),
340
+ // new Vector3(7, 1, 3),
341
+ // new Vector3(7, 1, 7),
342
+ // new Vector3(3, 1, 7),
343
+ // new Vector3(3, 1, 8),
344
+ // ], 50));
345
+
346
+ _p.setPositionsFromVectorArray([
347
+ new Vector3(3, 1, 1),
348
+ new Vector3(3, 1, 3),
349
+ new Vector3(7, 1, 3),
350
+ new Vector3(7, 1, 7),
351
+ new Vector3(3, 1, 7),
352
+ new Vector3(3, 1, 8),
353
+ ]);
354
+
355
+
356
+ const trailPathStyle = new RibbonPathStyle();
357
+ trailPathStyle.material.diffuse = "data/textures/trail/Circle_04.png";
358
+ trailPathStyle.resolution = 10;
359
+ trailPathStyle.thickness = 0.1;
360
+
361
+ const pathDisplay = new PathDisplay();
362
+ const tube_style = sample_style_tube();
363
+ pathDisplay.specs.push(
364
+ PathDisplaySpec.from(
365
+ PathDisplayType.Tube,
366
+ tube_style
367
+ )
368
+ );
369
+
370
+
371
+ const path_entity = new EntityBuilder();
372
+
373
+ const ecd = engine.entityManager.dataset;
374
+ path_entity
375
+ .add(_p)
376
+ .add(pathDisplay)
377
+ .build(ecd);
378
+
379
+ let time = 0;
380
+ new EntityBuilder()
381
+ .add(BehaviorComponent.looping_function((delta) => {
382
+ time += delta*0.01;
383
+ tube_style.path_mask[1] = pingpong(time, 1);
384
+
385
+ path_entity.sendEvent(PathEvents.Changed);
386
+ }))
387
+ .build(ecd)
388
+ }
389
+
390
+ init(engineHarness);