From cbc1bac76cb134790d433e9e2bfeade945511f67 Mon Sep 17 00:00:00 2001 From: Simon Reinisch Date: Sat, 18 Jan 2025 16:48:46 +0100 Subject: [PATCH 01/11] docs: set up vitepress --- docs/.gitignore | 2 + docs/.vitepress/config.mts | 53 ++ docs/index.md | 48 ++ docs/pages/api-reference.md | 347 +++++++++ docs/pages/custom-integration.md | 9 + docs/pages/faq.md | 15 + docs/pages/frameworks/preact.md | 129 ++++ docs/pages/frameworks/react.md | 128 ++++ docs/pages/frameworks/vanilla.md | 106 +++ docs/pages/frameworks/vue.md | 153 ++++ docs/pages/quickstart.md | 161 +++++ docs/public/favicon.png | Bin 0 -> 7999 bytes docs/public/logo.png | Bin 0 -> 106085 bytes package.json | 8 +- pnpm-lock.yaml | 1159 ++++++++++++++++++++++++++++++ 15 files changed, 2316 insertions(+), 2 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/index.md create mode 100644 docs/pages/api-reference.md create mode 100644 docs/pages/custom-integration.md create mode 100644 docs/pages/faq.md create mode 100644 docs/pages/frameworks/preact.md create mode 100644 docs/pages/frameworks/react.md create mode 100644 docs/pages/frameworks/vanilla.md create mode 100644 docs/pages/frameworks/vue.md create mode 100644 docs/pages/quickstart.md create mode 100644 docs/public/favicon.png create mode 100644 docs/public/logo.png diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..c26b0d3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +.vitepress/dist +.vitepress/cache diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..87d8438 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,53 @@ +import {defineConfig} from 'vitepress'; +import { createRequire } from 'node:module' + +const require = createRequire(import.meta.url) + +export default defineConfig({ + title: 'Viselect', + base: '/viselect/', + description: 'Viselect - A high performance and lightweight library to add a visual way of selecting elements, just like on your Desktop. Zero dependencies, super small.', + head: [ + ['link', {rel: 'icon', href: 'favicon.png'}] + ], + themeConfig: { + nav: [ + {text: 'Home', link: '/'}, + {text: 'FAQ', link: '/pages/faq'}, + {text: 'API Reference', link: 'pages/api-reference'}, + ], + sidebar: [ + { + text: 'Introduction', + items: [ + {text: 'Quickstart', link: 'pages/quickstart'}, + {text: 'API Reference', link: 'pages/api-reference'}, + {text: 'Custom Integration', link: 'pages/custom-integration'}, + ] + }, + { + text: 'Frameworks', + items: [ + {text: 'Vanilla', link: 'pages/frameworks/vanilla'}, + {text: 'React', link: 'pages/frameworks/react'}, + {text: 'Preact', link: 'pages/frameworks/preact'}, + {text: 'Vue', link: 'pages/frameworks/vue'} + ] + } + ], + socialLinks: [ + {icon: 'github', link: 'https://github.com/simonwep/viselect'} + ], + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright Β© 2018-present Simon Reinisch' + } + }, + vite: { + resolve: { + alias: { + '@viselect/vanilla': require.resolve('../../packages/vanilla/dist/viselect.mjs') + } + } + } +}); diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..9b3b244 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,48 @@ +--- +layout: home + +hero: + name: "Viselect" + text: "Visual Selection Library" + tagline: "A modern, ultra-tiny, and highly optimized selection library" + image: + src: logo.png + alt: Viselect logo + actions: + - theme: brand + text: Quickstart + link: pages/quickstart + - theme: alt + text: API Reference + link: pages/api-reference + +features: + - icon: 🌟 + title: Modern Bundle + details: A cutting-edge bundle for modern web development, ensuring compatibility with the latest standards and practices. + - icon: πŸ”© + title: Ultra Tiny + details: Extremely lightweight, around 4kb in size, making it perfect for performance-critical applications. + - icon: πŸ‘Œ + title: Simple Usage + details: Easy to use with minimal setup required, allowing developers to integrate it quickly into their projects. + - icon: ⚑ + title: Highly Optimized + details: Performance-focused and highly efficient, designed to handle large datasets and complex operations smoothly. + - icon: πŸš€ + title: Zero Dependencies + details: No external dependencies required, reducing the risk of conflicts and simplifying the build process. + - icon: πŸ“± + title: Mobile / Touch Support + details: Fully compatible with mobile and touch devices, providing a seamless experience across all platforms. + - icon: πŸ–± + title: Scroll Support + details: Supports both vertical and horizontal scrolling, ensuring smooth navigation and interaction. + - icon: πŸ’ͺ + title: Proven Stability + details: Over 3 years of development and widely used in many applications, demonstrating its reliability and robustness. + - icon: πŸ–Ό + title: Framework Support + details: Compatible with major frameworks (work in progress), making it versatile and easy to integrate with various technologies. +--- + diff --git a/docs/pages/api-reference.md b/docs/pages/api-reference.md new file mode 100644 index 0000000..4dc888a --- /dev/null +++ b/docs/pages/api-reference.md @@ -0,0 +1,347 @@ +--- +outline: deep +--- + +# API Reference + +The `SelectionArea` is the main class of the library, it is responsible for handling the selection process. +It is passed to each event and can be used to interact with the selection process. + +### Static Properties + +The only static property is the version of the library. + +```typescript +version: string; +``` + +### Methods + +#### `constructor` + +Instantiates a new `SelectionArea`. + +```typescript +constructor(opt: PartialSelectionOptions): SelectionArea; +``` + +- `opt: PartialSelectionOptions` - The options for the selection area. + +#### `trigger` + +Manually triggers the start of a selection, can be used to start a selection without a user interaction. + +```typescript +trigger(evt: MouseEvent | TouchEvent, silent = true): void; +``` + +- `evt: MouseEvent | TouchEvent` - A MouseEvent or TouchEvent-like object. +- `silent: boolean` - If `beforestart` should be fired. + +#### `resolveSelectables` + +Updates the list of selectables, useful if new elements have been added during a selection. + +```typescript +resolveSelectables(): void; +``` + +#### `clearSelection` + +Clears the selection. + +```typescript +clearSelection(includeStored = true, quiet = false): void; +``` + +- `includeStored: boolean` - If the store should also get cleared. +- `quiet: boolean` - If move/stop events should be fired. + +#### `getSelection` + +Returns currently selected elements. + +```typescript +getSelection(): Element[]; +``` + +#### `getSelectionArea` + +Returns the selection area element. + +```typescript +getSelectionArea(): HTMLElement; +``` + +#### `getSelectables` + +Returns all selectables. + +```typescript +getSelectables(): Element[]; +``` + +#### `setAreaLocation` + +Sets the location of the selection area. + +```typescript +setAreaLocation(location: Partial): void; +``` + +- `location: Partial` - A partial AreaLocation object. + +#### `getAreaLocation` + +Returns the current location of the selection area. + +```typescript +getAreaLocation(): AreaLocation; +``` + +#### `cancel` + +Cancels the current selection process. + +```typescript +cancel(keepEvent = false): void; +``` + +- `keepEvent: boolean` - If a stop event should be fired. + +#### `destroy` + +Unbinds all events and removes the area-element. + +```typescript +destroy(): void; +``` + +#### `enable` + +Enables selecting elements, this is the default state. + +```typescript +enable(): void; +``` + +#### `disable` + +Disables selecting elements. + +```typescript +disable(): void; +``` + +#### `select` + +Manually selects elements and adds them to the store. + +```typescript +select(query: SelectAllSelectors, quiet = false): Element[]; +``` + +- `query: SelectAllSelectors` - CSS Query, can be an array of queries. +- `quiet: boolean` - If this should not trigger the move event. + +#### `deselect` + +Manually deselects elements and removes them from the store. + +```typescript +deselect(query: SelectAllSelectors, quiet = false): Element[]; +``` + +- `query: SelectAllSelectors` - CSS Query, can be an array of queries. +- `quiet: boolean` - If this should not trigger the move event. + +## Types + +### `DeepPartial` + +A type that makes all properties in `T` optional and allows for nested optional properties. + +```typescript +type DeepPartial = T extends unknown[] ? T : T extends HTMLElement ? T : { [P in keyof T]?: DeepPartial; }; +``` + +### `Quantify` + +A type that allows `T` to be an array or a single value. + +```typescript +type Quantify = T[] | T; +``` + +### `ScrollEvent` + +An interface that extends `MouseEvent` with additional properties. + +```typescript +interface ScrollEvent extends MouseEvent { + deltaY: number; + deltaX: number; +} +``` + +### `ChangedElements` + +An interface representing elements that have been added or removed. + +```typescript +interface ChangedElements { + added: Element[]; + removed: Element[]; +} +``` + +### `SelectionStore` + +An interface representing the selection store. + +```typescript +interface SelectionStore { + touched: Element[]; + stored: Element[]; + selected: Element[]; + changed: ChangedElements; +} +``` + +### `SelectionEvent` + +An interface representing a selection event. + +```typescript +interface SelectionEvent { + event: MouseEvent | TouchEvent | null; + store: SelectionStore; + selection: SelectionArea; +} +``` + +- `event` - The original event that triggered the selection, may be `null` if manually triggered. +- `store` - The current state of the selection store. +- `selection` - The selection area instance. + +### `SelectionEvents` + +An interface representing the selection events. + +```typescript +interface SelectionEvents { + beforestart: (e: SelectionEvent) => boolean | void; + beforedrag: (e: SelectionEvent) => boolean | void; + start: (e: SelectionEvent) => void; + move: (e: SelectionEvent) => void; + stop: (e: SelectionEvent) => void; +} +``` + +- `beforestart` - Fired before the selection starts, if `false` is returned the selection will be canceled. +- `beforedrag` - Fired before the selection area is moved, if `false` is returned the move will be canceled. +- `start` - Fired when the selection starts. +- `move` - Fired when the selection area is moved. +- `stop` - Fired when the selection stops. + +### `AreaLocation` + +An interface representing the location of the selection area. + +```typescript +interface AreaLocation { + x1: number; + y1: number; + x2: number; + y2: number; +} +``` + +### `Coordinates` + +An interface representing coordinates. + +```typescript +interface Coordinates { + x: number; + y: number; +} +``` + +### `TapMode` + +A type representing the tap mode. + +```typescript +type TapMode = 'touch' | 'native'; +``` + +- `touch` - The element was at the time of click touched "visually" (default). +- `native` - The element was the actual element of the click event. + +### `OverlapMode` + +A type representing the overlap mode, e.g. what should happen if you select an element that is already selected. + +```typescript +type OverlapMode = 'keep' | 'drop' | 'invert'; +``` + +- `keep` - Keep the element selected. +- `drop` - Deselect the element. +- `invert` - Deselect the element if it is selected, otherwise select it (default). + +### `SelectionOptions` + +An interface representing selection options, this is after defaults have been applied. +It consists of the following interfaces: + +```typescript +interface SingleTap { + allow: boolean; + intersect: TapMode; +} + +interface Features { + deselectOnBlur: boolean; + singleTap: SingleTap; + range: boolean; + touch: boolean; +} + +interface Scrolling { + speedDivider: number; + manualSpeed: number; + startScrollMargins: {x: number, y: number}; +} + +interface Behaviour { + intersect: Intersection; + startThreshold: number | Coordinates; + overlap: OverlapMode; + scrolling: Scrolling; + triggers: Trigger[]; +} + +interface SelectionOptions { + selectionAreaClass: string; + selectionContainerClass: string | undefined; + container: Quantify; + document: Document; + selectables: Quantify; + startAreas: Quantify; + boundaries: Quantify; + behaviour: Behaviour; + features: Features; +} +``` + +### `PartialSelectionOptions` + +Type of what can be passed to the `SelectionArea` constructor. + +```typescript +type PartialSelectionOptions = DeepPartial> & { + document?: Document; +}; +``` diff --git a/docs/pages/custom-integration.md b/docs/pages/custom-integration.md new file mode 100644 index 0000000..d63d4ed --- /dev/null +++ b/docs/pages/custom-integration.md @@ -0,0 +1,9 @@ +# Integrating Viselect into _anything_ + +As mentioned in the [quickstart](./quickstart.md), Viselect is a framework-agnostic library. +This means that you can use it with any framework or library you want. + +This page should help you to integrate Viselect into your project, no matter if you're using Vue, React, Preact, Angular, or any other framework. +Don't worry, there aren't many differences between the integrations, and after you're done you can enjoy all core features of Viselect! + +...coming soon! diff --git a/docs/pages/faq.md b/docs/pages/faq.md new file mode 100644 index 0000000..45216ac --- /dev/null +++ b/docs/pages/faq.md @@ -0,0 +1,15 @@ +--- +outline: deep +--- + +# Text is selected by default when dragging the mouse over text + +To not interfere with text-selection, selection-js won't prevent any default events anymore (as of `v2.0.3`). +This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/Simonwep/selection/pull/99), reported in [#103](https://github.com/Simonwep/selection/issues/103)). +If you don't care about text-selection, add the following to the container where all your selectables are located: + +```css +.container { + user-select: none; +} +``` diff --git a/docs/pages/frameworks/preact.md b/docs/pages/frameworks/preact.md new file mode 100644 index 0000000..2311773 --- /dev/null +++ b/docs/pages/frameworks/preact.md @@ -0,0 +1,129 @@ +# Using Viselect with Preact + +::: tip +This is merely a convenience wrapper around the [core library](./vanilla.md). +The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. +Don't worry, it's not that hard! +::: + +## Installation + +To use Viselect with Preact, install its Preact package with: + +::: code-group + +```sh [npm] +$ npm install @viselect/preact +``` + +```sh [pnpm] +$ pnpm install @viselect/preact +``` + +```sh [yarn] +$ yarn add @viselect/preact +``` + +::: + +## Usage + +You can use Viselect in your Preact project by importing the `SelectionArea` component from the `@viselect/preact` package. + +::: tip +All options are exposed as props +They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! +::: + +::: code-group + +```tsx [App.tsx] +import {SelectionArea, SelectionEvent} from '@viselect/preact'; +import {FunctionalComponent} from 'preact'; +import {useState} from 'preact/hooks'; +import './styles.css'; + +const App: FunctionComponent = () => { + const [selected, setSelected] = useState>(() => new Set()); + + const extractIds = (els: Element[]): number[] => + els.map(v => v.getAttribute('data-key')) + .filter(Boolean) + .map(Number); + + const onStart = ({event, selection}: SelectionEvent) => { + if (!event?.ctrlKey && !event?.metaKey) { + selection.clearSelection(); + setSelected(() => new Set()); + } + }; + + const onMove = ({store: {changed: {added, removed}}}: SelectionEvent) => { + setSelected(prev => { + const next = new Set(prev); + extractIds(added).forEach(id => next.add(id)); + extractIds(removed).forEach(id => next.delete(id)); + return next; + }); + }; + + return ( + <> + + {new Array(42).fill(0).map((_, index) => ( +
+ ))} + + + ); +} +``` + +```css [styles.css] +.container { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; +} + +.container div { + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; +} + +div.selected { + background: linear-gradient(45deg, #78b2ff, #218ad9); +} + +.selection-area { + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; +} +``` + +::: + +## Hooks + +To access the `SelectionArea` instance, you can use the `useSelection` hook provided by the `@viselect/preact` package. +The context is provided by the `SelectionArea` component, so make sure to use it within the component tree where the `SelectionArea` is rendered. +It contains a [SelectionArea](../api-reference.md) instance. + +```tsx +import { useSelection } from '@viselect/preact'; +``` diff --git a/docs/pages/frameworks/react.md b/docs/pages/frameworks/react.md new file mode 100644 index 0000000..ec9a6cb --- /dev/null +++ b/docs/pages/frameworks/react.md @@ -0,0 +1,128 @@ +# Using Viselect with React + +::: tip +This is merely a convenience wrapper around the [core library](./vanilla.md). +The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. +Don't worry, it's not that hard! +::: + +## Installation + +To use Viselect with React, install its React package with: + +::: code-group + +```sh [npm] +$ npm install @viselect/react +``` + +```sh [pnpm] +$ pnpm install @viselect/react +``` + +```sh [yarn] +$ yarn add @viselect/react +``` + +::: + +## Usage + +You can use Viselect in your React project by importing the `SelectionArea` component from the `@viselect/react` package. + +::: tip +All options are exposed as props +They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! +::: + +::: code-group + +```tsx [App.tsx] +import {SelectionArea, SelectionEvent} from '@viselect/react'; +import React, {FunctionComponent, useState} from 'react'; +import './styles.css'; + +const App: FunctionComponent = () => { + const [selected, setSelected] = useState>(() => new Set()); + + const extractIds = (els: Element[]): number[] => + els.map(v => v.getAttribute('data-key')) + .filter(Boolean) + .map(Number); + + const onStart = ({ event, selection }: SelectionEvent) => { + if (!event?.ctrlKey && !event?.metaKey) { + selection.clearSelection(); + setSelected(() => new Set()); + } + }; + + const onMove = ({ store: { changed: { added, removed } } }: SelectionEvent) => { + setSelected(prev => { + const next = new Set(prev); + extractIds(added).forEach(id => next.add(id)); + extractIds(removed).forEach(id => next.delete(id)); + return next; + }); + }; + + return ( + <> + + {new Array(42).fill(0).map((_, index) => ( +
+ ))} + + + ); +} +``` + +```css [styles.css] +.container { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; +} + +.container div { + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; +} + +div.selected { + background: linear-gradient(45deg, #78b2ff, #218ad9); +} + +.selection-area { + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; +} +``` + +::: + +## Hooks + +To access the `SelectionArea` instance, you can use the `useSelection` hook provided by the `@viselect/react` package. +The context is provided by the `SelectionArea` component, so make sure to use it within the component tree where the `SelectionArea` is rendered. +It contains a [SelectionArea](../api-reference.md) instance. + +```tsx +import { useSelection } from '@viselect/react'; +``` diff --git a/docs/pages/frameworks/vanilla.md b/docs/pages/frameworks/vanilla.md new file mode 100644 index 0000000..99e8a25 --- /dev/null +++ b/docs/pages/frameworks/vanilla.md @@ -0,0 +1,106 @@ +# Using Viselect as-is + +## Installation + +To use Viselect without a framework, install it's vanilla package with: + +::: code-group + +```sh [npm] +$ npm add -D @viselect/vanilla +``` + +```sh [pnpm] +$ pnpm add -D @viselect/vanilla +``` + +```sh [yarn] +$ yarn add -D @viselect/vanilla +``` + +::: + +## Usage + +As per our [quickstart](/pages/quickstart.md), you can use Viselect in your project by importing the `SelectionArea` class from the `@viselect/vanilla` package. +For all the options available, check the [API reference](../api-reference.md#selectionoptions). + +::: tip +As already mentioned, it's recommended to start from here _even_ if you're using vue, react, preact or any other framework as the only difference is to take care of the instance creation and destruction. +::: + +::: code-group + +```ts [main.ts] +import { SelectionArea } from '@viselect/vanilla'; +import './styles.css'; + +// Generate some divs to select later +[ + ['.container.blue', 33], + ['.container.green', 33] +].forEach(([selector, items]) => { + const container = document.querySelector(selector); + + for (let i = 0; i < items; i++) { + container.appendChild(document.createElement('div')); + } +}); + +// Instantiate the selection area +const selection = new SelectionArea({ + selectables: ['.container > div'], // Specifies the elements that can be selected + boundaries: ['.container'], // Specifies the boundaries of each selection +}).on('start', ({ store, event }) => { + if (!event.ctrlKey && !event.metaKey) { + store.stored.forEach(el => el.classList.remove('selected')); + selection.clearSelection(); + } +}).on('move', ({ store: { changed: { added, removed } } }) => { + added.forEach(el => el.classList.add('selected')); + removed.forEach(el => el.classList.remove('selected')); +}); +``` + +```css [styles.css] +.container { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; +} + +.container div { + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; +} + +.container.green div.selected { + background: linear-gradient(45deg, #78b2ff, #218ad9); +} + +.container.blue div.selected { + background: linear-gradient(45deg, #9e91ef, #5c51b4); +} + +.selection-area { + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; +} +``` + +```html [index.html] +
+
+``` + +::: diff --git a/docs/pages/frameworks/vue.md b/docs/pages/frameworks/vue.md new file mode 100644 index 0000000..5b9c303 --- /dev/null +++ b/docs/pages/frameworks/vue.md @@ -0,0 +1,153 @@ +# Using Viselect with Vue + +::: tip +This is merely a convenience wrapper around the [core library](./vanilla.md). +The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. +Don't worry, it's not that hard! +::: + +## Installation + +To use Viselect with Vue, install its Vue package with: + +::: code-group + +```sh [npm] +$ npm install @viselect/vue +``` + +```sh [pnpm] +$ pnpm install @viselect/vue +``` + +```sh [yarn] +$ yarn add @viselect/vue +``` + +::: + +## Usage + +You can use Viselect in your Vue project by importing the `SelectionArea` component from the `@viselect/vue` package. + +::: tip +All options are exposed as `options` prop. +They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! +::: + +::: info +Events are handled using props because you can’t return a value in events synchronously! +::: + +```vue [App.vue] + + + + + +``` + +## Exposed API + +#### `selection` + +It's possible to get the current `SelectionArea`-instance via [template refs](https://vuejs.org/guide/essentials/template-refs.html). + +```vue + + + +``` diff --git a/docs/pages/quickstart.md b/docs/pages/quickstart.md new file mode 100644 index 0000000..7f42f2a --- /dev/null +++ b/docs/pages/quickstart.md @@ -0,0 +1,161 @@ +# Quickstart + +### How to use Viselect + +Viselect can be used with [Vue 3](./frameworks/vue.md), [preact](./frameworks/preact.md), [react](./frameworks/react.md), or [without](./frameworks/vanilla.md) any framework. +All its variants are available as separate packages under the `@viselect` namespace. + +::: tip +Even though there are packages for all frameworks, due to its complexity, it is often better to go with a [custom integration](./custom-integration.md) if you're using a framework. +Don't worry, you can always switch to using the vanilla package later on if needed! +::: + +For the following we'll use the vanilla package, an index.html file, a css file, and a js module to get started. + +::: code-group + +```js [main.mjs] +import SelectionArea from 'https://cdn.jsdelivr.net/npm/@viselect/vanilla/dist/viselect.mjs'; + +// Generate some divs to select later +[ + ['.container.blue', 33], + ['.container.green', 33] +].forEach(([selector, items]) => { + const container = document.querySelector(selector); + + for (let i = 0; i < items; i++) { + container.appendChild(document.createElement('div')); + } +}); + +// Instantiate the selection area +const selection = new SelectionArea({ + selectables: ['.container > div'], // Specifies the elements that can be selected + boundaries: ['.container'], // Specifies the boundaries of each selection + selectionAreaClass: 'selectionArea' // Specifies the class to be added to the selection area +}).on('start', ({ store, event }) => { + if (!event.ctrlKey && !event.metaKey) { + store.stored.forEach(el => el.classList.remove('selected')); + selection.clearSelection(); + } +}).on('move', ({ store: { changed: { added, removed } } }) => { + added.forEach(el => el.classList.add('selected')); + removed.forEach(el => el.classList.remove('selected')); +}); +``` + +```css [styles.css] +.container { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 2px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; +} + +.container div { + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; +} + +.container.green div.selected { + background: linear-gradient(45deg, #78b2ff, #218ad9); +} + +.container.blue div.selected { + background: linear-gradient(45deg, #9e91ef, #5c51b4); +} + +.selectionArea { + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; +} +``` + +```html [index.html] +
+
+``` + +::: + +Which will give you the following result: + +
+
+ + + + diff --git a/docs/public/favicon.png b/docs/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a28b7028d3726da9352947d24c157d971a6dfbff GIT binary patch literal 7999 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 literal 0 HcmV?d00001 diff --git a/docs/public/logo.png b/docs/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..23b3f336163f21afd36aa1f9c55aac388d3525b6 GIT binary patch literal 106085 zcmdqJc_5U37e0K?7#bwT9tx8!I}yqQOV_J{2)%s06E9#nMo@O9gx7e)t@|-=cP$UHo-Uhq&<41` z!99mv#exnV@Cn!uq(f$0cLV$$`(q`t7~@9{d+U%lVK)@Bx3Cg3@b%v#rmnbN!Cgg7 zRZK%mQDwcdma3Y(n5wdhhLW;|lFB*-Wt9!e>o=^^5?lHoS(i;r+uy@;!#2asOE-i6 z(jo6VeAsV;l2Tw`pkm-UMPL8DN-A1fT1v{QN~)>~@DmCF!9IswgA{xM)?k-dyoTYP z0C)fWeuww_`iNoIbanGRa#)8JNEl{_yz{7B`aa?ptST7uzE^=mJj~p z&j#%AfmQd1<*kS^bU_d?#KdruZBX{`lj98vJCC(Zz8}gi4{XjZ`_azQH*YS|&^Q%e z#Laa^iyvo%SF5pBW|cU^8DW^S<*4O@Wd@V&C;L_(I3~u;^HHDEI(oTb(DE2U<(2ml zG9;Ce)n|y@hPqPv5i7M{|LlxfIXYVuc%k6vw|90oZ?t{fY1eGI;frohM^E?Yu^zkg z6RpR(IjRNS<5m7I|AoKMY&-$?6s@DsvECONA1nhBV@0-eRli@3w^Mo zqDyFR(KMlA#gwCglD*)24Se|I)1JQ8pQo0W3F~Mi6rC(8GTx}6uxFF*@n(y?@>xuK zhpwHdX>yw9qR%}!RI^bx?LrpbBzxv%08gRBUg@E0Y(v%tR-ck<0x!HBCCvY5b>8to zbEKlmRrl&ZGp<6X_Qcinq%2jTIcGt0bSR1VvM4!zN2O?`AJg4nDm-$-+2 z3F|nQWb=icdiau`Gtw#GBEBuy-x-z38@!z`gTGfuM4UA5$Y!kJ;4Yiwc_k*5TO*eh zci!H@qD#OfK^r&wjI|(~IJJt_^Pxpz(%FJ!yY&Y%BDis?Jnf`qzckvTf2t|7l`9 z&a><|jq^|;yRFG8JmvZ4r;|jw4o$DO<-x`2w>_IrooMH7X}(g9loGbMn9+!iytws` zg{h~7y(gJ#qZDwY=mV_w>)=majEDZTrA~SE`ubTp_#}vga59C9S&Qu7Su82WG{UYNKZB3&Ek~@a zc;u9U^em?lM^k zL54Zs%kE~HpC}H0973Ply5iEN2F*@^Ui=66TOZ-rnnpTcjohKqkS}T&& zqminB(Q@QzJGYeR#;VdRQ9v=$uoGvP3pb}I|ZnbMu-cI+ls_p7U+zM9bnB9fg?_?dcB}HiiD+{ zl-$LA1lK$1H^eZ`2&aci(@S|HI=EYs&Jp1p#9x%bqgFWwSflk7G)DPxiBq0G zaU<+pxaO-arLy>2*Y4zeRi|5I=nlE|HlO?C`eR!PGdhY3Lvx<*r&BdUCz5G_Rm*P( z!|53^|HAHKMmfYk!CWXwVROW%^_L?Gk4yOMqa>-Cr36B;5eeCDyCV+yG8-G8Tf!7} z=J^h0Q}MNk)00|uk@CJ#GLIoTitm1`cCDkR@{%eExp$OFCKh?qb~8=^x2>JK5MIuq zog2AjKsZzTL;<(yffD7Ty|$fH6f^aOD07Yyy-eUN4{~Ssz$2pht31hG+QHr@X8mk2 zl3F9|g~XC_glZ?(!i%HGSkB*|$;b@dPB22(@Z%KU>lNR&R+`GCKMlvNK;7=ysJxXa%qNEk|4!rC#b7k%e0 zC5V{#t#dS(o3VfHgZ2fv{)yFHG0p_-ZS-+H;%wrH+y!JMuJ?;k7$1FadT?I6JwAtJ zzF%u}qx1?#eA6LkbWLhBcKOQ(tO@O(d{7%Jm+C%d8_E5C z;XQ=vk??~bG}Q>`O@ZlP+CuF`_r3$04bdL6&2NnBxT&XJ`5@|MXrIZhm)v5h(v!^5 zC%n4f!78%HA(S~X5 z41si0>sF|5DjW3yg3P-1zO4*<&AzNk6!AG|O+aq*R7sdoSRk{e8-?Nyu%6NH;I?{U zkpsz<-nN}OkClY`l49u!u}I;ihYkdp$XM(_M@838d@y3h-u#V7xsW)k&ax^#`Y3Lv zW%LNU-^xj5st^fL3uM}&AOxo!dv8dF&(aW=Rb$5Dt_a5omIXP`YJ}hjvHRCA5N%PigdW03vbGJTQ#JnI0Q2H zOFATf2vGk6SL^FEE(H=g2MYO{<{JrBkC)L#*Sro?S--5Z=t~b0vXO4^O_XJ|`U3A% zL0a{>JwLxaP`lQ=H~Qldslm0HX)pR?>sQb3KD}Yit~XbE>OIY=VZASY|0xQmz{e0veA3Rb%-`(k) zeWv+!fQ`)SJJ&DEXJ@@`vKXHt3N%?fDcbum%wiz-=bUn1+2NmMYdy<7?r@x+o{`to zun=;77(A79?(x^P3v%?8Tl_<7t9o>2OlHgG^$_2L@x-dBnzKElS>y_5`7qXHala-9 zXIrk+G=}x)WfklmV4JFlFt!N`6Rp85?CM?7^;}^*QtO3@oQt`abaQWzYU@pVAH{f! z+uIApuAQ1luD9{d-gf9nw2q6^X5kE*JJc&FyGMbmd7L4!u+E2jbj!hN!IX6JN5ZcK`WsB+$C!E{q>Ag%MT@PUyvd*zZmx8#; z`%FFOzCJe{My9$$%U(CuMD#R1UG`mL8D}g<4ku1)t#F>3JorO? z-nhRVu+vp<^qeFu6jyD1kFe!qT^fpIKn~j==cX0k+T)=WF*q$hkDS0 zRdxJk$kU=LGqG7bu>+niin4Fm_(k5we3eeVzExpQ-xqO*1FT+IQ$pMc4bFU;S#Z!o zbnJ9}sy`*@yq=I_;Vw%`SBe>v@OU*Pn;B)$>K{sc7N8@2dl=S4`mRyVEEyqnePrIU!8`jLsPXy>ffiXNfKtF@yuJTzaX za@>@1hQPuZ6Kvm((!w==K8#L26h8a7V#DNlrMs?XC=?)oc-XFya2|bMxYSEI;^3%@ z6iFg^&ICBz#=JO*>g4D;_nQY4ce|;pC&&lgmQwmW^_Aw!T+aRBNf_@G2d#iGuYYAS z+vv_Jqz6AMC$1E)wzA^BIn3bY4NV|rFCjDx2QO9CpZ5U;ad9+Xg(T?0 z9CT-BK#3_lXmB))d1_pQf36||3Rt!_o|YJX{7Zp+dVKiGpoLjy&iFOskvon46oJ?n zB-I`}-;Uh4(tWJa@tO9)tdMHi0sj4hTt3jne)$hh(V7;EQumZ`?k#+>AdH4bJueMk z>HiIxx<4qNzSq1uiK)W7yPzrlc_>Z-PTvg@4$j`@j!VSCmtDvR`%*2SjA3D~jNwUs z%YdR~VH)(9vu{IV4Va$pMJN6D{g5{H$Mt4#exIPd)tlPnK4Pt#?tW|WWZrm1o8M5E6t<|;(mE;jp3nO1Zc*E*R1R*8Yj` z74sW=eeciDPilp{?t04 zUw{igXli9v##Iv$<8CTsCXcU9kxXPI)FfZrUF9F(dSIqa@22ubW7eyuQE<0 zp~P;Z<;2Tq@av5<3t;fPN z*YuUSehUbd3QuVG+SD%5g`+nt3l{cM|Ml$SM%?_1{i9q_)@GE=P<%xt%}@ttq~!)5 z^iigJvsDjGP<>eQaFfiMZf1ybivaapFrHjC>BPq9PKGSjQM}k`8&5iGRVdK}B1AKP zzCQ#NApo#9Kpe<|f^qUV*0XgC0B&*Xv7rS9P-;&?>qP%6#XkHjo{!LNDsn}c!*FzA zbhM9tW!_Hl$d}x=0=>S7-bTH8O}LhpsWclr$hH_FoId4xXipPHSn{qaA+3^l%BqP` zcMkH>VN5ncV+Z@VAbnTaycQ4UM00=5&GPi-B6{!Ur(dq7n?*SL&yK^d%R{~yj@CQd zjSU~Tt3(-hWjb`v*+B?!Z=>;^s!$xi_#)=3SN9-JGVg<`LyPRcajAT%Lv#B+B@3a=@;TE*rxnv z0_~(O#}bhZ8g8;B`-!nNWOR9~K5Cm&Dut(cMxv_#CSTCbJv(j%0KAaM6|;DZ?&E234-;-?jL(9oHndvtbPbbV=xg#&(b^_6W|r>Q|?-z*1SGd31^oM{Q(5x==e zQj9G&paPl@g#)aJV&$%v>kniEq(K8>zG16sm+?nx+xYX9q-GB9+^^me6Zery_r6=( zv}%^Ge^DE9#lw4rrmA8I3;Ai0N8XO2PA9=Ehubcjv>7$1NfWC%xYYcS6YL3auSF}Bl_ zB=+71CE0p0@q9n`+4GUT&k~1H7`83=-D0*(kfgGBz2mSNx0wG;qA)5JKTb9?&VT{O zd}4nQP?k6(&iXDv=HfkJTG~=l{1T0*V(9MuX(PlDp9t+-s}dgFGO{KX;qEu794N9| zFQ8PEnR!g$jc48t1ocwDT@J;q-^Xf|Z*dZORtM-c-ms||Azbyz7&Fr3C>)0vhpb}< z5Td4i{sd%SzTUF(V_&BDQE|`1MV*%qm9LCn<37}VU^;Ku5ua&wvRqQk;5MKEYCyrZ z+b;S~9!iXCl~29ibe~XL`Gx@qHXhH}<5{t>S|)5VRWf(vCYJ%_2TU2-U~(D!;a-c!^Y0YyvMCc-#lknQjK8QWNQ<`K3&zdsWAwb zpk<%Yz!m##eiwbbN=`7VNNRUq@nPFQri`yqzf=to0*CCy>UKN-zs@f7c}Qe{=-4qO zm7G)N{J2c#8`%!coO|uHIX7fUF zO$e}*Re4SZ)qo}c=h?YopNk;Higb94wg7~|!$B=@f zW5j=;k2iNYa6ku&0qptRZNe_3U@zXq0T;niN1HgFw>fm69I2{F=9*;A6N$TSN0vh* zvJie8|K(Nz%2i$Jp8pU05T-A53hVjh?2gp3A!q2zk@HWGx)C#KjExMF2;Uz{rVHGmvnr zY=Uo)5E_|s9;?c>@;EPPHgysuU+J$nu8>t`gX-W;>Wx;w(J0QS=^!g`5dmwVOy!B> zYFsT#{oYvd^WXZkNF1_At zlfART+6W!wSaT`+(P^E+n*-Gwf_2vnT|E73vWSI*unhs7ezh%_x88$9oxWPX(_)uG zPQ7(1GZm`MbqLOI5!nfxBOaM#wvV>Wf%C<7BiI`w);a|c!9s%VDZ>%iDMp_JdvJpv z5&OXEdzwg9Ub(ElcKFSUv?NqzZR@p7z#?#E|3DR=LoB*f6$YbMvI~hEoD*5x~8&D6pah_F-_ruD;n=T|(o_^OU zoZQpUwy01r3XD$QAxX$taG+4WH*d(4L)+J2LAlG;5Gf@3VRSJ+bbg&2VkP?up}xXf zxtmciTz@1Q;VuJ$C;CrXXzkl?yKz4O9F zz1umgME=JA?vztGx^TYfv_GyvS=}ZEQT}8GPk0q%G{@GCUfCL|MEYt-E)!vks<%sY-LLOr;5qSPT zjKX5$j8U0?a@x}ab_9EiT{>@*lS7u#I!@h_q~rz7p{RCb^{&u2l<~n_stR6u7HQ-kA&6R(>ML%wVpo!Q| zZ-vqp#_RQ(x+sbKjc85vu7zv|EaNa!TcI#jGso=Di(fvs3)yGIh4pw3^M;{}P;*Tf zY$De5wJ*Y$<9UPC53hA0>OBJmn+P&Fm`qWfhSrY-uM?^w!1GY!>J4pS$zCi{r;hj~ zssiJ1GViZnY#OOyB*f4k82wG=s~z_QjB(%0&kwXVx|oL`0wFHUR@^vVsmnl*|CgQn z-&{~AsfrnaW2S2>b-CUL;Ugi30gx%+R>GgT0>j>Z0$Z6&RH^N|p>=Tx@|Lq&@Ihi8 zAODMI4qeZUr<^>2br&s0jA9OF_V?DMUcZf@1S*>sV8%p7E}{mFteIq%fy@U12Iuxd zWD3Igw|mGp7Q5R&)ydWf$TeB8XlZnPSAOR@FAcn02 zz7=|4tPC${R%yatF{vgbxq^j+J-8#jjlqPI#EAQGaH~(3R9D*lBii8huHK^5vTB*{c*Kbw!ACJ6Sf$5fsVC1KZ@YL9(*TK<;4MhV zsqawFf5T9?>_0$7#TF=-utK7;$uC23P1gAw=JyC5uyd#3Op~x|?&bDT64P-MaFn@6 zIEn8gk=DwNe7Nm4JDMkUL){eOHN?(=qHG$JfCnH~Stb0vUxdHH_{y(bxY!|#yNAox z7X=;Le1vgZfz+71e@7mJYx~;)hJ@+Dnn#T3d@r|Z5m>xowPQo50k3ux5%RKwjAsBF zScxodpaJmn7a2Q`g`WCO{JH;9Ihgp^5$bCJ#xC5&fPa`2CJ9kB;}|dlUiC$O6-J#; z+n@ZGGIWF;;V30!FK*sanfPz2BD}AJzpojEq5BC7Snd!GXtV%V`hzL~9GKuIcB?vV+}Y0K4E8m(_`~?17XfK0B47mqAY7v9L5djx*8KOO zWpG=&3{L0eD^V~Eo4;5jvJ({J2Mg^;F6u|RdYzn8krt{L#)}=c#x6zCgG*fj9Q+p) zv@&x>^349GK!b4S0%4P#5Oe(|FT%)I=7tdP_Z9)LRWW3yR=)qqCt)xP@L;jH8SVBf z+!YVY>xmmVdXA^Tb%)LO+_cGxD6^Ny z!FkpsKL}F|{=z^6zZ>=9o~K)XryDxb{8~SJIBT+#8W5FUnJM#UEW! zeYR}tPJeD?snmCBfGF~}W7JT{Vn1~2qHT^te@g64gI0zOA&_Gur073@>7{U>WB}pR z_tk6nszR%HWz0^Evj)oCnl=eFY4BO(^mJ7<@AGFz>qB-QamMNifbo{38GPYKbk8-&pddrNSA^5o{E%sF@pfwD>M)#D#FUeBPu1|2S6Pf@1s! zze8Fy{8i2QzfCm-=^67 zP7fa+mjD{`kklwPgXP__q;XKcm+b}|olpnCKP1!2eE296Mx5FRr|)B}#Q4aoBD7lnb%ZgCfks!Y_fQAoT|5rw< z04)t+g=}%^cgJku^!JYWtOCv(gDCk|R_|vhb8ZuhxR(CGxtV4e5HE~U)jKur{N4(Z4my*YpD{suHoJg*-VX&)Q z3Z+2kHaTX^tvJfpc~%N+OJDadnui)g3W|7trw>x{=n&g&3%BAMnQU(*_9srxOkbX7 z4xjxoDx3U4BJqTg#kr)F{bz5PosU0KkF_w^ePwcfvx_(R8sgXfgI&xk1>9Pi=M1?;vGy>&eZAQa%5#+dPFRSsT85Pf*JtI z$zomKbrN&+fNIjiEmjn%3!B>4Zvy*io9Lng^_en+KmxZ}+5iUs0`e7{@Bi>=^gcUe zS0}RnOl|0ZXR`O6@4=7nmIcMUX|**^&o^bn)!t=pz~^=NAd#9hH#2`>mDBN0B^_tFR#yaKON{sVR?3pMeHPK?rG&dL*g?->s4M;rSL#h{Sl4+ zky;`3{M**U+|2O?U;$e)NQ0_XDontc8w1z8)Wbl8Z-)4kk@;t7E*WJxQ~SsWT@r_w zz3vMAJz+55$N5A5R)I=>FryC*k-W?Ep|}3t5Y#zw?!vivk|nmIDOX}osUBkJ0aAH z)e;B$FRLEXuIo#$brE^g6sKBwPEr(CvQ5)d=!84eYQDNgnv?AkrS1Vz|5c!M4dWER zAP5}KaA4uh-bA%&?cd7f6VU_nuIPPToTaY+6cfEesX9r4@H_G_<`N2b)`_=KJ}Bz4zJeqm6ovz91gm^+6$2-r)R}qzRzi31#xq%-V?Fdz=@koI zkBNx&U^0+)ca2C$Z0kf;M32zit^)7x`JYA;?lMywPbmD59iMLCwgOsXYsVEy7XlQS zyq);i!k_=H;{tsnb&ZZ2;ucQdXKi1?gvsBK)a-(4$ZtGtmsbFr7>etwAtlEep>ajG z>@ZfdgZD)OFoTuOCTY-r-M;JSOAg&s0jH(m z1V)z|#Xuok3|JFg&u9czi9`}}zi{{C<-1)7s71WIIN1&k?<#0qRdZ?5Q34AbUMggb#FGJA2n$VfC{ysfr4OvV!`cwRsIgYR)g%6a_XC7DtFCE=9L^9e?UjD%Hv87%^V8)@)D#b z1AD^0qOmeH<~Zd2wJ;pAT^x|i8S%uG(4GG;S|Tqd^*mO5g}<@4gnsW4zHfx?hxCNG z9!uV;pE^QB3fsAQf1DHQ^t`nx~Me1rpH{V$u3n|m5sd~m@yEgDJEd#rZjV{LXZ zh?~$km)0EvnF5SZqQ>UnEZhu@rfDej`;fpFjXnQp96F+je*4FIT8=lZc%WD@X9AmK zxYULe>a;O>-u%AkNYGcl2HP7G-dH-$zizHoyZ-HzA zavuYnV2JkcKN{hGOVjpeC3_o_R?RoKCKBoE#o?6_b$|%LP=c0oLeXI6QH*^JpXa1k z$WPCq(?52gdVD`NueGj7e=y(;p8maUp@Du=Wi&G^3H1^U{L>`oC+lb;sMPc=O# zgdN*-S%2M?f?3a|Z#VvLud#6^=ye6xCBIa7U@IKDss9B3@0jdsF`Q!d{VN`@_F63)E3H-`fpgf$`R})f>!o*I+rzyfKR`KmY#6 z>Ky|9KuhEKaVIj=%K2iD!jXsdj>x5^%aLgabCWzSa?3eR;AYKB5AIK$U`A;{odOgV zJ1DP?#aRCb!n0p}*6Ne*Nw7&a^0)*d)pMCl*su|x&=76b47K&ZaN~n<2)Bqm^dx$T z>GlMB^YtV#Ds~WE^yNp`#UgGH#gZ4#A&67L{J2Hxk#eId++eiq)3YOGB;0BqZX9Kx zJx(*1u|#jnO`CSO-zvFgM}*1=$k6V4pMp^PcGPt&)JLfHR*nESvp9x#IV10_a(p^cHMxYq< z-T)p34~47he``{}PE0Co6F}B0U=5IAEw`21SdY~sB0{bKXCR|Z!E(Nt1@zFA>!2-| zpWZEMk4rH`QXeh{83$O~{~{nlq%JuXNri+Ir&*0tKbiL#qQ;{2+-(vPi8_ld;<5bg z$Ua~rpk`#lse+88i^-!)Y#e}f0_LQ|tSO+XTi0^auh9A`ENXqwRrDV={5VB7k{D*r zP=8x;42QM#Y(Q>7g4qRH$o~?HR2}g-A-vtP_ojR?tLJQc0I&p*5frxr(~&4i0oadm z40)`d{zc9GJGyHn@Og^!!io;~4dHft*cpKNnm;_f(TQ@zQWx(VO75N+bZOvrA&J4iH~}6UWTN#5AXN-qLCwd2e+lUE z*p7i^)rdrWcMO_MhN&1x^|7;Y)`AE|EN!?&s1J>iI`n;zp=%KW$+TH z%TJ3gEV3)#1>f>T>0Nxh;xS3(#_mfW*fq^J#p z*GM?s`TbLU6}77!xVVR2MGx^V`p^h%i7HmQdXW2iHK$e$w@E?za!^fV&aSkkQ_P@m znpoD*h8da4c4 zKwB|9kudcz#y$up zNb=(XEP;#y2{HD9C5s_Cm}{4=6VBZ>I#n8YG%7OqxXQxvx0W9Y92RmD6XD;>kOKwg z=RF{0kiFn6t#aoQ#!b(a+hJf;bZD z2FC2j4vFF_#*Q952xTvOrUH&hg?B>>5YT&+6C2zTVkIfqvjA$lM*x2YR4NM`i5mQ+ zd-nd$_FV0<^K~{ukI6i5Bjg8TGt%Fb`p${8P+06s{Br7q{TW{0iRtBaUqf9&LRu_7o$Qc*Krqm zf(S@oVG8B|fu0xck6%ojDBs!Z-0h>sb>2K@!z0Ye=O{IagWh+RgslN5es<=N=n{ zZ80~GlUwx}3>fJoM@KQuJvE^}JBJDbdgsTQZw9zCHJ0@leY|K+)Kb7D=`HuoDw^`O z0V|FmH!dfPTX$?_CD2G7f0|1o_r9YKV?1pHv~9>f*+qq#9iBd1w4i6;)( z?;c}B>$K7G6oRm>@?R&0S6jHHZ}}usdOENyEHiv^Sb*oP<;U#Tt1$bkVeGfqRXc{8 zy~1*z--$?C1-5vx+Ley}ysPU^oiQK;&0c)or&m3+WU^V++5ScxgZZF%0mgr3dXy>U z)_!Xol6X=;<_bu#DwOFiq>i6sogpf5$lQZ*TEI64lo!w}$PU_tIoGEPce+}oe}P4j z>S;zh+~j@y$ZSBtL~*q#-JKAP$CM7n%~f*~hV%wQ^S>Wjx7m4E!$-sjwR|p6;Y7aS zw>ZqhuYkLHhZBUKmW~siq}~)eu=dKQOMZP-1s@9HTLc!UKVLWGKf0aUHDt>hq`otRl@YVUA-X@UyvI0S3ivcSwpAOEdh?G#TxQQi zzl{@WT4M(L&57wm&-m|sg5!H_UEjV6Bhd0|d20;eT)wn-BZ2iM56i=7!cKhV!P%a} zv!iykN{u;stY5GDuR@w2c8$FZ6An5YEYR#(OP76niFT7F>@}3HYYS`6C6}9|b9mp> z{jcRa2l^j@?rn`#?Xo1bT*d^O(@j&u7b^Zu)@yNyS}D~?uTZv!!;jx!lNlNdVeeo9 zyhYOG;0*ll=ybdiG_rc(aa?4NMgi!*)komWx@-tc3eVX%KX;_}jm~WQhzwDlT~UDz zvVy(CS7RlGd111%WolBE_^&$!8a}kwz9%eaZvi_1CCu&nT(%Kvf{}5>%plUf7NkCw z6zjnIg17q%9%Am_(Yda#%+N-3fC>`QL0`V0NJLy5icoaQSD8N-(zjng^?uCaoFp zr!M>5GlbpwD2~?aBGYVYfylyRG%(CvSmV zLDjtps@4knI>SI~hYAl#!vI8D6)4D~6;DUFEoUEfcBt z^)F{qyV%*|qbx+X7ilPOEl5R|b>DOQ2{EPga8LoH?c4_v!OmNdD@8$b@{q>`YRZRn zhlY@4pOejK+YOQS97(YVV$0)+v&)X+Ry<li@LW@t_5OuUc*L1STJ)_QKk!4Lc7fI5$aFIxC zP_I9i49g7;L~JHP?)CJ*YPu?YZEsY>Q2PbN`E@nxVmihoZsq=6B3Un1I&$cTe8z3n z<7y){`uo05*WP~qOzmA?h4}ZG{M8!n_xgPd(I`<_{w8?|f6@KAYjaP!D}z@myTIQX zP+Lvh)(`rd^$PjpjXxlIaZkZxwM((OXfp{pVTdd`!p=x&^v9(}6an3%hMDdbiC(KR zVoQr|`EK2L9pRE_g!4KaGsAKvaL%9J=j?20_{YH$T{juP*Z92Eb}d3Hk)*2eqd zjmhChR}Q)jL}q<2T34At^ke_5^~#70Lu@CCh{_kd{=^k!69GMislIWwM{R5%oOldT z^E5Q3Q@px#z|;`27sE?HBm)^r9ri&_U)xLbrdj&$lL+Edxv~yY*x}%Twu@`K6o;Jd zK@juda_-oIBsa4J$nFxsrEk7T-2#cS`eZ8nB%-#VTJ>drdY#G1#1kBvTl=ExDt|4? za2`HiQY57T_k2v>Pi!(feT;cvF!s5A|HkMt+5_eFCGg6@*_h4JE5Qcy4Y`|Hy=NYJ zA-BR=Zi@SDBaI(GE4x#lrmA09@o!YTT?vz@{=NG(B zoO5Fh|1ej<+FN()vCX#j1(r1kYVQ5o1 zxmsF{GrVu6DZJFIgc?^NL0e&KmGCqO`@6cLzsG=6`zucK5yg$z1NUT#y%c z ze^mrC4kf?tYD?<+U+n_G87`aJxtt#-A($=d&5IM;LICq7F9~-?Gw5{I^*PRmF#<1O zL_1|^awvb@R%p!Iqlw5+&8*!mjV4LFc1S=sgnAs2D_Db)Fsv1}k(LE^QlmJf7);n! zna;U-Dfq#u1Nr5ECmM>bb9Wq`BMCOz)AP3RCaM{k{DDv6BIOHj~cqF|! z(QR0$#q`;uOX6G=_nB|kt^u4p_k(#~553~qDdBmyvV22^xV|TjjLt*Q9T#b0E#SIn zNx2cFTExF_5Ns)wnf8@#3?&mA$S5T^B|l;9ZJWW%46~fkbOlE7x9Y_ZT?~r}oh-Xu zKBPIrfTP20%Il>8NBw7yyFNa&q!pWW%ltIRxcYuRs*rdlN_bbuUZ`TPO_j~5SVQQEF^iH_&+D&p*1afajr zdMfnjupBQjeiwWL@^~jViJV6?x#6IMU73*!r|e%@!;AsOiDGEMP~4#Vj=c<_Ay{U- z#UjY~8iXj|{uUjd)An&hIID2obTG=R2}H>#A{18=)ldAg=n^?)E04#>lyeq@JeZK! zbw@a;E0q3v`GjnmFpyyJ5E~d6h)RemMQ;Xtnc=E>`#S-U+(DFkM>}ah^6Ea_7c2rWAJITIqv(4uG`ZR!jycXq$+F{NhS}pD)JO_f;eWGF|!Dmf+sF zjUQG=f2$k8&5n8dnk>mR zJ35?BRhGOT9opOP9Y&}3a3^~&r?ylT#sUd3oyT9kInC3a<4+l{YfTKd^d3}GU_PZ&i56d z-MVwl(c_fq2cP?2=mm1&%4bvAi`W^7Vg^RS^1)hr>hXN#%2b;n0HZxw>huK%}urtECG*!OGjB@c{UGut&*1fld>4_T7?Rdq_X(2v9 z92N8Qwl%UJTD%Pw9Xq|95nxv9E$-OGBI_{oNr3|a+F833;XM}W$E&s@hE;HP+d*|KlQax*;o1cSU zNha`Qo7$DN36N@qmOY4tz9l~4;)r(bX6cz>_GTgOQLKFEhYNJE+uvF z`hQGA1vItAk01S2u!1KWXgiN|1#BsKf$yCdW_iHzIOHo!LCBk|2SVOc*S`Zl0*<{r z?JY#tgx`Zr-e6!}i-6<8(B0J;i9Fc}9@#%u2K<8;A7a|a&3{Z=8tuo1)%s-|@QbRv z%-Q={QOsRkSsGI&EBc1SuwEyRQFyPtfQ|X%TyYC1a=;;M4tPRq_9yp(5DiKJ=PeND zP}5x)^&=+zZP0#)wYyM^baaU$UXki2Qew?;rUDfonH~Hnn5q0m$(eq!u<~k3G7Y9# zjMsay0zd5ecFX95U2je(8+TbxuT$ppf#U}+2HTe)Emrm1RI4p<$lL5y(ZZwbK(pX3 zFs2EztG>(gl&_XspDh1x6XzL&Eh9T;H99}&C({(Mov0-@__lDjyw$kG`2NX#BA0mr znI=oXjDY*(?-68vTggv+_d~|{9gb~=)&QK0%U~^EOta-PTXuv}^2E>Q# z5&Hza*hMLDktSuW_vQn$;F6J{7HsEqC-YxpGjp@s!W%i8W}a-D?u@8xNZc@w<%XJ^ zDmcb<{vhwLsbf0uTN%f#ziKA%^ez#BdD)2wR!9yz&UP-3w*Xy5?B7<9gpB*Ns_^rZ zJT0Ow(tb+(`rm^EwK(f*ES{eaUoqd&{A@?q$d92XMLSe2VPb$Z4vz7lS%kjvyF0L zyo;s(xBjGg`^~Bqma~>Q`__uA&4*P60bD_x~ zL;PIxb4D|H?P3RO3m@*7yTF6JoJQoON7Y{O`0CtAlYTih&Lav4``*(qbdvX22}UH& zNG7g4(8^86Gd14E05oQz6pH|BQDId%;+BSHU1<8YZr?E`ZH*t7955MxD_3_T{5!5l z%zAOz2X2N?P2qbPvUvGV>{P!qz=uV8rN|4wph&W&^bVT$a8THRCCr*kw35(cVtjn% zoIT-8-Rm|WyW@#|0fF|jdTQZgJ%f@fp5PRJZe=h+7SOe?*5H6susEav_SZexaqsYm z{O((+0D*Sxznt{sdl#}-1+JCK#R1>B>Ccx3*;o?OkIUAWpZxojJ2-D!5)}G@Al}avG`e^TkU>^+c8T!gY~?Qn zKx+hg)Ow(tX+PYY_{TmOrTl>4swhleL5ew(G)4i%4j=Dwwj``3W}5QwRm|?O)0b zk!y3#p5Cu>C-SWbg_7uv-&mBZtW+bA{_}e82ggG_f#l|OKf!YqPmJziU-~@9rPlT@0tj`a9Er4)#cX@${_^|Y>wDlc%rb!0jtq2ji$4VC26BC_k+lX*ne2*am>=XYDUbQo+0I7mG^v zYW1e-bT*w!X2a4q_K^~J3v6tR$7>^~e{0S>8d^Dhnjga+K^ipwQu5MpNwRl{iQ~PH ziCp{jiG$~t4K_qYOyt{8LTOrZU7QfIg!qECR#YgE^R7-*2*`AlW`MslGn4C?Bv%14i@yZC)FFSE{oh zPRzbOa;T6wM2^0>haDJ+A9MEb&MT*<`12N4CJ^b(x*U3w0dobPb?&G-J#r(To!O#g zqr0p|tY*q15V^M&bf9!eiU%gdy#4Wu#s*ya+LMPW^%8y7^{#15!xVKx6*C$$^u8aD zb|;7@OM@y1%~g_lNQ%Un`x|MNs%{^)wP&o5{d z5)0U{K>(QuBh;eft;~1r@y~qtFNfG7(C~Ut(}`9wk}jpu9%iV>S_NDHfN8wj zo;6>(g^!)BH^@-AI}q?O6t_A@?r(=X*((Hu(?WW+$A_UbmsD)J#ZY{wt~~y5Sxs%A zNnn5Nx#W67BwdVwDip zY`gSnqs8yI-D>ygM6c(@7f<y@?rtkV z5cb@ywhxe9SBYTyoz--^yNcAio-TBjf8l9SCAsCFqdWVr!WahsLRWZvJZu9Sj*LEo zqpJ>suaD=YwL^Hi$F3cWUYv)o)t`WGs9lrC;T>BpB|Xtsxn}VPJ>nH`7RH~RZe1{Q z|Bo3{hYU%VnxYTRJ$)5(muh*N-mk)ERX7kd?*f@%`&T7&{_M2PO&yOMXy&H+>4RCi zu_GqDAClK)MdgRWV$*$kGKuN8Iu<9juC+EjQn~W|9-c(qIjgq;@&IvqypTdd#r)FOQu8&->x3@aHh}9SNDto{(PiT!XWwniu;~Vvq*q@ZDh~ z&lJWYX7Fews}X~#f_A|Ckokb1@q)#!LH6Q5vYX&lMozdM`wLHd1|}FXiE1?h=(i<^ zAyVJDr$k$G{~CC861$M9ogbWJO)HJ2WJ(G59xy$=EBY|w#ov7O z7b_WyEdi$yy|1VBithVG_|9Gpni>hYv9tHhJz>hnP0zrB1|JVRz}l`FdwU}w^C!jm_rS!t!>BwzZgru)8O`bUp%W@|e(zLo(d~-^?oLkDu?482fTMjqLC#3+ z_Va@`=M}r}am0e3)hgQrq!C^ooNN&xM1|Lw z>F)4kO<#k@hL=o-R)GxcrJY-@#a zW=Wj#^TJ>@_}b3V5{*2?gd?n3sTY0i$Pbr=!KOj$%?SDsT-Q^)4x2)^7ZJ8(7k(na zN^jXzJXOIXnW*l7#{)MANZ&LKbt{9R1EVb;^R1lG7C0cS?QLuDkF`GvV1Ukr$?M~?%(&{=Q#E}$KD(n$(B{dsR)tLv@)WSJt{k=A*+mJi_=yqq>M67SrH*B zWt|8OaU^@3-+kzLKA+F`_xID|&1>BEbzj$Y->-@ezID8{`FaGbqTD_!1d0FUFY9Ny zCqaTuo*$s%R;~a?^wlQyuxZKv9>D_pnDPlnor{O^{0E*emSgzF82&N*Oya!LHjRlRpM+vdp+#`bx&ve6Ac*|zJ-KUk&6Ka^0a>h9B$VldmKaU%!>nF#`N2;8*2TqRf*~r7nO$h8>d7EVwSq4ijVI8P zg)%B8UIktBh~7V85t?1U_tR0jsIt**O0dNgmODeuYuDD7Pn4I4pK*pRD=JR&vEDzW zb0TslMKAL+PAx78K^m9QTMG=bS)gHJf{CZsnJ;R>`v*Imr?IHkGGmZ>F8_5@fhOMr zXFr3;uJ9juNPRe=YQZ18H7Hfh;E$kU%4~UpQChzi6Y|0=Q#n1QkgM_4lsFMWOZq)bBANUe=0=k;N0qtG&?AbFs`A zLp(jfq>yAnbpEqGapIE=sONwu!1lI@4>df+l+~Xa#-*4+^wH6RDGX{mFujGcge$o1 zQ%xzY-8->Tvp}srV6mCPQF4J&1Y2bT$L>R9F6c* zV3fkQ*?!sY$&V$t=|HSXl%U5ji+-lFS=l;A_HXb#0BC%Apw%5(1nI*Ij?Xc^ezxEr zms1vQLfkI)*tEeTQquA?-u%!StNXiHyBdOB;TBZ7Cx$roj9s4(c zsNVNPN3=8QG2R&b;@~!5zhC5c@ZdUN-AA<7w ztJCxIReS(=0bj!6|0tv5B0oDHR?p^X4feW8e^zj!fYvUrtLiO)A}P}UC@k6-eB{o4 z(?hNnNJnXj^rLlHSk+6Rz*eTK|RDE}z2{K%~#gwuWQ}Hc_bK`;~OShc5)(c6yyE}u0*cYE83kW>G?XK_uHrAL=2;butBASyjWS42F-|Lg|e{ZfBS!To?Qe=*PX3}R+>z|3tM!A`Kr zL%XV#uPey(|8@OSw_8_8{scQNb!)jwX8?uhog zvqm(?9`B!|-uPrRZ?^wyOF@l$7sqDpLGcN;j)_8d|3S~DtUd2ZZ_LHm#}7W$9S-O< z)C;t{diwj-Qme8K+x@IUY4loX*ghaBPQrq1-Ty=%PT1`Dc;x4tJN0h!Zs#766Xhdk znbt*GOfXF%wzzoJtVpMy0q|H%%8C;%jO(lZycV8pMB|tcOuC^nd4B%l{#3maSH>r- zQPC$Sd<8C#yI9iF1Fw$Fem4r-7R4Lc3pL!_n#IpFi@o`u3SLksO4|;dOWV^keb_Em z`-D2*1MAyP{fy3fi!BY)^iIX$*G{*5^jL*5*R8_YKMrovVQ`1pOV_GCTuM>2-T@)u zdf$=zhK2`wU8iV->CrLMYat0UF=d()Y(VJ5N`Fe`?WH47~Y>2wggb86d25 zr~6gBwSWHe1!lOa#$Ub7Xs4CY(4&7J>S%ZFmwowh^JhVXBE73R6+f{TDdP^mfG6MV zII@rp_wLFo6qg7dQEF|T5sOS4Z>uC*fDR24i7c!X`B3MFTTYc7QPN3=dj<`i{%0qs zC$ym-9LI`Et+cpZ%rtS6&N6=uE`3*v6fE!SpLe8NXRDuq2i2sOk#w8I#>Y*6TyP5v zIKG1?x2c=2V+giMrmWXTcKW4&|6eW_n0gg@OXDvlg)@f2JbzVR@;iNH(3wsdBhQw! zjIZo<#8fH;s2bDl9{`b43{gL+kA_8G?`o1ugO`smq7Xbq(|8*hx!n;A(cU+{;~J@hLD)`T+jR={)n z;$~XL4@=1@bNiD}(n z0e;xORd3hZ?GT@HC9YI2_(S|rFve|}y84=}lSHK(8HbA@LqlHNOYgjVYY%PJ;7U_~ zp!qTbNT`32omy7%7A{Abd(bkM*fNKy1ztxk4r0I5xnVzIXV%~!h5obpN5sf;N~q^i zsH^s<^|(W4)B=ZBJ({2%ppTClFWR#q2EN7F1pU7D1al3vhJPX6Qzg`!3S) zzh%WyC2M=&8sQ|lx%pI_%e;xvAkvd|`6hJa?=ot3TOthvT)eGqEx`=&RFFn{(E0`F z;BJ6)zp#TI^z%xLl~MD$KJiXTP{RLDzXm1V3ZwWWUruUI36;OQ<42Qw#EX z8!SDVZ?Ne|5ab$qXXk#~+OHtUNTFF^V4)kNePMSh0+1)fkIgzt?Ke#4e)qp)k`7vs_ul~y!|^9OXdGnzcu{ouKaB6?=H-@-lK`N+U^dU! zJlT9rdk{vPLNV8-aMtn(@e*i7`#+_JYeh*PnKP2NP+mlg#F;eW$s}1R85lkAEGGWn z(OZ9viT5PVRVV;t2PDC!=^l~az=?VRXY^_dj@r`k@)w$m*}S2E~t7co^j-edYi<;c5_-!~j-B-U|ybB^RgLh#Kx`ppKtbT?Lz?Y?Z z(&Zn|g)}8gailMos)Jl%7PincPU&{(gdwJ{PZ?!##P=tEotT|6pndWaH2STmgdBlw zgJ!9$D-h2;zOe^n5{p;MHU`X;WB9;gQ1}+7mMA>?&~KU>F4)mmT3?6XR*FFYPi6Vo zeSDhxb91{8Yz`_l^5D99huMD;)I0WMK$N(7#?Z4~N?qB3*!|G`-jHgK0YZ$;ga{ig z{NtdK4u3pS2K@Gi;#Tk-0LvMFk%-70k#xWH+vYgOC`9$hwQzt~zop!`=$|+@@_?@3 z@!1kESyAp!sKFK`d$6u!SwOh|i9_CapUNcOqXBc+09Qc?MvXvmzESJ!{&9E}Hbe$p z_`VqA++)VXEtHsr0L`e9g z;1e_6Rn0F5mbd4XCQ#a<()g3=4 z+P2V-zZnZ|snHOI4YD9dk}Ehf#+t@F64!Eh0LBkP&pg>vsg$nLJUf|HDGFx#n3d$f znnI(noVu+UW48o;d;O#teV&=Rq87j$dPzK_H#qjKz=`x3$6URc@#)wvzq})V51E=` zJkQ?V4I?XlF@1~Qdt4BqtF6-aSg4u>Ml1H`Kc7~-_8D9|I`hGH;JIW}(MPw=1Fwj8 zga!nmIJZdsp;SeB5AeSGvaV`LR~+awW&)&D=k=6s8#TG5(!3sv-sd zZhkg)R?)nAWAz#a2hE&}TKg z>0*HlbbYskiv9Hh)(586ZPy=&PQM|#vfhs0Jv}fg#Znz17}jjVaVh9&3+TOvlw*>f zX&!j|CG%Uu{8{5OsHe8@8|?vFpsc`XVeQ;E@EM%B^zF)vt9t0P-)qmv-7V-(GwI1u zLzA=9f>yf@BMUrTa;+bXiJuC5v94!1N{0f*vJR;5$>7NrV&xiRS7hYqLa40#b38eU zt8b)3VCChsM`30h3zaC|KT@)tBEc+OsvD)}RlfRAY~JL1&pthQuqbXp_cPb3tjRa* z_;Ob1V%7{5dJSE%^ohtsQa|k^WjpUB>iy)XsmVvBLkE_<5t;S{s3iIxcaE25%~ov} z7_IKL6KoQfWx^*%kA?1eTcs_pp7&u~o9dGa#_3YS4UJrK7YsNF@OvHF2Hif~q4Ke! z3-f_ID69NA=H{y~3-_(OU{iT)@+5cI@;0upNFy0euKnHZ$$~WTZSgjGf^%4~)inAy zo-t|i{&t{z?%=ta#OOFfX7Er-hZjqOp>cnq*1WqXJHm7Ns)r!TVJCt0c=RMp2x$n- zy|netx^#8%w6-AENR{c>l%|!o{E0Z^>gkhdi?8yOB~k8s_$mY)wKv%xG(yltf#RQp`n@SAp;3I^05owyY@#= z1pokkoPNG;>CCZ>neA$?s=HW=Ag3h>qI@WUsL59y2W;q_F7L3Ygn`OUyr^nXSL~;Y zsgZcHsF=X5DUX-0w!$n47!}#x2NLlO<)@LNt3!q<*P4@DX5|A|-+?)hAR3yP;*Tbyl>(UQ-Dm39qfk$7fnh4)<0uN4 z8zB3HF5meyHl(C-E84``MG3@kj<`9-ZzG&suPjeVll-TLl1xW?Gw6%jKQgoEFqTc1 zZ7%(;@|+%O%0TF<`LnT_8&=So?f&0DKc@2ITH;^Zk2!|t7dw?H)_2sU*)5m0`b~Xr z;yp=dylya!+l1jzUXyQn>I*dEs|$CZ!$dzw>T(zT3~z1xHQ*!Y$yp9(BwlJ&M#;)s zZ?+(?f-=MpmM*>dfv7-z;Bh=u)+r1aaOUDa8-0$W_IGJ0eM*l-_w!ksCSAISTuP+2@Ih$+NQW!}GsrF$A&4jrg;7G4K_iN`C@(5sJmMTISUKjD z?I%u~*SLU!T{?^Ycb-uXgU5XW9!Vj~4pLlM7Y^+X*V7O89vqI|ZP^F=LVn^t!)1Ve z5j07!lbnV%T`pRmoukrPX1>Fy=55AAhagpDgv^0;Wdvqc`SSS6(HI!deE`$>3=?VU zDaH*-!x;W1Xz_!sdZ00o%39mEGY_>CazG zmGv*tYO3Ih!Uiw;=VT z4`B~I#ojFN4BQO>u(aM|0Ml#mRl-?`yu)GFFR)PG-Kq%n`(947*tEU5D8@=TJ?WWB z*U{V%AMJL8IYjCH*kd;s6>3L4J5k0!|7901S6@0g_(c0JKDyRnZ_bENn%(Q%dx>y| zPPGU7;t@Vn>T}pI1_E9kdvAG69UE!!f?S z@)VbM&2_Iykv)dj7AFM1+%tuO5(cOTNqEucR|0FSI)Bg(d2U(GaKMjMq1@!`!G4B_^^cE?zZK3?y}!gcfYqCiC(` z)_WgCp-6A(^71}NO0I!o^Gz-|f%I-F5#?&|~f())L_GgYkWO)*YJbUbh@7@AR zXj$ydYs+2`VcO%6M+1l~6#g4*V`s{7Mm+h&IPHhthAu$QMZErAL%}PW*P%Qig=!3# z@xR$iV(A3Md`5y2Wjn$a*K!JM*gR)^te%h2Um}^^mE94=y0&;Cqt05uR`$2ZUFc@( z60IN`L?|eR6+0uuCmF;dmN*2YN_L|P%tJ_nc4)bvT*fsTNf#v2s+7VwL@g&xhv@JA zJ*}Vc?+9H3Dz*J3{JF6(W&Oesu9WZDq6{cQQJ7E2XLwj_FSz0hmT@bmE^e5${~1to zeHnV0Y~JEhYUo2J{;y;cwuJ7#KEK&5aD_He^P*VRG-Go9S9ofXqITjyD+LN?WCzylNuwGhHL7d9W&YTt;Hc(Wum_vxs{4y|(L#ncLdFPrJ9pP_+6^%wCDaE&iV)BV z^Id+uUq!19da_cFnna-^s09XNmB43_wP?MD3)`cHiL+=rk7bFtR1{VUty z2PVlLVDK!_MIm+|X@Dmrr4iJc6Rf&dB1YBVE8yO>3DhDhj4q?U_N{COBC<#oA+}Rn zjB;6!fB~axMYb5Bv;O&atCePY_4aWct5q#ooZ1H@SC2YvmlDhoGMKYxBzm>>2)+{} z__~YD#G*40PCH}dk{2;v->RI(|HTZWW`Qtn0x*mCYcXnj)<&W1#+WG&m^y`Wy)(~! zJd1IXsH`PMT4G#ZE};=$ZsKi!ikogLyJ-#y)&7rQp^w?2gVGMez{XC8#<5e< zuyR+GQ1O9UcDGql1_dbx@ac8}%4kFm-KJT&IRDlp0o*rI1WX~&74LoP>ux-Wru!R^ zq19c@;mRm^o~K_*lN>WkcL`^-M`z|3BSi0sop$G0Qi3OD4kMRCe{N+-a;%aiiM(vI z4R%3Bx%sE7k_1s!Ip^1C@%nRiE=UgZLXj+isrXWKqcK81%zt{@{MN*I@kCR@c~rGz zmcv%dc`jK7X4@i`MC9l}1evcq{XGG>oEse*j~o+PX_K=ni%s#Kcw>jWHb%-Y*LKw7 zNYAqTkOXc%G?r2xDv?@Zhki1UmOjUb95*ID4GR}U4XhAahBUPQ5L%Od1+qP8=;9b#CJ zqJ0>%gj}KE)C{89nMAG(W=1#|9x$!wF_Vz2U;d;Yjs0!C5~?{g*@7{HNP$%f#Zq{U z`;#}rr>+%QV07DO2R$UVBMV>DsiQh#Kh-6RL`WQRXfe>x17Lv;VmD4XAh2uLdA=o= z?q5D(o8UO?5*ows@S`Sg8LW1sCGzEGAaYp`P)7}|A3HNSzYwlk3~6vg51JB85->jV z+~PmKvj?zGhE?OSt`&>S9XBp>%b~BmG$tC1G9qLplzQNPINgVju}Vz~Z9c$|cf3R9 z>JG^)^l?^Q4-M|R`7TCc$nBub=VuwsUg;EU$^6_-iFZ3f%a%YUR1e938v>YWhULD-5Dp2LP$8&dH0V?Ob#bqh_@@_)rBSW8BK_N z`)RMKCAv!#9Sfwf8Zm#5OrdpEuf}e&00zxfB@@2(Bs#UdPUbPV2XPPgA9dwTRj{vR zp`Ku-ZK;=w9W@k%P-4e*Y)nBTAB0HaL56Rv2pIyMqV_%ZQjBK`*b6T|e2F(9e(}!X zLmFnxT)Xf{i5!+PIA=7ipJ0zZ?wT!X$_Yh)&)SQNiO78C97chw4^H_L=vu#Ebi_`J z%xz5^I=j7q;SDSu$P~!b^6@0CMC3V|c%e{4O4kn@{9YJA({^}V(C9$J_|gJAKKwiG zs~M)G7U2VBLhyCu69-EOO@ythr7g9KAs6Qv7g%DJQMy@^;(M65ZrZW7`3^CYI(8Zp zCCdla3K%guSXXEuLq2%3Qg{$#8y5EISZ4{wQ~9naahO5&7Oa3wUAj@SnVk~q(`3sr z0MU|+)$fn93SEN2=yPO(@0z$<265v2dp@NpUx$o7LDy;xRWLYvO&ryxab4OaEcqn) z9+U^A?r^$`VEB@#hUM>Tb-U{9={pku! zB>LsuboCOrph^!_$v*xP$ia97mmAIe-y8BQ4vAdf5STh;v+{BmDbh3%0XGZFo=!~h zDjy+zRroo_5}D5x2PxrBTJsU)#0%QNg{X$3tZ)KiGgtx^anvSqixDIov9Gth7z5M> zwqH}ar%Hr}84iGT8`r-Qq7K_)k47%*yRd$kxJqS1kaQLvu@@h7Izf8b)VTMGIrSVq z;FtUhnm-DUT#%LOV^SRs7aC*i9aVSQSp#$5DA}S?oj56S?^s=~b>PYpI#0U3;_$^+ za`>*&JQ$ohsA>#jiMrC}9sh!@8N0Ie67-|#fMzrfnT32m%NQ5GWe3bbXs8r9Acwwu7}3Qoqt*14+He78FZJ}A zjk~uBz;SqjQA>5;3<&E!``)D$&ICJ55lg$vk1lk56PpCKo$LKpS6zxoEYyX~)X|U6 z|IeY9jYD889oJ1Sct(OS&CGr7x41I8$CFh`VaH76TpCHRs9MCelld;W6)3=@?`2@m zfRxy)Emw*sejPJXlr&EopFsC1B6q9M3%_r;Q=}5ocke`yggC?!kcAxDM;-k6spDH- z<_u&Ofj>^~wmn({roi1SxklRSv}{gIR3>0tOE4aNl<8SUs!Ccu9o7-I?Z`j?tDP(n8{1WOXdx{LV`5zNvS(edJEDAA@j#S{jG=JG$G4qWmMJwdD zi)(F9)A49u=7TCe@TZOLVutCZ1Hlekb#BZbpZ{9m)6e7vAB8Nd0Wyc#<_`?6kD&GF z0gC0C{}nGptLwsT%-%nrxA3_?FNyr73LP#LrO~?CvG!;Mq1Hy~}vc}jbZ(_NeEy(6HW+gm1?H)O^#*cOp-6{op1jgg-fFm!?x1?Wv*-!G2jO9!^ zPTGtOxk&0|s1l6NOvvwZz^i7capz1;`Ee2CxnIr) zS*i?=bcH1gwvC_}a&Owm%_!(v=X8*7I6WQGOq#6Z@LTIzjG2`5Xfr+LqrIRf68V{? z-tB~9oEpjbUd?PiHs$dx_Gpz!txkbHW9r)RM3QuY`I(urRtiA4Xn-4nO9|b3%=K!CUGRj2y8#|9LJ#(WjEcM@ZK%Og= zsuJzd`*baqXAB-b#k7%s=Lh=S)uu7mWf=+HDXog-RJpWvZrT_|L~mPALdowk>Un}` zgCvL<(T0e#9q;){NN>W^};1@?EO>@hXE`9587@p5>~$IhGtUGgUZhsJW4@ zcjrq3m?zjG2%Di(yfKl|`z+jRn@;FKJYsVK9x@tch=DMzDoMZp!3RM}>+K9;d7irmVWsdly-Fo-c;<1Qn=5=uC;y*Zjj+ z=(ZN?TEt|-kBH@DAj*g60gMlIby%+Hz`g=*C1e;+eh0J9J$O;S4>9D$tUfnV%0Tu? zS0^_`jJ;zD{WTW&scycK&%sAfEH{GC%wz*)TfmrcOf3uL*hgMy(wg_57^}13oEN6& z*+ZN*Oxjo?1cyIXJ0EP`?_%bHJi8LuCiwxV!Z%&_&)cK9^l+#)9A#GqJe#Zp5%m~w zhm2&o?e zf8GSK<1#>fNZFnkgis;2@1Jt4>u~Ky0IZvLxbwh>q1Z+ex8=D6CDeuX&fD2-?suS{ zsKC)Mm*!{atkjI7hL{?`6?wCx14lh^BU&oGubXLM*qahh9viZK6LlO<&fv%(iU>#6 zDi(dZzy2Xuw`}|WAXPc^gx*pl40bvoag!4ncfHT#ibWA4t1bd&tO|8Rv!#UPzh#Ps zmYEF3moMYE?^hW_l@F}wybi*(>7Uui4wnIKAtV=0f;^)8v{kwtXM>=zQlD`tLWeJy zBp@FI378-YLMkLLOFS`yXV7$8vV|z+JsHrnKbGFEBbfCgn%;m8TV!Gnz6f5j`qAJ% z-?bO=G~vNqt^N~A5Kf^F0y*7A%XHU%)i zQzvc2IYK>ZMl#O=GIiOfAvG9i*9n*LvbA3t)M9d2A{4Lmyx<{e4PU=?YVr@7=9vTzKu zdHF#BcdCenQZsunx6OV0^(lq4n4AYFFYLKX3fUphJwQ6lWxqFjY3CBU(D$yub!CE8j599Lg3yQS< z`gCT7ws4Y?_{a|9YL~o7cj*9uk>e4$iJ_OW<-4$FKtOV&{PGWRZQbV);iZXR-cgeb zQX*0-@1OepLF^}`a*`Y0T)m+CqB7UlveDXn+S|Hv{@G+zi`d1%H!Wdi*iZw9sVjzQ zVVi1c?m?S1Bs7CZHFaLJ(+*ZWz59DwBy;D~<{M$plT$eR8lI_d+^?iTCynIHH@`k< zQWCSEoT`sV3+sQrRn&F=%OtJkP&OlL@9b#KCu~R^t$2E*w{EqiqnY-o_hyP2fF)&k zp7T%6cK%~=HuweiI(UBj`Lp1^TPEIU`(3!hjNcN zzw6zf&PYmz!ptsCmT&>y#<1Jd2}J>i7))h|F_gzj)gc zx}nb%`gDU{d$XD~U0*Q@SIp{5P)0qQH~<$-=O8;mc*!bWiG2v+!WK*VrnP0BF`)E< zxs%<4BM)y*MP@Q+u%I}?jDt3zq3~t{PKjX6BH3Dh-NtMEM!bZlgdTBUnq{=(g4my$ zw`sJ?y>Md4n79>c&qy^a$@zgGf()dkcv%%P4jGF;V|JzZ%@Mf-#Nj>ic>`REaVOr2 z*kOx#eTb8sVk(su#wXytHHNxoRJXHaF+?pMA;PE%b1mdeL~h2Q)9$4A@y3eeQ}sq? zu%t`Nm%rFF#ZHWD*5}e{i((a!Ms#6bA*T89EN4&HOtJYo6OpzfN*hbzfr1SxO}Gn) zuLYTj{7~nd;N#zIoIGkO)iC}zm7ESN&IzjnJYttC+iAC0JL(EqN`}3NBE|^mu@}+7 zn3Siq2ZDU7^uzxO@`n`A2s{7Z+aQPDbZeSp!f!2c42wXCM;SK{l_9IQ!Nc-=K%cg+ zj787CpcFH?#*V^o4b>khX|bbmcs;TP`N9k~c4qYGb_Yyh7f!8U-hNKZ^*wSVDah_I zOTdp@<~P-r4rsQ0zlAGN)YdEY?a?~im#PBk>l0!)eshQX<0~g0Bejv=Qhu^i_I4vK zk-sVyjTW}w$3TxS&{q>`7DSdrKG=;QvoefFlM>3rZSxLD(8;rmx|iIXiNaV{wf0mLu*P1DH23X@a|Lu5<_q$dYxve#P=A)uP9E$|f1@=RFHg_ZMTlpg zf}i;^yzTFjWFDPHBPGrjL>;hnZv~UP?C;V*MkSPpT44udYJtWDGmKr5ECmC_1dmj6 zR(1HTkl#~*Q>E1>#OQOEO3jxAh>F@u zo-c8r{>~Ti2&wsNy^W8n(kjO6OdIzK%}^HkZ=y=D)rYVCP6;n<2}lh=lvHw7XxLKdwA)U-qm1W{pIy%<^~~b!MyD5RH!G)Wwag z9r`gVUX3QS`+MTCQo3i_@nr39ImW;eu~y=qUWrG3hiwW-iM?qivsFSKXrEz}wVrAe z+uO7TO=|l6_PSdTtEsQ=rFd$pY0snj--`0znrYg4n5!wTkVjXjrD}1gkw{{pINPL% zOlqzdY7;Ln&Z|wzo>)*tR_<8#?5N$zgd+B#Q@*Qg{w*P_5Zj}4zxyeM?~Xfbr&P;& zg7#%~Fid`6&2?2ZBVejbKSI!hRaboFKD^r#FP?VT578L|#A0oM@cLvBxke4$+uR27G^CkL+)wX)i-FO|!Hs$7(747l^3!~i~&`<4vCeLB}luD4`GThVUEbFTsyLdocMm zj%P(0bX!Ewk>QFLap%ZNvT30Co=zcPyhq#uuk8}gAUXm;R?^0P3o413p*yd<5Y;vu z0p)1uktb=77NNZH57VX{=`|sWOlko!3hf6Bo{Y%UyB8dRP?|6u^)B5Y{n-+iAfDvk z>ZsVJgo>VA%{|U)b{9nrdb@tc3EoFEF508--ai(6ms~SItJo3oo2E=%b+5TN21jfg zpub?gupxM+86ork!rb+ws9X1OtEKneuSBk|QK{3D(P)a8YFEETWX6Yp0xg74 zA~7QkNMndWt1Vj63x!Z4yWbf3gs2|&*vaf?+}?iD#_5KR?KHEsDMmr0Vport{NT^* z$%mSVq-E29&xoR7Xv6rn--9RYJ;dXY$=IAQj^Ohjm;wa;yaHD>*$k#U0_8I`c2oM| zyjxg@ZgsPXUoCL(qHT>aimew}C~Mh_8S~owk0)sANn=;TsvCkF?*p9MAflW-m60gA zghlbz29{PN19@~+_MV|PFdYUEijyOLtKM|31YwM9ERnrO&*kiwfElCQ*sc5y=xVzs zvZN=qh>za=u7Q>9OHt5h$47+Ds4Ry`%`%J+RwCA6OtR1nQmQdB)q9_#KQ2e-ouV-U zP0xgV{q8Db(Z?jap)1fW%m!{G`Dyf|k4(ds|gynC50@F>*EDG7(2p^_O@ zD0I`E&ZCaLKJc0_@-{Ew9a8tpf9(ZmXRkM5O6r3YMt03j^GU>tjMXX97n$+_+Vd~q z3H-VHUvlr;izWO#rLX8WoW*|R=PIQV!!6!bWtGLeo@;E1n1sI6+!oZvx~5dMLoK>5 zv_As!nd<{4n`QlM@bF(RzEe7|(xJWbGae}#kzL~uymY$%`39LsRI-miRu%*o{DW)e zK6p=iBhf|+>`-l7cC~gHjY2t1c!A<(?(Q6!cf<*%OsQ0#aY3f_@p`S&W#f^G+=8|B z9Z2MPVnUh>ehJO-)i$q1AD4exnhqizI>=`wCO-;MCFtNby(2B&+kGMO=c^3sGm$#9 zq``5vnb7#r<58$@Er$88B232?I|eY+=+}$GoYXh%SqSCzpG#*{uk+LMOF5-dux9LS zZuDOI@@Hr+oOOvXy88~u4(|JcjzkvZ)Nh--g2B-KosNuDw|9xV^(n#-6I)~g@_{*b z4l^5G4~Uo|&I}cFCB=YF&G4o^=|buvcoq*vW0++OcfD)bx7K4~zlDbF zb%3=WS9-v!s1Uo=f`Hogj|OK^zwf+U_^gzJ$P(!K$In`^p%)GRVvTD!s3z9>Qlm>)P};H&&&+9-(g8V z$Up~q|A1h}grTS{PZvY}z-2A!H9^KogVi>ukC^6j$0h}35o8MpJPqP*{2=J;!Ahx3 z+B@8?&*Jz|7LUZzZ<0!KvWd&q4Y=@}lP{myIb7Ob0%R>yU|!eI z)lxQk^0%b(##yn-1w3a9f@h{6GvP~;90mU-Eo5M^LlN=x-*dwK({1l;jDC#UrER<6Ok~ zCs#~j@Z{ut(NFNjj?@eu!)wg-E4oledbztp3(aE99FRZez{%B#5XI>`WQh^F8_G-g z#m%S+%Dm3jY?cxc3*zp6E|K>L!%Tz(&C4zD84%37fWQ-A$7B$bQPtOfE$*{*AxauB zuPi)oRuvHNZo{c@!0te`!1YVZN3vq^UP}u&luHIqxYJLsjWMRshx^u?GSUN-;Jj!K zy}my3Nz^kI$RRdXLpjGaeZ%-4Arvmq6J2NVfm{(6~W1^jlma z9M8B>0b)nWehlJiLM()v4BcjQ@fd#ZFnd=d9#)G`6rlci^80A(*ib37 zbd#JfaJ&Rw$_c`N)?uQRp*u(mTSvAA@H8gGBi{kB#<(8YW-82%gz4qmqgz3^(tt_H zlimjn)gpUySW3p%A?oYntSnN8B~%TWS2mqqzg>J7do&wK4t?M#tHNgdA~;~Sj(9|& zj9q!RG`s2o<*#i)+&UVLq-2gfdXFPD(v$8LXe5+t+)KQJxzd6oBNtc#uEp}T!vCa0 zJ3>E=gFkVA26s&6)h@k_o|z(v+=Hdw@`#BpA-Fxl6Bgx&U;jCcKo!7{%nx>^%~wQc z%KV%*yeLQp?*$nwsZDGEP4#~2!W)_wyNM0vIynJ-hEqo6Gh;cXgqhQ13BEq?!P+IR zg(bKCp?z1=heRSX?kRk;iFjWpE-^YiiKp9F$ z@JGKW#0JgGY$kHQ2!6W9BOUvU`Ecylqo@jB~w3uZ}+ zw(nwdg9%1jjd1Gk=;`dfK(V&c?Ipvc>2Qt!2u?M#y?X z$}$GsfVdwikeRQ*Y?@;veO?KHJ5G-Zvy3D+m3xV?WXZazRkfKF+bi87CdBkZ40Kpl z(%=QsJ9&o+IuvxfMio#UZ1_<<+D+=wx`tyXY6G=^0Tz0Iva{kyGA0JSM+$B}V$#)X z-F1}(O9Vc{u2h!Dde;llwm{yDgWD&P39gAoBJ%fd0OJ&$bXMAnp#b3$Zk?aWVlyL} z12vQWM+o-;rCL0IDSt7j@$EPH^AB6!_{x^+*hAFWE5AN6YS^Lai&gbfT{W$!2S=)5 z`dk(rE ztO*D)`=Q8gctYgFf!#~!1EqRL=se^m3&I;c{UwBB{p8Z+-BHXVS&Akie@7YRH&ZA5 zqj~rW>;*aE2>7IX7DwvKN22+Tvy#Bv@SVOD@Wzf!EP~i%j)XNrToPJW);)*%UQSHS zMl>E}18qIA;~AK2zVP{Kk(=A+`p^yEk972o4ZT#8FDruaGTkd6tM@crf;X=uCDDR? z?RBJ8E51vCXtmIPBdP3&ZjTI<8hffCkYXd-A>hloxeX66yDHqxkR>=m@`A$Ey_Dq1 z8c@wlnPFN`%aujQvk$xJ%JSH;t8|6Ea*S>wX~T7n{*;`99UzPz5%8Qm3HV|se+N&% z1`5->vf~KY5n!Bz`@Nl;=v?GM4C2L)db_XL$pYhQQ?M7KYiy6{on`ji<|3-lIO`2m zSvbQ}O8`_O8$G9o~#CdMZMsUvrVBGK)hf!hYf>jtg7f9nG{H}Q{7tRA{%q3#< zJz}c&t*yhn%%3k*WErpO#ONFhV#P%kvfBEwC2Q+|os2AtMiyrln*jMi=t6Erz+~(= zGFUJzF)4TA7^PmY5Q-YS0rq9=dY4>r>yQQE2+UC8T00!`9)U}~p)u{xDPYpQ!jFb~ zmK68X?f*Nty*O$+H(3&`O-uUrtRE&GdjDdV(y#D2Ix0k0O?uSw8^aL~Nsjf%3yG9k ziQ|bwBuYC_{YDGscfgaf)aJqJN`!FYAdR4Ql7Zm?eCYv1w4qP%NR0|am6itJywwgd z*bHnnmY|48u_z2fzOvCaXspS1nY1dH;EURon zq3}t}+vE=sGI5q2&(#wy$2ZqBgT@QyxpRyAL~~QU(^^fB&P>JCCTqTxd~Y!D!fLEz zXKBAioAOMhULH%ymtHp-FOlXxA<5V@)A!U!Qtqc%-Jitcr@StrX*jZr_-fC{rOxWA znxiM4-%oU!Crm=h;}M&O%BaQByGVXGpX8gPZ8@Cf?NnUOLgA^IyZF=1UP*$?bG?0& zt=_SGqq`9~ZhOC8u=CTJ62`gNCofVo^J(ME4AFwmJhOKH@Iu2_QSM52qoDaNKxh?~|u zWVPlN0|k@~R_b?-U1X*yp7>7e^i1d)o0W52ytR&KBp1a1skrIVYfSWbntx6)3`4nY zEsZ4{iP&j0XF>5wPq7^W7OJkWw_^w=8SEe$Iad%<_ijx0P@{k=T zdEa@^dVycliCGMrWTXCQf7uI(8=-7@DsV21BA8q$aVaeOc1czfu#f-d3Mhd>ZNNhk z=ltf8IYvrXX!_g{jH|?UX1ZqedBhx|EfjqK(T^5EtqrSmQk0MhGAYw+HULaw1`D-+ z?knxxN(7bba{{r0GR=RU8FKyq+_+FG%fj_nptV0`fq+^F-p)e~oPg~|E_?{x$BNL+ zhR!g*Q@1vy?Su4Tg7`|iUInDD zfpz77k6>EowI>HCMn$En2uy8RFX&6{6ppb9^{ph21-7v|IFb*0E@SdS8J)dcz=~VA zp2ahWQxXg=#}_juL!rL7V2?H~92Q0=L9w+bSr&%c@$sN?*8Eie@dCVlh&q0Mk#p~Q zGO@>WR$x~2e{i?sct8V){mO>|j{Q~`$H)>UGU*UcrNOcw@S`B_zzui<+W(LN)7cjT zE1K=;fP6K94=Y@xssUk~t+yvh_8ELER4A8)e$hTJqoG|b;pP@}o(?&?>HEb8vIOBk ztn0}r6lUz(=VP>XnyW;2KZ^SES9Hkn=sr02uxgfS5V;c&`d2<~Up%3Y)v_RS{3kq? z5P)reYJ&X0&Hh(?WLcp~?l>~xiUC>q0K^ela{4+N>irC!8)d^HojBB)8U#c~ z5T^i-ZaRdC+q^vgw!WaElr~44?@VBbpno6-NXola(-N66e;5Of(Q4oCvJ4*WEUeDG z;Fb45;csr=omiB)_D(g2W-$KKpGe~*t3Ih-Xd8GK)zQ|}@n>?&nE{4H?<-*ePB%(b z&(>V8W^bsCIa420VjrKBt2X8}&)>qk@6XbfyjT@eJxizLz7?0ZQn%!j8W}$;<`yti zMpISK&C~;E;yVj3wJK{`E`rKH&uQyDHCD$_j{t&tfpd5a%Cd4r$n<`|GG$2Tt+!gb2J1E!hqAv`FHJsF0Ptey{7O`@TQl z-|zAJ=kxeHKA-#1xx23S^?tox&-FU_=ny}kk=U2gB!@RSij$~+*v>(%IHcD{=8lAY zDY*4@*@-`y`LttXGA=l(do(g_G#jXws)pS-PjVxv~02{$0v5dHcpHfVzkgeN?Ge|ojZrhE92&ZM8{ zee##t4fEXH4dEhqjV;$=BxK47iq8)-E6xT^O)!Ar;8UMn?}BTcD?^@u6b2oRRGb0H z;zgGZP{SzTT^Vtg-WUGNlFVD)mA-%B+C#j-1#2i5Hwhj|9}si-vTJKH)dhnGSYC7C z(6a+;I4d!VN@*S0Uif!H#bqme7j=eUna1SqCN_dFVqXzQNUEmTl?l=l7#S_9s1+dg za)6vM>aty8C19sp8DS923M>@PK0DhSNl+T?k{q&k2Y9&ujsPj#J-4K>t?W?gN8|*% zhMSN@z4&QpUEo674Hg;ICW~3^2CGGoB%>Rm-D;G&UcOQS7*WC^3Vx^JsRPvkl?O;h?pD+0|I^~|>*n6D@G$BSo8XE>>FFgFf8_6zpFcAVrH-SP=U-;maq=j8^ngNk}X?A3IX`R zTH1UCl8HP>qrO#C=md_Mx$_+^Rv`09AzG(dYV{~b)2|%dqN#7yM!KwtpLiqXP$Rr+ zW_tPlL*C80sN3*;P>kf&E#hwitHy~hf>Shx&tXocFCMz>r*?Mip74QffXXq(BYH)a zdlyWncAmUq>RO$_|LkqNT~NLo@&nEi%Lq3PL72U|g+dd^pZOmf-I!Q1nC9<_@^DN& zLQtX{zH?%eH-59?2 zOkebF>j;%0sh%n!xF#T^W8$Pjpo!?|j7jBfpJGQo4SCa(i`wIHB90Up+9Q?#<$K8$ zN6O-^y#&4D0@sP-Uz$|SQQL1{grEfG7()rP=f!0KXI<-Qu})4W?!9LYNb zH|7V8BNF)7LGvJ5Z#)1+hcIa3K3tRiu$PLflK9tOp!>3#be&sN`E&v%!iL7VoV}+!55FOg8`&%64-uE;Y>I~Px~Pag$)-oez1CWjJ1HveV^Ee}hzrPgLWIrbaYekn z%l^Lhcj)XN5ljaAYYfSs2%%*weNvC^>XiWXi*(|59wm6?tQFMp0xx{>PfOe0E3;7N zC9Oh$hPDM`jYMUv(vemlgT=|S?`82XEy0Op&76`5c+3lNyiIp$&f5JA0Dv>Wb$F72 zZ@{CJ8<%_IA)EBthX^?GjX^f$bCdy4-=Egnipe10npSVKUd z&Mn7I-g$N_{Getbp&z0{k#U2l&K+0H$_Ub%LHx8^J=rb432x8(5&6mYtwBM}^`lc(mYgn@a#wyYw{bHN9ox-?E9b#_hWuq-4U zP@4CrQp9fi1Xg*>&y_w`{utx<-)exF`=G65Ng$dfA;<$VM;<@5e7^);sHlk8q&05w zK`RHwAv)`!`K@8;z!xtDm((DS0=R4f|m?5Y{~T?DTPUav#lnF3YNSq_|3M z*)#VcfelB?nHw5xmQ8%kMxO;O1Re9;98vgbOxTpEBJwB+0KDBwN}UU>h|nMmbWX1I>T>1fAacH#p^ z`_thQUu$UkLlHo2)AWCKD|n!tc1(TC#={rufXlSR`wVtGVYnHV1Efd%^dSF4j%Rmk z?d$rWV+WTOz2d=5(=qo5gOfona|<$%Ve(WF5s%UuEMdf{OqM|-Pz7|wM6_)Aynv_$ zflXlPYv)b{yweYQih)(8M8gMr266H&_^9?#vh_cOz0tg>!2xTNr9TIJPe3kMYpkk; zYbfPS2tBkUdQ+ zNxp}62v(jwk_>*rfI=`ve*J*F^B$)OP(QH&zO;Md=wmjvpkzaj)kD)MLm0j0;~Sx) zM5!KYTeiGMB$d)-0V6Oyd7L3e7yH0o3|sT=r4EjN8f5Sf6ib6MJ6w{a@^^3qq0pDH zuutt4nXYntf}~>vq^|JTxoMFceR&J2tB}Z^*Isoc?;+hhKeu+ z_c;H|j(kb{`{N81rJvN6Ul%X1Hs2tue}a_zbl-gh$2u8+d-6p4IyZo_>A)WBu7W3 z%C@1?(`z;jt+o4wC8@53yyu_0)LECgd{^*CAz@(f2Pma6?fpOG2k%~EnM$p(aprt&O1$(opX6W-jvq{q&R+bHkTLl&1M(L4pjD|k#&eeF=7t5+HzAf-d~ zA(zO(wJ5a6H;0CP05oJc2)3_eUSkW93!qC)&F7cG6djtUw>R73@~RomY-f6WK2-sR znT8Kr|8gFaHOQwN{0=D6!v14cIcuT9*)Z~FNs@wWO^e5QCuE=#R|2&>DDH1!k4*Jp ze8_uh47Al{e_u0N@e5r%zUcPrEwVO5W_8nbd8Sdlms3ooA zBR*!O^vDY`bjeUl;D6dgb2HJzlSigv6`koaW6etNuCHY{9Ls9}|LO zTkKf7^c)?o&scUN_3Da(rOs<@c0a!DMs$Q_A;WskX%}oC`3_xK0b<$-%knbYZoM4p zQ_sNec>zbcbTqL&kxI!<@QYvQeuB8Njyf%Of3Sth%d?ZJBs%+098r|O!v^I9#L%15 zG5s-t3FNVXilnSYFp$j5(DDti0OBV=f4ck#j`q%Tj)@1jn)&h;c;7(gn;rM&{K>+bw;k@$K`qrxOh@i{!<>oj_@JH+-l!Dx~la@h?v89x9fN{8dqwXbnPZ5-&P92m(PW87Y;Dtrk< zczUZ@_S54;kZhA+bK*;ml*55f=#0r$fatZ!y|6u!T7@T32(GLT$|XgYTAisJ9-!;O z=6F22J-kvn<#eOh`j>;Y5z$_!+~o7~Mlu z73v4%@PJb~_SMU!DRU#-R7xFta6CBVo*PQ3fTZMd?}P+I{;VRFM{!UVcQ(*PVdu`@;iT&vBN!X6kvNv%~TKEeC^k!1n?QJf@C*{}Pn!mR~({d682%YeOdgVRUYJOXl(k=!(vBDnm4?iU>%3d_)` z$zX~2_7ZL$aDq3>zUcIeuii!3MeL^WNiro+~S4uG&Atr0FEv_M~`YrpZy zmfsLaEDlW>H*WKQaWUkkZL7_X`+J~6ddEHQoXoi07KW^4oz9)rZ4t-v@I8n3W0t%BmN7|v9Q-dgG>P_21K+1TKmdtc2+VR?v}@6ycfw&mZRoL=q(uNLm# zi`ftRfxn`bb})Hgjzdm8`Ja(Yob)9fU1FYiM^|B|teO(Azdfm_>4B#?|TibTkUIA)HtS8GvAl+uLk8;Pu z$3Z$G4jrY71vrPN`yC)=05Nm6Lt5R?QNe@Mnt3qD4%ux?I?!FE?T-5Afg9tTLn@y- z?@H_1ZW~VAS$I3?NOoYB#Ar75jp~ZoPYgqTfxa`0{YRL|()hzW?LdA^in7Glfs#V# z-%I8{x3k)K&^}0xhO4oC`_(3;H$^7ytNz~H>RFXSWUOosAe^{)hTI$025k66$G58F z3_ysXlp5^$YZ+Ll64pDyiAZahS2;wv?eIR5y^to`OcuP5b}OU9!ah|KP|6V4y#1jPmqSsWEups=5eLao?H2V8>O1Qo>8N zk_GKpV{yEzwlPwuc@`kN`0ZJep%<2;&^JSNK!_Q{xrKuEtxFaM9&Rry{GEnopzQOu zpFYEYz&l6m|A7uJNP=uEVdA}g#QfmH20me)1-mA@w09;Y!%t&JifzmV}ON&uvfrT(E`)xI;0HMdOIIz2wka4tdA-Z_Yv|0>Jp%_KOQN|2!@46 zs;3`aN(t|>dQitvTsz$7$yF;U8jnv$bE}Z5c^j)Mp(fz#qNBbH6)ZBPB~@*Ih#2I$ ztgTK?Dx9LS9s4j60APc?_x}RPaBTb2Wh5h1n-q`!qTQu0Ys`YHP^I_n5?yN9-;iNH zB%s>ZCv*1pc4?n4G~-dD)4O)JZ=wf|zftw9J@kTx^tAMZ&@?uio;seDVfc3VE;n9axjut+qGK+(Am;{85ZxOa&d)vY zGJ6zG4W~w440Ozq5fv*)%uUE1soJ!o)9|u6Ye&y)=kgpfxiJy*ajA8E=-=#Lg^&2Rs@WrQ!lCUQt9p#F^_Ykgs$sQ<%BmJ2c%cOIBK7nC!5 zUUq(|^iW()?|G&1#^p&yay8GabpA=Kz%xZr z&=D1Ih8?Aw+Gc?Lv^%zR6r^&0KBjy5AWXeYU%L6yBx4+6Ny`sq6jKaL7GMe}U@CmH zJyBq?5AUdo2C|#>wRyUzWq7k1}cSFZgZ~t73iE z1KcSG%X-Vsfu%5!qV5n$#hV#+k69yp!tLGa-v(n=Io{j)u-mJJwnD!PN$W>x0yfR> zz9)gt!)f&#rQuq6M!xwjE>>v`9<*^3rtr~4#!fJhFE_H(>#^(9i; zf|go(+5);M`%mJeZuna<%qHPI{nvJ5jFp=D{|;Y#EE@h85dwMBlmL=SPl^je`*Rr} z#$Hlmx$Fh!INu*+R`e?BJ9o_&w4u*A$d4-=Ui}%pEY*&~I9Gs#CWWuAtF`A6Bbzz$ z)YSeRzMOxEBbO1xOEZsO>oAWeLwlkE`)80k6YQpyWpTqW-S_V9cSEJi1N+Vi2P_2M zb)Nz~k`CXLMU*5e#wvD}d2OoY(g^E>?OY5rXP`LyG@4uaR|^28Nm2j8tDOw4*qv+! zrg_AM)pg(I0fpUIjuL3|VyW>8@d$bMHUteqdUav;Io~x>J+o&QRW!(w-{N>O9R(hG z{!3(UbJ(@OXHn%GlulO}8cd$eH12H)(|kI$s4$MNI|3SC&GC2lBK6sXMVoQs zmB(Sqw4ZrL7`=!()UGv8OQALd30^X2jri`4^Y38=u!hO^UDW?Q*FY2EtKkJ%;Q53R zBi3&Va7D>Xf*(11UGDpV!>fyz+@DS8mAP2=ex~NP=ET6G$6*mM=F-fhi%+O`Rb$8S z=T|UsoSUAi9B0|TdRaCW?wR;*ZHrETa=A(d!4nCvrW&AW86p?p|M`-Tr zT$kFMX^(FyGk$+ZdVR0(st$j2p})`cxb#HerX)_B+N;1*+WJCifzrL^mJOS{k}k?6 zGlb43-Rj4ay?HermXZvtrOW+5{rFG6>JZxS#URjAxV}pm1PQA2^@TyAVGos9 zp~TFBJnNFb!ml7ii!^?!#HScHabp;&GuwR3WdNWIsS@D4qs_d&= z4i1q`YeH9P0(d_cnSQ`3OaM64d@bu1y%NF7lnu2ow`E%YUm~x(b9sFAoM^+|P{O@p zYAvG=L0Lx@H+_*SVflT(2a^?o?zx#t*5B&d=`T^GjVzxeA? z^A_|_*gZk|%r|kYbOrau=X~go?UY6Z2^)pyE<4ibiai;=ld@uf)V6liCF0&L_k!^8 zs{U%=Io8ibOz*M3WMCVDI~6JUfVBXFggA83#A*F)rkn9jH>_~v=M(71nk^?j1h)Pe z4ljq#Mckg?mcdkk68rgo=)ut#=rSqNluqP3~uGSQB zoj9>Hj(XzN!I?FfdxJBrkWN%PmM`M20167Avo(uOJUG{eyHfb}!4Hw!pNL^L{R>b| zZsz<&qja#iFyWk|HRJhZv=U(+l*6C22Y%?vkKV_#I$#YQCoa|S6M(B`ww^+VX}H3% z$uNhQ2X|KZ|Hu$BeMcS>ahUgBJ!Ut6*Lt=WPJn3qK@SJTYXzqj7Z@ngrae+8LI2;c zD+h$cZw6TL0O83;rdfJkvA1S!=WloQycybgvV2Cw9x3g359+D)p8)V+11@&d?9PlZjyV3&Ttx_~sCpJ!$QHJ_t zk|RDK`|i4-uOQ079$@kH8xT41ZQ}=xETU-LR|10Gu-PBN4E)gay zm>J{DFq?w`2Gf!!QJ2i$K-_lkAxpqyok)3FSSCQ;zo4ZfgRhDzKS{wUK@m!1ykw*J z8&bdiPVJKR%E>)BVMUs+s*|-y*34c9C9Kx-9I@`&BDW0Yk91UmM+O6(T*vm^dF_xQ znMUoc3y-d=40v$2&a<;(l{QXp8TSl+~kilt#=4g|f}3)_X*xlC(kG+t1i z_7jA$z7dOZEMf-w;>vY#cJ$HI1-C0OlZ%ght~~iwVXi)GQzjACHIOAa9*8yiO8cD{ zs_y4E_;(WKj=u0MxVRT?he=2Flsj02Wu;!OcL_-<0`%d#Ud zIx4q`fHDSq=#(aAsY$zAv$!FE3lWl!Mr_!Q#TDTwsac~#rT#_IAV_6@lW{aTWV^Yoejk<;~ZD_4=vo_FX%nP(=xIH&Cppz9a?xiaNjSDt*RSS z!IjsOfN#SD4~(h#obwtlqNTf(gcI5Q-O1epnzgF3+)XUenppKKe~~aAo)9B6jsISx z-hNbb<=M%ow&j$f-HQRkpvIRr04CtP3x-3e-{(Nk7S``1F%qXouI)$WyKo#6uD&AA zzr!@y>B)i=^CYux?<4>m_)pgb zK@75>vUt1$?zV%>dCmXt#yKglm?)|`n=KA{d-5rDm$f~Ii7=~*cA3RMxA= zM=(h}iMua}=SteeW`08;Z+=(#$^EN#mF!&RHpJKnd!3E(Ax9`;Oo2k*ioJ}%O2Fc| zS~ASuG@7piu|ikHJO0e`s4+Ckz^jLRe4BX562I5744R36S!gD@S-*{nBag5qS^8`r zJ0>WRDJAq&Y^XZNc?ouavT@=qcsFkc+!_0okQzCNH*1XXXbdaU6c@cqH(!d=lH)kp z{1515Au|r6w=TNrC?=xR4Ep3tBz@*c3DI%;>%ssYI$h8_+}zXeEp!2hn3(8Ehl64u znTICNK^(I~*wLO{D!7uN^=;^f={tzKa!Nj&MMMY>{(%oDTwnO9O)&-GL?90=4vh_Y2sf06nCJ#sX`VaP)SZE7%!DM;OV< z+DOK_g^Q%T?qxIj)e}IA(rV_hLITM;I0!W5rul3`Ib30XpX<4+a~@7Tg=`b@;^&c% zQHCr6sJQ3YaBQR)D~~bya(J{;$9Zkt7Q032V-NlSm=hgO3z+~8fn97eOM?O-%Y-@eB?HLIKHXuI}!va=8q*DTy=1JgY_B+X_!qh*TLwaXmf^)gPDNwtJqYq69cK9ij6SHxF`2>X zWZpsoxa^>XFj)H6h{AC9#XecGOA8u%3T-g1R z?T<0`fM0^1F?c$1nCe>KGVO>*r1Y+{7wwM5ut0fGA!W;;U~Y_UxC_hb zQrjULk%t}55_tk?50yT_ivzXUzlg0hD89g9d~=TWyDuGOW9bo`f5<9&#vwJ5F0aX& zI^0G6$a8ShtXaU#ulTbo2zl>fn#P+Qrb#=+LX`ddw>py!e)}RIi{qZ5P5BC9fZ7H1 z`N)?es^42)-=5Z?gwaj(8N4LE(TRUC($Or2WDMD}2s(vzn*9F&FNeOygH*?Tod5ZD zE&b0Tln`VbH_yNM)yW&f73AS0RZ~Kj^zg$KA#byx`~W-VB>mq*ee9E;u&jnxE$`$? zFC*hL71o3QO>6l0Mv{Khbc32XX^$y?pXcF$_fJh*XHGCc=o5&`&*k5UbCvq>?EOg0 z;Kgq)!~kEVD$BjT(xm~fcF+mKcJ{Kj0riEJ1cYw7^Vx7DSUpy{G!tOx-pFn*eOlsI z4viLWLJehAJaABOTVoVY`dif;kDu{@C9INc{XQ4;5H71th%1}&Xeur2Fi&ry`!E(Khu(US3!TRwm zESAIewG%^tR_9RP#iHdg{8DuIxczm9JkZ(PfCr;E_}qzM-U>zsB7C=J=oByM=g-i= zk+ukIyT z*Z;mdq*BcKx`)~g3#~KP60r#XaI)JK9+2~cJdcL+5yX>{)iY-IZNLBKR6_=6ALk(~ zqKa2_|1H?`9R8>+bV^%SpU|ZG5x@b408X;L>wUu6;%laZbs&>8DR{GUgRtuF*Q@+n zS#TG&eH#Tv3~w%^ zN)eLj72$IPm_Yg@19(6t7L%$aAAaAKaiFFR`&E9>0n{!fCl+u%EiT%id0s5}Ej@Fe zmVo@y2@6L=b1r5!pT;NwL1w^Qxf#Aj_$Uh@8iWdYLe8;Ufg2P@D0SA@Oxmrr3nOyU z5hb4lq|HNpEkjjA6E-0n`*ppHt}5!nuK)cMZ@l0A;z=^vw~N@M6OVbLcu67E-ty+7KOR|Sawk3_+p$-3;ikf_JQd^WDD%7WMs!d zI}UfObgB+%x$Iww?sYfRp55MMbQs9@3IT|d1jXJXdR1~rLzJQXzuj{F($C%Gp)f^O zL+B*?S;|2+C$%150;s{dQ60D%+TXMmX`squ7xiVqJvc^a=fQ7=J0AwXnWl=R)2mC5 z67maz`}9t+&Yyg@y2g8{b{FA!^bW3Q(5yACqtY?w7Xra!;z0qPmOfIFw6uLVbC+M! zlGd}xw_pZ1whj4160VCzV6P08pv7X0yr9YM?|(4*?zI9w#hj)EnyHrt?641jr4OFn zzFY2gsMcJ^QJN|SN=WGu{3@IKZ5<_Q**7>Wc-wt->1ixT<@kOd21Zmnjvqe!eugufP!yY-q`kS22zv>HI!1HoY7$}gSQr(# znD#NI&Yr>EvIn|ca?5f>Ypvferc+F)qbc%1CuS$egb0boc!lP;E%DF1724I9gE`4NkzcK=4oM({`h&Q{jPHKo zpFHipsz04_9aM*C_ql;Lv$YGFH^uBCe>=bjrN?g1OjRcw0@wdzbEI91$hH3mIri9>^-*Q7;8*{WQ zd1Tq}f8_f#6-zoT@Y1eQlEmm~OuF5r zCkmTrDi-{SS`ypzkfcY#u|Xi$tD#i!0KaX)C}Q{!yG+4TOM0=UE$sMBJA|3lzv~ysr20 zq0d&vf6bndBjo%rTZdVgyDzONKyd5VWjNm{bsvx??MLxF0o3)uH$0l~kE`1y$~blLc`AZH*e^$t8fuXBA1L@A*J zY6@@o9>lBIq~(CH@jW_#D-LXTiu|i1JD&)9P;A}Q*UUAwog?*7xRu*0YBvqo+DBG) zjmqN3Z#?A6i&;PJfztu=eDihF_gDE?1TIXaywpXvhen0pMth$c?EX`bA(z1clPq64 zZij3I6fTSFwokR}VR&7z!UfD1P{1}7+TwdFe$)a*`T@3(geJ46)k?~myy*bdQV!oD z4{i@12;n+4-#?=2Gf)5-(6YdY1 z@-$VrUN_#H!v2C&yL(2IHmWKf7J6pGCvC>;6<^+I5GO;G%OVB5#a#cfreXqUJkikdi59O18Z z3ZhJ$EHWVppLgO=>2b1@=t*I)YU%8mN}-C)|DOMpPp@8-2JYA`gAW)!NWfS?=$_z& z3PoJ@zYgtMc! zMOTJ+Cjkdey_ZtSHki#2%oT8=b*h*trUrjPkp9knqE>-YbRRUFtKLlQL$GK=dsxH) zkeqxCfy#b3-&P=BHYVqC0W9JeRFYDI2+aA1zl&SyO28Ec=5?zx!2EZ@?Ux8Q`~%Zn zaJk-Fa!f1TzR2gX4ONE_pg##Stl%GVyP|xop!W$Ps|y(cKlz2*nS8Hr!NV+sc3m3g z4hj#!$%77m=ei)xRz-+;!&Oti9Qu24U^1YjgbF8LLu$8_E{ME#XocHpc(uuip&|;A zA;Cds`+tpr^9_a^Uy5)xkm@xNi*#cQA8Bu{t<@jp4wB?!;6D{+ImzkAosK%s(q`^C z!sPl_@n9p2No!cj8#K<3t@25nzGjN6lFD9RO|mXOGs~Nj-%#$Iy2l)}>k1^$1HK83ZX4otl>w3umqX6R zA~4oUIj?-nYIxiL>i}G}hlNTm$2fGJiJ#5EUH9Fx=U<4n1()h`hfGKnV%k8tCr+`8HWf)aLga{U77ze zIb^pfdCP^5d`8okoHfO-wL<))l>0R;TCZpW@1m~m*T5GI(GmGFFuDQ~4R1g7(ftN& z(Yfs_c=B4d6bC}_zQEhMqpfr8wxQtSLhY&~L`N;srwh(Yv)+pFE1x8SeSAAV=o6}( zHb!QhY8MJC>dG1toq49Oz7|3^)hRGdso3Law|q|U7Gwh-A6~0!7N^7fJF8EzJq4}m zFLKu2KApEem5A;4$!vbHmaVmW=}i8D&&Bh=Ih^;`qU}8d-YahpXlsEklGs+iAd<^s9L~{;DB?Sp6#x4EfYND_=YG0$Uz#q|V9MoN0bb_o4dfE?(bs#N+1h z4!`MKnPk397J<@EKFjG?l7020_s8|-cCyACyOAJe*&rHz4>pjXPVA`j@e9K3#s`1W z6zK<bGw7g!Ym<1R?=%vw)F6l+^5Gy9}|GP|evrDWNft&n(R7v3AUfzoW5^QV2D=7ntjQoopp8YC=$YYfv8a2LW|=9X?|c8$ z-+pSQp9|oG#LNEf1MdqmX;Gl112#t+-sLT*t3k3qAfH4UU>!&gaeeEc3!ysmasC;ZwdJe4E|;APA`##vrILP!pqD&OuXE6< z_8Z1Yn#2{g~711 zVnU-q?S!2c#7X5_5r{wgPp%a2-j1uzR}Rx6qVGum=?fnJQT%w}c0O5{yC6eLRpH5u z!%I6wu25wE%CzLk4l0?aE_P@E^F$j2B7L_puX$s?!xawWwNE-Rv(J8sI&x#Z!T)K3 zmmYi&E_jeJSJ$VyX4o{YFEMS6to41b-JB@@PGCfu_g3ZR*O>&{gxM;S1_echPeozt z61iEE)eJS*JA@9OP+L0y&%5brXw}AuxzNc|r_;WQD;3WE6iYmWgyAS}Zrk@_o6tI* z+LCt+h_co%ZT%c@xcrS*%LDaa*SWj>rc+)zUV~Imu}AV3L7};~Fd4##-wb$cK*mACn=9L2GgrB?BgALaD&xQ)@*DEl)m$rAVot9{9ycaQ5D1Oj z&(=WhtJ_!z^KN&Ma%IWM2^A-;=R#oH0H3{&Jm0kw(7lIX1VE&E$B)X3f^wh&d)=c^ zHI0d3_#oJQU}~!*a>p8ZT#|?74>VoTf&XlO4jX=l=JmJagz;7qfnF8;(?fgB(ei!8 zlcieeJda2ED^4)uIbi8ZIFm2fdk3deoU%f2zqpKO5OX^ueF0a2?U%&V+ob@^!++!B z#LdFkm=LpnKU_e<3y0=tk+Yqmk6_-BD<=xXJ`6t!xyzM&K%8J3RA5ac;)(`Yvs3mV zxq005sSIPYZICFv*rtMxD?kEz}=H4%9%b44hW6)NsJL(ksM^^+7iuNR;DtP6F2haRw ztNqh~qa(XMpI#NwW^U6-d6qLH79(hFkZ#I zcIyOwtdqVbZuUN*ZIA7MCC#!grefFW$z{F-QRG5uibASF-^7}IbkW?g)!I7Wmk{p+ z@&^!-O+PU78{Y#ax2)5dQE+1$?E*BTAF&Wrp z2r6|Ocjk|NJ35x`kyT2?$vLii;f4p**D9$I{X8M!WZ|D6XZKpsEs!) zfU<{>s3ui2FO_2wMb^P6VhnD*u5cJ{kvl2@VOlw ziNhhh_Hovt z=POfA_OkjMICsKXFqu5kaV?{Ho_1*Sc#h5XP^pGf>Zl+rw$b7r%In&to>DoqBFwcO zMY#O3S8B-3qDP!9LJ3?MQ@`^IjIRbulBa`NY&G<#T~5? z(>FnztfQ#Dv&wgis`+1I|3uRdZbW;>eB9{ruBEWmrPin4W$G@#esR2Gxou{yo2}QlPl%6(+Ot3&uPQ~b(V)0(W%erS*Yw#0}7tMc~-Jl*ggl(QXqIbJNjYVB`+d*X*<8_Ebg9_N9I|vJ`lf}WHr<}lspeE`qdvwtoF{KCB z`wTzo$Hg@}2tg99ry>+G9fUzoMV*_T??LzW9NrOVE>@wzrGDy>D)Yp+2$FoQb@eB| z@&+7utG|sT>WQc#2gK2@RafvDS*?z7K#+#uI55~3c$9Q0yzE{uWfK*dpuK!3K-w9D zY!-PH^}g4g>+n}SP~L)vw%&9PM9SxjK_cJ2TfS}PkV;p|cu8yDyR%DSzx_NJCMZl< zQHau3yAz5VRb7jegyN@t3YN4>I|WMu4Ff6yHVJF)` zjakK7j@7W)-i;q0Z!&(j#F`Z>VR@wG=ke<9AI3PJLBEep+++rO&x%L884r&UZ?B!qFN+LyB0w=k`51==%bz?4gn-W97agl?E;E zH(E=h`kEi(XBvAaafGbqpf;;V;-_0Y~VgajligJ8iR53(m+ zM$Q=6ZFO$P#M+BsEt&})RFI7eR@LC)TX%tPJxvsU1*s4iY!ouaYnHI{U*o4gWQbb2 z|ExwnWrA8mnmLm{79l|xX9&^$hd3!Vq^xvJ4F2EagxX}|Ryye!ScC22fH(16_1ETI zO}uuU9e>(kROTJt0nnzm+dcXvadbHuH)K&mZ8t-N7Gwfu#`xRPfrVGgKw1n%j!rT1 zV4LD@mEUnQHy_C3iB2@ZYuhNF!Aa?X{fz8h!W~Im2dr!K*G{ImgL5KoFR^0da?YmE zSS1=*@0f?Pa55y%JX&i`Wrja`aq_}zA+YarN#N5m1D_DVnIwtRQQR`~l`B92byh5rZ$NP@;((6vq(D^&5)hH-_4LL z)>mr+8tnI}h|&Wi{9^^7#Bo}$@<^rb2O&PJ0ep`Z{B_eH2yT0}F+PkXd73~t z9!UUr^wZ+aCro)sGx<7#GGbM2tkEYLo^QryUM4V+-C&tWGug2X>C&V5w#!s2m)eR0*o`gJKy4aZ|mTY&_`iHF-5Kk+?bY2@(EsB&5 zuXL$c(X}_6t5*6EqZ;K*O*YRb7N1W=6Curq`aR(^NBpYs#(26d$Hr#9C#YLOp4Vkz%E6yUq)iCLrX3|sbY48@3hd;P771Oj`>H*< zw8Sm?!8jK;ACt!Fbvm};T-5hjkDDQe6mrISwYUXQLsAgmqEmZ}$;x$sNK?UQQfph= z?nt~*>JM#F`*p4%Guz66(zTBJ^963aNkKX zJyIySfO}peAAHq&FtT6ZMHa7Q@h+p#Wu|><35g;`zF#sGj{4?hDF_EFDaXw8vu$#` zc((|-_Ov|V9)eKTzAwFIMlYMZSQR4YN`!6TqBHqAII2~by@{Q?;_M>QJycKR!W|AK z+8-u(Y1=#4MU2tcE^M8+8eSS!p0UWjL1Dyw-~zxJ<#K#;4?IrqdSc9t^MOf95V64B z*Qo7ueT)lbfQUr%gUj&Ndg;lldCwQFKW^|6IX%#LMD-Rj(rza-v&m80@=bV1jfFO7 zk}Fy;A;srLIB<0uN8Qg`GLY$Fs~?&(Po9u?*T*#633%E=e?&&9pcq17PO16s+pd?!H$1(DcHa#U#G6? zL}0G)yhFw2!wE4ShUBs?_}BR715*f79xH1(u5u7|30&Gg-jaZQQ6|c zS7j-7MB0dexa*+@mM#X5D^F}}D_Sh+NjsOX`pM;#Z}K=GLFgS~N?EHMdtRmm%>l=d z$d%?=OY3*nI($`m3B9IMxDBV6>9obSTiMA5B;jHgCri@o%C-Dl9VO4tEj*uS(Wna9 zvYg_Y#?Fqy`w|Xo0WrdUkeoe+tBcW04=rc?xT3sc3-8U@Q271m;UT*hH3CNB=m$ds zC8_tosLSKooM?3W`KOuD{X3=Bj*cG;Khs!=gtCM);_Ib@uRix{&rA2t>`OlNL&TxB zH}khncHLuKCO8lwh)hBdbzt2shG55gL-g~n07hqRb~S!*=r@RBVIe{J{#GVq`~!>g zM5Kk9`m#iGa_y)%>9`?zqhdNiw{A+y87|`bZF_sqG;kAwH`Hb0-$@&B+T7bf$S9gu5P0{Kjg#@AGm&*Bhf|xVOh?iDfe3-iD;o zFX5T{Jyt(!pV)n!NU4#ZFimA;a}WDkjWCTLj*g7pq%F}bgSRnWn%O0b0UjJ=!XY)1 z97ATqD-q~afq?FMjN`L6>O7P$3NO%@Fdu0iF2l*Y8rALcJ#sg8?OR+XIEgsQ)h4jn zbo&LbwE#=88pzqPX^g*`bciLz4+67GaNRA7dAKG^j)}89MSAm(+TqjRM*QQ3HMhg5 zt(t8>kX%?K#BNUnUip~>>VPl4mKM^jP`$tkJbpFEdG*o=Tu=o*FZU%>jP-4u-c7MZ z1;s-R4$SWWQPuNvN&T@C16K1zCNEN%$xwlX+7dV2kr1VE5hsaB;-1d2mEsXJBt-Zk z8+kLnn2BOpF!BNJ`=#uhwek=*BY6hC3f{cf)*mKDc-h#ofwo_;LG$xj-x6#8m%bbJ zLiCdaitVn3>r!`K>?|uOMFcA9hAKTIRY#nA12BHUS_c>rmU4H5``_ylkfM1bd`*r6 z9Dvq#`bez8M2zv+a+t+arta=sQ1A;i)(qB&N+FU{n8{OGS7&z9Kst>L z;`nrAf0no6WkP2C?OsMN5<3hjTkvoMis49C!;!8#$T9K7Jbc`xdwK3t!7V5$Y&}C( z5OSIPW&hIKRmPUH#y0*}_K*l&3u1cxBTTm=>7r9n0B2cd^>OSJ^K?iZ2(XVs0}UUf`cX^1wRaOHYD zvQ-iK52!CN?;m^6DR{w(qdnQ*26_o*D=ltGSaRU4KYH#}qfhVU>SoPL@^c%<=2vp89fT|`3b<;4I6*g4G(7sLc*NZHr2NYC<6PWg#yL1e zO!rgKQO5`0o|I9ho&p&!ChC(DD?Az6r@M)8a|wl(-Q^Whl*+7kP#t?ZyNO3&)>+|yd?zZz~D~8lY=(+?7XS3}WO&>HvpSd!b zQ;L68;3zilS+{JUcF9oCg=j*ZI1wS)PYCwmO}1!67~z%eH{-bubBOA7z&6Z#ZJRjo zUC<^|%eoau@jw#nt%Pn;IH>(c+&5 znQl42`egLgmdfi@07tB4Z~GUU0`J@7W zAs8?~azwq4GmY>q$4l~pa4w)}x+0EPt09a>2xhZl$QFoRoYp?6P4in}=9~g#mxmm4 zQzP9D!ad7bQ{(xB9BuP?`D}oR?7^*lbN%8an{l*H4Qx<8M$qVQRAQ`#Jcj@mOv?(L zq-xe>1et*SCAk1+qWpi_x`R^Rx?0z6u9#SS&b`^oDB5sb7pYH0`?NC)7m6ftH+t~J zA18DY>(+sn??!mjo5vWUBn9CN{T|quVZ~vlS^^Tjk4`2M1ZWq*=9_s)jlAa%B2f`I8qZjI9FmQiDSr2C(L_?4;>^0ib!b7PTC^T{##${esNJG z^?U--d3c$4UJr_s5yXnW!d4S>Ey|=>g1ofc9q#;g)LNu0Qv5w5OqV*Loq zF|fV3Cn37T$63WI>NMTA*@_^o_*srJ(a*Hu7J}~i%xHH4yK9LaZ6Zp)8Q8+U=i!VE zk_Yo9j82F$v?s@7ohN=l7_qp$!J4w@jLNY((YmI~#CE-Bs_Df%t7+jOHSzp-b z9TE(n=oGDdSfy80Te~!?;@}a+5jCu1-*b#SeCo});3tXxDIU)&PI&l^JWVQF(u3S@ z_Ak9JGp!RJqGuZAknz0fRqh#`pD*CZ3sv`}S2k!I_|5JJcjcSO=6dsMcOvJ_eBwuXs9A!Ik0_d0an&+|U-`)7U1 zm~(!=YxyqMH7kivn+(`GeWwTEh*0O! z=JWFr%#@QXQ0%tpBRS~bFZ%_Y_0jnqD=-E5OQ_Y-9c1k-99fuc-f=}+LJ%vZ&RSpP zgRutpR~@WMQ{FkI_jfM654B80E_-fJW0U`m+|2$7g{)Wvmv63F*TmA~c;fX5+x;a0 z1tN(G&2Pm_{KPnSGzwBgk=nmo@n?ya;AM*smxA9pQY-dsd`r`OdKm@+aa^U&hmfI`V6N)10oA_yajpRbwV#HL1+^x`iQotBYf^Aod?XPkoqiuj5rp*>YiQ=u zZQUn3@1;*KaOa<+oq&bZ^`Dj7?c2InrA#DrbjtGf3rhf@{iPy60BO$>|I-a*%`yW+b-Jw^7Xm%l8?KOrxMLYt!E-%OH*?Y-n=N@aK^V!eOi)xR4-Kh#6Isd zlEMlDL?cIO9D~a2@sylIq>#gk8Ng-_Xxp&2I;Zt*BoVgE_k^Avy8qk2E|8ZNi+YFY zqvRgOM1tQU@ujzgQM*A3-n5UYU9?JVN-rGV;{j%l_h&;-X9XT`@fw}2eMoBKOW>dY zSQ;XsqbrS*>Bmz9!>o8!ILGz#slK>Wl2!R?+vHIHht<@-`x5-mJ6iCP-+eJal}YL; z^a5YpMY1?vs_S5JmmG`64v)-mL{v~8ftOXlT9$XS(DpSHmW|M&f8n|X#Z6-+Q;Z__ zdT~R(uwlDOo+}dMi#r|2vhdYqb?*7mneZ+_D|3J~;J@t~-=7Z*ft3W>RjV;1!1hG`->MxZif$2B(VwU_fy8YjS&@`XA@D!>@Cca{rsXwzO@AN8yS2F&9qRaSj2Fye?meZA zOc2npPy+dc{R^A<+oAXzDe}eX{tz8Pm=cRou}ih%*`rJz)ZlNS(g_3=6+Is6mNCcPW6zQS&v}+qT0O_iZI?cp(LON{orT%iTB3Y)VILq;ZY~ z;$;HV*y~M)ZMehcdXP<3C$_d|9+vksaqi#Wok-yHQ~kN^g*TzN?rLOtNyVgDO@FmU zj+J(L*zC*V675@Wrtgf4_6?RDFAwff5S(vO51b_~4Cp>AXusqlG%8zmYdVD%b|7_E z8T%+_>spJxou9o!kU8MS^!|x{rjpRJOVbtT zPWSExWM$@e7;BBJX5o$MlV}Gg;ch@p*6y zu>uibzvN$x+;BxAP4OAy36gj}Z*n5JNn8mJsovj0teZP)I261gVR30F|54#bqv-^i!Q3bfNu@?7;*u?oHrsu&2LEB1H zAw&?#r+C4R{IqqbYFtnGlG&m}fwr*~Y39*gt4DfP5n6q+cL{zg#D$7lxPLwuA|QUx zxuQk7DTL7|d00QW+nE?vcWd5ke{tvoTjahgD25U04`H$VwWbWM-jgY~_SB+I`ERbi zF@`~mOK$ByeD05X0=NX<{o;9JR4_pr_Y;ajf&>NH=Z_(-?XifoHZSZ-MtXLHye9F0 zvJ--?KtiRbcLZ`tOX~gd$Cix<-|h&vmfaS|u7!pZ&0m^udC1MmM;2$N%r&=cd4W7D z0)dqnVyv%wObWCtT7s1p=RZJl3E~!{_iHj~1;V<@+IhT2Pxa(S_u))07ETfd#P($u zX*t8Q5kvp48_}S_Kkb0Xh9L)n+aY;lty%td9`fU%Kn5F&c~eCeF`06%s4DB%p)jfa z6?B8w*!=?NEne!-)*|FaFWU3yQz2KFF+pOvSu*D)83H(iog4CP`#kN4hK}k_nbG@ z(Z*0CVKSplKm+}a_NZ3!v0=q=C(7>CxP|%aC;3shFoj9mXVI(UEkoMxa|yM8{(4>0 zM~lSD2ritSJWxp2)5MK8;$qLp1BECjjDGi*xYZ<$LbG<`PmL>;S4mu++(F*hvN=Sn zfDgBS+^G=jlNS`p6>3N~90D$xfq<)a(yZLjWNpPu-oK8!O4$eJ^x2h2a6skM zEn18& z+^V|~XJ=8@og?gp|lE?!KE@?!Y8a@SL}#@;4&ryDx0Wg4FSWbyZ)8W526A4E<(8=5?hwuJKee!Xu%5YQN60p16SA+x z(5u7RQNz2h*yarBY_rvzoI8sft>GKnhQy0^Iguy{ENiH}V7yP7cR39AyE+y)XY+>H zEoXGbxu^Nf8In!hg3*V|MnjF!zGl#UyV1oo=8BxKkV=y2Z?06gEX2K))f|kG?%_5M zH&ldO$m^Zn%^WWKBy6ySSK|dWnWPxe7gFhIlG^ocv!}1|EO>$(taawjJWJe_Gz%bW z*u(+%cIao`5=(M{qQ9$O&#M=PKczPIoyPNsy_OPd&1Ect-6CGfNY^IGWXRA*4bXs2 z6TC^#NenAbN-w1Tb&E(z|9o}uPVu7q(UuAX1slbA?Krm(Ey0JDl+}WnI!Bjnht+jT z^L&9^AsC=zT?oIIwSEM`=vbx-N59k`qaU`ru&c82;{a>n{O5fx=p&ChBdfO}ko^(+ zx_sy$H{wEIC!2cM0ouf{9#V~60C*(lbI;FI$C~1Q0Xzs_SZq^UEOLhzJq^K|6GOSY z)6_(_KZd$&f#>?Hk9`~0IaWwM5aM$?*{c=d$N%-NQ#C@4CG3Wmgv!sNlcxy*3%e&X zipME)7W22Rgx`mJA4Mm2AdhFSpEX7q=hKk11wgqW1j26=Wn4+{XmnI$G5;-zfoh;i zV*SV@2yHq!>Z%R@MWgMERS5Fomk1B-K-(v<22!w5O z162H?+^j!}SPKS7Kw+n-YC$(N^I16SZ zz(kmJ>WoF6r5-uzit;id_B?3)gak&jrLT29Gj#rS77cq3fe|hhfz}s| zDU=GNtt1<&o1VVLhf#k>L=F9OziG`lALUK08&yHzDy%Sukh_t=vK(N;af(CEu6+AQ+~d z>1m^TiHkBRy5Y@A3>F)V-j_^3jLmIXXx6GN39ybDf2^f+IiM$}#EYXtRNm!w*j!Ax z8CP9U+n(*6T*i1>D407BL`FBd%qyr)3HmBDN7n37@?4pPkt|&M{5&5mEzHwHGpl?E z)Q;-Y2hDRqCl>IsbG?S)JH4G{+&-Cz-Z$R;pn2a;dWF_PL2W#OK>79SWR4)90bCZH zfZF+Qw?t}e?H^4Z`k?*`TFFo|26vi!*A=B};=s_@=gfY&=N4%{4xRNc$%}6ae{qkG zLgKMv=4c2o;t|I`{`ZDxE`Hvu!Xw z>~sYEX%)pgry{U0|JdG9zP+QK=S1kGTLSGuq;aa6eyo0eJDVn`v50tr1uwV3b!lAL zl~C0IY1|!)W~V62M1nrpu4!4OwE^!-e#z!YQT8aY$-=7OwM+9U-K_{Wq>OKL3t|fD zo@rx)+$Vi~%ja#ItJs!WC|ZTT;#v~}9yy(RAVIm3mnIM7k&gk&-NOs7(#@SPe9)AK z;%YB49r0DQs_lgfE`li5zIvm;9gsdL&P{JuVgT!FuweNr6F{JjH%D^a8j?gb`1FyI z>uet32y`CoBJbX19)xj~C8Q1P+2^7U$6zfMrM|L?Xns-sWb}kq30Sw>$^hwu4*SD| zkQ0N=c+ojnLFypZ?uzb}W9Ep3Os=q^_PVb=l_Q3ciw9kYD`K?Orva2J6u5)?6Wb;? z;sBs>Bki}l$g@(tp5M*h7ms%gI_YXZpII$22^A@#$rcXvCjx^|e7{F10x9%5>c*S1 z=P5CN%TT&_1nG$W|EEOVWxve~23*GzDH-qgbOI0?kYdvD399a;f?I%C< z$#^2J<A(>WpL!KkkW92q@*G*#F7$7vF}QK)BufpkE-| z)o9WoAe{cMX6*W!0@Jvx+a*WeGiBP4Jr?!88%n1Am=SAj^{PlUSIu z2Yz+Rsy`>;E+MCAN!$S7^tXu$e?W-W1rIhNA~}F%?{F4Xcyi5c?TPiIcg@hhj@~Ac z3&MWB9n>q}QaX@TdSduVkFuV(kWNaQDZWHApxt#fO~`9O0=DTMlA!chj>%98e*yO? zzFC5@yNq-Mu8sp%kM?;2zZZ5IL2ekJS@8t!heI#mX4TpJG^Ldu?68gqaE4#$V*pdU zn{D+Q1GKLBdi1YfW~&j#N7Eo9I0_FY*=k14kBB0AUW!RsM2L6a*3UAqD=GkoiyZ`V z1^(8KY}|ASK6Gzc99v&LUC!CK$b!UCS1C=I_06+*oIB zvGDsUXg z5lGS62taPz(xGM7a8->rBB{!wI!d8y};qK*9|E@EioSXoD0qMcFF(;jd zxjlAi#{df(bfVN<^;KFPy~ZCd&yt_NRri_%g$4bVl(Ke!lT7e}BRQ%cBfq3$k^vrE z9B785$oTcvi!ia5q;xJ|VQb)Z`o7VkoyZ9aosrrvrD@;u4@JtypQKU7-lDf}?Z*m$?wWYXJ^msD@K$8`=1{0Rs?9vpPp#$!$JCGHldiLxbrh=)qfy8`8k2 zaDbo_=2ktG1_X9h17o6#VPKp_)vM@wmJhG>it|`HgdS)ij?5f2|KyDN$E4(U_dwI0 znJ0K(sLlo^0+=GN!`@v5EN{D68~>CB&s{?K%kyokdJx`hy}lVM?jD`iRXo+aVf3>1 zu%2@AkxJ(t(#N#-{>Rv|=C3-JrMbGS23P*ftGoJPm9y{^+?dfq!oHz+wrKlOTeB3NuSiv7NPg*%y0rOEhJG(Ys37+?2b~RMjzIPmG-Guz znKJjH)mFirfH=zI^-CHS`~zC&>_fl4Hdo|_3QQ)2sM4y0og13oWZ$ToFb?7NOO`K3 zo(ufa!`SV&4Mv2R&gIgT`p2KsZZAIA2c;N!D?YNj*}idJFinigso;Dc+G5|Y-iHDQWC}2|ZSV(SmH^#H^HtUKI=caNp%w?DxWoHK1)`1WEby$n|5#;Oj!;rjmr4O;ft%2F7%>H*q zi`cv!aUvkwS*xQ_Bicm7ZnYb4@N=*Vf%F1aC1=Ej}oN z5HPY8&Q!nq%q6l2&)>Oy6KIG8Ln=K%0@nyTWI)}8bfjN_*9C-M%iQoyx2C|4(DWvX zUR0(RnUiw1IEOTJ`5bxVMpxN_TwpCzjWj1|`ZM_z_bywnBUkYX_;1QA8bSo4GX5)%}j?WFBt{6n=KO9{6|%={(|Oc5hYKuR%QMi62QI{S`=@5aNdM z6~_tO>EXyqz9WNz$y#EA?9C$o!spI-kr9ow&*F);>6G5hAQ)DVKp=Eh1=(aFQT0v% z&akikK&XwCv5wbQ$!16gh>hq{TB`&yAvcqMDyW9}?hB@15>7hcl(rZ26te55eqEsk zZNG*A`i=!bCn;D%dgd=|&}bgF>uL}27NR?kL@tRLE3(8Cq}@Vj9d`!zQIv50u+0XO z$8iC|$z7GSgo}tpo?Vsu@H!Y?mi`KH_sYZ)reHAldi>Ln&^~(GSo@)zf-nkO*&c#= z5XJ@M>W)GY;|s=;be9Iz(p}7p*btqM{u+y z6h7|jdiO|v=syO0;9;9Lw6UG?0Y-4h!+uw@n)RG)2}2fzegr#Vr2^he;sUL7H%kGZ ze~BeGjFC5uCmsc~*cP#b3f&P1#Hk8bHP7ZJ3z~GRkY#p$r zyCS^av+8jy63hNp2t-JU^9PsyJ^S1cDJ>$9E)ygvNQ>|czIJUifV3bD7B~T|#8xNZ zfe#b7r>lK}9RE}f6W2(R0uP=PjWgV8s;W^FZL^x0dIZ0AGC;jb)c`y#%GnUOHz288 zkQahUJoyd`n3}?@A1QG;atfC|-J-(i9|pBUK}sZxj6-M$F@ImtVwIoqQq43^a_*KR zOe!Oxe1LpIxh3OTb_89X$GKiBxzn>;T3`|iKVK+J0GFHjYDN3jzdfdrEDMo}-XOi4_%|e0mCl{+_--p zH+E=sr>u3o^m`^^iM6+}4ti=Tj}pm`13Z=D-7BtDJ2Sz^y?13|+TO520JZxIHyMVY zfBhjb7X2IM6%kP$RBpsSY{>$PS`vr0Zr?#Kiwn${%iE$6LSaV9HyJN(JX>52s>hHv%IH>;gu z#S|TZ%Q?e=^0U=#7$*pj2^vlGfUTx48m+?+W3LTv9}A_#Vp+5Ugy{`uuv}o+_23?f z$0Bd12!>tRcs6WBG!hgr=xf8i!EbQ6IsRUbyCqT}@-D0Dp!``RbL|eq6s29~=^>>z zFqsc_U7}__0P`3uyaEtL9)H=@Y4QDs5iOcv%=A=(YeToK-ewr#A)C5*;Zwi0LPoT4t;N5s$I-1Ts?kbu0)Ydlu)<`$B7g zNytR{*d|S7or-4)ienMj&TLN5FrAaEW)6Wr?Fgyyxqsz9SHY*UlNAAmMMto9Vf^Pb zQO3d0HZ?PK7dIu<)N{qQ2wB$PWrYgZLFBV};0GXHmHEG-yWYzK8Y19?8cor0o1o zAz#=RBZpJ+o9JQV_82?Xcz`gXd}>!YG^%VoVhtBEnk+#{Q`EOAIkC1)4Z`B<^^>l{ zr3JfT9eBt%fJYiSCvU=<%3$~;?^NOuE@|g?-|_i8xZMHuP?}&zeRI#m10HqV<(k0pgPcG?8mHhN$65*- zwC@|`*T6i6)TttF+!AyIPl+wfj~3O@9jHOanCbzf{fdvncvbj*f_FCU(vcK8PtOWm ze^pim7GhO4K!*RzLq_E5g&v_7Rb z53Ic^NAI{itWc}BXRFNnxocBMv$*jPAvTzFFP(gSy1MzD0_k1Wlqz@6;q6qEICOFs=HLi!43gEiu z(%e0Mx1L&V%5?H3Z5AMybdoU6Z2u%p!&aSg90`p63_Tu|QX?TuIWQx}GYpBKdWo(O zpnvgO4d5^q?PGDFoDh78?;%1#4F~5w4!Qylp@q2*=hEOwGI*U`bIcK%RCZaLy=Nbv zc(_96ZF;1jB)X?%P70GV)a#>HTT+)lgddzejpj6#NRhX8rY!NWn3jlRhaLhGfD#%? zmV3BwkA^j^+7c$l55M)Z(e;a0t!=)AJnJP5EL2jUw}^92-97kH?8{kni;kHMU+rTq z`9Y2R=$tg^VaGf!p{28*E7ib4(OQvN9C%f{M+m)&OMTWAYFKu6N$kT*X#Wq;_Poud zmX+Ag`)}VDx4B2ve)htxUxRN8F0}V;%vZY~$Ji4PwNc57bbi>7mpMQ%H|6sH&q9v* zoM~d?D8=;>)iY%kN1;C%sp}{tb);{4mbhw{**hD^Ni}=@SM{WMr1;M?j~kZu0$cHZ zV1^KdO^gCl7I(McmwB58=F#Anf-j8SM3{?1zgljZ5kFe>E%G{eWBhiXqx0S7_IU6k z`ee_>C2{LUU%yh3Y2A{u0|6T;%v+zt2a>D;tl#bKzF^m=*q!3DAZB3Ky51Sce9)3|P_~Z?{>ksyS5nl(&eL;=FPfl|+S-;CRv=ZfqOzhr z6~N>Iq%n-%eHx%ou2@%#o8pH+A#TVJxodpg+AnR?d{dqg zV{Z4pu1Tsd$!k6NJ6>grb+gkNkF$o<{HH)pQJMza$&??*2fFU$Bj5WQVO}MO$q8(n zW&t~9wErme4-o{94{uvcpGqe6Gi*NO_jiAo+ZAz&i}(>x_{_k9TGvA>{Vz_oL`GLJ zdMI|~5@2=c8e$CkjjopxNpX^PTHxsjB9ixJK)EzYzI|N*Sd&v`Sl2^7Ede1`8{8)6Hso)>R}vs}#$D!$9*@o_MqeBV zE#|`!ieP4lBzMJ@3p+OkF>pn=BHLPn^;5Z=Y3?$C89J(uIKU0B$kMs(+6cU`#^h`S zG0&1-db1WxM_=#le~A3i0)!(c08fA>`@+E$WZmm@;A4ASp*{^}6mXhJ2LxShaa~w- zr1fK}cZ)}Q{5HIkocBCo*vdA&!Uzx{iwQH{CD^1d4#k~w6vL~CY=^%~XEVhl^%{=r z2rqYtYQP1x)y>#;Q5~4P7JZW`?uhcC>+^UEM}~(7YJ=fd_yG~{p-&(xvz6*kJj=NL z%7xbC>E{M%dpg~h%?dm3qW?&Pba4_C@1?**2s?u8LZQgHs>{hP#uNg(|2FqO3349q zH*uVL`=ri`!~C|Bu@5&#sU$NZld`ky8@AUJ9kVh9|7pMY$+)YGP0uF+qaQIXCmNM+ zrF`(h1gA9@%A&O?CWpoV36|aO;Ti9zj82tnwsi#0Pe(#o5HqhA8)SfBVIG8q(=~;G z32@3GqUk0L%vXS6Aa6UpSCNHG*6l)^CJ*k^--zqhvd}gK4A&L$yVwu2FJn#)*}@!m)hv_BaYXIwG{~j?<3${fHgH=&e1mcm(poR(gi<- z{7BbT9E_=614H5hjPz1D@LSUqWri(p4bFL)pqksfH;P2U`*V0691t z3}%8r-l?x@^Y|H0QCd^x2lkhnmc#+2&9^Jk9;f$=Yfq46Gl4NjEFP})pE8!lIu=WT zB-qf0jXjXfRb>UcHpal3ikC+i^xLTApKE3(3n7Xqk(DuMeVWL}>7Py^uuSQ4hyq25J;~Kz3^)XLj?0?afHs#j1txac`o(_i1w8G4xs_lCkDWTz3+Csz6SMP}E_-LmAfa(C@!e&axtuJ4EVg z_{PJeo21+?Q#9~-Ou&#c(MT8}DMpAXcK=Z3eCY4;UEv>60cv`@mpyJeor?*(oc*Sd z#WnSjd3%=B^j*gToM^+Bw(p~a3i1%jUAHQdpX(!Mdrr27-Ko+sbKLJ?%XXVSHp&si z5ba#XqPla#-V@d-UemvKp)Z_mx6Cp0rj}55giP10+>?fcI!<~|jrd!nb5>FSdit7R zZIk9(gcnuZADLu5cz%?@n03J9kEkPNw2!b3eqi)dRJ>0nOE);W%n9aG;^<-UWTA!r zI^LjR&3jumhT2}Bm+zM(Ec5$%iZzzB(R%!g<$VC;zQ;lD=?P3*SU%#Rj+%cd%H3&Y zA7G3rS_zRIqGccGPl+BQ4CWnzr)+a*jMN4upwurufX=c?PFa3cX>r5u2;Br`yGZEO z`u(M0#!4rGR>%iZ8VykEu;tYmFq<%z)GeLb{^aA<`43xQvV;}8X1up_&lZgUt&gSj zWll;LlSSU92V}u4t$dTvNQXzI``8$)4cb4atmjwKdE5Gch^iRZJN=2VypEdb$RsA zu}|7|oy<BnIE!`LP zH6HA_=ft^((Ze2dK8%H`8){+BEsq%%m9K_FT7~x*=>6JzR`2|6(w8EST>kO0@i$Zk zLy|uvj+}?(3^14brl(_ny?CKOt;#H|^OfV`;Ie#>elg1)b zxeDr;P{3=E`!!UC+aM0w)iDLl(Y}@#;EF>bqXlfZcZEZ3kM~Co)*gyJfV?(7;-{}ETcxeL<5+ky;FPmNwU<6*}^juZWGa~}zH_^ae z9A-pFyCbT3nRK2=P=u4gRLgPf*rJr96#k3OeEV-gl+4I3x!LREa5fJF0`_%* zNAd1?GNZ}X-X+i%52eO&LVf*(-aEC7XwMU{==@KC22>h_H;(Tq!u=)|1Mg8K_i}vs zIe6tYYc8E{?){sZZlZSJj+O_%G~y|t^Aq&Em4t5+=t*D%#ud2#ag!%y)z@`z1m-|& zYVzwzZthM?P%f&U{G(h%Ob^&S!RugVaMkWg)wKXmVK2m8*f-+R(0z z?gY<=v{N(8t`#d)W-u}-wx zR(?r+Mf5DJZuxWbl^`j@pJm?G&7|mdTcC0wN)Tt zYQFIKjH`poRUj5sxk|S3(Z_o*8uG zgrrGHGt$a1vKnV>JMe0LKCpyWTc=EF<$9YdWm~3{Act20-PZ_#MY1nGj=>bBX4^XxL+*Y?$-=z{0{?e=>*FAP|eo}X~sac#ka^&QX=#TGpqYPAMaOTO(0 zc}lt-8TCoie+Cw;A03X^cc3z!ZZyD)s!P#w&+M)^IH5cS{Uj8ckyF5T*xBej;iFW? zT8srSX;kaw!Oe_m0I_cX@*h+K6!kq_>@b;BaM6M99zzL;(P2@6#V;omrEO@ z@Q>eN5+}z!ckeHJs_QxY6cdSvNixjiQ}->-R5f#{@(wwSE;d&G3z`8^vv4#L_yn$z z3)&pLuIuCZBJ9oTu3s|H)O`00i7b~>-*vlbt|t+ zT_n`AgC@Gi+%AAi15*VYhdlcLb0f_2Jwe)z>gZL80>oV~(>Y6_EMv64Rmn=GKCq@+$6r{u971H{zVqLAY{hFZa` zF%Ud=GzY|uOfvvWfPcM5IScsO$f=&chj|Xv196C^ARmt_x}E{!jreN;vMV@M-IF=e zwXVX;=<||?*TGk?YoiiNJ?nKM_bJ{O=be%hcD_s6rWjHzhS#eV*XdS11+9>IF}xX8 zXJueRD_7JegF7B-#q10KIS|lUKI61qYFXP0v4*2Kgv(azUf;4W#_k=PDm-P1f13}2 zHm%w}HUw}lUD}>VA0G#m@8g^ug3Dny#Cs;e_xVTcn2^*6=gk|xyB-u6Fa1~sxCC65 zL2r_tt&{bCZdm7PP@_%%rq*?^NzN>~KbcvSr>{0^O&MNGd!n*E1l*xc8UUUnZf0vPzfUGu2;KhCpBC)(<4vYbgrr z1c={zEHTn99N{mBD*14nm%8#I5Ui*cv<(xCWDAlSOm70s1Bk8*!W$I8Ip7q-QJ5c# zn*9aVoLEHi*nm`jrRzLS1M}5@>{96l6bxE0BrTsGzyAqv7Cc`%ZuYZLU9HW%jVX%T z&t44hGFIbuQKxK%hm;Vhmk?kHLPA&g$@b{&eenq+ra95VBjLzLCSeHmI?DK*)-a?C zbc8^|+LDwu@7THOLf$L)ECTt~g~Y+5dTXI?Oo10?RM_JY71s6=!}e>sW4@>3sP!7h z04_{$MZZkFe7N{kd1d2jVl`dvQ(GVh)%NxZx=n9VX{>HnNf$k$y+g4;Yc~&)hwJw_ zM-zV|d0#c)(3*KL+B?;O_M83S`$3vr+DL=0&FD2^RA$y^&)l~ZY#y3!_k@n@+x-*c^ zF1(q@kifs>Iy9_~YBNnn)n_w$%;433ZVO>~-5i>y=DM2ghr~R$J=VVk+mBK3#k=bS zZ$n{4jqiZ_t6dz0Ti1er0x{r#yDqtjvWNu$6O7&;m&z3UqVv41oEiB#&F}`i0bs zn1|@98#%#*hu6|42n+g_1P`yyPGq~ltVWmtnkGTTOP!07aSqn9Pfk~kgt3pUf{nU_ zB^ilhAs0oRfzn! z8+Pu%z`otxoqM0?!Pc}_Lmq^%VXhlKTo+sS=^o=jc`?33LMIXMae%!5#!(3>mZFO6 z?`NlCQxVQQ+-s|i`9-Qj5e00t1+RA)@>%Yu30tSDo6LKr^{__d)P!`^6^mX%b`EN{ zep1q9%2*KG3h^7f=I}GcZU9Q{c+&pP0qAb`6i853vj3tV{w<+~fFU!T4^n`)WFbKT z^jop$uOZvsP*8_`2dAIzA5KeQ<}{kn%jS?e2wIfmgwC4FEkMK*J!aTcnq3j#NL1rC zvGMSGC{vgyb@K^|c$LS$-G~P0(e1We&hK+R&038wI+CaJe(7O8daMme1do{o*@D-D zEm^su_xYYk%)x;I)j!iA_$WYMWhW1M5~Fu?5~U+Bpl8D|U;*ZOp|ehc8QCtAO&h31 zKs=Xli7UXkfIneN>>s{XH7G(dAfSwaT4HJa$6CWlZ~_lGJaFW~8gg^WF+iD;zUC&3 zG{1G!igp3eE@Vg!?>FsTw#WtbQqguWO|tZ~@1v|0vq7}i-(nHAGDS5|C$^fbl=>uC zwu`cZY)Cr|XT!|FE{$uSPPJE?j-l@Qt$Q5d9?t$?Hw<0j#h%PWMUl zkCZa49rS_oRSW78=4ZRJN=74-p{9hIuv|KYID-SXa;*>7$X#h zn;yW)CIn>OK0d@y^BRn#zR(kVHo@beg`xyh@R-b*A_mL{0atIv61)T@SRQW>yi0~llz3nA zC=QV=lS1#o&jk~%Mwu(XSjb(Xhy1t+E4xXBZ^!m=ZJWMtzJniVC42NZIOvXNlrAyZwmdp-4 z{C=$aE+3d@uKsrKHEeH=y<&_meF0ty+SLCVuEo=nja-;pO(5*+Uy3s9q*XZ~j)!x5KunGWf>ciY60IjL@b9ZSnB2=0Z?w~t*{SuIfB*;qC(D<0E6e1yWUYP(rkKHzo0o^0 zP%Ql98$a&XeCqPH&ts~ZrbWvC<|u50R!bo)2^sFIvRK21*JMd!!`skom?U%i!MY?# z{W2aA`(g=XPBT~uQ;Cx*MVOSvT~!))=F8j9ERncZZL>hFVx&IVm?HN7RCW*mH4Ga& zRyJDj=38GCJc{`xuu^_U$RF`VJRZ%|htnbC5Zq`^Sg1dVeH$5|SI&&@F}TFLVP)2I zlXLdyUhkhLr<-GPomLc7AC7>S-{R{j-gJjOY;eGi@`x3Uvmx5Oh`?blQzaG^Fe!<| zj;4!4`TLZ}&G7=8U54ynEf*j+8oI9u!}mXaE0^PcmHU!JX5@+2eZkof%&V{iY)0r1U|$fKI=zwQ%14A z?Y|-mvJyU(VS(k#Rn-mRPd>wZ*d8qlvljNaqAP#he@)bZP-6Ti6@4ocpulEyFnzC4 z_XiVP5mjJ9;99c-3wD>o{02gmJx(ACIaD-`od$8TNYT2$sDPNizsRUea(ur$uZjQI zP~c}S7Wk4BHDMip&^YUqj~`?D#R!k{J=B`PuvzaiNdQ9awvE_46A2Xu5&XlIHiIW= z;joTT4a6Z>+3T>TWeGBQem{_=)bfSJ!@7-;8kAaDLU4t;pzV=2ll80L5_z`S9-_mDi)sz7aTyYO(}*=KDqh)9($y3;6Xy4H5b zvpY)iHw0avoepz}jO%5FU9?Rq_9Qo5J=x$c;g2QcC^N?^OnM5!h=baWQ2qt!KAp#lU=0Y{zlyj< zQ#|0JVlhjnQN!kxCi-+^aQFj=02eoJ#0_~U>ohTqyhwR2m0nk}F+!GQvPys|a@$-% zOIzVN{G(n7hI{pxIfg)?-MTp>pw&(tuJc=0B;?(g?6y||@O5g&)>J^D1w;?#x6-)i z`#a9jo3CG!n}tC4v666{5LODCKP#Y$(noDUW?PfLz3PG*ibnv)3xx1m_m71P zLL&^qe9wnN@l0I@^wDTLeM~sO0{CtqtzArk#d{`)r||xZ;B9|qr@uMH2E-=|_li^d6wQv9`=n>2sgu_2v}Nm7mwH5y|Kdh%PuQ6!=d^RtcaG=D>2h zz}`z?%02=8E61LM%|{loLM}eJFzv&-_LU+D%6us}o7}CzxmIjqZr8)NtM!Ey1}Dy1KjA8TQC1iDEQz^iW4M3F z+-vun=PoR5u^83wIv80BRc*V-fSZ}~hVK}g#gsl=x0E*DY1Lqz;>MyQ0C;~ScR53y zT)7nGEMAjSk$LTYz%YjFdT-tI<{=Ul8@LAGioIE z%5WhtJ_qQl9G5vknc>4cWX^fKHxYNjyDJyU+%que6~s_{O=bT6Gl5q2m9jjDQPitj zFt2pYFcrE!YK=USD9A4j!75m$h^Vu-9_X+0wxxg=MRI5yTU4)=K#(sXM=*Jmc7*e{ zR>IybKx^%VMr@>PPaKi_7YF&~T_V*Dpg*VT-LyBthj<`_Ca&C$cnv^#?S59SLhd+BKv)GGFaZNxr89@Wi^6sBRM!DTZS}*?&&0uHB3QScDnF~|6N%UmRY!`3_Bc{btvj}`!~@a-S~DIiI}rG((6 z_MXXG0s#4=2FO_w-r_ZptVqDfZ*Iw#d0@Bu*y>mF!E(}_SHv4cy%yn{VSoi@2~GZF z(Jr{weAo~pVBv)oZ~FdfX&gW$6d`SBIykOF;@hWAi5tHe2m?Bq*JTIgI}NdV9F;!- zGiYi>?-03Nd-fANGTi)zPE-hpZ7ot{3480KbqTbe&>|4eOsy9lvgDZKJUZ;4R{W>( zL$NeOkSZ>LHcA>NX@e~6+VtQA)BiY_DXFkH zdJL9QAjOX*z-*d8K=xrhiOO{_k1DDKMpX)DSv$k5i32};)_4g3G<}MWt>bxu`Mx1K zp6$YeFpFlKOn@WXz$69+HFsL-FGhsF0)x^W!hrXKxl9nbe0>f{C3z};auTLy(pVs3 z&Hd?rfdFuPu(*NUM&+&x%tJB2YAR^0{sAbUyq#3K$E)}v@4|Cw+_f{7SK*=j_uy2c zhpfonFfVv+WU~kJcuoJlFvRTs7QYs#-ZAU`EuzPD$Ej-`#?&~crq1`T7Oyt$K9vW9 zTXap7u{-v#>(E&^F|3k2RKIN!Z=M3R<2u$ZS_|n`4_Xq~{_$YQ5D$#q1FZBDb}$6Y zdwFm#jzQ$Wj;@w#hZU9_&HQ^<&%AxV17$LCXpYhCrt6OOW$LE57VQCAJ5Iw zbLU%qZ47S}+uwBEn0%UoFml8SKD9b>&FYsE3$HBJe=9~kC=l>apIwHA)gclUaOkOgWJv9JC;MHW1G0d0JoR9nXWk;9R zX#Xn3eR*T_Jg{B8w6^?sPUbl9fe~}BYeMf%fqQD4WrdQjuIW=Hl*@K}fJb$w^?bzB zabUHtDzDs4mkbJHRG6le1}tnj_b#~a_T z8gl5yUbcZX+C@Ez0XS|2j-{9@erOyzEVTU$qU%Vlx}!q2LNm9LJ=g;J{P7tYmq- zASHaN0{Q5r0wPCp`7d)z7ck*Bv@Y3IyRcJo&447l{uqZ?2Nh^0CT z;H>tcjICa#qJBvJ;!7WLYV#^UpXwz7D~+qmlB6)R7FB)vvi6tYEp;OF6^c-8q#dVIA1+eBLTB zobvgE9B9_ET~W$#(~{+;-W$pgn*IPzBRn{xo!QyWPR1-BQxg76qr!Ts{mV$f+Hew< z>ZH+3Rs^r2S+A<1xsVCd7bh>L46IoE+|vuSEK98CMf(BcH_Rmgv+Q7El_02OjXuGW z47i!Ch=OYpQ8U}L2iKVUbZlQ&r4wT+q|(p!1pTLOg{fU2$=dZ8k8(>V63q4D6Exn% zxjij4lKD5n8AX5k^h^5A#kgsqIX3E*f~%f!T6htuDU(kXd%2&bLt+vom6Z{C~7$rg+y$jMK5(WiWlA?3UZ> z!2DiN$mZ1jbD;mVD0AmrdWNLmfWr)xD&IwA9cu!4;|<{QWbq4ce{?OR0GiOA5Kyk=Ki(k&7b05pLPlpPyQ~8UuSgYriCb1TF9roEK(PnWV9TV zSMOePear1)IJ6~JYxTKz{?Zbd@JW@NHa^#VMF5^>^k~$#4jGtnWmq2U4Ko$n(4*ew zK7lM8MNWQF&|f<9*$ETSDnkA8c!hl>qi^-rx}M+&$>H49=!qb&=9Y)Fw8hnZYaueKPkC=14t3jxkKZ!}Bm0s)TeeD}vPF!LsAv@lBSImhP_{vZ z5Gf*sHf<_9Ax1=nXtQt8LuDH&+hD%eXY_3E`+mR2@%#IC9M5w+&mZ-fna_RS*L_{* zd0yuwGHDxQrDq*{DivWG5WcEhs(2+gW&fa$!B*%(&|;8II9&YM`E4r09rbiB+QzLk z0G|7ZB>U7QIPsgjT)v9@IvofU2S###WVh+)o>U?JoEE2+p|P`zhe0wn)VRcSwA8%w z6Ra!!lwWSs9)oUqT8h$D=s6Jq%GqJJ=i4R~DWR(0BI+`dR4?lXQsm6hww6V+oUAZQ zLuoqLnFEgU^I1+jgtD`K*D>R)pL>42&0)+@`&j+%ORGR)0Cl4?C?dvLMGJ1QrY2G} zu5Dx#C(w@PF*&~_{l~H{PVycB_%qs+6Bf2KaiefK0$i=MyK-)h3&^%g-W z0KtkY#`U3q)zFdl)#9xy3c2W#8!Ya%s`)A_DB+36Zp%?6$5?56_-tC<^M*iN3#OO6 z+m*|Q3m?tG3hl&^tPXi=;5W&<9}FXYiLXpLy!2r&g7A85)rbAAygi)ou5~s3PA)ET zHSdV(e4sq`VHsDl->Fno#$@$O$@TP?sOoajcX)=cQfD7dOiI)(p;A}8kI^_=NJ4V zhtQLNVGM5)Hu)_8MNcj5Qb^I8Ow;Cya#e~}s8e%YI@qSv z!2}$e?bz899bj*ZMlfcmQ+m0qOd`p_;$6^ai{(x4^#_<~Z%VKk^{l76Ecwc8H>Y=L zd*y+*C!XPqf1Y{`$%>yX25oGvZ;9mnJN1QbDH@0i4;!PF#$M5umT&6X zdtRm1;cVwA^Oq+k!=PJIlV7GeW5bBMuh-2X-IBdQ?T&Xog0hKgym2?(mk(wmb2GEy z?qwqA`0dk?UC7%)+ROB{95OT`K`WXJAht}VXv#g7uLSr>`%hQHPfu#G1&@GJrAnqe zSxan9JbfrF>nVt&JTr`6XRLp=b*~gn_}VqQO9kC44S+KGM{-=3dtQ+DK!C_2qlp}_ zxk`l{TBLq)_T>^Z%0%WPL_=_h_Pu5gULUNcuE>Cgv;fY!4sSazd95AELd&fI(BGH3 zsuug7e91;xCpZ7q5Cs$UBH8VW>XkW4A{1XT)^7a6h`!yVZk+Yi11EEvLGUOZ5D&cojVjVnSXY}o1`Nu&9Rod)F zFK2Td>r}4{EKPl7%gqqA9q$3PJ=}9>n;B(!4~F5JTC)U*2uz3lTlVxvO7Dx&#HE~> zx!dLUWFgdiZ_2Eyd{!btf9lROJ~kR9p-Z5t{$C;-A2jH+H-6LfQS7A?AF(;VVW zPO@BZRp)5cyX2Rh;7NF2S0TtL94c+Vu3ySKKcmt2@}jZQ;O!UM%5100jYPUqIXj8JZjluTY<703|>ihFO zl~{iP`J;Ik`Zy=hyC8;3c0Wf3MeZJpG69de*t^8OF5)c`KZ1z|E=s_R7yev{W17;( zDi;$nIZq$U5XwHH~fBSzK7_EC@?hOfQb7cwS;TC1(#qSe0h(4&;Xq)d4dctvzp=N0My za6InLWm&KR{n(P;p>*ymM-H9J#r#bgLzeKQ%H=P*kwQ^i35ouSQwo}1{{Gapy=gU0**0(-<$KsS4N z5==l9s!TANp9`qK>7PbjT3`zUEnCx7{Gz`)#dn(j_%_wlszvR5v{lG0kA*AgOktxd zq@Cx3UVT(e2G6;)J+Ykz)ypcY*j(KR8oN6o54n79XmOJkQ`3CiPr)r3jm7Ik7ugQZ zZ}nA0@uvMUtR_w_M`-S&{_l&bVkN$$GVcZSGHSERo}Vf75n1dGeRJvB5YWTz z56<|buJ+Q#gk2un#y^Oz zv#E`Uf3=c$KX!oHnE$KH4HA_UqmOlWM@t>!T&khLp_2Fg+;fjLzYLRoS|?SkD9 z(DZg4=wDs2;ia>k_A((HYQ92C$Bb{xP+0bhI~}tV%p&GAzL+zpxA9 zh9>1yMyv~qb3pRPeB6(0iMKu_pB*e0!T~0TjfHV3(EHbhxrS9}dPXCg(W0pD16zi) zK#HAIxb+TE<~y|i!3N&G-QcWEGD107Q_HZmHzg=c-booV6{==kbC&|=oWl@1+gGBY~Vxi)2Bl*MUSsE z{-J+x`FegNTeP%RLq(!hFL#rRBtR3RCz08As+MXPkt+RO#S(e9WlbFk!}1U2T7|cq z$esbH#osE*Zyp%$vR)j*GmRrLr*m|-$Fub9!BGG3U_VN|5K)*FlNXt`OtwJ1;T!e6 zB-TK$gp^;!;G;h+KUBZTRS6%^X>kslB4Y=#Nl9lG6%$O_PCX7R1~|wHq-eV-C;zbw zk=}mP--~5>*fO2W!wD-uoE6%#CIs65zC}ROZPj>$Q4-bxHWsmxe0ppAJZ(H*W2*Rp zu0;{!kkRE;-uR{;xTFBW)FoJhp>lTUf3lJIJ(mf#+}~l%a}Db z-O1wCsPLxB+%8Vk_EgMf$`QxT{W8Y`cG0%c+h81KeiBaPfoB~2IP^AGW(Bq)bomKi z7`%rLfpb{XeR64!IGwYtqhv>z;Kp|RlRJH{cnbx;ZZW3pmL8PFUw4YoxF!_hf2*?W zPScsan~vHZ#ie<6@iV<|nZ|M;xB1hRujU%JT0hIXQnmA|5nA;i*hF?pu0A{DU0ubb zK+ccW17P65D!Zyz9*8o~JM4PHrW|m>PdRJ&+0W5+Pdxg>DF%4&y!OQ#=9(l5oZpuh zm<=W8f(^R9E$Cbm3@(1>z>?{pWqpLjS;F5~j+C?Hi0|I8)MC#G5-hlaGyPIh#niP9=_0f$|g_Rn~k)eD5QAIXg8!u(Nb5Dgo8MdWnE(>ne zYOp+8it=zq7zO8w&%n6)tvgytnB}hdMP+;{n;euHE4uAMK zSXO!YalMkg){=THPWKkfk0@hCTK9h+-HD2el31Y$t~vepmm!rKLR{F5zmya9^5eQ3 z{`gY$K@H-q(Ah1)^nItHB?N-e6AzT^dd2X8bhN31nW3~2jEtu`o1A&ZT!EKUXORM&v?k03Uxd9g@X!oi}jP6Uvp z*xueQfcenm7&@KwgP?Ryf_B6=jxjL>=W@u!7Im(8XS2YtI~fkF2!`b*p_ag}yjVzidRL zqW$C^H7VYMmqx$Klup!Z)4pMaPZ<*mp!O6uNg)S=WX8NGU;@C<8ettE>Kq_Pp&!{t zc-5@+T@E`Z|If}306Z}$px&?=n*l+62PA_a_`K$c#Qo#p# ztiluHSp9!Ab+j(YfH4oifGcyL;r<6ju+##NRrV?-`Yp$APD)gNW`XG*_4=`YWZvWj zRZ-u!JLFebzS1>6OOg((4#bU_UO+10%|kaXhqm|=VG;t&4A_DVmcWJtQVRLhn6s6Z zY?uJ3p~x}M0#>JOxTl`2UYY_Ujm}$KI4ld(fCg0w!!JL|V-A&=u8v1P6a{G{Of|K& zs$BMg@||+G7X(Iy0ZV`nWTNE#0tpbBnYvD4Or);qVk^KG{VQk?n!DVfn7wy7T=u}P zyE#4cFSkh3SK|ZJi=cO4>KFL%27Lb8gBlZ>{|Q&#{TYZOz#NDzGI-;w1o@6a5OHBT zCAE>2tCwDY-lp8PqC$+Y+6uP&a+EsjnT6_a&?&Uv+o_%ng6Kld9T@#YIsZ5G&MdiI zpsh83MJ(l&XCidE%*gai>2!nn!7tt$FkJ>V;g<)&d%pC{L(qXlFk13X6w)Ew>@^^) zlR6hF?-ZI3_F+q2yP)U?U`%Cndm9*q9R{9AZ%JT)iOn%+(x;iU3TcaOT6F2^CjzC0dYh_yNeiJ)l)(RaOf>Ya7Ib;mF-fe%S?-4J>SSGqtx?yHkmLUMpAh)drG&-Z`!n{@cC zeC@*w;p1+~lh#UsFbYbm1ZgR3+St-fI|?iqe0Q5vPcxEy%cNL>L1zvCX?DsR;45nu~`(t@_5V&N)c|8Z(5vpD|j{dGc!HVa3cEkEFz$rtbpZHfP_<^ zHDm**pJg8WY2*x_VJ`$7>)4^i?k5G10poHro)KwBU^2?CHqrbk4O>l$`D1$+wvgcP zKzi~|yRKbc$*^9c&^D7J)mbI9sS=!*o3s-`0H}2sbLQnyS{(TmM2+Imd2A zO-CQUsu>_6FV+d`q=yAshFMA@gA%T6Ij-5cnLnzt#zL=Hbt;g9BRz8BG^$k!Oy-|$ zbCdqC;S4st=fO+Nn7ipcS#o`&?8AZgw^da#I8{5BLBpL->ws=B%oX=(>KKGc3(JSy zmL@G+&jBq3eN*qIflxfHverg?8W$&RdB;FP*%|`xTDFK3(Ug}(kIsFKQ5lGdUb+V# zZMGUa?yxx*`ntw$L)ZAtf+*)<_p2N^9Sc=bns76n)xeVR`Ud@i#uzM#WrF5d5-V?@ z_ZuG-44n(mg(afg82^3q*<$S`ALA=K7gxSuO!rDMy1!?b1<$2pricmI@zt_W`M|hL z;eZwRgH>BHQBT*|FGAN1~O*{#*f{;-yAkB18?on4KVR+3rSuj*iY!H4xIhnaPmyR1CA_o_jH#z z;nlISy5l)~WJj%}SavBR18E zY^cDBXas#H%uG{3#$M|$w+RT|Y(yBo`ln$un0cje<_jT8xNfxGZ}8%0u9652+6aPr zHqE-O<8~Z%XAZ+7v#kyW^rerfE@xv3lVSGAIgmZZkCK<&=oRIW1}*64X?%kfa~Xd8 zRrBkAc#dw$k>H$>;c>x{YD{-w6(+5Dsln*)xdkbT8~GRUYbmZt^OGc&NcU6t^|%J zc>S?Z9xQ8c{~ zE;Jkc^!-wIJrARRPk?BeDPx5H|LmurwvHpJ$QBgt4f_bz)@D>-ATqlw4qJ|1hDmzn z&dL~)ToFPD5)SAz@Uz>{H=lBm_(4^b~j~gqPSfq-Z_#Ae16r>`e7&u;Mou!*l z3pQHI8vLBFi63;X7O@I&7WBT-Vzz{2V6d+K)Mh1t_uwCw0i1B) zh)m7ZpxH$Gv-5Cyak_H+GHreUtijYZK#(3TjYfEZjS*Weu`9OS+e&nWBNipx)3@m= z_A5l+?-kds)1-%*(dQZk$-hv*ALk0dcc;PhoDX#-``PP&LVCpJejoF%Fu3KX%(@${ z9~yX9F*^g}F2+E)J69sltRKEdsEm%C7FOvsGV~MOP|N+~`+3&;LwdN$c?BHzB|_G!Iw)F}U&7 zlU*bEPj}kNk*vzr-kM8s3Ms?)ZK7o0N{SXHOS%VXpU>2db0SxyPw-}sQ_eh(wdgDe zOgTQRc)WOQQrbO4pTdx)_L>Fp`6|V&S67SiJiz%*)A`V$4;Wf}CRFw-1`x+e?^UEg zY=gA=dp?T;FnnvJptt(#<=xWjf5si-(wi?HVNvZ=sH}vPI=1fnwaumr}uleEZF5dLr;u`z;Hz>wk2{%@}WoFya@nI{;Nc>Ei zqL0z8%^HSrD>@^2hjgaXhssCt9a?&ZE1PT#jygBp7}9qiEu7YI9cSdXoH>r5JKww^ zkex1TQWae56*68EIP&Gd@t&a_g3`I2Qv4@t1kcBr3Q2&rdaOEwb8bdZPtu5N&mKFm zfuAgvd|F~QS5a2RTcyJ{?-+C`^k@Nw2%b3V{4!ln2yuya@*Qg@gLK*Z9MN=^&2alE zdN95(u-S#x`8LdezJhXID^h$DMlUVcSc`D4ma^r|RTrwD!)q7eJ>wu-&U3aE?=&w? zxn=7mJ)x~|G5$!;)(~YdAqyb9y)<=QJ0p#CP=W5->C~Hf?&|0c-(AjKg010$`fFc3 z>C3+}6X5Uar*U|Nr5}~DnD9b%PWXmug-^STUh=}J%UITt$ebZm(!-d0JQJas~T{>><1@~HF)jO?WB3^ z$nSXJlB;fs_0j8x%aPux3kG3?k-UDd;z&9R?dzgtvQbH0B(MMN<<(h){P<8Ff3vp2>`_JdyT59W^ffDkxlQPFE zVcua(<%$2n%UfWMzwme|)HcddHNk;hI6sZL#f&TE=sk8 z!Zkv;DR!Svjmy<N9i%lBO z7q$e^4skwa^t*eE7f*HY6qS{?j0@zQW}$vs2(_Ft(2Xp5O0{!4$2R_Sxrbk1S!9Ux z?d5AM&OdE3>_1e=McvL5BJgZV0)@`ltu(MFo!54@Yuzar`bY0nROU*tcRc~d`Dz-U zEK=sfI}P`fAlR+(C+K`D(W1P@l)m6qarD3 zq(%R)LNd?M+?9(R^4i7>6z-Qj}}edB4vYU}1ZOwf;QI z<6X2(NXy8R#~i=z?0kig?JABwAn!HPx4U_5x-}7yazM98s^QObAX6@EJct=vpvtlXRZpI=o89Q)qtARwdoH<2WNn*_wTM4uAcn-i$kgO>^8RFo*YZ z`mQu;7|~mDk}eR{bSj*f;NCa^Lh|qT#BS~jw4RFcN*WNS2F>_F{ToK4j;TUgf;GW2 zr}S<0QRgQmJ&r*gTPT-zH2J^~@B5=1W#aAVWvgfvyHs>L>d}}rO4~^{Ta1fxFu-{$ zycuiP5dWiCh)a&Nu7s7slb897+!jDE0tSwC@^cderRetp!H!ticM`-QLEIo2PE3&w zuMnq_v zxfjpZzI%5B+dkisrY*6LR(*!mnd&G$j=_AdcO5#B)UF)i(2mNaFw~kQwK9&l_))7ZKUsNPGNcKq+S-HM?A1F z8`7vfVsG+Asn_j8kF@u5vg1X|=B#1fXW=W38`skBvzNK!g;0hMl^)#_L_2#r0-s-6&2mXcUuOM&@CIeyUg)#ML)jDrPm)4 z2fNTU9NyI%U2i8MPigtwC8l%6GUL{91)LlqJ{6oHOIsfeZpU8~^k{OG+M%Z2^T@t3 zWhRI-YI1k^-CVo#!F31C@!ti}CZcedYDd~dH%&Qwj@05IEQ)by7JRH2V=lEjqCX_D z?`ZwHjj$^v-(!L(83T9js0eU&%htnt2cx-8ztv2reI0+Fa1a=3TM(ii+ZpgIoJ;Q( zJbR~0skUpwThpUfJaxXMjTLY@sCwa6fdh(f#oBc+BCwT7`#vm4k#`IC3EO(8t)=IRLKT*Pu zcuJeL#U2kRE*@4rc=AhV#odh)x>XGac=MuALtw4KcVUFqa46%j`$Q4%{K6bxLynVP z0^q31>)auUe+WsuG5Rj_Ye!)HVJB!8ZeGo??U0jC>4o1(sYGkTM6yCETQs6RsCgtXitkRA>?DONh3VZ*v5z?YA?zKuba)2ViIi zDEPv!?IlsRP&r}HZCWuR`*8E!>m>jswhJdN8h zv5~^qaAxJ`y=O`=dFb_`N=?bP=h-ebgZF6H?l>HH9?(o*_W4xv^P7Cx6Yi+==`x|X zz5R#s8alt)Ki=rt-p{WlbzUd+*Ujc~=Q!L%MOD4udAk3!pGmDAf9PWkX^#VL3#Qq* z!`pOf#=NDtE%ZjEMj18hXOEu#D0$DIcdVz-M^|K;2T>x!N5`g~tQpg-8FvyJU$9{X z%lRL{j$h)wZbm&D=Z)33N_ASd@hRXlVo%~BtNKkzu*W`I!&0LA{v+#%clRVq{70A5 z`Q41$L)t2XL+@PFx>)FF)w(~6b7L{$Gv4_odgG3?DjB_f3#;os zMaiq2fe~RivHAHq&6WI_bVo<&xxtsj>nlgyUmvZc z{<>mE_!{fh=0IX*49hTqkgX{pfNKIzRi{K~jOPT(zGv(6v9=Jx-MS5>g`%APf^ zPupWN!Yg!y7roPQy10mLZ9XB&seXLdMBACDxSOzC@xiK6KP$EbtROyRt)0=JYR=*1 zWB)%T)ioc+;s}C~8Q;g>j##u=yavhDe!k6h(Gxs5rv<6QYLlNrtNb{oBs-e;MXumc zf+0c1nyCNRokf--DY7kjx41yV>_F>-A1cn#AIyy@EDkN0)CUgB6JlQh)Y6zFYs2W; zn7Gp~{J#fG^9$jGN7AX6?8mDns(J?vXxc$H461sq_?U^d@W=(JMaxlv>kR8@=K}a# zSvTXfCIwNEdO0bPgV<#`&ymA9*Jc?cSH<&JkJ=7G3K++~O6JC_XD#?McWII|Urlo# zgqyO3+2~=bHpc1qRI&Wm#8;)~8odqAYcpt1R~x^O9D2=G63!LLU`Zp;c}9m`@g2iu zRvS~^$b_V9ufjg+d}H?IDwl+g*3AvW6!nlaY&zRFaX@q+C(KDiI&=ZPafxjCOqH{8 zq>r+JP3PJ}bp&yF_ZXIjGWhGLgq<4v>g3FLX909JJmf=g%Yl5tSGPW*~#Kb{*iskY4{4E5oBvDv%Y!a+D&zzM45ODA8*@ zosTRWFm^e?qFz`BK-Bm(V7Q^!9 zE)c}UKLnw}%Zl4yPMr!gw6!@ZqwTNz)u3@R{|bLI;lqbUOU|6E78EnB(pdG~pJ!9u zwR{G&51KaAabdf*yE?#sP9zwn1gTwxG{Eo>TWi)euy46&NaI^ zy9FXfVDdG{LcUZ21OR69A*TxDx`u{;d+ms+-bUxK~Lu@bfv@R%N` zOT5;4Nx{NOAfb-k3>04lKFI{P4!B90pm{d^n~uFlgRugx%J+uU^rPK=_atyqfsCoo z_DX?s3?Zq3QE|bF=J9YKHj*l15e+005yiT_Q)gjrX zHFUm;*8qjb6T?v*pPn+#Xw=b;4lcnysU^Z2rr>eeLt`XMWpYk$YG+;Hrk)St2y#sT`P_9B@(L1DmyRRMRq zB-;#zAPe9igUi%cu>lt6oH_o<){arFdEFQDFvP&^1H<3YFTd~TG}~O`{EOB(JATcV zj&zz~_$RPYKmT#qT-dNM@(7lk9kaXqGxs-^0A7V9dAO9p24l(w>4KpnzZ7uSp!L=k zJ|NYE60x3w%0$jELM1&4|4^Z4`gbSBpn-JOMfJ+S8J5R^s|G4op4&-8E0Vc)iAeyc z4bf6mGv6Xxo+MN|1K(02%l)K0-lIU3G!&_5K`*>YNC*wc`ILy(u8%=`9ljMiPnS$H zL5;%R(@6CYag+$gZ9Rgd{F*+Gs0D`1DOe1aG1goqsI)y-r>lmj8=PqWMCO*G z4g%f#$Ua~GlT`9+jG<;`;DFXdRf!vH<)^HbpoHx{^yhU9>$`;_2-wJ0+9CSO;36(^ z)!4hmN_9NdqXjBuUcFnRRw<*k$zh^zMmu=i-mMkRebyN^5ItrXv8>f&C}(Bu{)_IE zucay_ivI=#99YPve$v8F-OZ#7j!;GJ>In9-oFv35rSak#o^Zyy9=8IXaU94M*V0gb zuNz4mz2649KZ{HcqaFdbY0GeRSK`QRx)`94HWd~^8eD2OX9 zZU#%qlLjAQAQW}N&0+i7Q@i`b5`*mo#w7}jF@K~Thd8fI-y}oocK4`0o)r6>|odcNKh2^6n-Xo7dj)D;>3j2zznwVQ&gFA?0u1)aH z>vL3QU00ikb_-y2B_swEUL1I!^Vk=`6#^8^q)*22H$yp{V8ebOvXpWcE+{{CKc{H^ zH5Toin|bE$nrCIc zPJWrPV2;jI7=AXOD2NO9D1$kaZ?yy+Jd3G^E5mF$hNp!2Rt)>PZ71G3O3^Z1=(lO` zGH%;vW9vcZ5m7`x`5e@eRPdzG5B!Z=p~V1hE@lilpZsSM#67d`G$<3GY?humw zYY1IOL%FfIwFHhaQ{BK#V~!7I*P4boRfs#@ZfXqCBoTOTuU#4S+3;-qbZmFS0pgik z3iyw-wKzqz15(N(m^|pk(v7?}2JYd^@Fc>H4a_4F=6h$e(%T^yS$?pEB*pBEg8H#= zyIQ#zU1}d2-%%~S1xCUY-wFo-Zyu_~*{dvFoPA+qs+W9&R-StND4DOz*S3Qp^~9LsxbC5a_18ZE*D6)b8vD(5>^qY~mExr2)>mv7)$-6x};pAUKO zT+ajxu)`yWd+~KW&hK96J5aoS?b(uciP*fb>jUseb+?1p>a?1Kxo(>}WmfLh%%;1~X)!gPt|6#iXG)u&GZK;Vop1hPxn?;ohvm}& z)`J`rrG5om5~;wdnkl_qIy`mvUO$j2V7aJ~sK{O*^PE47LFqJ+ zS;Ij*tmL~(x*^|qF0^hfVx0N;VFn=OhPLO?Rs|_p?}sGzLW?27K|hdu3_1E3Z@rZI zlM~D+0ZFjIKezx0kTNlRd>kLHrxFvuq4l~PDeT!hVO+sEq?9^Hek4btjMm8y^qd@D zRj)w4^++EOH$lJg$+?#`Lus`EHd8AU5kam3c;qluE{S;M-_VPjSC+7tN7nt|?&@-| zYpDC7Hdd|pU)TKav+|ES9#_=Kg>3jqs~0KE3D;(x zR-FVO&CBLDkQP`&SO2Now_DC62_cC=Gh@Sj_Z~AoSTZ&Mc!0)?>4hN!wdW$9TU1&1 zMlO6dcyqk}pk>sgEiNeZ`X?(w+piTV0cInCWv_If#&3M)wJ?sOWi@D)^Kr|+9{j*Q z8fUtZc`s~crU=qC;XMw-xfDl?9r^5-9UgF9ptf$KD|?0VTbtw*NPq+FuTOC{?3|hq zWL{9$BIE|rX*bk*hLE1d+|ff_<2A7r49GjPU5-ym{s8(y)_dRXjd3 zVym?1sWg5m2@xG(UmJpA=-e;XS7(<>qTdDMk*}O;Ka4Iwnc)I_Ot!Td$;M@*=f%G6 zkbo{rwY@B=dOd;#TdJqY4^`2wTdGurhNu;0err@Xl)GVO4>H6SeVCK){4Z8*=XyCR z+Z-MR!tlG7Eh6M=@1CF82|9@z#LRY)%t={^FLKmd3t0O6K6E`lxzsnb?RiW4ylQpN zPXUT0P$)G0+)_LBa7=@ z&;4)CCh?n2#eRM=xwHFOuj<%=U{B8X!A2y1Wdog=1F5`v7D%t4*r)eZEgmrIj@AE{D0zVQ-6NUOlaV*zTWWU9nd1b?EBT(8Us^-xSJjydz`=iv#wcrS;WtGBQaM8 z#ukfm z3Xlh8OSU2a+0VClH5?FjP*Dy)68o!hA!9qeQW~fIg2&X&d!ysD@LQf)tsf;<)PNzB zB;!dg*gD5Yo}SLT=7=S8{{hQ^)b7;@OLOR*Nhw}R?5g0!`t~=lDXXcr=i|0bb3+Ap z#97GJA0y~|*A^^tKF$?9d6XVlS=j1#1;Y7>RcUvuc`5j)mV}XAjo%*?`PDKLJJMtK zME$Af)*rpOqk1!75R=1IZtB^;k4vLX(J4tl0Nszagxqx9)-n+|^Axj{5gP=iAdPkd z>cwy$)lGvvryentP)%B+fe#3ZNXYnPRf4C!-M+w^9>xUnX82K+INtw_O$*^`Fed3Y zH2sn?U(K=vO$$!ki}yEuEQfN;pp9c42RybGKpNVAkTnUi5)}R-4~mK$by*&6YY4O8 z5X4#3zD_(#%)~(BtL5 zaDl-8$P!YBnQvN5kf$uwENiGFnYioY)LFYY4@$p#Y#$3RIIPtXkV1_J*SkUAXmM4c zDNJ?4gkLN%PbG{B!P+EJh-&OcW)wKfla7gnKUo39uyz2F_Le;Pb}(p`SHpQ+4>beZ zMD-y6ih3ov(rlDkM3@DM1JZ&D{^54~>JiS&RPF?3E?d+APD<6^%+2u|w*lN;V9RM! z$(Hj>RQgT#5i`q@qcQ=Z-8Zi-SKc(1`2R$GDW^jBlbM*W^19!3xns&@8|h_@+gn5d z=YkBr1Ty#o&JBVStp_Ko{LZz6PG}TO+Xi~FWAD+EqaMi^>Ir6^|HS^p@@zPh_4p}B zUc;eX4JZ>-CI8KMBuoo}m*WXSe7iaR);nbma>>}@AmeeD^tLFvo zHYW3zkwho~;?Go$x|NPU8RFJo;1Fnr0A@;4=4j5*tyToT;LDg_Fg^v5qM}jK=Lxl^ zejb~bR-*C6%V-CZd1;Pc z9f2V^ASr+_|2K(E7Wz|3K$gS2q_UnL$yFCT!r}&`xq}lyIsjsQ3?YIoJoPB+CO$xb^hy`3upDzhxkOQSL&1df$qWpn#!}2va@4V(s&i3ws~p#*K6w{W zBJX!zc=EsNAy`}Hd8g|#axX)bG@F_V0Zno^H}L0V)qO4gF4%4IDH;mdY|IHR;=E22+~PyJg7{% zA0-W{*y`bHtJRe9^@Xlo%~prq4@s_k;&NMm*j0Mh+1i0=d)aDjNl-pkZ2D0$zviH}31y5`d`f|q60_EY1>&W%9NOZ+S^NBJ3Wq)|s;I2m z;d=D!D6%hPOxC8S!qn}nNblW9KC2&9F|E?gM#83Db0M|3|(3W-gh zg)Y-EzSzJCbuDv0{v*>0NT0XwWwbhDpQPymvyV#b(Dke~Q zq{{4iWki0v%rVx11?jGn1za&pY&JK`gF@AL&xF>1WDPwYI3iJ$%z=4CMZ4d;w((Te zkjsQd7Kk_9rk~#0$*{B=R`sG>9jADG3!z0WE)S7-tW49UjGNl-k-2aL?c?dZw^6~d zjf-u7zjt+=24z-|3~~|anus0;Z;Xggk47tYG>K*D=+chtOhu&TzZ4Aq8y%k9YSI$W2|+yjrI&eua@bt`n%qm~~Ulw#ZrONWJ9Gij#c4NZRftVjGv z9Zw81iLa?$lJYL85$ri%sMS6N8Oauqat%0L11Z;)!5u-o&HQTV9{L0|_e!jWnt9E< z6T2&8Vgq0J&jt9y$fK_*f$sKeS~&eG#r8&q%IFNTlu2(7EIxe{l%}mc)q29C)4-R6n zCrWxSQB8XB5C}t(#9m!7b97uJw2m;v&hTQT$@KFqu5bwR zyOoaf-rSvE`mH6k?MHjq@kyO?GbP*K>5N4AL@cY*AbD^}O(dSxpNbg1-0kpgc;8G< z%^BXKXynycb^ox6W6%!wMGR%DFS^K5TkXBJ5%yeDLiX_cf0Cca|FPLyJzdH|rKpuR z*7IXuZanUEC!ex8_PaanYKzf~Ndf!RmFm#Cal4m#K(G)(!kZi)%U}7_F`we=SEntbO8#H)%cL^WmqsO@6!8QN8}zL)G8H z7WlwzN#xs>%JCVkERKe9JAvA*bWP?$gAiPRT3d#h*#A+v&RD{Nr zsOt(0cH3awADqKs&KxcvW0*pXbHO-JXe^a6wxgVYRHt%`bJ9dm5Z5Ssjaek)?eUrv zi4hw4p{K(IPSj|k$J1B0y>kUk92s!;aiCCk>iCCKrXm=H_c!weL?@iZ)lt2dvsEc2 z(l+@)?$5Tk|~cP7v{Q01fVmjp0GuLcmkkEH-gdnw>R4A^9j?^0`Q4^wqt&5j+<_aUpL z7C+p(j}Zb^0^V<$XZ0ReR4zchmp;!fSebE?Kr%sy(tV_yo60*_kU{lDi$Wbw z6|Q_4#|0$O0x#s}C_lNm|IK_03Av(%Y8e-Oj(6$ ztYjT)fy2Owt)CkUN%NuHqi5b2NyG!NZ&YCgO3()(UWem)NknCTuM@K?&C)AS&ve$d zt%{(E z!vtG?rhYbVuLrHmwQ_5pD&em@*LpU8 zX{)A$%=A7B7(oV@;`mP7Ks(+0jMsazCXeIf4~v3nB^|m`2n+Q9>vNq9BJB*4{#hg) z;u*BOLtE#a01oc~sitn?6Rwd8+~_H-_~zhMPT2-LeeR|PqqCcHz=g{a1(@hxRUE}X ze%g!rY%;H-%qa~D?8TU(#l_QWr6u*aXRAZ^t9^1$zSA*xI(`PrjvIdUVHn_7PU;wj zpwHm}6Z!=rL7+rNOod@z#s+glK}9izDL~bWT0}DQy9acH=H{MrlubK^&ZtITLkKo} zkdV$^+kx3TMJ!y-N4xfM0QyJPlR6LV2>Pv7`6tOo2InLdITCz69CI~B}kmVt7uSE2P<0>_y8_=V@;TmqnMhff=P;|@^oRS z(MMLwpj<_4(JX%Nn}vG?E67Y4#Q!ApObFJ7niQre7|6V4=mdq^kKd#C2S$)fZ%Iqe zNNZx5;XzGD8*@vSUKty;*zhLX;q#Vmx>OJg+~;C8r2J21f~&q;Q~met_>Iu(R|NjK z1#|e5MKM0s0<@!up`ZWK6*s>eWqb?CRId}lLx-)%ggOe9n49*K89yMuKMo$A@LL{? zmCaTHGRvIiv*oGWA2i4TRt4Y)I4ybrK>Aew*NYtW0d z*0(PnN8=gvy2OFIK;vgViwfoFlQj_u31rk+L-O;#i%RMo9u(KGGczN8u`0({nNjvQ zP`2OjGz{UR20Hhym)f-S?f5)1H|AI}Sb)}kvqZi!GxCfX0@|5uRXLiWi&EzDs2t`))cF`xkh@XwoE#~$+ZE04EO1!6 zjlB#ul>r;{$Ion$4NS%*KtAyQ+EJL+1z2IuqC&v-A*M4z(!w^Z(xm-gV0C`D|LNVtzO(1 zQv$+T)n727MB?-~`^b%|Z4085r*$<47Swmgz&FldrMcqDS*X5Zqd}_&0=)oASRHW) z47HYCg(3hXqRiygP?O4}<{=D$z9@yr=cT(Gz~AFq*P9$?3WFyVa1LxVOWYw+pv&DX zMflFVi(V`=*MxgkjAEpB<8!c9ee!nv!NxmwtT^AR!evvwG05=b3jq9|*9pT%WxXc0g+TzrR1W&#hv#RO!QyySR z3*8PxOoj=2U66@os1Vhe-1W#R)Tdj-q9tC@G+;xF3t%b^QRCipE+Qf4e7MTqgp7t*eKH(-<$wD*T zFsEAF|7>sonfKYcd0auSKr1S_SoFHrAI)q;2OQAB78!JM9#3h#edEgXP0w0BsEvil z^})Df&(tMJe`~FaJ46t~1#>7qPVXSR8iCy{!sM6!+=HI7a9|V*9xP60uI1FelgF#q zB9Bf&Lgj^Kjumu^8kNr3vXNu~-b42XYSmu*CiBL%0#q*OJ@g&oTDO;8?cCe!h6{7mz_Uxg3 z>lqFaq+Y!c=$b;@C4sT6e<%09Sa($cFah6?HHZko?<8%Eb60-C_AA_(`vrCd#a)_a zEwSswvFbl#Ojgq?Llr1bakNByQ6;hO0p9OKqKW*sbr%Lp(`4ge06O$ q)=KI*wLMQsldD?o|DXSe&M<23W@#nYy6k``h|EkZjGt^FhyNc@Ii-OB literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 1a34aba..bc3e49c 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,13 @@ "build": "pnpm run --recursive build", "lint": "eslint 'packages/*/{src,demo}/**/*.{ts,tsx,vue,js}' --cache", "lint:fix": "pnpm run lint --fix", - "test:ci": "pnpm run lint:fix && pnpm run build", + "test:ci": "pnpm run lint:fix && pnpm run build && pnpm docs:build", "release:major": "lerna version major", "release:minor": "lerna version minor", - "release:patch": "lerna version patch" + "release:patch": "lerna version patch", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, "devDependencies": { "@eslint/js": "9.17.0", @@ -42,6 +45,7 @@ "vite": "6.0.7", "vite-plugin-banner": "0.8.0", "vite-plugin-dts": "4.4.0", + "vitepress": "1.5.0", "vue": "3.5.13", "vue-tsc": "2.2.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2a6ece..41709b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: vite-plugin-dts: specifier: 4.4.0 version: 4.4.0(@types/node@22.10.5)(rollup@4.29.1)(typescript@5.7.2)(vite@6.0.7(@types/node@22.10.5)(yaml@2.7.0)) + vitepress: + specifier: 1.5.0 + version: 1.5.0(@algolia/client-search@5.19.0)(@types/node@22.10.5)(@types/react@19.0.2)(axios@1.7.9)(postcss@8.4.49)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3)(typescript@5.7.2) vue: specifier: 3.5.13 version: 3.5.13(typescript@5.7.2) @@ -121,6 +124,78 @@ importers: packages: + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.19.0': + resolution: {integrity: sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.19.0': + resolution: {integrity: sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.19.0': + resolution: {integrity: sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.19.0': + resolution: {integrity: sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.19.0': + resolution: {integrity: sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.19.0': + resolution: {integrity: sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.19.0': + resolution: {integrity: sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.19.0': + resolution: {integrity: sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.19.0': + resolution: {integrity: sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.19.0': + resolution: {integrity: sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.19.0': + resolution: {integrity: sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.19.0': + resolution: {integrity: sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.19.0': + resolution: {integrity: sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==} + engines: {node: '>= 14.0.0'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -226,6 +301,29 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + '@emnapi/core@1.3.1': resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} @@ -235,102 +333,204 @@ packages: '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -343,6 +543,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -355,30 +561,60 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -443,6 +679,12 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} + '@iconify-json/simple-icons@1.2.20': + resolution: {integrity: sha512-WlQ95zrdxxizrFt2HtkfYjyWatLfE8Z7BKOkew9quG5S5AKYVxF1PkTtOs8LDWShce1DpvxKWQne4W5DQyEGZg==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -844,6 +1086,30 @@ packages: '@rushstack/ts-command-line@4.23.2': resolution: {integrity: sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==} + '@shikijs/core@1.27.2': + resolution: {integrity: sha512-ns1dokDr0KE1lQ9mWd4rqaBkhSApk0qGCK1+lOqwnkQSkVZ08UGqXj1Ef8dAcTMZNFkN6PSNjkL5TYNX7pyPbQ==} + + '@shikijs/engine-javascript@1.27.2': + resolution: {integrity: sha512-0JB7U5vJc16NShBdxv9hSSJYSKX79+32O7F4oXIxJLdYfomyFvx4B982ackUI9ftO9T3WwagkiiD3nOxOOLiGA==} + + '@shikijs/engine-oniguruma@1.27.2': + resolution: {integrity: sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==} + + '@shikijs/langs@1.27.2': + resolution: {integrity: sha512-MSrknKL0DbeXvhtSigMLIzjPOOQfvK7fsbcRv2NUUB0EvuTTomY8/U+lAkczYrXY2+dygKOapJKk8ScFYbtoNw==} + + '@shikijs/themes@1.27.2': + resolution: {integrity: sha512-Yw/uV7EijjWavIIZLoWneTAohcbBqEKj6XMX1bfMqO3llqTKsyXukPp1evf8qPqzUHY7ibauqEaQchhfi857mg==} + + '@shikijs/transformers@1.27.2': + resolution: {integrity: sha512-BJFeXP9/zlYidJocv2ShkOvXI22fepS2oK/vItfCbCcuJ0783eWgEn6/mMrXmk+p+Twu49ntDVQe665uy6RPWw==} + + '@shikijs/types@1.27.2': + resolution: {integrity: sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@sigstore/bundle@2.3.2': resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -900,9 +1166,24 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -923,6 +1204,12 @@ packages: '@types/react@19.0.2': resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@typescript-eslint/eslint-plugin@8.19.0': resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -970,6 +1257,9 @@ packages: resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1007,6 +1297,15 @@ packages: '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/devtools-api@7.7.0': + resolution: {integrity: sha512-bHEv6kT85BHtyGgDhE07bAUMAy7zpv6nnR004nSTd0wWMrAOtcrYoXO5iyr20Hkf5jR8obQOfS3byW+I3l2CCA==} + + '@vue/devtools-kit@7.7.0': + resolution: {integrity: sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==} + + '@vue/devtools-shared@7.7.0': + resolution: {integrity: sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==} + '@vue/eslint-config-typescript@14.2.0': resolution: {integrity: sha512-JJ4wHuTJa2faQsBOUeWzuHOSFizVS7RWG2eH2noABk2LcT4wVcTOMZKM/lFobKBcgwADIPAKVRGFHVKooXImoA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1051,6 +1350,56 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + + '@vueuse/integrations@11.3.0': + resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -1116,6 +1465,10 @@ packages: ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + algoliasearch@5.19.0: + resolution: {integrity: sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg==} + engines: {node: '>= 14.0.0'} + alien-signals@0.2.2: resolution: {integrity: sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==} @@ -1237,6 +1590,9 @@ packages: resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1299,6 +1655,9 @@ packages: caniuse-lite@1.0.30001690: resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.0: resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} engines: {node: '>=10'} @@ -1307,6 +1666,12 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1380,6 +1745,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -1436,6 +1804,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1539,10 +1911,17 @@ packages: deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@5.0.0: resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} engines: {node: '>=4'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1598,6 +1977,9 @@ packages: electron-to-chromium@1.5.76: resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1664,6 +2046,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -1825,6 +2212,9 @@ packages: flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + focus-trap@7.6.4: + resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -2026,10 +2416,19 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2041,6 +2440,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -2272,6 +2674,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2503,10 +2909,16 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -2518,6 +2930,21 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2606,10 +3033,16 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minisearch@7.1.1: + resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -2775,6 +3208,9 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + oniguruma-to-es@2.1.0: + resolution: {integrity: sha512-Iq/949c5IueVC5gQR7OYXs0uHsDIePcgZFlVRIVGfQcWwbKG+nsyWfthswdytShlRdkZADY+bWSi+BRyUL81gA==} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -2926,6 +3362,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3019,6 +3458,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} @@ -3098,6 +3540,15 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3147,6 +3598,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@4.4.1: resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} engines: {node: '>=14'} @@ -3191,6 +3645,9 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -3236,6 +3693,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@1.27.2: + resolution: {integrity: sha512-QtA1C41oEVixKog+V8I3ia7jjGls7oCZ8Yul8vdHrVBga5uPoyTtMvFF4lMMXIyAZo5A5QbXq91bot2vA6Q+eQ==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -3295,6 +3755,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3307,6 +3770,10 @@ packages: spdx-license-ids@3.0.20: resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -3364,6 +3831,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3397,6 +3867,10 @@ packages: engines: {node: '>=4'} hasBin: true + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3409,6 +3883,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -3450,6 +3927,9 @@ packages: resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -3558,6 +4038,21 @@ packages: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} @@ -3596,6 +4091,12 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-plugin-banner@0.8.0: resolution: {integrity: sha512-JpDWDYxtrsytuvUOJCgJcTkBb6XM8yPOidjRtB6F5SW1JSzDd/Y+PD/44wR6ovWKXhSUiyDRqPvx7mMf8+8ELg==} @@ -3609,6 +4110,37 @@ packages: vite: optional: true + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.0.7: resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -3649,9 +4181,32 @@ packages: yaml: optional: true + vitepress@1.5.0: + resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -3793,8 +4348,116 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@algolia/client-search': 5.19.0 + algoliasearch: 5.19.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + dependencies: + '@algolia/client-search': 5.19.0 + algoliasearch: 5.19.0 + + '@algolia/client-abtesting@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/client-analytics@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/client-common@5.19.0': {} + + '@algolia/client-insights@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/client-personalization@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/client-query-suggestions@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/client-search@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/ingestion@1.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/monitoring@1.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/recommend@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + + '@algolia/requester-browser-xhr@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + + '@algolia/requester-fetch@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + + '@algolia/requester-node-http@5.19.0': + dependencies: + '@algolia/client-common': 5.19.0 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -3937,6 +4600,33 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.19.0)(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.19.0)(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3) + preact: 10.25.4 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.19.0)(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.19.0 + optionalDependencies: + '@types/react': 19.0.2 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + '@emnapi/core@1.3.1': dependencies: '@emnapi/wasi-threads': 1.0.1 @@ -3950,78 +4640,147 @@ snapshots: dependencies: tslib: 2.8.1 + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.24.2': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.24.2': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.24.2': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.24.2': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.24.2': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true @@ -4081,6 +4840,12 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} + '@iconify-json/simple-icons@1.2.20': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4651,6 +5416,45 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@shikijs/core@1.27.2': + dependencies: + '@shikijs/engine-javascript': 1.27.2 + '@shikijs/engine-oniguruma': 1.27.2 + '@shikijs/types': 1.27.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@1.27.2': + dependencies: + '@shikijs/types': 1.27.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 2.1.0 + + '@shikijs/engine-oniguruma@1.27.2': + dependencies: + '@shikijs/types': 1.27.2 + '@shikijs/vscode-textmate': 10.0.1 + + '@shikijs/langs@1.27.2': + dependencies: + '@shikijs/types': 1.27.2 + + '@shikijs/themes@1.27.2': + dependencies: + '@shikijs/types': 1.27.2 + + '@shikijs/transformers@1.27.2': + dependencies: + shiki: 1.27.2 + + '@shikijs/types@1.27.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.1': {} + '@sigstore/bundle@2.3.2': dependencies: '@sigstore/protobuf-specs': 0.3.2 @@ -4721,8 +5525,25 @@ snapshots: '@types/estree@1.0.6': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + '@types/minimatch@3.0.5': {} '@types/minimist@1.2.5': {} @@ -4741,6 +5562,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -4818,6 +5643,8 @@ snapshots: '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.1': {} + '@vitejs/plugin-react@4.3.4(vite@6.0.7(@types/node@22.10.5)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.0 @@ -4829,6 +5656,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-vue@5.2.1(vite@5.4.11(@types/node@22.10.5))(vue@3.5.13(typescript@5.7.2))': + dependencies: + vite: 5.4.11(@types/node@22.10.5) + vue: 3.5.13(typescript@5.7.2) + '@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.2))': dependencies: vite: 6.0.7(@types/node@22.10.5)(yaml@2.7.0) @@ -4881,6 +5713,24 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 + '@vue/devtools-api@7.7.0': + dependencies: + '@vue/devtools-kit': 7.7.0 + + '@vue/devtools-kit@7.7.0': + dependencies: + '@vue/devtools-shared': 7.7.0 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.7.0': + dependencies: + rfdc: 1.4.1 + '@vue/eslint-config-typescript@14.2.0(eslint-plugin-vue@9.32.0(eslint@9.17.0))(eslint@9.17.0)(typescript@5.7.2)': dependencies: eslint: 9.17.0 @@ -4943,6 +5793,37 @@ snapshots: '@vue/shared@3.5.13': {} + '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.7.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@11.3.0(axios@1.7.9)(focus-trap@7.6.4)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.7.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + optionalDependencies: + axios: 1.7.9 + focus-trap: 7.6.4 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.7.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@yarnpkg/lockfile@1.1.0': {} '@yarnpkg/parsers@3.0.2': @@ -5005,6 +5886,22 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + algoliasearch@5.19.0: + dependencies: + '@algolia/client-abtesting': 5.19.0 + '@algolia/client-analytics': 5.19.0 + '@algolia/client-common': 5.19.0 + '@algolia/client-insights': 5.19.0 + '@algolia/client-personalization': 5.19.0 + '@algolia/client-query-suggestions': 5.19.0 + '@algolia/client-search': 5.19.0 + '@algolia/ingestion': 1.19.0 + '@algolia/monitoring': 1.19.0 + '@algolia/recommend': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 + alien-signals@0.2.2: {} alien-signals@0.4.12: {} @@ -5133,6 +6030,8 @@ snapshots: read-cmd-shim: 4.0.0 write-file-atomic: 5.0.1 + birpc@0.2.19: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -5214,6 +6113,8 @@ snapshots: caniuse-lite@1.0.30001690: {} + ccount@2.0.1: {} + chalk@4.1.0: dependencies: ansi-styles: 4.3.0 @@ -5224,6 +6125,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} chownr@2.0.0: {} @@ -5283,6 +6188,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + common-ancestor-path@1.0.1: {} compare-func@2.0.0: @@ -5359,6 +6266,10 @@ snapshots: convert-source-map@2.0.0: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + core-util-is@1.0.3: {} cosmiconfig@9.0.0(typescript@5.7.2): @@ -5451,8 +6362,14 @@ snapshots: deprecation@2.3.1: {} + dequal@2.0.3: {} + detect-indent@5.0.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-sequences@29.6.3: {} dir-glob@3.0.1: @@ -5507,6 +6424,8 @@ snapshots: electron-to-chromium@1.5.76: {} + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -5634,6 +6553,32 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -5868,6 +6813,10 @@ snapshots: flatted@3.3.2: {} + focus-trap@7.6.4: + dependencies: + tabbable: 6.2.0 + follow-redirects@1.15.9: {} for-each@0.3.3: @@ -6084,8 +7033,28 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + he@1.2.0: {} + hookable@5.5.3: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -6096,6 +7065,8 @@ snapshots: dependencies: lru-cache: 10.4.3 + html-void-elements@3.0.0: {} + http-cache-semantics@4.1.1: {} http-proxy-agent@7.0.2: @@ -6334,6 +7305,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-what@4.1.16: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -6665,8 +7638,22 @@ snapshots: map-obj@4.3.0: {} + mark.js@8.11.1: {} + math-intrinsics@1.1.0: {} + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 @@ -6685,6 +7672,23 @@ snapshots: merge2@1.4.1: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -6770,11 +7774,15 @@ snapshots: minipass@7.1.2: {} + minisearch@7.1.1: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 + mitt@3.0.1: {} + mkdirp@1.0.4: {} mlly@1.7.3: @@ -7006,6 +8014,12 @@ snapshots: dependencies: mimic-fn: 2.1.0 + oniguruma-to-es@2.1.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -7183,6 +8197,8 @@ snapshots: pathe@1.1.2: {} + perfect-debounce@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -7257,6 +8273,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@6.5.0: {} + protocols@2.0.1: {} proxy-from-env@1.1.0: {} @@ -7347,6 +8365,17 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -7391,6 +8420,8 @@ snapshots: reusify@1.0.4: {} + rfdc@1.4.1: {} + rimraf@4.4.1: dependencies: glob: 9.3.5 @@ -7457,6 +8488,8 @@ snapshots: scheduler@0.25.0: {} + search-insights@2.17.3: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -7501,6 +8534,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@1.27.2: + dependencies: + '@shikijs/core': 1.27.2 + '@shikijs/engine-javascript': 1.27.2 + '@shikijs/engine-oniguruma': 1.27.2 + '@shikijs/langs': 1.27.2 + '@shikijs/themes': 1.27.2 + '@shikijs/types': 1.27.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -7571,6 +8615,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -7585,6 +8631,8 @@ snapshots: spdx-license-ids@3.0.20: {} + speakingurl@14.0.1: {} + split2@3.2.2: dependencies: readable-stream: 3.6.2 @@ -7669,6 +8717,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7695,6 +8748,10 @@ snapshots: minimist: 1.2.8 through: 2.3.8 + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -7705,6 +8762,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.2.0: {} + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -7747,6 +8806,8 @@ snapshots: treeverse@3.0.0: {} + trim-lines@3.0.1: {} + trim-newlines@3.0.1: {} ts-api-utils@1.4.3(typescript@5.7.2): @@ -7856,6 +8917,29 @@ snapshots: dependencies: imurmurhash: 0.1.4 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universal-user-agent@6.0.1: {} universalify@0.1.2: {} @@ -7885,6 +8969,16 @@ snapshots: validate-npm-package-name@5.0.1: {} + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-plugin-banner@0.8.0: {} vite-plugin-dts@4.4.0(@types/node@22.10.5)(rollup@4.29.1)(typescript@5.7.2)(vite@6.0.7(@types/node@22.10.5)(yaml@2.7.0)): @@ -7906,6 +9000,15 @@ snapshots: - rollup - supports-color + vite@5.4.11(@types/node@22.10.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.29.1 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 + vite@6.0.7(@types/node@22.10.5)(yaml@2.7.0): dependencies: esbuild: 0.24.2 @@ -7916,8 +9019,62 @@ snapshots: fsevents: 2.3.3 yaml: 2.7.0 + vitepress@1.5.0(@algolia/client-search@5.19.0)(@types/node@22.10.5)(@types/react@19.0.2)(axios@1.7.9)(postcss@8.4.49)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3)(typescript@5.7.2): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.19.0)(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.20 + '@shikijs/core': 1.27.2 + '@shikijs/transformers': 1.27.2 + '@shikijs/types': 1.27.2 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.1(vite@5.4.11(@types/node@22.10.5))(vue@3.5.13(typescript@5.7.2)) + '@vue/devtools-api': 7.7.0 + '@vue/shared': 3.5.13 + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/integrations': 11.3.0(axios@1.7.9)(focus-trap@7.6.4)(vue@3.5.13(typescript@5.7.2)) + focus-trap: 7.6.4 + mark.js: 8.11.1 + minisearch: 7.1.1 + shiki: 1.27.2 + vite: 5.4.11(@types/node@22.10.5) + vue: 3.5.13(typescript@5.7.2) + optionalDependencies: + postcss: 8.4.49 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + vscode-uri@3.0.8: {} + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): + dependencies: + vue: 3.5.13(typescript@5.7.2) + vue-eslint-parser@9.4.3(eslint@9.17.0): dependencies: debug: 4.4.0 @@ -8099,3 +9256,5 @@ snapshots: yargs-parser: 21.1.1 yocto-queue@0.1.0: {} + + zwitch@2.0.4: {} From f4330ce946a22301250c38c6eb1f6fa157873fa4 Mon Sep 17 00:00:00 2001 From: Simon Reinisch Date: Sat, 18 Jan 2025 16:52:30 +0100 Subject: [PATCH 02/11] chore: rename repository and update contributing guidelines --- .github/CONTRIBUTING.md | 27 +++++++++++++++++++-------- .github/ISSUE_TEMPLATE/question.md | 2 +- README.md | 7 +++---- docs/pages/faq.md | 2 +- packages/preact/README.md | 8 ++++---- packages/preact/package.json | 6 +++--- packages/preact/vite.config.mts | 2 +- packages/react/README.md | 8 ++++---- packages/react/package.json | 6 +++--- packages/react/vite.config.mts | 2 +- packages/vanilla/README.md | 6 +++--- packages/vanilla/package.json | 6 +++--- packages/vanilla/recipes.md | 10 +++++----- packages/vanilla/vite.config.mts | 2 +- packages/vue/README.md | 8 ++++---- packages/vue/package.json | 6 +++--- packages/vue/vite.config.mts | 2 +- 17 files changed, 60 insertions(+), 50 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8d8e170..84c3eb0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -2,23 +2,34 @@ ### Issue -1. Make sure you're using the latest version, check [releases](https://github.com/Simonwep/selection/releases/tag/2.1.2) for that. -2. [Use the search](https://github.com/Simonwep/selection/search?type=Issues), maybe there is already an answer. -3. If not found, [create an issue](https://github.com/Simonwep/selection/issues/new), please dont forget to carefully describe it how to reproduce it / pay attention to the issue-template. +* Make sure you're using the latest version, check [releases](https://github.com/simonwep/viselect/releases/tag/2.1.2) for that. +* [Use the search](https://github.com/simonwep/viselect/search?type=Issues), maybe there is already an answer. +* If not found, [create an issue](https://github.com/simonwep/viselect/issues/new), please don't forget to carefully describe it how to reproduce it / pay attention to the issue-template. *** ### Pull Request -1. Pull requests only into the [master](https://github.com/Simonwep/selection/tree/master) branch. +* Pull requests only into the [master](https://github.com/simonwep/viselect/tree/master) branch. +* Make sure to use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/): + - `docs: ` - for changes in the documentation. + - `feat([package]): ` - for new features in the corresponding package. + - `fix([package]): ` - for bug fixes in the corresponding package. + - `refactor([package]): ` - for changes in the code that neither fixes a bug nor adds a feature. + - `chore: ` - for changes in the build process or auxiliary tools. *** -#### Setup +### Working on the library This project requires [pnpm](https://pnpm.io) and [node](https://nodejs.org/en/). - -1. Fork this repo on [GitHub](https://github.com/Simonwep/selection). + +1. Fork this repo on [GitHub](https://github.com/simonwep/viselect). 2. Check out the master locally. 3. From your local repro run `pnpm install`. -4. Run `pnpm start dev`. +4. Run `pnpm start dev` to start a dev server for all packages. + +#### Working on the docs + +This project uses [vitepress](https://vitepress.dev/) for the documentation. +Use the `docs:` commands to work on the documentation. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 1491518..246e917 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -7,4 +7,4 @@ assignees: '' --- -**Use [discussions](https://github.com/Simonwep/selection/discussions).** +**Use [discussions](https://github.com/simonwep/viselect/discussions).** diff --git a/README.md b/README.md index 0b75809..3e1867c 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,13 @@ Support me - version + version Buy me a coffee - Build Status + src="https://github.com/simonwep/viselect/workflows/CI/badge.svg"> gzip size brotli size Buy me a coffee - Build Status + src="https://github.com/simonwep/viselect/workflows/CI/badge.svg"> gzip size brotli size > [!NOTE] -> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/selection/tree/master/packages/vanilla). +> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/viselect/tree/master/packages/vanilla). > The core API is fairly simple, if you want to have full control over it, you should roll out your own wrapper in your app. ### Installation @@ -68,7 +68,7 @@ Last but not least, you'll need to add some basic styles to make your selection- ``` Additionally, to not interfere with text-selection, selection-js won't prevent any default events anymore (as of `v2.0.3`). -This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/Simonwep/selection/pull/99), reported in [#103](https://github.com/Simonwep/selection/issues/103)). +This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/simonwep/viselect/pull/99), reported in [#103](https://github.com/simonwep/viselect/issues/103)). If you don't care about text-selection, add the following to the container where all your selectables are located: ```css diff --git a/packages/preact/package.json b/packages/preact/package.json index 225829c..431e62d 100644 --- a/packages/preact/package.json +++ b/packages/preact/package.json @@ -3,9 +3,9 @@ "version": "3.9.0", "description": "Preact wrapper around the viselect vanilla library", "author": "Simon Reinisch ", - "bugs": "https://github.com/Simonwep/selection/issues", - "homepage": "https://github.com/Simonwep/selection#readme", - "repository": "git+https://github.com/Simonwep/selection.git", + "bugs": "https://github.com/simonwep/viselect/issues", + "homepage": "https://github.com/simonwep/viselect#readme", + "repository": "git+https://github.com/simonwep/viselect.git", "license": "MIT", "main": "./dist/viselect.umd.js", "module": "./dist/viselect.mjs", diff --git a/packages/preact/vite.config.mts b/packages/preact/vite.config.mts index c97602e..01de2f5 100644 --- a/packages/preact/vite.config.mts +++ b/packages/preact/vite.config.mts @@ -4,7 +4,7 @@ import banner from 'vite-plugin-banner'; import dts from 'vite-plugin-dts'; import {version} from './package.json'; -const header = `/*! @viselect/preact v${version} MIT | https://github.com/Simonwep/selection/tree/master/packages/preact */`; +const header = `/*! @viselect/preact v${version} MIT | https://github.com/simonwep/viselect/tree/master/packages/preact */`; export default defineConfig(env => ({ root: env.mode === 'production' ? '.' : './demo', diff --git a/packages/react/README.md b/packages/react/README.md index 1d7d283..cbbeac6 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -18,9 +18,9 @@ Buy me a coffee - Build Status + src="https://github.com/simonwep/viselect/workflows/CI/badge.svg"> gzip size brotli size > [!NOTE] -> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/selection/tree/master/packages/vanilla). +> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/viselect/tree/master/packages/vanilla). > The core API is fairly simple, if you want to have full control over it, you should roll out your own wrapper in your app. ### Installation @@ -71,7 +71,7 @@ Last but not least, you'll need to add some basic styles to make your selection- ``` Additionally, to not interfere with text-selection, selection-js won't prevent any default events anymore (as of `v2.0.3`). -This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/Simonwep/selection/pull/99), reported in [#103](https://github.com/Simonwep/selection/issues/103)). +This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/simonwep/viselect/pull/99), reported in [#103](https://github.com/simonwep/viselect/issues/103)). If you don't care about text-selection, add the following to the container where all your selectables are located: ```css diff --git a/packages/react/package.json b/packages/react/package.json index f4a09e5..e15a456 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -3,9 +3,9 @@ "version": "3.9.0", "description": "React wrapper around the viselect vanilla library", "author": "Simon Reinisch ", - "bugs": "https://github.com/Simonwep/selection/issues", - "homepage": "https://github.com/Simonwep/selection#readme", - "repository": "git+https://github.com/Simonwep/selection.git", + "bugs": "https://github.com/simonwep/viselect/issues", + "homepage": "https://github.com/simonwep/viselect#readme", + "repository": "git+https://github.com/simonwep/viselect.git", "license": "MIT", "main": "./dist/viselect.umd.js", "module": "./dist/viselect.mjs", diff --git a/packages/react/vite.config.mts b/packages/react/vite.config.mts index 6371e61..05680f5 100644 --- a/packages/react/vite.config.mts +++ b/packages/react/vite.config.mts @@ -4,7 +4,7 @@ import banner from 'vite-plugin-banner'; import dts from 'vite-plugin-dts'; import {version} from './package.json'; -const header = `/*! @viselect/react v${version} MIT | https://github.com/Simonwep/selection/tree/master/packages/react */`; +const header = `/*! @viselect/react v${version} MIT | https://github.com/simonwep/viselect/tree/master/packages/react */`; export default defineConfig(env => ({ root: env.mode === 'production' ? '.' : './demo', diff --git a/packages/vanilla/README.md b/packages/vanilla/README.md index 65b8a86..d9606c5 100644 --- a/packages/vanilla/README.md +++ b/packages/vanilla/README.md @@ -18,9 +18,9 @@ Buy me a coffee - Build Status + src="https://github.com/simonwep/viselect/workflows/CI/badge.svg"> gzip size brotli size ", - "bugs": "https://github.com/Simonwep/selection/issues", - "homepage": "https://github.com/Simonwep/selection#readme", - "repository": "git+https://github.com/Simonwep/selection.git", + "bugs": "https://github.com/simonwep/viselect/issues", + "homepage": "https://github.com/simonwep/viselect#readme", + "repository": "git+https://github.com/simonwep/viselect.git", "license": "MIT", "main": "./dist/viselect.umd.js", "module": "./dist/viselect.mjs", diff --git a/packages/vanilla/recipes.md b/packages/vanilla/recipes.md index 10d60d8..c0fb703 100644 --- a/packages/vanilla/recipes.md +++ b/packages/vanilla/recipes.md @@ -1,6 +1,6 @@ ### Requested features - immediately brought to life by a bit of code -#### Allowing the user to scroll with two fingers ([#70](https://github.com/Simonwep/selection/issues/70)) +#### Allowing the user to scroll with two fingers ([#70](https://github.com/simonwep/viselect/issues/70)) ```js selection.on('beforestart', (() => { @@ -31,7 +31,7 @@ selection.on('beforestart', (() => { })()); ``` -#### Preventing the start of a selection based on certain conditions ([#73](https://github.com/Simonwep/selection/issues/73)) +#### Preventing the start of a selection based on certain conditions ([#73](https://github.com/simonwep/viselect/issues/73)) ```js selection.on('beforestart', ({event}) => { @@ -48,7 +48,7 @@ selection.on('beforestart', ({event}) => { }); ``` -#### Preventing select from right click, middle mouse or left click ([#101](https://github.com/Simonwep/selection/issues/101)) +#### Preventing select from right click, middle mouse or left click ([#101](https://github.com/simonwep/viselect/issues/101)) ```js selection.on('beforestart', (event) => { const allowedButtons = [ @@ -62,8 +62,8 @@ selection.on('beforestart', (event) => { }); ``` -> Feel free to submit a [PR](https://github.com/Simonwep/selection/compare) or create -> an [issue](https://github.com/Simonwep/selection/issues/new?assignees=Simonwep&labels=&template=feature_request.md&title=) if +> Feel free to submit a [PR](https://github.com/simonwep/viselect/compare) or create +> an [issue](https://github.com/simonwep/viselect/issues/new?assignees=Simonwep&labels=&template=feature_request.md&title=) if > you got any ideas for more examples! #### Preventing text-selection diff --git a/packages/vanilla/vite.config.mts b/packages/vanilla/vite.config.mts index a8d5a96..189188e 100644 --- a/packages/vanilla/vite.config.mts +++ b/packages/vanilla/vite.config.mts @@ -3,7 +3,7 @@ import {version} from './package.json'; import banner from 'vite-plugin-banner'; import dts from 'vite-plugin-dts'; -const header = `/*! @viselect/vanilla v${version} MIT | https://github.com/Simonwep/selection/tree/master/packages/vanilla */`; +const header = `/*! @viselect/vanilla v${version} MIT | https://github.com/simonwep/viselect/tree/master/packages/vanilla */`; export default defineConfig(env => ({ root: env.mode === 'production' ? '.' : './demo', diff --git a/packages/vue/README.md b/packages/vue/README.md index 3b0994f..f971e27 100644 --- a/packages/vue/README.md +++ b/packages/vue/README.md @@ -18,9 +18,9 @@ Buy me a coffee - Build Status + src="https://github.com/simonwep/viselect/workflows/CI/badge.svg"> gzip size brotli size > [!NOTE] -> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/selection/tree/master/packages/vanilla). +> This is merely a convenience wrapper around [@viselect/vanilla](https://github.com/simonwep/viselect/tree/master/packages/vanilla). > The core API is fairly simple, if you want to have full control over it, you should roll out your own wrapper in your app. ### Installation @@ -68,7 +68,7 @@ Last but not least, you'll need to add some basic styles to make your selection- ``` Additionally, to not interfere with text-selection, selection-js won't prevent any default events anymore (as of `v2.0.3`). -This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/Simonwep/selection/pull/99), reported in [#103](https://github.com/Simonwep/selection/issues/103)). +This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/simonwep/viselect/pull/99), reported in [#103](https://github.com/simonwep/viselect/issues/103)). If you don't care about text-selection, add the following to the container where all your selectables are located: ```css diff --git a/packages/vue/package.json b/packages/vue/package.json index 72bfc31..d278862 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -3,9 +3,9 @@ "version": "3.9.0", "description": "Simple, lightweight and modern library library for making visual DOM Selections.", "author": "Simon Reinisch ", - "bugs": "https://github.com/Simonwep/selection/issues", - "homepage": "https://github.com/Simonwep/selection#readme", - "repository": "git+https://github.com/Simonwep/selection.git", + "bugs": "https://github.com/simonwep/viselect/issues", + "homepage": "https://github.com/simonwep/viselect#readme", + "repository": "git+https://github.com/simonwep/viselect.git", "license": "MIT", "main": "./dist/viselect.umd.js", "module": "./dist/viselect.mjs", diff --git a/packages/vue/vite.config.mts b/packages/vue/vite.config.mts index 18cb961..80cd894 100644 --- a/packages/vue/vite.config.mts +++ b/packages/vue/vite.config.mts @@ -5,7 +5,7 @@ import dts from 'vite-plugin-dts'; import banner from 'vite-plugin-banner'; import {version} from './package.json'; -const header = `/*! @viselect/vue v${version} MIT | https://github.com/Simonwep/selection/tree/master/packages/vue */`; +const header = `/*! @viselect/vue v${version} MIT | https://github.com/simonwep/viselect/tree/master/packages/vue */`; export default defineConfig(env => ({ root: env.mode === 'production' ? '.' : './demo', From 7b4dd98593203b773c917448961b36fef4377c7d Mon Sep 17 00:00:00 2001 From: Simon Reinisch Date: Sat, 18 Jan 2025 17:08:59 +0100 Subject: [PATCH 03/11] chore: add docs deployment workflow and update workflows --- .github/workflows/deploy.yml | 63 ++++++++++++++++++++++++++++++++++++ .github/workflows/main.yml | 45 ++++++++++++++++++++++---- README.md | 4 +++ package.json | 2 +- 4 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..489d156 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,63 @@ +name: Deploy Docs + +on: + push: + branches: [master] + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + name: Build docs + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up pnpm + uses: pnpm/action-setup@v3 + with: + version: 9.15.0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build libraries + run: pnpm build + + - name: Build docs + run: pnpm docs:build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-22.04 + name: Deploy + steps: + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 06c1011..c2a7257 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,14 +5,17 @@ on: ["push", "pull_request"] jobs: build: name: Build, test and eventually publish - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v3 with: - version: 9.11.0 + version: 9.15.0 - name: Set up Node.js uses: actions/setup-node@v4 @@ -31,13 +34,41 @@ jobs: key: ${{ runner.os }}-eslint-${{ hashFiles('**/pnpm-lock.yaml', '**/eslint.config.mjs') }} - name: Lint - run: pnpm run lint + run: pnpm lint - - name: Build - run: pnpm run build + - name: Build packages + run: pnpm build + + - name: Build docs + run: pnpm docs:build - name: Publish if: startsWith(github.event.ref, 'refs/tags/v') env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx lerna publish from-package --yes + + publish_release: + if: startsWith(github.event.ref, 'refs/tags/v') + name: Publish new release + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + + - name: Extract changes + id: changelog + uses: requarks/changelog-action@v1 + with: + token: ${{ github.token }} + tag: ${{ github.ref_name }} + + - name: Publish release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + body: ${{ steps.changelog.outputs.changes }} diff --git a/README.md b/README.md index 3e1867c..f864580 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,10 @@ ### Getting started +> [!NOTE] +> I'm currently in the middle of moving the migration from readmes to a new docs websites. +> Stay tuned for a better, more detailed documentation in the coming weeks! + Check out the documentation for the package you want to use: * [@viselect/vanilla](packages/vanilla) - To be used with plain [JavaScript](http://vanilla-js.com/) or [TypeScript](https://www.typescriptlang.org/). diff --git a/package.json b/package.json index bc3e49c..23efcfe 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": "Simon Reinisch ", "private": true, "license": "MIT", - "packageManager": "pnpm@9.11.0", + "packageManager": "pnpm@9.15.0", "engines": { "node": "^22" }, From 13b33f7ca533bacf277753c48c09b0d9872a555c Mon Sep 17 00:00:00 2001 From: Simon Reinisch Date: Sun, 19 Jan 2025 09:53:29 +0100 Subject: [PATCH 04/11] refactor: minor simplifications in react, preact and vue packages --- packages/preact/src/SelectionArea.tsx | 15 +++++++-------- packages/react/src/SelectionArea.tsx | 15 +++++++-------- packages/vanilla/src/utils/intersects.ts | 2 +- packages/vanilla/src/utils/matchesTrigger.ts | 4 ++-- packages/vue/src/SelectionArea.vue | 11 +++++------ 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/preact/src/SelectionArea.tsx b/packages/preact/src/SelectionArea.tsx index 0948133..b435eb4 100644 --- a/packages/preact/src/SelectionArea.tsx +++ b/packages/preact/src/SelectionArea.tsx @@ -13,21 +13,20 @@ export interface SelectionAreaProps extends PartialSelectionOptions, JSX.HTMLAtt onStop?: SelectionEvents['stop']; } -const SelectionContext = createContext(undefined); +const SelectionContext = createContext(undefined); export const useSelection = () => useContext(SelectionContext); export const SelectionArea: FunctionalComponent = props => { - const [selectionState, setSelection] = useState(undefined); + const [instance, setInstance] = useState(undefined); const root = createRef(); useEffect(() => { /* eslint-disable @typescript-eslint/no-unused-vars */ - const {onBeforeStart, onBeforeDrag, onStart, onMove, onStop, ...opt} = props; - const areaBoundaries = root.current as HTMLElement; + const {boundaries = root.current, onBeforeStart, onBeforeDrag, onStart, onMove, onStop, ...opt} = props; const selection = new VanillaSelectionArea({ - boundaries: areaBoundaries, + boundaries: boundaries as HTMLElement, ...opt }); @@ -37,16 +36,16 @@ export const SelectionArea: FunctionalComponent = props => { selection.on('move', evt => props.onMove?.(evt)); selection.on('stop', evt => props.onStop?.(evt)); - setSelection(selection); + setInstance(selection); return () => { selection.destroy(); - setSelection(undefined); + setInstance(undefined); }; }, []); return ( - + {props.boundaries ? ( props.children ) : ( diff --git a/packages/react/src/SelectionArea.tsx b/packages/react/src/SelectionArea.tsx index bb4f27b..57d5ff9 100644 --- a/packages/react/src/SelectionArea.tsx +++ b/packages/react/src/SelectionArea.tsx @@ -12,21 +12,20 @@ export interface SelectionAreaProps extends PartialSelectionOptions, React.HTMLA onStop?: SelectionEvents['stop']; } -const SelectionContext = createContext(undefined); +const SelectionContext = createContext(undefined); export const useSelection = () => useContext(SelectionContext); export const SelectionArea: React.FunctionComponent = props => { - const [selectionState, setSelection] = useState(undefined); + const [instance, setInstance] = useState(undefined); const root = useRef(null); useEffect(() => { /* eslint-disable @typescript-eslint/no-unused-vars */ - const {boundaries, onBeforeStart, onBeforeDrag, onStart, onMove, onStop, ...opt} = props; - const areaBoundaries = boundaries ? boundaries : (root.current as HTMLElement); + const {boundaries = root.current, onBeforeStart, onBeforeDrag, onStart, onMove, onStop, ...opt} = props; const selection = new VanillaSelectionArea({ - boundaries: areaBoundaries, + boundaries: boundaries as HTMLElement, ...opt }); @@ -36,16 +35,16 @@ export const SelectionArea: React.FunctionComponent = props selection.on('move', evt => props.onMove?.(evt)); selection.on('stop', evt => props.onStop?.(evt)); - setSelection(selection); + setInstance(selection); return () => { selection.destroy(); - setSelection(undefined); + setInstance(undefined); }; }, []); return ( - + {props.boundaries ? ( props.children ) : ( diff --git a/packages/vanilla/src/utils/intersects.ts b/packages/vanilla/src/utils/intersects.ts index 4a67d16..77767ca 100644 --- a/packages/vanilla/src/utils/intersects.ts +++ b/packages/vanilla/src/utils/intersects.ts @@ -1,4 +1,4 @@ -export type Intersection = 'center' | 'cover' | 'touch' +export type Intersection = 'center' | 'cover' | 'touch'; /** * Check if two DOM-Elements intersects each other. diff --git a/packages/vanilla/src/utils/matchesTrigger.ts b/packages/vanilla/src/utils/matchesTrigger.ts index 822bf2d..cfcd8f0 100644 --- a/packages/vanilla/src/utils/matchesTrigger.ts +++ b/packages/vanilla/src/utils/matchesTrigger.ts @@ -10,13 +10,13 @@ export type Modifier = 'ctrl' | 'alt' | 'shift'; -export type Trigger = MouseButton | MouseButtonWithModifiers; - export type MouseButtonWithModifiers = { button: MouseButton, modifiers: Modifier[] }; +export type Trigger = MouseButton | MouseButtonWithModifiers; + /** * Determines whether a MouseEvent should execute until completion depending on * which button and modifier(s) are active for the MouseEvent. diff --git a/packages/vue/src/SelectionArea.vue b/packages/vue/src/SelectionArea.vue index 1d87ae4..4e7fddb 100644 --- a/packages/vue/src/SelectionArea.vue +++ b/packages/vue/src/SelectionArea.vue @@ -6,7 +6,7 @@ +``` + +```tsx [App.tsx] +import React, { useEffect, useRef } from 'react'; +import SelectionArea, { SelectionEvent } from '@viselect/vanilla'; + +export const App = () => { + const container = useRef(null); + const instance = useRef(); + + // Event handlers + const beforeStart = (evt: SelectionEvent) => console.log('beforestart', evt); + const beforeDrag = (evt: SelectionEvent) => console.log('beforedrag', evt); + const start = (evt: SelectionEvent) => console.log('start', evt); + const move = (evt: SelectionEvent) => console.log('move', evt); + const stop = (evt: SelectionEvent) => console.log('stop', evt); + + // Mount the instance and attach events + useEffect(() => { + if (container.current) { + instance.current?.destroy(); + instance.current = new SelectionArea({ + boundaries: container.current, + // ...your options + }); + + // attach events... + instance.current.on('beforestart', beforeStart); + instance.current.on('beforedrag', beforeDrag); + instance.current.on('start', start); + instance.current.on('move', move); + instance.current.on('stop', stop); + } + + return () => instance.current?.destroy(); + }, []); + + return ( +
+ {/* ...elements */} +
+ ); +} +``` + +::: + diff --git a/docs/pages/faq.md b/docs/pages/faq.md index 825a4cf..bcb01bf 100644 --- a/docs/pages/faq.md +++ b/docs/pages/faq.md @@ -2,7 +2,26 @@ outline: deep --- -# Text is selected by default when dragging the mouse over text +# FAQs + +The following are some common questions and answers about `viselect`. + +[[toc]] + +> [!TIP] +> Your question isn't answered here? [Open a discussion](https://github.com/simonwep/viselect/discussions) and ask your question there! +> ...or submit a [PR](https://github.com/simonwep/viselect/compare) or create an [issue](https://github.com/simonwep/viselect/issues/new?assignees=simonwep&labels=&template=feature_request.md&title=) if you got any ideas for more examples! + +## Browser support + +This library will always produce an ESNext bundle. +If you want to support legacy browsers, please use the feature of your bundler to transpile dependencies. +In case of webpack and babel (give [vite](https://vitejs.dev/) a try, it's awesome) you'll have to install corresponding plugins such as [babel-plugin-proposal-optional-chaining](https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining) and include the dependency from `node_modules` which is normally entirely excluded from being processed. + +I do this to provide maximum flexibility and give those who target ESNext a chance to make full use of how this library is bundled. +Everything else is just a matter of configuration :) + +## Preventing text selection To not interfere with text-selection, selection-js won't prevent any default events anymore (as of `v2.0.3`). This, however, can cause problems with the actual selection ("introduced" by [#99](https://github.com/simonwep/viselect/pull/99), reported in [#103](https://github.com/simonwep/viselect/issues/103)). @@ -13,3 +32,91 @@ If you don't care about text-selection, add the following to the container where user-select: none; } ``` + +Another solution is to make the document during a selection non-selectable: + +```ts +selection + .on('beforestart', () => document.body.style.userSelect = 'none') + .on('stop', () => document.body.style.userSelect = 'unset'); +``` + +Issues: [#103](https://github.com/simonwep/viselect/issues/103) + +## Changing selectables during a selection + +In some cases you may add / remove selectables during a selection, especially when it comes to scrolling. +In this case make sure to call `selection.resolveSelectables()` every time you add / remove a selectable so that viselect is aware of the change. +Consult the [api reference](./api-reference.md) for more information. + + +## Allowing the user to scroll with two fingers + +```js +selection.on('beforestart', (() => { + let timeout = null; + + return ({event}) => { + + // Check if user already tapped inside of a selection-area. + if (timeout !== null) { + + // A second pointer-event occured, ignore that one. + clearTimeout(timeout); + timeout = null; + } else { + + // Wait 50ms in case the user uses two fingers to scroll. + timeout = setTimeout(() => { + + // OK User used only one finger, we can safely initiate a selection and reset the timer. + selection.trigger(event); + timeout = null; + }, 50); + } + + // Never start automatically. + return false; + }; +})()); +``` + +Issues: [#70](https://github.com/simonwep/viselect/issues/70) + +## Preventing the start of a selection based on certain conditions + +```js +selection.on('beforestart', ({event}) => { + return !event.path.some(item => { + + // item is in this case an element affected by the event-bubbeling. + // To exclude elements with class "blocked" you could do the following (#73): + return item.classList.contains('blocked'); + + // If the areas you're using contains input elements you might want to prevent + // any out-going selections from these elements (#72): + return event.target.tagName !== 'INPUT'; + }); +}); +``` + +Issues: [#73](https://github.com/simonwep/viselect/issues/73) + +## Preventing select from right click or more + +This is now a default feature with the `triggers` option, see [API reference](./api-reference.md#selectionoptions)! + +```js +selection.on('beforestart', (event) => { + const allowedButtons = [ + // See https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons + 1, // left click + 2, // right click + 4, // mouse wheel / middle button + ]; + + return allowedButtons.includes(event.event.buttons); +}); +``` + +Issues: [#101](https://github.com/simonwep/viselect/issues/101) diff --git a/docs/pages/frameworks/preact.md b/docs/pages/frameworks/preact.md index 2311773..9b27104 100644 --- a/docs/pages/frameworks/preact.md +++ b/docs/pages/frameworks/preact.md @@ -1,14 +1,15 @@ # Using Viselect with Preact -::: tip -This is merely a convenience wrapper around the [core library](./vanilla.md). -The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. -Don't worry, it's not that hard! -::: + + +## Source Code + +You can find the source code for this component [here](https://github.com/simonwep/viselect/blob/master/packages/preact/src/SelectionArea.tsx). +You can use it as template for your own implementation. ## Installation -To use Viselect with Preact, install its Preact package with: +To use Viselect with Preact, install its preact package with: ::: code-group @@ -30,10 +31,14 @@ $ yarn add @viselect/preact You can use Viselect in your Preact project by importing the `SelectionArea` component from the `@viselect/preact` package. -::: tip -All options are exposed as props -They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! -::: +> [!TIP] +> All options are exposed as props. +> They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! + +> [!NOTE] +> Changing the props won't do anything as React doesn't deep-compare props. +> Trigger a re-render by adding and changing the key of the `SelectionArea` component. +> See [#226](https://github.com/simonwep/viselect/issues/226). ::: code-group @@ -44,75 +49,75 @@ import {useState} from 'preact/hooks'; import './styles.css'; const App: FunctionComponent = () => { - const [selected, setSelected] = useState>(() => new Set()); - - const extractIds = (els: Element[]): number[] => - els.map(v => v.getAttribute('data-key')) - .filter(Boolean) - .map(Number); - - const onStart = ({event, selection}: SelectionEvent) => { - if (!event?.ctrlKey && !event?.metaKey) { - selection.clearSelection(); - setSelected(() => new Set()); - } - }; - - const onMove = ({store: {changed: {added, removed}}}: SelectionEvent) => { - setSelected(prev => { - const next = new Set(prev); - extractIds(added).forEach(id => next.add(id)); - extractIds(removed).forEach(id => next.delete(id)); - return next; - }); - }; - - return ( - <> - - {new Array(42).fill(0).map((_, index) => ( -
- ))} - - - ); + const [selected, setSelected] = useState>(() => new Set()); + + const extractIds = (els: Element[]): number[] => + els.map(v => v.getAttribute('data-key')) + .filter(Boolean) + .map(Number); + + const onStart = ({event, selection}: SelectionEvent) => { + if (!event?.ctrlKey && !event?.metaKey) { + selection.clearSelection(); + setSelected(() => new Set()); + } + }; + + const onMove = ({store: {changed: {added, removed}}}: SelectionEvent) => { + setSelected(prev => { + const next = new Set(prev); + extractIds(added).forEach(id => next.add(id)); + extractIds(removed).forEach(id => next.delete(id)); + return next; + }); + }; + + return ( + <> + + {new Array(42).fill(0).map((_, index) => ( +
+ ))} + + + ); } ``` ```css [styles.css] .container { - display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - border: 1px dashed #4f5276; - border-radius: 15px; - padding: 15px; - margin: 15px 0; - user-select: none; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; } .container div { - height: 50px; - width: 50px; - margin: 3px; - background: rgba(66, 68, 90, 0.075); - border-radius: 10px; - cursor: pointer; + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; } div.selected { - background: linear-gradient(45deg, #78b2ff, #218ad9); + background: linear-gradient(45deg, #78b2ff, #218ad9); } .selection-area { - background: rgba(46, 115, 252, 0.11); - border: 1px solid rgba(98, 155, 255, 0.85); - border-radius: 0.15em; + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; } ``` diff --git a/docs/pages/frameworks/react.md b/docs/pages/frameworks/react.md index ec9a6cb..8a97463 100644 --- a/docs/pages/frameworks/react.md +++ b/docs/pages/frameworks/react.md @@ -1,14 +1,10 @@ # Using Viselect with React -::: tip -This is merely a convenience wrapper around the [core library](./vanilla.md). -The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. -Don't worry, it's not that hard! -::: + ## Installation -To use Viselect with React, install its React package with: +To use Viselect with React, install its react package with: ::: code-group @@ -30,10 +26,14 @@ $ yarn add @viselect/react You can use Viselect in your React project by importing the `SelectionArea` component from the `@viselect/react` package. -::: tip -All options are exposed as props -They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! -::: +> [!TIP] +> All options are exposed as direct props. +> They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! + +> [!NOTE] +> Changing the props won't do anything as React doesn't deep-compare props. +> Trigger a re-render by adding and changing the key of the `SelectionArea` component. +> See [#226](https://github.com/simonwep/viselect/issues/226). ::: code-group @@ -43,75 +43,75 @@ import React, {FunctionComponent, useState} from 'react'; import './styles.css'; const App: FunctionComponent = () => { - const [selected, setSelected] = useState>(() => new Set()); - - const extractIds = (els: Element[]): number[] => - els.map(v => v.getAttribute('data-key')) - .filter(Boolean) - .map(Number); - - const onStart = ({ event, selection }: SelectionEvent) => { - if (!event?.ctrlKey && !event?.metaKey) { - selection.clearSelection(); - setSelected(() => new Set()); - } - }; - - const onMove = ({ store: { changed: { added, removed } } }: SelectionEvent) => { - setSelected(prev => { - const next = new Set(prev); - extractIds(added).forEach(id => next.add(id)); - extractIds(removed).forEach(id => next.delete(id)); - return next; - }); - }; - - return ( - <> - - {new Array(42).fill(0).map((_, index) => ( -
- ))} - - - ); + const [selected, setSelected] = useState>(() => new Set()); + + const extractIds = (els: Element[]): number[] => + els.map(v => v.getAttribute('data-key')) + .filter(Boolean) + .map(Number); + + const onStart = ({ event, selection }: SelectionEvent) => { + if (!event?.ctrlKey && !event?.metaKey) { + selection.clearSelection(); + setSelected(() => new Set()); + } + }; + + const onMove = ({ store: { changed: { added, removed } } }: SelectionEvent) => { + setSelected(prev => { + const next = new Set(prev); + extractIds(added).forEach(id => next.add(id)); + extractIds(removed).forEach(id => next.delete(id)); + return next; + }); + }; + + return ( + <> + + {new Array(42).fill(0).map((_, index) => ( +
+ ))} + + + ); } ``` ```css [styles.css] .container { - display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - border: 1px dashed #4f5276; - border-radius: 15px; - padding: 15px; - margin: 15px 0; - user-select: none; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; } .container div { - height: 50px; - width: 50px; - margin: 3px; - background: rgba(66, 68, 90, 0.075); - border-radius: 10px; - cursor: pointer; + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; } div.selected { - background: linear-gradient(45deg, #78b2ff, #218ad9); + background: linear-gradient(45deg, #78b2ff, #218ad9); } .selection-area { - background: rgba(46, 115, 252, 0.11); - border: 1px solid rgba(98, 155, 255, 0.85); - border-radius: 0.15em; + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; } ``` diff --git a/docs/pages/frameworks/vanilla.md b/docs/pages/frameworks/vanilla.md index 99e8a25..0913c04 100644 --- a/docs/pages/frameworks/vanilla.md +++ b/docs/pages/frameworks/vanilla.md @@ -18,17 +18,21 @@ $ pnpm add -D @viselect/vanilla $ yarn add -D @viselect/vanilla ``` +```html [script] + +``` + +```js [module] +import SelectionArea from "https://cdn.jsdelivr.net/npm/@viselect/vanilla/dist/viselect.mjs" +``` + ::: ## Usage -As per our [quickstart](/pages/quickstart.md), you can use Viselect in your project by importing the `SelectionArea` class from the `@viselect/vanilla` package. +As per our [quickstart](../quickstart.md), you can use Viselect in your project by importing the `SelectionArea` class from the `@viselect/vanilla` package. For all the options available, check the [API reference](../api-reference.md#selectionoptions). -::: tip -As already mentioned, it's recommended to start from here _even_ if you're using vue, react, preact or any other framework as the only difference is to take care of the instance creation and destruction. -::: - ::: code-group ```ts [main.ts] @@ -52,7 +56,7 @@ const selection = new SelectionArea({ selectables: ['.container > div'], // Specifies the elements that can be selected boundaries: ['.container'], // Specifies the boundaries of each selection }).on('start', ({ store, event }) => { - if (!event.ctrlKey && !event.metaKey) { + if (!event.ctrlKey && !event.metaKey) { // Clear selection if no modifier key is pressed store.stored.forEach(el => el.classList.remove('selected')); selection.clearSelection(); } @@ -64,37 +68,37 @@ const selection = new SelectionArea({ ```css [styles.css] .container { - display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - border: 1px dashed #4f5276; - border-radius: 15px; - padding: 15px; - margin: 15px 0; - user-select: none; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + border: 1px dashed #4f5276; + border-radius: 15px; + padding: 15px; + margin: 15px 0; + user-select: none; } .container div { - height: 50px; - width: 50px; - margin: 3px; - background: rgba(66, 68, 90, 0.075); - border-radius: 10px; - cursor: pointer; + height: 50px; + width: 50px; + margin: 3px; + background: rgba(66, 68, 90, 0.075); + border-radius: 10px; + cursor: pointer; } .container.green div.selected { - background: linear-gradient(45deg, #78b2ff, #218ad9); + background: linear-gradient(45deg, #78b2ff, #218ad9); } .container.blue div.selected { - background: linear-gradient(45deg, #9e91ef, #5c51b4); + background: linear-gradient(45deg, #9e91ef, #5c51b4); } .selection-area { - background: rgba(46, 115, 252, 0.11); - border: 1px solid rgba(98, 155, 255, 0.85); - border-radius: 0.15em; + background: rgba(46, 115, 252, 0.11); + border: 1px solid rgba(98, 155, 255, 0.85); + border-radius: 0.15em; } ``` diff --git a/docs/pages/frameworks/vue.md b/docs/pages/frameworks/vue.md index 5b9c303..c1ceb8b 100644 --- a/docs/pages/frameworks/vue.md +++ b/docs/pages/frameworks/vue.md @@ -1,14 +1,15 @@ # Using Viselect with Vue -::: tip -This is merely a convenience wrapper around the [core library](./vanilla.md). -The core API is fairly simple, if you want to have full control over it, you should [roll out your own wrapper](../custom-integration.md) in your app. -Don't worry, it's not that hard! -::: + + +## Source Code + +You can find the source code for this component [here](https://github.com/simonwep/viselect/blob/master/packages/vue/src/SelectionArea.vue). +You can use it as template for your own implementation. ## Installation -To use Viselect with Vue, install its Vue package with: +To use Viselect with Vue, install its vue package with: ::: code-group @@ -30,14 +31,12 @@ $ yarn add @viselect/vue You can use Viselect in your Vue project by importing the `SelectionArea` component from the `@viselect/vue` package. -::: tip -All options are exposed as `options` prop. -They're a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! -::: +> [!TIP] +> All options are exposed as `options` prop, events can be passed as props suffixed with `on`. +> The options are a one-to-one mapping of the original options describe [here](../api-reference.md#selectionoptions)! -::: info -Events are handled using props because you can’t return a value in events synchronously! -::: +> [!NOTE] +> Events are handled using props because you can’t return a value in events synchronously. ```vue [App.vue] + + diff --git a/docs/demos/DemoSimple.vue b/docs/demos/DemoSimple.vue new file mode 100644 index 0000000..766209f --- /dev/null +++ b/docs/demos/DemoSimple.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/docs/index.md b/docs/index.md index ee42f2f..74d9c4a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ hero: name: "Viselect" text: "Visual Selection Library" tagline: "A modern, ultra-tiny, and highly optimized selection library" - image: + image: src: logo.png alt: Viselect logo actions: @@ -15,6 +15,9 @@ hero: - theme: alt text: API Reference link: pages/api-reference + - theme: alt + text: Examples + link: pages/examples features: - icon: 🌟 diff --git a/docs/pages/api-reference.md b/docs/pages/api-reference.md index 2adb5e9..360a1b0 100644 --- a/docs/pages/api-reference.md +++ b/docs/pages/api-reference.md @@ -24,7 +24,7 @@ Events are bind/unbind using the [on](#on--addeventlistener) and [off](#off--rem selection.on('beforestart', evt => { // Use this event to decide whether a selection should take place or not. - // For example if the user should be able to normally interact with input-elements you + // For example if the user should be able to normally interact with input-elements you // may want to prevent a selection if the user clicks such a element: // selection.on('beforestart', ({event}) => { // return event.target.tagName !== 'INPUT'; // Returning false prevents a selection @@ -266,28 +266,64 @@ deselect(query: SelectAllSelectors, quiet = false): Element[]; ## Types -### `DeepPartial` +### `SelectionOptions` -> [!WARNING] -> Internal type, subject to change at any time. +An interface representing selection options, this is after defaults have been applied. +A detailed explanation of each option can be found under [Quickstart](./quickstart.html#configuration)! -A type that makes all properties in `T` optional and allows for nested optional properties. +It consists of the following interfaces: ```typescript -type DeepPartial = T extends unknown[] ? T : T extends HTMLElement ? T : { [P in keyof T]?: DeepPartial; }; -``` +interface SingleTap { + allow: boolean; + intersect: TapMode; +} -### `Quantify` +interface Features { + deselectOnBlur: boolean; + singleTap: SingleTap; + range: boolean; + touch: boolean; +} -> [!WARNING] -> Internal type, subject to change at any time. +interface Scrolling { + speedDivider: number; + manualSpeed: number; + startScrollMargins: {x: number, y: number}; +} -A type that allows `T` to be an array or a single value. +interface Behaviour { + intersect: Intersection; + startThreshold: number | Coordinates; + overlap: OverlapMode; + scrolling: Scrolling; + triggers: Trigger[]; +} + +interface SelectionOptions { + selectionAreaClass: string; + selectionContainerClass: string | undefined; + container: Quantify; + document: Document; + selectables: Quantify; + startAreas: Quantify; + boundaries: Quantify; + behaviour: Behaviour; + features: Features; +} +``` + +### `PartialSelectionOptions` + +Type of what can be passed to the `SelectionArea` constructor. ```typescript -type Quantify = T[] | T; +type PartialSelectionOptions = DeepPartial> & { + document?: Document; +}; ``` + ### `ScrollEvent` An interface that extends `MouseEvent` with additional properties. @@ -410,57 +446,23 @@ type OverlapMode = 'keep' | 'drop' | 'invert'; - `drop` - Deselect the element. - `invert` - Deselect the element if it is selected, otherwise select it (default). -### `SelectionOptions` - -An interface representing selection options, this is after defaults have been applied. -It consists of the following interfaces: - -```typescript -interface SingleTap { - allow: boolean; - intersect: TapMode; -} +## Internal types -interface Features { - deselectOnBlur: boolean; - singleTap: SingleTap; - range: boolean; - touch: boolean; -} +> [!WARNING] +> Internal type, subject to change at any time. -interface Scrolling { - speedDivider: number; - manualSpeed: number; - startScrollMargins: {x: number, y: number}; -} +### `DeepPartial` -interface Behaviour { - intersect: Intersection; - startThreshold: number | Coordinates; - overlap: OverlapMode; - scrolling: Scrolling; - triggers: Trigger[]; -} +A type that makes all properties in `T` optional and allows for nested optional properties. -interface SelectionOptions { - selectionAreaClass: string; - selectionContainerClass: string | undefined; - container: Quantify; - document: Document; - selectables: Quantify; - startAreas: Quantify; - boundaries: Quantify; - behaviour: Behaviour; - features: Features; -} +```typescript +type DeepPartial = T extends unknown[] ? T : T extends HTMLElement ? T : { [P in keyof T]?: DeepPartial; }; ``` -### `PartialSelectionOptions` +### `Quantify` -Type of what can be passed to the `SelectionArea` constructor. +A type that allows `T` to be an array or a single value. ```typescript -type PartialSelectionOptions = DeepPartial> & { - document?: Document; -}; +type Quantify = T[] | T; ``` diff --git a/docs/pages/custom-integration.md b/docs/pages/custom-integration.md index c09119c..0ca4134 100644 --- a/docs/pages/custom-integration.md +++ b/docs/pages/custom-integration.md @@ -1,4 +1,4 @@ -# Integrating Viselect into _anything_ +# Integrating Viselect into _anything_ As mentioned in the [quickstart](./quickstart.md), Viselect is a framework-agnostic library. This means that you can use it with any framework or library you want. @@ -9,9 +9,9 @@ Don't worry, there aren't many differences between the integrations, and after y ## Lifecycle Generally, viselect is instantiated once and should be re-created once the options need to change. -Don't worry, instantiating and destroying the selection area is a lightweight operation and won't cause any major performance issues. +Don't worry, instantiating and destroying the selection area is a lightweight operation and won't cause any performance issues. -Example based on vue and react: +Copy-paste ready examples for Vue and React: ::: code-group diff --git a/docs/pages/examples.md b/docs/pages/examples.md new file mode 100644 index 0000000..3e707c5 --- /dev/null +++ b/docs/pages/examples.md @@ -0,0 +1,37 @@ +--- +outline: deep +--- + + + + +# Examples + +> [!TIP] +> This document provides a few examples of how this library can be used in practice. +> Head over to [Quickstart](./quickstart.md) to get started! + +### Simple Selection + +A single, simple box with a standard behaviour as you know it from your trusty file explorer. +Press `Ctrl` / `Cmd` to select multiple items, or deselect items by clicking on them again. +Press `Shift` to select a range of items after selecting one ore more before. + + + +> You can find the source code for this example [here](https://github.com/simonwep/viselect/blob/master/docs/demos/DemoSimple.vue). +> Under [Quickstart](./quickstart.md) you can find a step-by-step guide on how to create this example from scratch! + +### Scrollable Container + +A container that can be scrolled in both directions. +The selection area will automatically adjust to the scroll position and size of the container. + + + +> You can find the source code for this example [here](https://github.com/simonwep/viselect/blob/master/docs/demos/DemoScrollable.vue) + + diff --git a/docs/pages/faq.md b/docs/pages/faq.md index bcb01bf..af90133 100644 --- a/docs/pages/faq.md +++ b/docs/pages/faq.md @@ -83,7 +83,7 @@ selection.on('beforestart', (() => { Issues: [#70](https://github.com/simonwep/viselect/issues/70) -## Preventing the start of a selection based on certain conditions +## Preventing the start of a selection based on certain conditions ```js selection.on('beforestart', ({event}) => { diff --git a/docs/pages/quickstart.md b/docs/pages/quickstart.md index f7ac498..068ed47 100644 --- a/docs/pages/quickstart.md +++ b/docs/pages/quickstart.md @@ -115,10 +115,10 @@ onMounted(() => { const rows = 3; const totalBoxMargin = 4 * 2 * (boxes / rows); const boxWidth = (width - 20 - 4 - totalBoxMargin) / ((boxes / rows)); - + [[styles.purple, boxes], [styles.blue, boxes]].forEach(([selector, items]) => { const container = document.querySelector(`.${selector}`); - + for (let i = 0; i < items; i++) { const div = document.createElement('div'); div.style.width = div.style.height = `${Math.floor(boxWidth)}px`; @@ -138,7 +138,7 @@ onMounted(() => { }).on('move', ({ store: { changed: { added, removed } } }) => { added.forEach(el => el.classList.add(styles.selected)); removed.forEach(el => el.classList.remove(styles.selected)); - }); + }); }); @@ -243,7 +243,7 @@ const selection = new SelectionArea({ // trigger property should look like // // triggers: [ { button: 0, modifiers: [ "ctrl", "shift" ] }, 2 ] - // + // // The default value is [0], enabling only the main mouse button (usually left click). // On mac the ctrl will act as the meta key. triggers: [0], @@ -255,7 +255,7 @@ const selection = new SelectionArea({ // Default is 10 to provide a enjoyable scroll experience. speedDivider: 10, - // Browsers handle mouse-wheel events differently, this number will be used as + // Browsers handle mouse-wheel events differently, this number will be used as // numerator to calculate the mount of px while scrolling manually: manualScrollSpeed / scrollSpeedDivider. manualSpeed: 750,