js.foresight 2.2.3 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -123
- package/dist/Manager/ForesightManager.d.ts +89 -0
- package/dist/Manager/ForesightManager.d.ts.map +1 -0
- package/dist/Manager/ForesightManager.js +639 -0
- package/dist/Manager/ForesightManager.js.map +1 -0
- package/dist/Manager/constants.d.ts +23 -0
- package/dist/Manager/constants.d.ts.map +1 -0
- package/dist/Manager/constants.js +24 -0
- package/dist/Manager/constants.js.map +1 -0
- package/dist/Manager/helpers/clampNumber.d.ts +2 -0
- package/dist/Manager/helpers/clampNumber.d.ts.map +1 -0
- package/dist/Manager/helpers/clampNumber.js +10 -0
- package/dist/Manager/helpers/clampNumber.js.map +1 -0
- package/dist/Manager/helpers/getFocusedElementIndex.d.ts +15 -0
- package/dist/Manager/helpers/getFocusedElementIndex.d.ts.map +1 -0
- package/dist/Manager/helpers/getFocusedElementIndex.js +27 -0
- package/dist/Manager/helpers/getFocusedElementIndex.js.map +1 -0
- package/dist/Manager/helpers/getScrollDirection.d.ts +3 -0
- package/dist/Manager/helpers/getScrollDirection.d.ts.map +1 -0
- package/dist/Manager/helpers/getScrollDirection.js +21 -0
- package/dist/Manager/helpers/getScrollDirection.js.map +1 -0
- package/dist/Manager/helpers/lineSigmentIntersectsRect.d.ts +12 -0
- package/dist/Manager/helpers/lineSigmentIntersectsRect.d.ts.map +1 -0
- package/dist/Manager/helpers/lineSigmentIntersectsRect.js +52 -0
- package/dist/Manager/helpers/lineSigmentIntersectsRect.js.map +1 -0
- package/dist/Manager/helpers/predictNextMousePosition.d.ts +19 -0
- package/dist/Manager/helpers/predictNextMousePosition.d.ts.map +1 -0
- package/dist/Manager/helpers/predictNextMousePosition.js +43 -0
- package/dist/Manager/helpers/predictNextMousePosition.js.map +1 -0
- package/dist/Manager/helpers/predictNextScrollPosition.d.ts +6 -0
- package/dist/Manager/helpers/predictNextScrollPosition.d.ts.map +1 -0
- package/dist/Manager/helpers/predictNextScrollPosition.js +20 -0
- package/dist/Manager/helpers/predictNextScrollPosition.js.map +1 -0
- package/dist/Manager/helpers/rectAndHitSlop.d.ts +33 -0
- package/dist/Manager/helpers/rectAndHitSlop.d.ts.map +1 -0
- package/dist/Manager/helpers/rectAndHitSlop.js +66 -0
- package/dist/Manager/helpers/rectAndHitSlop.js.map +1 -0
- package/dist/Manager/helpers/shouldUpdateSetting.d.ts +11 -0
- package/dist/Manager/helpers/shouldUpdateSetting.d.ts.map +1 -0
- package/dist/Manager/helpers/shouldUpdateSetting.js +16 -0
- package/dist/Manager/helpers/shouldUpdateSetting.js.map +1 -0
- package/dist/helpers/shouldRegister.d.ts +8 -0
- package/dist/helpers/shouldRegister.d.ts.map +1 -0
- package/dist/helpers/shouldRegister.js +31 -0
- package/dist/helpers/shouldRegister.js.map +1 -0
- package/dist/index.d.ts +105 -72
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/src/Manager/ForesightManager.d.ts +89 -0
- package/dist/src/Manager/ForesightManager.d.ts.map +1 -0
- package/dist/src/Manager/ForesightManager.test.d.ts +2 -0
- package/dist/src/Manager/ForesightManager.test.d.ts.map +1 -0
- package/dist/src/Manager/constants.d.ts +23 -0
- package/dist/src/Manager/constants.d.ts.map +1 -0
- package/dist/src/Manager/helpers/clampNumber.d.ts +2 -0
- package/dist/src/Manager/helpers/clampNumber.d.ts.map +1 -0
- package/dist/src/Manager/helpers/clampNumber.test.d.ts +2 -0
- package/dist/src/Manager/helpers/clampNumber.test.d.ts.map +1 -0
- package/dist/src/Manager/helpers/getFocusedElementIndex.d.ts +15 -0
- package/dist/src/Manager/helpers/getFocusedElementIndex.d.ts.map +1 -0
- package/dist/src/Manager/helpers/getFocusedElementIndex.test.d.ts +2 -0
- package/dist/src/Manager/helpers/getFocusedElementIndex.test.d.ts.map +1 -0
- package/dist/src/Manager/helpers/getScrollDirection.d.ts +3 -0
- package/dist/src/Manager/helpers/getScrollDirection.d.ts.map +1 -0
- package/dist/src/Manager/helpers/lineSegmentIntersectsRect.test.d.ts +2 -0
- package/dist/src/Manager/helpers/lineSegmentIntersectsRect.test.d.ts.map +1 -0
- package/dist/src/Manager/helpers/lineSigmentIntersectsRect.d.ts +12 -0
- package/dist/src/Manager/helpers/lineSigmentIntersectsRect.d.ts.map +1 -0
- package/dist/src/Manager/helpers/predictNextMousePosition.d.ts +19 -0
- package/dist/src/Manager/helpers/predictNextMousePosition.d.ts.map +1 -0
- package/dist/src/Manager/helpers/predictNextMousePosition.test.d.ts +2 -0
- package/dist/src/Manager/helpers/predictNextMousePosition.test.d.ts.map +1 -0
- package/dist/src/Manager/helpers/predictNextScrollPosition.d.ts +6 -0
- package/dist/src/Manager/helpers/predictNextScrollPosition.d.ts.map +1 -0
- package/dist/src/Manager/helpers/rectAndHitSlop.d.ts +33 -0
- package/dist/src/Manager/helpers/rectAndHitSlop.d.ts.map +1 -0
- package/dist/src/Manager/helpers/rectAndHitSlop.test.d.ts +2 -0
- package/dist/src/Manager/helpers/rectAndHitSlop.test.d.ts.map +1 -0
- package/dist/src/Manager/helpers/shouldUpdateSetting.d.ts +11 -0
- package/dist/src/Manager/helpers/shouldUpdateSetting.d.ts.map +1 -0
- package/dist/src/helpers/shouldRegister.d.ts +8 -0
- package/dist/src/helpers/shouldRegister.d.ts.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +309 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/dist/test-setup.d.ts +17 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/types.d.ts +312 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/package.json +11 -10
package/README.md
CHANGED
|
@@ -1,34 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# js.foresight
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://www.npmjs.com/package/js.foresight)
|
|
5
|
-
[](https://bundlephobia.com/package/js.foresight)
|
|
6
|
-
[](https://github.com/spaansba/ForesightJS)
|
|
7
|
-
[](https://github.com/spaansba/ForesightJS/commits)
|
|
3
|
+
The core ForesightJS library package.
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
[](https://opensource.org/licenses/MIT)
|
|
11
|
-
[](https://foresightjs.com/)
|
|
5
|
+
A lightweight JavaScript/TypeScript library that predicts user intent based on mouse movements, scroll behavior, and keyboard navigation. Published as `js.foresight` on npm.
|
|
12
6
|
|
|
13
|
-
|
|
7
|
+
**For complete documentation, usage examples, and API reference, see the [main README](../../README.md).**
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
When you over simplify prefetching it exists of three parts.
|
|
18
|
-
|
|
19
|
-
- **What** resource or data to load
|
|
20
|
-
- **How** the loading method and caching strategy is
|
|
21
|
-
- **When** the optimal moment to start fetching is
|
|
22
|
-
|
|
23
|
-
ForesightJS takes care of the **When** by predicting user intent with mouse trajectory and tab navigation.
|
|
24
|
-
You supply the **What** and **How** inside your `callback` when you register an element.
|
|
25
|
-
|
|
26
|
-
### [Playground](https://foresightjs.com/)
|
|
27
|
-
|
|
28
|
-

|
|
29
|
-
_In the GIF above, [debug mode](https://foresightjs.com/docs/getting_started/debug) is on. Normally, users won't see anything that ForesightJS does except the increased perceived speed from early prefetching._
|
|
30
|
-
|
|
31
|
-
## Download
|
|
9
|
+
## Installation
|
|
32
10
|
|
|
33
11
|
```bash
|
|
34
12
|
pnpm add js.foresight
|
|
@@ -37,99 +15,3 @@ npm install js.foresight
|
|
|
37
15
|
# or
|
|
38
16
|
yarn add js.foresight
|
|
39
17
|
```
|
|
40
|
-
|
|
41
|
-
## Which problems does ForesightJS solve?
|
|
42
|
-
|
|
43
|
-
### Problem 1: On-Hover Prefetching Still Has Latency
|
|
44
|
-
|
|
45
|
-
Traditional hover-based prefetching only triggers after the user's cursor reaches an element. This approach wastes the critical 100-200ms window between when a user begins moving toward a target and when the hover event actually fires.
|
|
46
|
-
|
|
47
|
-
### Problem 2: Viewport-Based Prefetching is Wasteful
|
|
48
|
-
|
|
49
|
-
Many modern frameworks (like Next.js) automatically prefetch resources for all links that enter the viewport. While well-intentioned, this creates significant overhead since users typically interact with only a small fraction of visible elements. Simply scrolling up and down the Next.js homepage can trigger **_1.59MB_** of unnecessary prefetch requests.
|
|
50
|
-
|
|
51
|
-
### Problem 3: Hover-Based Prefetching Excludes Keyboard Users
|
|
52
|
-
|
|
53
|
-
Many routers rely on hover-based prefetching, but this approach completely excludes keyboard users since keyboard navigation never triggers hover events. This means keyboard users miss out on the performance benefits that mouse users get from hover-based prefetching.
|
|
54
|
-
|
|
55
|
-
### The ForesightJS Solution
|
|
56
|
-
|
|
57
|
-
ForesightJS bridges the gap between wasteful viewport prefetching and basic hover prefetching. The `ForesightManager` predicts user interactions by analyzing mouse trajectory patterns, scroll direction and keyboard navigation sequences. This allows you to prefetch resources at the optimal time to improve performance, but targeted enough to avoid waste.
|
|
58
|
-
|
|
59
|
-
## Basic Usage Example
|
|
60
|
-
|
|
61
|
-
This basic example is in vanilla JS, ofcourse most people will use ForesightJS with a framework. You can read about framework integrations in the [docs](https://foresightjs.com/docs/integrations).
|
|
62
|
-
|
|
63
|
-
```javascript
|
|
64
|
-
import { ForesightManager } from "foresightjs"
|
|
65
|
-
|
|
66
|
-
// Initialize the manager if you want custom global settings (do this once at app startup)
|
|
67
|
-
// If you dont want global settings, you dont have to initialize the manager
|
|
68
|
-
ForesightManager.initialize({
|
|
69
|
-
debug: false, // Set to true to see visualization
|
|
70
|
-
trajectoryPredictionTime: 80, // How far ahead (in milliseconds) to predict the mouse trajectory
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
// Register an element to be tracked
|
|
74
|
-
const myButton = document.getElementById("my-button")
|
|
75
|
-
|
|
76
|
-
const { isTouchDevice, unregister } = ForesightManager.instance.register({
|
|
77
|
-
element: myButton,
|
|
78
|
-
callback: () => {
|
|
79
|
-
// This is where your prefetching logic goes
|
|
80
|
-
},
|
|
81
|
-
hitSlop: 20, // Optional: "hit slop" in pixels. Overwrites defaultHitSlop
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
// Later, when done with this element:
|
|
85
|
-
unregister()
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Integrations
|
|
89
|
-
|
|
90
|
-
Since ForesightJS is framework agnostic, it can be integrated with any JavaScript framework. While I haven't yet built [integrations](https://foresightjs.com/docs/integrations) for every framework, ready-to-use implementations for [Next.js](https://foresightjs.com/docs/integrations/react/nextjs) and [React Router](https://foresightjs.com/docs/integrations/react/react-router) are already available. Sharing integrations for other frameworks/packages is highly appreciated!
|
|
91
|
-
|
|
92
|
-
## Configuration
|
|
93
|
-
|
|
94
|
-
ForesightJS can be used bare-bones but also can be configured. For all configuration possibilities you can reference the [docs](https://foresightjs.com/docs/getting_started/config).
|
|
95
|
-
|
|
96
|
-
## Debugging Visualization
|
|
97
|
-
|
|
98
|
-
ForesightJS includes a [Visual Debugging](https://foresightjs.com/docs/getting_started/debug) system that helps you understand and tune how foresight is working in your application. This is particularly helpful when setting up ForesightJS for the first time or when fine-tuning for specific UI components.
|
|
99
|
-
|
|
100
|
-
## What About Touch Devices and Slow Connections?
|
|
101
|
-
|
|
102
|
-
Since ForesightJS relies on the keyboard/mouse it will not register elements for touch devices. For limited connections (2G or data-saver mode), we respect the user's preference to minimize data usage and skip registration aswell.
|
|
103
|
-
|
|
104
|
-
The `ForesightManager.instance.register()` method returns these properties:
|
|
105
|
-
|
|
106
|
-
- `isTouchDevice` - true if user is on a touch device
|
|
107
|
-
- `isLimitedConnection` - true when user is on a 2G connection or has data-saver enabled
|
|
108
|
-
- `isRegistered` - true if element was actually registered
|
|
109
|
-
|
|
110
|
-
With these properties you could create your own fallback prefetching methods if required. For example if the user is on a touch device you could prefetch based on viewport.
|
|
111
|
-
An example of this can be found in the [Next.js](https://foresightjs.com/docs/integrations/react/nextjs) or [React Router](https://foresightjs.com/docs/integrations/react/react-router) ForesightLink components.
|
|
112
|
-
|
|
113
|
-
## How Does ForesightJS Work?
|
|
114
|
-
|
|
115
|
-
For a detailed technical explanation of its prediction algorithms and internal architecture, see the **[Behind the Scenes documentation](https://foresightjs.com/docs/Behind_the_Scenes)**.
|
|
116
|
-
|
|
117
|
-
## Providing Context to AI Tools
|
|
118
|
-
|
|
119
|
-
Since ForesightJS is a relatively new and unknown library, most AI assistants and large language models (LLMs) may not have comprehensive knowledge about it in their training data. To help AI assistants better understand and work with ForesightJS, you can provide them with context from our [llms.txt](https://foresightjs.com/llms.txt) page, which contains structured information about the library's API and usage patterns.
|
|
120
|
-
|
|
121
|
-
Additionally, every page in the documentation is available in markdown format (try adding .md to any documentation URL). You can share these markdown files as context with AI assistants, though all this information is also consolidated in the llms.txt file for convenience.
|
|
122
|
-
|
|
123
|
-
## Future of ForesightJS
|
|
124
|
-
|
|
125
|
-
ForesightJS will continue to evolve with a focus on staying as lightweight and performant as possible. To achieve this the plan is to decouple the debugger and make it its own standalone dev package, reducing the core library size even further.
|
|
126
|
-
|
|
127
|
-
Beyond size optimization, performance remains central to every development decision. Each release will focus on improving prediction accuracy while reducing computational overhead, ensuring ForesightJS stays practical for production environments. We also want to move as much processing as possible off the main thread to keep user interfaces responsive.
|
|
128
|
-
|
|
129
|
-
These performance improvements go hand in hand with expanding accessibility across different development environments. The documentation will grow to include more framework integrations beyond the current Next.js and React Router implementations, making ForesightJS accessible to developers working with different technology stacks and routing solutions.
|
|
130
|
-
|
|
131
|
-
All of these efforts benefit from community input. [Contributions](/CONTRIBUTING.md) are always welcome, whether for new framework integrations, performance improvements, or feature ideas.
|
|
132
|
-
|
|
133
|
-
# Contributing
|
|
134
|
-
|
|
135
|
-
Please see the [contributing guidelines](/CONTRIBUTING.md)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ForesightElement, ForesightElementData, ForesightEventMap, ForesightEventType, ForesightManagerData, ForesightRegisterOptions, ForesightRegisterResult, UpdateForsightManagerSettings } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* Manages the prediction of user intent based on mouse trajectory and element interactions.
|
|
4
|
+
*
|
|
5
|
+
* ForesightManager is a singleton class responsible for:
|
|
6
|
+
* - Registering HTML elements to monitor.
|
|
7
|
+
* - Tracking mouse movements and predicting future cursor positions.
|
|
8
|
+
* - Detecting when a predicted trajectory intersects with a registered element's bounds.
|
|
9
|
+
* - Invoking callbacks associated with elements upon predicted or actual interaction.
|
|
10
|
+
* - Optionally unregistering elements after their callback is triggered.
|
|
11
|
+
* - Handling global settings for prediction behavior (e.g., history size, prediction time).
|
|
12
|
+
* - Automatically updating element bounds on resize using {@link ResizeObserver}.
|
|
13
|
+
* - Automatically unregistering elements removed from the DOM using {@link MutationObserver}.
|
|
14
|
+
* - Detecting broader layout shifts via {@link MutationObserver} to update element positions.
|
|
15
|
+
*
|
|
16
|
+
* It should be initialized once using {@link ForesightManager.initialize} and then
|
|
17
|
+
* accessed via the static getter {@link ForesightManager.instance}.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ForesightManager {
|
|
20
|
+
private static manager;
|
|
21
|
+
private elements;
|
|
22
|
+
private isSetup;
|
|
23
|
+
private _globalCallbackHits;
|
|
24
|
+
private _globalSettings;
|
|
25
|
+
private trajectoryPositions;
|
|
26
|
+
private tabbableElementsCache;
|
|
27
|
+
private lastFocusedIndex;
|
|
28
|
+
private predictedScrollPoint;
|
|
29
|
+
private scrollDirection;
|
|
30
|
+
private domObserver;
|
|
31
|
+
private positionObserver;
|
|
32
|
+
private lastKeyDown;
|
|
33
|
+
private globalListenersController;
|
|
34
|
+
private eventListeners;
|
|
35
|
+
private constructor();
|
|
36
|
+
static initialize(props?: Partial<UpdateForsightManagerSettings>): ForesightManager;
|
|
37
|
+
addEventListener<K extends ForesightEventType>(eventType: K, listener: (event: ForesightEventMap[K]) => void, options?: {
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}): (() => void) | undefined;
|
|
40
|
+
removeEventListener<K extends ForesightEventType>(eventType: K, listener: (event: ForesightEventMap[K]) => void): void;
|
|
41
|
+
logSubscribers(): void;
|
|
42
|
+
private emit;
|
|
43
|
+
get getManagerData(): Readonly<ForesightManagerData>;
|
|
44
|
+
static get isInitiated(): Readonly<boolean>;
|
|
45
|
+
static get instance(): ForesightManager;
|
|
46
|
+
get registeredElements(): ReadonlyMap<ForesightElement, ForesightElementData>;
|
|
47
|
+
register({ element, callback, hitSlop, name, }: ForesightRegisterOptions): ForesightRegisterResult;
|
|
48
|
+
private unregister;
|
|
49
|
+
private updateNumericSettings;
|
|
50
|
+
private updateBooleanSetting;
|
|
51
|
+
alterGlobalSettings(props?: Partial<UpdateForsightManagerSettings>): void;
|
|
52
|
+
private forceUpdateAllElementBounds;
|
|
53
|
+
private updatePointerState;
|
|
54
|
+
/**
|
|
55
|
+
* Processes elements that unregister after a single callback.
|
|
56
|
+
*
|
|
57
|
+
* This is a "fire-and-forget" handler. Its only goal is to trigger the
|
|
58
|
+
* callback once. It does so if the mouse trajectory is predicted to hit the
|
|
59
|
+
* element (if prediction is on) OR if the mouse physically hovers over it.
|
|
60
|
+
* It does not track state, as the element is immediately unregistered.
|
|
61
|
+
*
|
|
62
|
+
* @param elementData - The data object for the foresight element.
|
|
63
|
+
* @param element - The HTML element being interacted with.
|
|
64
|
+
*/
|
|
65
|
+
private handleCallbackInteraction;
|
|
66
|
+
private handleMouseMove;
|
|
67
|
+
/**
|
|
68
|
+
* Detects when registered elements are removed from the DOM and automatically unregisters them to prevent stale references.
|
|
69
|
+
*
|
|
70
|
+
* @param mutationsList - Array of MutationRecord objects describing the DOM changes
|
|
71
|
+
*
|
|
72
|
+
*/
|
|
73
|
+
private handleDomMutations;
|
|
74
|
+
private handleKeyDown;
|
|
75
|
+
private handleFocusIn;
|
|
76
|
+
private updateHitCounters;
|
|
77
|
+
private callCallback;
|
|
78
|
+
/**
|
|
79
|
+
* ONLY use this function when you want to change the rect bounds via code, if the rects are changing because of updates in the DOM do not use this function.
|
|
80
|
+
* We need an observer for that
|
|
81
|
+
*/
|
|
82
|
+
private forceUpdateElementBounds;
|
|
83
|
+
private updateElementBounds;
|
|
84
|
+
private handleScrollPrefetch;
|
|
85
|
+
private handlePositionChange;
|
|
86
|
+
private initializeGlobalListeners;
|
|
87
|
+
private removeGlobalListeners;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=ForesightManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForesightManager.d.ts","sourceRoot":"","sources":["../../src/Manager/ForesightManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EAEpB,wBAAwB,EACxB,uBAAuB,EAOvB,6BAA6B,EAC9B,MAAM,gBAAgB,CAAA;AAkCvB;;;;;;;;;;;;;;;;GAgBG;AAEH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAyD;IACzE,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,mBAAmB,CAgB1B;IACD,OAAO,CAAC,eAAe,CAmBtB;IACD,OAAO,CAAC,mBAAmB,CAI1B;IAED,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAAgC;IAExD,OAAO,CAAC,WAAW,CAA6B;IAGhD,OAAO,CAAC,yBAAyB,CAA+B;IAEhE,OAAO,CAAC,cAAc,CAA+D;IAGrF,OAAO;WAEO,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAAG,gBAAgB;IAUnF,gBAAgB,CAAC,CAAC,SAAS,kBAAkB,EAClD,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC/C,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE;IAa7B,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,EACrD,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAC9C,IAAI;IAWA,cAAc,IAAI,IAAI;IA+B7B,OAAO,CAAC,IAAI;IAaZ,IAAW,cAAc,IAAI,QAAQ,CAAC,oBAAoB,CAAC,CAM1D;IAED,WAAkB,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,CAEjD;IAED,WAAkB,QAAQ,IAAI,gBAAgB,CAE7C;IAED,IAAW,kBAAkB,IAAI,WAAW,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAEnF;IAEM,QAAQ,CAAC,EACd,OAAO,EACP,QAAQ,EACR,OAAO,EACP,IAAI,GACL,EAAE,wBAAwB,GAAG,uBAAuB;IAyErD,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,oBAAoB;IAWrB,mBAAmB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAAG,IAAI;IA2FhF,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,kBAAkB;IAY1B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,eAAe,CAiBtB;IAED;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB,CAezB;IAMD,OAAO,CAAC,aAAa,CAIpB;IAED,OAAO,CAAC,aAAa,CAgDpB;IAED,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,YAAY;IAiBpB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,oBAAoB;IAuD5B,OAAO,CAAC,oBAAoB,CAyB3B;IAED,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,CAAC,qBAAqB;CAW9B"}
|