@ifc-lite/renderer 1.6.0 → 1.7.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 (42) hide show
  1. package/README.md +40 -0
  2. package/dist/camera-animation.d.ts +108 -0
  3. package/dist/camera-animation.d.ts.map +1 -0
  4. package/dist/camera-animation.js +606 -0
  5. package/dist/camera-animation.js.map +1 -0
  6. package/dist/camera-controls.d.ts +75 -0
  7. package/dist/camera-controls.d.ts.map +1 -0
  8. package/dist/camera-controls.js +239 -0
  9. package/dist/camera-controls.js.map +1 -0
  10. package/dist/camera-projection.d.ts +51 -0
  11. package/dist/camera-projection.d.ts.map +1 -0
  12. package/dist/camera-projection.js +147 -0
  13. package/dist/camera-projection.js.map +1 -0
  14. package/dist/camera.d.ts +33 -45
  15. package/dist/camera.d.ts.map +1 -1
  16. package/dist/camera.js +128 -815
  17. package/dist/camera.js.map +1 -1
  18. package/dist/geometry-manager.d.ts +99 -0
  19. package/dist/geometry-manager.d.ts.map +1 -0
  20. package/dist/geometry-manager.js +387 -0
  21. package/dist/geometry-manager.js.map +1 -0
  22. package/dist/index.d.ts +7 -19
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +50 -658
  25. package/dist/index.js.map +1 -1
  26. package/dist/math.d.ts +6 -0
  27. package/dist/math.d.ts.map +1 -1
  28. package/dist/math.js +20 -0
  29. package/dist/math.js.map +1 -1
  30. package/dist/picking-manager.d.ts +31 -0
  31. package/dist/picking-manager.d.ts.map +1 -0
  32. package/dist/picking-manager.js +140 -0
  33. package/dist/picking-manager.js.map +1 -0
  34. package/dist/raycast-engine.d.ts +76 -0
  35. package/dist/raycast-engine.d.ts.map +1 -0
  36. package/dist/raycast-engine.js +255 -0
  37. package/dist/raycast-engine.js.map +1 -0
  38. package/dist/scene.d.ts +8 -1
  39. package/dist/scene.d.ts.map +1 -1
  40. package/dist/scene.js +59 -25
  41. package/dist/scene.js.map +1 -1
  42. package/package.json +4 -4
@@ -0,0 +1,606 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Manages camera animations: tweened transitions between positions,
6
+ * inertia/momentum after user interaction, preset view switching
7
+ * with rotation cycling, and first-person movement.
8
+ */
9
+ export class CameraAnimator {
10
+ state;
11
+ updateMatrices;
12
+ controls;
13
+ projection;
14
+ // Inertia system
15
+ velocity = { orbit: { x: 0, y: 0 }, pan: { x: 0, y: 0 }, zoom: 0 };
16
+ damping = 0.92; // Inertia factor (0-1), higher = more damping
17
+ minVelocity = 0.001; // Minimum velocity threshold
18
+ // Animation system
19
+ animationStartTime = 0;
20
+ animationDuration = 0;
21
+ animationStartPos = null;
22
+ animationStartTarget = null;
23
+ animationEndPos = null;
24
+ animationEndTarget = null;
25
+ animationStartUp = null;
26
+ animationEndUp = null;
27
+ animationEasing = null;
28
+ // First-person mode
29
+ isFirstPersonMode = false;
30
+ firstPersonSpeed = 0.1;
31
+ // Track preset view for rotation cycling (clicking same view rotates 90 degrees)
32
+ lastPresetView = null;
33
+ presetViewRotation = 0; // 0, 1, 2, 3 = 0, 90, 180, 270 degrees
34
+ constructor(state, updateMatrices, controls, projection) {
35
+ this.state = state;
36
+ this.updateMatrices = updateMatrices;
37
+ this.controls = controls;
38
+ this.projection = projection;
39
+ }
40
+ // --- Velocity management (called by Camera class) ---
41
+ addOrbitVelocity(deltaX, deltaY) {
42
+ this.velocity.orbit.x += deltaX * 0.001;
43
+ this.velocity.orbit.y += deltaY * 0.001;
44
+ }
45
+ addPanVelocity(deltaX, deltaY, panSpeed) {
46
+ this.velocity.pan.x += deltaX * panSpeed * 0.1;
47
+ this.velocity.pan.y += deltaY * panSpeed * 0.1;
48
+ }
49
+ addZoomVelocity(normalizedDelta) {
50
+ this.velocity.zoom += normalizedDelta * 0.1;
51
+ }
52
+ /**
53
+ * Reset preset view tracking (called when user orbits)
54
+ */
55
+ resetPresetTracking() {
56
+ this.lastPresetView = null;
57
+ this.presetViewRotation = 0;
58
+ }
59
+ /**
60
+ * Update camera animation and inertia
61
+ * Returns true if camera is still animating
62
+ */
63
+ update(_deltaTime) {
64
+ // deltaTime reserved for future physics-based animation smoothing
65
+ void _deltaTime;
66
+ let isAnimating = false;
67
+ // Handle animation
68
+ if (this.animationStartTime > 0 && this.animationDuration > 0) {
69
+ const elapsed = Date.now() - this.animationStartTime;
70
+ const progress = Math.min(elapsed / this.animationDuration, 1);
71
+ if (progress < 1 && this.animationStartPos && this.animationEndPos &&
72
+ this.animationStartTarget && this.animationEndTarget && this.animationEasing) {
73
+ const t = this.animationEasing(progress);
74
+ this.state.camera.position.x = this.animationStartPos.x + (this.animationEndPos.x - this.animationStartPos.x) * t;
75
+ this.state.camera.position.y = this.animationStartPos.y + (this.animationEndPos.y - this.animationStartPos.y) * t;
76
+ this.state.camera.position.z = this.animationStartPos.z + (this.animationEndPos.z - this.animationStartPos.z) * t;
77
+ this.state.camera.target.x = this.animationStartTarget.x + (this.animationEndTarget.x - this.animationStartTarget.x) * t;
78
+ this.state.camera.target.y = this.animationStartTarget.y + (this.animationEndTarget.y - this.animationStartTarget.y) * t;
79
+ this.state.camera.target.z = this.animationStartTarget.z + (this.animationEndTarget.z - this.animationStartTarget.z) * t;
80
+ // Interpolate up vector if animating with up
81
+ if (this.animationStartUp && this.animationEndUp) {
82
+ // SLERP-like interpolation for up vector (normalized lerp)
83
+ const upX = this.animationStartUp.x + (this.animationEndUp.x - this.animationStartUp.x) * t;
84
+ const upY = this.animationStartUp.y + (this.animationEndUp.y - this.animationStartUp.y) * t;
85
+ const upZ = this.animationStartUp.z + (this.animationEndUp.z - this.animationStartUp.z) * t;
86
+ // Normalize
87
+ const len = Math.sqrt(upX * upX + upY * upY + upZ * upZ);
88
+ if (len > 0.0001) {
89
+ this.state.camera.up.x = upX / len;
90
+ this.state.camera.up.y = upY / len;
91
+ this.state.camera.up.z = upZ / len;
92
+ }
93
+ }
94
+ this.updateMatrices();
95
+ isAnimating = true;
96
+ }
97
+ else {
98
+ // Animation complete - set final values
99
+ if (this.animationEndPos) {
100
+ this.state.camera.position.x = this.animationEndPos.x;
101
+ this.state.camera.position.y = this.animationEndPos.y;
102
+ this.state.camera.position.z = this.animationEndPos.z;
103
+ }
104
+ if (this.animationEndTarget) {
105
+ this.state.camera.target.x = this.animationEndTarget.x;
106
+ this.state.camera.target.y = this.animationEndTarget.y;
107
+ this.state.camera.target.z = this.animationEndTarget.z;
108
+ }
109
+ if (this.animationEndUp) {
110
+ this.state.camera.up.x = this.animationEndUp.x;
111
+ this.state.camera.up.y = this.animationEndUp.y;
112
+ this.state.camera.up.z = this.animationEndUp.z;
113
+ }
114
+ this.updateMatrices();
115
+ this.animationStartTime = 0;
116
+ this.animationDuration = 0;
117
+ this.animationStartPos = null;
118
+ this.animationEndPos = null;
119
+ this.animationStartTarget = null;
120
+ this.animationEndTarget = null;
121
+ this.animationStartUp = null;
122
+ this.animationEndUp = null;
123
+ this.animationEasing = null;
124
+ }
125
+ }
126
+ // Apply inertia
127
+ if (Math.abs(this.velocity.orbit.x) > this.minVelocity || Math.abs(this.velocity.orbit.y) > this.minVelocity) {
128
+ this.resetPresetTracking();
129
+ this.controls.orbit(this.velocity.orbit.x * 100, this.velocity.orbit.y * 100);
130
+ this.velocity.orbit.x *= this.damping;
131
+ this.velocity.orbit.y *= this.damping;
132
+ isAnimating = true;
133
+ }
134
+ if (Math.abs(this.velocity.pan.x) > this.minVelocity || Math.abs(this.velocity.pan.y) > this.minVelocity) {
135
+ this.controls.pan(this.velocity.pan.x * 1000, this.velocity.pan.y * 1000);
136
+ this.velocity.pan.x *= this.damping;
137
+ this.velocity.pan.y *= this.damping;
138
+ isAnimating = true;
139
+ }
140
+ if (Math.abs(this.velocity.zoom) > this.minVelocity) {
141
+ this.controls.zoom(this.velocity.zoom * 1000);
142
+ this.velocity.zoom *= this.damping;
143
+ isAnimating = true;
144
+ }
145
+ return isAnimating;
146
+ }
147
+ /**
148
+ * Animate camera to fit bounds (southeast isometric view)
149
+ * Y-up coordinate system
150
+ */
151
+ async zoomToFit(min, max, duration = 500) {
152
+ const center = {
153
+ x: (min.x + max.x) / 2,
154
+ y: (min.y + max.y) / 2,
155
+ z: (min.z + max.z) / 2,
156
+ };
157
+ const size = {
158
+ x: max.x - min.x,
159
+ y: max.y - min.y,
160
+ z: max.z - min.z,
161
+ };
162
+ const maxSize = Math.max(size.x, size.y, size.z);
163
+ const distance = maxSize * 2.0;
164
+ const endTarget = center;
165
+ // Southeast isometric view for Y-up (same as fitToBounds)
166
+ const endPos = {
167
+ x: center.x + distance * 0.6,
168
+ y: center.y + distance * 0.5,
169
+ z: center.z + distance * 0.6,
170
+ };
171
+ return this.animateTo(endPos, endTarget, duration);
172
+ }
173
+ /**
174
+ * Frame/center view on a point (keeps current distance and direction)
175
+ * Standard CAD "Frame Selection" behavior
176
+ */
177
+ async framePoint(point, duration = 300) {
178
+ // Keep current viewing direction and distance
179
+ const dir = {
180
+ x: this.state.camera.position.x - this.state.camera.target.x,
181
+ y: this.state.camera.position.y - this.state.camera.target.y,
182
+ z: this.state.camera.position.z - this.state.camera.target.z,
183
+ };
184
+ // New position: point + current offset
185
+ const endPos = {
186
+ x: point.x + dir.x,
187
+ y: point.y + dir.y,
188
+ z: point.z + dir.z,
189
+ };
190
+ return this.animateTo(endPos, point, duration);
191
+ }
192
+ /**
193
+ * Frame selection - zoom to fit bounds while keeping current view direction
194
+ * This is what "Frame Selection" should do - zoom to fill screen
195
+ */
196
+ async frameBounds(min, max, duration = 300) {
197
+ const center = {
198
+ x: (min.x + max.x) / 2,
199
+ y: (min.y + max.y) / 2,
200
+ z: (min.z + max.z) / 2,
201
+ };
202
+ const size = {
203
+ x: max.x - min.x,
204
+ y: max.y - min.y,
205
+ z: max.z - min.z,
206
+ };
207
+ const maxSize = Math.max(size.x, size.y, size.z);
208
+ if (maxSize < 1e-6) {
209
+ // Very small or zero size - just center on it
210
+ return this.framePoint(center, duration);
211
+ }
212
+ // Calculate required distance based on FOV to fit bounds
213
+ const fovFactor = Math.tan(this.state.camera.fov / 2);
214
+ const distance = (maxSize / 2) / fovFactor * 1.2; // 1.2x padding for nice framing
215
+ // Get current viewing direction from view matrix (more reliable than position-target)
216
+ // View matrix forward is -Z axis in view space
217
+ const viewMatrix = this.state.viewMatrix.m;
218
+ // Extract forward direction from view matrix (negative Z column, normalized)
219
+ let dir = {
220
+ x: -viewMatrix[8], // -m[2][0] (forward X)
221
+ y: -viewMatrix[9], // -m[2][1] (forward Y)
222
+ z: -viewMatrix[10], // -m[2][2] (forward Z)
223
+ };
224
+ const dirLen = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
225
+ // Normalize direction
226
+ if (dirLen > 1e-6) {
227
+ dir.x /= dirLen;
228
+ dir.y /= dirLen;
229
+ dir.z /= dirLen;
230
+ }
231
+ else {
232
+ // Fallback: use position-target if view matrix is invalid
233
+ dir = {
234
+ x: this.state.camera.position.x - this.state.camera.target.x,
235
+ y: this.state.camera.position.y - this.state.camera.target.y,
236
+ z: this.state.camera.position.z - this.state.camera.target.z,
237
+ };
238
+ const fallbackLen = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
239
+ if (fallbackLen > 1e-6) {
240
+ dir.x /= fallbackLen;
241
+ dir.y /= fallbackLen;
242
+ dir.z /= fallbackLen;
243
+ }
244
+ else {
245
+ // Last resort: southeast isometric
246
+ dir.x = 0.6;
247
+ dir.y = 0.5;
248
+ dir.z = 0.6;
249
+ const len = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
250
+ dir.x /= len;
251
+ dir.y /= len;
252
+ dir.z /= len;
253
+ }
254
+ }
255
+ // New position: center + direction * distance
256
+ const endPos = {
257
+ x: center.x + dir.x * distance,
258
+ y: center.y + dir.y * distance,
259
+ z: center.z + dir.z * distance,
260
+ };
261
+ return this.animateTo(endPos, center, duration);
262
+ }
263
+ async zoomExtent(min, max, duration = 300) {
264
+ const center = {
265
+ x: (min.x + max.x) / 2,
266
+ y: (min.y + max.y) / 2,
267
+ z: (min.z + max.z) / 2,
268
+ };
269
+ const size = {
270
+ x: max.x - min.x,
271
+ y: max.y - min.y,
272
+ z: max.z - min.z,
273
+ };
274
+ const maxSize = Math.max(size.x, size.y, size.z);
275
+ // Calculate required distance based on FOV
276
+ const fovFactor = Math.tan(this.state.camera.fov / 2);
277
+ const distance = (maxSize / 2) / fovFactor * 1.5; // 1.5x for padding
278
+ // Update near/far planes dynamically
279
+ this.projection.updateNearFarPlanes(distance);
280
+ // Keep current viewing direction
281
+ const dir = {
282
+ x: this.state.camera.position.x - this.state.camera.target.x,
283
+ y: this.state.camera.position.y - this.state.camera.target.y,
284
+ z: this.state.camera.position.z - this.state.camera.target.z,
285
+ };
286
+ const currentDistance = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
287
+ // Normalize direction
288
+ if (currentDistance > 1e-10) {
289
+ dir.x /= currentDistance;
290
+ dir.y /= currentDistance;
291
+ dir.z /= currentDistance;
292
+ }
293
+ else {
294
+ // Fallback direction
295
+ dir.x = 0.6;
296
+ dir.y = 0.5;
297
+ dir.z = 0.6;
298
+ const len = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
299
+ dir.x /= len;
300
+ dir.y /= len;
301
+ dir.z /= len;
302
+ }
303
+ // New position: center + direction * distance
304
+ const endPos = {
305
+ x: center.x + dir.x * distance,
306
+ y: center.y + dir.y * distance,
307
+ z: center.z + dir.z * distance,
308
+ };
309
+ return this.animateTo(endPos, center, duration);
310
+ }
311
+ /**
312
+ * Animate camera to position and target
313
+ */
314
+ async animateTo(endPos, endTarget, duration = 500) {
315
+ this.animationStartPos = { ...this.state.camera.position };
316
+ this.animationStartTarget = { ...this.state.camera.target };
317
+ this.animationEndPos = endPos;
318
+ this.animationEndTarget = endTarget;
319
+ this.animationStartUp = null;
320
+ this.animationEndUp = null;
321
+ this.animationDuration = duration;
322
+ this.animationStartTime = Date.now();
323
+ this.animationEasing = this.easeOutCubic;
324
+ // Wait for animation to complete
325
+ return new Promise((resolve) => {
326
+ const checkAnimation = () => {
327
+ if (this.animationStartTime === 0) {
328
+ resolve();
329
+ }
330
+ else {
331
+ requestAnimationFrame(checkAnimation);
332
+ }
333
+ };
334
+ checkAnimation();
335
+ });
336
+ }
337
+ /**
338
+ * Animate camera to position, target, and up vector (for orthogonal preset views)
339
+ */
340
+ async animateToWithUp(endPos, endTarget, endUp, duration = 500) {
341
+ // Clear all velocities to prevent inertia from interfering with animation
342
+ this.velocity.orbit.x = 0;
343
+ this.velocity.orbit.y = 0;
344
+ this.velocity.pan.x = 0;
345
+ this.velocity.pan.y = 0;
346
+ this.velocity.zoom = 0;
347
+ this.animationStartPos = { ...this.state.camera.position };
348
+ this.animationStartTarget = { ...this.state.camera.target };
349
+ this.animationStartUp = { ...this.state.camera.up };
350
+ this.animationEndPos = endPos;
351
+ this.animationEndTarget = endTarget;
352
+ this.animationEndUp = endUp;
353
+ this.animationDuration = duration;
354
+ this.animationStartTime = Date.now();
355
+ this.animationEasing = this.easeOutCubic;
356
+ // Wait for animation to complete
357
+ return new Promise((resolve) => {
358
+ const checkAnimation = () => {
359
+ if (this.animationStartTime === 0) {
360
+ resolve();
361
+ }
362
+ else {
363
+ requestAnimationFrame(checkAnimation);
364
+ }
365
+ };
366
+ checkAnimation();
367
+ });
368
+ }
369
+ /**
370
+ * Easing function: easeOutCubic
371
+ */
372
+ easeOutCubic(t) {
373
+ return 1 - Math.pow(1 - t, 3);
374
+ }
375
+ /**
376
+ * Set first-person mode
377
+ */
378
+ enableFirstPersonMode(enabled) {
379
+ this.isFirstPersonMode = enabled;
380
+ }
381
+ /**
382
+ * Move in first-person mode (Y-up coordinate system)
383
+ */
384
+ moveFirstPerson(forward, right, up) {
385
+ if (!this.isFirstPersonMode)
386
+ return;
387
+ const dir = {
388
+ x: this.state.camera.target.x - this.state.camera.position.x,
389
+ y: this.state.camera.target.y - this.state.camera.position.y,
390
+ z: this.state.camera.target.z - this.state.camera.position.z,
391
+ };
392
+ const len = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
393
+ if (len > 1e-10) {
394
+ dir.x /= len;
395
+ dir.y /= len;
396
+ dir.z /= len;
397
+ }
398
+ // Right vector: cross product of direction and up (0,1,0)
399
+ const rightVec = {
400
+ x: -dir.z,
401
+ y: 0,
402
+ z: dir.x,
403
+ };
404
+ const rightLen = Math.sqrt(rightVec.x * rightVec.x + rightVec.z * rightVec.z);
405
+ if (rightLen > 1e-10) {
406
+ rightVec.x /= rightLen;
407
+ rightVec.z /= rightLen;
408
+ }
409
+ // Up vector: cross product of right and direction
410
+ const upVec = {
411
+ x: (rightVec.z * dir.y - rightVec.y * dir.z),
412
+ y: (rightVec.x * dir.z - rightVec.z * dir.x),
413
+ z: (rightVec.y * dir.x - rightVec.x * dir.y),
414
+ };
415
+ const speed = this.firstPersonSpeed;
416
+ this.state.camera.position.x += (dir.x * forward + rightVec.x * right + upVec.x * up) * speed;
417
+ this.state.camera.position.y += (dir.y * forward + rightVec.y * right + upVec.y * up) * speed;
418
+ this.state.camera.position.z += (dir.z * forward + rightVec.z * right + upVec.z * up) * speed;
419
+ this.state.camera.target.x += (dir.x * forward + rightVec.x * right + upVec.x * up) * speed;
420
+ this.state.camera.target.y += (dir.y * forward + rightVec.y * right + upVec.y * up) * speed;
421
+ this.state.camera.target.z += (dir.z * forward + rightVec.z * right + upVec.z * up) * speed;
422
+ this.updateMatrices();
423
+ }
424
+ /**
425
+ * Set preset view with explicit bounds (Y-up coordinate system)
426
+ * Clicking the same view again rotates 90 degrees around the view axis
427
+ * @param buildingRotation Optional building rotation in radians (from IfcSite placement)
428
+ */
429
+ setPresetView(view, bounds, buildingRotation) {
430
+ const useBounds = bounds || this.getCurrentBounds();
431
+ if (!useBounds) {
432
+ console.warn('[Camera] No bounds available for setPresetView');
433
+ return;
434
+ }
435
+ // Check if clicking the same view again - cycle rotation
436
+ if (this.lastPresetView === view) {
437
+ this.presetViewRotation = (this.presetViewRotation + 1) % 4;
438
+ }
439
+ else {
440
+ this.lastPresetView = view;
441
+ this.presetViewRotation = 0;
442
+ }
443
+ const center = {
444
+ x: (useBounds.min.x + useBounds.max.x) / 2,
445
+ y: (useBounds.min.y + useBounds.max.y) / 2,
446
+ z: (useBounds.min.z + useBounds.max.z) / 2,
447
+ };
448
+ const size = {
449
+ x: useBounds.max.x - useBounds.min.x,
450
+ y: useBounds.max.y - useBounds.min.y,
451
+ z: useBounds.max.z - useBounds.min.z,
452
+ };
453
+ const maxSize = Math.max(size.x, size.y, size.z);
454
+ // Calculate distance based on FOV for proper fit
455
+ const fovFactor = Math.tan(this.state.camera.fov / 2);
456
+ const distance = (maxSize / 2) / fovFactor * 1.5; // 1.5x for padding
457
+ let endPos;
458
+ const endTarget = center;
459
+ // WebGL uses Y-up coordinate system internally
460
+ // We set both position AND up vector for proper orthogonal views
461
+ let upVector = { x: 0, y: 1, z: 0 }; // Default Y-up
462
+ // Up vector rotation options for top/bottom views (rotate around Y axis)
463
+ // 0: -Z, 1: -X, 2: +Z, 3: +X
464
+ const topUpVectors = [
465
+ { x: 0, y: 0, z: -1 }, // 0 degrees - North up
466
+ { x: -1, y: 0, z: 0 }, // 90 degrees - West up
467
+ { x: 0, y: 0, z: 1 }, // 180 degrees - South up
468
+ { x: 1, y: 0, z: 0 }, // 270 degrees - East up
469
+ ];
470
+ const bottomUpVectors = [
471
+ { x: 0, y: 0, z: 1 }, // 0 degrees - South up
472
+ { x: 1, y: 0, z: 0 }, // 90 degrees - East up
473
+ { x: 0, y: 0, z: -1 }, // 180 degrees - North up
474
+ { x: -1, y: 0, z: 0 }, // 270 degrees - West up
475
+ ];
476
+ // Apply building rotation if present (rotate around Y axis)
477
+ const cosR = buildingRotation !== undefined && buildingRotation !== 0 ? Math.cos(buildingRotation) : 1.0;
478
+ const sinR = buildingRotation !== undefined && buildingRotation !== 0 ? Math.sin(buildingRotation) : 0.0;
479
+ switch (view) {
480
+ case 'top': {
481
+ // Top view: looking straight down from above (+Y)
482
+ // Counter-rotate up vector by NEGATIVE building rotation to align with building axes
483
+ const topUp = topUpVectors[this.presetViewRotation];
484
+ endPos = { x: center.x, y: center.y + distance, z: center.z };
485
+ upVector = {
486
+ x: topUp.x * cosR + topUp.z * sinR,
487
+ y: topUp.y,
488
+ z: -topUp.x * sinR + topUp.z * cosR,
489
+ };
490
+ break;
491
+ }
492
+ case 'bottom': {
493
+ // Bottom view: looking straight up from below (-Y)
494
+ // Counter-rotate up vector by NEGATIVE building rotation to align with building axes
495
+ const bottomUp = bottomUpVectors[this.presetViewRotation];
496
+ endPos = { x: center.x, y: center.y - distance, z: center.z };
497
+ upVector = {
498
+ x: bottomUp.x * cosR + bottomUp.z * sinR,
499
+ y: bottomUp.y,
500
+ z: -bottomUp.x * sinR + bottomUp.z * cosR,
501
+ };
502
+ break;
503
+ }
504
+ case 'front':
505
+ // Front view: from +Z looking at model
506
+ // Rotate camera position around Y axis by building rotation
507
+ // Standard rotation: x' = x*cos - z*sin, z' = x*sin + z*cos
508
+ // For +Z direction (0,0,1): x' = -sin, z' = cos
509
+ // But we need to look at building's front, so use negative rotation
510
+ endPos = {
511
+ x: center.x + sinR * distance,
512
+ y: center.y,
513
+ z: center.z + cosR * distance,
514
+ };
515
+ upVector = { x: 0, y: 1, z: 0 }; // Y-up
516
+ break;
517
+ case 'back':
518
+ // Back view: from -Z looking at model
519
+ // For -Z direction (0,0,-1) rotated: x' = sin, z' = -cos
520
+ endPos = {
521
+ x: center.x - sinR * distance,
522
+ y: center.y,
523
+ z: center.z - cosR * distance,
524
+ };
525
+ upVector = { x: 0, y: 1, z: 0 }; // Y-up
526
+ break;
527
+ case 'left':
528
+ // Left view: from -X looking at model
529
+ // For -X direction (-1,0,0) rotated: x' = -cos, z' = sin
530
+ endPos = {
531
+ x: center.x - cosR * distance,
532
+ y: center.y,
533
+ z: center.z + sinR * distance,
534
+ };
535
+ upVector = { x: 0, y: 1, z: 0 }; // Y-up
536
+ break;
537
+ case 'right':
538
+ // Right view: from +X looking at model
539
+ // For +X direction (1,0,0) rotated: x' = cos, z' = -sin
540
+ endPos = {
541
+ x: center.x + cosR * distance,
542
+ y: center.y,
543
+ z: center.z - sinR * distance,
544
+ };
545
+ upVector = { x: 0, y: 1, z: 0 }; // Y-up
546
+ break;
547
+ }
548
+ this.animateToWithUp(endPos, endTarget, upVector, 300);
549
+ }
550
+ /**
551
+ * Get current bounds estimate (simplified - in production would use scene bounds)
552
+ */
553
+ getCurrentBounds() {
554
+ // Estimate bounds from camera distance
555
+ const dir = {
556
+ x: this.state.camera.position.x - this.state.camera.target.x,
557
+ y: this.state.camera.position.y - this.state.camera.target.y,
558
+ z: this.state.camera.position.z - this.state.camera.target.z,
559
+ };
560
+ const distance = Math.sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
561
+ const size = distance / 2;
562
+ return {
563
+ min: {
564
+ x: this.state.camera.target.x - size,
565
+ y: this.state.camera.target.y - size,
566
+ z: this.state.camera.target.z - size,
567
+ },
568
+ max: {
569
+ x: this.state.camera.target.x + size,
570
+ y: this.state.camera.target.y + size,
571
+ z: this.state.camera.target.z + size,
572
+ },
573
+ };
574
+ }
575
+ /**
576
+ * Reset velocity (stop inertia)
577
+ */
578
+ stopInertia() {
579
+ this.velocity.orbit.x = 0;
580
+ this.velocity.orbit.y = 0;
581
+ this.velocity.pan.x = 0;
582
+ this.velocity.pan.y = 0;
583
+ this.velocity.zoom = 0;
584
+ }
585
+ /**
586
+ * Reset camera animation state (clear inertia, cancel animations, reset preset tracking)
587
+ * Called when loading a new model to ensure clean state
588
+ */
589
+ reset() {
590
+ this.stopInertia();
591
+ // Cancel any ongoing animations
592
+ this.animationStartTime = 0;
593
+ this.animationDuration = 0;
594
+ this.animationStartPos = null;
595
+ this.animationStartTarget = null;
596
+ this.animationEndPos = null;
597
+ this.animationEndTarget = null;
598
+ this.animationStartUp = null;
599
+ this.animationEndUp = null;
600
+ this.animationEasing = null;
601
+ // Reset preset view tracking
602
+ this.lastPresetView = null;
603
+ this.presetViewRotation = 0;
604
+ }
605
+ }
606
+ //# sourceMappingURL=camera-animation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-animation.js","sourceRoot":"","sources":["../src/camera-animation.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAa/D;;;;GAIG;AACH,MAAM,OAAO,cAAc;IA0BN;IACA;IACA;IACA;IA5BnB,iBAAiB;IACT,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACnE,OAAO,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC9D,WAAW,GAAG,KAAK,CAAC,CAAC,6BAA6B;IAE1D,mBAAmB;IACX,kBAAkB,GAAG,CAAC,CAAC;IACvB,iBAAiB,GAAG,CAAC,CAAC;IACtB,iBAAiB,GAAgB,IAAI,CAAC;IACtC,oBAAoB,GAAgB,IAAI,CAAC;IACzC,eAAe,GAAgB,IAAI,CAAC;IACpC,kBAAkB,GAAgB,IAAI,CAAC;IACvC,gBAAgB,GAAgB,IAAI,CAAC;IACrC,cAAc,GAAgB,IAAI,CAAC;IACnC,eAAe,GAAmC,IAAI,CAAC;IAE/D,oBAAoB;IACZ,iBAAiB,GAAG,KAAK,CAAC;IAC1B,gBAAgB,GAAG,GAAG,CAAC;IAE/B,iFAAiF;IACzE,cAAc,GAAkB,IAAI,CAAC;IACrC,kBAAkB,GAAG,CAAC,CAAC,CAAC,uCAAuC;IAEvE,YACmB,KAA0B,EAC1B,cAA0B,EAC1B,QAAwB,EACxB,UAA4B;QAH5B,UAAK,GAAL,KAAK,CAAqB;QAC1B,mBAAc,GAAd,cAAc,CAAY;QAC1B,aAAQ,GAAR,QAAQ,CAAgB;QACxB,eAAU,GAAV,UAAU,CAAkB;IAC5C,CAAC;IAEJ,uDAAuD;IAEvD,gBAAgB,CAAC,MAAc,EAAE,MAAc;QAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,MAAc,EAAE,QAAgB;QAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,eAAe,CAAC,eAAuB;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,eAAe,GAAG,GAAG,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,UAAkB;QACvB,kEAAkE;QAClE,KAAK,UAAU,CAAC;QAChB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,mBAAmB;QACnB,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAE/D,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,eAAe;gBAChE,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACzH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACzH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAEzH,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACjD,2DAA2D;oBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5F,YAAY;oBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;oBACzD,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC;wBACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;wBACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;wBACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,wCAAwC;gBACxC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACxD,CAAC;gBACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;oBACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;oBACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;oBAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;oBAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7G,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;YACtC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACzG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;YACpC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;YACnC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,GAAS,EAAE,GAAS,EAAE,QAAQ,GAAG,GAAG;QAClD,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SACvB,CAAC;QACF,MAAM,IAAI,GAAG;YACX,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;SACjB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,GAAG,GAAG,CAAC;QAE/B,MAAM,SAAS,GAAG,MAAM,CAAC;QACzB,0DAA0D;QAC1D,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG;YAC5B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG;YAC5B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG;SAC7B,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,KAAW,EAAE,QAAQ,GAAG,GAAG;QAC1C,8CAA8C;QAC9C,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D,CAAC;QAEF,uCAAuC;QACvC,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAClB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAClB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;SACnB,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,GAAS,EAAE,GAAS,EAAE,QAAQ,GAAG,GAAG;QACpD,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SACvB,CAAC;QACF,MAAM,IAAI,GAAG;YACX,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;SACjB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjD,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;YACnB,8CAA8C;YAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,yDAAyD;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,gCAAgC;QAElF,sFAAsF;QACtF,+CAA+C;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3C,6EAA6E;QAC7E,IAAI,GAAG,GAAG;YACR,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAI,uBAAuB;YAC5C,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAI,uBAAuB;YAC5C,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAG,uBAAuB;SAC7C,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAExE,sBAAsB;QACtB,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC;YAClB,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;YAChB,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;YAChB,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,GAAG,GAAG;gBACJ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aAC7D,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;gBACrB,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;gBACrB,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBACZ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBACZ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;gBACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;gBACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACf,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;YAC9B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;YAC9B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;SAC/B,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAS,EAAE,GAAS,EAAE,QAAQ,GAAG,GAAG;QACnD,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SACvB,CAAC;QACF,MAAM,IAAI,GAAG;YACX,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;SACjB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjD,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,mBAAmB;QAErE,qCAAqC;QACrC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAE9C,iCAAiC;QACjC,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjF,sBAAsB;QACtB,IAAI,eAAe,GAAG,KAAK,EAAE,CAAC;YAC5B,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC;YACzB,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC;YACzB,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACZ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACZ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QACf,CAAC;QAED,8CAA8C;QAC9C,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;YAC9B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;YAC9B,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ;SAC/B,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAY,EAAE,SAAe,EAAE,QAAQ,GAAG,GAAG;QAC3D,IAAI,CAAC,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3D,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAEzC,iCAAiC;QACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,qBAAqB,CAAC,cAAc,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,MAAY,EAAE,SAAe,EAAE,KAAW,EAAE,QAAQ,GAAG,GAAG;QAC9E,0EAA0E;QAC1E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3D,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAEzC,iCAAiC;QACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,qBAAqB,CAAC,cAAc,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,CAAS;QAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAgB;QACpC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe,EAAE,KAAa,EAAE,EAAU;QACxD,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpC,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC7D,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QACf,CAAC;QAED,0DAA0D;QAC1D,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACT,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,GAAG,CAAC,CAAC;SACT,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;YACvB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;QACzB,CAAC;QAED,kDAAkD;QAClD,MAAM,KAAK,GAAG;YACZ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;SAC7C,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC9F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC9F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC9F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC5F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC5F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAE5F,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,aAAa,CACX,IAA4D,EAC5D,MAAiC,EACjC,gBAAyB;QAEzB,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,yDAAyD;QACzD,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1C,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1C,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SAC3C,CAAC;QACF,MAAM,IAAI,GAAG;YACX,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;SACrC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjD,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,mBAAmB;QAErE,IAAI,MAAY,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,CAAC;QAEzB,+CAA+C;QAC/C,iEAAiE;QACjE,IAAI,QAAQ,GAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe;QAE1D,yEAAyE;QACzE,6BAA6B;QAC7B,MAAM,YAAY,GAAW;YAC3B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAG,uBAAuB;YAC/C,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAG,uBAAuB;YAC/C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,yBAAyB;YACjD,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,wBAAwB;SACjD,CAAC;QACF,MAAM,eAAe,GAAW;YAC9B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,uBAAuB;YAC/C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,uBAAuB;YAC/C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAG,yBAAyB;YACjD,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAG,wBAAwB;SACjD,CAAC;QAEF,4DAA4D;QAC5D,MAAM,IAAI,GAAG,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACzG,MAAM,IAAI,GAAG,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEzG,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,kDAAkD;gBAClD,qFAAqF;gBACrF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9D,QAAQ,GAAG;oBACT,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI;oBAClC,CAAC,EAAE,KAAK,CAAC,CAAC;oBACV,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI;iBACpC,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,mDAAmD;gBACnD,qFAAqF;gBACrF,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC1D,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9D,QAAQ,GAAG;oBACT,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI;oBACxC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACb,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI;iBAC1C,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,OAAO;gBACV,uCAAuC;gBACvC,4DAA4D;gBAC5D,4DAA4D;gBAC5D,gDAAgD;gBAChD,oEAAoE;gBACpE,MAAM,GAAG;oBACP,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;oBAC7B,CAAC,EAAE,MAAM,CAAC,CAAC;oBACX,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;iBAC9B,CAAC;gBACF,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,sCAAsC;gBACtC,yDAAyD;gBACzD,MAAM,GAAG;oBACP,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;oBAC7B,CAAC,EAAE,MAAM,CAAC,CAAC;oBACX,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;iBAC9B,CAAC;gBACF,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,sCAAsC;gBACtC,yDAAyD;gBACzD,MAAM,GAAG;oBACP,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;oBAC7B,CAAC,EAAE,MAAM,CAAC,CAAC;oBACX,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;iBAC9B,CAAC;gBACF,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO;gBACxC,MAAM;YACR,KAAK,OAAO;gBACV,uCAAuC;gBACvC,wDAAwD;gBACxD,MAAM,GAAG;oBACP,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;oBAC7B,CAAC,EAAE,MAAM,CAAC,CAAC;oBACX,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ;iBAC9B,CAAC;gBACF,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO;gBACxC,MAAM;QACV,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,uCAAuC;QACvC,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;QAE1B,OAAO;YACL,GAAG,EAAE;gBACH,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;gBACpC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;gBACpC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;aACrC;YACD,GAAG,EAAE;gBACH,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;gBACpC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;gBACpC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;aACrC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,gCAAgC;QAChC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,6BAA6B;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF"}