saltfish 0.1.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 (73) hide show
  1. package/LICENSE +34 -0
  2. package/README.md +633 -0
  3. package/dist/components/buttons/ExitButton.d.ts +9 -0
  4. package/dist/components/buttons/ExitButton.d.ts.map +1 -0
  5. package/dist/components/buttons/MinimizeButton.d.ts +11 -0
  6. package/dist/components/buttons/MinimizeButton.d.ts.map +1 -0
  7. package/dist/components/buttons/PlayPauseButton.d.ts +13 -0
  8. package/dist/components/buttons/PlayPauseButton.d.ts.map +1 -0
  9. package/dist/core/SaltfishPlayer.d.ts +154 -0
  10. package/dist/core/SaltfishPlayer.d.ts.map +1 -0
  11. package/dist/core/stateMachine.d.ts +119 -0
  12. package/dist/core/stateMachine.d.ts.map +1 -0
  13. package/dist/core/stateMachineConfig.d.ts +7 -0
  14. package/dist/core/stateMachineConfig.d.ts.map +1 -0
  15. package/dist/core/store.d.ts +27 -0
  16. package/dist/core/store.d.ts.map +1 -0
  17. package/dist/index.d.ts +127 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/managers/AnalyticsManager.d.ts +107 -0
  20. package/dist/managers/AnalyticsManager.d.ts.map +1 -0
  21. package/dist/managers/ButtonManager.d.ts +40 -0
  22. package/dist/managers/ButtonManager.d.ts.map +1 -0
  23. package/dist/managers/CursorManager.d.ts +143 -0
  24. package/dist/managers/CursorManager.d.ts.map +1 -0
  25. package/dist/managers/EventManager.d.ts +127 -0
  26. package/dist/managers/EventManager.d.ts.map +1 -0
  27. package/dist/managers/InteractionManager.d.ts +58 -0
  28. package/dist/managers/InteractionManager.d.ts.map +1 -0
  29. package/dist/managers/PlaylistManager.d.ts +42 -0
  30. package/dist/managers/PlaylistManager.d.ts.map +1 -0
  31. package/dist/managers/SessionManager.d.ts +56 -0
  32. package/dist/managers/SessionManager.d.ts.map +1 -0
  33. package/dist/managers/SessionRecordingManager.d.ts +52 -0
  34. package/dist/managers/SessionRecordingManager.d.ts.map +1 -0
  35. package/dist/managers/ShadowDOMManager.d.ts +35 -0
  36. package/dist/managers/ShadowDOMManager.d.ts.map +1 -0
  37. package/dist/managers/StepTimeoutManager.d.ts +38 -0
  38. package/dist/managers/StepTimeoutManager.d.ts.map +1 -0
  39. package/dist/managers/TransitionManager.d.ts +73 -0
  40. package/dist/managers/TransitionManager.d.ts.map +1 -0
  41. package/dist/managers/VideoManager.d.ts +231 -0
  42. package/dist/managers/VideoManager.d.ts.map +1 -0
  43. package/dist/observers/EventObserver.d.ts +52 -0
  44. package/dist/observers/EventObserver.d.ts.map +1 -0
  45. package/dist/observers/UIObserver.d.ts +43 -0
  46. package/dist/observers/UIObserver.d.ts.map +1 -0
  47. package/dist/patterns/Observer.d.ts +63 -0
  48. package/dist/patterns/Observer.d.ts.map +1 -0
  49. package/dist/patterns/PlayerStateSubject.d.ts +34 -0
  50. package/dist/patterns/PlayerStateSubject.d.ts.map +1 -0
  51. package/dist/player.js +8 -0
  52. package/dist/player.min.js +6 -0
  53. package/dist/saltfish-playlist-player.es.js +7202 -0
  54. package/dist/saltfish-playlist-player.umd.js +1 -0
  55. package/dist/styles/index.d.ts +14 -0
  56. package/dist/styles/index.d.ts.map +1 -0
  57. package/dist/types/index.d.ts +337 -0
  58. package/dist/types/index.d.ts.map +1 -0
  59. package/dist/types.d.ts +5 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/utils/ErrorHandler.d.ts +106 -0
  62. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  63. package/dist/utils/PositionCalculator.d.ts +90 -0
  64. package/dist/utils/PositionCalculator.d.ts.map +1 -0
  65. package/dist/utils/deviceDetection.d.ts +90 -0
  66. package/dist/utils/deviceDetection.d.ts.map +1 -0
  67. package/dist/utils/dimensions.d.ts +26 -0
  68. package/dist/utils/dimensions.d.ts.map +1 -0
  69. package/dist/utils/logger.d.ts +35 -0
  70. package/dist/utils/logger.d.ts.map +1 -0
  71. package/dist/utils/mockManifest.d.ts +27 -0
  72. package/dist/utils/mockManifest.d.ts.map +1 -0
  73. package/package.json +87 -0
@@ -0,0 +1,231 @@
1
+ import { DeviceInfo } from '../utils/deviceDetection';
2
+ /**
3
+ * Defines how the video should behave when it reaches the end
4
+ */
5
+ export type CompletionPolicy = 'auto' | 'manual';
6
+ /**
7
+ * Manager class for handling video playback and controls
8
+ */
9
+ export declare class VideoManager {
10
+ private currentVideo;
11
+ private nextVideo;
12
+ private activeVideoIndex;
13
+ private container;
14
+ private progressBar;
15
+ private muteButton;
16
+ private preloadedVideos;
17
+ private updateInterval;
18
+ private animationFrameId;
19
+ private lastTimeupdateEvent;
20
+ private currentVideoUrl;
21
+ private nextVideoUrl;
22
+ private playbackPositions;
23
+ private completionPolicy;
24
+ private videoEndedCallback;
25
+ private deviceInfo;
26
+ private deviceChangeCleanup;
27
+ private hasUserInteracted;
28
+ private autoplayFallbackTimeout;
29
+ constructor();
30
+ /**
31
+ * Gets current device information
32
+ * @returns DeviceInfo object with device details
33
+ */
34
+ getDeviceInfo(): DeviceInfo;
35
+ /**
36
+ * Checks if the current device is mobile
37
+ * @returns boolean indicating if device is mobile
38
+ */
39
+ isMobileDevice(): boolean;
40
+ /**
41
+ * Handles device information changes (orientation, resize, etc.)
42
+ * @param deviceInfo Updated device information
43
+ */
44
+ private handleDeviceChange;
45
+ /**
46
+ * Creates video player elements
47
+ * @param container - The container element for the video player
48
+ */
49
+ create(container: HTMLElement): void;
50
+ /**
51
+ * Returns the currently active video element
52
+ */
53
+ private getActiveVideo;
54
+ /**
55
+ * Returns the inactive video element (for preloading)
56
+ */
57
+ private getInactiveVideo;
58
+ /**
59
+ * Swaps between the two video elements
60
+ */
61
+ private swapVideos;
62
+ /**
63
+ * Loads a video from URL
64
+ * @param url - URL of the video to load
65
+ */
66
+ loadVideo(url: string): Promise<void>;
67
+ /**
68
+ * Preloads a video for future playback to reduce transition delays
69
+ * @param url - URL of the video to preload
70
+ */
71
+ preloadNextVideo(url: string): void;
72
+ /**
73
+ * Plays the video
74
+ */
75
+ play(): void;
76
+ /**
77
+ * Pauses the video
78
+ */
79
+ pause(): void;
80
+ /**
81
+ * Seeks to a specified time in the video
82
+ * @param time - The time to seek to in seconds
83
+ */
84
+ seek(time: number): void;
85
+ /**
86
+ * Gets the current playback time of the video
87
+ * @returns The current time in seconds
88
+ */
89
+ getCurrentTime(): number;
90
+ /**
91
+ * Gets the duration of the video
92
+ * @returns The duration in seconds
93
+ */
94
+ getDuration(): number;
95
+ /**
96
+ * Gets the active video element
97
+ * @returns The video element
98
+ */
99
+ getVideoElement(): HTMLVideoElement | null;
100
+ /**
101
+ * Destroys the video player and cleans up resources
102
+ */
103
+ destroy(): void;
104
+ /**
105
+ * Adds event listeners to the video elements
106
+ */
107
+ private addEventListeners;
108
+ /**
109
+ * Removes event listeners from the video elements
110
+ */
111
+ private removeEventListeners;
112
+ /**
113
+ * Handles video ended event
114
+ */
115
+ private handleVideoEnded;
116
+ /**
117
+ * Handles video time update (for debugging)
118
+ */
119
+ private handleTimeUpdate;
120
+ /**
121
+ * Handles video error event
122
+ */
123
+ private handleVideoError;
124
+ /**
125
+ * Starts updating the progress bar
126
+ */
127
+ private startProgressUpdates;
128
+ /**
129
+ * Stops updating the progress bar
130
+ */
131
+ private stopProgressUpdates;
132
+ /**
133
+ * Updates the progress bar based on current playback position
134
+ */
135
+ private updateProgress;
136
+ /**
137
+ * Handles detailed time updates for smooth progress bar
138
+ */
139
+ private handleDetailedTimeUpdate;
140
+ /**
141
+ * Sets the muted state of both video elements
142
+ * @param muted - Whether to mute the video
143
+ */
144
+ setMuted(muted: boolean): void;
145
+ /**
146
+ * Toggles the muted state of the video
147
+ * @param event - Optional mouse event
148
+ */
149
+ private toggleMute;
150
+ /**
151
+ * Updates the mute button icon based on muted state
152
+ */
153
+ private updateMuteButtonIcon;
154
+ /**
155
+ * Checks if the video is currently muted
156
+ * @returns Whether the video is muted
157
+ */
158
+ isMuted(): boolean;
159
+ /**
160
+ * Sets the completion policy for the video
161
+ * @param policy - The completion policy to use
162
+ * @param callback - Optional callback to execute when video ends
163
+ */
164
+ setCompletionPolicy(policy: CompletionPolicy, callback?: () => void): void;
165
+ /**
166
+ * Updates the video ended handler based on completion policy
167
+ */
168
+ private updateVideoEndedHandler;
169
+ /**
170
+ * Handles video ended event for automatic completion policy
171
+ */
172
+ private handleAutoVideoEnded;
173
+ /**
174
+ * Handles video ended event for manual completion policy
175
+ */
176
+ private handleManualVideoEnded;
177
+ /**
178
+ * Handles click on the progress bar to seek
179
+ */
180
+ private handleProgressBarClick;
181
+ /**
182
+ * Handles seeking events to ensure smooth progress updates
183
+ */
184
+ private handleSeeking;
185
+ /**
186
+ * Handles seeked events (seeking ended)
187
+ */
188
+ private handleSeeked;
189
+ /**
190
+ * Hides the progress bar (used during autoplay fallback)
191
+ */
192
+ hideProgressBar(): void;
193
+ /**
194
+ * Shows the progress bar and resets it to proper state
195
+ */
196
+ showProgressBar(): void;
197
+ /**
198
+ * Hides the mute button (used during autoplay fallback)
199
+ */
200
+ hideMuteButton(): void;
201
+ /**
202
+ * Shows the mute button
203
+ */
204
+ showMuteButton(): void;
205
+ /**
206
+ * Marks that the user has interacted with the video player
207
+ * This is important for mobile autoplay policies
208
+ */
209
+ markUserInteraction(): void;
210
+ /**
211
+ * Checks if user has interacted with the player
212
+ * @returns boolean indicating if user has interacted
213
+ */
214
+ hasUserInteractedWith(): boolean;
215
+ /**
216
+ * Resets user interaction state (called when starting a new playlist)
217
+ */
218
+ resetUserInteraction(): void;
219
+ /**
220
+ * Determines if video should start muted based on mobile autoplay policies
221
+ * @param isAutoplayBlocked - Whether we're currently in autoplay blocked state
222
+ * @returns boolean indicating if video should start muted
223
+ */
224
+ private shouldStartMuted;
225
+ /**
226
+ * Handles autoplay fallback click specifically for mobile Chrome
227
+ * @param videoElement - The video element to configure
228
+ */
229
+ handleAutoplayFallbackClick(videoElement: HTMLVideoElement): void;
230
+ }
231
+ //# sourceMappingURL=VideoManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoManager.d.ts","sourceRoot":"","sources":["../../src/managers/VideoManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { PlayerStateObserver, PlayerStateChangeData } from '../patterns/PlayerStateSubject';
2
+ import { EventManager } from '../managers/EventManager';
3
+ /**
4
+ * EventObserver - Translates player state changes to events in the EventManager
5
+ *
6
+ * This class decouples the event triggering logic from the player's state management,
7
+ * following the Observer pattern for better separation of concerns.
8
+ */
9
+ export declare class EventObserver implements PlayerStateObserver {
10
+ private eventManager;
11
+ /**
12
+ * Create a new EventObserver
13
+ * @param eventManager The event manager to trigger events on
14
+ */
15
+ constructor(eventManager: EventManager);
16
+ /**
17
+ * Reset static fields when starting a new playlist
18
+ * This ensures clean state between playlist transitions
19
+ */
20
+ reset(): void;
21
+ /**
22
+ * Handle state change updates from the PlayerStateSubject
23
+ * @param data The updated player state data
24
+ */
25
+ update(data: PlayerStateChangeData): void;
26
+ /**
27
+ * Handle state transition events (paused, resumed)
28
+ * @param data The state change data
29
+ * @param store The Saltfish store
30
+ */
31
+ private handleStateTransitionEvents;
32
+ /**
33
+ * Handle minimize/maximize events
34
+ * @param data The state change data
35
+ */
36
+ private handleMinimizeEvents;
37
+ /**
38
+ * Handle step change events
39
+ * @param data The state change data
40
+ * @param store The Saltfish store
41
+ */
42
+ private handleStepEvents;
43
+ /**
44
+ * Handle error events
45
+ * @param data The state change data
46
+ * @param store The Saltfish store
47
+ */
48
+ private handleErrorEvents;
49
+ private static prevIsMinimized;
50
+ private static prevStepId;
51
+ }
52
+ //# sourceMappingURL=EventObserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventObserver.d.ts","sourceRoot":"","sources":["../../src/observers/EventObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,mBAAmB;IACvD,OAAO,CAAC,YAAY,CAAe;IAEnC;;;OAGG;gBACS,YAAY,EAAE,YAAY;IAItC;;;OAGG;IACI,KAAK,IAAI,IAAI;IAapB;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAkBhD;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IA+CnC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAkHxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAwB;IACtD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAuB;CACjD"}
@@ -0,0 +1,43 @@
1
+ import { PlayerStateObserver, PlayerStateChangeData } from '../patterns/PlayerStateSubject';
2
+ import { Observer } from '../patterns/Observer';
3
+ import { CursorManager } from '../managers/CursorManager';
4
+ /**
5
+ * UIObserver - Handles UI updates based on player state changes
6
+ *
7
+ * This class decouples UI updates from the player's state management logic,
8
+ * following the Observer pattern for better separation of concerns.
9
+ */
10
+ export declare class UIObserver implements PlayerStateObserver, Observer<PlayerStateChangeData> {
11
+ private playerElement;
12
+ private minimizeButton;
13
+ private cursorManager;
14
+ /**
15
+ * Set the player element that will be updated based on state changes
16
+ * @param element The player element
17
+ */
18
+ setPlayerElement(element: HTMLElement): void;
19
+ /**
20
+ * Set the cursor manager to control cursor visibility
21
+ * @param cursorManager The cursor manager instance
22
+ */
23
+ setCursorManager(cursorManager: CursorManager): void;
24
+ /**
25
+ * Handle state change updates from the PlayerStateSubject
26
+ * @param data The updated player state data
27
+ */
28
+ update(data: PlayerStateChangeData): void;
29
+ /**
30
+ * Update the class on the player element based on state
31
+ */
32
+ private updateStateClass;
33
+ /**
34
+ * Update the minimized class on the player element
35
+ */
36
+ private updateMinimizeState;
37
+ /**
38
+ * Update minimize button icon based on state
39
+ * @param isMinimized Whether the player is minimized
40
+ */
41
+ private updateMinimizeButtonIcon;
42
+ }
43
+ //# sourceMappingURL=UIObserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UIObserver.d.ts","sourceRoot":"","sources":["../../src/observers/UIObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB,CAAC;IACrF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAA8B;IAEnD;;;OAGG;IACI,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAOnD;;;OAGG;IACI,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAI3D;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAehD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;CAUjC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Observer Pattern implementation
3
+ *
4
+ * This file implements the Observer pattern to decouple state changes from UI updates.
5
+ * It provides a generic Subject and Observer interface that can be used throughout
6
+ * the application.
7
+ */
8
+ /**
9
+ * Observable Subject interface
10
+ * Represents an object that can be observed by multiple observers.
11
+ */
12
+ export interface Subject<T> {
13
+ /**
14
+ * Register an observer to receive notifications
15
+ * @param observer The observer to register
16
+ */
17
+ addObserver(observer: Observer<T>): void;
18
+ /**
19
+ * Remove an observer to stop receiving notifications
20
+ * @param observer The observer to remove
21
+ * @returns true if the observer was found and removed, false otherwise
22
+ */
23
+ removeObserver(observer: Observer<T>): boolean;
24
+ /**
25
+ * Notify all observers about a state change
26
+ * @param data The data to pass to observers
27
+ */
28
+ notifyObservers(data: T): void;
29
+ }
30
+ /**
31
+ * Observer interface
32
+ * Represents an object that wants to be notified of changes in a Subject.
33
+ */
34
+ export interface Observer<T> {
35
+ /**
36
+ * Handle a state change notification from a subject
37
+ * @param data The data passed from the subject
38
+ */
39
+ update(data: T): void;
40
+ }
41
+ /**
42
+ * Abstract Subject class that implements the core Subject functionality
43
+ */
44
+ export declare abstract class AbstractSubject<T> implements Subject<T> {
45
+ private observers;
46
+ /**
47
+ * Register an observer to receive notifications
48
+ * @param observer The observer to register
49
+ */
50
+ addObserver(observer: Observer<T>): void;
51
+ /**
52
+ * Remove an observer to stop receiving notifications
53
+ * @param observer The observer to remove
54
+ * @returns true if the observer was found and removed, false otherwise
55
+ */
56
+ removeObserver(observer: Observer<T>): boolean;
57
+ /**
58
+ * Notify all observers about a state change
59
+ * @param data The data to pass to observers
60
+ */
61
+ notifyObservers(data: T): void;
62
+ }
63
+ //# sourceMappingURL=Observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../src/patterns/Observer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEzC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAE/C;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,8BAAsB,eAAe,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,SAAS,CAA+B;IAEhD;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAI/C;;;;OAIG;IACI,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO;IAIrD;;;OAGG;IACI,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAStC"}
@@ -0,0 +1,34 @@
1
+ import { AbstractSubject, Observer } from './Observer';
2
+ import { PlayerState } from '../types';
3
+ /**
4
+ * PlayerStateChangeData - The data passed to observers when player state changes
5
+ */
6
+ export interface PlayerStateChangeData {
7
+ previousState?: string;
8
+ currentState: PlayerState;
9
+ currentStepId: string | null;
10
+ isMinimized: boolean;
11
+ }
12
+ /**
13
+ * PlayerStateObserver - Specialized observer interface for player state changes
14
+ */
15
+ export interface PlayerStateObserver extends Observer<PlayerStateChangeData> {
16
+ }
17
+ /**
18
+ * PlayerStateSubject - Subject that notifies observers about player state changes
19
+ */
20
+ export declare class PlayerStateSubject extends AbstractSubject<PlayerStateChangeData> {
21
+ private currentState;
22
+ constructor();
23
+ /**
24
+ * Update the player state and notify observers if there's a change
25
+ * @param newState The new player state
26
+ */
27
+ updateState(newState: Partial<PlayerStateChangeData>): void;
28
+ /**
29
+ * Get the current player state
30
+ * @returns The current player state
31
+ */
32
+ getState(): PlayerStateChangeData;
33
+ }
34
+ //# sourceMappingURL=PlayerStateSubject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerStateSubject.d.ts","sourceRoot":"","sources":["../../src/patterns/PlayerStateSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CAEtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CAAC,qBAAqB,CAAC;CAAG;AAE/E;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe,CAAC,qBAAqB,CAAC;IAC5E,OAAO,CAAC,YAAY,CAAwB;;IAY5C;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;IAuBlE;;;OAGG;IACI,QAAQ,IAAI,qBAAqB;CAGzC"}