@aiquants/select-box 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.
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/index.cjs +10 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1084 -0
- package/dist/select-box.css +1 -0
- package/dist/src/components/DropdownList.d.ts +12 -0
- package/dist/src/components/DropdownList.d.ts.map +1 -0
- package/dist/src/components/InputArea.d.ts +16 -0
- package/dist/src/components/InputArea.d.ts.map +1 -0
- package/dist/src/components/ListItem.d.ts +13 -0
- package/dist/src/components/ListItem.d.ts.map +1 -0
- package/dist/src/components/SelectBox.d.ts +4 -0
- package/dist/src/components/SelectBox.d.ts.map +1 -0
- package/dist/src/hooks/useSearchSort.d.ts +6 -0
- package/dist/src/hooks/useSearchSort.d.ts.map +1 -0
- package/dist/src/hooks/useSelectBox.d.ts +12 -0
- package/dist/src/hooks/useSelectBox.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/index.d.ts +15 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/styles/select-box.css +2 -0
- package/dist/tests/test-setup.d.ts +1 -0
- package/dist/tests/test-setup.d.ts.map +1 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/package.json +101 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 fehde-k
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# @aiquants/directory-tree
|
|
2
|
+
|
|
3
|
+
A high-performance React directory tree component with virtualization, file selection, and theming support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **๐ High Performance**: Built with [@aiquants/virtualscroll](../virtualscroll) to handle large directory structures efficiently with O(log n) operations
|
|
8
|
+
- **๐ Ultrafast Scrolling**: Inherits adaptive tap scroll circle from VirtualScroll for navigating massive datasets
|
|
9
|
+
- **๐ File Selection**: Interactive file selection with visual feedback and multiple selection modes
|
|
10
|
+
- **๐จ Theming**: Customizable line colors with external theme control support
|
|
11
|
+
- **โฟ Accessibility**: Full keyboard navigation and screen reader support
|
|
12
|
+
- **๐ฑ Responsive**: Optimized for both desktop and mobile interfaces
|
|
13
|
+
- **๐ง TypeScript**: Complete TypeScript support with comprehensive type definitions
|
|
14
|
+
- **๐พ State Persistence**: Automatic localStorage persistence for expansion states
|
|
15
|
+
- **๐ฏ Flexible Selection**: Support for none, single, or multiple selection modes
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @aiquants/directory-tree
|
|
21
|
+
# or
|
|
22
|
+
yarn add @aiquants/directory-tree
|
|
23
|
+
# or
|
|
24
|
+
pnpm add @aiquants/directory-tree
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Peer Dependencies
|
|
28
|
+
|
|
29
|
+
This package requires the following peer dependencies:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install react react-dom @aiquants/virtualscroll tailwind-variants tailwind-merge
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import React from 'react';
|
|
39
|
+
import { DirectoryTree, useDirectoryTreeState } from '@aiquants/directory-tree';
|
|
40
|
+
import { useTheme } from './hooks/useTheme'; // Your theme hook
|
|
41
|
+
import type { DirectoryEntry } from '@aiquants/directory-tree';
|
|
42
|
+
|
|
43
|
+
const sampleData: DirectoryEntry[] = [
|
|
44
|
+
{
|
|
45
|
+
name: 'src',
|
|
46
|
+
absolutePath: '/src',
|
|
47
|
+
relativePath: 'src',
|
|
48
|
+
children: [
|
|
49
|
+
{
|
|
50
|
+
name: 'components',
|
|
51
|
+
absolutePath: '/src/components',
|
|
52
|
+
relativePath: 'src/components',
|
|
53
|
+
children: [
|
|
54
|
+
{
|
|
55
|
+
name: 'App.tsx',
|
|
56
|
+
absolutePath: '/src/components/App.tsx',
|
|
57
|
+
relativePath: 'src/components/App.tsx',
|
|
58
|
+
children: null
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
export default function App() {
|
|
67
|
+
const { theme } = useTheme();
|
|
68
|
+
const {
|
|
69
|
+
toggle,
|
|
70
|
+
isExpanded,
|
|
71
|
+
expandMultiple,
|
|
72
|
+
collapseMultiple,
|
|
73
|
+
isPending
|
|
74
|
+
} = useDirectoryTreeState({
|
|
75
|
+
storageKey: 'my-directory-tree'
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Calculate line color based on theme
|
|
79
|
+
const lineColor = theme === "dark" ? "#4A5568" : "#A0AEC0";
|
|
80
|
+
|
|
81
|
+
const handleFileSelect = (absolutePath: string, relativePath: string) => {
|
|
82
|
+
console.log(`File selected: ${absolutePath} (${relativePath})`);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<div className="h-96 w-full border rounded-lg">
|
|
87
|
+
<DirectoryTree
|
|
88
|
+
entries={sampleData}
|
|
89
|
+
expansion={{
|
|
90
|
+
toggle,
|
|
91
|
+
isExpanded,
|
|
92
|
+
expandMultiple,
|
|
93
|
+
collapseMultiple,
|
|
94
|
+
isPending
|
|
95
|
+
}}
|
|
96
|
+
selection={{
|
|
97
|
+
onFileSelect: handleFileSelect,
|
|
98
|
+
selectedPath: null
|
|
99
|
+
}}
|
|
100
|
+
visual={{
|
|
101
|
+
lineColor,
|
|
102
|
+
className: "h-full"
|
|
103
|
+
}}
|
|
104
|
+
/>
|
|
105
|
+
</div>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## API Reference
|
|
111
|
+
|
|
112
|
+
### DirectoryTree Component
|
|
113
|
+
|
|
114
|
+
The main component for rendering the directory tree.
|
|
115
|
+
|
|
116
|
+
#### Props
|
|
117
|
+
|
|
118
|
+
| Prop | Type | Required | Description |
|
|
119
|
+
|------|------|----------|-------------|
|
|
120
|
+
| `entries` | `DirectoryEntry[]` | Yes | Array of root directory entries to display |
|
|
121
|
+
| `expansion` | `object` | Yes | Configuration for tree expansion state and behavior |
|
|
122
|
+
| `selection` | `object` | Yes | Configuration for item selection |
|
|
123
|
+
| `visual` | `object` | No | Visual customization options |
|
|
124
|
+
| `virtualScroll` | `DirectoryTreeVirtualScrollOptions` | No | Pass-through options for the underlying VirtualScroll component |
|
|
125
|
+
|
|
126
|
+
#### Expansion Options (`expansion`)
|
|
127
|
+
|
|
128
|
+
| Prop | Type | Required | Default | Description |
|
|
129
|
+
|------|------|----------|---------|-------------|
|
|
130
|
+
| `toggle` | `(path: string, relativePath: string) => void` | Yes | - | Function to toggle directory expansion state |
|
|
131
|
+
| `isExpanded` | `(path: string) => boolean` | Yes | - | Function to check if a directory is expanded |
|
|
132
|
+
| `expandMultiple` | `(paths: string[]) => void` | Yes | - | Function to expand multiple directories |
|
|
133
|
+
| `collapseMultiple` | `(paths: string[]) => void` | Yes | - | Function to collapse multiple directories |
|
|
134
|
+
| `isPending` | `boolean` | No | `false` | Whether the tree is in a pending state |
|
|
135
|
+
| `alwaysExpanded` | `boolean` | No | `false` | If true, all directories are always expanded |
|
|
136
|
+
| `doubleClickAction` | `'recursive' \| 'toggle'` | No | `'recursive'` | Action on double-clicking a directory |
|
|
137
|
+
|
|
138
|
+
#### Selection Options (`selection`)
|
|
139
|
+
|
|
140
|
+
| Prop | Type | Required | Default | Description |
|
|
141
|
+
|------|------|----------|---------|-------------|
|
|
142
|
+
| `onFileSelect` | `(absolutePath: string, relativePath: string) => void` | Yes | - | Callback function triggered when a file is selected |
|
|
143
|
+
| `selectedPath` | `string \| null` | No | - | The currently selected file path |
|
|
144
|
+
| `mode` | `'none' \| 'single' \| 'multiple'` | No | `'none'` | Selection mode for items |
|
|
145
|
+
| `selectedItems` | `Set<string>` | No | - | Set of paths for currently selected items |
|
|
146
|
+
| `onSelectionChange` | `(path: string, isSelected: boolean) => void` | No | - | Callback when item selection changes |
|
|
147
|
+
|
|
148
|
+
#### Visual Options (`visual`)
|
|
149
|
+
|
|
150
|
+
| Prop | Type | Required | Default | Description |
|
|
151
|
+
|------|------|----------|---------|-------------|
|
|
152
|
+
| `className` | `string` | No | - | Optional CSS class name for the container |
|
|
153
|
+
| `style` | `React.CSSProperties` | No | - | Optional inline styles for the container |
|
|
154
|
+
| `lineColor` | `string` | No | `'#A0AEC0'` | The color of the tree lines |
|
|
155
|
+
| `showTreeLines` | `boolean` | No | `true` | Flag indicating whether to render tree connector lines |
|
|
156
|
+
| `showExpandIcons` | `boolean` | No | `true` | Flag indicating whether to render directory expand icons |
|
|
157
|
+
| `showDirectoryIcons` | `boolean` | No | `true` | Flag indicating whether to render directory type icons |
|
|
158
|
+
| `showFileIcons` | `boolean` | No | `true` | Flag indicating whether to render file type icons |
|
|
159
|
+
| `iconOverrides` | `DirectoryTreeIconOverrides` | No | - | Icon overrides applied globally |
|
|
160
|
+
| `expandIconSize` | `number` | No | - | Size of the expand icon |
|
|
161
|
+
| `removeRootIndent` | `boolean` | No | `false` | If true, removes the indentation and connector lines for root-level items |
|
|
162
|
+
|
|
163
|
+
### Virtual Scroll Options
|
|
164
|
+
|
|
165
|
+
`virtualScroll` lets you customize the embedded `@aiquants/virtualscroll` instance without re-implementing list rendering. Every option is optional and mirrors the VirtualScroll API.
|
|
166
|
+
|
|
167
|
+
- `overscanCount`: Adjust how many items render beyond the viewport for smoother scrolling (default: `10`).
|
|
168
|
+
- `tapScrollCircleOptions`: Forward tap circle customization such as radius or visual renderer.
|
|
169
|
+
- `scrollBarWidth`: Override the custom scrollbar width.
|
|
170
|
+
- `enableThumbDrag`, `enableTrackClick`, `enableArrowButtons`, `enablePointerDrag`: Toggle individual scrollbar interactions.
|
|
171
|
+
- `inertiaOptions`: Fine-tune inertial scrolling parameters.
|
|
172
|
+
- `onScroll`, `onRangeChange`, `className`, `background`, `initialScrollIndex`, `initialScrollOffset`: Hook into scroll lifecycle or provide bespoke styling.
|
|
173
|
+
|
|
174
|
+
Example:
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
<DirectoryTree
|
|
178
|
+
{...commonProps}
|
|
179
|
+
virtualScroll={{
|
|
180
|
+
overscanCount: 6,
|
|
181
|
+
enablePointerDrag: false,
|
|
182
|
+
scrollBarWidth: 14,
|
|
183
|
+
tapScrollCircleOptions: {
|
|
184
|
+
radius: 32
|
|
185
|
+
}
|
|
186
|
+
}}
|
|
187
|
+
/>;
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### useDirectoryTreeState Hook
|
|
191
|
+
|
|
192
|
+
A hook for managing directory tree state with localStorage persistence.
|
|
193
|
+
|
|
194
|
+
#### Parameters
|
|
195
|
+
|
|
196
|
+
| Parameter | Type | Description |
|
|
197
|
+
|-----------|------|-------------|
|
|
198
|
+
| `options` | `UseDirectoryTreeStateProps` | Configuration options |
|
|
199
|
+
|
|
200
|
+
#### Options
|
|
201
|
+
|
|
202
|
+
| Option | Type | Description |
|
|
203
|
+
|--------|------|-------------|
|
|
204
|
+
| `initialExpanded` | `Set<string>` | Initially expanded directories |
|
|
205
|
+
| `storageKey` | `string` | localStorage key for persistence (default: 'directory-tree-state') |
|
|
206
|
+
|
|
207
|
+
#### Returns
|
|
208
|
+
|
|
209
|
+
| Property | Type | Description |
|
|
210
|
+
|----------|------|-------------|
|
|
211
|
+
| `expanded` | `Set<string>` | Currently expanded directories |
|
|
212
|
+
| `toggle` | `(path: string, relativePath: string) => void` | Toggle directory expansion |
|
|
213
|
+
| `isExpanded` | `(path: string) => boolean` | Check if directory is expanded |
|
|
214
|
+
| `expand` | `(path: string) => void` | Expand a directory |
|
|
215
|
+
| `collapse` | `(path: string) => void` | Collapse a directory |
|
|
216
|
+
| `expandMultiple` | `(paths: string[]) => void` | Expand multiple directories |
|
|
217
|
+
| `collapseMultiple` | `(paths: string[]) => void` | Collapse multiple directories |
|
|
218
|
+
| `collapseAll` | `() => void` | Collapse all directories |
|
|
219
|
+
| `isPending` | `boolean` | Whether a transition is pending |
|
|
220
|
+
|
|
221
|
+
### DirectoryEntry Type
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
type DirectoryEntry = {
|
|
225
|
+
name: string;
|
|
226
|
+
absolutePath: string;
|
|
227
|
+
relativePath: string;
|
|
228
|
+
children: DirectoryEntry[] | null;
|
|
229
|
+
};
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Styling
|
|
233
|
+
|
|
234
|
+
The component uses Tailwind CSS for styling. Make sure you have Tailwind CSS configured in your project. The component supports both light and dark themes, but theme control is managed by the calling component.
|
|
235
|
+
|
|
236
|
+
### Theme Control
|
|
237
|
+
|
|
238
|
+
The `lineColor` prop allows you to control the tree line color based on your application's theme:
|
|
239
|
+
|
|
240
|
+
```tsx
|
|
241
|
+
import { useTheme } from './hooks/useTheme';
|
|
242
|
+
|
|
243
|
+
function MyComponent() {
|
|
244
|
+
const { theme } = useTheme();
|
|
245
|
+
|
|
246
|
+
// Calculate line color based on theme
|
|
247
|
+
const lineColor = theme === "dark" ? "#4A5568" : "#A0AEC0";
|
|
248
|
+
|
|
249
|
+
return (
|
|
250
|
+
<DirectoryTree
|
|
251
|
+
// ... other props
|
|
252
|
+
visual={{
|
|
253
|
+
lineColor: lineColor
|
|
254
|
+
}}
|
|
255
|
+
/>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Custom Styling
|
|
261
|
+
|
|
262
|
+
You can customize the appearance by overriding the default Tailwind classes:
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
<DirectoryTree
|
|
266
|
+
visual={{
|
|
267
|
+
className: "custom-directory-tree",
|
|
268
|
+
style: { height: '400px' }
|
|
269
|
+
}}
|
|
270
|
+
// ... other props
|
|
271
|
+
/>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
```css
|
|
275
|
+
.custom-directory-tree {
|
|
276
|
+
/* Your custom styles */
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Advanced Usage
|
|
281
|
+
|
|
282
|
+
### Large Datasets
|
|
283
|
+
|
|
284
|
+
The component is optimized for large datasets through virtualization:
|
|
285
|
+
|
|
286
|
+
```tsx
|
|
287
|
+
import { DirectoryTree } from '@aiquants/directory-tree';
|
|
288
|
+
|
|
289
|
+
// Handle thousands of entries efficiently
|
|
290
|
+
<DirectoryTree
|
|
291
|
+
entries={largeDataset}
|
|
292
|
+
// ... other required props
|
|
293
|
+
visual={{
|
|
294
|
+
style: { height: '600px' }
|
|
295
|
+
}}
|
|
296
|
+
/>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Multiple Selection Mode
|
|
300
|
+
|
|
301
|
+
Enable multiple selection for batch operations:
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
const [selectedItems, setSelectedItems] = useState(new Set<string>());
|
|
305
|
+
|
|
306
|
+
const handleSelectionChange = (path: string, isSelected: boolean) => {
|
|
307
|
+
setSelectedItems(prev => {
|
|
308
|
+
const newSet = new Set(prev);
|
|
309
|
+
if (isSelected) {
|
|
310
|
+
newSet.add(path);
|
|
311
|
+
} else {
|
|
312
|
+
newSet.delete(path);
|
|
313
|
+
}
|
|
314
|
+
return newSet;
|
|
315
|
+
});
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
<DirectoryTree
|
|
319
|
+
// ... other props
|
|
320
|
+
selection={{
|
|
321
|
+
mode: "multiple",
|
|
322
|
+
selectedItems: selectedItems,
|
|
323
|
+
onSelectionChange: handleSelectionChange,
|
|
324
|
+
onFileSelect: handleFileSelect // Required prop
|
|
325
|
+
}}
|
|
326
|
+
/>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Custom Double-Click Behavior
|
|
330
|
+
|
|
331
|
+
Control how directories behave on double-click:
|
|
332
|
+
|
|
333
|
+
```tsx
|
|
334
|
+
<DirectoryTree
|
|
335
|
+
// ... other props
|
|
336
|
+
expansion={{
|
|
337
|
+
// ... required expansion props
|
|
338
|
+
doubleClickAction: "toggle" // Only toggle the clicked directory
|
|
339
|
+
// or
|
|
340
|
+
doubleClickAction: "recursive" // Expand/collapse all children (default)
|
|
341
|
+
}}
|
|
342
|
+
/>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### State Persistence
|
|
346
|
+
|
|
347
|
+
The `useDirectoryTreeState` hook automatically persists expansion state to localStorage:
|
|
348
|
+
|
|
349
|
+
```tsx
|
|
350
|
+
const { toggle, isExpanded, expandMultiple, collapseMultiple } = useDirectoryTreeState({
|
|
351
|
+
storageKey: 'myapp-directory-tree',
|
|
352
|
+
initialExpanded: new Set(['/src', '/docs'])
|
|
353
|
+
});
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## TypeScript Support
|
|
357
|
+
|
|
358
|
+
This package is written in TypeScript and provides comprehensive type definitions. All components and hooks are fully typed for the best development experience.
|
|
359
|
+
|
|
360
|
+
## Contributing
|
|
361
|
+
|
|
362
|
+
We welcome contributions! Please feel free to submit issues and pull requests.
|
|
363
|
+
|
|
364
|
+
## License
|
|
365
|
+
|
|
366
|
+
MIT License - see the [LICENSE](LICENSE) file for details.
|
|
367
|
+
|
|
368
|
+
## Author
|
|
369
|
+
|
|
370
|
+
- **GitHub**: [fehde-k](https://github.com/fehde-k)
|
|
371
|
+
- **X (formerly Twitter)**: [@fehdek](https://x.com/fehdek)
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
Made with โค๏ธ by the AIQuants team.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react"),oe=require("@aiquants/virtualscroll");var L=typeof document<"u"?document.currentScript:null;function ue(e){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(l,t,a.get?a:{enumerable:!0,get:()=>e[t]})}}return l.default=e,Object.freeze(l)}const k=ue(o);var Q={exports:{}},K={};var se;function me(){if(se)return K;se=1;var e=Symbol.for("react.transitional.element"),l=Symbol.for("react.fragment");function t(a,r,d){var n=null;if(d!==void 0&&(n=""+d),r.key!==void 0&&(n=""+r.key),"key"in r){d={};for(var c in r)c!=="key"&&(d[c]=r[c])}else d=r;return r=d.ref,{$$typeof:e,type:a,key:n,ref:r!==void 0?r:null,props:d}}return K.Fragment=l,K.jsx=t,K.jsxs=t,K}var E={};var re;function he(){return re||(re=1,process.env.NODE_ENV!=="production"&&(function(){function e(s){if(s==null)return null;if(typeof s=="function")return s.$$typeof===le?null:s.displayName||s.name||null;if(typeof s=="string")return s;switch(s){case S:return"Fragment";case h:return"Profiler";case R:return"StrictMode";case U:return"Suspense";case _:return"SuspenseList";case ee:return"Activity"}if(typeof s=="object")switch(typeof s.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),s.$$typeof){case f:return"Portal";case H:return s.displayName||"Context";case W:return(s._context.displayName||"Context")+".Consumer";case M:var Z=s.render;return s=s.displayName,s||(s=Z.displayName||Z.name||"",s=s!==""?"ForwardRef("+s+")":"ForwardRef"),s;case q:return Z=s.displayName||null,Z!==null?Z:e(s.type)||"Memo";case C:Z=s._payload,s=s._init;try{return e(s(Z))}catch{}}return null}function l(s){return""+s}function t(s){try{l(s);var Z=!1}catch{Z=!0}if(Z){Z=console;var x=Z.error,z=typeof Symbol=="function"&&Symbol.toStringTag&&s[Symbol.toStringTag]||s.constructor.name||"Object";return x.call(Z,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",z),l(s)}}function a(s){if(s===S)return"<>";if(typeof s=="object"&&s!==null&&s.$$typeof===C)return"<...>";try{var Z=e(s);return Z?"<"+Z+">":"<...>"}catch{return"<...>"}}function r(){var s=j.A;return s===null?null:s.getOwner()}function d(){return Error("react-stack-top-frame")}function n(s){if(i.call(s,"key")){var Z=Object.getOwnPropertyDescriptor(s,"key").get;if(Z&&Z.isReactWarning)return!1}return s.key!==void 0}function c(s,Z){function x(){v||(v=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",Z))}x.isReactWarning=!0,Object.defineProperty(s,"key",{get:x,configurable:!0})}function G(){var s=e(this.type);return g[s]||(g[s]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),s=this.props.ref,s!==void 0?s:null}function X(s,Z,x,z,O,te){var N=x.ref;return s={$$typeof:F,type:s,key:Z,props:x,_owner:z},(N!==void 0?N:null)!==null?Object.defineProperty(s,"ref",{enumerable:!1,get:G}):Object.defineProperty(s,"ref",{enumerable:!1,value:null}),s._store={},Object.defineProperty(s._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(s,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(s,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:O}),Object.defineProperty(s,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:te}),Object.freeze&&(Object.freeze(s.props),Object.freeze(s)),s}function m(s,Z,x,z,O,te){var N=Z.children;if(N!==void 0)if(z)if(V(N)){for(z=0;z<N.length;z++)p(N[z]);Object.freeze&&Object.freeze(N)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else p(N);if(i.call(Z,"key")){N=e(s);var w=Object.keys(Z).filter(function(ie){return ie!=="key"});z=0<w.length?"{key: someKey, "+w.join(": ..., ")+": ...}":"{key: someKey}",B[N+z]||(w=0<w.length?"{"+w.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
2
|
+
let props = %s;
|
|
3
|
+
<%s {...props} />
|
|
4
|
+
React keys must be passed directly to JSX without using spread:
|
|
5
|
+
let props = %s;
|
|
6
|
+
<%s key={someKey} {...props} />`,z,N,w,N),B[N+z]=!0)}if(N=null,x!==void 0&&(t(x),N=""+x),n(Z)&&(t(Z.key),N=""+Z.key),"key"in Z){x={};for(var ae in Z)ae!=="key"&&(x[ae]=Z[ae])}else x=Z;return N&&c(x,typeof s=="function"?s.displayName||s.name||"Unknown":s),X(s,N,x,r(),O,te)}function p(s){u(s)?s._store&&(s._store.validated=1):typeof s=="object"&&s!==null&&s.$$typeof===C&&(s._payload.status==="fulfilled"?u(s._payload.value)&&s._payload.value._store&&(s._payload.value._store.validated=1):s._store&&(s._store.validated=1))}function u(s){return typeof s=="object"&&s!==null&&s.$$typeof===F}var b=o,F=Symbol.for("react.transitional.element"),f=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),R=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),W=Symbol.for("react.consumer"),H=Symbol.for("react.context"),M=Symbol.for("react.forward_ref"),U=Symbol.for("react.suspense"),_=Symbol.for("react.suspense_list"),q=Symbol.for("react.memo"),C=Symbol.for("react.lazy"),ee=Symbol.for("react.activity"),le=Symbol.for("react.client.reference"),j=b.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,i=Object.prototype.hasOwnProperty,V=Array.isArray,Y=console.createTask?console.createTask:function(){return null};b={react_stack_bottom_frame:function(s){return s()}};var v,g={},J=b.react_stack_bottom_frame.bind(b,d)(),T=Y(a(d)),B={};E.Fragment=S,E.jsx=function(s,Z,x){var z=1e4>j.recentlyCreatedOwnerStacks++;return m(s,Z,x,!1,z?Error("react-stack-top-frame"):J,z?Y(a(s)):T)},E.jsxs=function(s,Z,x){var z=1e4>j.recentlyCreatedOwnerStacks++;return m(s,Z,x,!0,z?Error("react-stack-top-frame"):J,z?Y(a(s)):T)}})()),E}var ne;function Ze(){return ne||(ne=1,process.env.NODE_ENV==="production"?Q.exports=me():Q.exports=he()),Q.exports}var y=Ze(),$=class{constructor(e=2,l="[fuzzy-search]",t=console){this.level=e,this.prefix=l,this.impl=t}setLevel(e){this.level=e}setImplementation(e){this.impl=e}setPrefix(e){this.prefix=e}formatMessage(e){return typeof e=="string"?[`${this.prefix} ${e}`]:[this.prefix,e]}debug(e,...l){this.level<=0&&this.impl.debug(...this.formatMessage(e),...l)}info(e,...l){this.level<=1&&this.impl.info(...this.formatMessage(e),...l)}warn(e,...l){this.level<=2&&this.impl.warn(...this.formatMessage(e),...l)}error(e,...l){this.level<=3&&this.impl.error(...this.formatMessage(e),...l)}},D={threshold:.4,caseSensitive:!1,learningWeight:1.2,debounceMs:300,multiTermOperator:"and",autoSearchOnIndexRebuild:!0,customWeights:{},ngramSize:2,minNgramOverlap:1,sortBy:"relevance",sortOrder:"desc",enableIndexFiltering:!0,enableLevenshtein:!0,parallelSearchStrategy:"balanced",logLevel:2,indexWorkerOptions:{strategy:"hybrid",threshold:.4,ngramOverlapThreshold:.3,minCandidatesRatio:.1,maxCandidatesRatio:.5,jaroWinklerPrefix:.1,maxResults:1e3,relevanceFieldWeight:.2,relevancePerfectMatchBonus:.1},levenshteinWorkerOptions:{threshold:.3,lengthSimilarityThreshold:.1,partialMatchBonus:.1,lengthDiffPenalty:1,maxResults:1e3,relevanceFieldWeight:.15}},ce=class A{constructor(l){this.indexWorker=null,this.levenshteinWorker=null,this.initializationPromise=null,this.referenceCount=0,this.lastIndexedDataHash=null,this.buildingDataHash=null,this.buildingPromise=null,this.id=l;let t=l!=="default"?`[GlobalWorkerManager:${l}]`:"[GlobalWorkerManager]";this.logger=new $(2,t)}static getInstance(l="default"){let t=A.instances.get(l);return t||(t=new A(l),A.instances.set(l,t)),t}getLastIndexedDataHash(){return this.lastIndexedDataHash}setLastIndexedDataHash(l){this.lastIndexedDataHash=l}getBuildingPromise(l){return this.buildingDataHash===l?this.buildingPromise:null}setBuildingPromise(l,t){this.buildingDataHash=l,this.buildingPromise=t,t.finally(()=>{this.buildingDataHash===l&&(this.buildingDataHash=null,this.buildingPromise=null)})}async getWorkers(l){return l.logLevel!==void 0&&this.logger.setLevel(l.logLevel),l.logger&&this.logger.setImplementation(l.logger),this.referenceCount++,this.indexWorker&&this.levenshteinWorker?(this.logger.debug(`๐ง Using existing global Workers (ref count: ${this.referenceCount})`),l.logLevel!==void 0&&(this.indexWorker.postMessage({type:"setLogLevel",id:"system",logLevel:l.logLevel,workerId:this.id}),this.levenshteinWorker.postMessage({type:"setLogLevel",id:"system",logLevel:l.logLevel,workerId:this.id})),{indexWorker:this.indexWorker,levenshteinWorker:this.levenshteinWorker}):(this.initializationPromise||(this.initializationPromise=this.initializeWorkers(l)),await this.initializationPromise,this.indexWorker&&this.levenshteinWorker&&l.logLevel!==void 0&&(this.indexWorker.postMessage({type:"setLogLevel",id:"system",logLevel:l.logLevel,workerId:this.id}),this.levenshteinWorker.postMessage({type:"setLogLevel",id:"system",logLevel:l.logLevel,workerId:this.id})),{indexWorker:this.indexWorker,levenshteinWorker:this.levenshteinWorker})}async initializeWorkers(l){if(!(typeof Worker>"u"))try{if(!this.indexWorker){let t=(typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href).includes(".ts")?new URL("../worker/indexWorker.ts",typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href):new URL("data:text/javascript;base64,dmFyIEM9Y2xhc3N7Y29uc3RydWN0b3Iocz0yLHQ9IltmdXp6eS1zZWFyY2hdIixlPWNvbnNvbGUpe3RoaXMubGV2ZWw9cyx0aGlzLnByZWZpeD10LHRoaXMuaW1wbD1lfXNldExldmVsKHMpe3RoaXMubGV2ZWw9c31zZXRJbXBsZW1lbnRhdGlvbihzKXt0aGlzLmltcGw9c31zZXRQcmVmaXgocyl7dGhpcy5wcmVmaXg9c31mb3JtYXRNZXNzYWdlKHMpe3JldHVybiB0eXBlb2Ygcz09InN0cmluZyI/W2Ake3RoaXMucHJlZml4fSAke3N9YF06W3RoaXMucHJlZml4LHNdfWRlYnVnKHMsLi4udCl7dGhpcy5sZXZlbDw9MCYmdGhpcy5pbXBsLmRlYnVnKC4uLnRoaXMuZm9ybWF0TWVzc2FnZShzKSwuLi50KX1pbmZvKHMsLi4udCl7dGhpcy5sZXZlbDw9MSYmdGhpcy5pbXBsLmluZm8oLi4udGhpcy5mb3JtYXRNZXNzYWdlKHMpLC4uLnQpfXdhcm4ocywuLi50KXt0aGlzLmxldmVsPD0yJiZ0aGlzLmltcGwud2FybiguLi50aGlzLmZvcm1hdE1lc3NhZ2UocyksLi4udCl9ZXJyb3IocywuLi50KXt0aGlzLmxldmVsPD0zJiZ0aGlzLmltcGwuZXJyb3IoLi4udGhpcy5mb3JtYXRNZXNzYWdlKHMpLC4uLnQpfX07dmFyIHU9e3RocmVzaG9sZDouNCxjYXNlU2Vuc2l0aXZlOiExLGxlYXJuaW5nV2VpZ2h0OjEuMixkZWJvdW5jZU1zOjMwMCxtdWx0aVRlcm1PcGVyYXRvcjoiYW5kIixhdXRvU2VhcmNoT25JbmRleFJlYnVpbGQ6ITAsY3VzdG9tV2VpZ2h0czp7fSxuZ3JhbVNpemU6MixtaW5OZ3JhbU92ZXJsYXA6MSxzb3J0Qnk6InJlbGV2YW5jZSIsc29ydE9yZGVyOiJkZXNjIixlbmFibGVJbmRleEZpbHRlcmluZzohMCxlbmFibGVMZXZlbnNodGVpbjohMCxwYXJhbGxlbFNlYXJjaFN0cmF0ZWd5OiJiYWxhbmNlZCIsbG9nTGV2ZWw6MixpbmRleFdvcmtlck9wdGlvbnM6e3N0cmF0ZWd5OiJoeWJyaWQiLHRocmVzaG9sZDouNCxuZ3JhbU92ZXJsYXBUaHJlc2hvbGQ6LjMsbWluQ2FuZGlkYXRlc1JhdGlvOi4xLG1heENhbmRpZGF0ZXNSYXRpbzouNSxqYXJvV2lua2xlclByZWZpeDouMSxtYXhSZXN1bHRzOjFlMyxyZWxldmFuY2VGaWVsZFdlaWdodDouMixyZWxldmFuY2VQZXJmZWN0TWF0Y2hCb251czouMX0sbGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zOnt0aHJlc2hvbGQ6LjMsbGVuZ3RoU2ltaWxhcml0eVRocmVzaG9sZDouMSxwYXJ0aWFsTWF0Y2hCb251czouMSxsZW5ndGhEaWZmUGVuYWx0eToxLG1heFJlc3VsdHM6MWUzLHJlbGV2YW5jZUZpZWxkV2VpZ2h0Oi4xNX19O3ZhciB6PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zdGF0cz17dG90YWxTZWFyY2hlczowLHRvdGFsUHJvY2Vzc2luZ1RpbWU6MCxhdmVyYWdlU2VhcmNoVGltZTowLGxhc3RTZWFyY2hUaW1lOjAsZXJyb3JDb3VudDowLHRpbWVzdGFtcDpEYXRlLm5vdygpfTt0aGlzLmJhc2VMb2dQcmVmaXg9IltmdXp6eS1zZWFyY2gtd29ya2VyXSI7dGhpcy5sb2dnZXI9bmV3IEMoMix0aGlzLmJhc2VMb2dQcmVmaXgpO3RoaXMuZGV0YWlsZWRTdGF0cz1uZXcgTWFwO3RoaXMucGVyZm9ybWFuY2VIaXN0b3J5PVtdO3RoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uPW5ldyBNYXA7dGhpcy5maWVsZFN0YXRzPW5ldyBNYXA7dGhpcy5tZXRyaWNzPXt0aW1pbmdzOnthdmVyYWdlUHJvY2Vzc2luZ1RpbWU6MCxmYXN0ZXN0UHJvY2Vzc2luZzoxLzAsc2xvd2VzdFByb2Nlc3Npbmc6MCxsYXN0UHJvY2Vzc2luZ1RpbWU6MH0sdGhyb3VnaHB1dDp7b3BlcmF0aW9uc1BlclNlY29uZDowLHRvdGFsT3BlcmF0aW9uczowfSxxdWFsaXR5OntzdWNjZXNzUmF0ZToxLGVycm9yUmF0ZTowLHRpbWVvdXRSYXRlOjB9fX1zZXRMb2dMZXZlbChzKXt0aGlzLmxvZ2dlci5zZXRMZXZlbChzKX1zZXRXb3JrZXJJZChzKXtsZXQgdD1zP2Ake3RoaXMuYmFzZUxvZ1ByZWZpeC5zbGljZSgwLC0xKX06JHtzfV1gOnRoaXMuYmFzZUxvZ1ByZWZpeDt0aGlzLmxvZ2dlci5zZXRQcmVmaXgodCl9dXBkYXRlU3RhdHMocyx0PSEwKXt0aGlzLnN0YXRzLnRvdGFsU2VhcmNoZXMrKyx0aGlzLnN0YXRzLnRvdGFsUHJvY2Vzc2luZ1RpbWUrPXMsdGhpcy5zdGF0cy5hdmVyYWdlU2VhcmNoVGltZT10aGlzLnN0YXRzLnRvdGFsUHJvY2Vzc2luZ1RpbWUvdGhpcy5zdGF0cy50b3RhbFNlYXJjaGVzLHRoaXMuc3RhdHMubGFzdFNlYXJjaFRpbWU9cyx0aGlzLm1ldHJpY3MudGltaW5ncy5sYXN0UHJvY2Vzc2luZ1RpbWU9cyx0aGlzLm1ldHJpY3MudGltaW5ncy5hdmVyYWdlUHJvY2Vzc2luZ1RpbWU9dGhpcy5zdGF0cy5hdmVyYWdlU2VhcmNoVGltZSx0aGlzLm1ldHJpY3MudGltaW5ncy5mYXN0ZXN0UHJvY2Vzc2luZz1NYXRoLm1pbih0aGlzLm1ldHJpY3MudGltaW5ncy5mYXN0ZXN0UHJvY2Vzc2luZyxzKSx0aGlzLm1ldHJpY3MudGltaW5ncy5zbG93ZXN0UHJvY2Vzc2luZz1NYXRoLm1heCh0aGlzLm1ldHJpY3MudGltaW5ncy5zbG93ZXN0UHJvY2Vzc2luZyxzKSx0aGlzLm1ldHJpY3MudGhyb3VnaHB1dC50b3RhbE9wZXJhdGlvbnMrKyx0aGlzLm1ldHJpY3MudGltaW5ncy5hdmVyYWdlUHJvY2Vzc2luZ1RpbWU+MCYmKHRoaXMubWV0cmljcy50aHJvdWdocHV0Lm9wZXJhdGlvbnNQZXJTZWNvbmQ9MWUzL3RoaXMubWV0cmljcy50aW1pbmdzLmF2ZXJhZ2VQcm9jZXNzaW5nVGltZSksdHx8dGhpcy5zdGF0cy5lcnJvckNvdW50Kys7bGV0IGU9dGhpcy5tZXRyaWNzLnRocm91Z2hwdXQudG90YWxPcGVyYXRpb25zO3RoaXMubWV0cmljcy5xdWFsaXR5LnN1Y2Nlc3NSYXRlPShlLXRoaXMuc3RhdHMuZXJyb3JDb3VudCkvZSx0aGlzLm1ldHJpY3MucXVhbGl0eS5lcnJvclJhdGU9dGhpcy5zdGF0cy5lcnJvckNvdW50L2V9Z2V0U3RhdHMoKXtyZXR1cm57Li4udGhpcy5zdGF0c319Z2V0TWV0cmljcygpe3JldHVybnsuLi50aGlzLm1ldHJpY3N9fXJlc2V0U3RhdHMoKXt0aGlzLnN0YXRzPXt0b3RhbFNlYXJjaGVzOjAsdG90YWxQcm9jZXNzaW5nVGltZTowLGF2ZXJhZ2VTZWFyY2hUaW1lOjAsbGFzdFNlYXJjaFRpbWU6MCxlcnJvckNvdW50OjAsdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubWV0cmljcz17dGltaW5nczp7YXZlcmFnZVByb2Nlc3NpbmdUaW1lOjAsZmFzdGVzdFByb2Nlc3Npbmc6MS8wLHNsb3dlc3RQcm9jZXNzaW5nOjAsbGFzdFByb2Nlc3NpbmdUaW1lOjB9LHRocm91Z2hwdXQ6e29wZXJhdGlvbnNQZXJTZWNvbmQ6MCx0b3RhbE9wZXJhdGlvbnM6MH0scXVhbGl0eTp7c3VjY2Vzc1JhdGU6MSxlcnJvclJhdGU6MCx0aW1lb3V0UmF0ZTowfX0sdGhpcy5kZXRhaWxlZFN0YXRzLmNsZWFyKCksdGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnk9W10sdGhpcy5vcGVyYXRpb25EaXN0cmlidXRpb24uY2xlYXIoKSx0aGlzLmZpZWxkU3RhdHMuY2xlYXIoKSx0aGlzLmxvZ2dlci5pbmZvKGBcdXsxRjRDQX0gJHt0aGlzLmdldFdvcmtlclR5cGUoKX0gV29ya2VyOiBTdGF0aXN0aWNzIHJlc2V0IGNvbXBsZXRlZGApfXVwZGF0ZVdvcmtlclN0YXRzKHMsdCxlPXt9KXt0aGlzLnVwZGF0ZVN0YXRzKHQsITApO2xldCByPXRoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uLmdldChzKXx8MDt0aGlzLm9wZXJhdGlvbkRpc3RyaWJ1dGlvbi5zZXQocyxyKzEpLE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtpLG5dKT0+e3RoaXMuZGV0YWlsZWRTdGF0cy5zZXQoaSxuKX0pLHRoaXMuYWRkUGVyZm9ybWFuY2VFbnRyeSh7dGltZXN0YW1wOkRhdGUubm93KCksb3BlcmF0aW9uVHlwZTpzLHByb2Nlc3NpbmdUaW1lOnQscXVlcnlMZW5ndGg6ZS5xdWVyeUxlbmd0aHx8MCxpdGVtQ291bnQ6ZS5pdGVtQ291bnR8fDAscmVzdWx0Q291bnQ6ZS5yZXN1bHRDb3VudHx8MCxhZGRpdGlvbmFsTWV0cmljczplfSl9dXBkYXRlRmllbGRTdGF0cyhzLHQpe2xldCBlPXRoaXMuZmllbGRTdGF0cy5nZXQocyl8fHttYXRjaENvdW50OjAsYXZlcmFnZVNjb3JlOjAsdG90YWxTY29yZTowLGJlc3RTY29yZTowLHdvcnN0U2NvcmU6MX07ZS5tYXRjaENvdW50Kz0xLGUudG90YWxTY29yZSs9dCxlLmF2ZXJhZ2VTY29yZT1lLnRvdGFsU2NvcmUvZS5tYXRjaENvdW50LGUuYmVzdFNjb3JlPU1hdGgubWF4KGUuYmVzdFNjb3JlLHQpLGUud29yc3RTY29yZT1NYXRoLm1pbihlLndvcnN0U2NvcmUsdCksdGhpcy5maWVsZFN0YXRzLnNldChzLGUpfWFkZFBlcmZvcm1hbmNlRW50cnkocyl7dGhpcy5wZXJmb3JtYW5jZUhpc3RvcnkucHVzaChzKSx0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5sZW5ndGg+MTAwJiYodGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnk9dGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnkuc2xpY2UoLTEwMCkpfWdldFdvcmtlclN0YXRzKCl7cmV0dXJue2Jhc2ljOnsuLi50aGlzLnN0YXRzLHRpbWVzdGFtcDpEYXRlLm5vdygpfSx3b3JrZXJTcGVjaWZpYzp7d29ya2VyVHlwZTp0aGlzLmdldFdvcmtlclR5cGUoKSxvcGVyYXRpb25Db3VudDp0aGlzLmdldFRvdGFsT3BlcmF0aW9ucygpLG9wZXJhdGlvbkRpc3RyaWJ1dGlvbjpPYmplY3QuZnJvbUVudHJpZXModGhpcy5vcGVyYXRpb25EaXN0cmlidXRpb24pLHNwZWNpZmljTWV0cmljczp0aGlzLmdldFNwZWNpZmljTWV0cmljcygpfSxhbmFseXNpczp7ZmllbGRQZXJmb3JtYW5jZTpPYmplY3QuZnJvbUVudHJpZXModGhpcy5maWVsZFN0YXRzKSxwZXJmb3JtYW5jZUluc2lnaHRzOnRoaXMuZ2VuZXJhdGVQZXJmb3JtYW5jZUluc2lnaHRzKCkscmVjZW50SGlzdG9yeTp0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5zbGljZSgtMTApfX19c2VuZFN0YXRzVXBkYXRlKCl7bGV0IHM9e3R5cGU6InN0YXRzIixpZDpgc3RhdHMtJHtEYXRlLm5vdygpfWAsc3RhdHM6dGhpcy5nZXRXb3JrZXJTdGF0cygpLG1ldHJpY3M6dGhpcy5nZXRNZXRyaWNzKCkscHJvY2Vzc2luZ1RpbWU6MCx3b3JrZXJUeXBlOnRoaXMuZ2V0V29ya2VyVHlwZSgpLG9wZXJhdGlvbk1ldGE6e319O3RoaXMubG9nZ2VyLmluZm8oYFx1ezFGNENBfSAke3RoaXMuZ2V0V29ya2VyVHlwZSgpfSBXb3JrZXI6IFNlbmRpbmcgdW5pZmllZCBzdGF0cyB1cGRhdGVgKSxzZWxmLnBvc3RNZXNzYWdlKHMpfWdldFRvdGFsT3BlcmF0aW9ucygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uLnZhbHVlcygpKS5yZWR1Y2UoKHMsdCk9PnMrdCwwKX1nZW5lcmF0ZVBlcmZvcm1hbmNlSW5zaWdodHMoKXtpZih0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5sZW5ndGg9PT0wKXJldHVybntyZWNlbnRBdmVyYWdlUHJvY2Vzc2luZ1RpbWU6MCxyZWNlbnRBdmVyYWdlUmVzdWx0Q291bnQ6MCx0aHJvdWdocHV0UGVyU2Vjb25kOjAsdG90YWxIaXN0b3J5RW50cmllczowLG1vc3RDb21tb25RdWVyeUxlbmd0aDowLGJlc3RQZXJmb3JtaW5nRmllbGQ6IiIsc2ltaWxhcml0eURpc3RyaWJ1dGlvbjp7aGlnaFNpbWlsYXJpdHk6MCxtZWRpdW1TaW1pbGFyaXR5OjAsbG93U2ltaWxhcml0eTowLHZlcnlMb3dTaW1pbGFyaXR5OjB9fTtsZXQgcz10aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5zbGljZSgtMTApLHQ9cy5yZWR1Y2UoKG8saCk9Pm8raC5wcm9jZXNzaW5nVGltZSwwKS9zLmxlbmd0aCxlPXMucmVkdWNlKChvLGgpPT5vK2gucmVzdWx0Q291bnQsMCkvcy5sZW5ndGgscj1uZXcgTWFwO3RoaXMucGVyZm9ybWFuY2VIaXN0b3J5LmZvckVhY2gobz0+e2xldCBoPXIuZ2V0KG8ucXVlcnlMZW5ndGgpfHwwO3Iuc2V0KG8ucXVlcnlMZW5ndGgsaCsxKX0pO2xldCBpPTAsbj0wO3IuZm9yRWFjaCgobyxoKT0+e28+biYmKG49byxpPWgpfSk7bGV0IGE9IiIsYz0wO3JldHVybiB0aGlzLmZpZWxkU3RhdHMuZm9yRWFjaCgobyxoKT0+e28uYXZlcmFnZVNjb3JlPmMmJihjPW8uYXZlcmFnZVNjb3JlLGE9aCl9KSx7cmVjZW50QXZlcmFnZVByb2Nlc3NpbmdUaW1lOnQscmVjZW50QXZlcmFnZVJlc3VsdENvdW50OmUsdGhyb3VnaHB1dFBlclNlY29uZDp0PjA/MWUzL3Q6MCx0b3RhbEhpc3RvcnlFbnRyaWVzOnRoaXMucGVyZm9ybWFuY2VIaXN0b3J5Lmxlbmd0aCxtb3N0Q29tbW9uUXVlcnlMZW5ndGg6aSxiZXN0UGVyZm9ybWluZ0ZpZWxkOmEsc2ltaWxhcml0eURpc3RyaWJ1dGlvbjp7aGlnaFNpbWlsYXJpdHk6MCxtZWRpdW1TaW1pbGFyaXR5OjAsbG93U2ltaWxhcml0eTowLHZlcnlMb3dTaW1pbGFyaXR5OjB9fX1oYW5kbGVNZXNzYWdlKHMpe3RoaXMubG9nZ2VyLndhcm4oIlx1MjZBMFx1RkUwRiBCYXNlV29ya2VyLmhhbmRsZU1lc3NhZ2U6IE5vIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIil9fTt2YXIgST1jbGFzcyBleHRlbmRzIHp7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMubmdyYW1DYWNoZT1uZXcgTWFwO3RoaXMud29yZENhY2hlPW5ldyBNYXA7dGhpcy5waG9uZXRpY0NhY2hlPW5ldyBNYXA7dGhpcy5jdXJyZW50SXRlbXM9W107dGhpcy5jdXJyZW50U2VhcmNoRmllbGRzPVtdO3RoaXMuaW5kZXhNZXRhZGF0YT1udWxsO3RoaXMuaW5kZXhTdGF0cz17dG90YWxJbmRleEJ1aWxkczowLGN1cnJlbnREYXRhU2l6ZTowLGxhc3RJbmRleFRpbWU6MH07dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHM9e2Fib3ZlODA6MCxhYm92ZTYwOjAsYWJvdmU0MDowLGJlbG93NDA6MH07dGhpcy5iYXNlTG9nUHJlZml4PSJbZnV6enktc2VhcmNoLWluZGV4XSIsdGhpcy5sb2dnZXIuc2V0UHJlZml4KHRoaXMuYmFzZUxvZ1ByZWZpeCksdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCl9Z2V0V29ya2VyVHlwZSgpe3JldHVybiJpbmRleCJ9Z2V0U3BlY2lmaWNNZXRyaWNzKCl7cmV0dXJue3RvdGFsSW5kZXhCdWlsZHM6dGhpcy5pbmRleFN0YXRzLnRvdGFsSW5kZXhCdWlsZHMsY3VycmVudERhdGFTaXplOnRoaXMuaW5kZXhTdGF0cy5jdXJyZW50RGF0YVNpemUsbGFzdEluZGV4VGltZTp0aGlzLmluZGV4U3RhdHMubGFzdEluZGV4VGltZSxjYWNoZVNpemU6e25ncmFtOnRoaXMubmdyYW1DYWNoZS5zaXplLHdvcmQ6dGhpcy53b3JkQ2FjaGUuc2l6ZSxwaG9uZXRpYzp0aGlzLnBob25ldGljQ2FjaGUuc2l6ZX0saW5kZXhNZXRhZGF0YTp0aGlzLmluZGV4TWV0YWRhdGF8fHt9LHNpbWlsYXJpdHlUaHJlc2hvbGRzOnsuLi50aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0c319fXJlc2V0U3RhdHMoKXtzdXBlci5yZXNldFN0YXRzKCksdGhpcy5pbmRleFN0YXRzPXt0b3RhbEluZGV4QnVpbGRzOjAsY3VycmVudERhdGFTaXplOjAsbGFzdEluZGV4VGltZTowfSx0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cz17YWJvdmU4MDowLGFib3ZlNjA6MCxhYm92ZTQwOjAsYmVsb3c0MDowfSx0aGlzLmxvZ2dlci5pbmZvKCJcdXsxRjUyN30gSW5kZXggV29ya2VyOiBBbGwgc3RhdGlzdGljcyByZXNldCBjb21wbGV0ZWQiKX11cGRhdGVTaW1pbGFyaXR5U3RhdHModCl7dD49Ljg/dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYWJvdmU4MCsrOnQ+PS42P3RoaXMuc2ltaWxhcml0eVRocmVzaG9sZFN0YXRzLmFib3ZlNjArKzp0Pj0uND90aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5hYm92ZTQwKys6dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYmVsb3c0MCsrfWdlbmVyYXRlUGVyZm9ybWFuY2VJbnNpZ2h0cygpe2xldCB0PXN1cGVyLmdlbmVyYXRlUGVyZm9ybWFuY2VJbnNpZ2h0cygpLGU9dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYWJvdmU4MCt0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5hYm92ZTYwK3RoaXMuc2ltaWxhcml0eVRocmVzaG9sZFN0YXRzLmFib3ZlNDArdGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYmVsb3c0MCxyPWU+MD97aGlnaFNpbWlsYXJpdHk6TWF0aC5yb3VuZCh0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5hYm92ZTgwL2UqMTAwKSxtZWRpdW1TaW1pbGFyaXR5Ok1hdGgucm91bmQodGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYWJvdmU2MC9lKjEwMCksbG93U2ltaWxhcml0eTpNYXRoLnJvdW5kKHRoaXMuc2ltaWxhcml0eVRocmVzaG9sZFN0YXRzLmFib3ZlNDAvZSoxMDApLHZlcnlMb3dTaW1pbGFyaXR5Ok1hdGgucm91bmQodGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYmVsb3c0MC9lKjEwMCl9OntoaWdoU2ltaWxhcml0eTowLG1lZGl1bVNpbWlsYXJpdHk6MCxsb3dTaW1pbGFyaXR5OjAsdmVyeUxvd1NpbWlsYXJpdHk6MH07cmV0dXJuey4uLnQsc2ltaWxhcml0eURpc3RyaWJ1dGlvbjpyfX1zZXR1cE1lc3NhZ2VIYW5kbGVyKCl7c2VsZi5vbm1lc3NhZ2U9dD0+e3RoaXMuaGFuZGxlTWVzc2FnZSh0KX19aGFuZGxlTWVzc2FnZSh0KXtsZXQgZT1wZXJmb3JtYW5jZS5ub3coKSx7ZGF0YTpyfT10O3RyeXtzd2l0Y2goci50eXBlKXtjYXNlInBpbmciOnNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6InBvbmciLGlkOnIuaWR9KTticmVhaztjYXNlImJ1aWxkSW5kZXgiOnRoaXMuaGFuZGxlQnVpbGRJbmRleChyLGUpO2JyZWFrO2Nhc2UiaW5kZXhTZWFyY2giOnRoaXMuaGFuZGxlSW5kZXhTZWFyY2gocixlKTticmVhaztjYXNlImdldFN0YXRzIjp0aGlzLmhhbmRsZUdldFN0YXRzKHIsZSk7YnJlYWs7Y2FzZSJyZXNldFN0YXRzIjp0aGlzLmhhbmRsZVJlc2V0U3RhdHMocixlKTticmVhaztjYXNlInNldExvZ0xldmVsIjpyLmxvZ0xldmVsIT09dm9pZCAwJiZ0aGlzLnNldExvZ0xldmVsKHIubG9nTGV2ZWwpLHIud29ya2VySWQhPT12b2lkIDAmJnRoaXMuc2V0V29ya2VySWQoci53b3JrZXJJZCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnNlbmRFcnJvcihyLmlkLGBVbmtub3duIHJlcXVlc3QgdHlwZTogJHtyLnR5cGV9YCxlKX19Y2F0Y2goaSl7dGhpcy5zZW5kRXJyb3Ioci5pZCxpIGluc3RhbmNlb2YgRXJyb3I/aS5tZXNzYWdlOlN0cmluZyhpKSxlKX19aGFuZGxlQnVpbGRJbmRleCh0LGUpe2lmKCEodC5pdGVtcyYmdC5zZWFyY2hGaWVsZHMpKXt0aGlzLnNlbmRFcnJvcih0LmlkLCJJdGVtcyBhbmQgc2VhcmNoRmllbGRzIGFyZSByZXF1aXJlZCBmb3IgYnVpbGRJbmRleCIsZSk7cmV0dXJufWxldHtpdGVtczpyLHNlYXJjaEZpZWxkczppLG9wdGlvbnM6bn09dCxhPW4/Lm5ncmFtU2l6ZXx8dS5uZ3JhbVNpemU7dGhpcy5uZ3JhbUNhY2hlLmNsZWFyKCksdGhpcy53b3JkQ2FjaGUuY2xlYXIoKSx0aGlzLnBob25ldGljQ2FjaGUuY2xlYXIoKSx0aGlzLmN1cnJlbnRJdGVtcz1yLHRoaXMuY3VycmVudFNlYXJjaEZpZWxkcz1pLHIuZm9yRWFjaCgoaCxtKT0+e2kuZm9yRWFjaChTPT57bGV0IHA9U3RyaW5nKGhbU10/PyIiKTtpZighcClyZXR1cm47bGV0IGQ9cC50b0xvd2VyQ2FzZSgpO3RoaXMuYnVpbGROZ3JhbUluZGV4KGQsbSxhKSx0aGlzLmJ1aWxkV29yZEluZGV4KGQsbSksdGhpcy5idWlsZFBob25ldGljSW5kZXgoZCxtKX0pfSk7bGV0IGM9cGVyZm9ybWFuY2Uubm93KCktZTt0aGlzLmluZGV4TWV0YWRhdGE9e2l0ZW1Db3VudDpyLmxlbmd0aCxidWlsZFRpbWU6YyxjcmVhdGVkQXQ6RGF0ZS5ub3coKSxpbmRleGVkRmllbGRzOlsuLi5pXSxuZ3JhbVNpemU6YSxzdHJhdGVneTpuPy5pbmRleFdvcmtlck9wdGlvbnM/LnN0cmF0ZWd5fHwiaHlicmlkIix0b3RhbEluZGV4U2l6ZTp0aGlzLm5ncmFtQ2FjaGUuc2l6ZSt0aGlzLndvcmRDYWNoZS5zaXplK3RoaXMucGhvbmV0aWNDYWNoZS5zaXplLGluZGV4U2l6ZXM6e25ncmFtOnRoaXMubmdyYW1DYWNoZS5zaXplLHdvcmQ6dGhpcy53b3JkQ2FjaGUuc2l6ZSxwaG9uZXRpYzp0aGlzLnBob25ldGljQ2FjaGUuc2l6ZX19LHRoaXMuaW5kZXhTdGF0cy50b3RhbEluZGV4QnVpbGRzKyssdGhpcy5pbmRleFN0YXRzLmN1cnJlbnREYXRhU2l6ZT1yLmxlbmd0aCx0aGlzLmluZGV4U3RhdHMubGFzdEluZGV4VGltZT1jLHRoaXMudXBkYXRlV29ya2VyU3RhdHMoImJ1aWxkSW5kZXgiLGMse2l0ZW1Db3VudDpyLmxlbmd0aCxmaWVsZENvdW50OmkubGVuZ3RoLG5ncmFtU2l6ZTphLGluZGV4U2l6ZTp0aGlzLm5ncmFtQ2FjaGUuc2l6ZSt0aGlzLndvcmRDYWNoZS5zaXplK3RoaXMucGhvbmV0aWNDYWNoZS5zaXplLHN0cmF0ZWd5OiJoeWJyaWQifSk7bGV0IG89e3R5cGU6ImluZGV4UmVhZHkiLGlkOnQuaWQsc3RhdHM6dGhpcy5nZXRXb3JrZXJTdGF0cygpLG1ldHJpY3M6dGhpcy5nZXRNZXRyaWNzKCkscHJvY2Vzc2luZ1RpbWU6Yyx3b3JrZXJUeXBlOnRoaXMuZ2V0V29ya2VyVHlwZSgpLG9wZXJhdGlvbk1ldGE6e2l0ZW1Db3VudDpyLmxlbmd0aCxpbmRleFNpemU6e3RvdGFsOnRoaXMubmdyYW1DYWNoZS5zaXplK3RoaXMud29yZENhY2hlLnNpemUrdGhpcy5waG9uZXRpY0NhY2hlLnNpemUsbmdyYW06dGhpcy5uZ3JhbUNhY2hlLnNpemUsd29yZDp0aGlzLndvcmRDYWNoZS5zaXplLHBob25ldGljOnRoaXMucGhvbmV0aWNDYWNoZS5zaXplfSxzdHJhdGVneToiaHlicmlkIixuZ3JhbVNpemU6YX19O3RoaXMubG9nZ2VyLmluZm8oYFx1ezFGNTI3fSBJbmRleCBXb3JrZXI6IEJ1aWx0IGNvbXBvc2l0ZSBpbmRleCAtIE4tZ3JhbTogJHt0aGlzLm5ncmFtQ2FjaGUuc2l6ZX0sIFdvcmQ6ICR7dGhpcy53b3JkQ2FjaGUuc2l6ZX0sIFBob25ldGljOiAke3RoaXMucGhvbmV0aWNDYWNoZS5zaXplfWApLHNlbGYucG9zdE1lc3NhZ2Uobyl9aGFuZGxlR2V0U3RhdHModCxlKXtsZXQgcj17dHlwZToic3RhdHMiLGlkOnQuaWQsc3RhdHM6dGhpcy5nZXRXb3JrZXJTdGF0cygpLG1ldHJpY3M6dGhpcy5nZXRNZXRyaWNzKCkscHJvY2Vzc2luZ1RpbWU6cGVyZm9ybWFuY2Uubm93KCktZSx3b3JrZXJUeXBlOnRoaXMuZ2V0V29ya2VyVHlwZSgpLG9wZXJhdGlvbk1ldGE6e3RvdGFsSW5kZXhCdWlsZHM6dGhpcy5pbmRleFN0YXRzLnRvdGFsSW5kZXhCdWlsZHMsY3VycmVudERhdGFTaXplOnRoaXMuaW5kZXhTdGF0cy5jdXJyZW50RGF0YVNpemUsaW5kZXhTaXplczp7dG90YWw6dGhpcy5uZ3JhbUNhY2hlLnNpemUrdGhpcy53b3JkQ2FjaGUuc2l6ZSt0aGlzLnBob25ldGljQ2FjaGUuc2l6ZSxuZ3JhbTp0aGlzLm5ncmFtQ2FjaGUuc2l6ZSx3b3JkOnRoaXMud29yZENhY2hlLnNpemUscGhvbmV0aWM6dGhpcy5waG9uZXRpY0NhY2hlLnNpemV9fX07dGhpcy5sb2dnZXIuaW5mbygiXHV7MUY0Q0F9IEluZGV4IFdvcmtlcjogU2VuZGluZyBzdGF0cyB1cGRhdGUiLHIuc3RhdHMpLHNlbGYucG9zdE1lc3NhZ2Uocil9aGFuZGxlUmVzZXRTdGF0cyh0LGUpe3RoaXMucmVzZXRTdGF0cygpO2xldCByPXBlcmZvcm1hbmNlLm5vdygpLWUsaT17dHlwZToicmVzZXRTdGF0cyIsaWQ6dC5pZCxzdGF0czp0aGlzLmdldFdvcmtlclN0YXRzKCksbWV0cmljczp0aGlzLmdldE1ldHJpY3MoKSxwcm9jZXNzaW5nVGltZTpyLHdvcmtlclR5cGU6dGhpcy5nZXRXb3JrZXJUeXBlKCksb3BlcmF0aW9uTWV0YTp7cmVzZXRDb21wbGV0ZWQ6ITAsdGltZXN0YW1wOkRhdGUubm93KCl9fTt0aGlzLmxvZ2dlci5pbmZvKCJcdXsxRjUwNH0gSW5kZXggV29ya2VyOiBTdGF0aXN0aWNzIHJlc2V0IGNvbXBsZXRlZCIpLHNlbGYucG9zdE1lc3NhZ2UoaSl9aGFuZGxlSW5kZXhTZWFyY2godCxlKXtpZighdC5xdWVyeSl7dGhpcy5zZW5kRXJyb3IodC5pZCwiUXVlcnkgaXMgcmVxdWlyZWQgZm9yIGluZGV4U2VhcmNoIixlKTtyZXR1cm59aWYodGhpcy5jdXJyZW50SXRlbXMubGVuZ3RoPT09MCl7dGhpcy5zZW5kRXJyb3IodC5pZCwiSW5kZXggaXMgbm90IGJ1aWx0LiBTZW5kIGJ1aWxkSW5kZXggcmVxdWVzdCBmaXJzdC4iLGUpO3JldHVybn1sZXR7cXVlcnk6cixvcHRpb25zOml9PXQsbj1pPy5pbmRleFdvcmtlck9wdGlvbnM/LnN0cmF0ZWd5fHwiaHlicmlkIixhO3N3aXRjaChuKXtjYXNlImZhc3QiOmE9dGhpcy5nZXRGYXN0Q2FuZGlkYXRlcyhyLGl8fHt9KTticmVhaztjYXNlImFjY3VyYXRlIjphPXRoaXMuZ2V0QWNjdXJhdGVDYW5kaWRhdGVzKHIsaXx8e30pO2JyZWFrO2RlZmF1bHQ6YT10aGlzLmdldEh5YnJpZENhbmRpZGF0ZXMocixpfHx7fSk7YnJlYWt9bGV0IGM9dGhpcy5jcmVhdGVTZWFyY2hSZXN1bHRzKEFycmF5LmZyb20oYSkscixpfHx7fSksbz1wZXJmb3JtYW5jZS5ub3coKS1lO3RoaXMudXBkYXRlV29ya2VyU3RhdHMoImluZGV4U2VhcmNoIixvLHtxdWVyeUxlbmd0aDpyLmxlbmd0aCxpdGVtQ291bnQ6dGhpcy5jdXJyZW50SXRlbXMubGVuZ3RoLHJlc3VsdENvdW50OmMubGVuZ3RoLGNhbmRpZGF0ZUNvdW50OmEuc2l6ZSxzdHJhdGVneTpufSksYy5mb3JFYWNoKG09PnttLm1hdGNoZWRGaWVsZHMuZm9yRWFjaChTPT57dGhpcy51cGRhdGVGaWVsZFN0YXRzKFMsbS5zY29yZSl9KX0pO2xldCBoPXt0eXBlOiJpbmRleFNlYXJjaFJlc3VsdHMiLGlkOnQuaWQscmVzdWx0czpjLHN0YXRzOnRoaXMuZ2V0V29ya2VyU3RhdHMoKSxtZXRyaWNzOnRoaXMuZ2V0TWV0cmljcygpLHByb2Nlc3NpbmdUaW1lOm8sd29ya2VyVHlwZTp0aGlzLmdldFdvcmtlclR5cGUoKSxvcGVyYXRpb25NZXRhOntjYW5kaWRhdGVDb3VudDphLnNpemUsc3RyYXRlZ3k6bixxdWVyeUxlbmd0aDpyLmxlbmd0aCx0aHJlc2hvbGQ6aT8uaW5kZXhXb3JrZXJPcHRpb25zPy50aHJlc2hvbGR8fHUuaW5kZXhXb3JrZXJPcHRpb25zPy50aHJlc2hvbGR8fC40fX07dGhpcy5sb2dnZXIuaW5mbyhgXHV7MUY1MER9IEluZGV4IFdvcmtlcjogRm91bmQgJHtjLmxlbmd0aH0gcmVzdWx0cyBmb3IgIiR7cn0iIChzdHJhdGVneTogJHtufSlgKSxzZWxmLnBvc3RNZXNzYWdlKGgpLHRoaXMuc2VuZFN0YXRzVXBkYXRlKCl9YnVpbGROZ3JhbUluZGV4KHQsZSxyKXt0aGlzLmdlbmVyYXRlTmdyYW1zKHQscikuZm9yRWFjaChuPT57dGhpcy5uZ3JhbUNhY2hlLmhhcyhuKXx8dGhpcy5uZ3JhbUNhY2hlLnNldChuLG5ldyBTZXQpO2xldCBhPXRoaXMubmdyYW1DYWNoZS5nZXQobik7YSYmYS5hZGQoZSl9KX1idWlsZFdvcmRJbmRleCh0LGUpe3Quc3BsaXQoL1xzKy8pLmZpbHRlcihpPT5pLmxlbmd0aD4wKS5mb3JFYWNoKGk9Pnt0aGlzLndvcmRDYWNoZS5oYXMoaSl8fHRoaXMud29yZENhY2hlLnNldChpLG5ldyBTZXQpO2xldCBuPXRoaXMud29yZENhY2hlLmdldChpKTtuJiZuLmFkZChlKX0pfWJ1aWxkUGhvbmV0aWNJbmRleCh0LGUpe2xldCByPXRoaXMuZ2VuZXJhdGVQaG9uZXRpY0tleSh0KTt0aGlzLnBob25ldGljQ2FjaGUuaGFzKHIpfHx0aGlzLnBob25ldGljQ2FjaGUuc2V0KHIsbmV3IFNldCk7bGV0IGk9dGhpcy5waG9uZXRpY0NhY2hlLmdldChyKTtpJiZpLmFkZChlKX1nZW5lcmF0ZU5ncmFtcyh0LGUpe2xldCByPW5ldyBTZXQsaT10LnRvTG93ZXJDYXNlKCkudHJpbSgpO2ZvcihsZXQgbj0wO248PWkubGVuZ3RoLWU7bisrKXIuYWRkKGkuc3Vic3RyaW5nKG4sbitlKSk7cmV0dXJuIHJ9Z2VuZXJhdGVQaG9uZXRpY0tleSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9b44KhLeODtl0vZyxlPT5TdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdCgwKS05NikpLnJlcGxhY2UoL1vjgaPjgoPjgoXjgoddL2csZT0+KHtcdTMwNjM6Ilx1MzA2NCIsXHUzMDgzOiJcdTMwODQiLFx1MzA4NToiXHUzMDg2IixcdTMwODc6Ilx1MzA4OCJ9KVtlXT8/ZSkucmVwbGFjZSgv44O8L2csIiIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csIiIpfWdldEZhc3RDYW5kaWRhdGVzKHQsZSl7bGV0IHI9bmV3IFNldCxpPWUuY2FzZVNlbnNpdGl2ZT90OnQudG9Mb3dlckNhc2UoKTtyZXR1cm4gaS5zcGxpdCgvXHMrLykuZmlsdGVyKGE9PmEubGVuZ3RoPjApLmZvckVhY2goYT0+e2xldCBjPXRoaXMud29yZENhY2hlLmdldChhKTtjJiZjLmZvckVhY2gobz0+e3IuYWRkKG8pfSl9KSxyLnNpemU9PT0wJiZ0aGlzLmdlbmVyYXRlTmdyYW1zKGksZS5uZ3JhbVNpemV8fHUubmdyYW1TaXplKS5mb3JFYWNoKGM9PntsZXQgbz10aGlzLm5ncmFtQ2FjaGUuZ2V0KGMpO28mJm8uZm9yRWFjaChoPT57ci5hZGQoaCl9KX0pLHJ9Z2V0QWNjdXJhdGVDYW5kaWRhdGVzKHQsZSl7bGV0IHI9bmV3IFNldCxpPWUuY2FzZVNlbnNpdGl2ZT90OnQudG9Mb3dlckNhc2UoKSxuPWUubmdyYW1TaXplfHx1Lm5ncmFtU2l6ZSxhPWUubWluTmdyYW1PdmVybGFwfHx1Lm1pbk5ncmFtT3ZlcmxhcCxjPW5ldyBNYXAsbz10aGlzLmdlbmVyYXRlTmdyYW1zKGksbik7by5mb3JFYWNoKGc9PntsZXQgZj10aGlzLm5ncmFtQ2FjaGUuZ2V0KGcpO2YmJmYuZm9yRWFjaChsPT57Yy5zZXQobCwoYy5nZXQobCl8fDApKzEpfSl9KSxpLnNwbGl0KC9ccysvKS5maWx0ZXIoZz0+Zy5sZW5ndGg+MCkuZm9yRWFjaChnPT57bGV0IGY9dGhpcy53b3JkQ2FjaGUuZ2V0KGcpO2YmJmYuZm9yRWFjaChsPT57ci5hZGQobCl9KX0pO2xldCBtPXRoaXMuZ2VuZXJhdGVQaG9uZXRpY0tleShpKSxTPXRoaXMucGhvbmV0aWNDYWNoZS5nZXQobSk7UyYmUy5mb3JFYWNoKGc9PntyLmFkZChnKX0pO2xldCBwPWUuaW5kZXhXb3JrZXJPcHRpb25zPy5uZ3JhbU92ZXJsYXBUaHJlc2hvbGR8fHUuaW5kZXhXb3JrZXJPcHRpb25zPy5uZ3JhbU92ZXJsYXBUaHJlc2hvbGR8fC4zLGQ9TWF0aC5tYXgoYSxvLnNpemUqcCk7cmV0dXJuIGMuZm9yRWFjaCgoZyxmKT0+e2c+PWQmJnIuYWRkKGYpfSkscn1nZXRIeWJyaWRDYW5kaWRhdGVzKHQsZSl7bGV0IHI9dGhpcy5nZXRGYXN0Q2FuZGlkYXRlcyh0LGUpLGk9ZS5pbmRleFdvcmtlck9wdGlvbnM/Lm1pbkNhbmRpZGF0ZXNSYXRpb3x8dS5pbmRleFdvcmtlck9wdGlvbnM/Lm1pbkNhbmRpZGF0ZXNSYXRpb3x8LjE7ci5zaXplPE1hdGgubWluKHRoaXMuY3VycmVudEl0ZW1zLmxlbmd0aCppLDEwKSYmdGhpcy5nZXRBY2N1cmF0ZUNhbmRpZGF0ZXModCxlKS5mb3JFYWNoKGM9PntyLmFkZChjKX0pO2xldCBuPWUuaW5kZXhXb3JrZXJPcHRpb25zPy5tYXhDYW5kaWRhdGVzUmF0aW98fHUuaW5kZXhXb3JrZXJPcHRpb25zPy5tYXhDYW5kaWRhdGVzUmF0aW98fC41O3JldHVybiByLnNpemU+dGhpcy5jdXJyZW50SXRlbXMubGVuZ3RoKm4mJihyPXRoaXMuZmlsdGVyQnlOZ3JhbU92ZXJsYXAodCxyLGUubmdyYW1TaXplfHx1Lm5ncmFtU2l6ZSxlKSkscn1maWx0ZXJCeU5ncmFtT3ZlcmxhcCh0LGUscixpKXtsZXQgbj1uZXcgU2V0LGE9dGhpcy5nZW5lcmF0ZU5ncmFtcyh0LnRvTG93ZXJDYXNlKCksciksYz1pPy5pbmRleFdvcmtlck9wdGlvbnM/Lm5ncmFtT3ZlcmxhcFRocmVzaG9sZHx8dS5pbmRleFdvcmtlck9wdGlvbnM/Lm5ncmFtT3ZlcmxhcFRocmVzaG9sZHx8LjMsbz1NYXRoLm1heCgxLGEuc2l6ZSpjKTtyZXR1cm4gZS5mb3JFYWNoKGg9PntsZXQgbT0wO2EuZm9yRWFjaChTPT57dGhpcy5uZ3JhbUNhY2hlLmdldChTKT8uaGFzKGgpJiZtKyt9KSxtPj1vJiZuLmFkZChoKX0pLG59Y3JlYXRlU2VhcmNoUmVzdWx0cyh0LGUscil7bGV0IGk9W10sbj1yLmNhc2VTZW5zaXRpdmU/ZTplLnRvTG93ZXJDYXNlKCksYT10aGlzLmdldFF1ZXJ5VG9rZW5zKGUsciksbz10aGlzLmdldE11bHRpVGVybU9wZXJhdG9yKHIpPT09ImFuZCImJmEubGVuZ3RoPjEsaD1yLnNvcnRCeXx8dS5zb3J0QnksbT1oPT09InJlbGV2YW5jZSIsUz1tP3IuaW5kZXhXb3JrZXJPcHRpb25zPy5yZWxldmFuY2VGaWVsZFdlaWdodD8/dS5pbmRleFdvcmtlck9wdGlvbnM/LnJlbGV2YW5jZUZpZWxkV2VpZ2h0Pz8uMjowLHA9bT9yLmluZGV4V29ya2VyT3B0aW9ucz8ucmVsZXZhbmNlUGVyZmVjdE1hdGNoQm9udXM/P3UuaW5kZXhXb3JrZXJPcHRpb25zPy5yZWxldmFuY2VQZXJmZWN0TWF0Y2hCb251cz8/LjE6MDt0LmZvckVhY2gobD0+e2lmKGw+PXRoaXMuY3VycmVudEl0ZW1zLmxlbmd0aClyZXR1cm47bGV0IGI9dGhpcy5jdXJyZW50SXRlbXNbbF0seT0wLHg9MCxrPVtdLE09ci5pbmRleFdvcmtlck9wdGlvbnM/LnRocmVzaG9sZD8/ci50aHJlc2hvbGQ/P3UuaW5kZXhXb3JrZXJPcHRpb25zPy50aHJlc2hvbGQ/Py40O2lmKG8mJiF0aGlzLml0ZW1NYXRjaGVzVG9rZW5zKGIsYSxyKSlyZXR1cm47Zm9yKGxldCB2IG9mIHRoaXMuY3VycmVudFNlYXJjaEZpZWxkcyl7bGV0IFA9U3RyaW5nKGJbdl0/PyIiKTtpZighUCljb250aW51ZTtsZXQgTz1yLmNhc2VTZW5zaXRpdmU/UDpQLnRvTG93ZXJDYXNlKCksdz10aGlzLmNhbGN1bGF0ZUphcm9XaW5rbGVyKG4sTyxyKSxMPXIuY3VzdG9tV2VpZ2h0cz8uW3ZdPz8xLFI9dypMO3c+MCYmay5wdXNoKHYpLHc+eCYmKHg9dyksUj55JiYoeT1SKX1sZXQgVD15O2lmKG0mJmsubGVuZ3RoPjApe2xldCB2PXg+PS45OT9wOjA7VD15K2subGVuZ3RoKlMrdn1UPj1NJiYodGhpcy51cGRhdGVTaW1pbGFyaXR5U3RhdHMoVCksaS5wdXNoKHtpdGVtOmIsc2NvcmU6VCxiYXNlU2NvcmU6eCxtYXRjaGVkRmllbGRzOmssb3JpZ2luYWxJbmRleDpsfSkpfSk7bGV0IGQ9ci5zb3J0T3JkZXJ8fHUuc29ydE9yZGVyLGc7aD09PSJyZWxldmFuY2UiP2c9aS5zb3J0KChsLGIpPT5kPT09ImFzYyI/bC5zY29yZS1iLnNjb3JlOmIuc2NvcmUtbC5zY29yZSk6aD09PSJvcmlnaW5hbCI/Zz1pLnNvcnQoKGwsYik9PntsZXQgeT1sLm9yaWdpbmFsSW5kZXg/PzAseD1iLm9yaWdpbmFsSW5kZXg/PzA7cmV0dXJuIGQ9PT0iYXNjIj95LXg6eC15fSk6Zz1pLnNvcnQoKGwsYik9PmQ9PT0iYXNjIj9sLnNjb3JlLWIuc2NvcmU6Yi5zY29yZS1sLnNjb3JlKTtsZXQgZj1yLmluZGV4V29ya2VyT3B0aW9ucz8ubWF4UmVzdWx0cztyZXR1cm4gdHlwZW9mIGY9PSJudW1iZXIiP2cuc2xpY2UoMCxmKTpnfWdldE11bHRpVGVybU9wZXJhdG9yKHQpe3JldHVybiB0Lm11bHRpVGVybU9wZXJhdG9yPz91Lm11bHRpVGVybU9wZXJhdG9yPz8ib3IifWdldFF1ZXJ5VG9rZW5zKHQsZSl7cmV0dXJuKGUuY2FzZVNlbnNpdGl2ZT90OnQudG9Mb3dlckNhc2UoKSkuc3BsaXQoL1xzKy8pLmZpbHRlcihpPT5pLmxlbmd0aD4wKX1pdGVtTWF0Y2hlc1Rva2Vucyh0LGUscil7aWYoZS5sZW5ndGg9PT0wKXJldHVybiEwO2xldCBpPW5ldyBTZXQoZSk7Zm9yKGxldCBuIG9mIHRoaXMuY3VycmVudFNlYXJjaEZpZWxkcyl7aWYoaS5zaXplPT09MClicmVhaztsZXQgYT1TdHJpbmcodFtuXT8/IiIpO2lmKCFhKWNvbnRpbnVlO2xldCBjPXIuY2FzZVNlbnNpdGl2ZT9hOmEudG9Mb3dlckNhc2UoKTtmb3IobGV0IG8gb2YgZSlpZihpLmhhcyhvKSYmYy5pbmNsdWRlcyhvKSYmKGkuZGVsZXRlKG8pLGkuc2l6ZT09PTApKWJyZWFrfXJldHVybiBpLnNpemU9PT0wfWNhbGN1bGF0ZUphcm9XaW5rbGVyKHQsZSxyKXtsZXQgaT0wLG49TWF0aC5mbG9vcihNYXRoLm1heCh0Lmxlbmd0aCxlLmxlbmd0aCkvMiktMSxhPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbCghMSksYz1uZXcgQXJyYXkoZS5sZW5ndGgpLmZpbGwoITEpO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7ZCsrKXtsZXQgZz1NYXRoLm1heCgwLGQtbiksZj1NYXRoLm1pbihkK24rMSxlLmxlbmd0aCk7Zm9yKGxldCBsPWc7bDxmO2wrKylpZighY1tsXSYmdFtkXT09PWVbbF0pe2FbZF09ITAsY1tsXT0hMCxpKys7YnJlYWt9fWlmKGk9PT0wKXJldHVybiAwO2xldCBvPTAsaD0wO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7ZCsrKWlmKGFbZF0pe2Zvcig7IWNbaF07KWgrKzt0W2RdIT09ZVtoXSYmbysrLGgrK31sZXQgbT0oaS90Lmxlbmd0aCtpL2UubGVuZ3RoKyhpLW8vMikvaSkvMyxTPXI/LmluZGV4V29ya2VyT3B0aW9ucz8uamFyb1dpbmtsZXJQcmVmaXh8fHUuaW5kZXhXb3JrZXJPcHRpb25zPy5qYXJvV2lua2xlclByZWZpeHx8LjEscD0wO2Zvcig7cDw0JiZ0W3BdPT09ZVtwXTspcCsrO3JldHVybiBtK3AqUyooMS1tKX1zZW5kRXJyb3IodCxlLHIpe2xldCBpPXBlcmZvcm1hbmNlLm5vdygpLXI7dGhpcy51cGRhdGVXb3JrZXJTdGF0cygiZXJyb3IiLGkse2Vycm9yTWVzc2FnZTplLGhhc0Vycm9yOiEwfSk7bGV0IG49e3R5cGU6ImVycm9yIixpZDp0LGVycm9yOmUsc3RhdHM6dGhpcy5nZXRXb3JrZXJTdGF0cygpLG1ldHJpY3M6dGhpcy5nZXRNZXRyaWNzKCkscHJvY2Vzc2luZ1RpbWU6aSx3b3JrZXJUeXBlOnRoaXMuZ2V0V29ya2VyVHlwZSgpfTtzZWxmLnBvc3RNZXNzYWdlKG4pfX07bmV3IEk7Cg==",typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href),a=l.workerUrls?.indexWorker?new URL(l.workerUrls.indexWorker,window.location.origin):t;this.logger.debug("๐ง Global Index Worker URL:",a.toString()),this.indexWorker=new Worker(a,{type:"module"}),this.logger.info("๐ง Global Index Worker: Initialized successfully")}if(!this.levenshteinWorker){let t=(typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href).includes(".ts")?new URL("../worker/levenshteinWorker.ts",typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href):new URL("data:text/javascript;base64,dmFyIFQ9Y2xhc3N7Y29uc3RydWN0b3IoaT0yLGU9IltmdXp6eS1zZWFyY2hdIix0PWNvbnNvbGUpe3RoaXMubGV2ZWw9aSx0aGlzLnByZWZpeD1lLHRoaXMuaW1wbD10fXNldExldmVsKGkpe3RoaXMubGV2ZWw9aX1zZXRJbXBsZW1lbnRhdGlvbihpKXt0aGlzLmltcGw9aX1zZXRQcmVmaXgoaSl7dGhpcy5wcmVmaXg9aX1mb3JtYXRNZXNzYWdlKGkpe3JldHVybiB0eXBlb2YgaT09InN0cmluZyI/W2Ake3RoaXMucHJlZml4fSAke2l9YF06W3RoaXMucHJlZml4LGldfWRlYnVnKGksLi4uZSl7dGhpcy5sZXZlbDw9MCYmdGhpcy5pbXBsLmRlYnVnKC4uLnRoaXMuZm9ybWF0TWVzc2FnZShpKSwuLi5lKX1pbmZvKGksLi4uZSl7dGhpcy5sZXZlbDw9MSYmdGhpcy5pbXBsLmluZm8oLi4udGhpcy5mb3JtYXRNZXNzYWdlKGkpLC4uLmUpfXdhcm4oaSwuLi5lKXt0aGlzLmxldmVsPD0yJiZ0aGlzLmltcGwud2FybiguLi50aGlzLmZvcm1hdE1lc3NhZ2UoaSksLi4uZSl9ZXJyb3IoaSwuLi5lKXt0aGlzLmxldmVsPD0zJiZ0aGlzLmltcGwuZXJyb3IoLi4udGhpcy5mb3JtYXRNZXNzYWdlKGkpLC4uLmUpfX07dmFyIHA9e3RocmVzaG9sZDouNCxjYXNlU2Vuc2l0aXZlOiExLGxlYXJuaW5nV2VpZ2h0OjEuMixkZWJvdW5jZU1zOjMwMCxtdWx0aVRlcm1PcGVyYXRvcjoiYW5kIixhdXRvU2VhcmNoT25JbmRleFJlYnVpbGQ6ITAsY3VzdG9tV2VpZ2h0czp7fSxuZ3JhbVNpemU6MixtaW5OZ3JhbU92ZXJsYXA6MSxzb3J0Qnk6InJlbGV2YW5jZSIsc29ydE9yZGVyOiJkZXNjIixlbmFibGVJbmRleEZpbHRlcmluZzohMCxlbmFibGVMZXZlbnNodGVpbjohMCxwYXJhbGxlbFNlYXJjaFN0cmF0ZWd5OiJiYWxhbmNlZCIsbG9nTGV2ZWw6MixpbmRleFdvcmtlck9wdGlvbnM6e3N0cmF0ZWd5OiJoeWJyaWQiLHRocmVzaG9sZDouNCxuZ3JhbU92ZXJsYXBUaHJlc2hvbGQ6LjMsbWluQ2FuZGlkYXRlc1JhdGlvOi4xLG1heENhbmRpZGF0ZXNSYXRpbzouNSxqYXJvV2lua2xlclByZWZpeDouMSxtYXhSZXN1bHRzOjFlMyxyZWxldmFuY2VGaWVsZFdlaWdodDouMixyZWxldmFuY2VQZXJmZWN0TWF0Y2hCb251czouMX0sbGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zOnt0aHJlc2hvbGQ6LjMsbGVuZ3RoU2ltaWxhcml0eVRocmVzaG9sZDouMSxwYXJ0aWFsTWF0Y2hCb251czouMSxsZW5ndGhEaWZmUGVuYWx0eToxLG1heFJlc3VsdHM6MWUzLHJlbGV2YW5jZUZpZWxkV2VpZ2h0Oi4xNX19O3ZhciBrPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zdGF0cz17dG90YWxTZWFyY2hlczowLHRvdGFsUHJvY2Vzc2luZ1RpbWU6MCxhdmVyYWdlU2VhcmNoVGltZTowLGxhc3RTZWFyY2hUaW1lOjAsZXJyb3JDb3VudDowLHRpbWVzdGFtcDpEYXRlLm5vdygpfTt0aGlzLmJhc2VMb2dQcmVmaXg9IltmdXp6eS1zZWFyY2gtd29ya2VyXSI7dGhpcy5sb2dnZXI9bmV3IFQoMix0aGlzLmJhc2VMb2dQcmVmaXgpO3RoaXMuZGV0YWlsZWRTdGF0cz1uZXcgTWFwO3RoaXMucGVyZm9ybWFuY2VIaXN0b3J5PVtdO3RoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uPW5ldyBNYXA7dGhpcy5maWVsZFN0YXRzPW5ldyBNYXA7dGhpcy5tZXRyaWNzPXt0aW1pbmdzOnthdmVyYWdlUHJvY2Vzc2luZ1RpbWU6MCxmYXN0ZXN0UHJvY2Vzc2luZzoxLzAsc2xvd2VzdFByb2Nlc3Npbmc6MCxsYXN0UHJvY2Vzc2luZ1RpbWU6MH0sdGhyb3VnaHB1dDp7b3BlcmF0aW9uc1BlclNlY29uZDowLHRvdGFsT3BlcmF0aW9uczowfSxxdWFsaXR5OntzdWNjZXNzUmF0ZToxLGVycm9yUmF0ZTowLHRpbWVvdXRSYXRlOjB9fX1zZXRMb2dMZXZlbChpKXt0aGlzLmxvZ2dlci5zZXRMZXZlbChpKX1zZXRXb3JrZXJJZChpKXtsZXQgZT1pP2Ake3RoaXMuYmFzZUxvZ1ByZWZpeC5zbGljZSgwLC0xKX06JHtpfV1gOnRoaXMuYmFzZUxvZ1ByZWZpeDt0aGlzLmxvZ2dlci5zZXRQcmVmaXgoZSl9dXBkYXRlU3RhdHMoaSxlPSEwKXt0aGlzLnN0YXRzLnRvdGFsU2VhcmNoZXMrKyx0aGlzLnN0YXRzLnRvdGFsUHJvY2Vzc2luZ1RpbWUrPWksdGhpcy5zdGF0cy5hdmVyYWdlU2VhcmNoVGltZT10aGlzLnN0YXRzLnRvdGFsUHJvY2Vzc2luZ1RpbWUvdGhpcy5zdGF0cy50b3RhbFNlYXJjaGVzLHRoaXMuc3RhdHMubGFzdFNlYXJjaFRpbWU9aSx0aGlzLm1ldHJpY3MudGltaW5ncy5sYXN0UHJvY2Vzc2luZ1RpbWU9aSx0aGlzLm1ldHJpY3MudGltaW5ncy5hdmVyYWdlUHJvY2Vzc2luZ1RpbWU9dGhpcy5zdGF0cy5hdmVyYWdlU2VhcmNoVGltZSx0aGlzLm1ldHJpY3MudGltaW5ncy5mYXN0ZXN0UHJvY2Vzc2luZz1NYXRoLm1pbih0aGlzLm1ldHJpY3MudGltaW5ncy5mYXN0ZXN0UHJvY2Vzc2luZyxpKSx0aGlzLm1ldHJpY3MudGltaW5ncy5zbG93ZXN0UHJvY2Vzc2luZz1NYXRoLm1heCh0aGlzLm1ldHJpY3MudGltaW5ncy5zbG93ZXN0UHJvY2Vzc2luZyxpKSx0aGlzLm1ldHJpY3MudGhyb3VnaHB1dC50b3RhbE9wZXJhdGlvbnMrKyx0aGlzLm1ldHJpY3MudGltaW5ncy5hdmVyYWdlUHJvY2Vzc2luZ1RpbWU+MCYmKHRoaXMubWV0cmljcy50aHJvdWdocHV0Lm9wZXJhdGlvbnNQZXJTZWNvbmQ9MWUzL3RoaXMubWV0cmljcy50aW1pbmdzLmF2ZXJhZ2VQcm9jZXNzaW5nVGltZSksZXx8dGhpcy5zdGF0cy5lcnJvckNvdW50Kys7bGV0IHQ9dGhpcy5tZXRyaWNzLnRocm91Z2hwdXQudG90YWxPcGVyYXRpb25zO3RoaXMubWV0cmljcy5xdWFsaXR5LnN1Y2Nlc3NSYXRlPSh0LXRoaXMuc3RhdHMuZXJyb3JDb3VudCkvdCx0aGlzLm1ldHJpY3MucXVhbGl0eS5lcnJvclJhdGU9dGhpcy5zdGF0cy5lcnJvckNvdW50L3R9Z2V0U3RhdHMoKXtyZXR1cm57Li4udGhpcy5zdGF0c319Z2V0TWV0cmljcygpe3JldHVybnsuLi50aGlzLm1ldHJpY3N9fXJlc2V0U3RhdHMoKXt0aGlzLnN0YXRzPXt0b3RhbFNlYXJjaGVzOjAsdG90YWxQcm9jZXNzaW5nVGltZTowLGF2ZXJhZ2VTZWFyY2hUaW1lOjAsbGFzdFNlYXJjaFRpbWU6MCxlcnJvckNvdW50OjAsdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubWV0cmljcz17dGltaW5nczp7YXZlcmFnZVByb2Nlc3NpbmdUaW1lOjAsZmFzdGVzdFByb2Nlc3Npbmc6MS8wLHNsb3dlc3RQcm9jZXNzaW5nOjAsbGFzdFByb2Nlc3NpbmdUaW1lOjB9LHRocm91Z2hwdXQ6e29wZXJhdGlvbnNQZXJTZWNvbmQ6MCx0b3RhbE9wZXJhdGlvbnM6MH0scXVhbGl0eTp7c3VjY2Vzc1JhdGU6MSxlcnJvclJhdGU6MCx0aW1lb3V0UmF0ZTowfX0sdGhpcy5kZXRhaWxlZFN0YXRzLmNsZWFyKCksdGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnk9W10sdGhpcy5vcGVyYXRpb25EaXN0cmlidXRpb24uY2xlYXIoKSx0aGlzLmZpZWxkU3RhdHMuY2xlYXIoKSx0aGlzLmxvZ2dlci5pbmZvKGBcdXsxRjRDQX0gJHt0aGlzLmdldFdvcmtlclR5cGUoKX0gV29ya2VyOiBTdGF0aXN0aWNzIHJlc2V0IGNvbXBsZXRlZGApfXVwZGF0ZVdvcmtlclN0YXRzKGksZSx0PXt9KXt0aGlzLnVwZGF0ZVN0YXRzKGUsITApO2xldCByPXRoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uLmdldChpKXx8MDt0aGlzLm9wZXJhdGlvbkRpc3RyaWJ1dGlvbi5zZXQoaSxyKzEpLE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKFtzLG5dKT0+e3RoaXMuZGV0YWlsZWRTdGF0cy5zZXQocyxuKX0pLHRoaXMuYWRkUGVyZm9ybWFuY2VFbnRyeSh7dGltZXN0YW1wOkRhdGUubm93KCksb3BlcmF0aW9uVHlwZTppLHByb2Nlc3NpbmdUaW1lOmUscXVlcnlMZW5ndGg6dC5xdWVyeUxlbmd0aHx8MCxpdGVtQ291bnQ6dC5pdGVtQ291bnR8fDAscmVzdWx0Q291bnQ6dC5yZXN1bHRDb3VudHx8MCxhZGRpdGlvbmFsTWV0cmljczp0fSl9dXBkYXRlRmllbGRTdGF0cyhpLGUpe2xldCB0PXRoaXMuZmllbGRTdGF0cy5nZXQoaSl8fHttYXRjaENvdW50OjAsYXZlcmFnZVNjb3JlOjAsdG90YWxTY29yZTowLGJlc3RTY29yZTowLHdvcnN0U2NvcmU6MX07dC5tYXRjaENvdW50Kz0xLHQudG90YWxTY29yZSs9ZSx0LmF2ZXJhZ2VTY29yZT10LnRvdGFsU2NvcmUvdC5tYXRjaENvdW50LHQuYmVzdFNjb3JlPU1hdGgubWF4KHQuYmVzdFNjb3JlLGUpLHQud29yc3RTY29yZT1NYXRoLm1pbih0LndvcnN0U2NvcmUsZSksdGhpcy5maWVsZFN0YXRzLnNldChpLHQpfWFkZFBlcmZvcm1hbmNlRW50cnkoaSl7dGhpcy5wZXJmb3JtYW5jZUhpc3RvcnkucHVzaChpKSx0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5sZW5ndGg+MTAwJiYodGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnk9dGhpcy5wZXJmb3JtYW5jZUhpc3Rvcnkuc2xpY2UoLTEwMCkpfWdldFdvcmtlclN0YXRzKCl7cmV0dXJue2Jhc2ljOnsuLi50aGlzLnN0YXRzLHRpbWVzdGFtcDpEYXRlLm5vdygpfSx3b3JrZXJTcGVjaWZpYzp7d29ya2VyVHlwZTp0aGlzLmdldFdvcmtlclR5cGUoKSxvcGVyYXRpb25Db3VudDp0aGlzLmdldFRvdGFsT3BlcmF0aW9ucygpLG9wZXJhdGlvbkRpc3RyaWJ1dGlvbjpPYmplY3QuZnJvbUVudHJpZXModGhpcy5vcGVyYXRpb25EaXN0cmlidXRpb24pLHNwZWNpZmljTWV0cmljczp0aGlzLmdldFNwZWNpZmljTWV0cmljcygpfSxhbmFseXNpczp7ZmllbGRQZXJmb3JtYW5jZTpPYmplY3QuZnJvbUVudHJpZXModGhpcy5maWVsZFN0YXRzKSxwZXJmb3JtYW5jZUluc2lnaHRzOnRoaXMuZ2VuZXJhdGVQZXJmb3JtYW5jZUluc2lnaHRzKCkscmVjZW50SGlzdG9yeTp0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5zbGljZSgtMTApfX19c2VuZFN0YXRzVXBkYXRlKCl7bGV0IGk9e3R5cGU6InN0YXRzIixpZDpgc3RhdHMtJHtEYXRlLm5vdygpfWAsc3RhdHM6dGhpcy5nZXRXb3JrZXJTdGF0cygpLG1ldHJpY3M6dGhpcy5nZXRNZXRyaWNzKCkscHJvY2Vzc2luZ1RpbWU6MCx3b3JrZXJUeXBlOnRoaXMuZ2V0V29ya2VyVHlwZSgpLG9wZXJhdGlvbk1ldGE6e319O3RoaXMubG9nZ2VyLmluZm8oYFx1ezFGNENBfSAke3RoaXMuZ2V0V29ya2VyVHlwZSgpfSBXb3JrZXI6IFNlbmRpbmcgdW5pZmllZCBzdGF0cyB1cGRhdGVgKSxzZWxmLnBvc3RNZXNzYWdlKGkpfWdldFRvdGFsT3BlcmF0aW9ucygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMub3BlcmF0aW9uRGlzdHJpYnV0aW9uLnZhbHVlcygpKS5yZWR1Y2UoKGksZSk9PmkrZSwwKX1nZW5lcmF0ZVBlcmZvcm1hbmNlSW5zaWdodHMoKXtpZih0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5sZW5ndGg9PT0wKXJldHVybntyZWNlbnRBdmVyYWdlUHJvY2Vzc2luZ1RpbWU6MCxyZWNlbnRBdmVyYWdlUmVzdWx0Q291bnQ6MCx0aHJvdWdocHV0UGVyU2Vjb25kOjAsdG90YWxIaXN0b3J5RW50cmllczowLG1vc3RDb21tb25RdWVyeUxlbmd0aDowLGJlc3RQZXJmb3JtaW5nRmllbGQ6IiIsc2ltaWxhcml0eURpc3RyaWJ1dGlvbjp7aGlnaFNpbWlsYXJpdHk6MCxtZWRpdW1TaW1pbGFyaXR5OjAsbG93U2ltaWxhcml0eTowLHZlcnlMb3dTaW1pbGFyaXR5OjB9fTtsZXQgaT10aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5zbGljZSgtMTApLGU9aS5yZWR1Y2UoKGEsbyk9PmErby5wcm9jZXNzaW5nVGltZSwwKS9pLmxlbmd0aCx0PWkucmVkdWNlKChhLG8pPT5hK28ucmVzdWx0Q291bnQsMCkvaS5sZW5ndGgscj1uZXcgTWFwO3RoaXMucGVyZm9ybWFuY2VIaXN0b3J5LmZvckVhY2goYT0+e2xldCBvPXIuZ2V0KGEucXVlcnlMZW5ndGgpfHwwO3Iuc2V0KGEucXVlcnlMZW5ndGgsbysxKX0pO2xldCBzPTAsbj0wO3IuZm9yRWFjaCgoYSxvKT0+e2E+biYmKG49YSxzPW8pfSk7bGV0IGM9IiIsbD0wO3JldHVybiB0aGlzLmZpZWxkU3RhdHMuZm9yRWFjaCgoYSxvKT0+e2EuYXZlcmFnZVNjb3JlPmwmJihsPWEuYXZlcmFnZVNjb3JlLGM9byl9KSx7cmVjZW50QXZlcmFnZVByb2Nlc3NpbmdUaW1lOmUscmVjZW50QXZlcmFnZVJlc3VsdENvdW50OnQsdGhyb3VnaHB1dFBlclNlY29uZDplPjA/MWUzL2U6MCx0b3RhbEhpc3RvcnlFbnRyaWVzOnRoaXMucGVyZm9ybWFuY2VIaXN0b3J5Lmxlbmd0aCxtb3N0Q29tbW9uUXVlcnlMZW5ndGg6cyxiZXN0UGVyZm9ybWluZ0ZpZWxkOmMsc2ltaWxhcml0eURpc3RyaWJ1dGlvbjp7aGlnaFNpbWlsYXJpdHk6MCxtZWRpdW1TaW1pbGFyaXR5OjAsbG93U2ltaWxhcml0eTowLHZlcnlMb3dTaW1pbGFyaXR5OjB9fX1oYW5kbGVNZXNzYWdlKGkpe3RoaXMubG9nZ2VyLndhcm4oIlx1MjZBMFx1RkUwRiBCYXNlV29ya2VyLmhhbmRsZU1lc3NhZ2U6IE5vIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIil9fTt2YXIgTD1jbGFzcyBleHRlbmRzIGt7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuY3VycmVudEl0ZW1zPVtdO3RoaXMuY3VycmVudFNlYXJjaEZpZWxkcz1bXTt0aGlzLmRpc3RhbmNlRGlzdHJpYnV0aW9uPW5ldyBNYXA7dGhpcy5xdWVyeUxlbmd0aFN0YXRzPW5ldyBNYXA7dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHM9e2Fib3ZlODA6MCxhYm92ZTYwOjAsYWJvdmU0MDowLGJlbG93NDA6MH07dGhpcy5sZXZlbnNodGVpblN0YXRzPXt0b3RhbENhbGN1bGF0aW9uczowLHRvdGFsRGlzdGFuY2VDYWxjdWxhdGlvbnM6MCxhdmVyYWdlRGlzdGFuY2U6MCxtaW5EaXN0YW5jZToxLzAsbWF4RGlzdGFuY2U6MCxwYXJ0aWFsTWF0Y2hlczowLHBlcmZlY3RNYXRjaGVzOjB9O3RoaXMuYmFzZUxvZ1ByZWZpeD0iW2Z1enp5LXNlYXJjaC1sZXZlbnNodGVpbl0iLHRoaXMubG9nZ2VyLnNldFByZWZpeCh0aGlzLmJhc2VMb2dQcmVmaXgpLHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpfWdldFdvcmtlclR5cGUoKXtyZXR1cm4ibGV2ZW5zaHRlaW4ifWdldFNwZWNpZmljTWV0cmljcygpe3JldHVybnt0b3RhbENhbGN1bGF0aW9uczp0aGlzLmxldmVuc2h0ZWluU3RhdHMudG90YWxDYWxjdWxhdGlvbnMsdG90YWxEaXN0YW5jZUNhbGN1bGF0aW9uczp0aGlzLmxldmVuc2h0ZWluU3RhdHMudG90YWxEaXN0YW5jZUNhbGN1bGF0aW9ucyxhdmVyYWdlRGlzdGFuY2U6dGhpcy5sZXZlbnNodGVpblN0YXRzLmF2ZXJhZ2VEaXN0YW5jZSxtaW5EaXN0YW5jZTp0aGlzLmxldmVuc2h0ZWluU3RhdHMubWluRGlzdGFuY2UhPT0xLzA/dGhpcy5sZXZlbnNodGVpblN0YXRzLm1pbkRpc3RhbmNlOnZvaWQgMCxtYXhEaXN0YW5jZTp0aGlzLmxldmVuc2h0ZWluU3RhdHMubWF4RGlzdGFuY2UscGFydGlhbE1hdGNoZXM6dGhpcy5sZXZlbnNodGVpblN0YXRzLnBhcnRpYWxNYXRjaGVzLHBlcmZlY3RNYXRjaGVzOnRoaXMubGV2ZW5zaHRlaW5TdGF0cy5wZXJmZWN0TWF0Y2hlcyxkaXN0YW5jZURpc3RyaWJ1dGlvbjpPYmplY3QuZnJvbUVudHJpZXModGhpcy5kaXN0YW5jZURpc3RyaWJ1dGlvbiksc2ltaWxhcml0eVRocmVzaG9sZHM6dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMscXVlcnlMZW5ndGhTdGF0czpPYmplY3QuZnJvbUVudHJpZXModGhpcy5xdWVyeUxlbmd0aFN0YXRzKX19cmVzZXRTdGF0cygpe3N1cGVyLnJlc2V0U3RhdHMoKSx0aGlzLmRpc3RhbmNlRGlzdHJpYnV0aW9uLmNsZWFyKCksdGhpcy5xdWVyeUxlbmd0aFN0YXRzLmNsZWFyKCksdGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHM9e2Fib3ZlODA6MCxhYm92ZTYwOjAsYWJvdmU0MDowLGJlbG93NDA6MH0sdGhpcy5sZXZlbnNodGVpblN0YXRzPXt0b3RhbENhbGN1bGF0aW9uczowLHRvdGFsRGlzdGFuY2VDYWxjdWxhdGlvbnM6MCxhdmVyYWdlRGlzdGFuY2U6MCxtaW5EaXN0YW5jZToxLzAsbWF4RGlzdGFuY2U6MCxwYXJ0aWFsTWF0Y2hlczowLHBlcmZlY3RNYXRjaGVzOjB9LHRoaXMubG9nZ2VyLmluZm8oIlx1ezFGNENBfSBMZXZlbnNodGVpbiBXb3JrZXI6IEFsbCBzdGF0aXN0aWNzIGhhdmUgYmVlbiByZXNldCIpfXVwZGF0ZVNpbWlsYXJpdHlTdGF0cyhlKXtlPj0uOD90aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5hYm92ZTgwKys6ZT49LjY/dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYWJvdmU2MCsrOmU+PS40P3RoaXMuc2ltaWxhcml0eVRocmVzaG9sZFN0YXRzLmFib3ZlNDArKzp0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5iZWxvdzQwKyt9c2V0dXBNZXNzYWdlSGFuZGxlcigpe3NlbGYub25tZXNzYWdlPWU9Pnt0aGlzLmhhbmRsZU1lc3NhZ2UoZSl9fWhhbmRsZU1lc3NhZ2UoZSl7bGV0IHQ9cGVyZm9ybWFuY2Uubm93KCkse2RhdGE6cn09ZTt0cnl7c3dpdGNoKHIudHlwZSl7Y2FzZSJwaW5nIjpzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJwb25nIixpZDpyLmlkfSk7YnJlYWs7Y2FzZSJsZXZlbnNodGVpblNlYXJjaCI6dGhpcy5oYW5kbGVMZXZlbnNodGVpblNlYXJjaChyLHQpO2JyZWFrO2Nhc2UiZ2V0U3RhdHMiOnRoaXMuaGFuZGxlR2V0U3RhdHMocix0KTticmVhaztjYXNlInJlc2V0U3RhdHMiOnRoaXMuaGFuZGxlUmVzZXRTdGF0cyhyLHQpO2JyZWFrO2Nhc2Uic2V0TG9nTGV2ZWwiOnIubG9nTGV2ZWwhPT12b2lkIDAmJnRoaXMuc2V0TG9nTGV2ZWwoci5sb2dMZXZlbCksci53b3JrZXJJZCE9PXZvaWQgMCYmdGhpcy5zZXRXb3JrZXJJZChyLndvcmtlcklkKTticmVhaztkZWZhdWx0OnRoaXMuc2VuZEVycm9yKHIuaWQsYFVua25vd24gcmVxdWVzdCB0eXBlOiAke3IudHlwZX1gLHQpfX1jYXRjaChzKXt0aGlzLnNlbmRFcnJvcihyLmlkLHMgaW5zdGFuY2VvZiBFcnJvcj9zLm1lc3NhZ2U6U3RyaW5nKHMpLHQpfX1oYW5kbGVMZXZlbnNodGVpblNlYXJjaChlLHQpe2lmKHRoaXMubG9nZ2VyLmluZm8oYFx1ezFGNENGfSBMZXZlbnNodGVpbiBXb3JrZXI6IFN0YXJ0aW5nIHNlYXJjaCBmb3IgIiR7ZS5xdWVyeX0iIHdpdGggJHtlLml0ZW1zPy5sZW5ndGh8fDB9IGl0ZW1zYCksIShlLnF1ZXJ5JiZlLml0ZW1zJiZlLnNlYXJjaEZpZWxkcykpe3RoaXMuc2VuZEVycm9yKGUuaWQsIlF1ZXJ5LCBpdGVtcywgYW5kIHNlYXJjaEZpZWxkcyBhcmUgcmVxdWlyZWQgZm9yIGxldmVuc2h0ZWluU2VhcmNoIix0KTtyZXR1cm59bGV0e3F1ZXJ5OnIsaXRlbXM6cyxzZWFyY2hGaWVsZHM6bixvcHRpb25zOmN9PWU7dGhpcy5jdXJyZW50SXRlbXM9cyx0aGlzLmN1cnJlbnRTZWFyY2hGaWVsZHM9bix0aGlzLmxvZ2dlci5pbmZvKGBcdXsxRjRDRn0gTGV2ZW5zaHRlaW4gV29ya2VyOiBDb25maWd1cmF0aW9uIC0gcXVlcnk6ICIke3J9IiwgZmllbGRzOiBbJHtuLmpvaW4oIiwgIil9XSwgdGhyZXNob2xkOiAke2M/LmxldmVuc2h0ZWluV29ya2VyT3B0aW9ucz8udGhyZXNob2xkPz9jPy50aHJlc2hvbGQ/P3AubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy50aHJlc2hvbGQ/Py4zfWApO2xldCBsPWM/LmxldmVuc2h0ZWluV29ya2VyT3B0aW9ucz8udGhyZXNob2xkPz9jPy50aHJlc2hvbGQ/P3AubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy50aHJlc2hvbGQ/Py4zLGE9dGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHIsQXJyYXkuZnJvbSh7bGVuZ3RoOnMubGVuZ3RofSwoaCx1KT0+dSksY3x8e30sbCksbz1wZXJmb3JtYW5jZS5ub3coKS10O3RoaXMudXBkYXRlV29ya2VyU3RhdHMoImxldmVuc2h0ZWluU2VhcmNoIixvLHtxdWVyeUxlbmd0aDpyLmxlbmd0aCxpdGVtQ291bnQ6cy5sZW5ndGgscmVzdWx0Q291bnQ6YS5sZW5ndGgsdGhyZXNob2xkOmwsYXZlcmFnZURpc3RhbmNlOmEucmVkdWNlKChoLHUpPT5oKygxLXUuc2NvcmUpLDApLyhhLmxlbmd0aHx8MSl9KSxhLmZvckVhY2goaD0+e2gubWF0Y2hlZEZpZWxkcy5mb3JFYWNoKHU9Pnt0aGlzLnVwZGF0ZUZpZWxkU3RhdHModSxoLnNjb3JlKX0pfSk7bGV0IG09e3R5cGU6ImxldmVuc2h0ZWluU2VhcmNoIixpZDplLmlkLHJlc3VsdHM6YSxzdGF0czp0aGlzLmdldFdvcmtlclN0YXRzKCksbWV0cmljczp0aGlzLmdldE1ldHJpY3MoKSxwcm9jZXNzaW5nVGltZTpvLHdvcmtlclR5cGU6dGhpcy5nZXRXb3JrZXJUeXBlKCksb3BlcmF0aW9uTWV0YTp7dGhyZXNob2xkOmwsdG90YWxDYWxjdWxhdGlvbnM6YS5sZW5ndGgsYXZlcmFnZURpc3RhbmNlOmEucmVkdWNlKChoLHUpPT5oKygxLXUuc2NvcmUpLDApLyhhLmxlbmd0aHx8MSl9fTt0aGlzLmxvZ2dlci5pbmZvKGBcdTI2QTEgTGV2ZW5zaHRlaW4gV29ya2VyOiBDYWxjdWxhdGVkIHNpbWlsYXJpdHkgZm9yICR7cy5sZW5ndGh9IGl0ZW1zLCByZXR1cm5lZCAke2EubGVuZ3RofSByZXN1bHRzYCksdGhpcy5sb2dnZXIuaW5mbygiXHV7MUY0Q0F9IExldmVuc2h0ZWluIFdvcmtlcjogU2VuZGluZyB1bmlmaWVkIHJlc3BvbnNlIHdpdGggc3RhdHM6Iix7dG90YWxDYWxjdWxhdGlvbnM6bS5vcGVyYXRpb25NZXRhPy50b3RhbENhbGN1bGF0aW9ucyxhdmVyYWdlRGlzdGFuY2U6bS5vcGVyYXRpb25NZXRhPy5hdmVyYWdlRGlzdGFuY2Usc3RhdHNLZXlzOk9iamVjdC5rZXlzKG0uc3RhdHN8fHt9KSxwcm9jZXNzaW5nVGltZTptLnByb2Nlc3NpbmdUaW1lfSksc2VsZi5wb3N0TWVzc2FnZShtKSx0aGlzLnNlbmRTdGF0c1VwZGF0ZSgpfWhhbmRsZUdldFN0YXRzKGUsdCl7bGV0IHI9e3R5cGU6InN0YXRzIixpZDplLmlkLHN0YXRzOnRoaXMuZ2V0V29ya2VyU3RhdHMoKSxtZXRyaWNzOnRoaXMuZ2V0TWV0cmljcygpLHByb2Nlc3NpbmdUaW1lOnBlcmZvcm1hbmNlLm5vdygpLXQsd29ya2VyVHlwZTp0aGlzLmdldFdvcmtlclR5cGUoKSxvcGVyYXRpb25NZXRhOnt9fTtzZWxmLnBvc3RNZXNzYWdlKHIpfWhhbmRsZVJlc2V0U3RhdHMoZSx0KXt0aGlzLnJlc2V0U3RhdHMoKTtsZXQgcj17dHlwZToicmVzZXRTdGF0cyIsaWQ6ZS5pZCxzdGF0czp0aGlzLmdldFdvcmtlclN0YXRzKCksbWV0cmljczp0aGlzLmdldE1ldHJpY3MoKSxwcm9jZXNzaW5nVGltZTpwZXJmb3JtYW5jZS5ub3coKS10LHdvcmtlclR5cGU6dGhpcy5nZXRXb3JrZXJUeXBlKCksb3BlcmF0aW9uTWV0YTp7cmVzZXRDb21wbGV0ZWQ6ITB9fTtzZWxmLnBvc3RNZXNzYWdlKHIpfWNhbGN1bGF0ZVNpbWlsYXJpdHkoZSx0LHIscyl7dGhpcy5sb2dnZXIuaW5mbyhgXHV7MUY1MDR9IExldmVuc2h0ZWluIFdvcmtlcjogUHJvY2Vzc2luZyAke3QubGVuZ3RofSBjYW5kaWRhdGVzIHdpdGggdGhyZXNob2xkICR7c31gKTtsZXQgbj1bXSxjPXIuY2FzZVNlbnNpdGl2ZT9lOmUudG9Mb3dlckNhc2UoKSxsPXRoaXMuZ2V0UXVlcnlUb2tlbnMoZSxyKSxvPXRoaXMuZ2V0TXVsdGlUZXJtT3BlcmF0b3Iocik9PT0iYW5kIiYmbC5sZW5ndGg+MSxtPXIuc29ydEJ5fHxwLnNvcnRCeSxoPW09PT0icmVsZXZhbmNlIix1PWg/ci5sZXZlbnNodGVpbldvcmtlck9wdGlvbnM/LnJlbGV2YW5jZUZpZWxkV2VpZ2h0Pz9wLmxldmVuc2h0ZWluV29ya2VyT3B0aW9ucz8ucmVsZXZhbmNlRmllbGRXZWlnaHQ/Py4xNTowLHg9aD9yLmxldmVuc2h0ZWluV29ya2VyT3B0aW9ucz8ucGFydGlhbE1hdGNoQm9udXM/P3AubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy5wYXJ0aWFsTWF0Y2hCb251cz8/LjE6MDtmb3IobGV0IGcgb2YgdCl7aWYoZz49dGhpcy5jdXJyZW50SXRlbXMubGVuZ3RoKWNvbnRpbnVlO2xldCBkPXRoaXMuY3VycmVudEl0ZW1zW2ddO2lmKG8mJiF0aGlzLml0ZW1NYXRjaGVzVG9rZW5zKGQsbCxyKSljb250aW51ZTtsZXQgUz0wLGY9MCx5PVtdLEM9W107Zm9yKGxldCBXIG9mIHRoaXMuY3VycmVudFNlYXJjaEZpZWxkcyl7bGV0IE09U3RyaW5nKGRbV10/PyIiKTtpZighTSljb250aW51ZTtsZXQgRj1yLmNhc2VTZW5zaXRpdmU/TTpNLnRvTG93ZXJDYXNlKCksUj10aGlzLmNhbGN1bGF0ZUxldmVuc2h0ZWluU2ltaWxhcml0eShjLEYscik7dGhpcy5sZXZlbnNodGVpblN0YXRzLnRvdGFsQ2FsY3VsYXRpb25zKys7bGV0IEQ9ci5jdXN0b21XZWlnaHRzPy5bV10/PzEsdj1SKkQ7Qy5wdXNoKHYpLHY+MCYmeS5wdXNoKFcpLFI+ZiYmKGY9Uiksdj5TJiYoUz12KX1sZXQgdz1TO2gmJnkubGVuZ3RoPjAmJih3PVMreS5sZW5ndGgqdSt4KSx3Pj1zJiZuLnB1c2goe2l0ZW06ZCxzY29yZTp3LGJhc2VTY29yZTpmLG1hdGNoZWRGaWVsZHM6eSxvcmlnaW5hbEluZGV4Omd9KX1sZXQgUD1yLnNvcnRPcmRlcnx8cC5zb3J0T3JkZXIsYjttPT09InJlbGV2YW5jZSI/Yj1uLnNvcnQoKGcsZCk9PlA9PT0iYXNjIj9nLnNjb3JlLWQuc2NvcmU6ZC5zY29yZS1nLnNjb3JlKTptPT09Im9yaWdpbmFsIj9iPW4uc29ydCgoZyxkKT0+e2xldCBTPWcub3JpZ2luYWxJbmRleD8/MCxmPWQub3JpZ2luYWxJbmRleD8/MDtyZXR1cm4gUD09PSJhc2MiP1MtZjpmLVN9KTpiPW4uc29ydCgoZyxkKT0+UD09PSJhc2MiP2cuc2NvcmUtZC5zY29yZTpkLnNjb3JlLWcuc2NvcmUpO2xldCBPPXIubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy5tYXhSZXN1bHRzO3JldHVybiB0eXBlb2YgTz09Im51bWJlciI/Yi5zbGljZSgwLE8pOmJ9Z2V0TXVsdGlUZXJtT3BlcmF0b3IoZSl7cmV0dXJuIGUubXVsdGlUZXJtT3BlcmF0b3I/P3AubXVsdGlUZXJtT3BlcmF0b3I/PyJvciJ9Z2V0UXVlcnlUb2tlbnMoZSx0KXtyZXR1cm4odC5jYXNlU2Vuc2l0aXZlP2U6ZS50b0xvd2VyQ2FzZSgpKS5zcGxpdCgvXHMrLykuZmlsdGVyKHM9PnMubGVuZ3RoPjApfWl0ZW1NYXRjaGVzVG9rZW5zKGUsdCxyKXtpZih0Lmxlbmd0aD09PTApcmV0dXJuITA7bGV0IHM9bmV3IFNldCh0KTtmb3IobGV0IG4gb2YgdGhpcy5jdXJyZW50U2VhcmNoRmllbGRzKXtpZihzLnNpemU9PT0wKWJyZWFrO2xldCBjPVN0cmluZyhlW25dPz8iIik7aWYoIWMpY29udGludWU7bGV0IGw9ci5jYXNlU2Vuc2l0aXZlP2M6Yy50b0xvd2VyQ2FzZSgpO2ZvcihsZXQgYSBvZiB0KWlmKHMuaGFzKGEpJiZsLmluY2x1ZGVzKGEpJiYocy5kZWxldGUoYSkscy5zaXplPT09MCkpYnJlYWt9cmV0dXJuIHMuc2l6ZT09PTB9Y2FsY3VsYXRlTGV2ZW5zaHRlaW5TaW1pbGFyaXR5KGUsdCxyKXtpZihlPT09dClyZXR1cm4gdGhpcy5sZXZlbnNodGVpblN0YXRzLnBlcmZlY3RNYXRjaGVzKyssMTtpZihlLmxlbmd0aD09PTApcmV0dXJuIHQubGVuZ3RoPT09MD8xOjA7aWYodC5sZW5ndGg9PT0wKXJldHVybiAwO2xldCBzPU1hdGguYWJzKGUubGVuZ3RoLXQubGVuZ3RoKSxuPU1hdGgubWF4KGUubGVuZ3RoLHQubGVuZ3RoKSxjPXIubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy5sZW5ndGhEaWZmUGVuYWx0eXx8cC5sZXZlbnNodGVpbldvcmtlck9wdGlvbnM/Lmxlbmd0aERpZmZQZW5hbHR5fHwxLGw9MS1zL24qYyxhPXIubGV2ZW5zaHRlaW5Xb3JrZXJPcHRpb25zPy5sZW5ndGhTaW1pbGFyaXR5VGhyZXNob2xkfHxwLmxldmVuc2h0ZWluV29ya2VyT3B0aW9ucz8ubGVuZ3RoU2ltaWxhcml0eVRocmVzaG9sZHx8LjE7aWYobDxhKXJldHVybiAwO2xldCBvPXRoaXMubGV2ZW5zaHRlaW5EaXN0YW5jZShlLHQpLG09MS1vL247dGhpcy5sZXZlbnNodGVpblN0YXRzLnRvdGFsRGlzdGFuY2VDYWxjdWxhdGlvbnMrPTEsdGhpcy5sZXZlbnNodGVpblN0YXRzLm1pbkRpc3RhbmNlPU1hdGgubWluKHRoaXMubGV2ZW5zaHRlaW5TdGF0cy5taW5EaXN0YW5jZSxvKSx0aGlzLmxldmVuc2h0ZWluU3RhdHMubWF4RGlzdGFuY2U9TWF0aC5tYXgodGhpcy5sZXZlbnNodGVpblN0YXRzLm1heERpc3RhbmNlLG8pO2xldCBoPXRoaXMuZGlzdGFuY2VEaXN0cmlidXRpb24uZ2V0KG8pfHwwO3RoaXMuZGlzdGFuY2VEaXN0cmlidXRpb24uc2V0KG8saCsxKTtsZXQgdT10aGlzLmxldmVuc2h0ZWluU3RhdHMudG90YWxEaXN0YW5jZUNhbGN1bGF0aW9ucyx4PXRoaXMubGV2ZW5zaHRlaW5TdGF0cy5hdmVyYWdlRGlzdGFuY2U7cmV0dXJuIHRoaXMubGV2ZW5zaHRlaW5TdGF0cy5hdmVyYWdlRGlzdGFuY2U9KHgqKHUtMSkrbykvdSx0aGlzLnVwZGF0ZVNpbWlsYXJpdHlTdGF0cyhtKSx0LmluY2x1ZGVzKGUpJiZ0aGlzLmxldmVuc2h0ZWluU3RhdHMucGFydGlhbE1hdGNoZXMrKyxNYXRoLm1heCgwLG0pfWxldmVuc2h0ZWluRGlzdGFuY2UoZSx0KXtsZXQgcj1bXTtmb3IobGV0IHM9MDtzPD10Lmxlbmd0aDtzKyspcltzXT1bc107Zm9yKGxldCBzPTA7czw9ZS5sZW5ndGg7cysrKXJbMF1bc109cztmb3IobGV0IHM9MTtzPD10Lmxlbmd0aDtzKyspZm9yKGxldCBuPTE7bjw9ZS5sZW5ndGg7bisrKXQuY2hhckF0KHMtMSk9PT1lLmNoYXJBdChuLTEpP3Jbc11bbl09cltzLTFdW24tMV06cltzXVtuXT1NYXRoLm1pbihyW3MtMV1bbi0xXSsxLHJbc11bbi0xXSsxLHJbcy0xXVtuXSsxKTtyZXR1cm4gclt0Lmxlbmd0aF1bZS5sZW5ndGhdfWdlbmVyYXRlUGVyZm9ybWFuY2VJbnNpZ2h0cygpe2lmKHRoaXMucGVyZm9ybWFuY2VIaXN0b3J5Lmxlbmd0aD09PTApcmV0dXJue3JlY2VudEF2ZXJhZ2VQcm9jZXNzaW5nVGltZTowLHJlY2VudEF2ZXJhZ2VSZXN1bHRDb3VudDowLHRocm91Z2hwdXRQZXJTZWNvbmQ6MCx0b3RhbEhpc3RvcnlFbnRyaWVzOjAsbW9zdENvbW1vblF1ZXJ5TGVuZ3RoOjAsYmVzdFBlcmZvcm1pbmdGaWVsZDoiIixzaW1pbGFyaXR5RGlzdHJpYnV0aW9uOntoaWdoU2ltaWxhcml0eTowLG1lZGl1bVNpbWlsYXJpdHk6MCxsb3dTaW1pbGFyaXR5OjAsdmVyeUxvd1NpbWlsYXJpdHk6MH19O2xldCBlPXRoaXMucGVyZm9ybWFuY2VIaXN0b3J5LnNsaWNlKC0xMCksdD1lLnJlZHVjZSgocyxuKT0+cytuLnByb2Nlc3NpbmdUaW1lLDApL2UubGVuZ3RoLHI9ZS5yZWR1Y2UoKHMsbik9PnMrbi5yZXN1bHRDb3VudCwwKS9lLmxlbmd0aDtyZXR1cm57cmVjZW50QXZlcmFnZVByb2Nlc3NpbmdUaW1lOnQscmVjZW50QXZlcmFnZVJlc3VsdENvdW50OnIsdGhyb3VnaHB1dFBlclNlY29uZDplLmxlbmd0aD4wPzFlMy90OjAsdG90YWxIaXN0b3J5RW50cmllczp0aGlzLnBlcmZvcm1hbmNlSGlzdG9yeS5sZW5ndGgsbW9zdENvbW1vblF1ZXJ5TGVuZ3RoOnRoaXMuZ2V0TW9zdENvbW1vblF1ZXJ5TGVuZ3RoKCksYmVzdFBlcmZvcm1pbmdGaWVsZDp0aGlzLmdldEJlc3RQZXJmb3JtaW5nRmllbGQoKSxzaW1pbGFyaXR5RGlzdHJpYnV0aW9uOntoaWdoU2ltaWxhcml0eTp0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRTdGF0cy5hYm92ZTgwLG1lZGl1bVNpbWlsYXJpdHk6dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYWJvdmU2MCxsb3dTaW1pbGFyaXR5OnRoaXMuc2ltaWxhcml0eVRocmVzaG9sZFN0YXRzLmFib3ZlNDAsdmVyeUxvd1NpbWlsYXJpdHk6dGhpcy5zaW1pbGFyaXR5VGhyZXNob2xkU3RhdHMuYmVsb3c0MH19fWdldE1vc3RDb21tb25RdWVyeUxlbmd0aCgpe2xldCBlPTAsdD0wO3JldHVybiB0aGlzLnF1ZXJ5TGVuZ3RoU3RhdHMuZm9yRWFjaCgocixzKT0+e3IuY291bnQ+ZSYmKGU9ci5jb3VudCx0PXMpfSksdH1nZXRCZXN0UGVyZm9ybWluZ0ZpZWxkKCl7bGV0IGU9IiIsdD0wO3JldHVybiB0aGlzLmZpZWxkU3RhdHMuZm9yRWFjaCgocixzKT0+e3IuYXZlcmFnZVNjb3JlPnQmJih0PXIuYXZlcmFnZVNjb3JlLGU9cyl9KSxlfXNlbmRFcnJvcihlLHQscil7dGhpcy51cGRhdGVTdGF0cyhwZXJmb3JtYW5jZS5ub3coKS1yLCExKTtsZXQgcz17dHlwZToiZXJyb3IiLGlkOmUsZXJyb3I6dCxzdGF0czp0aGlzLmdldFdvcmtlclN0YXRzKCksbWV0cmljczp0aGlzLmdldE1ldHJpY3MoKSxwcm9jZXNzaW5nVGltZTpwZXJmb3JtYW5jZS5ub3coKS1yLHdvcmtlclR5cGU6dGhpcy5nZXRXb3JrZXJUeXBlKCksb3BlcmF0aW9uTWV0YTp7fX07c2VsZi5wb3N0TWVzc2FnZShzKX19O25ldyBMOwo=",typeof document>"u"?require("url").pathToFileURL(__filename).href:L&&L.tagName.toUpperCase()==="SCRIPT"&&L.src||new URL("index.cjs",document.baseURI).href),a=l.workerUrls?.levenshteinWorker?new URL(l.workerUrls.levenshteinWorker,window.location.origin):t;this.logger.debug("๐ง Global Levenshtein Worker URL:",a.toString()),this.levenshteinWorker=new Worker(a,{type:"module"}),this.logger.info("๐ง Global Levenshtein Worker: Initialized successfully")}}catch(t){this.logger.warn("โ ๏ธ Failed to initialize global Workers:",t)}}releaseReference(){this.referenceCount--,this.logger.debug(`๐ง Worker reference released (ref count: ${this.referenceCount})`)}dispose(){this.indexWorker&&(this.indexWorker.terminate(),this.indexWorker=null),this.levenshteinWorker&&(this.levenshteinWorker.terminate(),this.levenshteinWorker=null),this.initializationPromise=null,this.referenceCount=0,this.logger.info("๐ง Global Workers disposed")}};ce.instances=new Map;var P=ce,be=class{constructor(){this.listeners=new Map,this.logger=new $(2)}setLogger(e){this.logger=e}on(e,l){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e)?.add(l)}off(e,l){let t=this.listeners.get(e);t&&t.delete(l)}emit(e,l){let t=this.listeners.get(e);t&&t.forEach(a=>{try{a(l)}catch(r){this.logger.error(`โ Error in event listener for ${e}:`,r)}})}removeAllListeners(){this.listeners.clear()}},Ge=class{constructor(e=D){this.defaultOptions=e,this.indexWorker=null,this.levenshteinWorker=null,this.searchHistory=[],this.learningData={fieldWeights:{},queryPatterns:{},userPreferences:{preferredThreshold:.4,frequentFields:[],searchStyle:"fuzzy",lastUsedOptions:{}},performanceMetrics:{averageSearchTime:{},indexBuildTime:0}},this.requestId=0,this.pendingRequests=new Map,this.eventEmitter=new be,this.isIndexBuilt=!1,this.lastIndexedDataHash=null,this.stats={totalSearches:0,averageSearchTime:0,popularQueries:[],performanceBySize:{},workers:{index:{stats:{}},levenshtein:{stats:{}}}},this.isDisposed=!1;let l="[fuzzy-search]";e.instanceName?l=`[fuzzy-search:${e.instanceName}]`:e.workerId&&(l=`[fuzzy-search:${e.workerId}]`),this.logger=new $(e.logLevel??2,l,e.logger??console),this.eventEmitter.setLogger(this.logger),this.handleIndexWorkerMessageBound=this.handleIndexWorkerMessage.bind(this),this.handleIndexWorkerErrorBound=this.handleIndexWorkerError.bind(this),this.handleLevenshteinWorkerMessageBound=this.handleLevenshteinWorkerMessage.bind(this),this.handleLevenshteinWorkerErrorBound=this.handleLevenshteinWorkerError.bind(this),this.loadLearningData(),this.workersInitialized=this.initializeWorkers(),setInterval(()=>this.cleanupPendingRequests(),3e4)}async initializeWorkers(){if(!(typeof Worker>"u"))try{let e=await P.getInstance(this.defaultOptions.workerId).getWorkers(this.defaultOptions);if(this.isDisposed){this.logger.debug("๐ง Manager disposed before worker initialization completed");return}this.indexWorker=e.indexWorker,this.levenshteinWorker=e.levenshteinWorker,this.indexWorker&&(this.indexWorker.addEventListener("message",this.handleIndexWorkerMessageBound),this.indexWorker.addEventListener("error",this.handleIndexWorkerErrorBound),this.indexWorker.addEventListener("error",l=>{this.logger.error("๐ง Index Worker Error (Event Listener):",l)})),this.levenshteinWorker&&(this.levenshteinWorker.addEventListener("message",this.handleLevenshteinWorkerMessageBound),this.levenshteinWorker.addEventListener("error",this.handleLevenshteinWorkerErrorBound),this.levenshteinWorker.addEventListener("error",l=>{this.logger.error("๐ง Levenshtein Worker Error (Event Listener):",l)})),this.eventEmitter.emit("workers:initialized",{indexWorker:!!this.indexWorker,levenshteinWorker:!!this.levenshteinWorker}),await this.testWorkerConnectivity()}catch(e){this.logger.warn("โ ๏ธ Failed to initialize Workers:",e)}}async testWorkerConnectivity(){try{let e=[];this.indexWorker&&e.push(this.pingWorker(this.indexWorker,"index")),this.levenshteinWorker&&e.push(this.pingWorker(this.levenshteinWorker,"levenshtein")),await Promise.all(e)}catch(e){this.logger.error("๐ง Worker connectivity test failed:",e)}}async pingWorker(e,l){let t=`ping-${l}-${Date.now()}`;await new Promise((a,r)=>{let d=setTimeout(()=>{this.logger.warn(`๐ง ${l==="index"?"Index":"Levenshtein"} Worker: Ping timeout`),e.removeEventListener("message",n),r(new Error(`${l==="index"?"Index":"Levenshtein"} Worker ping timeout`))},5e3),n=c=>{let G=c.data;G.type==="pong"&&G.id===t&&(clearTimeout(d),e.removeEventListener("message",n),this.logger.debug(`๐ง ${l==="index"?"Index":"Levenshtein"} Worker: Ping successful`),a())};e.addEventListener("message",n),this.logger.debug(`๐ง ${l==="index"?"Index":"Levenshtein"} Worker: Sending ping message:`,t),e.postMessage({type:"ping",id:t})})}handleIndexWorkerMessage(e){let l=e.data;if(this.logger.debug("๐ง Index Worker message received:",l.type,l),l.type==="indexSearchResults"){let t=this.pendingRequests.get(l.id);t&&(this.pendingRequests.delete(l.id),l.error?t.reject(new Error(l.error)):t.resolve(l.results||[])),this.eventEmitter.emit("indexWorker:searchCompleted",{requestId:l.id,resultsCount:l.results?.length||0,processingTime:l.processingTime})}else if(l.type==="error"){let t=this.pendingRequests.get(l.id);t&&(this.pendingRequests.delete(l.id),t.reject(new Error(l.error||"Index Worker error"))),this.logger.error("โ Index Worker reported error:",{requestId:l.id,message:l.error,processingTime:l.processingTime}),this.eventEmitter.emit("indexWorker:error",{requestId:l.id,error:l.error,processingTime:l.processingTime})}else l.type==="indexReady"?(this.logger.info("โ
Index Worker: Index ready notification received",l),l.stats&&(this.stats.workers.index.stats=l.stats,this.eventEmitter.emit("worker:statsUpdated",{worker:"index",stats:this.stats.workers.index.stats})),this.eventEmitter.emit("indexWorker:message",l)):l.type==="pong"||l.type==="stats"&&l.stats&&(this.stats.workers.index.stats=l.stats,this.eventEmitter.emit("worker:statsUpdated",{worker:"index",stats:this.stats.workers.index.stats}));this.eventEmitter.emit("indexWorker:message",l)}handleIndexWorkerError(e){this.logger.error("๐ง Index Worker Error:",{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error,type:e.type}),this.eventEmitter.emit("indexWorker:error",e)}handleLevenshteinWorkerMessage(e){let l=e.data;if(this.logger.debug("๐ง Levenshtein Worker message received:",l.type,"stats present:",!!l.stats),l.type==="levenshteinSearch"){let t=this.pendingRequests.get(l.id);t&&(this.pendingRequests.delete(l.id),l.error?t.reject(new Error(l.error)):t.resolve(l.results||[])),l.stats&&(this.stats.workers.levenshtein.stats=l.stats,this.eventEmitter.emit("worker:statsUpdated",{worker:"levenshtein",stats:this.stats.workers.levenshtein.stats})),this.eventEmitter.emit("levenshteinWorker:searchCompleted",{requestId:l.id,processingTime:l.processingTime,workerType:l.workerType,operationMeta:l.operationMeta})}else l.type==="pong"||l.type==="stats"&&l.stats&&(this.stats.workers.levenshtein.stats=l.stats,this.eventEmitter.emit("worker:statsUpdated",{worker:"levenshtein",stats:this.stats.workers.levenshtein.stats}));this.eventEmitter.emit("levenshteinWorker:message",l)}handleLevenshteinWorkerError(e){this.logger.error("๐ง Levenshtein Worker Error:",{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error,type:e.type}),this.eventEmitter.emit("levenshteinWorker:error",e)}isLocalStorageAvailable(){try{return typeof window<"u"&&window.localStorage!==void 0}catch{return!1}}loadLearningData(){try{if(this.isLocalStorageAvailable()){let e=localStorage.getItem("fuzzy-search-learning-data");e?this.learningData=JSON.parse(e):this.initializeDefaultLearningData()}else this.initializeDefaultLearningData()}catch(e){this.logger.warn("โ ๏ธ Failed to load learning data:",e),this.initializeDefaultLearningData()}}initializeDefaultLearningData(){this.learningData={fieldWeights:{},queryPatterns:{},userPreferences:{preferredThreshold:this.defaultOptions.threshold,frequentFields:[],searchStyle:"fuzzy",lastUsedOptions:{}},performanceMetrics:{averageSearchTime:{},indexBuildTime:0}}}saveLearningData(){try{this.isLocalStorageAvailable()&&localStorage.setItem("fuzzy-search-learning-data",JSON.stringify(this.learningData))}catch(e){this.logger.warn("โ ๏ธ Failed to save learning data:",e)}}async search(e,l,t,a){let r=performance.now(),d={...this.defaultOptions,...a};a?.threshold!==void 0&&(a.levenshteinWorkerOptions||(d.levenshteinWorkerOptions={...d.levenshteinWorkerOptions,threshold:a.threshold}),a.indexWorkerOptions||(d.indexWorkerOptions={...d.indexWorkerOptions,threshold:a.threshold})),this.logger.debug(`๐ FuzzySearchManager.search called: query="${e}", items.length=${l.length}`),this.eventEmitter.emit("search:start",{query:e,options:d});try{if(await this.workersInitialized,this.isDisposed)return this.logger.debug("๐ซ search skipped because manager is disposed"),[];let n=this.generateDataHash(l,t),c=P.getInstance(this.defaultOptions.workerId),G=c.getLastIndexedDataHash();if(G!==n){let u=c.getBuildingPromise(n);if(u)this.logger.debug("๐ง Index build already in progress globally, waiting..."),await u,this.isIndexBuilt=!0,this.lastIndexedDataHash=n;else{this.logger.debug(`๐ง Building index: isIndexBuilt=${this.isIndexBuilt}, dataChanged=${G!==n}`);let b=(async()=>{await this.buildIndex(l,t,d),this.isIndexBuilt=!0,this.lastIndexedDataHash=n,c.setLastIndexedDataHash(n)})();c.setBuildingPromise(n,b),await b}}else this.isIndexBuilt?this.logger.debug("๐ง Index already built for current data, skipping rebuild"):(this.logger.debug("๐ง Index already built globally for current data, skipping rebuild"),this.isIndexBuilt=!0,this.lastIndexedDataHash=n);if(!(this.indexWorker&&this.levenshteinWorker)){if(this.isDisposed)return this.logger.debug("๐ซ search skipped because manager is disposed"),[];throw new Error("Web Workers are not available or not initialized.")}let X=await this.searchParallel(e,l,t,d),m=performance.now()-r;this.updateStats(e,m),this.updateLearningData(e,l.length,m);let p={results:X,totalItems:l.length,processingTime:m,query:e,options:d};return this.eventEmitter.emit("search:complete",p),X}catch(n){let c=n instanceof Error?n:new Error("Unknown search error");throw this.eventEmitter.emit("search:error",{error:c,query:e}),c}}async buildIndex(e,l,t){if(this.isDisposed){this.logger.debug("๐ซ buildIndex skipped because manager is disposed");return}if(!this.indexWorker){if(this.isDisposed){this.logger.debug("๐ซ buildIndex skipped because manager is disposed");return}throw new Error("Index Worker not available")}let a=`build-index-${++this.requestId}`;this.logger.debug(`๐ค Building index: requestId=${a}`);let r={type:"buildIndex",id:a,items:e,searchFields:l,options:t};return new Promise((d,n)=>{let c=null,G=m=>{let p=m;p.type==="indexReady"&&p.id===a&&(this.logger.info(`โ
Index Worker: Index built successfully (requestId=${a})`),this.logger.debug(`๐ฏ buildIndex: Match found! Resolving promise for requestId=${a}`),this.eventEmitter.off("indexWorker:message",G),this.eventEmitter.off("indexWorker:message",X),c&&(clearTimeout(c),c=null),d())},X=m=>{let p=m;p.type==="error"&&p.id===a&&(this.logger.warn(`โ buildIndex: Worker reported error for requestId=${a}`,p.error),this.eventEmitter.off("indexWorker:message",G),this.eventEmitter.off("indexWorker:message",X),c&&(clearTimeout(c),c=null),n(new Error(p.error||"Index Worker error")))};this.eventEmitter.on("indexWorker:message",G),this.eventEmitter.on("indexWorker:message",X),this.indexWorker?.postMessage(r),c=setTimeout(()=>{this.eventEmitter.off("indexWorker:message",G),this.eventEmitter.off("indexWorker:message",X),c=null,n(new Error("Index build timeout"))},6e4)})}async searchParallel(e,l,t,a){if(this.isDisposed)return this.logger.debug("๐ซ searchParallel skipped because manager is disposed"),[];this.logger.debug(`๐ searchParallel: query="${e}", items.length=${l.length}`);let{enableIndexFiltering:r,enableLevenshtein:d}=a;if(!(r||d))return this.logger.warn("โ ๏ธ Both search stages are disabled. Returning empty results."),[];let n=r?this.runIndexStage(e,l,t,a):Promise.resolve({stage:"index",results:[],processingTime:0,confidence:0,candidatesProcessed:0}),c=d?this.runLevenshteinStage(e,l,t,a):Promise.resolve({stage:"levenshtein",results:[],processingTime:0,confidence:0,candidatesProcessed:0}),[G,X]=await Promise.all([n,c]),m=this.mergeParallelResults(G,X,a.parallelSearchStrategy||"balanced",a);return this.logger.debug(`๐ง Parallel search completed: Index=${G.results.length}, Levenshtein=${X.results.length}, Merged=${m.results.length}`),m.results}async runIndexStage(e,l,t,a){let r=`index-${++this.requestId}`;this.logger.debug(`๐ค Index Stage: requestId=${r}`);let d={type:"indexSearch",id:r,query:e,items:l,searchFields:t,options:a};return this.executeWorkerStage(this.indexWorker,d,{stage:"index",confidence:.8,timeoutMessage:"Index search timeout",unavailableMessage:"Index Worker not available"})}async runLevenshteinStage(e,l,t,a){let r=`levenshtein-${++this.requestId}`;this.logger.debug(`๐ค Levenshtein Stage: requestId=${r}`);let d={type:"levenshteinSearch",id:r,query:e,items:l,searchFields:t,options:a};return this.executeWorkerStage(this.levenshteinWorker,d,{stage:"levenshtein",confidence:.9,timeoutMessage:"Levenshtein search timeout",unavailableMessage:"Levenshtein Worker not available"})}executeWorkerStage(e,l,t){if(!e)throw new Error(t.unavailableMessage);return new Promise((a,r)=>{let d=setTimeout(()=>{this.pendingRequests.has(l.id)&&(this.pendingRequests.delete(l.id),r(new Error(t.timeoutMessage)))},3e4);this.pendingRequests.set(l.id,{resolve:n=>{clearTimeout(d),a({stage:t.stage,results:n,processingTime:0,confidence:t.confidence,candidatesProcessed:n.length})},reject:n=>{clearTimeout(d),r(n)},timestamp:Date.now()}),e.postMessage(l)})}mergeParallelResults(e,l,t,a){let r=[];switch(t){case"index-first":r=e.results.length>0?e.results:l.results;break;case"levenshtein-first":r=l.results.length>0?l.results:e.results;break;default:r=this.mergeByScore([...e.results,...l.results],a);break}return{results:r,totalProcessingTime:e.processingTime+l.processingTime,indexStage:e,levenshteinStage:l,mergeStrategy:t,mergeQuality:.8}}mergeByScore(e,l){let t=new Map;e.forEach(n=>{if(n.originalIndex!==void 0){let c=t.get(n.originalIndex);(!c||n.score>c.score)&&t.set(n.originalIndex,n)}});let a=Array.from(t.values()),r=l.sortBy||D.sortBy,d=l.sortOrder||D.sortOrder;return r==="original"?a.sort((n,c)=>{let G=n.originalIndex??0,X=c.originalIndex??0;return d==="asc"?G-X:X-G}):a.sort((n,c)=>d==="asc"?n.score-c.score:c.score-n.score)}generateDataHash(e,l){return`${e.length}|${l.join(",")}|${JSON.stringify(e.slice(0,3))}`}updateStats(e,l){this.stats.totalSearches++,this.stats.averageSearchTime=(this.stats.averageSearchTime*(this.stats.totalSearches-1)+l)/this.stats.totalSearches}updateLearningData(e,l,t){this.learningData.queryPatterns[e]=(this.learningData.queryPatterns[e]??0)+1;let a=this.getPerformanceSizeKey(l);this.learningData.performanceMetrics.averageSearchTime[a]=t,this.stats.totalSearches%10===0&&this.saveLearningData()}getPerformanceSizeKey(e){return e<1e3?"small":e<1e4?"medium":e<1e5?"large":"xlarge"}cleanupPendingRequests(){let e=Date.now(),l=3e4;this.pendingRequests.forEach((t,a)=>{e-t.timestamp>l&&(t.reject(new Error("Request timeout")),this.pendingRequests.delete(a))})}updateSearchHistory(e,l,t=0,a=0){let r={query:e,timestamp:Date.now(),selectedItemId:l,resultCount:t,processingTime:a,searchTime:a,successful:t>0};this.searchHistory.unshift(r),this.searchHistory.length>1e3&&(this.searchHistory=this.searchHistory.slice(0,500))}async getStats(e=5e3){return await Promise.all([this.waitForWorkerStats(this.indexWorker,"index",e),this.waitForWorkerStats(this.levenshteinWorker,"levenshtein",e)]),this.stats}getCurrentStats(){return this.stats}async resetStats(e=5e3){let l=[this.resetWorkerStats(this.indexWorker,"index",e),this.resetWorkerStats(this.levenshteinWorker,"levenshtein",e)];this.stats={totalSearches:0,averageSearchTime:0,popularQueries:[],performanceBySize:{},workers:{index:{stats:this.createEmptyWorkerStats("index")},levenshtein:{stats:this.createEmptyWorkerStats("levenshtein")}}},this.searchHistory=[],await Promise.all(l),this.logger.info("๐ FuzzySearchManager: All statistics have been reset"),this.eventEmitter.emit("stats:reset",{timestamp:Date.now(),resetBy:"manager"})}waitForWorkerStats(e,l,t){return e?new Promise(a=>{let r=setTimeout(()=>{this.logger.warn(`โ ๏ธ getStats: Timeout waiting for ${l} worker.`),this.eventEmitter.off("worker:statsUpdated",d),a()},t),d=n=>{let{worker:c}=n;c===l&&(clearTimeout(r),this.eventEmitter.off("worker:statsUpdated",d),a())};this.eventEmitter.on("worker:statsUpdated",d),e.postMessage({type:"getStats"})}):Promise.resolve()}resetWorkerStats(e,l,t){return e?new Promise(a=>{let r=setTimeout(()=>{this.logger.warn(`โ ๏ธ resetStats: Timeout waiting for ${l} worker.`),e.removeEventListener("message",d),a()},t),d=c=>{c.data.type==="resetStats"&&(clearTimeout(r),e.removeEventListener("message",d),this.logger.info(`๐ ${l} worker statistics have been reset`),a())};e.addEventListener("message",d);let n={type:"resetStats",id:`resetStats-${Date.now()}-${l}`};e.postMessage(n)}):Promise.resolve()}createEmptyWorkerStats(e){return{basic:{totalSearches:0,totalProcessingTime:0,averageSearchTime:0,lastSearchTime:0,errorCount:0,timestamp:Date.now()},workerSpecific:{workerType:e,operationCount:0,operationDistribution:{},specificMetrics:{}},analysis:{fieldPerformance:{},performanceInsights:{recentAverageProcessingTime:0,recentAverageResultCount:0,throughputPerSecond:0,totalHistoryEntries:0,mostCommonQueryLength:0,bestPerformingField:"",similarityDistribution:{highSimilarity:0,mediumSimilarity:0,lowSimilarity:0,veryLowSimilarity:0}},recentHistory:[]}}}getSearchHistory(){return[...this.searchHistory]}on(e,l){this.eventEmitter.on(e,l)}off(e,l){this.eventEmitter.off(e,l)}async prebuildIndex(e,l,t){this.logger.info(`๐๏ธ Pre-building index for ${e.length} items`);try{if(await this.workersInitialized,this.isDisposed){this.logger.debug("๐ซ prebuildIndex skipped because manager is disposed");return}let a=this.generateDataHash(e,l),r=P.getInstance(this.defaultOptions.workerId),d=r.getLastIndexedDataHash();if(this.logger.debug(`๐ง Checking index status: globalHash=${d}, currentHash=${a}`),!this.isIndexBuilt||this.lastIndexedDataHash!==a){if(d===a){this.logger.debug("๐ง Index already built globally for current data, skipping pre-build"),this.isIndexBuilt=!0,this.lastIndexedDataHash=a;return}let n=r.getBuildingPromise(a);if(n){this.logger.debug("๐ง Index build already in progress globally, waiting..."),await n,this.isIndexBuilt=!0,this.lastIndexedDataHash=a;return}this.logger.debug(`๐ง Pre-building index: isIndexBuilt=${this.isIndexBuilt}, dataChanged=${this.lastIndexedDataHash!==a}`);let c=(async()=>{await this.rebuildIndex(e,l,t)})();r.setBuildingPromise(a,c),await c,this.logger.info(`โ
Index pre-built successfully for ${e.length} items`)}else this.logger.debug("๐ง Index already built for current data, skipping pre-build")}catch(a){throw this.logger.error("๐ง Error during index pre-building:",a),a}}async rebuildIndex(e,l,t){this.logger.info(`๐ Starting forced index rebuild for ${e.length} items`);let a={...this.defaultOptions,...t};try{if(await this.workersInitialized,this.isDisposed){this.logger.debug("๐ซ rebuildIndex skipped because manager is disposed");return}this.isIndexBuilt=!1,this.lastIndexedDataHash=null,await this.buildIndex(e,l,a),this.logger.info(`โ
Index rebuild completed successfully for ${e.length} items`),this.isIndexBuilt=!0,this.lastIndexedDataHash=this.generateDataHash(e,l),P.getInstance(this.defaultOptions.workerId).setLastIndexedDataHash(this.lastIndexedDataHash),this.eventEmitter.emit("index:rebuilt",{itemCount:e.length,searchFields:l,timestamp:Date.now()})}catch(r){throw this.logger.error("โ Failed to rebuild index:",r),this.eventEmitter.emit("index:rebuildError",{error:r instanceof Error?r.message:String(r),timestamp:Date.now()}),r}}dispose(){this.isDisposed=!0,this.indexWorker&&(this.indexWorker.removeEventListener("message",this.handleIndexWorkerMessageBound),this.indexWorker.removeEventListener("error",this.handleIndexWorkerErrorBound)),this.levenshteinWorker&&(this.levenshteinWorker.removeEventListener("message",this.handleLevenshteinWorkerMessageBound),this.levenshteinWorker.removeEventListener("error",this.handleLevenshteinWorkerErrorBound)),P.getInstance(this.defaultOptions.workerId).releaseReference(),this.indexWorker=null,this.levenshteinWorker=null,this.pendingRequests.clear(),this.eventEmitter.removeAllListeners(),this.saveLearningData()}},I=(e,l)=>{if(typeof e=="string"&&e.trim())return e;if(e instanceof Error&&e.message.trim())return e.message;if(typeof e=="object"&&e!==null){if("error"in e)return I(e.error,l);if("message"in e)return I(e.message,l)}return l};function pe(e,l,t){let[a,r]=o.useState(""),[d,n]=o.useState([]),[c,G]=o.useState(!1),[X,m]=o.useState(!1),[p,u]=o.useState(null),[b,F]=o.useState([]),[f,S]=o.useState({totalSearches:0,averageSearchTime:0,itemCount:e.length,resultsCount:0,workerStats:void 0}),R=o.useMemo(()=>{let i={...D,...t};return t?.threshold!==void 0&&(t.levenshteinWorkerOptions||(i.levenshteinWorkerOptions={...i.levenshteinWorkerOptions,threshold:t.threshold}),t.indexWorkerOptions||(i.indexWorkerOptions={...i.indexWorkerOptions,threshold:t.threshold})),i},[t]),h=o.useMemo(()=>{let i="[fuzzy-search-react]";return R.instanceName?i=`[fuzzy-search-react:${R.instanceName}]`:R.workerId&&(i=`[fuzzy-search-react:${R.workerId}]`),new $(R.logLevel??2,i,R.logger??console)},[R.logLevel,R.logger,R.workerId,R.instanceName]),W=o.useRef(null),H=o.useRef(a);o.useEffect(()=>{H.current=a},[a]);let M=o.useMemo(()=>l.map(i=>String(i)),[l]);o.useEffect(()=>(W.current=new Ge(R),h.debug("๐ง FuzzySearchManager created (initial setup)"),()=>{h.debug("๐ง FuzzySearchManager disposed (component unmount)"),W.current?.dispose(),W.current=null}),[R,h]),o.useEffect(()=>{if(!W.current)return;let i=()=>{if(W.current){let g=W.current.getCurrentStats(),J={totalSearches:g?.totalSearches??0,averageSearchTime:g?.averageSearchTime??0,itemCount:e.length,resultsCount:d.length,workerStats:{index:g?.workers.index.stats,levenshtein:g?.workers.levenshtein.stats}};S(J)}},V=g=>{let J=I(g,"Index Worker error");h.error("โ Index worker error event",g),u(J),m(!1)},Y=g=>{let J=I(g,"Index rebuild error");h.error("โ Index rebuild error event",g),u(J),m(!1)},v=g=>{let J=I(g,"Search execution failed");h.error("โ Search error event",g),u(J)};return W.current.on("worker:statsUpdated",i),W.current.on("search:complete",i),W.current.on("indexWorker:error",V),W.current.on("index:rebuildError",Y),W.current.on("search:error",v),()=>{W.current&&(W.current.off("worker:statsUpdated",i),W.current.off("search:complete",i),W.current.off("indexWorker:error",V),W.current.off("index:rebuildError",Y),W.current.off("search:error",v))}});let U=o.useCallback(async i=>{if(W.current){if(h.debug(`๐ performSearch called with query: "${i}"`),i!==H.current){h.debug(`๐ซ performSearch skipped for stale query: "${i}" (current: "${H.current}")`);return}try{if(h.debug(`๐ Setting isSearching to true for query: "${i}"`),G(!0),u(null),!i.trim()){if(i!==H.current)return;n(e.map((J,T)=>({item:J,score:1,baseScore:1,matchedFields:[],relevanceReason:"ๅ
จไปถ่กจ็คบ",originalIndex:T}))),h.debug(`๐ Setting isSearching to false for empty query: "${i}"`),G(!1);return}h.info(`๐ Starting search with query: "${i}", items count: ${e.length}`);let V=performance.now(),Y=await W.current.search(i,e,M,R),v=performance.now()-V;if(i!==H.current){h.debug(`๐ซ Search result ignored for stale query: "${i}" (current: "${H.current}")`);return}h.info(`โ
Search completed with ${Y.length} results in ${v}ms`),n(Y);let g={query:i,timestamp:Date.now(),resultCount:Y.length,processingTime:v,searchTime:v,successful:Y.length>0};F(J=>{let T=J.filter(B=>B.query!==i);return[g,...T].slice(0,50)})}catch(V){if(i!==H.current)return;h.error(`โ Search error for query: "${i}"`,V),u(V instanceof Error?V.message:"Search failed"),n([])}finally{i===H.current&&(h.debug(`๐ Setting isSearching to false (finally) for query: "${i}"`),G(!1))}}},[e,M,R,h.info,h.error,h.debug]);o.useEffect(()=>{if(!W.current||e.length===0)return;let i=!1,V=R.autoSearchOnIndexRebuild??!0;return h.info(`๐๏ธ Data changed, pre-building index for ${e.length} items`),m(!0),W.current.prebuildIndex(e,M,R).then(()=>{!i&&V&&(h.debug("๐ Re-running search after index rebuild"),U(H.current))}).catch(Y=>{h.warn("๐ง Failed to pre-build index:",Y),u(I(Y,"ใคใณใใใฏในใฎไบๅๆง็ฏไธญใซใจใฉใผใ็บ็ใใพใใ"))}).finally(()=>{i||m(!1)}),()=>{i=!0}},[e,M,R,U,h.warn,h.info,h.debug]),o.useEffect(()=>{h.debug(`๐ฏ useEffect triggered - searchTerm: "${a}", debounceMs: ${R.debounceMs}`);let i=setTimeout(()=>{h.debug(`โฐ Timeout executing performSearch for: "${a}"`),U(a)},R.debounceMs);return()=>{h.debug(`๐ซ Timeout cleared for: "${a}"`),clearTimeout(i)}},[a,R,U,h]),o.useEffect(()=>{a.trim()||n(e.map((i,V)=>({item:i,score:1,baseScore:1,matchedFields:[],relevanceReason:"ๅ
จไปถ่กจ็คบ",originalIndex:V})))},[e,a]);let _=o.useCallback((i,V)=>{h.info("๐ฏ Selected item:",i,"at index:",V)},[h]),q=o.useCallback(()=>{r(""),u(null)},[]),C=o.useCallback(()=>{F([])},[]),ee=o.useCallback(async()=>{if(W.current){await W.current.resetStats(),F([]),u(null);let i=W.current.getCurrentStats(),V={totalSearches:i?.totalSearches??0,averageSearchTime:i?.averageSearchTime??0,itemCount:e.length,resultsCount:d.length,workerStats:{index:i?.workers.index.stats,levenshtein:i?.workers.levenshtein.stats}};S(V),h.info("๐ useFuzzySearch: Statistics have been reset and refreshed")}},[e.length,d.length,h]),le=o.useCallback((i,V=5)=>{let Y=b.filter(v=>v.query.toLowerCase().includes(i.toLowerCase())&&v.query!==i).sort((v,g)=>g.timestamp-v.timestamp).slice(0,V).map(v=>v.query);return Array.from(new Set(Y))},[b]),j=o.useCallback(async i=>{if(!W.current){h.warn("โ ๏ธ Search manager is not initialized");return}h.info(`๐ Rebuilding index for ${e.length} items`),m(!0),u(null);try{let V=i?{...R,...i}:R;await W.current.rebuildIndex(e,M,V),h.info("โ
Index rebuild completed successfully")}catch(V){let Y=V instanceof Error?V.message:"ใคใณใใใฏในๅๆง็ฏไธญใซใจใฉใผใ็บ็ใใพใใ";throw h.error("โ Index rebuild failed:",Y),u(Y),V}finally{m(!1)}},[e,M,R,h]);return{searchTerm:a,setSearchTerm:r,filteredItems:d,isSearching:c,isIndexBuilding:X,error:p,searchHistory:b,options:R,selectItem:_,clearSearch:q,clearHistory:C,resetStats:ee,getSearchSuggestions:le,performanceMetrics:f,rebuildIndex:j}}function Xe(e,l){const t=o.useMemo(()=>({threshold:.3,sortBy:"score",sortOrder:"desc"}),[]),a=o.useMemo(()=>["label"],[]),{setSearchTerm:r,filteredItems:d,isSearching:n}=pe(e,a,t);o.useEffect(()=>{r(l)},[l,r]);const c=o.useMemo(()=>{if(!l)return e;const G=l.toLowerCase(),X=[],m=[];for(const p of d){const u=p.item;u.label.toLowerCase()===G?X.push(u):m.push(u)}return[...X,...m]},[d,l,e]);return{filteredOptions:l?c:e,isSearching:n}}function We({value:e,onChange:l,multiple:t}){const[a,r]=o.useState(!1),[d,n]=o.useState(""),c=o.useRef(null);o.useEffect(()=>{const p=u=>{c.current&&!c.current.contains(u.target)&&r(!1)};return document.addEventListener("mousedown",p),()=>{document.removeEventListener("mousedown",p)}},[]);const G=o.useCallback(p=>{if(t){const u=Array.isArray(e)?e:e?[e]:[],b=u.some(f=>f.value===p.value);let F;b?F=u.filter(f=>f.value!==p.value):F=[...u,p],l?.(F)}else l?.(p),r(!1),n("")},[t,e,l]),X=o.useCallback(p=>{if(!t)return;const b=(Array.isArray(e)?e:e?[e]:[]).filter(F=>F.value!==p.value);l?.(b)},[t,e,l]),m=o.useCallback(()=>{r(p=>!p)},[]);return{isOpen:a,setIsOpen:r,query:d,setQuery:n,containerRef:c,handleSelect:G,handleRemove:X,toggleOpen:m}}function ye({title:e,titleId:l,...t},a){return k.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":l},t),e?k.createElement("title",{id:l},e):null,k.createElement("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 0 1 .143 1.052l-8 10.5a.75.75 0 0 1-1.127.075l-4.5-4.5a.75.75 0 0 1 1.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 0 1 1.05-.143Z",clipRule:"evenodd"}))}const de=k.forwardRef(ye);function Re({title:e,titleId:l,...t},a){return k.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":l},t),e?k.createElement("title",{id:l},e):null,k.createElement("path",{fillRule:"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const Ve=k.forwardRef(Re);function xe({title:e,titleId:l,...t},a){return k.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":l},t),e?k.createElement("title",{id:l},e):null,k.createElement("path",{d:"M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z"}))}const ge=k.forwardRef(xe),Ye=({option:e,isSelected:l,isFocused:t,onClick:a,multiple:r,style:d})=>y.jsxs("div",{role:"option","aria-selected":l,tabIndex:0,onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&a(e)},style:d,onClick:()=>a(e),className:`sb-option ${t?"sb-option--focused":""}
|
|
7
|
+
${l&&!r?"sb-option--selected":"sb-option--not-selected"}
|
|
8
|
+
`,children:[r&&y.jsx("div",{className:`sb-checkbox ${l?"sb-checkbox--checked":"sb-checkbox--unchecked"}
|
|
9
|
+
`,children:l&&y.jsx(de,{className:"sb-check-icon-white"})}),y.jsx("span",{className:"sb-option-label",children:e.label}),!r&&l&&y.jsx(de,{className:"sb-check-icon-blue"})]}),ze=({options:e,value:l,multiple:t,onSelect:a,className:r})=>{const[d,n]=o.useState(300),c=o.useRef(null),G=o.useRef(!1),X=b=>{G.current=!0,b.currentTarget.setPointerCapture(b.pointerId),b.preventDefault()},m=o.useCallback(b=>{if(!(G.current&&c.current))return;const F=c.current.getBoundingClientRect(),f=b.clientY-F.top;n(Math.max(100,Math.min(f,600)))},[]),p=o.useCallback(()=>{G.current=!1},[]);o.useEffect(()=>(document.addEventListener("pointermove",m),document.addEventListener("pointerup",p),()=>{document.removeEventListener("pointermove",m),document.removeEventListener("pointerup",p)}),[m,p]);const u=b=>t?(Array.isArray(l)?l:l?[l]:[]).some(f=>f.value===b.value):l?.value===b.value;return y.jsxs("div",{ref:c,className:`sb-dropdown ${r||""}`,style:{height:d},children:[e.length>0?y.jsx(oe.VirtualScroll,{itemCount:e.length,getItem:b=>e[b],getItemHeight:()=>36,viewportSize:d,className:"h-full w-full",scrollBarOptions:{width:10,enableThumbDrag:!0,enableTrackClick:!0},behaviorOptions:{enableKeyboardNavigation:!0},children:(b,F)=>b?y.jsx(Ye,{option:b,isSelected:u(b),onClick:a,multiple:t,style:{height:36}},b.value):null}):y.jsx("div",{className:"sb-no-options",children:"No options found"}),y.jsx("div",{onPointerDown:X,className:"sb-resize-handle",children:y.jsxs("svg",{viewBox:"0 0 10 10",className:"sb-resize-icon",children:[y.jsx("title",{children:"Resize handle"}),y.jsx("path",{d:"M10 10L10 0L0 10Z"})]})})]})},Ne=({value:e,multiple:l,query:t,onQueryChange:a,onRemove:r,onFocus:d,placeholder:n="Select...",disabled:c,isLoading:G})=>{const X=o.useRef(null),m=Array.isArray(e)?e:e?[e]:[],p=u=>{u.key==="Backspace"&&!t&&m.length>0&&l&&r(m[m.length-1])};return y.jsxs("fieldset",{className:`sb-input-area ${c?"sb-input-area--disabled":"sb-input-area--active"}
|
|
10
|
+
`,onMouseDown:u=>{const b=u.target;b!==X.current&&!b.closest("button")&&(u.preventDefault(),X.current?.focus())},children:[l&&m.map(u=>y.jsxs("span",{className:"sb-tag",children:[u.label,y.jsx("button",{type:"button",onClick:b=>{b.stopPropagation(),r(u)},className:"sb-tag-remove",children:y.jsx(ge,{className:"h-3 w-3"})})]},u.value)),!l&&m.length>0&&!t&&y.jsx("span",{className:"sb-single-value",children:m[0].label}),y.jsx("input",{ref:X,type:"text",value:t,onChange:u=>a(u.target.value),onFocus:d,onKeyDown:p,placeholder:m.length===0?n:"",disabled:c,className:"sb-input"}),y.jsx("div",{className:"sb-indicators",children:G?y.jsxs("svg",{className:"sb-loading-icon",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[y.jsx("title",{children:"Loading"}),y.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),y.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}):y.jsx(Ve,{className:"sb-chevron-icon"})})]})},Le=e=>{const{isOpen:l,setIsOpen:t,query:a,setQuery:r,containerRef:d,handleSelect:n,handleRemove:c}=We(e),{filteredOptions:G,isSearching:X}=Xe(e.options,a);return y.jsxs("div",{ref:d,className:`sb-container ${e.className||""}`,children:[y.jsx(Ne,{value:e.value,multiple:e.multiple,query:a,onQueryChange:m=>{r(m),l||t(!0)},onRemove:c,onFocus:()=>t(!0),placeholder:e.placeholder,disabled:e.disabled,isLoading:X}),l&&!e.disabled&&y.jsx(ze,{options:G,value:e.value,multiple:e.multiple,onSelect:n})]})};exports.SelectBox=Le;
|
package/dist/index.d.ts
ADDED