From 0b7a72dc5d75524ee86b8bbef4a740ed332f6133 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 20:52:02 +0100 Subject: [PATCH 1/5] Updated to 0.2.0 --- docs/advanced/00-performance-benchmarking.md | 181 +++++++++++ docs/advanced/01-customizing-the-engine.md | 261 ++++++++++++++++ docs/advanced/02-internals-macros.md | 132 ++++++++ docs/advanced/03-contributing.md | 116 +++++++ docs/concepts/00-architecture.md | 95 ++++++ docs/concepts/01-the-component-model.md | 108 +++++++ docs/concepts/02-reactive-state-flow.md | 115 +++++++ docs/concepts/03-event-propagation.md | 105 +++++++ docs/concepts/04-rendering-pipeline.md | 76 +++++ docs/guides/00-creating-components.md | 124 ++++++++ docs/guides/01-rsx-syntax.md | 193 ++++++++++++ docs/guides/02-state-management.md | 196 ++++++++++++ docs/guides/03-event-handling.md | 285 ++++++++++++++++++ docs/guides/04-lifecycle-hooks.md | 150 +++++++++ docs/guides/05-data-flow-and-sync.md | 216 +++++++++++++ docs/guides/06-building-complex-layouts.md | 156 ++++++++++ docs/intro/00-introduction.md | 33 ++ docs/intro/01-installation.md | 44 +++ docs/intro/02-getting-started.md | 90 ++++++ docs/intro/03-example-basic-component.md | 113 +++++++ docs/reference/00-crate-structure.md | 51 ++++ docs/reference/component-api.md | 118 ++++++++ docs/reference/engine-api.md | 164 ++++++++++ docs/reference/frontend-api.md | 78 +++++ docs/reference/macros-api.md | 212 +++++++++++++ docs/reference/render-api.md | 100 ++++++ docs/reference/state-api.md | 166 ++++++++++ .../advanced/00-performance-benchmarking.md | 181 +++++++++++ .../advanced/01-customizing-the-engine.md | 261 ++++++++++++++++ .../advanced/02-internals-macros.md | 132 ++++++++ .../version-0.2.0/advanced/03-contributing.md | 116 +++++++ .../version-0.2.0/concepts/00-architecture.md | 95 ++++++ .../concepts/01-the-component-model.md | 108 +++++++ .../concepts/02-reactive-state-flow.md | 115 +++++++ .../concepts/03-event-propagation.md | 105 +++++++ .../concepts/04-rendering-pipeline.md | 76 +++++ .../guides/00-creating-components.md | 124 ++++++++ .../version-0.2.0/guides/01-rsx-syntax.md | 193 ++++++++++++ .../guides/02-state-management.md | 196 ++++++++++++ .../version-0.2.0/guides/03-event-handling.md | 285 ++++++++++++++++++ .../guides/04-lifecycle-hooks.md | 150 +++++++++ .../guides/05-data-flow-and-sync.md | 216 +++++++++++++ .../guides/06-building-complex-layouts.md | 156 ++++++++++ .../version-0.2.0/intro/00-introduction.md | 33 ++ .../version-0.2.0/intro/01-installation.md | 44 +++ .../version-0.2.0/intro/02-getting-started.md | 90 ++++++ .../intro/03-example-basic-component.md | 113 +++++++ .../reference/00-crate-structure.md | 51 ++++ .../version-0.2.0/reference/component-api.md | 118 ++++++++ .../version-0.2.0/reference/engine-api.md | 164 ++++++++++ .../version-0.2.0/reference/frontend-api.md | 78 +++++ .../version-0.2.0/reference/macros-api.md | 212 +++++++++++++ .../version-0.2.0/reference/render-api.md | 100 ++++++ .../version-0.2.0/reference/state-api.md | 166 ++++++++++ .../version-0.2.0-sidebars.json | 8 + versions.json | 1 + 56 files changed, 7365 insertions(+) create mode 100644 docs/advanced/00-performance-benchmarking.md create mode 100644 docs/advanced/01-customizing-the-engine.md create mode 100644 docs/advanced/02-internals-macros.md create mode 100644 docs/advanced/03-contributing.md create mode 100644 docs/concepts/00-architecture.md create mode 100644 docs/concepts/01-the-component-model.md create mode 100644 docs/concepts/02-reactive-state-flow.md create mode 100644 docs/concepts/03-event-propagation.md create mode 100644 docs/concepts/04-rendering-pipeline.md create mode 100644 docs/guides/00-creating-components.md create mode 100644 docs/guides/01-rsx-syntax.md create mode 100644 docs/guides/02-state-management.md create mode 100644 docs/guides/03-event-handling.md create mode 100644 docs/guides/04-lifecycle-hooks.md create mode 100644 docs/guides/05-data-flow-and-sync.md create mode 100644 docs/guides/06-building-complex-layouts.md create mode 100644 docs/intro/00-introduction.md create mode 100644 docs/intro/01-installation.md create mode 100644 docs/intro/02-getting-started.md create mode 100644 docs/intro/03-example-basic-component.md create mode 100644 docs/reference/00-crate-structure.md create mode 100644 docs/reference/component-api.md create mode 100644 docs/reference/engine-api.md create mode 100644 docs/reference/frontend-api.md create mode 100644 docs/reference/macros-api.md create mode 100644 docs/reference/render-api.md create mode 100644 docs/reference/state-api.md create mode 100644 versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md create mode 100644 versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md create mode 100644 versioned_docs/version-0.2.0/advanced/02-internals-macros.md create mode 100644 versioned_docs/version-0.2.0/advanced/03-contributing.md create mode 100644 versioned_docs/version-0.2.0/concepts/00-architecture.md create mode 100644 versioned_docs/version-0.2.0/concepts/01-the-component-model.md create mode 100644 versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md create mode 100644 versioned_docs/version-0.2.0/concepts/03-event-propagation.md create mode 100644 versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md create mode 100644 versioned_docs/version-0.2.0/guides/00-creating-components.md create mode 100644 versioned_docs/version-0.2.0/guides/01-rsx-syntax.md create mode 100644 versioned_docs/version-0.2.0/guides/02-state-management.md create mode 100644 versioned_docs/version-0.2.0/guides/03-event-handling.md create mode 100644 versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md create mode 100644 versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md create mode 100644 versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md create mode 100644 versioned_docs/version-0.2.0/intro/00-introduction.md create mode 100644 versioned_docs/version-0.2.0/intro/01-installation.md create mode 100644 versioned_docs/version-0.2.0/intro/02-getting-started.md create mode 100644 versioned_docs/version-0.2.0/intro/03-example-basic-component.md create mode 100644 versioned_docs/version-0.2.0/reference/00-crate-structure.md create mode 100644 versioned_docs/version-0.2.0/reference/component-api.md create mode 100644 versioned_docs/version-0.2.0/reference/engine-api.md create mode 100644 versioned_docs/version-0.2.0/reference/frontend-api.md create mode 100644 versioned_docs/version-0.2.0/reference/macros-api.md create mode 100644 versioned_docs/version-0.2.0/reference/render-api.md create mode 100644 versioned_docs/version-0.2.0/reference/state-api.md create mode 100644 versioned_sidebars/version-0.2.0-sidebars.json diff --git a/docs/advanced/00-performance-benchmarking.md b/docs/advanced/00-performance-benchmarking.md new file mode 100644 index 0000000..36a4ffb --- /dev/null +++ b/docs/advanced/00-performance-benchmarking.md @@ -0,0 +1,181 @@ +markdown +--- +sidebar_position: 0 +title: Performance Benchmarking +--- + +# Performance Benchmarking + +Optimizing rendering performance is crucial for smooth and responsive TUI applications, especially those with complex layouts or frequent updates. OSUI provides a built-in `Benchmark` engine wrapper that allows you to easily measure the rendering speed of your components. + +## The `Benchmark` Engine + +The `osui::engine::benchmark` module offers the `Benchmark` struct, which wraps an existing engine (like `Console`) and records detailed timing information for its rendering cycles. + +### How it works: + +1. You instantiate a `Benchmark` by passing it another `Engine` (e.g., `Console::new()`). +2. When you call `benchmark_engine.run(YourApp {})`, the `Benchmark` engine takes over. +3. Instead of running the application indefinitely, it performs a fixed number of render cycles (defaulting to 40 in `Benchmark::run`). +4. For each cycle, it precisely measures the time taken to `render` your root component. +5. After all cycles, it clears the screen and returns a `BenchmarkResult` containing statistics. + +## `BenchmarkResult` + +The `BenchmarkResult` struct holds the collected performance metrics: + +```rust +pub struct BenchmarkResult { + pub average: u128, // Average render time in microseconds + pub min: u128, // Minimum render time in microseconds + pub max: u128, // Maximum render time in microseconds + pub total_render: u128, // Sum of all render times in microseconds + pub total: u128, // Total time spent during the benchmark (including setup) +} +``` + +These values are typically in microseconds (`µs`). + +## Basic Usage Example + +Let's use the `simple_benchmark.rs` example to see the `Benchmark` engine in action: + +```rust title="examples/simple_benchmark.rs" +use osui::prelude::*; +use std::sync::Arc; // Needed for Arc + +pub fn main() { + // 1. Create a Console engine instance. + let console_engine = Console::new(); + + // 2. Wrap it with the Benchmark engine. + let benchmark_engine = Benchmark::new(console_engine); + + // 3. Run your application (or component) through the Benchmark engine. + let benchmark_result = benchmark_engine.run(App {}).expect("Failed to run benchmark"); + + // 4. Print the results. + println!("Avg: {} μs", benchmark_result.average); + println!("Min: {} μs", benchmark_result.min); + println!("Max: {} μs", benchmark_result.max); + println!("Tot: {} μs", benchmark_result.total); + println!("Tot Render: {} μs", benchmark_result.total_render); +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + "Hello, world!" + } + .view(&cx) +} +``` + +To run this example: + +```bash +cargo run --example simple_benchmark +``` + +You will see output similar to: + +``` +Avg: 1078 μs +Min: 1078 μs +Max: 1078 μs +Tot: 43120 μs +Tot Render: 43120 μs +``` +*(Note: Actual values will vary based on your system and terminal emulator.)* + +## Advanced Usage: Benchmarking Complex Scenarios + +The `benchmark.rs` example demonstrates how to benchmark nested components and iterate through different complexity levels. This is useful for identifying performance bottlenecks in specific UI patterns. + +```rust title="examples/benchmark.rs" +use osui::prelude::*; +use std::collections::HashMap; // Needed for HashMap + +pub fn main() { + let engine = Arc::new(Benchmark::new(Console::new())); // Wrap Console in Benchmark, then Arc it. + + let mut benchmark_results: HashMap<(usize, usize), BenchmarkResult> = HashMap::new(); + + // Iterate through different levels of nesting (n) and iterations (i) + for i in 0..15 { + for n in 0..15 { + let res = { + let mut results = Vec::with_capacity(6); + + // Run each specific benchmark configuration multiple times (e.g., 6) + // to get more consistent results, then pick the median (index 3 after sort). + for _ in 0..6 { + results.push( + engine + .run(App { + n: n * 72, // Scale nesting depth + i: i * 72, // Scale iteration count (for loops) + }) + .expect("Failed to run engine"), + ); + } + + results.sort_by_key(|r| r.total_render); // Sort by total render time + results[3].clone() // Take the median result + }; + + benchmark_results.insert((i, n as usize), res); + } + } + + // Output results in CSV format + println!("Iterx72,Nestingx72,Time µs"); + for ((i, n), bench) in benchmark_results.iter() { + println!("{i},{n},{}", bench.total_render); + } +} + +// A recursive component that creates nested children and loops +#[component] +fn App(cx: &Arc, n: usize, i: usize) -> View { + let n = n.clone(); // Clone props for closure (necessary for #[component] macro) + let i = i.clone(); + + if n == 0 { + // Base case: deepest level, render a simple string + rsx! { + "Hello, world!" + } + .view(&cx) + } else { + // Recursive case: create `i` number of children, each with reduced nesting `n-1` + rsx! { + @for _ in (0..i) { // Loop `i` times + App { n: n - 1, i: 0 } // Create a nested App component + } + } + .view(&cx) + } +} +``` + +This example: +* Uses an `Arc` to allow `run` to be called multiple times. +* Iterates through different `n` (nesting depth) and `i` (number of children in a loop) values. +* Runs each configuration multiple times and takes the median `total_render` to reduce noise. +* Prints the results in CSV format, which can be easily imported into spreadsheet software for analysis (like the `benchmark.csv` in the repository). + +## Interpreting Results + +* **`average`, `min`, `max`**: Provide insight into the consistency of your rendering performance. A large difference between `min` and `max` might indicate inconsistencies or external factors affecting performance. +* **`total_render`**: The sum of all individual render cycle times. This is often the most important metric for overall performance. +* **`total`**: The total time for the benchmark process, including setup. This is less about rendering speed and more about the overhead of the benchmark itself. + +When analyzing benchmarks, look for: +* **Linear vs. Non-linear Scaling**: How does `total_render` increase as you increase nesting depth or the number of components? Ideally, it should scale linearly. +* **Bottlenecks**: Can you isolate which components or `rsx!` patterns (e.g., complex loops, many dynamic scopes) contribute most to render time? +* **Regression**: Use benchmarks in your CI/CD pipeline to detect performance regressions introduced by new code. + +By leveraging OSUI's `Benchmark` engine, you can gain valuable insights into your TUI application's performance characteristics and make data-driven decisions for optimization. + +**Next:** Learn how to customize OSUI by [Implementing a Custom Engine](./01-customizing-the-engine.md). diff --git a/docs/advanced/01-customizing-the-engine.md b/docs/advanced/01-customizing-the-engine.md new file mode 100644 index 0000000..658879f --- /dev/null +++ b/docs/advanced/01-customizing-the-engine.md @@ -0,0 +1,261 @@ +markdown +--- +sidebar_position: 1 +title: Customizing the Engine +--- + +# Customizing the Engine + +OSUI's `Engine` and `CommandExecutor` traits are designed to be highly extensible. While the `Console` engine provides `crossterm`-based terminal rendering, you might want to create a custom engine for various reasons: + +* **Different Rendering Backend**: Render to a graphical window (e.g., using `minifb` or `pixels`), a web canvas, or a specific hardware display. +* **Headless Testing**: Create a dummy engine that doesn't render anything but processes all commands and component logic, useful for fast unit or integration tests. +* **Logging/Debugging**: An engine that logs all `DrawInstruction`s to a file for analysis. +* **Specialized Behavior**: Implement custom render loops, input handling, or command processing. + +This guide will walk you through the process of implementing your own `Engine` and `CommandExecutor`. + +## Implementing `CommandExecutor` + +First, let's define a custom `CommandExecutor`. This trait is responsible for processing commands issued by components (e.g., `cx.stop()`). + +```rust +use osui::prelude::*; +use std::{ + any::Any, + sync::{Arc, Mutex}, +}; + +// Define a custom command +#[derive(Debug, Clone)] +pub struct CustomCommand(pub String); + +impl Command for CustomCommand { + fn as_any(&self) -> &dyn Any { + self + } +} + +pub struct MyCustomExecutor { + running: Mutex, + received_commands: Mutex>, +} + +impl MyCustomExecutor { + pub fn new() -> Arc { + Arc::new(Self { + running: Mutex::new(true), + received_commands: Mutex::new(Vec::new()), + }) + } + + pub fn stop_engine(&self) -> crate::Result<()> { + *self.running.lock()? = false; + Ok(()) + } + + pub fn get_status(&self) -> bool { + *self.running.lock().unwrap() + } + + pub fn get_received_commands(&self) -> Vec { + self.received_commands.lock().unwrap().clone() + } +} + +impl CommandExecutor for MyCustomExecutor { + fn execute_command(&self, command: &Arc) -> crate::Result<()> { + let command_any = command.as_any(); + + // Handle built-in Stop command + if let Some(commands::Stop) = command_any.downcast_ref::() { + println!("MyCustomExecutor: Received Stop command."); + return self.stop_engine(); + } + + // Handle our custom command + if let Some(custom_cmd) = command_any.downcast_ref::() { + println!("MyCustomExecutor: Received CustomCommand: {:?}", custom_cmd); + self.received_commands.lock().unwrap().push(custom_cmd.clone()); + return Ok(()); + } + + println!("MyCustomExecutor: Unhandled command."); + Ok(()) + } +} +``` + +## Implementing `Engine` + +Now, let's create a simple "headless" engine that doesn't draw to the terminal but just logs rendering events. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +pub struct MyHeadlessEngine { + executor: Arc, + log_output: Mutex>, +} + +impl MyHeadlessEngine { + pub fn new() -> Self { + Self { + executor: MyCustomExecutor::new(), + log_output: Mutex::new(Vec::new()), + } + } + + // Helper to log messages + fn log(&self, msg: &str) { + self.log_output.lock().unwrap().push(msg.to_string()); + } + + pub fn get_log(&self) -> Vec { + self.log_output.lock().unwrap().clone() + } +} + +impl Engine for MyHeadlessEngine { + fn run(&self, component: C) -> crate::Result<()> { + self.log("Engine: Initializing component..."); + let cx = self.init(component); + + while self.executor.get_status() { + self.log("Engine: Starting render cycle..."); + self.render(&cx); + self.log("Engine: Render cycle complete. Delaying..."); + self.render_delay(); // Use default delay or implement custom + } + + self.log("Engine: Application stopped."); + Ok(()) + } + + fn init(&self, component: C) -> Arc { + // Perform any setup needed for your custom engine + self.log("Engine: Component initialized."); + let cx = Context::new(component, self.executor.clone()); + cx.refresh(); // Initial render of the component + cx + } + + fn render(&self, cx: &Arc) { + let area = Area { x: 0, y: 0, width: 80, height: 24 }; // Define a virtual screen size + let draw_ctx = self.render_view(&area, &cx.get_view()); + self.draw_context(&draw_ctx); + } + + // No actual delay for headless, or keep default for testing loop speed + fn render_delay(&self) { + // crate::sleep(16); // Uncomment for actual delay + } + + fn render_view(&self, area: &Area, view: &View) -> DrawContext { + self.log(&format!("Engine: Rendering view in area: {:?}", area)); + let mut context = DrawContext::new(area.clone()); + view(&mut context); // Execute the View closure to populate DrawContext + context + } + + fn draw_context(&self, ctx: &DrawContext) { + self.log(&format!("Engine: Drawing context with {} instructions.", ctx.drawing.len())); + for inst in &ctx.drawing { + match inst { + DrawInstruction::Text(point, text) => self.log(&format!(" Draw Text at {:?}: '{}'", point, text)), + DrawInstruction::View(area, view) => { + self.log(&format!(" Draw Child View in area: {:?}", area)); + self.draw_context(&self.render_view(area, view)); // Recursively render child views + }, + DrawInstruction::Child(point, child_ctx) => { + self.log(&format!(" Draw Child DrawContext at {:?}.", point)); + self.draw_context(child_ctx); // Recursively draw child contexts + }, + } + } + } + + fn executor(&self) -> Arc { + self.executor.clone() + } +} +``` + +## Using Your Custom Engine + +```rust +use osui::prelude::*; +use std::sync::Arc; + +// (Include MyHeadlessEngine, MyCustomExecutor, CustomCommand definitions here) + +#[component] +fn MyApp(cx: &Arc) -> View { + let counter = use_state(0); + + use_effect( + { + let cx = cx.clone(); + let counter = counter.clone(); + move || { + // Periodically increment counter and emit custom command + loop { + sleep(200); + let new_val = *counter.get() + 1; + counter.set(new_val); + if new_val >= 3 { + cx.execute(CustomCommand(format!("Counter reached {}", new_val))).expect("Cmd failed"); + cx.stop().expect("Stop failed"); + break; + } + } + } + }, + &[], // Run once on mount + ); + + rsx! { + format!("Counter value: {}", counter.get_dl()) + }.view(&cx) +} + +fn main() { + let my_engine = MyHeadlessEngine::new(); + let executor = my_engine.executor.clone(); // Get a reference to the executor + + my_engine.run(MyApp {}).expect("Failed to run custom engine"); + + println!("\n--- Engine Log ---"); + for line in my_engine.get_log() { + println!("{}", line); + } + + println!("\n--- Received Commands ---"); + for cmd in executor.get_received_commands() { + println!("{:?}", cmd); + } +} +``` + +### Explanation: + +1. **`MyCustomExecutor`**: Implements `CommandExecutor`. It handles the built-in `commands::Stop` and our new `CustomCommand`. It also keeps a log of received custom commands for verification. +2. **`MyHeadlessEngine`**: Implements `Engine`. + * It takes `MyCustomExecutor` as its command executor. + * `run` method establishes a basic loop that continues as long as `executor.get_status()` is `true`. + * `render` orchestrates the `render_view` and `draw_context` calls. + * `render_view` executes the component `View` and collects `DrawInstruction`s. + * `draw_context` iterates through `DrawInstruction`s, logging them instead of actually drawing to a terminal. It recursively handles `DrawInstruction::View` and `DrawInstruction::Child`. +3. **`MyApp` Component**: + * Uses `use_state` for a counter. + * Uses `use_effect` to periodically increment the counter. + * When the counter reaches 3, it `execute`s our `CustomCommand` and then `stop()`s the engine. +4. **`main` Function**: + * Instantiates `MyHeadlessEngine`. + * Calls `my_engine.run(MyApp {})`. + * After the engine stops, it prints the internal log and received commands from the executor, allowing you to verify that component logic and commands were processed correctly. + +By following this pattern, you can integrate OSUI's powerful component and state management system with virtually any rendering or execution environment you desire. + +**Next:** Dive into the internals of OSUI's macro system in [Internals: Macros](./02-internals-macros.md). diff --git a/docs/advanced/02-internals-macros.md b/docs/advanced/02-internals-macros.md new file mode 100644 index 0000000..21e671c --- /dev/null +++ b/docs/advanced/02-internals-macros.md @@ -0,0 +1,132 @@ +markdown +--- +sidebar_position: 2 +title: Internals: Macros +--- + +# Internals: Macros + +OSUI heavily relies on procedural macros to provide its ergonomic, declarative syntax. The `osui-macros` crate contains the logic for the `#[component]` attribute macro and the `rsx!` function macro. Understanding how these macros work under the hood gives you a deeper insight into OSUI's architecture and capabilities. + +## Introduction to Procedural Macros + +Procedural macros are functions that operate on the Rust syntax tree (Abstract Syntax Tree or AST) during compilation. They receive `TokenStream`s as input and produce `TokenStream`s as output, effectively transforming your code. OSUI's macros leverage the following crates: + +* **`syn`**: A parser for Rust's syntax tree. It allows macros to parse input `TokenStream`s into structured Rust AST types (like `ItemFn`, `Expr`, `Path`, etc.). +* **`quote`**: A quasiquoting library that makes it easy to generate Rust code (as `TokenStream`s) from AST fragments. +* **`proc-macro2`**: Provides types like `TokenStream` and `Ident` that are compatible with `syn` and `quote`, enabling ergonomic manipulation of tokens. + +## `#[component]` Attribute Macro (`macros/src/lib.rs`) + +The `#[component]` macro transforms a Rust function into an OSUI component struct. + +### Input + +It takes an `ItemFn` (the parsed function definition) as input. + +```rust +// Original function in user's code +#[component] +pub fn MyComponent(cx: &Arc, prop1: &String, prop2: &i32) -> View { + // ... function body ... +} +``` + +### Core Logic + +1. **Parse Function Signature**: + * It extracts the function's name (`MyComponent`). + * It validates the first argument `cx: &Arc`. + * It iterates through the remaining arguments (`prop1: &String`, `prop2: &i32`), which become the component's props. +2. **Generate Component Struct**: For each prop parameter, it determines the *owned* type (e.g., `&String` becomes `String`, `&i32` becomes `i32`). It then uses `quote!` to generate a new struct: + ```rust + pub struct MyComponent { + pub prop1: String, // Owned types + pub prop2: i32, + } + ``` +3. **Implement `ComponentImpl`**: It then generates an `impl ComponentImpl for MyComponent` block. The `call` method of this trait: + * Takes `&self` and `cx: &Arc`. + * Internally calls a generated `Self::component` method (which is your original function's body). + * Passes `cx` and references (`&self.prop1`, `&self.prop2`) to the stored props from the generated struct. + ```rust + impl MyComponent { + // This is your original function, renamed and wrapped + pub fn component(cx: &Arc, prop1: &str, prop2: &i32) -> View { /* ... body ... */ } + } + + impl ComponentImpl for MyComponent { + fn call(&self, cx: &Arc) -> View { + Self::component(cx, &self.prop1, &self.prop2) // Pass references to owned props + } + } + ``` + +### Output + +The macro replaces the original function with the generated struct, its `component` method, and the `ComponentImpl` implementation. This transformation makes `MyComponent` a valid OSUI component that can be instantiated with props in `rsx!`. + +## `rsx!` Function Macro (`macros/src/parse.rs` & `macros/src/emit.rs`) + +The `rsx!` macro is more complex, involving a two-step process: parsing the custom syntax and then emitting standard Rust code. + +### 1. Parsing (`macros/src/parse.rs`) + +The `parse` module defines an AST (Abstract Syntax Tree) for the `rsx!` syntax. + +* **`RsxRoot`**: The top-level container, holding a vector of `RsxNode`s. +* **`RsxNode`**: An enum representing different types of nodes in the `rsx!` tree: + * `Text(LitStr)`: For `"Hello"` literals. + * `Expr(Expr)`: For `@{some_expression}` blocks. + * `Component { path: Path, props: Vec, children: Vec }`: For `MyComponent { prop: val, ... }`. + * `Mount(Ident)`: For `!my_mount_hook`. + * `If { deps: Vec, cond: Expr, children: Vec }`: For `@if condition { ... }`. + * `For { deps: Vec, pat: Pat, expr: Expr, children: Vec }`: For `@for item in items { ... }`. +* **`RsxProp`**: Represents a `name: value` pair for component props. +* **`Dep`**: Represents a dependency for dynamic blocks (`%my_state as my_alias`). + +The `parse::RsxRoot::parse` method uses `syn`'s `ParseStream` to tokenize the `rsx!` input and build this AST. It intelligently differentiates between text, expressions, component names, and control flow keywords (`@if`, `@for`, `!`). + +### 2. Emitting (`macros/src/emit.rs`) + +The `emit` module takes the parsed `RsxRoot` AST and converts it into a `TokenStream` of standard Rust code that constructs `osui::frontend::Rsx` objects. + +* **`emit_rsx(root: RsxRoot)`**: The entry point, which initializes an `osui::frontend::Rsx` object and then iterates through the `root.nodes`. +* **`emit_node_scope(node: &RsxNode)`**: For each `RsxNode`, it generates code that calls the appropriate `Rsx` builder method: + * **`RsxNode::Text`**: Emits `r.static_scope(move |scope| { scope.view(...) });` which draws text. + * **`RsxNode::Expr`**: Emits `r.child(expression);`. + * **`RsxNode::Component`**: Emits `r.static_scope(move |scope| { scope.child(ComponentName { props: ... }, None); });`. If children are present, they are recursively emitted into a nested `Rsx` object and passed as the `children` prop. + * **`RsxNode::Mount`**: Emits `mount_hook_instance.mount();`. + * **`RsxNode::If`**: Emits `r.dynamic_scope(move |scope| { if condition { ... } else { ... } }, dependencies);`. The `dependencies` are converted to `Vec>`. + * **`RsxNode::For`**: Similar to `If`, emits `r.dynamic_scope(move |scope| { for pattern in expr { ... } }, dependencies);`. + +### Output + +The `rsx!` macro produces a `TokenStream` that looks something like this (simplified): + +```rust +// For: rsx! { "Hello" MyComponent { prop: value } } +{ + let mut r = osui::frontend::Rsx::new(); + r.static_scope(move |scope| { + scope.view(std::sync::Arc::new(move |ctx| { + ctx.draw_text(osui::render::Point { x: 0, y: 0 }, &format!("Hello")) + })); + }); + r.static_scope(move |scope| { + scope.child( + MyComponent { prop: value.to_string() }, // Note: Prop value converted to owned type + None, + ); + }); + r +} +``` + +This generated code, when compiled, constructs the `osui::frontend::Rsx` object that OSUI's runtime can then interpret to build the component tree and render the UI. + +## Summary + +The `osui-macros` crate plays a pivotal role in shaping OSUI's developer experience. `#[component]` streamlines component definition, while `rsx!` provides a powerful, declarative way to compose UIs by transforming custom syntax into efficient runtime calls. These macros are complex but essential for creating a modern, React-like development flow in a TUI environment. + +**Next:** Learn how you can contribute to the OSUI project in [Contributing](./03-contributing.md). diff --git a/docs/advanced/03-contributing.md b/docs/advanced/03-contributing.md new file mode 100644 index 0000000..a27300b --- /dev/null +++ b/docs/advanced/03-contributing.md @@ -0,0 +1,116 @@ +markdown +--- +sidebar_position: 3 +title: Contributing +--- + +# Contributing to OSUI + +We welcome and appreciate contributions from the community! Whether it's reporting bugs, suggesting features, improving documentation, or submitting code, your help makes OSUI better for everyone. + +## How to Contribute + +### 1. Report Bugs + +If you find a bug, please open an issue on our [GitHub repository](https://github.com/osui-rs/osui/issues). When reporting a bug, please include: + +* A clear and concise description of the bug. +* Steps to reproduce the behavior. +* Expected behavior. +* Actual behavior. +* Your OSUI version, Rust version, and operating system. +* Any relevant code snippets or error messages. + +### 2. Suggest Features + +Have an idea for a new feature or improvement? Feel free to open an issue on GitHub to discuss it. Please provide: + +* A clear and concise description of the proposed feature. +* Why you think it would be valuable to OSUI. +* Any potential use cases or examples. + +### 3. Improve Documentation + +Good documentation is vital for any library. If you find errors, omissions, or areas that could be explained more clearly in our docs, please consider: + +* Opening an issue to point out the specific area. +* Submitting a pull request with your suggested improvements. + +### 4. Contribute Code + +If you'd like to contribute code, here's the general workflow: + +#### Fork the Repository + +First, fork the [osui-rs/osui](https://github.com/osui-rs/osui) repository to your own GitHub account. + +#### Clone Your Fork + +```bash +git clone https://github.com/YOUR_USERNAME/osui.git +cd osui +``` + +#### Create a New Branch + +Create a new branch for your feature or bug fix. Use a descriptive name: + +```bash +git checkout -b feature/my-awesome-feature +# or +git checkout -b bugfix/fix-rendering-issue +``` + +#### Make Your Changes + +* Write clean, idiomatic Rust code. +* Follow existing code style and conventions. +* Add comments where necessary to explain complex logic. +* **Write Tests**: If you're adding new features or fixing bugs, please include appropriate unit and/or integration tests to cover your changes. +* **Update Documentation**: If your changes affect the public API or add new functionality, please update the relevant documentation files. + +#### Run Tests + +Before submitting a pull request, ensure all existing tests pass and your new tests pass: + +```bash +cargo test --workspace +``` + +#### Format and Lint + +Make sure your code is formatted correctly and passes lint checks: + +```bash +cargo fmt --all +cargo clippy --all-targets --all-features +``` + +#### Commit Your Changes + +Commit your changes with clear and concise commit messages. A good commit message explains *what* changed and *why*. + +```bash +git commit -m "feat: Add new awesome feature" +# or +git commit -m "fix: Resolve rendering issue on Windows" +``` + +#### Push to Your Fork + +```bash +git push origin feature/my-awesome-feature +``` + +#### Create a Pull Request + +Go to the [osui-rs/osui](https://github.com/osui-rs/osui) repository on GitHub and open a new pull request. +* Provide a clear title and description for your pull request. +* Reference any related issues (e.g., "Fixes #123" or "Closes #456"). +* The project maintainers will review your PR, provide feedback, and work with you to get it merged. + +## Code of Conduct + +Please note that this project is released with a [Contributor Code of Conduct](https://github.com/osui-rs/osui/blob/main/CODE_OF_CONDUCT.md). By participating in this project, you agree to abide by its terms. + +Thank you for considering contributing to OSUI! Your efforts help foster a vibrant and robust TUI ecosystem in Rust. diff --git a/docs/concepts/00-architecture.md b/docs/concepts/00-architecture.md new file mode 100644 index 0000000..719ac44 --- /dev/null +++ b/docs/concepts/00-architecture.md @@ -0,0 +1,95 @@ +markdown +--- +sidebar_position: 0 +title: Core Architecture +--- + +# Core Architecture + +OSUI is designed with a clear separation of concerns, drawing inspiration from modern GUI frameworks like React. This modular architecture aims for flexibility, testability, and scalability. Here's a high-level overview of how the different parts of OSUI interact to form a functional TUI application. + +```mermaid +graph TD + A[Application Root (main.rs)] --> B(Engine::run(RootComponent)) + B --> C(Engine) + C -- init --> D(Root Component Context) + D -- refresh --> E(Root Component View) + E -- generate_children --> F(Frontend::Rsx) + F -- create Scopes & Contexts --> D + D -- draw_children --> G(Render::DrawContext) + G -- execute DrawInstructions --> H(Engine::draw_context) + H -- actual terminal output --> I(crossterm) + + subgraph State & Events + J[Component Context] -- manage state via hooks --> K(State) + K -- notify dependents --> L(HookEffect) + L -- trigger callbacks --> J + J -- emit events --> M(Event Handlers) + M -- propagate to children --> J + end + + subgraph User Interaction + N[Input Polling Thread] --> O(Engine::CommandExecutor) + O -- execute commands --> C + O -- emit events --> J + end + + C -- continuous loop --> E + D --> J + J --> E +``` + +## Key Architectural Components + +### 1. **Component System (`osui::component`)** + +* **`ComponentImpl`**: The fundamental trait defining a renderable UI unit. Any type implementing this can be an OSUI component. +* **`Context`**: Each active component instance has its own `Context`. This is the central hub for: + * Holding the component's `View` (its rendered output). + * Managing its local state using hooks (e.g., `use_state`). + * Registering and emitting events (`on_event`, `emit_event`). + * Managing its children components and their `Scope`s. + * Accessing the `CommandExecutor` to interact with the engine. +* **`Scope`**: A `Context` can contain multiple child `Scope`s. A `Scope` is primarily a container that groups a set of child components (`Context`s) and their optional `ViewWrapper`s. `Rsx` fragments generate `Scope`s to manage their children. + +**Why it works this way**: This component-based approach promotes modularity and reusability. `Context` provides a stable identity and state for each component instance, enabling independent updates and event handling. The tree structure formed by `Context`s and `Scope`s mirrors the UI hierarchy. + +### 2. **State Management (`osui::state`)** + +* **`State`**: A reactive wrapper for any data `T`. When `State` is updated, it automatically notifies all its registered "dependents". +* **`use_state`**: The primary hook to create and manage `State` within a component. +* **`use_effect`**: A hook for performing side effects (e.g., logging, network requests) in response to `State` changes or component mounting. +* **`HookDependency`**: A trait that `State` and `Mount` implement, allowing them to be tracked by `use_effect` and dynamic `rsx!` blocks. + +**Why it works this way**: Inspired by React hooks, this system provides a predictable and efficient way to manage mutable state. By declaring explicit dependencies for effects and dynamic `rsx!` blocks, OSUI can minimize re-renders and computations, only updating parts of the UI that are truly affected by state changes. + +### 3. **Frontend / Declarative UI (`osui::frontend` & `osui-macros`)** + +* **`rsx!` macro**: A procedural macro that allows you to write UI using a declarative, XML-like syntax directly in Rust. +* **`#[component]` macro**: A procedural macro that transforms a Rust function into an OSUI component, automatically handling prop parsing and `ComponentImpl` implementation. +* **`Rsx`**: An internal representation (produced by `rsx!`) of a UI fragment, consisting of a vector of `RsxScope`s. +* **`RsxScope`**: An enum defining different types of UI nodes (static text, components, dynamic conditional/loop blocks). + +**Why it works this way**: Declarative UI is generally easier to reason about than imperative drawing commands. The `rsx!` macro provides a high-level abstraction that maps directly to the component tree and state management, significantly improving developer experience. The macro-generated `Rsx` object then serves as a blueprint for `Context` to build its children. + +### 4. **Rendering Pipeline (`osui::render`)** + +* **`View`**: The ultimate output of a component's rendering logic. It's a closure that, when called, populates a `DrawContext` with drawing instructions. +* **`DrawContext`**: A mutable accumulator for `DrawInstruction`s. Components add text, child views, or custom drawing commands to this context. It also tracks the available `Area` and `allocated` space. +* **`DrawInstruction`**: An enum representing atomic drawing operations (e.g., `Text`, `View`, `Child`). +* **Geometric Primitives**: `Point`, `Size`, `Area` define positions and dimensions. + +**Why it works this way**: This separation allows the rendering logic to be independent of the actual display medium. Components declare *what* to draw using high-level instructions, and the `Engine` then decides *how* to execute them on the specific backend (e.g., terminal). + +### 5. **Engine (`osui::engine`)** + +* **`Engine` trait**: Defines the interface for running an OSUI application, including initialization, continuous rendering, and managing the render loop. +* **`Console`**: The default implementation of `Engine`, which uses `crossterm` to interact with the terminal. +* **`CommandExecutor` trait**: An interface for executing system-level commands (e.g., `Stop`). +* **`Benchmark`**: A wrapper `Engine` that measures and reports performance statistics. + +**Why it works this way**: The `Engine` trait makes OSUI extensible. You can swap out the `Console` engine for a different backend (e.g., a web renderer, a headless testing engine) without changing your core component logic. The `CommandExecutor` provides a standardized way for components to request actions from the environment. + +This interconnected architecture allows OSUI to offer a powerful, flexible, and developer-friendly experience for building sophisticated Terminal User Interfaces. + +**Next:** Delve deeper into [The Component Model](./01-the-component-model.md). diff --git a/docs/concepts/01-the-component-model.md b/docs/concepts/01-the-component-model.md new file mode 100644 index 0000000..e83fe83 --- /dev/null +++ b/docs/concepts/01-the-component-model.md @@ -0,0 +1,108 @@ +markdown +--- +sidebar_position: 1 +title: The Component Model +--- + +# The Component Model + +At the core of OSUI's design is a robust component model, defining how UI elements are created, composed, and managed. This model provides structure, promotes reusability, and facilitates a clear separation of concerns within your TUI application. + +## `ComponentImpl`: The Building Block + +The `ComponentImpl` trait is the most fundamental concept for any renderable unit in OSUI: + +```rust +pub trait ComponentImpl: Send + Sync { + /// Renders the component within the given context, returning a View + fn call(&self, cx: &Arc) -> View; +} +``` + +* **`fn call(&self, cx: &Arc) -> View`**: This method is where a component's rendering logic resides. It takes a reference to the component instance itself and its `Context` (`cx`), and it must return a `View`. The `View` is OSUI's abstraction for "what to draw," essentially a closure that will populate a `DrawContext` with drawing instructions later in the rendering pipeline. +* **`Send + Sync`**: Components must be `Send` and `Sync` to ensure they can be safely passed between threads, as OSUI leverages concurrency for various operations (e.g., `use_effect` hooks). + +Most often, you won't implement `ComponentImpl` manually. Instead, you'll use the `#[component]` procedural macro: + +```rust +#[component] +fn MyComponent(cx: &Arc, some_prop: &String) -> View { + // Component logic and RSX here + rsx! { + format!("Prop: {}", some_prop) + }.view(&cx) +} +``` + +The `#[component]` macro automatically generates a struct for `MyComponent` (with `some_prop: String` as a field) and implements `ComponentImpl` for it, delegating the `call` method to your function's body. + +## `Context`: The Component's Identity and State + +Every active instance of a component in the UI tree has its own `Context` (`osui::component::context::Context`). The `Context` is the component's runtime identity and central hub for managing its internal state and interactions: + +```rust +pub struct Context { + component: AccessCell, + view: AccessCell, + event_handlers: AccessCell>>, + pub(crate) scopes: Mutex>>, + executor: Arc, +} +``` + +**Why `Context` is crucial**: + +* **State Management**: It's the entry point for all state hooks (`use_state`, `use_effect`, etc.), ensuring that each component instance manages its own isolated, reactive state. +* **Event Handling**: `Context` provides methods (`on_event`, `emit_event`) for handling component-specific and application-wide events. Events propagate through the `Context` tree. +* **Rendering Result (`View`)**: It holds the `View` generated by the `ComponentImpl::call` method, which is later passed to the rendering engine. +* **Child Management (`scopes`)**: A `Context` aggregates child components through `Scope`s, forming the hierarchical UI tree. +* **Engine Interaction**: It provides access to the `CommandExecutor`, allowing components to send commands (like `Stop`) to the underlying engine. + +When a component is instantiated (e.g., `MyComponent { ... }` in `rsx!`), a new `Context` is created for it. This `Context` lives as long as the component is part of the active UI tree. + +## `Scope`: Organizing Children + +While `Context` represents a single component instance, `Scope` (`osui::component::scope::Scope`) is responsible for grouping and managing collections of child `Context`s: + +```rust +pub struct Scope { + pub children: Mutex, Option)>>, + executor: Arc, +} +``` + +**Relationship between `Context` and `Scope`**: + +* A `Context` can contain multiple child `Scope`s (stored in `Context::scopes`). +* Each `Scope` then contains a `Vec` of `(Arc, Option)`, representing the actual child components (and optional view modifiers) within that specific scope. +* This distinction allows for flexibility in how children are managed, particularly for dynamic `rsx!` constructs like `@if` and `@for` which might create or destroy entire `Scope`s based on conditions or iterations. + +**How `Scope`s are used**: + +* When you use `rsx!`, the macro emits calls to `context.scope()` or `context.dyn_scope()`, which create new `Scope`s. +* Within these `Scope`s, children are added using `scope.child()` or `scope.view()`. +* The `Context::draw_children` method then iterates through these `Scope`s and their children to orchestrate their rendering. + +## The Component Tree + +Together, `ComponentImpl`, `Context`, and `Scope` form a hierarchical component tree: + +``` +App Component (Context) +└── App Scope (from App's rsx!) + ├── Child Component A (Context) + │ └── Child A Scope (from A's rsx!) + │ └── Grandchild Component X (Context) + ├── Child Component B (Context) + │ └── Child B Scope + │ ├── Grandchild Component Y (Context) + │ └── Grandchild Component Z (Context) + └── Dynamic Scope (e.g., from an `@if` block) + └── (Conditionally rendered children) +``` + +This tree structure is fundamental to OSUI's rendering and event propagation. Events emitted by a child `Context` can traverse up the tree to parent `Context`s (if they listen for them) and always propagate down to all descendants. + +The component model provides a clear, organized, and powerful way to structure your TUI applications, promoting maintainability and scalability through modularity and a well-defined lifecycle for each UI element. + +**Next:** Understand how `State` and `HookDependency` enable efficient UI updates in [Reactive State Flow](./02-reactive-state-flow.md). diff --git a/docs/concepts/02-reactive-state-flow.md b/docs/concepts/02-reactive-state-flow.md new file mode 100644 index 0000000..95bc768 --- /dev/null +++ b/docs/concepts/02-reactive-state-flow.md @@ -0,0 +1,115 @@ +markdown +--- +sidebar_position: 2 +title: Reactive State Flow +--- + +# Reactive State Flow + +OSUI's reactivity model is designed to efficiently update the UI in response to changes in application data. It centers around `State`, `HookDependency`, and `use_effect`, forming a flow where data changes automatically trigger re-rendering of affected components. + +## 1. `State`: The Source of Truth + +At the heart of reactivity is the `State` type. When you declare state using `use_state(initial_value)`, you get a `State` instance: + +```rust +let count = use_state(0); // count: State +``` + +`State` wraps your actual data `T` in an `Arc>`, allowing it to be safely shared and mutated across multiple threads and component scopes. + +## 2. Updating `State` + +When the value held by `State` changes, this initiates the reactive flow. There are two primary ways to update `State`: + +* **`state.set(new_value)`**: Replaces the entire value and explicitly triggers an update. +* **`*state.get() = new_value`**: Acquires an `Inner<'_, T>` guard, which provides mutable access to the underlying value. When this `Inner` guard is dropped (goes out of scope), it automatically checks if the value was modified and, if so, triggers an update. + +```rust +// Method 1: using .set() +count.set(count.get_dl() + 1); + +// Method 2: using .get() for mutable access +{ + let mut count_guard = count.get(); // Acquire Inner guard + *count_guard += 1; // Mutate the value +} // count_guard drops here, automatically triggering updates +``` + +## 3. `HookDependency`: Declaring Reactivity + +For an update to `State` to have an effect, there must be something "listening" for that update. This is where the `HookDependency` trait comes in: + +```rust +pub trait HookDependency: Send + Sync { + fn on_update(&self, hook: HookEffect); +} +``` + +* `State` implements `HookDependency`. This means you can register an `HookEffect` with a `State` instance, and `State` will ensure that effect is called whenever its value changes. +* `Mount` also implements `HookDependency` for managing component lifecycle effects. + +## 4. `HookEffect`: The Callback + +An `HookEffect` is essentially a wrapper around a closure (`Arc>`) that represents a side effect. When a `HookDependency` updates, it calls all registered `HookEffect`s. + +```rust +// An effect might look something like this internally: +let my_effect = HookEffect::new(move || { + // This code runs when the dependency updates + println!("Dependency changed!"); +}); +``` + +## 5. `use_effect` and Dynamic `rsx!` Blocks: Consuming Reactivity + +The `HookDependency` and `HookEffect` mechanism is consumed by two main features to enable reactive UI updates: + +### a) `use_effect` Hook + +`use_effect` allows you to run side effects when specified dependencies change: + +```rust +use_effect( + { + let count = count.clone(); // Clone State handle for closure + move || { + // This closure runs in a spawned thread when `count` updates + println!("Count is now: {}", count.get_dl()); + } + }, + &[&count], // `count` is the dependency +); +``` + +When `use_effect` is first called, it registers its internal `HookEffect` closure with each `HookDependency` in the provided slice. Each time `count` is updated, `count` calls its registered `HookEffect`, which then executes the provided closure. + +### b) Dynamic `rsx!` Blocks (`%dep @if ...`, `%dep @for ...`) + +OSUI's `rsx!` macro supports special syntax for dynamic UI segments that automatically re-render when dependencies change: + +```rust +rsx! { + %count @if *count.get() > 0 { // This block re-renders if `count` changes + format!("Count is positive: {}", count.get_dl()) + } + %items @for item in items.get_dl() { // This block re-renders if `items` changes + format!("- {}", item) + } +} +``` + +* When the `rsx!` macro encounters `%dep`, it also registers a special internal `HookEffect` with that dependency. +* This `HookEffect` is responsible for re-evaluating the entire `dynamic_scope` (the `if` or `for` block) within the component's `Context`. This re-evaluation re-runs the `rsx!` logic for that block, generating potentially new children or text nodes, and thus updating the UI. + +## The Reactive Flow in Summary + +1. A component uses `use_state` to create a `State`. +2. The `State` is passed as a dependency to `use_effect` or declared in a dynamic `rsx!` block (`%state`). +3. When `State`'s value is modified (`set()` or `get()` then drop), it triggers its registered `HookEffect`s. +4. These `HookEffect`s then either execute a side-effect closure (from `use_effect`) or trigger a re-evaluation of the corresponding `dynamic_scope` (from `rsx!`). +5. Re-evaluation of `dynamic_scope` leads to updated `DrawInstruction`s, which the `Engine` eventually renders to the terminal. + +This elegant system ensures that your UI remains synchronized with your application's data, responding efficiently and predictably to changes, minimizing manual re-rendering logic. + +**Next:** Understand how events traverse the component tree in [Event Propagation](./03-event-propagation.md). diff --git a/docs/concepts/03-event-propagation.md b/docs/concepts/03-event-propagation.md new file mode 100644 index 0000000..a2f3b72 --- /dev/null +++ b/docs/concepts/03-event-propagation.md @@ -0,0 +1,105 @@ +markdown +--- +sidebar_position: 3 +title: Event Propagation +--- + +# Event Propagation + +Event propagation in OSUI describes how events traverse the component tree after they are emitted. Understanding this model is crucial for designing effective inter-component communication and responsive user interfaces. + +## Unidirectional Propagation: Downwards + +OSUI employs a unidirectional event propagation model, primarily **downwards** through the component tree. When an event is emitted from a component's `Context`, it follows this path: + +1. **Current Context**: All `on_event` handlers registered on the `Context` that emitted the event are invoked first. +2. **Child Contexts**: The event is then recursively propagated to all immediate children's `Context`s, and from there, further down to their children, and so on, until it reaches the leaves of the component tree. Each child `Context` will also invoke its own registered `on_event` handlers for that event type. + +This means an event emitted by an ancestor component will reach all its descendants. An event emitted by a child component will reach its parents (if the parent `Context` has `on_event` handlers for it) and all its siblings and their descendants. + +```mermaid +graph TD + A[Root Component Context] --> B(Child A Context) + A --> C(Child B Context) + B --> D(Grandchild A1 Context) + B --> E(Grandchild A2 Context) + C --> F(Grandchild B1 Context) + + subgraph Event Propagation (emit_event from D) + D -- handlers on D --> D + D -- propagate --> B + B -- handlers on B --> B + B -- propagate --> E + E -- handlers on E --> E + B -- propagate --> A + A -- handlers on A --> A + A -- propagate --> C + C -- handlers on C --> C + C -- propagate --> F + F -- handlers on F --> F + end +``` + +### Methods for Event Emission + +* **`cx.emit_event(event: E)`**: + * This is the standard method for emitting events. + * It processes event handlers synchronously in the current thread. This means that subsequent code execution will wait for all handlers (and their propagation to children) to complete. + * Useful for events where the order of execution matters or where the handler logic is quick. + +* **`cx.emit_event_threaded(event: &E)`**: + * This method processes event handlers asynchronously by spawning a new `std::thread` for *each* registered handler. + * The event object `E` must implement `Clone` because each handler receives its own cloned copy. + * Useful for events that might trigger long-running or blocking operations, preventing them from freezing the UI. The event propagation down the tree also uses the threaded approach. + +## Practical Implications + +### Parent-to-Child Communication (Implicit) + +If a parent component emits an event, all its child components (and their children) that have `on_event` handlers for that specific event type will receive it. This is a powerful way for ancestors to broadcast information or commands to their descendants. + +```rust +// Parent emits a "Refresh" event +cx.emit_event(RefreshEvent {}); + +// Child listens for "Refresh" event +cx.on_event(|_cx, _event: &RefreshEvent| { + // Perform refresh logic +}); +``` + +### Child-to-Parent/Sibling Communication (Explicit) + +A child component can effectively communicate with its parent or siblings by emitting an event. Because events propagate downwards from the emitting `Context` *and then* to all its children (and subsequently to its parent's other children, if any), the parent and siblings will receive the event if they are listening for it. + +```rust +// Child component +#[component] +fn Child(cx: &Arc) -> View { + // ... logic to decide when to emit + cx.emit_event(ChildActionCompleted { data: "success".to_string() }); + // ... +} + +// Parent component +#[component] +fn Parent(cx: &Arc) -> View { + cx.on_event(|_cx, event: &ChildActionCompleted| { + println!("Parent received action from child: {:?}", event.data); + }); + rsx! { Child {} }.view(&cx) +} +``` + +### Decoupling Components + +Event handling promotes a decoupled architecture. Components don't need direct references to each other to communicate; they only need to agree on common event types. This makes components more independent and easier to reuse. + +## When to use `emit_event` vs. `emit_event_threaded` + +* **`emit_event`**: Use for most general-purpose events where handlers are quick, or you need strict sequential processing, or if you don't want the overhead of spawning many threads. +* **`emit_event_threaded`**: Use for events that might trigger expensive, long-running, or I/O-bound operations in their handlers. This prevents the main rendering loop from blocking, ensuring a responsive UI. Be mindful of potential race conditions if multiple threads modify shared state (though `State`'s `Mutex` helps mitigate this). + +Understanding OSUI's downward event propagation is key to designing robust and reactive component interactions within your TUI applications. + +**Next:** Get insights into how your UI transforms from `View`s to terminal output in [The Rendering Pipeline](./04-rendering-pipeline.md). diff --git a/docs/concepts/04-rendering-pipeline.md b/docs/concepts/04-rendering-pipeline.md new file mode 100644 index 0000000..5ed2ca6 --- /dev/null +++ b/docs/concepts/04-rendering-pipeline.md @@ -0,0 +1,76 @@ +markdown +--- +sidebar_position: 4 +title: The Rendering Pipeline +--- + +# The Rendering Pipeline + +The OSUI rendering pipeline is the process by which your declarative component hierarchy is transformed into concrete drawing operations on the terminal. It's an abstraction layer that allows components to describe *what* to draw, while the `Engine` handles *how* to draw it. + +## Stages of the Pipeline + +The pipeline can be broken down into several distinct stages: + +### 1. Component `call` and `View` Generation + +* **`Engine::run`**: The main application loop starts by calling `Engine::run` with your root component. +* **`Context::refresh`**: The engine initializes the root component's `Context` and calls `Context::refresh`. +* **`ComponentImpl::call`**: Inside `refresh`, the component's `ComponentImpl::call` method is invoked. This is where your component function (decorated with `#[component]`) executes. +* **`rsx!` Macro Expansion**: Within your component function, the `rsx!` macro generates an `osui::frontend::Rsx` object. +* **`Rsx::view(&cx)`**: This method converts the `Rsx` object into a `View`. Critically, `Rsx::view` also triggers `Rsx::generate_children`. +* **`Rsx::generate_children`**: This recursively processes the `Rsx` object, creating new child `Context`s and `Scope`s within the current `Context`. For `dynamic_scope`s (`@if`, `@for`), it also registers `use_effect` hooks to trigger re-evaluation when dependencies change. +* **Result**: The component function ultimately returns a `View`. This `View` is a closure that, when executed, will populate a `DrawContext` by calling `context.draw_children()`. + +### 2. `DrawContext` Construction (`render_view`) + +* **`Engine::render`**: In the main rendering loop, the `Engine` calls `render` for the current `Context`. +* **`Engine::render_view`**: The `Engine` creates a fresh, empty `DrawContext` for the entire screen `Area`. It then executes the root component's `View` (the closure generated in Stage 1) against this `DrawContext`. +* **`Context::draw_children`**: The root `View`'s closure invokes `context.draw_children()`. This method iterates through all child `Scope`s and their contained `Context`s. For each child `Context`, it retrieves its `View` and adds a `DrawInstruction::View` to the current `DrawContext`, recursively starting the `render_view` process for children within their allocated `Area`. +* **`DrawContext::draw_text`, `DrawContext::draw_view`, `DrawContext::allocate`**: As `View`s are executed, they add `DrawInstruction`s to the `DrawContext` using methods like `draw_text` for text, `draw_view` for child components, and `allocate` to mark used screen regions. +* **Result**: A fully populated `DrawContext` containing a flat list of `DrawInstruction`s, ready for rendering. + +### 3. `DrawInstruction` Execution (`draw_context`) + +* **`Engine::draw_context`**: After `render_view` has produced a complete `DrawContext`, the `Engine`'s `draw_context` method is called. This is the stage where the actual terminal output happens. +* **Instruction Iteration**: `draw_context` iterates through the `Vec` inside the `DrawContext`. +* **`Text`**: For `DrawInstruction::Text(point, text)`, the engine translates `point` (which is relative to the `DrawContext`'s `area`) into absolute terminal coordinates and uses `crossterm` to move the cursor and print the `text`. +* **`View`**: For `DrawInstruction::View(area, view)`, the engine recursively calls `render_view` for the child `view` within its specific `area`, then processes the resulting `DrawContext`. +* **`Child`**: For `DrawInstruction::Child(point, child_ctx)`, the engine recursively calls `draw_context` for the `child_ctx`, applying the `point` offset. +* **Terminal Output**: The `Console` engine uses `crossterm` functions (like `MoveTo`, `Print`, `Clear`) to modify the terminal buffer. +* **Result**: The visible TUI on the user's screen. + +## `render_delay` and Loop + +After `draw_context` completes, the `Engine` typically calls `render_delay()` (defaulting to 16ms for ~60 FPS) before the entire loop restarts with the next `Engine::render` call. This continuous loop maintains a responsive and updated UI. + +```mermaid +graph TD + A[Component Function (`#[component]`)] --> B(Generates `Rsx` object) + B --> C(Rsx::view(&cx)) + C -- calls Rsx::generate_children --> D(Builds child Contexts & Scopes) + D --> E(Returns a `View` closure) + + subgraph Engine Loop + F[Engine::render(root_cx)] --> G(Engine::render_view(full_screen_area, root_view)) + G -- creates empty DrawContext --> H(Executes root_view closure) + H -- root_view calls Context::draw_children --> I(Recursively adds DrawInstruction::View for children) + I -- children's Views populate DrawContext --> J(Result: Full DrawContext with instructions) + J --> K(Engine::draw_context(full_DrawContext)) + K -- iterates DrawInstructions --> L(Executes terminal ops via crossterm) + L --> M[Visible TUI] + M -- optional delay --> N(Engine::render_delay) + N --> F + end +``` + +## Key Principles + +* **Declarative vs. Imperative**: Components declare *what* to draw (`View`, `DrawInstruction`), not *how* to directly manipulate the terminal. The engine handles the imperative *how*. +* **Separation of Concerns**: Each stage focuses on a specific responsibility: component logic, state management, UI tree construction, and final rendering. +* **Reactivity Integration**: Dynamic `rsx!` blocks and `use_effect` ensure that only affected parts of the `View` or `DrawContext` are re-generated efficiently when state changes, minimizing redundant work. +* **Extensibility**: The `Engine` trait allows for different rendering backends (e.g., to a file, to a graphical window, or for benchmarking) without modifying component logic. + +Understanding this pipeline helps in debugging rendering issues, optimizing performance, and building custom rendering logic within your OSUI applications. + +**Next:** Explore advanced topics like [Performance Benchmarking](../advanced/00-performance-benchmarking.md). diff --git a/docs/guides/00-creating-components.md b/docs/guides/00-creating-components.md new file mode 100644 index 0000000..d19d9f5 --- /dev/null +++ b/docs/guides/00-creating-components.md @@ -0,0 +1,124 @@ +markdown +--- +sidebar_position: 0 +title: Creating Components +--- + +# Creating Components + +Components are the building blocks of any OSUI application. They encapsulate UI logic, state, and rendering instructions, making your code modular and reusable. This guide explains how to define and use components effectively. + +## The `#[component]` Attribute + +OSUI uses the `#[component]` procedural macro to transform a regular Rust function into an OSUI component. This macro handles the boilerplate necessary for prop handling and integrating the function into the component tree. + +### Basic Structure + +A component function generally looks like this: + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn MyComponent(cx: &Arc) -> View { + // Component logic goes here + rsx! { + "Hello from MyComponent!" + }.view(&cx) +} +``` + +**Key requirements:** + +1. **`#[component]`**: Always annotate your component function with this attribute. +2. **Function Signature**: + * It must take `cx: &Arc` as its *first* argument. The `Context` is essential for managing state, events, and child components. + * It must return a `View`. A `View` is an `Arc`, essentially a closure that contains the drawing instructions for your component. +3. **Return Value**: The most common way to return a `View` is by using the `rsx!` macro followed by `.view(&cx)`. + +### Component Props + +Components become truly powerful when they can receive data from their parents. These are called "props" (properties). To define props for your component, simply add more parameters to your component function after `cx: &Arc`. + +OSUI's `#[component]` macro automatically generates a struct for your component based on these parameters. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn GreetUser(cx: &Arc, name: &str, age: &u8) -> View { + // Access props directly by their parameter names + rsx! { + format!("Hello, {}! You are {} years old.", name, age) + }.view(&cx) +} + +#[component] +pub fn App(cx: &Arc) -> View { + let user_name = "Alice".to_string(); + let user_age = 30; + + rsx! { + // Instantiate GreetUser and pass props + GreetUser { + name: user_name, // Prop name matches the parameter name + age: user_age, + } + }.view(&cx) +} +``` + +**Prop Rules:** + +* **Parameter Names**: The names of your function parameters (e.g., `name`, `age`) become the names of the props you use when instantiating the component in `rsx!`. +* **Reference Types**: Props are typically passed as references (e.g., `&str`, `&u8`). The `#[component]` macro automatically "strips" the reference when generating the internal component struct, storing the owned type. This means you don't need to manually clone values unless you intend to move them into a closure or `State`. +* **`children` Prop**: As seen in the [previous guide](../intro/03-example-basic-component.md), any content nested inside a component's `rsx!` invocation is implicitly passed as a `children: &Rsx` prop. This allows for flexible content composition. + +### Example: Component with `children` and custom props + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn Card(cx: &Arc, title: &str, children: &Rsx) -> View { + rsx! { + format!("--- {} ---", title) // Render the title prop + @{children} // Render the children passed to Card + "----------------" + }.view(&cx) +} + +#[component] +pub fn App(cx: &Arc) -> View { + rsx! { + Card { + title: "My Awesome Card", // Pass a custom prop + // The content below is passed as the `children` prop + rsx! { + "This is the content inside the card." + "It can span multiple lines or include other components." + } + } + Card { + title: "Another Card", + "Just some simple text here." // Even a single string literal can be children + } + }.view(&cx) +} +``` + +In this example, the `Card` component takes a `title` prop and a `children` prop. It renders the title, then its children, and finally a footer. + +## When to Create a Component + +* **Reusability**: If you find yourself writing the same UI structure multiple times, extract it into a component. +* **Separation of Concerns**: When a part of your UI has its own state or complex logic, it's a good candidate for a component. +* **Readability**: Breaking down large `rsx!` blocks into smaller components improves the readability and maintainability of your code. +* **Performance (Reactivity)**: Components, especially when using state hooks, allow OSUI to efficiently re-render only the parts of the UI that have changed. + +By following these guidelines, you can build well-structured and scalable OSUI applications. + +**Next:** Deep dive into the `rsx!` macro and its full capabilities in the [RSX Syntax Guide](./01-rsx-syntax.md). diff --git a/docs/guides/01-rsx-syntax.md b/docs/guides/01-rsx-syntax.md new file mode 100644 index 0000000..c5525d4 --- /dev/null +++ b/docs/guides/01-rsx-syntax.md @@ -0,0 +1,193 @@ +markdown +--- +sidebar_position: 1 +title: RSX Syntax Guide +--- + +# RSX Syntax Guide + +The `rsx!` macro is the cornerstone of OSUI's declarative UI system. Inspired by React's JSX, it provides an ergonomic way to define your component hierarchies directly in Rust code. This guide covers all the features of the `rsx!` syntax. + +## Basic Structure + +The `rsx!` macro produces an `Rsx` object, which is a collection of renderable nodes. You typically call `.view(&cx)` on the `Rsx` object to convert it into a `View` that your component returns. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // Your UI elements go here + "Hello, RSX!" // A simple text literal + }.view(&cx) +} +``` + +## Types of Nodes + +`rsx!` supports several types of nodes: + +### 1. Text Literals + +Plain string literals are rendered as text. + +```rust +rsx! { + "This is some text." + "This is another line of text." +} +``` + +### 2. Rust Expressions: `@{expr}` + +You can embed any Rust expression that evaluates to a renderable type (one that implements `ToRsx`) using the `@{...}` syntax. This is useful for dynamic content or rendering other `Rsx` objects. + +```rust +let dynamic_text = format!("The current time is: {:?}", std::time::SystemTime::now()); +let other_rsx = rsx! { "Some nested content" }; + +rsx! { + @{dynamic_text} // Renders the string from the expression + @{other_rsx} // Renders another Rsx object + @{123 + 456} // Renders the result of the arithmetic operation (as a string) +} +``` + +:::tip +Any type that implements `std::fmt::Display` (like `String`, `&str`, `i32`, `f64`, etc.) automatically implements `ToRsx` and can be used directly within `rsx!`. +::: + +### 3. Component Instantiation: `ComponentName { prop: value, ... }` + +To use another component, specify its name (path) followed by an optional braced block containing its props and children. + +```rust +#[component] +fn MyButton(cx: &Arc, text: &str) -> View { + rsx! { + format!("[ {} ]", text) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MyButton { text: "Click Me" } // Component with a prop + MyButton { "Another Button" } // Component with children (which becomes `text` if `children: &Rsx` is also defined) + }.view(&cx) +} +``` + +* **Props**: Key-value pairs (`prop_name: value`) inside the braces. The `prop_name` must match a parameter name in the target component's function signature. +* **Children**: Any `rsx!` content (text, expressions, other components) directly nested inside the component's braces after props will be collected into the special `children: &Rsx` prop, if defined by the component. + +### 4. Conditional Rendering: `@if condition { ... }` + +Conditionally render parts of your UI based on a boolean expression. + +```rust +let show_message = true; +let is_admin = false; + +rsx! { + @if show_message { + "This message is always shown." + } + @if is_admin { + "Admin panel access granted." + } else { + "Access denied." // `else` is optional + } +} +``` + +* The `condition` must be a Rust expression that evaluates to a `bool`. +* The content inside the `{...}` block is an `rsx!` fragment that will be rendered if the condition is true. +* An optional `else { ... }` block can follow for false conditions. + +#### Reactivity with Dependencies: `%$dep @if condition { ... }` + +For conditional rendering to react to state changes, you need to explicitly declare dependencies using the `%$dep` syntax. + +```rust +let count = use_state(0); // A reactive state + +rsx! { + %count @if *count.get() > 0 { // This block re-renders if `count` changes + format!("Count is: {}", count.get_dl()) + } else { + "Count is zero." + } +} +``` + +* **`%count`**: Declares `count` as a dependency for this `if` block. When `count`'s value changes (via `count.set()` or `*count.get_mut()`), this entire `if` block will be re-evaluated and re-rendered. +* You can declare multiple dependencies: `%dep1, dep2, dep3 @if ...` +* You can also rename dependencies for clarity: `%original_name as new_name @if ...` + +### 5. Loop Rendering: `@for pattern in expr { ... }` + +Render a list of items by iterating over a collection. + +```rust +let items = vec!["Apple", "Banana", "Cherry"]; + +rsx! { + "Fruits:" + @for item in items { // Loops over the `items` vector + format!("- {}", item) + } + + "Numbers:" + @for i in (0..3) { + format!("Number: {}", i) + } +} +``` + +* `pattern` is a standard Rust `for` loop pattern (e.g., `item`, `(index, item)`, `_`). +* `expr` is a Rust expression that evaluates to an `IntoIterator`. +* The content inside the `{...}` block is an `rsx!` fragment that will be rendered for each iteration. + +#### Reactivity with Dependencies: `%$dep @for pattern in expr { ... }` + +Similar to `@if`, `@for` loops also support dependency tracking for reactive updates. + +```rust +let my_list = use_state(vec!["One".to_string(), "Two".to_string()]); + +// Later, you might update my_list.set(new_vec); +// or my_list.get_mut().push("Three"); + +rsx! { + "My Dynamic List:" + %my_list @for item in my_list.get_dl() { // This block re-renders if `my_list` changes + format!("- {}", item) + } +} +``` + +* **`%my_list`**: Declares `my_list` as a dependency. When `my_list` is updated, the loop will be re-executed, rendering the new list. + +### 6. Mount Hook: `!mount_hook_instance` + +This syntax is used to explicitly "mount" a component's lifecycle hook. This is specifically for `use_mount_manual`. + +```rust +let my_mount_hook = use_mount_manual(); + +rsx! { + "This text is always visible." + !my_mount_hook // Explicitly triggers the mount effects for `my_mount_hook` +} +``` + +* When `!my_mount_hook` is encountered in the `rsx!` output, it calls `my_mount_hook.mount()`, triggering any `use_effect` callbacks registered with that specific `Mount` instance. + +## Summary + +The `rsx!` macro is a powerful tool for building declarative user interfaces in OSUI. By combining text, expressions, components, conditionals, and loops with reactive dependencies, you can create complex and dynamic TUIs with a clean and familiar syntax. + +**Next:** Learn how to manage component data over time with OSUI's [State Management hooks](./02-state-management.md). diff --git a/docs/guides/02-state-management.md b/docs/guides/02-state-management.md new file mode 100644 index 0000000..833a970 --- /dev/null +++ b/docs/guides/02-state-management.md @@ -0,0 +1,196 @@ +markdown +--- +sidebar_position: 2 +title: State Management +--- + +# State Management + +Effective state management is crucial for building interactive and dynamic TUI applications. OSUI provides a React-like hook system that enables components to hold mutable state and react to changes efficiently. This guide covers the core state management hooks: `use_state` and `use_effect`. + +## `use_state`: Managing Component-Local State + +The `use_state` hook allows your components to declare and manage mutable, reactive state. When state managed by `use_state` changes, OSUI automatically re-renders affected parts of your UI. + +### Basic Usage + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn Counter(cx: &Arc) -> View { + // 1. Initialize state with `use_state` + // `count` is a `State`, initialized to 0. + let count = use_state(0); + + // 2. Define a button that increments the count + // This is a placeholder for actual interactive elements. + // In a real app, an event handler would trigger `count.set()` or `*count.get_mut()`. + let increment_button_simulated = { + let count = count.clone(); // Clone the State handle to move into the closure + move || { + // Option 1: Using `set()` for direct replacement + // count.set(*count.get() + 1); + + // Option 2: Using `get()` for mutable access (recommended for complex changes) + *count.get() += 1; // `Inner` guard automatically calls `update()` on drop + } + }; + + // Simulate clicking the button once per render for demonstration + // In a real app, this would be triggered by user input or other events. + increment_button_simulated(); + + rsx! { + // 3. Display the state value + // `count.get_dl()` gets a cloned, deadlock-less copy of the value. + // `count.get()` returns a guard for mutable access, also deadlock-less. + format!("Count: {}", count.get_dl()) + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(Counter {}).expect("Failed to run Counter app"); +} +``` + +In this example, the `Counter` component's state (`count`) is incremented on each render cycle (simulated). The `rsx!` macro automatically updates to reflect the new `count` value because the `Counter` component is re-rendered by the engine and the `count` state is used. + +### `State` and `Inner<'a, T>` + +* **`State`**: This is the primary handle to your reactive state. It's an `Arc>` internally, allowing safe shared ownership and mutation across threads. When you call `use_state(value)`, you get a `State`. +* **`count.get()`**: This method returns an `Inner<'a, T>` guard. `Inner` implements `Deref` and `DerefMut`, so you can treat it almost like a direct reference to your data (`*count.get()`). The `Inner` guard is crucial because it automatically triggers updates to dependents when it's dropped *if* the value was mutated. +* **`count.set(value)`**: A convenience method to replace the entire state value and then trigger updates. +* **`count.get_dl()`**: Returns a cloned copy of the state value. The "dl" stands for "deadlock-less", as it doesn't hold the mutex lock for an extended period, making it safer for quick reads. Use this when you only need to read the value and cloning is cheap. +* **`count.update()`**: Manually notifies all dependents that the state *might* have changed, even if you didn't use `get_mut()` or `set()`. Useful if you modify the internal `Arc>` directly (not recommended) or a complex part of `T` without triggering the `DerefMut` auto-update. + +### Important Considerations for `State`: + +* **Cloning `State` handles**: `State` itself can be cloned (`count.clone()`). This creates a new `Arc` reference to the *same* underlying state. This is essential when moving `State` into closures or child components. +* **`Send + Sync`**: The type `T` held by `State` must implement `Send` and `Sync` for thread-safe access. +* **Reactivity**: `use_state` makes state reactive. When the value changes, any `use_effect` or `rsx!` dynamic scope (`%state @if...` or `%state @for...`) that declared this `State` as a dependency will be re-evaluated. + +## `use_effect`: Performing Side Effects + +The `use_effect` hook allows you to perform side effects (e.g., logging, network requests, setting up event listeners) in response to state changes or component mounting. + +### Basic Usage + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn EffectExample(cx: &Arc) -> View { + let count = use_state(0); + let message = use_state("Initial message".to_string()); + + // Effect 1: Logs when `count` changes + use_effect( + { + let count = count.clone(); // Clone for the closure + move || { + println!("Effect 1: Count changed to {}", count.get_dl()); + } + }, + &[&count], // Dependencies: &[&dyn HookDependency] + ); + + // Effect 2: Logs when `message` changes (and also on initial render) + use_effect( + { + let message = message.clone(); + move || { + println!("Effect 2: Message is now '{}'", message.get_dl()); + } + }, + &[&message], // Dependencies: &[&dyn HookDependency] + ); + + // Simulate state changes (e.g., from user input or timers) + let _ = { + let count = count.clone(); + let message = message.clone(); + std::thread::spawn(move || { + sleep(500); // Wait 0.5 seconds + *count.get() += 1; // Triggers Effect 1 + sleep(500); + message.set("Updated message!".to_string()); // Triggers Effect 2 + sleep(500); + *count.get() += 1; // Triggers Effect 1 again + }); + }; + + rsx! { + format!("Count: {}", count.get_dl()) + format!("Message: {}", message.get_dl()) + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(EffectExample {}).expect("Failed to run EffectExample app"); +} +``` + +### `use_effect` Parameters: + +1. **`f: F`**: A closure (`FnMut() + Send + Sync + 'static`) that represents the side effect. This closure will be executed when any of its dependencies change. The closure is run in a separate spawned thread to avoid blocking the main rendering loop. +2. **`dependencies: &[&dyn HookDependency]`**: A slice of references to objects that implement the `HookDependency` trait. These are typically `State` instances. The effect closure will be called whenever any of these dependencies notify an update. + +### Understanding Dependencies: + +* **Empty Dependency List (`&[]`)**: If you pass an empty slice (`&[]`), the effect will only run once when the component is first mounted. This is useful for setup logic like initializing global resources or subscriptions. +* **Specific Dependencies**: When you list `State` objects as dependencies, the effect will run: + * Once, immediately when `use_effect` is called (during the initial component render). + * Again, whenever any of the listed `State` objects trigger an update. +* **`HookDependency` Trait**: This trait defines how an object can register an `HookEffect` to be called upon update. `State` and `Mount` both implement this trait, making them usable as dependencies. + +## Lifecycle Hooks: `use_mount` and `use_mount_manual` + +These hooks are special cases of `use_effect` for managing actions tied to a component's "mounting" lifecycle. + +* **`use_mount()`**: Returns a `Mount` instance that automatically calls `mount()` immediately upon its creation. Effects registered with this `Mount` instance will run once when the component is first rendered. +* **`use_mount_manual()`**: Returns a `Mount` instance that starts in an unmounted state. Effects registered with it will *only* run when you explicitly call `mount_instance.mount()`. This is useful for controlling the mount event from specific `rsx!` nodes (`!mount_instance`) or from other logic. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn LifecycleExample(cx: &Arc) -> View { + let mount_hook = use_mount(); // Automatically mounted + let manual_mount_hook = use_mount_manual(); // Manual mount needed + + use_effect( + move || { + println!("Component mounted (automatic hook)!"); + }, + &[&mount_hook], + ); + + use_effect( + move || { + println!("Component manually mounted!"); + }, + &[&manual_mount_hook], + ); + + rsx! { + "Lifecycle example" + // This will trigger the `manual_mount_hook`'s effects + !manual_mount_hook + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(LifecycleExample {}).expect("Failed to run LifecycleExample app"); +} +``` + +This guide has laid the foundation for managing state and side effects in your OSUI applications. By mastering `use_state` and `use_effect`, you can build sophisticated and responsive TUI experiences. + +**Next:** Learn how to handle user interactions and other events with OSUI's [Event Handling system](./03-event-handling.md). diff --git a/docs/guides/03-event-handling.md b/docs/guides/03-event-handling.md new file mode 100644 index 0000000..3723afd --- /dev/null +++ b/docs/guides/03-event-handling.md @@ -0,0 +1,285 @@ +markdown +--- +sidebar_position: 3 +title: Event Handling +--- + +# Event Handling + +OSUI provides a flexible and type-safe event system that allows components to react to various occurrences, such as user input, internal state changes, or custom application-specific events. This guide explains how to define, emit, and listen for events using `on_event`, `emit_event`, and `emit_event_threaded`. + +## Event Propagation Model + +In OSUI, events are propagated downwards through the component tree. When an event is emitted from a `Context`, it first triggers all registered handlers on that `Context`, and then recursively calls `emit_event` on all its child `Context`s. + +## Defining Custom Events + +Any Rust type that implements `Send + Sync + Any + 'static` can be used as an event. Typically, you'll define custom `struct`s or `enum`s for your events to carry specific data. + +```rust +// Define a custom event +#[derive(Debug, Clone)] +pub struct ButtonClickEvent { + pub button_id: usize, + pub timestamp: std::time::Instant, +} + +// Another custom event +#[derive(Debug, Clone)] +pub enum CustomAppEvent { + Tick, + ReloadData, +} +``` + +## Listening for Events: `cx.on_event()` + +Components can register event handlers using `cx.on_event()` to respond to specific event types. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::time::Instant; + +// Custom event definition +#[derive(Debug, Clone)] +pub struct MyCustomEvent { + pub value: String, +} + +#[component] +fn EventListener(cx: &Arc) -> View { + let received_events = use_state(Vec::::new()); + + // Register an event handler for `MyCustomEvent` + cx.on_event({ + let received_events = received_events.clone(); // Clone State for the closure + move |_ctx, event: &MyCustomEvent| { + // This closure runs when MyCustomEvent is emitted + let mut events_guard = received_events.get(); + events_guard.push(format!("Received: {}", event.value)); + // No need to call `update()` manually, `Inner` guard handles it on drop + } + }); + + rsx! { + "Event Listener Component" + @for msg in received_events.get_dl() { + format!("- {}", msg) + } + }.view(&cx) +} +``` + +* `cx.on_event, &T) + Send + Sync + 'static>(self: &Arc, handler: F)`: + * `T`: The type of event you want to listen for (e.g., `MyCustomEvent`). + * `F`: A closure that takes `&Arc` (the component's context) and `&T` (a reference to the event data). + * You pass a closure that captures the necessary state (`received_events` in this case) and logic to execute when the event fires. + +## Emitting Events: `cx.emit_event()` and `cx.emit_event_threaded()` + +Components or other parts of your application can send events using `cx.emit_event()` or `cx.emit_event_threaded()`. + +### `cx.emit_event()` (Synchronous) + +`emit_event` processes event handlers sequentially in the current thread. + +```rust +// ... (MyCustomEvent and EventListener component definitions from above) + +#[component] +fn EventSender(cx: &Arc) -> View { + let button_clicks = use_state(0); + + // Simulate an action that emits an event + let emit_click_event = { + let cx = cx.clone(); // Clone Context for the closure + let button_clicks = button_clicks.clone(); + move || { + let current_clicks = *button_clicks.get(); + *button_clicks.get() += 1; + let event = MyCustomEvent { + value: format!("Button clicked {} times", current_clicks + 1), + }; + cx.emit_event(event); // Emit the event + } + }; + + // Simulate clicking the button every second + use_effect( + { + let emit_click_event = emit_click_event.clone(); + move || { + loop { + sleep(1000); // Wait 1 second + emit_click_event(); + } + } + }, + &[], // No dependencies, run once on mount + ); + + rsx! { + format!("Button clicks: {}", button_clicks.get_dl()) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // EventSender and EventListener are siblings in the tree. + // Events emitted by EventSender will propagate down to EventListener. + EventSender {} + EventListener {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run App"); +} +``` + +### `cx.emit_event_threaded()` (Asynchronous) + +`emit_event_threaded` spawns a new thread for each registered event handler. This is useful for long-running or potentially blocking event handlers, preventing them from freezing your UI. + +```rust +// ... (MyCustomEvent, EventListener definitions) + +#[component] +fn ThreadedEventSender(cx: &Arc) -> View { + let cx_clone = cx.clone(); + // Emit an event using `emit_event_threaded` on mount + use_effect( + move || { + println!("Emitting threaded event on mount!"); + let event = MyCustomEvent { + value: "Threaded mount event".to_string(), + }; + cx_clone.emit_event_threaded(&event); // Notice the `&event` for threaded + }, + &[], // Run once on mount + ); + + rsx! { + "Threaded Event Sender" + }.view(&cx) +} + +#[component] +fn AppWithThreaded(cx: &Arc) -> View { + rsx! { + ThreadedEventSender {} + EventListener {} // This listener will receive the threaded event + }.view(&cx) +} + +// To run: engine.run(AppWithThreaded {}) +``` + +* `cx.emit_event_threaded(self: &Arc, event: &E)`: + * Takes `&E` (a reference to the event), which must implement `Clone` because each spawned thread receives a clone of the event data. + * Each handler for `E` will be executed in its own `std::thread::spawn`. + +## Realistic Usage Scenario: Interactive Counter + +Let's create a more interactive counter that responds to keyboard input. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use crossterm::event::{self, Event, KeyCode, KeyEventKind}; + +// Define a custom event for counter actions +#[derive(Debug, Clone)] +pub enum CounterAction { + Increment, + Decrement, +} + +#[component] +fn InteractiveCounter(cx: &Arc) -> View { + let count = use_state(0); + + // Listen for CounterAction events + cx.on_event({ + let count = count.clone(); + move |_ctx, action: &CounterAction| { + let mut count_guard = count.get(); + match action { + CounterAction::Increment => *count_guard += 1, + CounterAction::Decrement => *count_guard -= 1, + } + } + }); + + rsx! { + "Press 'q' to quit, '+' to increment, '-' to decrement." + format!("Current Count: {}", count.get_dl()) + }.view(&cx) +} + +// A component (or `main` function logic) to poll keyboard input +// and emit CounterAction events. +#[component] +fn KeyboardInputHandler(cx: &Arc) -> View { + // This effect runs once on mount to start the keyboard polling thread + use_effect( + { + let cx = cx.clone(); + move || { + let _ = crossterm::terminal::enable_raw_mode(); + loop { + if event::poll(std::time::Duration::from_millis(50)).unwrap() { + if let Event::Key(key_event) = event::read().unwrap() { + if key_event.kind == KeyEventKind::Press { + match key_event.code { + KeyCode::Char('+') => cx.emit_event(CounterAction::Increment), + KeyCode::Char('-') => cx.emit_event(CounterAction::Decrement), + KeyCode::Char('q') => { + let _ = crossterm::terminal::disable_raw_mode(); + cx.stop().expect("Failed to stop engine"); + break; + }, + _ => {} + } + } + } + } + } + } + }, + &[], // Empty deps: run once on mount + ); + + // This component doesn't render anything visible itself. + // Its purpose is purely to handle input and emit events. + rsx! { "" }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(AppWithKeyboardInput {}).expect("Failed to run interactive app"); + let _ = crossterm::terminal::disable_raw_mode(); // Ensure raw mode is disabled on exit +} + +#[component] +fn AppWithKeyboardInput(cx: &Arc) -> View { + rsx! { + KeyboardInputHandler {} // Handles input and emits events + InteractiveCounter {} // Listens for events and updates UI + }.view(&cx) +} +``` + +In this example: +* `KeyboardInputHandler` runs in a separate thread (due to `use_effect`'s spawning behavior). +* It polls for keyboard events using `crossterm`. +* Upon detecting `+`, `-`, or `q`, it emits a `CounterAction` or `Stop` command to its `Context`. +* `InteractiveCounter` listens for `CounterAction` events and updates its internal `count` state, which then causes it to re-render. +* The `stop()` command, emitted by `KeyboardInputHandler`, instructs the `Console` engine to terminate its rendering loop. + +This showcases a full interaction loop using custom events for communication between components. + +**Next:** Explore specialized lifecycle management with `use_mount` and `use_mount_manual` in [Lifecycle Hooks](./04-lifecycle-hooks.md). diff --git a/docs/guides/04-lifecycle-hooks.md b/docs/guides/04-lifecycle-hooks.md new file mode 100644 index 0000000..60827a0 --- /dev/null +++ b/docs/guides/04-lifecycle-hooks.md @@ -0,0 +1,150 @@ +markdown +--- +sidebar_position: 4 +title: Lifecycle Hooks +--- + +# Lifecycle Hooks + +In OSUI, components have a lifecycle, meaning they go through various stages from creation to destruction. While OSUI doesn't expose a full set of lifecycle methods like some frameworks, it provides powerful hooks for managing effects related to a component's "mounting" phase: `use_mount` and `use_mount_manual`. These are special applications of the `use_effect` hook, designed for setup logic. + +## The "Mounted" Concept + +A component is considered "mounted" when it has been rendered for the first time and is part of the active component tree. Lifecycle hooks allow you to run code precisely at this point. + +## `use_mount()`: Automatic Mounting + +The `use_mount()` hook provides a `Mount` instance that is automatically marked as "mounted" upon its creation. Any `use_effect` that depends on this `Mount` instance will execute its effect closure immediately when the component renders. + +### When to use `use_mount()`: + +* **Initial Setup**: Performing actions that should only happen once when the component first appears on screen, such as fetching initial data, setting up global event listeners, or initializing complex external resources. +* **No Cleanup Required**: For effects that don't require any cleanup logic. If cleanup is needed, ensure your effect closure handles it or consider using `use_effect` with an empty dependency array (which is similar in behavior for initial execution, but offers more control over subsequent runs if dependencies are added). + +### Example: Initial Data Fetch + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::time::Duration; + +// Simulate a data fetching operation +async fn fetch_data_async() -> String { + // In a real application, this would be an actual network request or disk read. + tokio::time::sleep(Duration::from_secs(1)).await; // Simulate network delay + "Data loaded successfully!".to_string() +} + +#[component] +fn DataLoader(cx: &Arc) -> View { + let data_state = use_state("Loading data...".to_string()); + let mount_hook = use_mount(); // Automatically initializes as "mounted" + + // Use `use_effect` with `mount_hook` as a dependency + use_effect( + { + let data_state = data_state.clone(); + move || { + // This effect runs once when `mount_hook` is initialized (component mounts) + println!("DataLoader: Component mounted, starting data fetch..."); + // Spawn a new async task (requires a runtime like tokio) + tokio::spawn(async move { + let data = fetch_data_async().await; + data_state.set(data); // Update state, triggering re-render + println!("DataLoader: Data fetch complete."); + }); + } + }, + &[&mount_hook], // Effect runs when `mount_hook` updates (i.e., on mount) + ); + + rsx! { + format!("Status: {}", data_state.get_dl()) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + DataLoader {} + }.view(&cx) +} + +pub fn main() { + // For async operations, you need a runtime like tokio. + // Add `tokio = { version = "1", features = ["full"] }` to your Cargo.toml + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run async app"); + }); +} +``` + +## `use_mount_manual()`: Explicit Mounting + +The `use_mount_manual()` hook provides a `Mount` instance that starts in an "unmounted" state. Its associated `use_effect` callbacks will *not* run until you explicitly call the `mount()` method on that specific `Mount` instance. This offers finer control over when initial setup logic executes. + +### When to use `use_mount_manual()`: + +* **Conditional Mounting**: When you want to delay the "mount" logic until a specific condition is met or an interaction occurs. +* **`rsx!`-driven Mounting**: You can trigger the `mount()` method directly from your `rsx!` template using the `!mount_hook_instance` syntax. This is useful if the mount event is tied to the presence of a specific element or a complex rendering path. + +### Example: Delayed Mount with `rsx!` + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn DelayedSetup(cx: &Arc) -> View { + let setup_status = use_state("Waiting for manual mount...".to_string()); + let manual_mount_hook = use_mount_manual(); // Starts unmounted + + use_effect( + { + let setup_status = setup_status.clone(); + move || { + // This effect will only run when `manual_mount_hook.mount()` is called. + println!("DelayedSetup: Manual mount triggered, performing setup!"); + setup_status.set("Setup complete!".to_string()); + } + }, + &[&manual_mount_hook], // Depends on the manual mount hook + ); + + rsx! { + format!("Status: {}", setup_status.get_dl()) + // The `!manual_mount_hook` in RSX triggers `manual_mount_hook.mount()` + // which then causes the `use_effect` to run. + !manual_mount_hook + "This component is now mounted." + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + DelayedSetup {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run delayed mount app"); +} +``` + +In this example, the "Setup complete!" message will appear only after the `!manual_mount_hook` line is processed by the `rsx!` renderer, explicitly calling `mount_hook.mount()`. + +## Summary of Lifecycle Hooks + +* `use_mount()`: For effects that should run once immediately when the component is initially rendered. +* `use_mount_manual()`: For effects that you want to explicitly control when they run, either through programmatic calls to `.mount()` or via the `!mount_hook_instance` syntax in `rsx!`. + +These hooks, combined with `use_effect`, give you fine-grained control over when side effects are performed during your component's lifetime. + +**Next:** Understand how to synchronize component state with events for sophisticated data flow patterns in [Data Flow and Sync](./05-data-flow-and-sync.md). diff --git a/docs/guides/05-data-flow-and-sync.md b/docs/guides/05-data-flow-and-sync.md new file mode 100644 index 0000000..533b38e --- /dev/null +++ b/docs/guides/05-data-flow-and-sync.md @@ -0,0 +1,216 @@ +markdown +--- +sidebar_position: 5 +title: Data Flow and Sync +--- + +# Data Flow and Synchronization + +OSUI's reactive state system and event handling capabilities provide a robust foundation for managing data flow within your application. The `use_sync_state` and `use_sync_effect` hooks offer powerful patterns for synchronizing component state with external events and vice versa, enabling sophisticated inter-component communication and data management. + +## `use_sync_state`: State from Events + +`use_sync_state` allows a component's internal `State` to be automatically updated whenever a specific type of event is emitted to its `Context`. This is a powerful way to inject external data or changes into a component's reactive state. + +### How it works: + +It combines `use_state` and `cx.on_event`. +1. You provide an initial value for the state. +2. You specify the event type (`E`) and a `decoder` function. +3. The `decoder` function takes an `&E` event and returns a new value `T` for the state. +4. Whenever an event of type `E` is emitted to the current `Context`, the `decoder` runs, and the internal `State` is updated. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use crossterm::event::{self, Event, KeyCode, KeyEventKind}; + +// Define a simple event to change a message +#[derive(Debug, Clone)] +pub struct MessageChangeEvent(pub String); + +#[component] +fn MessageDisplay(cx: &Arc) -> View { + // Use `use_sync_state` to update the message based on `MessageChangeEvent` + let message = use_sync_state( + cx, + "Initial Message".to_string(), // Initial state value + |event: &MessageChangeEvent| event.0.clone(), // Decoder: extract string from event + ); + + rsx! { + "Received Message:" + format!(" {}", message.get_dl()) + }.view(&cx) +} + +#[component] +fn MessageInput(cx: &Arc) -> View { + // Simulate input by reacting to key presses and emitting MessageChangeEvent + use_effect( + { + let cx = cx.clone(); + move || { + let _ = crossterm::terminal::enable_raw_mode(); + loop { + if event::poll(std::time::Duration::from_millis(50)).unwrap() { + if let Event::Key(key_event) = event::read().unwrap() { + if key_event.kind == KeyEventKind::Press { + match key_event.code { + KeyCode::Char(c) => { + let msg = format!("Typed: {}", c); + cx.emit_event(MessageChangeEvent(msg)); + }, + KeyCode::Enter => { + cx.emit_event(MessageChangeEvent("Enter pressed!".to_string())); + }, + KeyCode::Esc => { + let _ = crossterm::terminal::disable_raw_mode(); + cx.stop().expect("Failed to stop engine"); + break; + }, + _ => {} + } + } + } + } + } + } + }, + &[], // Run once on mount + ); + + rsx! { + "Type something to change the message (Esc to quit):" + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MessageInput {} // Emits MessageChangeEvent + MessageDisplay {} // Synchronizes its state with MessageChangeEvent + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); + let _ = crossterm::terminal::disable_raw_mode(); +} +``` + +In this example, `MessageInput` emits `MessageChangeEvent`s based on keyboard input. `MessageDisplay` automatically updates its `message` state whenever it receives one of these events from its parent `Context`, thanks to `use_sync_state`. + +## `use_sync_effect`: Events from State + +`use_sync_effect` allows changes in a component's internal `State` to automatically trigger the emission of a specific type of event to its `Context`. This is useful for communicating state changes upwards or to sibling components. + +### How it works: + +It combines `use_effect` and `cx.emit_event`. +1. You provide an `State` instance you want to monitor. +2. You specify an `encoder` function and optional dependencies. +3. The `encoder` function takes a `&State` and returns an event `Ev`. +4. Whenever the `State` changes (or any specified dependencies), the `encoder` runs, and the generated event `Ev` is emitted to the current `Context`. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::collections::HashMap; + +// Event to signal a counter has changed +#[derive(Debug, Clone)] +pub struct CounterUpdatedEvent { + pub id: usize, + pub new_value: i32, +} + +#[component] +fn ChildCounter(cx: &Arc, id: &usize, initial_value: &i32) -> View { + let count = use_state(*initial_value); + + // Use `use_sync_effect` to emit `CounterUpdatedEvent` when `count` changes + use_sync_effect( + cx, + &count, // Monitor this state + move |state_ref: &State| { + // Encoder: create an event from the state + CounterUpdatedEvent { + id: *id, + new_value: state_ref.get_dl(), + } + }, + &[&count], // Effect runs when `count` changes + ); + + // Simulate incrementing the counter periodically + use_effect( + { + let count = count.clone(); + move || { + loop { + sleep(1000); // Increment every second + *count.get() += 1; + } + } + }, + &[], // Run once on mount + ); + + rsx! { + format!("Counter {}: {}", id, count.get_dl()) + }.view(&cx) +} + +#[component] +fn ParentDashboard(cx: &Arc) -> View { + let all_counts = use_state(HashMap::::new()); + + // Listen for `CounterUpdatedEvent` from children + cx.on_event({ + let all_counts = all_counts.clone(); + move |_ctx, event: &CounterUpdatedEvent| { + let mut counts_guard = all_counts.get(); + counts_guard.insert(event.id, event.new_value); + } + }); + + rsx! { + "Dashboard Overview:" + @for (id, value) in all_counts.get_dl() { + format!(" Counter {}: {}", id, value) + } + "---" + ChildCounter { id: 1, initial_value: 0 } + ChildCounter { id: 2, initial_value: 10 } + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + ParentDashboard {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); +} +``` + +In this example: +* `ChildCounter` uses `use_sync_effect` to emit a `CounterUpdatedEvent` every time its internal `count` state changes. +* `ParentDashboard` listens for these `CounterUpdatedEvent`s (which bubble up from its children) using `cx.on_event` and updates its own `all_counts` `HashMap` state. This `HashMap` then drives the display in the dashboard. + +## When to use `use_sync_state` and `use_sync_effect`: + +* **Inter-component Communication**: When components need to communicate beyond simple prop passing. Events are excellent for sibling-to-sibling or child-to-ancestor communication without prop drilling. +* **Centralized State Management**: You can have a central "store" component that emits events, and other components `use_sync_state` to react to those events. +* **External System Integration**: When your TUI needs to react to external system events (e.g., file changes, network updates) by mapping them to internal `State`. +* **Decoupling**: They help decouple components, as they don't need direct references to each other, only awareness of event types. + +By combining `use_state`, `use_effect`, `use_sync_state`, and `use_sync_effect` with OSUI's event system, you can build powerful and maintainable data flow architectures for your TUI applications. + +**Next:** Learn how to arrange your components visually using OSUI's rendering primitives in [Building Complex Layouts](./06-building-complex-layouts.md). diff --git a/docs/guides/06-building-complex-layouts.md b/docs/guides/06-building-complex-layouts.md new file mode 100644 index 0000000..890ba0f --- /dev/null +++ b/docs/guides/06-building-complex-layouts.md @@ -0,0 +1,156 @@ +markdown +--- +sidebar_position: 6 +title: Building Complex Layouts +--- + +# Building Complex Layouts + +OSUI provides foundational primitives for rendering text and components, allowing you to compose them into complex layouts. While OSUI doesn't include a built-in layout engine (like flexbox or grid), it exposes the `DrawContext` and geometric types (`Point`, `Area`, `Size`) that enable you to manually position elements or build your own layout components. + +## The Rendering Pipeline + +At its core, OSUI's rendering works by accumulating `DrawInstruction`s into a `DrawContext`. The engine then takes this `DrawContext` and executes the instructions to draw to the terminal. + +1. **`View`**: A component returns a `View`, which is essentially a closure that takes a mutable `DrawContext` and adds drawing instructions to it. +2. **`DrawContext`**: This is the canvas for your component. It has an `area` (the total space available to the current component) and an `allocated` area (the space currently used by drawing instructions within that component). +3. **`DrawInstruction`**: The actual commands to draw, like `Text`, `View` (for child components), or `Child` (for nested `DrawContext`s). + +## Core Rendering Primitives + +These types, found in the `osui::render` module, are essential for manual layout. + +* ### `Point` + Represents a position `(x, y)` in terminal coordinates. `x` is column, `y` is row. + ```rust + pub struct Point { + pub x: u16, + pub y: u16, + } + ``` + +* ### `Size` + Represents `width` and `height` in terminal columns and rows. + ```rust + pub struct Size { + pub width: u16, + pub height: u16, + } + ``` + +* ### `Area` + Combines `Point` and `Size` to define a rectangular region. + ```rust + pub struct Area { + pub x: u16, + pub y: u16, + pub width: u16, + pub height: u16, + } + ``` + +## `DrawContext`: Your Drawing Canvas + +Inside a `View` closure, you receive a mutable `DrawContext`. This is how you interact with the rendering system. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn MyCustomLayout(cx: &Arc, children: &Rsx) -> View { + let children_view = children.view(&cx); // Convert Rsx children to a View + + Arc::new(move |ctx: &mut DrawContext| { + // `ctx.area` gives you the total available space for this component. + let available_width = ctx.area.width; + let available_height = ctx.area.height; + + // --- Manual layout example: Two columns --- + + // Allocate space for the left column + let left_col_area = ctx.allocate( + ctx.area.x, + ctx.area.y, + available_width / 2, + available_height, + ); + + // Draw some text in the left column + ctx.draw_text( + Point { x: left_col_area.x + 1, y: left_col_area.y + 1 }, + "Left Panel", + ); + ctx.draw_text( + Point { x: left_col_area.x + 1, y: left_col_area.y + 2 }, + &format!("Available: {}x{}", left_col_area.width, left_col_area.height), + ); + + // Allocate space for the right column + let right_col_area = ctx.allocate( + ctx.area.x + available_width / 2, // Start x at half width + ctx.area.y, + available_width / 2, + available_height, + ); + + // Draw the children (passed to MyCustomLayout) into the right column + // This effectively "moves" the children's rendering into this specific area. + ctx.draw_view( + right_col_area, // Children will render relative to this new area + children_view.clone(), + ); + + // Draw more text in the right column + ctx.draw_text( + Point { x: right_col_area.x + 1, y: right_col_area.y + 1 }, + "Right Panel (Children Area)", + ); + }) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MyCustomLayout { + rsx! { + "Hello from the child content!" + "This text should appear in the right panel." + } + } + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); +} +``` + +### Key `DrawContext` Methods: + +* **`ctx.area`**: The `Area` that the *current component* has been allocated by its parent. All drawing coordinates are relative to `ctx.area.x` and `ctx.area.y`. +* **`ctx.allocate(x, y, width, height)`**: This method marks a region within `ctx.area` as "used". It takes coordinates relative to `ctx.area`'s top-left corner (0,0 of its own space) and returns a new `Area` representing the allocated sub-region. It also updates `ctx.allocated` to be the union of all allocations so far within this `DrawContext`. +* **`ctx.draw_text(point, text)`**: Adds a `Text` instruction. `point` is relative to `ctx.area`. +* **`ctx.draw_view(area, view)`**: Adds a `View` instruction. This is how you tell the renderer to draw a child component (or another `View`) within a specific `area`. The `area` here is also relative to `ctx.area`. The child view will then receive this `area` as its own `ctx.area`. + +### Building a Simple Layout Component + +The `MyCustomLayout` component above demonstrates a basic two-column layout. You can create more sophisticated layout components by: + +1. **Calculating Sub-Regions**: Based on `ctx.area.width` and `ctx.area.height`, divide the space into logical sub-regions (e.g., header, footer, sidebar, main content). +2. **Allocating Space**: Use `ctx.allocate()` to define these sub-regions. +3. **Drawing Content**: + * For static text or background elements, use `ctx.draw_text()`. + * For child components, call `child_rsx.view(&cx)` to get their `View`, and then use `ctx.draw_view(sub_area, child_view)` to render them in their designated space. + +### Tips for Layouts: + +* **Relative Positioning**: Always think of `Point` and `Area` coordinates as being *relative* to the `ctx.area` of the current `View` being rendered. The `Console` engine handles translating these relative coordinates to absolute terminal coordinates. +* **No Overlapping**: Be mindful of overlapping areas. If you draw two things to the same `Point`, the last one drawn will overwrite the first. OSUI does not automatically manage Z-ordering. +* **Responsive Design**: Consider how your layouts will adapt to different terminal sizes. You can use `ctx.area.width` and `ctx.area.height` to make calculations dynamic. +* **Composition**: Layout components can themselves be children of other layout components, allowing you to build complex nested structures. + +While implementing a full layout system like CSS Flexbox is beyond the scope of OSUI's core, these primitives empower you to craft highly customized and visually rich terminal interfaces by manually managing space and component placement. + +**Next:** Explore the detailed [API Reference](../reference/00-crate-structure.md) for all OSUI modules and types. diff --git a/docs/intro/00-introduction.md b/docs/intro/00-introduction.md new file mode 100644 index 0000000..4afcad5 --- /dev/null +++ b/docs/intro/00-introduction.md @@ -0,0 +1,33 @@ +markdown +--- +sidebar_position: 0 +title: Introduction +--- + +# Introduction to OSUI + +OSUI is a powerful and flexible Rust library for building advanced Terminal User Interfaces (TUIs). It provides a component-based architecture inspired by modern web frameworks, offering a familiar and ergonomic development experience for crafting interactive command-line applications. + +## What is OSUI? + +OSUI stands for "Operating System User Interface" in the terminal context. It aims to bridge the gap between simple text-based applications and rich graphical user interfaces by offering a robust framework for complex TUI development. + +### Key Features + +* **Component System**: Build UIs using reusable, composable components that manage their own state and lifecycle. +* **Reactive State Management**: Leverage React-like hooks (`useState`, `useEffect`) for efficient and predictable state handling. +* **Declarative UI with RSX**: Define your UI structure using an intuitive, macro-based RSX (React-like Syntax) similar to JSX. +* **Event Handling**: A type-safe event system allows components to communicate and respond to user input and internal changes. +* **Pluggable Rendering Engine**: Ships with a `Console` engine for `crossterm`-based terminal rendering, and an extensible `Engine` trait for custom backends. +* **Benchmark Tooling**: Built-in benchmarking capabilities to measure and optimize rendering performance. + +## Why OSUI? + +Traditional TUI libraries often require imperative manipulation of the terminal buffer, which can become cumbersome for complex applications. OSUI addresses this by: + +* **Promoting Modularity**: Components encapsulate UI logic and appearance, making code easier to organize, test, and maintain. +* **Simplifying State Logic**: The hook-based state management system ensures that your UI automatically reacts to data changes, reducing boilerplate and potential bugs. +* **Enhancing Developer Experience**: The `rsx!` macro and `#[component]` attribute provide a declarative way to define your UI, allowing you to focus on *what* your UI should look like, rather than *how* to draw it. +* **Encouraging Scalability**: The clear separation of concerns (components, state, rendering engine) makes OSUI suitable for applications ranging from simple utilities to complex interactive dashboards. + +Whether you're building a CLI dashboard, an interactive configuration tool, or a text-based game, OSUI provides the tools to create engaging and performant terminal experiences. diff --git a/docs/intro/01-installation.md b/docs/intro/01-installation.md new file mode 100644 index 0000000..85ebe30 --- /dev/null +++ b/docs/intro/01-installation.md @@ -0,0 +1,44 @@ +markdown +--- +sidebar_position: 1 +title: Installation +--- + +# Installation + +To get started with OSUI, you need to add it as a dependency to your Rust project. OSUI is available on [crates.io](https://crates.io/crates/osui). + +## Adding OSUI to Your Project + +Open your project in your terminal and run this command: + +```bash +cargo add osui +``` + +The `osui` crate re-exports its procedural macros (`#[component]` and `rsx!`) through its `prelude` module, so you typically don't need to add `osui-macros` as a separate dependency. + +## Enabling the `rsx` Feature (Recommended) + +The `rsx` feature is crucial for using OSUI's declarative UI syntax. It is usually enabled by default when you add `osui` as a dependency. If you ever explicitly disable default features for `osui`, remember to re-enable `rsx`: + +```toml +[dependencies] +osui = { version = "0.2.0", features = ["rsx"] } +``` + +:::info +The `rsx` feature is vital for using OSUI's `rsx!` macro and `#[component]` attribute, which are fundamental to building UIs in OSUI. +::: + +## Building Your Project + +Once `osui` is added to your `Cargo.toml`, you can build your project using Cargo: + +```bash +cargo build +``` + +This will download and compile OSUI and its dependencies. + +You are now ready to start building your first OSUI application! Proceed to the [Getting Started](./02-getting-started.md) guide to write your first "Hello World" component. diff --git a/docs/intro/02-getting-started.md b/docs/intro/02-getting-started.md new file mode 100644 index 0000000..0854372 --- /dev/null +++ b/docs/intro/02-getting-started.md @@ -0,0 +1,90 @@ +markdown +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started: Hello World + +Let's write a minimal OSUI application that displays "Hello World" in the terminal. This example will introduce you to the core concepts of an OSUI application: the `Console` engine, running an application, and defining a basic component with `rsx!`. + +## 1. Create a New Project + +If you haven't already, create a new Rust binary project: + +```bash +cargo new hello-osui +cd hello-osui +``` + +## 2. Add OSUI Dependency + +```bash +cargo add osui +``` + +## 3. Write the Hello World Code + +Open `src/main.rs` and replace its contents with the following: + +```rust title="src/main.rs" +use osui::prelude::*; // Import commonly used OSUI items +use std::sync::Arc; + +pub fn main() { + // 1. Initialize the Console engine + // The Console engine uses crossterm to interact with the terminal. + let engine = Console::new(); + + // 2. Run the application + // The `run` method takes your root component and starts the rendering loop. + // It returns a `Result`, which we unwrap here for simplicity. + engine.run(App {}).expect("Failed to run OSUI application"); +} + +/// 3. Define your root component +/// The `#[component]` attribute transforms a function into a reusable UI component. +/// - The first parameter `cx: &Arc` is mandatory and provides access to component context (state, events, children). +/// - Components must return a `View`. +#[component] +fn App(cx: &Arc) -> View { + // 4. Use RSX (React-like Syntax) to define the UI + // `rsx!` is a procedural macro for declarative UI construction. + // Here, it just renders a simple string literal. + rsx! { + "Hello World" + } + // `view(&cx)` converts the RSX into a `View` that can be rendered. + .view(&cx) +} +``` + +## 4. Run Your Application + +Execute your application from the terminal: + +```bash +cargo run +``` + +You should see "Hello World" displayed in your terminal, which will then clear when the application exits. + +## Understanding the Code + +Let's break down the key parts of the "Hello World" example: + +* **`use osui::prelude::*;`**: This line imports the `prelude` module, which re-exports the most commonly used types and macros from OSUI. This includes `Console`, `Context`, `View`, `#[component]`, and `rsx!`. +* **`Console::new()`**: The `Console` struct is OSUI's default rendering engine. It uses the `crossterm` library to draw content to your terminal. +* **`engine.run(App {})`**: This starts the OSUI application lifecycle. It takes an instance of your root component (`App {}` in this case) and begins the continuous rendering loop. The `App` component will be rendered repeatedly until the application is stopped (e.g., by pressing `Ctrl+C` or a command from within the app). +* **`#[component] fn App(cx: &Arc) -> View { ... }`**: + * The `#[component]` attribute is a procedural macro that transforms a standard Rust function into an OSUI component. This enables prop handling and integration into the component tree. + * All component functions must take `cx: &Arc` as their first argument. The `Context` provides access to component-specific state, lifecycle methods, event handlers, and the ability to add child components. + * Component functions must return a `View`, which is an `Arc`. This `View` represents the instructions for rendering the component. +* **`rsx! { "Hello World" }.view(&cx)`**: + * The `rsx!` macro is OSUI's declarative UI syntax. It allows you to define a hierarchy of components and text nodes in a way that feels similar to HTML or React's JSX. + * In this simple case, `"Hello World"` is a text literal that `rsx!` converts into a renderable element. + * The `.view(&cx)` method takes the `Rsx` object generated by the `rsx!` macro and processes it within the current `Context`, ultimately producing the final `View` to be returned by the component. + +This simple example demonstrates the fundamental building blocks of an OSUI application. Next, we'll explore how to create more complex components and pass data between them. + +**Next:** Learn about [Creating Components](./03-example-basic-component.md) and passing them data. diff --git a/docs/intro/03-example-basic-component.md b/docs/intro/03-example-basic-component.md new file mode 100644 index 0000000..120eda3 --- /dev/null +++ b/docs/intro/03-example-basic-component.md @@ -0,0 +1,113 @@ +markdown +--- +sidebar_position: 3 +title: Basic Component with Children +--- + +# Basic Component with Children and Props + +In OSUI, applications are built by composing smaller, reusable components. This guide expands on the "Hello World" example by demonstrating how to define a custom component, pass data to it (props), and render its children. + +## 1. The `MyComponent` Example + +Let's modify our `src/main.rs` to introduce `MyComponent`. + +```rust title="src/main.rs" +use osui::prelude::*; +use std::sync::Arc; + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run engine"); +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // Here, MyComponent is instantiated with a string literal as its child. + // This string will be available inside MyComponent via the `children` prop. + MyComponent { "------ example" } + } + .view(&cx) +} + +#[component] +fn MyComponent(cx: &Arc, children: &Rsx) -> View { + rsx! { + // `@{children}` is an RSX expression that renders the children passed to MyComponent. + // It's a special syntax to embed an `Rsx` value directly into the component's output. + @{children} + "Simple Component" + } + .view(&cx) +} +``` + +## 2. Run the Application + +```bash +cargo run +``` + +You should see output similar to this: + +``` +------ example +Simple Component +``` + +The exact positioning will depend on your terminal's size and OSUI's default rendering behavior, but the text "------ example" (from the child) should appear before "Simple Component" (from `MyComponent` itself). + +## Understanding the Component Pattern + +### The `children` Prop + +In OSUI, just like in React or other component-based frameworks, content nested inside a component's `rsx!` invocation is implicitly passed as `children`. + +When you write: + +```rust +rsx! { + MyComponent { "------ example" } +} +``` + +The string literal `"------ example"` becomes the `children` prop for `MyComponent`. + +### `MyComponent` Definition + +Let's look at `MyComponent`'s definition: + +```rust +#[component] +fn MyComponent(cx: &Arc, children: &Rsx) -> View { + // ... +} +``` + +1. **`#[component]`**: Marks `MyComponent` as a reusable component. +2. **`cx: &Arc`**: The mandatory context parameter. +3. **`children: &Rsx`**: This is where the magic happens. Any content passed as children within the `rsx!` invocation for `MyComponent` (like `"------ example"`) will be collected into an `Rsx` type and passed to this `children` prop. The `Rsx` type itself is a collection of renderable nodes. +4. **`-> View`**: Components must return a `View`. + +### Rendering Children with `@{children}` + +Inside `MyComponent`'s `rsx!`: + +```rust +rsx! { + @{children} // Renders the content passed to MyComponent + "Simple Component" +} +``` + +* **`@{children}`**: This is an RSX expression. The `@{...}` syntax allows you to embed arbitrary Rust expressions directly into your `rsx!` output. In this case, `children` is an `&Rsx` value which implements `ToRsx`, making it eligible to be directly rendered as part of the component's output. When `children` is rendered, it generates its own `View`, effectively embedding the child content into the parent component's render tree. +* **`"Simple Component"`**: This is a direct text literal within `MyComponent`'s own output, rendered after the children. + +This pattern allows you to build highly flexible and composable components, where parents can define the overall structure and layout, while children provide specific content. + +## Next Steps + +You've seen how to define components and pass basic children. The next step is to explore the full power of OSUI's RSX syntax, including how to pass other types of props, use conditional rendering, and loop through data. + +**Next:** Dive into the details of the [RSX Syntax Guide](../guides/01-rsx-syntax.md). diff --git a/docs/reference/00-crate-structure.md b/docs/reference/00-crate-structure.md new file mode 100644 index 0000000..3afbf22 --- /dev/null +++ b/docs/reference/00-crate-structure.md @@ -0,0 +1,51 @@ +markdown +--- +sidebar_position: 0 +title: Crate Structure +--- + +# OSUI Crate Structure + +The `osui` library is organized into several modules, each responsible for a distinct aspect of TUI development. Understanding this structure helps in navigating the codebase and locating relevant functionalities. + +## Top-Level Modules + +The `osui` crate is composed of the following main modules: + +* **`component`**: Defines the core component system, including `Context` (for component state and lifecycle), `Scope` (for child management), and the `ComponentImpl` trait. +* **`engine`**: Provides the rendering engine trait (`Engine`), command execution system (`CommandExecutor`), and concrete engine implementations like `Console` (for `crossterm`) and `Benchmark`. +* **`frontend`**: Implements the RSX (React-like Syntax) system, including the `Rsx` struct and `ToRsx` trait, which bridges the `rsx!` macro output to the rendering pipeline. +* **`render`**: Contains low-level rendering primitives such as `DrawContext`, `DrawInstruction`, `Point`, `Area`, and `Size`. This module defines *what* gets drawn. +* **`state`**: Offers React-like hooks for managing component state (`use_state`), side effects (`use_effect`), and component lifecycle (`use_mount`, `use_mount_manual`). + +## `prelude` Module + +The `osui::prelude` module re-exports the most commonly used items from all sub-modules. It's recommended to `use osui::prelude::*;` in your application to easily access essential types and macros without verbose imports. + +```rust +pub mod prelude { + pub use crate::component::{context::*, scope::*, *}; + pub use crate::engine::*; + pub use crate::frontend::*; + pub use crate::render::*; + pub use crate::state::*; + pub use crate::{sleep, Error, Result, View, ViewWrapper}; + pub use crossterm; + pub use osui_macros::{component, rsx}; + pub use std::sync::{Arc, Mutex}; +} +``` + +## OSUI Core Types + +Beyond the modules, `lib.rs` also defines some fundamental type aliases and error handling: + +* **`View`**: `Arc`. Represents a renderable unit, essentially a closure that takes a `DrawContext` and adds drawing instructions. +* **`ViewWrapper`**: `Arc`. A higher-order view that can wrap and modify how another `View` is rendered (e.g., for applying layout or styling). +* **`Result`**: `std::result::Result`. The standard result type for OSUI operations. +* **`Error`**: An enum defining OSUI-specific errors, currently including `PoisonError` for mutex poisoning. +* **`sleep(delay_ms: u64)`**: A utility function for pausing execution for a specified duration. + +This structured approach helps keep the library organized and maintainable, allowing developers to quickly understand where to find the tools they need. + +**Next:** Dive into the details of the [Component API](./component-api.md). diff --git a/docs/reference/component-api.md b/docs/reference/component-api.md new file mode 100644 index 0000000..31dc864 --- /dev/null +++ b/docs/reference/component-api.md @@ -0,0 +1,118 @@ +markdown +--- +sidebar_position: 1 +title: Component API +--- + +# Component Module API Reference + +The `component` module is the heart of OSUI's UI system, defining how reusable UI units are structured, manage their state, and interact. + +## `ComponentImpl` Trait + +```rust +pub trait ComponentImpl: Send + Sync { + fn call(&self, cx: &Arc) -> View; +} +``` + +The `ComponentImpl` trait is implemented by all types that can act as an OSUI component. +* **`call(&self, cx: &Arc) -> View`**: The core method that renders the component. It takes a reference to the component itself (`self`) and the component's `Context` (`cx`), and returns a `View` which contains the drawing instructions. + +**Implementations:** +* **`View`**: A bare `View` (an `Arc`) can itself be a `ComponentImpl`, simply returning itself. +* **`Fn(&Arc) -> View`**: Any closure with this signature can also be a `ComponentImpl`. +* **`#[component]` macro**: The `#[component]` macro automatically generates a struct and implements `ComponentImpl` for it, wrapping your component function. + +## `Component` Type Alias + +```rust +pub type Component = Arc; +``` + +A convenience type alias for a `ComponentImpl` wrapped in an `Arc`, allowing for shared, thread-safe ownership. + +## `EventHandler` Type Alias + +```rust +pub type EventHandler = Arc, &dyn Any) + Send + Sync>>; +``` + +A type alias for a mutex-protected, thread-safe, mutable closure that handles events. Event handlers receive the component's `Context` and a reference to the event data (as `&dyn Any`). + +## `context` Module + +Contains the `Context` struct, which is central to each component instance. + +### `Context` Struct + +```rust +pub struct Context { + component: AccessCell, + view: AccessCell, + event_handlers: AccessCell>>, + pub(crate) scopes: Mutex>>, + executor: Arc, +} +``` + +The `Context` holds the runtime state and behavior for a specific component instance. It manages the component's `View`, its registered event handlers, and its child `Scope`s. + +#### Methods: + +* **`fn new(component: F, executor: Arc) -> Arc`** + * Creates a new `Arc` wrapped `Context` for the given component and command executor. +* **`fn refresh(self: &Arc)`** + * Re-renders the component by clearing existing event handlers and calling the component's `call` method to produce a new `View`. This is typically called automatically by the engine or `Rsx`. +* **`fn refresh_sync(self: &Arc)`** + * Synchronously re-renders the component, blocking until the view closure has finished executing. +* **`fn get_view(self: &Arc) -> View`** + * Returns a clone of the component's current `View`. +* **`fn on_event, &T) + Send + Sync + 'static>(self: &Arc, handler: F)`** + * Registers an event handler `F` for events of type `T`. When an event of type `T` is `emit`ted to this `Context`, the handler `F` will be invoked. +* **`fn emit_event(self: &Arc, event: E)`** + * Emits an event `E`. All registered handlers for type `E` on this `Context` are called synchronously, and then the event is propagated to all child components. +* **`fn emit_event_threaded(self: &Arc, event: &E)`** + * Emits an event `E`. Each registered handler for type `E` on this `Context` is called in a *newly spawned thread*. The event is then propagated to all child components (also using `emit_event_threaded`). Requires `E` to be `Clone`. +* **`fn scope(self: &Arc) -> Arc`** + * Creates a new, empty child `Scope` and adds it to this `Context`. Returns the new `Scope`. +* **`fn dyn_scope) + Send + Sync + 'static>(self: &Arc, drawer: F, dependencies: &[&dyn HookDependency]) -> Arc`** + * Creates a new *dynamic* child `Scope` that re-renders (by calling `drawer`) whenever any of its `dependencies` change. `drawer` is also called immediately. Returns the new `Scope`. +* **`fn add_scope(self: &Arc, scope: Arc)`** + * Adds an already constructed `Scope` as a child to this `Context`. +* **`fn draw_children(self: &Arc, ctx: &mut DrawContext)`** + * Iterates through all child `Scope`s and their components, rendering them into the provided `DrawContext`. Handles `ViewWrapper`s if present. +* **`fn get_executor(self: &Arc) -> Arc`** + * Returns a clone of the `CommandExecutor` associated with this `Context`. +* **`fn execute(self: &Arc, command: T) -> crate::Result<()>`** + * Executes a given `Command` using the associated `CommandExecutor`. +* **`fn stop(self: &Arc) -> crate::Result<()>`** + * A convenience method to execute the `Stop` command, terminating the application. + +## `scope` Module + +Contains the `Scope` struct, which organizes child components within a `Context`. + +### `Scope` Struct + +```rust +pub struct Scope { + pub children: Mutex, Option)>>, + executor: Arc, +} +``` + +A `Scope` groups child components. Each entry in `children` consists of a child `Context` and an optional `ViewWrapper` that can modify its rendering. + +#### Methods: + +* **`fn new(executor: Arc) -> Arc`** + * Creates a new `Arc` wrapped `Scope` with the given `CommandExecutor`. +* **`fn child(self: &Arc, child: F, view_wrapper: Option)`** + * Creates a new `Context` for the provided `child` component, refreshes it, and adds it to this `Scope`'s children, optionally with a `ViewWrapper`. +* **`fn view(self: &Arc, view: View)`** + * Creates a new `Context` directly from a `View` (without an explicit `ComponentImpl`), refreshes it, and adds it to this `Scope`'s children. + +This module forms the backbone of how component trees are constructed and managed in OSUI. + +**Next:** Explore the [Engine API](./engine-api.md). diff --git a/docs/reference/engine-api.md b/docs/reference/engine-api.md new file mode 100644 index 0000000..ad3985a --- /dev/null +++ b/docs/reference/engine-api.md @@ -0,0 +1,164 @@ +markdown +--- +sidebar_position: 2 +title: Engine API +--- + +# Engine Module API Reference + +The `engine` module defines the core interfaces for how OSUI applications run, render, and execute commands. It provides abstractions for different rendering backends and includes a default console implementation. + +## `Engine` Trait + +```rust +pub trait Engine { + fn run(&self, component: C) -> crate::Result; + fn init(&self, component: C) -> Arc; + fn render(&self, cx: &Arc); + fn render_delay(&self); + fn render_view(&self, area: &Area, view: &View) -> DrawContext; + fn draw_context(&self, ctx: &DrawContext); + fn executor(&self) -> Arc; +} +``` + +The `Engine` trait is the primary interface for running an OSUI application. It abstracts away the specifics of how components are initialized, rendered, and how the application loop is managed. + +#### Associated Types / Generics: + +* **`Output`**: A generic type that allows `run` to return different results. By default, it's `()`, but for specialized engines (like `Benchmark`), it can return custom data. + +#### Methods: + +* **`fn run(&self, component: C) -> crate::Result`** + * The main entry point to start the OSUI application loop. It takes the root component `C`, initializes it, and continuously renders until a stop command is issued. Returns `Ok(())` by default, or a custom `Output` for specialized engines. +* **`fn init(&self, component: C) -> Arc`** + * Initializes the rendering environment and creates the root `Context` for the application's top-level component. This is typically called by `run`. +* **`fn render(&self, cx: &Arc)`** + * Performs a full render cycle for the given `Context`. This usually involves clearing the screen, calling `render_view` for the root, and then `draw_context`. +* **`fn render_delay(&self)`** + * A hook for introducing a delay between render frames. The default implementation calls `crate::sleep(16)` for approximately 60 frames per second. +* **`fn render_view(&self, area: &Area, view: &View) -> DrawContext`** + * Takes a `View` and the `Area` it should render within, executing the `View`'s closure to produce a `DrawContext` filled with `DrawInstruction`s. +* **`fn draw_context(&self, ctx: &DrawContext)`** + * Executes the drawing instructions contained within a `DrawContext` to actually draw content to the rendering target (e.g., the terminal). +* **`fn executor(&self) -> Arc`** + * Returns the `CommandExecutor` instance used by this engine. + +## `Command` Trait + +```rust +pub trait Command { + fn as_any(&self) -> &dyn Any; +} +``` + +The `Command` trait is implemented by types that represent actions or instructions that can be executed by the `CommandExecutor`. This trait enables a type-safe way to send commands between components and the engine. + +* **`fn as_any(&self) -> &dyn Any`**: Allows downcasting the command to its concrete type for pattern matching and execution. + +## `CommandExecutor` Trait + +```rust +pub trait CommandExecutor: Send + Sync { + fn execute_command(&self, command: &Arc) -> crate::Result<()>; +} +``` + +The `CommandExecutor` trait defines how commands are processed within the OSUI application. Engines provide their own implementations of this trait to handle system-level operations. + +* **`fn execute_command(&self, command: &Arc) -> crate::Result<()>`**: Takes an `Arc` wrapped `Command` and executes it. Implementations typically use `command.as_any().downcast_ref()` to identify and process specific commands. + +## `console` Module: `Console` Engine and `ConsoleExecutor` + +The `console` module provides OSUI's default, `crossterm`-based rendering engine. + +### `Console` Struct + +```rust +pub struct Console { + threads: Mutex) + Send + Sync>>>, + executor: Arc, +} +``` + +The `Console` struct implements the `Engine` trait, specifically designed to render to a terminal using `crossterm`. + +#### Methods: + +* **`fn new() -> Self`**: Creates a new `Console` engine. +* **`fn thread) + Send + Sync + 'static>(&self, run: F)`**: Registers a closure to be run in a separate thread when the engine initializes. This is useful for background tasks or input polling that needs access to the main `Context`. + +#### `Engine` Trait Implementation: +The `Console` implements all methods of the `Engine` trait, handling terminal setup (raw mode, cursor hiding), screen clearing, `crossterm` cursor movements, and text output. + +### `ConsoleExecutor` Struct + +```rust +pub struct ConsoleExecutor { + running: Mutex, +} +``` + +The `ConsoleExecutor` implements the `CommandExecutor` trait for the `Console` engine. It manages the `running` state of the application. + +#### Methods: + +* **`fn is_running(self: &Arc) -> bool`**: Checks if the application is currently running. +* **`fn stop(&self) -> crate::Result<()>`**: Sets the internal `running` flag to `false`, signaling the `Console` engine to terminate its `run` loop. + +#### `CommandExecutor` Trait Implementation: +The `ConsoleExecutor` currently supports handling the `commands::Stop` command. + +## `commands` Module: Built-in Commands + +The `commands` module defines simple, built-in commands for the engine. + +### `Stop` Command + +```rust +pub struct Stop; + +impl Command for Stop { + fn as_any(&self) -> &dyn std::any::Any; +} +``` + +A basic command used to signal the `Engine` to stop its main loop and exit the application. + +## `benchmark` Module: `Benchmark` Engine + +The `benchmark` module provides a wrapper engine for performance testing. + +### `BenchmarkResult` Struct + +```rust +pub struct BenchmarkResult { + pub average: u128, + pub min: u128, + pub max: u128, + pub total_render: u128, + pub total: u128, +} +``` + +Holds the statistical results of a benchmark run, including average, minimum, maximum, total render time, and total overall time in microseconds. + +### `Benchmark` Struct + +```rust +pub struct Benchmark(T); +``` + +A wrapper around any other `Engine` that measures its rendering performance. + +#### Methods: + +* **`fn new(engine: T) -> Self`**: Creates a new `Benchmark` wrapper around an existing `Engine` instance. + +#### `Engine` Trait Implementation: +The `Benchmark` engine implements the `Engine` trait, but its `run` method performs multiple render cycles (e.g., 40 times), measures the duration of each, and returns a `BenchmarkResult` instead of `()`. It delegates all other `Engine` methods to the wrapped engine. + +This comprehensive set of traits and implementations allows OSUI to be flexible regarding its rendering backend and extensible with custom command handling. + +**Next:** Explore the [Frontend API](./frontend-api.md). diff --git a/docs/reference/frontend-api.md b/docs/reference/frontend-api.md new file mode 100644 index 0000000..0e72e08 --- /dev/null +++ b/docs/reference/frontend-api.md @@ -0,0 +1,78 @@ +markdown +--- +sidebar_position: 3 +title: Frontend API +--- + +# Frontend Module API Reference + +The `frontend` module is responsible for bridging the declarative `rsx!` macro syntax to the dynamic component rendering system. It defines how component hierarchies are constructed and managed before being translated into `View`s. + +## `ToRsx` Trait + +```rust +pub trait ToRsx { + fn to_rsx(&self) -> Rsx; +} +``` + +The `ToRsx` trait is implemented by any type that can be converted into an `Rsx` object. This is crucial for embedding various types (like strings, numbers, or other `Rsx` instances) directly into the `rsx!` macro output using the `@{expr}` syntax. + +**Implementations:** +* **`&Rsx`**: Converts a reference to an `Rsx` into an owned `Rsx` by cloning its internal structure. +* **`T: std::fmt::Display`**: Any type that implements `std::fmt::Display` (e.g., `String`, `&str`, `i32`, `f64`, etc.) automatically implements `ToRsx`. It converts the displayable value into a `Rsx` containing a static scope that draws the text. + +## `RsxScope` Enum + +```rust +#[derive(Clone)] +pub enum RsxScope { + Static(Arc) + Send + Sync>), + Dynamic( + Arc) + Send + Sync>, + Vec>, + ), + Child(Rsx), +} +``` + +`RsxScope` represents the different kinds of renderable units that can be part of an `Rsx` hierarchy. These scopes dictate how and when their content is processed and updated. + +* **`Static(Arc) + Send + Sync>)`**: + * Represents content that is processed only once. This is typically used for simple text literals or components that don't depend on reactive state within their `rsx!`. + * The contained closure is executed once to set up children within a new `Scope`. +* **`Dynamic(Arc) + Send + Sync>, Vec>)`**: + * Represents content that needs to be re-evaluated and potentially re-rendered when certain `dependencies` change. This is used for `rsx!` blocks with `@if` and `@for` that declare dependencies (`%dep`). + * The closure (`drawer`) is executed initially and then whenever any of the `HookDependency` instances in `dependencies` notify an update. +* **`Child(Rsx)`**: + * Represents a nested `Rsx` structure. This is used when an `Rsx` object is embedded directly into another `rsx!` block (e.g., via `@{other_rsx}` or when passing `children` to a component). + +## `Rsx` Struct + +```rust +#[derive(Clone)] +pub struct Rsx(Vec); +``` + +The `Rsx` struct is a collection of `RsxScope`s, representing a declarative UI tree fragment. It's the primary output of the `rsx!` macro. + +#### Methods: + +* **`fn new() -> Self`** + * Creates a new empty `Rsx` instance. +* **`fn static_scope) + Send + Sync + 'static>(&mut self, scope: F)`** + * Adds a `Static` `RsxScope` to the collection. The `scope` closure will be executed once to build up the content within a dedicated `Scope`. +* **`fn dynamic_scope) + Send + Sync + 'static>(&mut self, drawer: F, dependencies: Vec>)`** + * Adds a `Dynamic` `RsxScope` to the collection. The `drawer` closure will be executed initially and then on subsequent updates of the specified `dependencies`. +* **`fn child(&mut self, child: R)`** + * Adds a `Child` `RsxScope` to the collection, converting the input `R` (which must implement `ToRsx`) into a nested `Rsx`. +* **`fn generate_children(&self, context: &Arc)`** + * Processes the internal `Vec`, converting each scope into actual component `Context`s and `Scope`s within the provided parent `context`. This method recursively builds the component tree. +* **`fn view(&self, context: &Arc) -> View`** + * The primary method used by components to turn their `rsx!` output into a renderable `View`. + * It first calls `generate_children` to build the component tree within the given `context`. + * It then returns a `View` closure that, when executed, will instruct the `context` to `draw_children`. + +The `frontend` module, through `Rsx` and `RsxScope`, provides the declarative interface and the necessary translation layer to OSUI's imperative rendering core. + +**Next:** Explore the [Render API](./render-api.md). diff --git a/docs/reference/macros-api.md b/docs/reference/macros-api.md new file mode 100644 index 0000000..7905a8b --- /dev/null +++ b/docs/reference/macros-api.md @@ -0,0 +1,212 @@ +markdown +--- +sidebar_position: 6 +title: Macros API +--- + +# Macros Module API Reference + +The `osui-macros` crate provides the procedural macros that enhance OSUI's ergonomics and enable its declarative UI syntax. These macros transform your Rust code into the necessary OSUI component and rendering structures. + +## `#[component]` Attribute Macro + +```rust +#[proc_macro_attribute] +pub fn component(_attr: TokenStream, item: TokenStream) -> TokenStream { /* ... */ } +``` + +The `#[component]` attribute macro transforms a standard Rust function into a fully-fledged OSUI component. + +#### Purpose: + +* **Prop Generation**: It automatically parses the function's parameters (after the initial `cx: &Arc`) and generates a `struct` with matching fields. These fields become the component's "props". +* **`ComponentImpl` Implementation**: It implements the `ComponentImpl` trait for the generated struct, making it a valid OSUI component that can be rendered. The `call` method of this trait simply invokes your original function. +* **Ergonomics**: Simplifies component definition by allowing you to write components as regular functions with clear parameters, without manually defining structs and `ComponentImpl` boilerplate. + +#### Usage: + +```rust +use osui::prelude::*; // For Context and View types +use std::sync::Arc; + +#[component] +pub fn MyComponent(cx: &Arc, message: &str, count: &usize) -> View { + // Your component logic, accessing `message` and `count` directly + rsx! { + format!("Message: {}, Count: {}", message, count) + }.view(&cx) +} + +// How `MyComponent` would be used in RSX: +// rsx! { +// MyComponent { message: "Hello", count: 123 } +// } +``` + +#### Generated Code (Simplified): + +```rust +pub struct MyComponent { + pub message: String, // Note: `&str` becomes `String` + pub count: usize, // Note: `&usize` becomes `usize` +} + +impl MyComponent { + pub fn component( + cx: &Arc, + message: &str, // Original function signature as `component` method + count: &usize, + ) -> View { + // Original body of the function + rsx! { + format!("Message: {}, Count: {}", message, count) + }.view(&cx) + } +} + +impl ComponentImpl for MyComponent { + fn call(&self, cx: &Arc) -> View { + Self::component( + cx, + &self.message, // Passes stored props as references + &self.count, + ) + } +} +``` + +#### Requirements: + +* The function must take `cx: &Arc` as its first parameter. +* The function must return `View`. +* Prop parameters are typically references (e.g., `&str`, `&i32`). The macro automatically converts them to their owned types (e.g., `String`, `i32`) in the generated struct. + +## `rsx!` Procedural Macro + +```rust +#[proc_macro] +pub fn rsx(input: TokenStream) -> TokenStream { /* ... */ } +``` + +The `rsx!` macro provides a declarative, React-like syntax for building UI component hierarchies directly in your Rust code. It parses the input and transforms it into calls to the `osui::frontend::Rsx` builder methods. + +#### Purpose: + +* **Declarative UI**: Allows you to describe *what* your UI should look like, rather than imperatively writing drawing commands. +* **Component Composition**: Enables easy nesting and passing of props/children to other components. +* **Reactive Flow**: Integrates with OSUI's state management to define dynamic UI segments. + +#### Syntax Overview: + +The `rsx!` macro supports several types of nodes: + +1. **Text Literals**: + ```rust + rsx! { + "Hello World" + "Another line of text" + } + // Generates: + // r.static_scope(move |scope| { + // scope.view(Arc::new(move |ctx| { + // ctx.draw_text(Point { x: 0, y: 0 }, &format!("Hello World")) + // })); + // // ... for another line + // }); + ``` + +2. **Rust Expressions (`@{expr}`)**: + ```rust + let name = "Alice"; + rsx! { + @{format!("Hello, {}!", name)} + @{1 + 2} // Any `Display` impl + } + // Generates: + // r.child(format!("Hello, {}!", name)); + // r.child(1 + 2); + ``` + * The `expr` must evaluate to a type that implements `osui::frontend::ToRsx`. + +3. **Component Instantiation (`Component { prop: value, ... children }`)**: + ```rust + #[component] fn MyDiv(cx: &Arc, content: &str) -> View { /* ... */ } + rsx! { + MyDiv { + content: "Some text", // Prop + rsx! { "Child content" } // Children (if `children: &Rsx` is a prop) + } + } + // Generates: + // r.static_scope(move |scope| { + // scope.child( + // MyDiv { + // content: "Some text".to_string(), // Owned type for struct field + // children: osui::frontend::Rsx(/* ... */) + // }, + // None + // ); + // }); + ``` + * `path`: The path to the component struct (e.g., `MyDiv`, `my_module::MyComponent`). + * `props`: `key: value` pairs for component properties. + * `children`: Any `rsx!` content directly inside the braces after props. This is collected into the special `children: &Rsx` prop if the component defines it. + +4. **Conditional Rendering (`@if condition { ... } [else { ... }]`)**: + ```rust + let show = true; + rsx! { + %show @if show { + "Content shown if 'show' is true" + } else { + "Content shown if 'show' is false" + } + } + // Generates: + // r.dynamic_scope(move |scope| { + // if show { + // // ... rsx for true branch + // } else { + // // ... rsx for false branch + // } + // }, vec![Arc::new(show) as Arc]); + ``` + * `%dep1, dep2`: Optional dependency list. The `if` block will re-evaluate when any of these dependencies (which must implement `HookDependency`, like `State`) change. + * `condition`: A Rust expression evaluating to `bool`. + * `{ ... }`: An `rsx!` fragment rendered if `condition` is true. + * `else { ... }`: Optional `rsx!` fragment rendered if `condition` is false. + +5. **Loop Rendering (`@for pattern in expr { ... }`)**: + ```rust + let items = vec!["A", "B", "C"]; + rsx! { + %items @for item in items { + format!("Item: {}", item) + } + } + // Generates: + // r.dynamic_scope(move |scope| { + // for item in items { + // // ... rsx for each item + // } + // }, vec![Arc::new(items) as Arc]); + ``` + * `%dep1, dep2`: Optional dependency list. The `for` loop will re-evaluate when any of these dependencies change. + * `pattern`: A standard Rust `for` loop pattern (e.g., `item`, `(idx, item)`). + * `expr`: A Rust expression evaluating to an `IntoIterator`. + * `{ ... }`: An `rsx!` fragment rendered for each iteration. + +6. **Mount Hook (`!mount_hook_instance`)**: + ```rust + let my_manual_mount = use_mount_manual(); + rsx! { + !my_manual_mount + } + // Generates: + // my_manual_mount.mount(); + ``` + * Calls the `.mount()` method on the provided `Mount` instance. This is typically used with `use_mount_manual` to trigger effects at a specific point in the render tree. + +The `rsx!` macro is a powerful tool for declarative UI construction, abstracting away the underlying `Rsx` object manipulation and `Scope` creation logic. + +**Next:** Explore the detailed [Render API](./render-api.md). diff --git a/docs/reference/render-api.md b/docs/reference/render-api.md new file mode 100644 index 0000000..bd61313 --- /dev/null +++ b/docs/reference/render-api.md @@ -0,0 +1,100 @@ +markdown +--- +sidebar_position: 4 +title: Render API +--- + +# Render Module API Reference + +The `render` module provides the foundational primitives for drawing content to the terminal. It defines basic geometric types and the `DrawContext` for accumulating drawing instructions, abstracting away the specifics of the underlying terminal backend. + +## Geometric Primitives + +These structs define positions and dimensions within the terminal grid. + +### `Point` Struct + +```rust +#[derive(Clone)] +pub struct Point { + pub x: u16, // X coordinate (column) + pub y: u16, // Y coordinate (row) +} +``` + +Represents a specific coordinate in a 2D grid. + +### `Size` Struct + +```rust +#[derive(Clone)] +pub struct Size { + pub width: u16, // Width in terminal columns + pub pub height: u16, // Height in terminal rows +} +``` + +Represents the dimensions of a rectangular area. + +### `Area` Struct + +```rust +#[derive(Clone)] +pub struct Area { + pub x: u16, // X coordinate (column) of the top-left corner + pub y: u16, // Y coordinate (row) of the top-left corner + pub width: u16, // Width in terminal columns + pub height: u16, // Height in terminal rows +} +``` + +Represents a rectangular region defined by its top-left corner (`x`, `y`) and its `width` and `height`. + +## `DrawInstruction` Enum + +```rust +#[derive(Clone)] +pub enum DrawInstruction { + Text(Point, String), + View(Area, View), + Child(Point, DrawContext), // For embedding child DrawContexts at an offset +} +``` + +`DrawInstruction` enumerates the different types of atomic drawing operations that the rendering engine can perform. + +* **`Text(Point, String)`**: Instructs the engine to draw a given `String` at a specific `Point`. +* **`View(Area, View)`**: Instructs the engine to render a nested `View` within a specified `Area`. This is how child components are rendered. +* **`Child(Point, DrawContext)`**: Instructs the engine to render a child `DrawContext` at a given offset `Point`. This is typically used internally when drawing recursively. + +## `DrawContext` Struct + +```rust +#[derive(Clone)] +pub struct DrawContext { + pub area: Area, // The total area available for drawing to this context + pub allocated: Area, // The union of all allocated sub-areas within this context + pub drawing: Vec, // Accumulated drawing instructions +} +``` + +The `DrawContext` is the primary interface for components to issue drawing commands. Each component's `View` receives a `DrawContext` that represents its allocated drawing space. It accumulates `DrawInstruction`s which are then processed by the `Engine`. + +#### Methods: + +* **`fn new(area: Area) -> Self`** + * Creates a new `DrawContext` with the specified `area` as its total available space. Initializes `allocated` to an "empty" area (max `u16` for x/y, 0 for width/height). +* **`fn allocate(&mut self, x: u16, y: u16, width: u16, height: u16) -> Area`** + * Marks a sub-region within the `DrawContext`'s `area` as "allocated". + * Updates the `self.allocated` field to grow to encompass this new allocation. + * Returns the `Area` representing the newly allocated space. Coordinates (`x`, `y`) are relative to `self.area`'s top-left corner. +* **`fn draw(&mut self, inst: DrawInstruction)`** + * Adds a raw `DrawInstruction` to the `drawing` vector. +* **`fn draw_text(&mut self, point: Point, text: &str)`** + * A convenience method to add a `DrawInstruction::Text` to the context. `point` is relative to `self.area`. +* **`fn draw_view(&mut self, area: Area, view: View)`** + * A convenience method to add a `DrawInstruction::View` to the context. `area` is relative to `self.area`. + +This module lays the groundwork for all visual output in OSUI, providing the necessary abstractions for components to describe what they want to render without knowing the specifics of the terminal backend. + +**Next:** Explore the [State API](./state-api.md). diff --git a/docs/reference/state-api.md b/docs/reference/state-api.md new file mode 100644 index 0000000..b824b88 --- /dev/null +++ b/docs/reference/state-api.md @@ -0,0 +1,166 @@ +markdown +--- +sidebar_position: 5 +title: State API +--- + +# State Module API Reference + +The `state` module provides OSUI's powerful, React-like hook system for managing component state and side effects. These hooks enable reactivity, allowing your UI to automatically update in response to data changes. + +## `State` Struct + +```rust +#[derive(Debug)] +pub struct State { + value: Arc>, + dependents: Arc>>, +} +``` + +`State` is the primary type for holding reactive, component-local state. It wraps a value `T` in an `Arc>` for thread-safe access and includes a list of `HookEffect`s that should be triggered when its value changes. + +#### Methods: + +* **`fn get(&self) -> Inner<'_, T>`** + * Acquires a lock on the internal `Mutex` and returns an `Inner<'_, T>` guard. This guard provides mutable (`DerefMut`) access to the state value. When the `Inner` guard is dropped, if the value was mutated, all `dependents` (registered `HookEffect`s) are notified. +* **`fn get_dl(&self) -> T`** + * "Deadlock-less" getter. Acquires a lock, clones the internal value `T`, releases the lock, and returns the cloned value. Useful for reading the state when cloning `T` is cheap and you don't need mutable access, preventing potential deadlocks from holding a `MutexGuard` across `await` points or other blocking operations. Requires `T: Clone`. +* **`fn set(&self, v: T)`** + * Replaces the current state value with `v` and then explicitly notifies all `dependents`. +* **`fn update(&self)`** + * Manually triggers all registered `dependents`. Useful if you've modified the internal value without using `get()` (e.g., via `Arc::get_mut` if the `Arc` is uniquely owned, which is rare for `State`). +* **`fn clone(&self) -> Self`** + * Clones the `State` handle (not the internal value). This creates a new `Arc` reference to the same underlying `value` and `dependents`. Essential for moving `State` into closures or passing to child components without moving the actual state. + +#### `Display` Implementation: +If `T` implements `std::fmt::Display`, `State` also implements `std::fmt::Display`, allowing it to be directly formatted (e.g., in `format!`) by implicitly calling `get_dl()`. + +### `Inner<'a, T>` Struct + +```rust +pub struct Inner<'a, T> { + value: MutexGuard<'a, T>, + dependents: Arc>>, + updated: bool, +} +``` + +A guard type returned by `State::get()`. It provides scoped, mutable access to the internal state value. + +#### `Deref` and `DerefMut` Implementations: +* Allows `Inner<'a, T>` to be treated as a `&T` or `&mut T`, giving direct access to the underlying state. +* The `DerefMut` implementation sets an internal `updated` flag. + +#### `Drop` Implementation: +* When `Inner<'a, T>` is dropped, if the `updated` flag is `true`, it automatically iterates through `dependents` and calls their `call()` method, ensuring reactivity. + +## `HookEffect` Struct + +```rust +#[derive(Clone)] +pub struct HookEffect(Arc>); +``` + +A wrapper around a mutex-protected closure that represents a side effect. These are registered as dependents of `State` or `Mount` and are triggered when dependencies change. + +#### Methods: + +* **`fn new(f: F) -> Self`** + * Creates a new `HookEffect` from a given closure. +* **`fn call(&self)`** + * Executes the wrapped closure by acquiring its mutex. + +## `HookDependency` Trait + +```rust +pub trait HookDependency: Send + Sync { + fn on_update(&self, hook: HookEffect); +} +``` + +The `HookDependency` trait defines how an object can register an effect (`HookEffect`) to be triggered when it updates. + +**Implementations:** +* **`State`**: Registers the `HookEffect` to be called when `State`'s value changes (via `set()`, `get()` and subsequent drop, or `update()`). +* **`Mount`**: Registers the `HookEffect` to be called when `mount()` is invoked, or immediately if already mounted. + +## `Mount` Struct + +```rust +#[derive(Debug, Clone)] +pub struct Mount(Arc>, Arc>>); +``` + +A specialized hook for managing component lifecycle (specifically, the "mounted" state). It tracks whether a component has been mounted and queues `HookEffect`s to be run upon mounting. + +#### Methods: + +* **`fn mount(&self)`** + * Sets the internal flag to `true`, indicating the component is now mounted. + * Executes all currently queued `HookEffect`s and clears the queue. + * Any `HookEffect` registered after `mount()` has been called will execute immediately. + +## Hooks Functions + +These functions are the primary way to interact with the state management system within your components. + +### `fn use_state(v: T) -> State` + +* **Purpose**: Creates and initializes a new `State` instance. +* **Usage**: `let count = use_state(0);` + +### `fn use_effect(f: F, dependencies: &[&dyn HookDependency])` + +* **Purpose**: Registers a side effect `f` that will run when any of the `dependencies` change, and also once initially. The effect closure is run in a `std::thread::spawn`. +* **Usage**: + ```rust + let counter = use_state(0); + use_effect( + { let counter = counter.clone(); move || println!("Counter changed: {}", counter.get_dl()) }, + &[&counter] // Dependencies + ); + ``` +* **Empty Dependencies**: If `dependencies` is `&[]`, the effect runs once on initial render and never again. + +### `fn use_mount() -> Mount` + +* **Purpose**: Creates a `Mount` instance that is immediately marked as "mounted". Effects registered with this `Mount` (via `use_effect`) will run once, immediately. +* **Usage**: `let mount_hook = use_mount();` + +### `fn use_mount_manual() -> Mount` + +* **Purpose**: Creates a `Mount` instance that starts in an "unmounted" state. Effects registered with this `Mount` will *only* run when its `.mount()` method is explicitly called (either programmatically or via `!mount_hook_instance` in `rsx!`). +* **Usage**: `let manual_mount_hook = use_mount_manual();` + +### `fn use_sync_state(cx: &Arc, v: T, decoder: D) -> State` + +* **Purpose**: Creates a `State` that automatically updates its value whenever an event of type `E` is emitted to the given `Context`. The `decoder` function converts `&E` into a new `T`. +* **Usage**: + ```rust + // Assume MessageChangeEvent is defined + let message_state = use_sync_state( + cx, + "Default message".to_string(), + |event: &MessageChangeEvent| event.0.clone() + ); + ``` + +### `fn use_sync_effect(cx: &Arc, state: &State, encoder: E, deps: &[&dyn HookDependency])` + +* **Purpose**: Registers an effect that emits an event `Ev` to the given `Context` whenever the monitored `state` changes (or any other specified `deps`). The `encoder` function converts `&State` into an `Ev`. +* **Usage**: + ```rust + let count_state = use_state(0); + // Assume CounterUpdatedEvent is defined + use_sync_effect( + cx, + &count_state, + |s: &State| CounterUpdatedEvent { new_value: s.get_dl() }, + &[&count_state] + ); + ``` + +These hooks provide a complete and reactive state management solution, enabling dynamic and interactive TUI applications in OSUI. + +**Next:** Delve into the details of the [Macros API](./macros-api.md). diff --git a/versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md b/versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md new file mode 100644 index 0000000..36a4ffb --- /dev/null +++ b/versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md @@ -0,0 +1,181 @@ +markdown +--- +sidebar_position: 0 +title: Performance Benchmarking +--- + +# Performance Benchmarking + +Optimizing rendering performance is crucial for smooth and responsive TUI applications, especially those with complex layouts or frequent updates. OSUI provides a built-in `Benchmark` engine wrapper that allows you to easily measure the rendering speed of your components. + +## The `Benchmark` Engine + +The `osui::engine::benchmark` module offers the `Benchmark` struct, which wraps an existing engine (like `Console`) and records detailed timing information for its rendering cycles. + +### How it works: + +1. You instantiate a `Benchmark` by passing it another `Engine` (e.g., `Console::new()`). +2. When you call `benchmark_engine.run(YourApp {})`, the `Benchmark` engine takes over. +3. Instead of running the application indefinitely, it performs a fixed number of render cycles (defaulting to 40 in `Benchmark::run`). +4. For each cycle, it precisely measures the time taken to `render` your root component. +5. After all cycles, it clears the screen and returns a `BenchmarkResult` containing statistics. + +## `BenchmarkResult` + +The `BenchmarkResult` struct holds the collected performance metrics: + +```rust +pub struct BenchmarkResult { + pub average: u128, // Average render time in microseconds + pub min: u128, // Minimum render time in microseconds + pub max: u128, // Maximum render time in microseconds + pub total_render: u128, // Sum of all render times in microseconds + pub total: u128, // Total time spent during the benchmark (including setup) +} +``` + +These values are typically in microseconds (`µs`). + +## Basic Usage Example + +Let's use the `simple_benchmark.rs` example to see the `Benchmark` engine in action: + +```rust title="examples/simple_benchmark.rs" +use osui::prelude::*; +use std::sync::Arc; // Needed for Arc + +pub fn main() { + // 1. Create a Console engine instance. + let console_engine = Console::new(); + + // 2. Wrap it with the Benchmark engine. + let benchmark_engine = Benchmark::new(console_engine); + + // 3. Run your application (or component) through the Benchmark engine. + let benchmark_result = benchmark_engine.run(App {}).expect("Failed to run benchmark"); + + // 4. Print the results. + println!("Avg: {} μs", benchmark_result.average); + println!("Min: {} μs", benchmark_result.min); + println!("Max: {} μs", benchmark_result.max); + println!("Tot: {} μs", benchmark_result.total); + println!("Tot Render: {} μs", benchmark_result.total_render); +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + "Hello, world!" + } + .view(&cx) +} +``` + +To run this example: + +```bash +cargo run --example simple_benchmark +``` + +You will see output similar to: + +``` +Avg: 1078 μs +Min: 1078 μs +Max: 1078 μs +Tot: 43120 μs +Tot Render: 43120 μs +``` +*(Note: Actual values will vary based on your system and terminal emulator.)* + +## Advanced Usage: Benchmarking Complex Scenarios + +The `benchmark.rs` example demonstrates how to benchmark nested components and iterate through different complexity levels. This is useful for identifying performance bottlenecks in specific UI patterns. + +```rust title="examples/benchmark.rs" +use osui::prelude::*; +use std::collections::HashMap; // Needed for HashMap + +pub fn main() { + let engine = Arc::new(Benchmark::new(Console::new())); // Wrap Console in Benchmark, then Arc it. + + let mut benchmark_results: HashMap<(usize, usize), BenchmarkResult> = HashMap::new(); + + // Iterate through different levels of nesting (n) and iterations (i) + for i in 0..15 { + for n in 0..15 { + let res = { + let mut results = Vec::with_capacity(6); + + // Run each specific benchmark configuration multiple times (e.g., 6) + // to get more consistent results, then pick the median (index 3 after sort). + for _ in 0..6 { + results.push( + engine + .run(App { + n: n * 72, // Scale nesting depth + i: i * 72, // Scale iteration count (for loops) + }) + .expect("Failed to run engine"), + ); + } + + results.sort_by_key(|r| r.total_render); // Sort by total render time + results[3].clone() // Take the median result + }; + + benchmark_results.insert((i, n as usize), res); + } + } + + // Output results in CSV format + println!("Iterx72,Nestingx72,Time µs"); + for ((i, n), bench) in benchmark_results.iter() { + println!("{i},{n},{}", bench.total_render); + } +} + +// A recursive component that creates nested children and loops +#[component] +fn App(cx: &Arc, n: usize, i: usize) -> View { + let n = n.clone(); // Clone props for closure (necessary for #[component] macro) + let i = i.clone(); + + if n == 0 { + // Base case: deepest level, render a simple string + rsx! { + "Hello, world!" + } + .view(&cx) + } else { + // Recursive case: create `i` number of children, each with reduced nesting `n-1` + rsx! { + @for _ in (0..i) { // Loop `i` times + App { n: n - 1, i: 0 } // Create a nested App component + } + } + .view(&cx) + } +} +``` + +This example: +* Uses an `Arc` to allow `run` to be called multiple times. +* Iterates through different `n` (nesting depth) and `i` (number of children in a loop) values. +* Runs each configuration multiple times and takes the median `total_render` to reduce noise. +* Prints the results in CSV format, which can be easily imported into spreadsheet software for analysis (like the `benchmark.csv` in the repository). + +## Interpreting Results + +* **`average`, `min`, `max`**: Provide insight into the consistency of your rendering performance. A large difference between `min` and `max` might indicate inconsistencies or external factors affecting performance. +* **`total_render`**: The sum of all individual render cycle times. This is often the most important metric for overall performance. +* **`total`**: The total time for the benchmark process, including setup. This is less about rendering speed and more about the overhead of the benchmark itself. + +When analyzing benchmarks, look for: +* **Linear vs. Non-linear Scaling**: How does `total_render` increase as you increase nesting depth or the number of components? Ideally, it should scale linearly. +* **Bottlenecks**: Can you isolate which components or `rsx!` patterns (e.g., complex loops, many dynamic scopes) contribute most to render time? +* **Regression**: Use benchmarks in your CI/CD pipeline to detect performance regressions introduced by new code. + +By leveraging OSUI's `Benchmark` engine, you can gain valuable insights into your TUI application's performance characteristics and make data-driven decisions for optimization. + +**Next:** Learn how to customize OSUI by [Implementing a Custom Engine](./01-customizing-the-engine.md). diff --git a/versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md b/versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md new file mode 100644 index 0000000..658879f --- /dev/null +++ b/versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md @@ -0,0 +1,261 @@ +markdown +--- +sidebar_position: 1 +title: Customizing the Engine +--- + +# Customizing the Engine + +OSUI's `Engine` and `CommandExecutor` traits are designed to be highly extensible. While the `Console` engine provides `crossterm`-based terminal rendering, you might want to create a custom engine for various reasons: + +* **Different Rendering Backend**: Render to a graphical window (e.g., using `minifb` or `pixels`), a web canvas, or a specific hardware display. +* **Headless Testing**: Create a dummy engine that doesn't render anything but processes all commands and component logic, useful for fast unit or integration tests. +* **Logging/Debugging**: An engine that logs all `DrawInstruction`s to a file for analysis. +* **Specialized Behavior**: Implement custom render loops, input handling, or command processing. + +This guide will walk you through the process of implementing your own `Engine` and `CommandExecutor`. + +## Implementing `CommandExecutor` + +First, let's define a custom `CommandExecutor`. This trait is responsible for processing commands issued by components (e.g., `cx.stop()`). + +```rust +use osui::prelude::*; +use std::{ + any::Any, + sync::{Arc, Mutex}, +}; + +// Define a custom command +#[derive(Debug, Clone)] +pub struct CustomCommand(pub String); + +impl Command for CustomCommand { + fn as_any(&self) -> &dyn Any { + self + } +} + +pub struct MyCustomExecutor { + running: Mutex, + received_commands: Mutex>, +} + +impl MyCustomExecutor { + pub fn new() -> Arc { + Arc::new(Self { + running: Mutex::new(true), + received_commands: Mutex::new(Vec::new()), + }) + } + + pub fn stop_engine(&self) -> crate::Result<()> { + *self.running.lock()? = false; + Ok(()) + } + + pub fn get_status(&self) -> bool { + *self.running.lock().unwrap() + } + + pub fn get_received_commands(&self) -> Vec { + self.received_commands.lock().unwrap().clone() + } +} + +impl CommandExecutor for MyCustomExecutor { + fn execute_command(&self, command: &Arc) -> crate::Result<()> { + let command_any = command.as_any(); + + // Handle built-in Stop command + if let Some(commands::Stop) = command_any.downcast_ref::() { + println!("MyCustomExecutor: Received Stop command."); + return self.stop_engine(); + } + + // Handle our custom command + if let Some(custom_cmd) = command_any.downcast_ref::() { + println!("MyCustomExecutor: Received CustomCommand: {:?}", custom_cmd); + self.received_commands.lock().unwrap().push(custom_cmd.clone()); + return Ok(()); + } + + println!("MyCustomExecutor: Unhandled command."); + Ok(()) + } +} +``` + +## Implementing `Engine` + +Now, let's create a simple "headless" engine that doesn't draw to the terminal but just logs rendering events. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +pub struct MyHeadlessEngine { + executor: Arc, + log_output: Mutex>, +} + +impl MyHeadlessEngine { + pub fn new() -> Self { + Self { + executor: MyCustomExecutor::new(), + log_output: Mutex::new(Vec::new()), + } + } + + // Helper to log messages + fn log(&self, msg: &str) { + self.log_output.lock().unwrap().push(msg.to_string()); + } + + pub fn get_log(&self) -> Vec { + self.log_output.lock().unwrap().clone() + } +} + +impl Engine for MyHeadlessEngine { + fn run(&self, component: C) -> crate::Result<()> { + self.log("Engine: Initializing component..."); + let cx = self.init(component); + + while self.executor.get_status() { + self.log("Engine: Starting render cycle..."); + self.render(&cx); + self.log("Engine: Render cycle complete. Delaying..."); + self.render_delay(); // Use default delay or implement custom + } + + self.log("Engine: Application stopped."); + Ok(()) + } + + fn init(&self, component: C) -> Arc { + // Perform any setup needed for your custom engine + self.log("Engine: Component initialized."); + let cx = Context::new(component, self.executor.clone()); + cx.refresh(); // Initial render of the component + cx + } + + fn render(&self, cx: &Arc) { + let area = Area { x: 0, y: 0, width: 80, height: 24 }; // Define a virtual screen size + let draw_ctx = self.render_view(&area, &cx.get_view()); + self.draw_context(&draw_ctx); + } + + // No actual delay for headless, or keep default for testing loop speed + fn render_delay(&self) { + // crate::sleep(16); // Uncomment for actual delay + } + + fn render_view(&self, area: &Area, view: &View) -> DrawContext { + self.log(&format!("Engine: Rendering view in area: {:?}", area)); + let mut context = DrawContext::new(area.clone()); + view(&mut context); // Execute the View closure to populate DrawContext + context + } + + fn draw_context(&self, ctx: &DrawContext) { + self.log(&format!("Engine: Drawing context with {} instructions.", ctx.drawing.len())); + for inst in &ctx.drawing { + match inst { + DrawInstruction::Text(point, text) => self.log(&format!(" Draw Text at {:?}: '{}'", point, text)), + DrawInstruction::View(area, view) => { + self.log(&format!(" Draw Child View in area: {:?}", area)); + self.draw_context(&self.render_view(area, view)); // Recursively render child views + }, + DrawInstruction::Child(point, child_ctx) => { + self.log(&format!(" Draw Child DrawContext at {:?}.", point)); + self.draw_context(child_ctx); // Recursively draw child contexts + }, + } + } + } + + fn executor(&self) -> Arc { + self.executor.clone() + } +} +``` + +## Using Your Custom Engine + +```rust +use osui::prelude::*; +use std::sync::Arc; + +// (Include MyHeadlessEngine, MyCustomExecutor, CustomCommand definitions here) + +#[component] +fn MyApp(cx: &Arc) -> View { + let counter = use_state(0); + + use_effect( + { + let cx = cx.clone(); + let counter = counter.clone(); + move || { + // Periodically increment counter and emit custom command + loop { + sleep(200); + let new_val = *counter.get() + 1; + counter.set(new_val); + if new_val >= 3 { + cx.execute(CustomCommand(format!("Counter reached {}", new_val))).expect("Cmd failed"); + cx.stop().expect("Stop failed"); + break; + } + } + } + }, + &[], // Run once on mount + ); + + rsx! { + format!("Counter value: {}", counter.get_dl()) + }.view(&cx) +} + +fn main() { + let my_engine = MyHeadlessEngine::new(); + let executor = my_engine.executor.clone(); // Get a reference to the executor + + my_engine.run(MyApp {}).expect("Failed to run custom engine"); + + println!("\n--- Engine Log ---"); + for line in my_engine.get_log() { + println!("{}", line); + } + + println!("\n--- Received Commands ---"); + for cmd in executor.get_received_commands() { + println!("{:?}", cmd); + } +} +``` + +### Explanation: + +1. **`MyCustomExecutor`**: Implements `CommandExecutor`. It handles the built-in `commands::Stop` and our new `CustomCommand`. It also keeps a log of received custom commands for verification. +2. **`MyHeadlessEngine`**: Implements `Engine`. + * It takes `MyCustomExecutor` as its command executor. + * `run` method establishes a basic loop that continues as long as `executor.get_status()` is `true`. + * `render` orchestrates the `render_view` and `draw_context` calls. + * `render_view` executes the component `View` and collects `DrawInstruction`s. + * `draw_context` iterates through `DrawInstruction`s, logging them instead of actually drawing to a terminal. It recursively handles `DrawInstruction::View` and `DrawInstruction::Child`. +3. **`MyApp` Component**: + * Uses `use_state` for a counter. + * Uses `use_effect` to periodically increment the counter. + * When the counter reaches 3, it `execute`s our `CustomCommand` and then `stop()`s the engine. +4. **`main` Function**: + * Instantiates `MyHeadlessEngine`. + * Calls `my_engine.run(MyApp {})`. + * After the engine stops, it prints the internal log and received commands from the executor, allowing you to verify that component logic and commands were processed correctly. + +By following this pattern, you can integrate OSUI's powerful component and state management system with virtually any rendering or execution environment you desire. + +**Next:** Dive into the internals of OSUI's macro system in [Internals: Macros](./02-internals-macros.md). diff --git a/versioned_docs/version-0.2.0/advanced/02-internals-macros.md b/versioned_docs/version-0.2.0/advanced/02-internals-macros.md new file mode 100644 index 0000000..21e671c --- /dev/null +++ b/versioned_docs/version-0.2.0/advanced/02-internals-macros.md @@ -0,0 +1,132 @@ +markdown +--- +sidebar_position: 2 +title: Internals: Macros +--- + +# Internals: Macros + +OSUI heavily relies on procedural macros to provide its ergonomic, declarative syntax. The `osui-macros` crate contains the logic for the `#[component]` attribute macro and the `rsx!` function macro. Understanding how these macros work under the hood gives you a deeper insight into OSUI's architecture and capabilities. + +## Introduction to Procedural Macros + +Procedural macros are functions that operate on the Rust syntax tree (Abstract Syntax Tree or AST) during compilation. They receive `TokenStream`s as input and produce `TokenStream`s as output, effectively transforming your code. OSUI's macros leverage the following crates: + +* **`syn`**: A parser for Rust's syntax tree. It allows macros to parse input `TokenStream`s into structured Rust AST types (like `ItemFn`, `Expr`, `Path`, etc.). +* **`quote`**: A quasiquoting library that makes it easy to generate Rust code (as `TokenStream`s) from AST fragments. +* **`proc-macro2`**: Provides types like `TokenStream` and `Ident` that are compatible with `syn` and `quote`, enabling ergonomic manipulation of tokens. + +## `#[component]` Attribute Macro (`macros/src/lib.rs`) + +The `#[component]` macro transforms a Rust function into an OSUI component struct. + +### Input + +It takes an `ItemFn` (the parsed function definition) as input. + +```rust +// Original function in user's code +#[component] +pub fn MyComponent(cx: &Arc, prop1: &String, prop2: &i32) -> View { + // ... function body ... +} +``` + +### Core Logic + +1. **Parse Function Signature**: + * It extracts the function's name (`MyComponent`). + * It validates the first argument `cx: &Arc`. + * It iterates through the remaining arguments (`prop1: &String`, `prop2: &i32`), which become the component's props. +2. **Generate Component Struct**: For each prop parameter, it determines the *owned* type (e.g., `&String` becomes `String`, `&i32` becomes `i32`). It then uses `quote!` to generate a new struct: + ```rust + pub struct MyComponent { + pub prop1: String, // Owned types + pub prop2: i32, + } + ``` +3. **Implement `ComponentImpl`**: It then generates an `impl ComponentImpl for MyComponent` block. The `call` method of this trait: + * Takes `&self` and `cx: &Arc`. + * Internally calls a generated `Self::component` method (which is your original function's body). + * Passes `cx` and references (`&self.prop1`, `&self.prop2`) to the stored props from the generated struct. + ```rust + impl MyComponent { + // This is your original function, renamed and wrapped + pub fn component(cx: &Arc, prop1: &str, prop2: &i32) -> View { /* ... body ... */ } + } + + impl ComponentImpl for MyComponent { + fn call(&self, cx: &Arc) -> View { + Self::component(cx, &self.prop1, &self.prop2) // Pass references to owned props + } + } + ``` + +### Output + +The macro replaces the original function with the generated struct, its `component` method, and the `ComponentImpl` implementation. This transformation makes `MyComponent` a valid OSUI component that can be instantiated with props in `rsx!`. + +## `rsx!` Function Macro (`macros/src/parse.rs` & `macros/src/emit.rs`) + +The `rsx!` macro is more complex, involving a two-step process: parsing the custom syntax and then emitting standard Rust code. + +### 1. Parsing (`macros/src/parse.rs`) + +The `parse` module defines an AST (Abstract Syntax Tree) for the `rsx!` syntax. + +* **`RsxRoot`**: The top-level container, holding a vector of `RsxNode`s. +* **`RsxNode`**: An enum representing different types of nodes in the `rsx!` tree: + * `Text(LitStr)`: For `"Hello"` literals. + * `Expr(Expr)`: For `@{some_expression}` blocks. + * `Component { path: Path, props: Vec, children: Vec }`: For `MyComponent { prop: val, ... }`. + * `Mount(Ident)`: For `!my_mount_hook`. + * `If { deps: Vec, cond: Expr, children: Vec }`: For `@if condition { ... }`. + * `For { deps: Vec, pat: Pat, expr: Expr, children: Vec }`: For `@for item in items { ... }`. +* **`RsxProp`**: Represents a `name: value` pair for component props. +* **`Dep`**: Represents a dependency for dynamic blocks (`%my_state as my_alias`). + +The `parse::RsxRoot::parse` method uses `syn`'s `ParseStream` to tokenize the `rsx!` input and build this AST. It intelligently differentiates between text, expressions, component names, and control flow keywords (`@if`, `@for`, `!`). + +### 2. Emitting (`macros/src/emit.rs`) + +The `emit` module takes the parsed `RsxRoot` AST and converts it into a `TokenStream` of standard Rust code that constructs `osui::frontend::Rsx` objects. + +* **`emit_rsx(root: RsxRoot)`**: The entry point, which initializes an `osui::frontend::Rsx` object and then iterates through the `root.nodes`. +* **`emit_node_scope(node: &RsxNode)`**: For each `RsxNode`, it generates code that calls the appropriate `Rsx` builder method: + * **`RsxNode::Text`**: Emits `r.static_scope(move |scope| { scope.view(...) });` which draws text. + * **`RsxNode::Expr`**: Emits `r.child(expression);`. + * **`RsxNode::Component`**: Emits `r.static_scope(move |scope| { scope.child(ComponentName { props: ... }, None); });`. If children are present, they are recursively emitted into a nested `Rsx` object and passed as the `children` prop. + * **`RsxNode::Mount`**: Emits `mount_hook_instance.mount();`. + * **`RsxNode::If`**: Emits `r.dynamic_scope(move |scope| { if condition { ... } else { ... } }, dependencies);`. The `dependencies` are converted to `Vec>`. + * **`RsxNode::For`**: Similar to `If`, emits `r.dynamic_scope(move |scope| { for pattern in expr { ... } }, dependencies);`. + +### Output + +The `rsx!` macro produces a `TokenStream` that looks something like this (simplified): + +```rust +// For: rsx! { "Hello" MyComponent { prop: value } } +{ + let mut r = osui::frontend::Rsx::new(); + r.static_scope(move |scope| { + scope.view(std::sync::Arc::new(move |ctx| { + ctx.draw_text(osui::render::Point { x: 0, y: 0 }, &format!("Hello")) + })); + }); + r.static_scope(move |scope| { + scope.child( + MyComponent { prop: value.to_string() }, // Note: Prop value converted to owned type + None, + ); + }); + r +} +``` + +This generated code, when compiled, constructs the `osui::frontend::Rsx` object that OSUI's runtime can then interpret to build the component tree and render the UI. + +## Summary + +The `osui-macros` crate plays a pivotal role in shaping OSUI's developer experience. `#[component]` streamlines component definition, while `rsx!` provides a powerful, declarative way to compose UIs by transforming custom syntax into efficient runtime calls. These macros are complex but essential for creating a modern, React-like development flow in a TUI environment. + +**Next:** Learn how you can contribute to the OSUI project in [Contributing](./03-contributing.md). diff --git a/versioned_docs/version-0.2.0/advanced/03-contributing.md b/versioned_docs/version-0.2.0/advanced/03-contributing.md new file mode 100644 index 0000000..a27300b --- /dev/null +++ b/versioned_docs/version-0.2.0/advanced/03-contributing.md @@ -0,0 +1,116 @@ +markdown +--- +sidebar_position: 3 +title: Contributing +--- + +# Contributing to OSUI + +We welcome and appreciate contributions from the community! Whether it's reporting bugs, suggesting features, improving documentation, or submitting code, your help makes OSUI better for everyone. + +## How to Contribute + +### 1. Report Bugs + +If you find a bug, please open an issue on our [GitHub repository](https://github.com/osui-rs/osui/issues). When reporting a bug, please include: + +* A clear and concise description of the bug. +* Steps to reproduce the behavior. +* Expected behavior. +* Actual behavior. +* Your OSUI version, Rust version, and operating system. +* Any relevant code snippets or error messages. + +### 2. Suggest Features + +Have an idea for a new feature or improvement? Feel free to open an issue on GitHub to discuss it. Please provide: + +* A clear and concise description of the proposed feature. +* Why you think it would be valuable to OSUI. +* Any potential use cases or examples. + +### 3. Improve Documentation + +Good documentation is vital for any library. If you find errors, omissions, or areas that could be explained more clearly in our docs, please consider: + +* Opening an issue to point out the specific area. +* Submitting a pull request with your suggested improvements. + +### 4. Contribute Code + +If you'd like to contribute code, here's the general workflow: + +#### Fork the Repository + +First, fork the [osui-rs/osui](https://github.com/osui-rs/osui) repository to your own GitHub account. + +#### Clone Your Fork + +```bash +git clone https://github.com/YOUR_USERNAME/osui.git +cd osui +``` + +#### Create a New Branch + +Create a new branch for your feature or bug fix. Use a descriptive name: + +```bash +git checkout -b feature/my-awesome-feature +# or +git checkout -b bugfix/fix-rendering-issue +``` + +#### Make Your Changes + +* Write clean, idiomatic Rust code. +* Follow existing code style and conventions. +* Add comments where necessary to explain complex logic. +* **Write Tests**: If you're adding new features or fixing bugs, please include appropriate unit and/or integration tests to cover your changes. +* **Update Documentation**: If your changes affect the public API or add new functionality, please update the relevant documentation files. + +#### Run Tests + +Before submitting a pull request, ensure all existing tests pass and your new tests pass: + +```bash +cargo test --workspace +``` + +#### Format and Lint + +Make sure your code is formatted correctly and passes lint checks: + +```bash +cargo fmt --all +cargo clippy --all-targets --all-features +``` + +#### Commit Your Changes + +Commit your changes with clear and concise commit messages. A good commit message explains *what* changed and *why*. + +```bash +git commit -m "feat: Add new awesome feature" +# or +git commit -m "fix: Resolve rendering issue on Windows" +``` + +#### Push to Your Fork + +```bash +git push origin feature/my-awesome-feature +``` + +#### Create a Pull Request + +Go to the [osui-rs/osui](https://github.com/osui-rs/osui) repository on GitHub and open a new pull request. +* Provide a clear title and description for your pull request. +* Reference any related issues (e.g., "Fixes #123" or "Closes #456"). +* The project maintainers will review your PR, provide feedback, and work with you to get it merged. + +## Code of Conduct + +Please note that this project is released with a [Contributor Code of Conduct](https://github.com/osui-rs/osui/blob/main/CODE_OF_CONDUCT.md). By participating in this project, you agree to abide by its terms. + +Thank you for considering contributing to OSUI! Your efforts help foster a vibrant and robust TUI ecosystem in Rust. diff --git a/versioned_docs/version-0.2.0/concepts/00-architecture.md b/versioned_docs/version-0.2.0/concepts/00-architecture.md new file mode 100644 index 0000000..719ac44 --- /dev/null +++ b/versioned_docs/version-0.2.0/concepts/00-architecture.md @@ -0,0 +1,95 @@ +markdown +--- +sidebar_position: 0 +title: Core Architecture +--- + +# Core Architecture + +OSUI is designed with a clear separation of concerns, drawing inspiration from modern GUI frameworks like React. This modular architecture aims for flexibility, testability, and scalability. Here's a high-level overview of how the different parts of OSUI interact to form a functional TUI application. + +```mermaid +graph TD + A[Application Root (main.rs)] --> B(Engine::run(RootComponent)) + B --> C(Engine) + C -- init --> D(Root Component Context) + D -- refresh --> E(Root Component View) + E -- generate_children --> F(Frontend::Rsx) + F -- create Scopes & Contexts --> D + D -- draw_children --> G(Render::DrawContext) + G -- execute DrawInstructions --> H(Engine::draw_context) + H -- actual terminal output --> I(crossterm) + + subgraph State & Events + J[Component Context] -- manage state via hooks --> K(State) + K -- notify dependents --> L(HookEffect) + L -- trigger callbacks --> J + J -- emit events --> M(Event Handlers) + M -- propagate to children --> J + end + + subgraph User Interaction + N[Input Polling Thread] --> O(Engine::CommandExecutor) + O -- execute commands --> C + O -- emit events --> J + end + + C -- continuous loop --> E + D --> J + J --> E +``` + +## Key Architectural Components + +### 1. **Component System (`osui::component`)** + +* **`ComponentImpl`**: The fundamental trait defining a renderable UI unit. Any type implementing this can be an OSUI component. +* **`Context`**: Each active component instance has its own `Context`. This is the central hub for: + * Holding the component's `View` (its rendered output). + * Managing its local state using hooks (e.g., `use_state`). + * Registering and emitting events (`on_event`, `emit_event`). + * Managing its children components and their `Scope`s. + * Accessing the `CommandExecutor` to interact with the engine. +* **`Scope`**: A `Context` can contain multiple child `Scope`s. A `Scope` is primarily a container that groups a set of child components (`Context`s) and their optional `ViewWrapper`s. `Rsx` fragments generate `Scope`s to manage their children. + +**Why it works this way**: This component-based approach promotes modularity and reusability. `Context` provides a stable identity and state for each component instance, enabling independent updates and event handling. The tree structure formed by `Context`s and `Scope`s mirrors the UI hierarchy. + +### 2. **State Management (`osui::state`)** + +* **`State`**: A reactive wrapper for any data `T`. When `State` is updated, it automatically notifies all its registered "dependents". +* **`use_state`**: The primary hook to create and manage `State` within a component. +* **`use_effect`**: A hook for performing side effects (e.g., logging, network requests) in response to `State` changes or component mounting. +* **`HookDependency`**: A trait that `State` and `Mount` implement, allowing them to be tracked by `use_effect` and dynamic `rsx!` blocks. + +**Why it works this way**: Inspired by React hooks, this system provides a predictable and efficient way to manage mutable state. By declaring explicit dependencies for effects and dynamic `rsx!` blocks, OSUI can minimize re-renders and computations, only updating parts of the UI that are truly affected by state changes. + +### 3. **Frontend / Declarative UI (`osui::frontend` & `osui-macros`)** + +* **`rsx!` macro**: A procedural macro that allows you to write UI using a declarative, XML-like syntax directly in Rust. +* **`#[component]` macro**: A procedural macro that transforms a Rust function into an OSUI component, automatically handling prop parsing and `ComponentImpl` implementation. +* **`Rsx`**: An internal representation (produced by `rsx!`) of a UI fragment, consisting of a vector of `RsxScope`s. +* **`RsxScope`**: An enum defining different types of UI nodes (static text, components, dynamic conditional/loop blocks). + +**Why it works this way**: Declarative UI is generally easier to reason about than imperative drawing commands. The `rsx!` macro provides a high-level abstraction that maps directly to the component tree and state management, significantly improving developer experience. The macro-generated `Rsx` object then serves as a blueprint for `Context` to build its children. + +### 4. **Rendering Pipeline (`osui::render`)** + +* **`View`**: The ultimate output of a component's rendering logic. It's a closure that, when called, populates a `DrawContext` with drawing instructions. +* **`DrawContext`**: A mutable accumulator for `DrawInstruction`s. Components add text, child views, or custom drawing commands to this context. It also tracks the available `Area` and `allocated` space. +* **`DrawInstruction`**: An enum representing atomic drawing operations (e.g., `Text`, `View`, `Child`). +* **Geometric Primitives**: `Point`, `Size`, `Area` define positions and dimensions. + +**Why it works this way**: This separation allows the rendering logic to be independent of the actual display medium. Components declare *what* to draw using high-level instructions, and the `Engine` then decides *how* to execute them on the specific backend (e.g., terminal). + +### 5. **Engine (`osui::engine`)** + +* **`Engine` trait**: Defines the interface for running an OSUI application, including initialization, continuous rendering, and managing the render loop. +* **`Console`**: The default implementation of `Engine`, which uses `crossterm` to interact with the terminal. +* **`CommandExecutor` trait**: An interface for executing system-level commands (e.g., `Stop`). +* **`Benchmark`**: A wrapper `Engine` that measures and reports performance statistics. + +**Why it works this way**: The `Engine` trait makes OSUI extensible. You can swap out the `Console` engine for a different backend (e.g., a web renderer, a headless testing engine) without changing your core component logic. The `CommandExecutor` provides a standardized way for components to request actions from the environment. + +This interconnected architecture allows OSUI to offer a powerful, flexible, and developer-friendly experience for building sophisticated Terminal User Interfaces. + +**Next:** Delve deeper into [The Component Model](./01-the-component-model.md). diff --git a/versioned_docs/version-0.2.0/concepts/01-the-component-model.md b/versioned_docs/version-0.2.0/concepts/01-the-component-model.md new file mode 100644 index 0000000..e83fe83 --- /dev/null +++ b/versioned_docs/version-0.2.0/concepts/01-the-component-model.md @@ -0,0 +1,108 @@ +markdown +--- +sidebar_position: 1 +title: The Component Model +--- + +# The Component Model + +At the core of OSUI's design is a robust component model, defining how UI elements are created, composed, and managed. This model provides structure, promotes reusability, and facilitates a clear separation of concerns within your TUI application. + +## `ComponentImpl`: The Building Block + +The `ComponentImpl` trait is the most fundamental concept for any renderable unit in OSUI: + +```rust +pub trait ComponentImpl: Send + Sync { + /// Renders the component within the given context, returning a View + fn call(&self, cx: &Arc) -> View; +} +``` + +* **`fn call(&self, cx: &Arc) -> View`**: This method is where a component's rendering logic resides. It takes a reference to the component instance itself and its `Context` (`cx`), and it must return a `View`. The `View` is OSUI's abstraction for "what to draw," essentially a closure that will populate a `DrawContext` with drawing instructions later in the rendering pipeline. +* **`Send + Sync`**: Components must be `Send` and `Sync` to ensure they can be safely passed between threads, as OSUI leverages concurrency for various operations (e.g., `use_effect` hooks). + +Most often, you won't implement `ComponentImpl` manually. Instead, you'll use the `#[component]` procedural macro: + +```rust +#[component] +fn MyComponent(cx: &Arc, some_prop: &String) -> View { + // Component logic and RSX here + rsx! { + format!("Prop: {}", some_prop) + }.view(&cx) +} +``` + +The `#[component]` macro automatically generates a struct for `MyComponent` (with `some_prop: String` as a field) and implements `ComponentImpl` for it, delegating the `call` method to your function's body. + +## `Context`: The Component's Identity and State + +Every active instance of a component in the UI tree has its own `Context` (`osui::component::context::Context`). The `Context` is the component's runtime identity and central hub for managing its internal state and interactions: + +```rust +pub struct Context { + component: AccessCell, + view: AccessCell, + event_handlers: AccessCell>>, + pub(crate) scopes: Mutex>>, + executor: Arc, +} +``` + +**Why `Context` is crucial**: + +* **State Management**: It's the entry point for all state hooks (`use_state`, `use_effect`, etc.), ensuring that each component instance manages its own isolated, reactive state. +* **Event Handling**: `Context` provides methods (`on_event`, `emit_event`) for handling component-specific and application-wide events. Events propagate through the `Context` tree. +* **Rendering Result (`View`)**: It holds the `View` generated by the `ComponentImpl::call` method, which is later passed to the rendering engine. +* **Child Management (`scopes`)**: A `Context` aggregates child components through `Scope`s, forming the hierarchical UI tree. +* **Engine Interaction**: It provides access to the `CommandExecutor`, allowing components to send commands (like `Stop`) to the underlying engine. + +When a component is instantiated (e.g., `MyComponent { ... }` in `rsx!`), a new `Context` is created for it. This `Context` lives as long as the component is part of the active UI tree. + +## `Scope`: Organizing Children + +While `Context` represents a single component instance, `Scope` (`osui::component::scope::Scope`) is responsible for grouping and managing collections of child `Context`s: + +```rust +pub struct Scope { + pub children: Mutex, Option)>>, + executor: Arc, +} +``` + +**Relationship between `Context` and `Scope`**: + +* A `Context` can contain multiple child `Scope`s (stored in `Context::scopes`). +* Each `Scope` then contains a `Vec` of `(Arc, Option)`, representing the actual child components (and optional view modifiers) within that specific scope. +* This distinction allows for flexibility in how children are managed, particularly for dynamic `rsx!` constructs like `@if` and `@for` which might create or destroy entire `Scope`s based on conditions or iterations. + +**How `Scope`s are used**: + +* When you use `rsx!`, the macro emits calls to `context.scope()` or `context.dyn_scope()`, which create new `Scope`s. +* Within these `Scope`s, children are added using `scope.child()` or `scope.view()`. +* The `Context::draw_children` method then iterates through these `Scope`s and their children to orchestrate their rendering. + +## The Component Tree + +Together, `ComponentImpl`, `Context`, and `Scope` form a hierarchical component tree: + +``` +App Component (Context) +└── App Scope (from App's rsx!) + ├── Child Component A (Context) + │ └── Child A Scope (from A's rsx!) + │ └── Grandchild Component X (Context) + ├── Child Component B (Context) + │ └── Child B Scope + │ ├── Grandchild Component Y (Context) + │ └── Grandchild Component Z (Context) + └── Dynamic Scope (e.g., from an `@if` block) + └── (Conditionally rendered children) +``` + +This tree structure is fundamental to OSUI's rendering and event propagation. Events emitted by a child `Context` can traverse up the tree to parent `Context`s (if they listen for them) and always propagate down to all descendants. + +The component model provides a clear, organized, and powerful way to structure your TUI applications, promoting maintainability and scalability through modularity and a well-defined lifecycle for each UI element. + +**Next:** Understand how `State` and `HookDependency` enable efficient UI updates in [Reactive State Flow](./02-reactive-state-flow.md). diff --git a/versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md b/versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md new file mode 100644 index 0000000..95bc768 --- /dev/null +++ b/versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md @@ -0,0 +1,115 @@ +markdown +--- +sidebar_position: 2 +title: Reactive State Flow +--- + +# Reactive State Flow + +OSUI's reactivity model is designed to efficiently update the UI in response to changes in application data. It centers around `State`, `HookDependency`, and `use_effect`, forming a flow where data changes automatically trigger re-rendering of affected components. + +## 1. `State`: The Source of Truth + +At the heart of reactivity is the `State` type. When you declare state using `use_state(initial_value)`, you get a `State` instance: + +```rust +let count = use_state(0); // count: State +``` + +`State` wraps your actual data `T` in an `Arc>`, allowing it to be safely shared and mutated across multiple threads and component scopes. + +## 2. Updating `State` + +When the value held by `State` changes, this initiates the reactive flow. There are two primary ways to update `State`: + +* **`state.set(new_value)`**: Replaces the entire value and explicitly triggers an update. +* **`*state.get() = new_value`**: Acquires an `Inner<'_, T>` guard, which provides mutable access to the underlying value. When this `Inner` guard is dropped (goes out of scope), it automatically checks if the value was modified and, if so, triggers an update. + +```rust +// Method 1: using .set() +count.set(count.get_dl() + 1); + +// Method 2: using .get() for mutable access +{ + let mut count_guard = count.get(); // Acquire Inner guard + *count_guard += 1; // Mutate the value +} // count_guard drops here, automatically triggering updates +``` + +## 3. `HookDependency`: Declaring Reactivity + +For an update to `State` to have an effect, there must be something "listening" for that update. This is where the `HookDependency` trait comes in: + +```rust +pub trait HookDependency: Send + Sync { + fn on_update(&self, hook: HookEffect); +} +``` + +* `State` implements `HookDependency`. This means you can register an `HookEffect` with a `State` instance, and `State` will ensure that effect is called whenever its value changes. +* `Mount` also implements `HookDependency` for managing component lifecycle effects. + +## 4. `HookEffect`: The Callback + +An `HookEffect` is essentially a wrapper around a closure (`Arc>`) that represents a side effect. When a `HookDependency` updates, it calls all registered `HookEffect`s. + +```rust +// An effect might look something like this internally: +let my_effect = HookEffect::new(move || { + // This code runs when the dependency updates + println!("Dependency changed!"); +}); +``` + +## 5. `use_effect` and Dynamic `rsx!` Blocks: Consuming Reactivity + +The `HookDependency` and `HookEffect` mechanism is consumed by two main features to enable reactive UI updates: + +### a) `use_effect` Hook + +`use_effect` allows you to run side effects when specified dependencies change: + +```rust +use_effect( + { + let count = count.clone(); // Clone State handle for closure + move || { + // This closure runs in a spawned thread when `count` updates + println!("Count is now: {}", count.get_dl()); + } + }, + &[&count], // `count` is the dependency +); +``` + +When `use_effect` is first called, it registers its internal `HookEffect` closure with each `HookDependency` in the provided slice. Each time `count` is updated, `count` calls its registered `HookEffect`, which then executes the provided closure. + +### b) Dynamic `rsx!` Blocks (`%dep @if ...`, `%dep @for ...`) + +OSUI's `rsx!` macro supports special syntax for dynamic UI segments that automatically re-render when dependencies change: + +```rust +rsx! { + %count @if *count.get() > 0 { // This block re-renders if `count` changes + format!("Count is positive: {}", count.get_dl()) + } + %items @for item in items.get_dl() { // This block re-renders if `items` changes + format!("- {}", item) + } +} +``` + +* When the `rsx!` macro encounters `%dep`, it also registers a special internal `HookEffect` with that dependency. +* This `HookEffect` is responsible for re-evaluating the entire `dynamic_scope` (the `if` or `for` block) within the component's `Context`. This re-evaluation re-runs the `rsx!` logic for that block, generating potentially new children or text nodes, and thus updating the UI. + +## The Reactive Flow in Summary + +1. A component uses `use_state` to create a `State`. +2. The `State` is passed as a dependency to `use_effect` or declared in a dynamic `rsx!` block (`%state`). +3. When `State`'s value is modified (`set()` or `get()` then drop), it triggers its registered `HookEffect`s. +4. These `HookEffect`s then either execute a side-effect closure (from `use_effect`) or trigger a re-evaluation of the corresponding `dynamic_scope` (from `rsx!`). +5. Re-evaluation of `dynamic_scope` leads to updated `DrawInstruction`s, which the `Engine` eventually renders to the terminal. + +This elegant system ensures that your UI remains synchronized with your application's data, responding efficiently and predictably to changes, minimizing manual re-rendering logic. + +**Next:** Understand how events traverse the component tree in [Event Propagation](./03-event-propagation.md). diff --git a/versioned_docs/version-0.2.0/concepts/03-event-propagation.md b/versioned_docs/version-0.2.0/concepts/03-event-propagation.md new file mode 100644 index 0000000..a2f3b72 --- /dev/null +++ b/versioned_docs/version-0.2.0/concepts/03-event-propagation.md @@ -0,0 +1,105 @@ +markdown +--- +sidebar_position: 3 +title: Event Propagation +--- + +# Event Propagation + +Event propagation in OSUI describes how events traverse the component tree after they are emitted. Understanding this model is crucial for designing effective inter-component communication and responsive user interfaces. + +## Unidirectional Propagation: Downwards + +OSUI employs a unidirectional event propagation model, primarily **downwards** through the component tree. When an event is emitted from a component's `Context`, it follows this path: + +1. **Current Context**: All `on_event` handlers registered on the `Context` that emitted the event are invoked first. +2. **Child Contexts**: The event is then recursively propagated to all immediate children's `Context`s, and from there, further down to their children, and so on, until it reaches the leaves of the component tree. Each child `Context` will also invoke its own registered `on_event` handlers for that event type. + +This means an event emitted by an ancestor component will reach all its descendants. An event emitted by a child component will reach its parents (if the parent `Context` has `on_event` handlers for it) and all its siblings and their descendants. + +```mermaid +graph TD + A[Root Component Context] --> B(Child A Context) + A --> C(Child B Context) + B --> D(Grandchild A1 Context) + B --> E(Grandchild A2 Context) + C --> F(Grandchild B1 Context) + + subgraph Event Propagation (emit_event from D) + D -- handlers on D --> D + D -- propagate --> B + B -- handlers on B --> B + B -- propagate --> E + E -- handlers on E --> E + B -- propagate --> A + A -- handlers on A --> A + A -- propagate --> C + C -- handlers on C --> C + C -- propagate --> F + F -- handlers on F --> F + end +``` + +### Methods for Event Emission + +* **`cx.emit_event(event: E)`**: + * This is the standard method for emitting events. + * It processes event handlers synchronously in the current thread. This means that subsequent code execution will wait for all handlers (and their propagation to children) to complete. + * Useful for events where the order of execution matters or where the handler logic is quick. + +* **`cx.emit_event_threaded(event: &E)`**: + * This method processes event handlers asynchronously by spawning a new `std::thread` for *each* registered handler. + * The event object `E` must implement `Clone` because each handler receives its own cloned copy. + * Useful for events that might trigger long-running or blocking operations, preventing them from freezing the UI. The event propagation down the tree also uses the threaded approach. + +## Practical Implications + +### Parent-to-Child Communication (Implicit) + +If a parent component emits an event, all its child components (and their children) that have `on_event` handlers for that specific event type will receive it. This is a powerful way for ancestors to broadcast information or commands to their descendants. + +```rust +// Parent emits a "Refresh" event +cx.emit_event(RefreshEvent {}); + +// Child listens for "Refresh" event +cx.on_event(|_cx, _event: &RefreshEvent| { + // Perform refresh logic +}); +``` + +### Child-to-Parent/Sibling Communication (Explicit) + +A child component can effectively communicate with its parent or siblings by emitting an event. Because events propagate downwards from the emitting `Context` *and then* to all its children (and subsequently to its parent's other children, if any), the parent and siblings will receive the event if they are listening for it. + +```rust +// Child component +#[component] +fn Child(cx: &Arc) -> View { + // ... logic to decide when to emit + cx.emit_event(ChildActionCompleted { data: "success".to_string() }); + // ... +} + +// Parent component +#[component] +fn Parent(cx: &Arc) -> View { + cx.on_event(|_cx, event: &ChildActionCompleted| { + println!("Parent received action from child: {:?}", event.data); + }); + rsx! { Child {} }.view(&cx) +} +``` + +### Decoupling Components + +Event handling promotes a decoupled architecture. Components don't need direct references to each other to communicate; they only need to agree on common event types. This makes components more independent and easier to reuse. + +## When to use `emit_event` vs. `emit_event_threaded` + +* **`emit_event`**: Use for most general-purpose events where handlers are quick, or you need strict sequential processing, or if you don't want the overhead of spawning many threads. +* **`emit_event_threaded`**: Use for events that might trigger expensive, long-running, or I/O-bound operations in their handlers. This prevents the main rendering loop from blocking, ensuring a responsive UI. Be mindful of potential race conditions if multiple threads modify shared state (though `State`'s `Mutex` helps mitigate this). + +Understanding OSUI's downward event propagation is key to designing robust and reactive component interactions within your TUI applications. + +**Next:** Get insights into how your UI transforms from `View`s to terminal output in [The Rendering Pipeline](./04-rendering-pipeline.md). diff --git a/versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md b/versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md new file mode 100644 index 0000000..5ed2ca6 --- /dev/null +++ b/versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md @@ -0,0 +1,76 @@ +markdown +--- +sidebar_position: 4 +title: The Rendering Pipeline +--- + +# The Rendering Pipeline + +The OSUI rendering pipeline is the process by which your declarative component hierarchy is transformed into concrete drawing operations on the terminal. It's an abstraction layer that allows components to describe *what* to draw, while the `Engine` handles *how* to draw it. + +## Stages of the Pipeline + +The pipeline can be broken down into several distinct stages: + +### 1. Component `call` and `View` Generation + +* **`Engine::run`**: The main application loop starts by calling `Engine::run` with your root component. +* **`Context::refresh`**: The engine initializes the root component's `Context` and calls `Context::refresh`. +* **`ComponentImpl::call`**: Inside `refresh`, the component's `ComponentImpl::call` method is invoked. This is where your component function (decorated with `#[component]`) executes. +* **`rsx!` Macro Expansion**: Within your component function, the `rsx!` macro generates an `osui::frontend::Rsx` object. +* **`Rsx::view(&cx)`**: This method converts the `Rsx` object into a `View`. Critically, `Rsx::view` also triggers `Rsx::generate_children`. +* **`Rsx::generate_children`**: This recursively processes the `Rsx` object, creating new child `Context`s and `Scope`s within the current `Context`. For `dynamic_scope`s (`@if`, `@for`), it also registers `use_effect` hooks to trigger re-evaluation when dependencies change. +* **Result**: The component function ultimately returns a `View`. This `View` is a closure that, when executed, will populate a `DrawContext` by calling `context.draw_children()`. + +### 2. `DrawContext` Construction (`render_view`) + +* **`Engine::render`**: In the main rendering loop, the `Engine` calls `render` for the current `Context`. +* **`Engine::render_view`**: The `Engine` creates a fresh, empty `DrawContext` for the entire screen `Area`. It then executes the root component's `View` (the closure generated in Stage 1) against this `DrawContext`. +* **`Context::draw_children`**: The root `View`'s closure invokes `context.draw_children()`. This method iterates through all child `Scope`s and their contained `Context`s. For each child `Context`, it retrieves its `View` and adds a `DrawInstruction::View` to the current `DrawContext`, recursively starting the `render_view` process for children within their allocated `Area`. +* **`DrawContext::draw_text`, `DrawContext::draw_view`, `DrawContext::allocate`**: As `View`s are executed, they add `DrawInstruction`s to the `DrawContext` using methods like `draw_text` for text, `draw_view` for child components, and `allocate` to mark used screen regions. +* **Result**: A fully populated `DrawContext` containing a flat list of `DrawInstruction`s, ready for rendering. + +### 3. `DrawInstruction` Execution (`draw_context`) + +* **`Engine::draw_context`**: After `render_view` has produced a complete `DrawContext`, the `Engine`'s `draw_context` method is called. This is the stage where the actual terminal output happens. +* **Instruction Iteration**: `draw_context` iterates through the `Vec` inside the `DrawContext`. +* **`Text`**: For `DrawInstruction::Text(point, text)`, the engine translates `point` (which is relative to the `DrawContext`'s `area`) into absolute terminal coordinates and uses `crossterm` to move the cursor and print the `text`. +* **`View`**: For `DrawInstruction::View(area, view)`, the engine recursively calls `render_view` for the child `view` within its specific `area`, then processes the resulting `DrawContext`. +* **`Child`**: For `DrawInstruction::Child(point, child_ctx)`, the engine recursively calls `draw_context` for the `child_ctx`, applying the `point` offset. +* **Terminal Output**: The `Console` engine uses `crossterm` functions (like `MoveTo`, `Print`, `Clear`) to modify the terminal buffer. +* **Result**: The visible TUI on the user's screen. + +## `render_delay` and Loop + +After `draw_context` completes, the `Engine` typically calls `render_delay()` (defaulting to 16ms for ~60 FPS) before the entire loop restarts with the next `Engine::render` call. This continuous loop maintains a responsive and updated UI. + +```mermaid +graph TD + A[Component Function (`#[component]`)] --> B(Generates `Rsx` object) + B --> C(Rsx::view(&cx)) + C -- calls Rsx::generate_children --> D(Builds child Contexts & Scopes) + D --> E(Returns a `View` closure) + + subgraph Engine Loop + F[Engine::render(root_cx)] --> G(Engine::render_view(full_screen_area, root_view)) + G -- creates empty DrawContext --> H(Executes root_view closure) + H -- root_view calls Context::draw_children --> I(Recursively adds DrawInstruction::View for children) + I -- children's Views populate DrawContext --> J(Result: Full DrawContext with instructions) + J --> K(Engine::draw_context(full_DrawContext)) + K -- iterates DrawInstructions --> L(Executes terminal ops via crossterm) + L --> M[Visible TUI] + M -- optional delay --> N(Engine::render_delay) + N --> F + end +``` + +## Key Principles + +* **Declarative vs. Imperative**: Components declare *what* to draw (`View`, `DrawInstruction`), not *how* to directly manipulate the terminal. The engine handles the imperative *how*. +* **Separation of Concerns**: Each stage focuses on a specific responsibility: component logic, state management, UI tree construction, and final rendering. +* **Reactivity Integration**: Dynamic `rsx!` blocks and `use_effect` ensure that only affected parts of the `View` or `DrawContext` are re-generated efficiently when state changes, minimizing redundant work. +* **Extensibility**: The `Engine` trait allows for different rendering backends (e.g., to a file, to a graphical window, or for benchmarking) without modifying component logic. + +Understanding this pipeline helps in debugging rendering issues, optimizing performance, and building custom rendering logic within your OSUI applications. + +**Next:** Explore advanced topics like [Performance Benchmarking](../advanced/00-performance-benchmarking.md). diff --git a/versioned_docs/version-0.2.0/guides/00-creating-components.md b/versioned_docs/version-0.2.0/guides/00-creating-components.md new file mode 100644 index 0000000..d19d9f5 --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/00-creating-components.md @@ -0,0 +1,124 @@ +markdown +--- +sidebar_position: 0 +title: Creating Components +--- + +# Creating Components + +Components are the building blocks of any OSUI application. They encapsulate UI logic, state, and rendering instructions, making your code modular and reusable. This guide explains how to define and use components effectively. + +## The `#[component]` Attribute + +OSUI uses the `#[component]` procedural macro to transform a regular Rust function into an OSUI component. This macro handles the boilerplate necessary for prop handling and integrating the function into the component tree. + +### Basic Structure + +A component function generally looks like this: + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn MyComponent(cx: &Arc) -> View { + // Component logic goes here + rsx! { + "Hello from MyComponent!" + }.view(&cx) +} +``` + +**Key requirements:** + +1. **`#[component]`**: Always annotate your component function with this attribute. +2. **Function Signature**: + * It must take `cx: &Arc` as its *first* argument. The `Context` is essential for managing state, events, and child components. + * It must return a `View`. A `View` is an `Arc`, essentially a closure that contains the drawing instructions for your component. +3. **Return Value**: The most common way to return a `View` is by using the `rsx!` macro followed by `.view(&cx)`. + +### Component Props + +Components become truly powerful when they can receive data from their parents. These are called "props" (properties). To define props for your component, simply add more parameters to your component function after `cx: &Arc`. + +OSUI's `#[component]` macro automatically generates a struct for your component based on these parameters. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn GreetUser(cx: &Arc, name: &str, age: &u8) -> View { + // Access props directly by their parameter names + rsx! { + format!("Hello, {}! You are {} years old.", name, age) + }.view(&cx) +} + +#[component] +pub fn App(cx: &Arc) -> View { + let user_name = "Alice".to_string(); + let user_age = 30; + + rsx! { + // Instantiate GreetUser and pass props + GreetUser { + name: user_name, // Prop name matches the parameter name + age: user_age, + } + }.view(&cx) +} +``` + +**Prop Rules:** + +* **Parameter Names**: The names of your function parameters (e.g., `name`, `age`) become the names of the props you use when instantiating the component in `rsx!`. +* **Reference Types**: Props are typically passed as references (e.g., `&str`, `&u8`). The `#[component]` macro automatically "strips" the reference when generating the internal component struct, storing the owned type. This means you don't need to manually clone values unless you intend to move them into a closure or `State`. +* **`children` Prop**: As seen in the [previous guide](../intro/03-example-basic-component.md), any content nested inside a component's `rsx!` invocation is implicitly passed as a `children: &Rsx` prop. This allows for flexible content composition. + +### Example: Component with `children` and custom props + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +pub fn Card(cx: &Arc, title: &str, children: &Rsx) -> View { + rsx! { + format!("--- {} ---", title) // Render the title prop + @{children} // Render the children passed to Card + "----------------" + }.view(&cx) +} + +#[component] +pub fn App(cx: &Arc) -> View { + rsx! { + Card { + title: "My Awesome Card", // Pass a custom prop + // The content below is passed as the `children` prop + rsx! { + "This is the content inside the card." + "It can span multiple lines or include other components." + } + } + Card { + title: "Another Card", + "Just some simple text here." // Even a single string literal can be children + } + }.view(&cx) +} +``` + +In this example, the `Card` component takes a `title` prop and a `children` prop. It renders the title, then its children, and finally a footer. + +## When to Create a Component + +* **Reusability**: If you find yourself writing the same UI structure multiple times, extract it into a component. +* **Separation of Concerns**: When a part of your UI has its own state or complex logic, it's a good candidate for a component. +* **Readability**: Breaking down large `rsx!` blocks into smaller components improves the readability and maintainability of your code. +* **Performance (Reactivity)**: Components, especially when using state hooks, allow OSUI to efficiently re-render only the parts of the UI that have changed. + +By following these guidelines, you can build well-structured and scalable OSUI applications. + +**Next:** Deep dive into the `rsx!` macro and its full capabilities in the [RSX Syntax Guide](./01-rsx-syntax.md). diff --git a/versioned_docs/version-0.2.0/guides/01-rsx-syntax.md b/versioned_docs/version-0.2.0/guides/01-rsx-syntax.md new file mode 100644 index 0000000..c5525d4 --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/01-rsx-syntax.md @@ -0,0 +1,193 @@ +markdown +--- +sidebar_position: 1 +title: RSX Syntax Guide +--- + +# RSX Syntax Guide + +The `rsx!` macro is the cornerstone of OSUI's declarative UI system. Inspired by React's JSX, it provides an ergonomic way to define your component hierarchies directly in Rust code. This guide covers all the features of the `rsx!` syntax. + +## Basic Structure + +The `rsx!` macro produces an `Rsx` object, which is a collection of renderable nodes. You typically call `.view(&cx)` on the `Rsx` object to convert it into a `View` that your component returns. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // Your UI elements go here + "Hello, RSX!" // A simple text literal + }.view(&cx) +} +``` + +## Types of Nodes + +`rsx!` supports several types of nodes: + +### 1. Text Literals + +Plain string literals are rendered as text. + +```rust +rsx! { + "This is some text." + "This is another line of text." +} +``` + +### 2. Rust Expressions: `@{expr}` + +You can embed any Rust expression that evaluates to a renderable type (one that implements `ToRsx`) using the `@{...}` syntax. This is useful for dynamic content or rendering other `Rsx` objects. + +```rust +let dynamic_text = format!("The current time is: {:?}", std::time::SystemTime::now()); +let other_rsx = rsx! { "Some nested content" }; + +rsx! { + @{dynamic_text} // Renders the string from the expression + @{other_rsx} // Renders another Rsx object + @{123 + 456} // Renders the result of the arithmetic operation (as a string) +} +``` + +:::tip +Any type that implements `std::fmt::Display` (like `String`, `&str`, `i32`, `f64`, etc.) automatically implements `ToRsx` and can be used directly within `rsx!`. +::: + +### 3. Component Instantiation: `ComponentName { prop: value, ... }` + +To use another component, specify its name (path) followed by an optional braced block containing its props and children. + +```rust +#[component] +fn MyButton(cx: &Arc, text: &str) -> View { + rsx! { + format!("[ {} ]", text) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MyButton { text: "Click Me" } // Component with a prop + MyButton { "Another Button" } // Component with children (which becomes `text` if `children: &Rsx` is also defined) + }.view(&cx) +} +``` + +* **Props**: Key-value pairs (`prop_name: value`) inside the braces. The `prop_name` must match a parameter name in the target component's function signature. +* **Children**: Any `rsx!` content (text, expressions, other components) directly nested inside the component's braces after props will be collected into the special `children: &Rsx` prop, if defined by the component. + +### 4. Conditional Rendering: `@if condition { ... }` + +Conditionally render parts of your UI based on a boolean expression. + +```rust +let show_message = true; +let is_admin = false; + +rsx! { + @if show_message { + "This message is always shown." + } + @if is_admin { + "Admin panel access granted." + } else { + "Access denied." // `else` is optional + } +} +``` + +* The `condition` must be a Rust expression that evaluates to a `bool`. +* The content inside the `{...}` block is an `rsx!` fragment that will be rendered if the condition is true. +* An optional `else { ... }` block can follow for false conditions. + +#### Reactivity with Dependencies: `%$dep @if condition { ... }` + +For conditional rendering to react to state changes, you need to explicitly declare dependencies using the `%$dep` syntax. + +```rust +let count = use_state(0); // A reactive state + +rsx! { + %count @if *count.get() > 0 { // This block re-renders if `count` changes + format!("Count is: {}", count.get_dl()) + } else { + "Count is zero." + } +} +``` + +* **`%count`**: Declares `count` as a dependency for this `if` block. When `count`'s value changes (via `count.set()` or `*count.get_mut()`), this entire `if` block will be re-evaluated and re-rendered. +* You can declare multiple dependencies: `%dep1, dep2, dep3 @if ...` +* You can also rename dependencies for clarity: `%original_name as new_name @if ...` + +### 5. Loop Rendering: `@for pattern in expr { ... }` + +Render a list of items by iterating over a collection. + +```rust +let items = vec!["Apple", "Banana", "Cherry"]; + +rsx! { + "Fruits:" + @for item in items { // Loops over the `items` vector + format!("- {}", item) + } + + "Numbers:" + @for i in (0..3) { + format!("Number: {}", i) + } +} +``` + +* `pattern` is a standard Rust `for` loop pattern (e.g., `item`, `(index, item)`, `_`). +* `expr` is a Rust expression that evaluates to an `IntoIterator`. +* The content inside the `{...}` block is an `rsx!` fragment that will be rendered for each iteration. + +#### Reactivity with Dependencies: `%$dep @for pattern in expr { ... }` + +Similar to `@if`, `@for` loops also support dependency tracking for reactive updates. + +```rust +let my_list = use_state(vec!["One".to_string(), "Two".to_string()]); + +// Later, you might update my_list.set(new_vec); +// or my_list.get_mut().push("Three"); + +rsx! { + "My Dynamic List:" + %my_list @for item in my_list.get_dl() { // This block re-renders if `my_list` changes + format!("- {}", item) + } +} +``` + +* **`%my_list`**: Declares `my_list` as a dependency. When `my_list` is updated, the loop will be re-executed, rendering the new list. + +### 6. Mount Hook: `!mount_hook_instance` + +This syntax is used to explicitly "mount" a component's lifecycle hook. This is specifically for `use_mount_manual`. + +```rust +let my_mount_hook = use_mount_manual(); + +rsx! { + "This text is always visible." + !my_mount_hook // Explicitly triggers the mount effects for `my_mount_hook` +} +``` + +* When `!my_mount_hook` is encountered in the `rsx!` output, it calls `my_mount_hook.mount()`, triggering any `use_effect` callbacks registered with that specific `Mount` instance. + +## Summary + +The `rsx!` macro is a powerful tool for building declarative user interfaces in OSUI. By combining text, expressions, components, conditionals, and loops with reactive dependencies, you can create complex and dynamic TUIs with a clean and familiar syntax. + +**Next:** Learn how to manage component data over time with OSUI's [State Management hooks](./02-state-management.md). diff --git a/versioned_docs/version-0.2.0/guides/02-state-management.md b/versioned_docs/version-0.2.0/guides/02-state-management.md new file mode 100644 index 0000000..833a970 --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/02-state-management.md @@ -0,0 +1,196 @@ +markdown +--- +sidebar_position: 2 +title: State Management +--- + +# State Management + +Effective state management is crucial for building interactive and dynamic TUI applications. OSUI provides a React-like hook system that enables components to hold mutable state and react to changes efficiently. This guide covers the core state management hooks: `use_state` and `use_effect`. + +## `use_state`: Managing Component-Local State + +The `use_state` hook allows your components to declare and manage mutable, reactive state. When state managed by `use_state` changes, OSUI automatically re-renders affected parts of your UI. + +### Basic Usage + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn Counter(cx: &Arc) -> View { + // 1. Initialize state with `use_state` + // `count` is a `State`, initialized to 0. + let count = use_state(0); + + // 2. Define a button that increments the count + // This is a placeholder for actual interactive elements. + // In a real app, an event handler would trigger `count.set()` or `*count.get_mut()`. + let increment_button_simulated = { + let count = count.clone(); // Clone the State handle to move into the closure + move || { + // Option 1: Using `set()` for direct replacement + // count.set(*count.get() + 1); + + // Option 2: Using `get()` for mutable access (recommended for complex changes) + *count.get() += 1; // `Inner` guard automatically calls `update()` on drop + } + }; + + // Simulate clicking the button once per render for demonstration + // In a real app, this would be triggered by user input or other events. + increment_button_simulated(); + + rsx! { + // 3. Display the state value + // `count.get_dl()` gets a cloned, deadlock-less copy of the value. + // `count.get()` returns a guard for mutable access, also deadlock-less. + format!("Count: {}", count.get_dl()) + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(Counter {}).expect("Failed to run Counter app"); +} +``` + +In this example, the `Counter` component's state (`count`) is incremented on each render cycle (simulated). The `rsx!` macro automatically updates to reflect the new `count` value because the `Counter` component is re-rendered by the engine and the `count` state is used. + +### `State` and `Inner<'a, T>` + +* **`State`**: This is the primary handle to your reactive state. It's an `Arc>` internally, allowing safe shared ownership and mutation across threads. When you call `use_state(value)`, you get a `State`. +* **`count.get()`**: This method returns an `Inner<'a, T>` guard. `Inner` implements `Deref` and `DerefMut`, so you can treat it almost like a direct reference to your data (`*count.get()`). The `Inner` guard is crucial because it automatically triggers updates to dependents when it's dropped *if* the value was mutated. +* **`count.set(value)`**: A convenience method to replace the entire state value and then trigger updates. +* **`count.get_dl()`**: Returns a cloned copy of the state value. The "dl" stands for "deadlock-less", as it doesn't hold the mutex lock for an extended period, making it safer for quick reads. Use this when you only need to read the value and cloning is cheap. +* **`count.update()`**: Manually notifies all dependents that the state *might* have changed, even if you didn't use `get_mut()` or `set()`. Useful if you modify the internal `Arc>` directly (not recommended) or a complex part of `T` without triggering the `DerefMut` auto-update. + +### Important Considerations for `State`: + +* **Cloning `State` handles**: `State` itself can be cloned (`count.clone()`). This creates a new `Arc` reference to the *same* underlying state. This is essential when moving `State` into closures or child components. +* **`Send + Sync`**: The type `T` held by `State` must implement `Send` and `Sync` for thread-safe access. +* **Reactivity**: `use_state` makes state reactive. When the value changes, any `use_effect` or `rsx!` dynamic scope (`%state @if...` or `%state @for...`) that declared this `State` as a dependency will be re-evaluated. + +## `use_effect`: Performing Side Effects + +The `use_effect` hook allows you to perform side effects (e.g., logging, network requests, setting up event listeners) in response to state changes or component mounting. + +### Basic Usage + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn EffectExample(cx: &Arc) -> View { + let count = use_state(0); + let message = use_state("Initial message".to_string()); + + // Effect 1: Logs when `count` changes + use_effect( + { + let count = count.clone(); // Clone for the closure + move || { + println!("Effect 1: Count changed to {}", count.get_dl()); + } + }, + &[&count], // Dependencies: &[&dyn HookDependency] + ); + + // Effect 2: Logs when `message` changes (and also on initial render) + use_effect( + { + let message = message.clone(); + move || { + println!("Effect 2: Message is now '{}'", message.get_dl()); + } + }, + &[&message], // Dependencies: &[&dyn HookDependency] + ); + + // Simulate state changes (e.g., from user input or timers) + let _ = { + let count = count.clone(); + let message = message.clone(); + std::thread::spawn(move || { + sleep(500); // Wait 0.5 seconds + *count.get() += 1; // Triggers Effect 1 + sleep(500); + message.set("Updated message!".to_string()); // Triggers Effect 2 + sleep(500); + *count.get() += 1; // Triggers Effect 1 again + }); + }; + + rsx! { + format!("Count: {}", count.get_dl()) + format!("Message: {}", message.get_dl()) + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(EffectExample {}).expect("Failed to run EffectExample app"); +} +``` + +### `use_effect` Parameters: + +1. **`f: F`**: A closure (`FnMut() + Send + Sync + 'static`) that represents the side effect. This closure will be executed when any of its dependencies change. The closure is run in a separate spawned thread to avoid blocking the main rendering loop. +2. **`dependencies: &[&dyn HookDependency]`**: A slice of references to objects that implement the `HookDependency` trait. These are typically `State` instances. The effect closure will be called whenever any of these dependencies notify an update. + +### Understanding Dependencies: + +* **Empty Dependency List (`&[]`)**: If you pass an empty slice (`&[]`), the effect will only run once when the component is first mounted. This is useful for setup logic like initializing global resources or subscriptions. +* **Specific Dependencies**: When you list `State` objects as dependencies, the effect will run: + * Once, immediately when `use_effect` is called (during the initial component render). + * Again, whenever any of the listed `State` objects trigger an update. +* **`HookDependency` Trait**: This trait defines how an object can register an `HookEffect` to be called upon update. `State` and `Mount` both implement this trait, making them usable as dependencies. + +## Lifecycle Hooks: `use_mount` and `use_mount_manual` + +These hooks are special cases of `use_effect` for managing actions tied to a component's "mounting" lifecycle. + +* **`use_mount()`**: Returns a `Mount` instance that automatically calls `mount()` immediately upon its creation. Effects registered with this `Mount` instance will run once when the component is first rendered. +* **`use_mount_manual()`**: Returns a `Mount` instance that starts in an unmounted state. Effects registered with it will *only* run when you explicitly call `mount_instance.mount()`. This is useful for controlling the mount event from specific `rsx!` nodes (`!mount_instance`) or from other logic. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn LifecycleExample(cx: &Arc) -> View { + let mount_hook = use_mount(); // Automatically mounted + let manual_mount_hook = use_mount_manual(); // Manual mount needed + + use_effect( + move || { + println!("Component mounted (automatic hook)!"); + }, + &[&mount_hook], + ); + + use_effect( + move || { + println!("Component manually mounted!"); + }, + &[&manual_mount_hook], + ); + + rsx! { + "Lifecycle example" + // This will trigger the `manual_mount_hook`'s effects + !manual_mount_hook + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(LifecycleExample {}).expect("Failed to run LifecycleExample app"); +} +``` + +This guide has laid the foundation for managing state and side effects in your OSUI applications. By mastering `use_state` and `use_effect`, you can build sophisticated and responsive TUI experiences. + +**Next:** Learn how to handle user interactions and other events with OSUI's [Event Handling system](./03-event-handling.md). diff --git a/versioned_docs/version-0.2.0/guides/03-event-handling.md b/versioned_docs/version-0.2.0/guides/03-event-handling.md new file mode 100644 index 0000000..3723afd --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/03-event-handling.md @@ -0,0 +1,285 @@ +markdown +--- +sidebar_position: 3 +title: Event Handling +--- + +# Event Handling + +OSUI provides a flexible and type-safe event system that allows components to react to various occurrences, such as user input, internal state changes, or custom application-specific events. This guide explains how to define, emit, and listen for events using `on_event`, `emit_event`, and `emit_event_threaded`. + +## Event Propagation Model + +In OSUI, events are propagated downwards through the component tree. When an event is emitted from a `Context`, it first triggers all registered handlers on that `Context`, and then recursively calls `emit_event` on all its child `Context`s. + +## Defining Custom Events + +Any Rust type that implements `Send + Sync + Any + 'static` can be used as an event. Typically, you'll define custom `struct`s or `enum`s for your events to carry specific data. + +```rust +// Define a custom event +#[derive(Debug, Clone)] +pub struct ButtonClickEvent { + pub button_id: usize, + pub timestamp: std::time::Instant, +} + +// Another custom event +#[derive(Debug, Clone)] +pub enum CustomAppEvent { + Tick, + ReloadData, +} +``` + +## Listening for Events: `cx.on_event()` + +Components can register event handlers using `cx.on_event()` to respond to specific event types. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::time::Instant; + +// Custom event definition +#[derive(Debug, Clone)] +pub struct MyCustomEvent { + pub value: String, +} + +#[component] +fn EventListener(cx: &Arc) -> View { + let received_events = use_state(Vec::::new()); + + // Register an event handler for `MyCustomEvent` + cx.on_event({ + let received_events = received_events.clone(); // Clone State for the closure + move |_ctx, event: &MyCustomEvent| { + // This closure runs when MyCustomEvent is emitted + let mut events_guard = received_events.get(); + events_guard.push(format!("Received: {}", event.value)); + // No need to call `update()` manually, `Inner` guard handles it on drop + } + }); + + rsx! { + "Event Listener Component" + @for msg in received_events.get_dl() { + format!("- {}", msg) + } + }.view(&cx) +} +``` + +* `cx.on_event, &T) + Send + Sync + 'static>(self: &Arc, handler: F)`: + * `T`: The type of event you want to listen for (e.g., `MyCustomEvent`). + * `F`: A closure that takes `&Arc` (the component's context) and `&T` (a reference to the event data). + * You pass a closure that captures the necessary state (`received_events` in this case) and logic to execute when the event fires. + +## Emitting Events: `cx.emit_event()` and `cx.emit_event_threaded()` + +Components or other parts of your application can send events using `cx.emit_event()` or `cx.emit_event_threaded()`. + +### `cx.emit_event()` (Synchronous) + +`emit_event` processes event handlers sequentially in the current thread. + +```rust +// ... (MyCustomEvent and EventListener component definitions from above) + +#[component] +fn EventSender(cx: &Arc) -> View { + let button_clicks = use_state(0); + + // Simulate an action that emits an event + let emit_click_event = { + let cx = cx.clone(); // Clone Context for the closure + let button_clicks = button_clicks.clone(); + move || { + let current_clicks = *button_clicks.get(); + *button_clicks.get() += 1; + let event = MyCustomEvent { + value: format!("Button clicked {} times", current_clicks + 1), + }; + cx.emit_event(event); // Emit the event + } + }; + + // Simulate clicking the button every second + use_effect( + { + let emit_click_event = emit_click_event.clone(); + move || { + loop { + sleep(1000); // Wait 1 second + emit_click_event(); + } + } + }, + &[], // No dependencies, run once on mount + ); + + rsx! { + format!("Button clicks: {}", button_clicks.get_dl()) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // EventSender and EventListener are siblings in the tree. + // Events emitted by EventSender will propagate down to EventListener. + EventSender {} + EventListener {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run App"); +} +``` + +### `cx.emit_event_threaded()` (Asynchronous) + +`emit_event_threaded` spawns a new thread for each registered event handler. This is useful for long-running or potentially blocking event handlers, preventing them from freezing your UI. + +```rust +// ... (MyCustomEvent, EventListener definitions) + +#[component] +fn ThreadedEventSender(cx: &Arc) -> View { + let cx_clone = cx.clone(); + // Emit an event using `emit_event_threaded` on mount + use_effect( + move || { + println!("Emitting threaded event on mount!"); + let event = MyCustomEvent { + value: "Threaded mount event".to_string(), + }; + cx_clone.emit_event_threaded(&event); // Notice the `&event` for threaded + }, + &[], // Run once on mount + ); + + rsx! { + "Threaded Event Sender" + }.view(&cx) +} + +#[component] +fn AppWithThreaded(cx: &Arc) -> View { + rsx! { + ThreadedEventSender {} + EventListener {} // This listener will receive the threaded event + }.view(&cx) +} + +// To run: engine.run(AppWithThreaded {}) +``` + +* `cx.emit_event_threaded(self: &Arc, event: &E)`: + * Takes `&E` (a reference to the event), which must implement `Clone` because each spawned thread receives a clone of the event data. + * Each handler for `E` will be executed in its own `std::thread::spawn`. + +## Realistic Usage Scenario: Interactive Counter + +Let's create a more interactive counter that responds to keyboard input. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use crossterm::event::{self, Event, KeyCode, KeyEventKind}; + +// Define a custom event for counter actions +#[derive(Debug, Clone)] +pub enum CounterAction { + Increment, + Decrement, +} + +#[component] +fn InteractiveCounter(cx: &Arc) -> View { + let count = use_state(0); + + // Listen for CounterAction events + cx.on_event({ + let count = count.clone(); + move |_ctx, action: &CounterAction| { + let mut count_guard = count.get(); + match action { + CounterAction::Increment => *count_guard += 1, + CounterAction::Decrement => *count_guard -= 1, + } + } + }); + + rsx! { + "Press 'q' to quit, '+' to increment, '-' to decrement." + format!("Current Count: {}", count.get_dl()) + }.view(&cx) +} + +// A component (or `main` function logic) to poll keyboard input +// and emit CounterAction events. +#[component] +fn KeyboardInputHandler(cx: &Arc) -> View { + // This effect runs once on mount to start the keyboard polling thread + use_effect( + { + let cx = cx.clone(); + move || { + let _ = crossterm::terminal::enable_raw_mode(); + loop { + if event::poll(std::time::Duration::from_millis(50)).unwrap() { + if let Event::Key(key_event) = event::read().unwrap() { + if key_event.kind == KeyEventKind::Press { + match key_event.code { + KeyCode::Char('+') => cx.emit_event(CounterAction::Increment), + KeyCode::Char('-') => cx.emit_event(CounterAction::Decrement), + KeyCode::Char('q') => { + let _ = crossterm::terminal::disable_raw_mode(); + cx.stop().expect("Failed to stop engine"); + break; + }, + _ => {} + } + } + } + } + } + } + }, + &[], // Empty deps: run once on mount + ); + + // This component doesn't render anything visible itself. + // Its purpose is purely to handle input and emit events. + rsx! { "" }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(AppWithKeyboardInput {}).expect("Failed to run interactive app"); + let _ = crossterm::terminal::disable_raw_mode(); // Ensure raw mode is disabled on exit +} + +#[component] +fn AppWithKeyboardInput(cx: &Arc) -> View { + rsx! { + KeyboardInputHandler {} // Handles input and emits events + InteractiveCounter {} // Listens for events and updates UI + }.view(&cx) +} +``` + +In this example: +* `KeyboardInputHandler` runs in a separate thread (due to `use_effect`'s spawning behavior). +* It polls for keyboard events using `crossterm`. +* Upon detecting `+`, `-`, or `q`, it emits a `CounterAction` or `Stop` command to its `Context`. +* `InteractiveCounter` listens for `CounterAction` events and updates its internal `count` state, which then causes it to re-render. +* The `stop()` command, emitted by `KeyboardInputHandler`, instructs the `Console` engine to terminate its rendering loop. + +This showcases a full interaction loop using custom events for communication between components. + +**Next:** Explore specialized lifecycle management with `use_mount` and `use_mount_manual` in [Lifecycle Hooks](./04-lifecycle-hooks.md). diff --git a/versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md b/versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md new file mode 100644 index 0000000..60827a0 --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md @@ -0,0 +1,150 @@ +markdown +--- +sidebar_position: 4 +title: Lifecycle Hooks +--- + +# Lifecycle Hooks + +In OSUI, components have a lifecycle, meaning they go through various stages from creation to destruction. While OSUI doesn't expose a full set of lifecycle methods like some frameworks, it provides powerful hooks for managing effects related to a component's "mounting" phase: `use_mount` and `use_mount_manual`. These are special applications of the `use_effect` hook, designed for setup logic. + +## The "Mounted" Concept + +A component is considered "mounted" when it has been rendered for the first time and is part of the active component tree. Lifecycle hooks allow you to run code precisely at this point. + +## `use_mount()`: Automatic Mounting + +The `use_mount()` hook provides a `Mount` instance that is automatically marked as "mounted" upon its creation. Any `use_effect` that depends on this `Mount` instance will execute its effect closure immediately when the component renders. + +### When to use `use_mount()`: + +* **Initial Setup**: Performing actions that should only happen once when the component first appears on screen, such as fetching initial data, setting up global event listeners, or initializing complex external resources. +* **No Cleanup Required**: For effects that don't require any cleanup logic. If cleanup is needed, ensure your effect closure handles it or consider using `use_effect` with an empty dependency array (which is similar in behavior for initial execution, but offers more control over subsequent runs if dependencies are added). + +### Example: Initial Data Fetch + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::time::Duration; + +// Simulate a data fetching operation +async fn fetch_data_async() -> String { + // In a real application, this would be an actual network request or disk read. + tokio::time::sleep(Duration::from_secs(1)).await; // Simulate network delay + "Data loaded successfully!".to_string() +} + +#[component] +fn DataLoader(cx: &Arc) -> View { + let data_state = use_state("Loading data...".to_string()); + let mount_hook = use_mount(); // Automatically initializes as "mounted" + + // Use `use_effect` with `mount_hook` as a dependency + use_effect( + { + let data_state = data_state.clone(); + move || { + // This effect runs once when `mount_hook` is initialized (component mounts) + println!("DataLoader: Component mounted, starting data fetch..."); + // Spawn a new async task (requires a runtime like tokio) + tokio::spawn(async move { + let data = fetch_data_async().await; + data_state.set(data); // Update state, triggering re-render + println!("DataLoader: Data fetch complete."); + }); + } + }, + &[&mount_hook], // Effect runs when `mount_hook` updates (i.e., on mount) + ); + + rsx! { + format!("Status: {}", data_state.get_dl()) + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + DataLoader {} + }.view(&cx) +} + +pub fn main() { + // For async operations, you need a runtime like tokio. + // Add `tokio = { version = "1", features = ["full"] }` to your Cargo.toml + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run async app"); + }); +} +``` + +## `use_mount_manual()`: Explicit Mounting + +The `use_mount_manual()` hook provides a `Mount` instance that starts in an "unmounted" state. Its associated `use_effect` callbacks will *not* run until you explicitly call the `mount()` method on that specific `Mount` instance. This offers finer control over when initial setup logic executes. + +### When to use `use_mount_manual()`: + +* **Conditional Mounting**: When you want to delay the "mount" logic until a specific condition is met or an interaction occurs. +* **`rsx!`-driven Mounting**: You can trigger the `mount()` method directly from your `rsx!` template using the `!mount_hook_instance` syntax. This is useful if the mount event is tied to the presence of a specific element or a complex rendering path. + +### Example: Delayed Mount with `rsx!` + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn DelayedSetup(cx: &Arc) -> View { + let setup_status = use_state("Waiting for manual mount...".to_string()); + let manual_mount_hook = use_mount_manual(); // Starts unmounted + + use_effect( + { + let setup_status = setup_status.clone(); + move || { + // This effect will only run when `manual_mount_hook.mount()` is called. + println!("DelayedSetup: Manual mount triggered, performing setup!"); + setup_status.set("Setup complete!".to_string()); + } + }, + &[&manual_mount_hook], // Depends on the manual mount hook + ); + + rsx! { + format!("Status: {}", setup_status.get_dl()) + // The `!manual_mount_hook` in RSX triggers `manual_mount_hook.mount()` + // which then causes the `use_effect` to run. + !manual_mount_hook + "This component is now mounted." + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + DelayedSetup {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run delayed mount app"); +} +``` + +In this example, the "Setup complete!" message will appear only after the `!manual_mount_hook` line is processed by the `rsx!` renderer, explicitly calling `mount_hook.mount()`. + +## Summary of Lifecycle Hooks + +* `use_mount()`: For effects that should run once immediately when the component is initially rendered. +* `use_mount_manual()`: For effects that you want to explicitly control when they run, either through programmatic calls to `.mount()` or via the `!mount_hook_instance` syntax in `rsx!`. + +These hooks, combined with `use_effect`, give you fine-grained control over when side effects are performed during your component's lifetime. + +**Next:** Understand how to synchronize component state with events for sophisticated data flow patterns in [Data Flow and Sync](./05-data-flow-and-sync.md). diff --git a/versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md b/versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md new file mode 100644 index 0000000..533b38e --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md @@ -0,0 +1,216 @@ +markdown +--- +sidebar_position: 5 +title: Data Flow and Sync +--- + +# Data Flow and Synchronization + +OSUI's reactive state system and event handling capabilities provide a robust foundation for managing data flow within your application. The `use_sync_state` and `use_sync_effect` hooks offer powerful patterns for synchronizing component state with external events and vice versa, enabling sophisticated inter-component communication and data management. + +## `use_sync_state`: State from Events + +`use_sync_state` allows a component's internal `State` to be automatically updated whenever a specific type of event is emitted to its `Context`. This is a powerful way to inject external data or changes into a component's reactive state. + +### How it works: + +It combines `use_state` and `cx.on_event`. +1. You provide an initial value for the state. +2. You specify the event type (`E`) and a `decoder` function. +3. The `decoder` function takes an `&E` event and returns a new value `T` for the state. +4. Whenever an event of type `E` is emitted to the current `Context`, the `decoder` runs, and the internal `State` is updated. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use crossterm::event::{self, Event, KeyCode, KeyEventKind}; + +// Define a simple event to change a message +#[derive(Debug, Clone)] +pub struct MessageChangeEvent(pub String); + +#[component] +fn MessageDisplay(cx: &Arc) -> View { + // Use `use_sync_state` to update the message based on `MessageChangeEvent` + let message = use_sync_state( + cx, + "Initial Message".to_string(), // Initial state value + |event: &MessageChangeEvent| event.0.clone(), // Decoder: extract string from event + ); + + rsx! { + "Received Message:" + format!(" {}", message.get_dl()) + }.view(&cx) +} + +#[component] +fn MessageInput(cx: &Arc) -> View { + // Simulate input by reacting to key presses and emitting MessageChangeEvent + use_effect( + { + let cx = cx.clone(); + move || { + let _ = crossterm::terminal::enable_raw_mode(); + loop { + if event::poll(std::time::Duration::from_millis(50)).unwrap() { + if let Event::Key(key_event) = event::read().unwrap() { + if key_event.kind == KeyEventKind::Press { + match key_event.code { + KeyCode::Char(c) => { + let msg = format!("Typed: {}", c); + cx.emit_event(MessageChangeEvent(msg)); + }, + KeyCode::Enter => { + cx.emit_event(MessageChangeEvent("Enter pressed!".to_string())); + }, + KeyCode::Esc => { + let _ = crossterm::terminal::disable_raw_mode(); + cx.stop().expect("Failed to stop engine"); + break; + }, + _ => {} + } + } + } + } + } + } + }, + &[], // Run once on mount + ); + + rsx! { + "Type something to change the message (Esc to quit):" + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MessageInput {} // Emits MessageChangeEvent + MessageDisplay {} // Synchronizes its state with MessageChangeEvent + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); + let _ = crossterm::terminal::disable_raw_mode(); +} +``` + +In this example, `MessageInput` emits `MessageChangeEvent`s based on keyboard input. `MessageDisplay` automatically updates its `message` state whenever it receives one of these events from its parent `Context`, thanks to `use_sync_state`. + +## `use_sync_effect`: Events from State + +`use_sync_effect` allows changes in a component's internal `State` to automatically trigger the emission of a specific type of event to its `Context`. This is useful for communicating state changes upwards or to sibling components. + +### How it works: + +It combines `use_effect` and `cx.emit_event`. +1. You provide an `State` instance you want to monitor. +2. You specify an `encoder` function and optional dependencies. +3. The `encoder` function takes a `&State` and returns an event `Ev`. +4. Whenever the `State` changes (or any specified dependencies), the `encoder` runs, and the generated event `Ev` is emitted to the current `Context`. + +```rust +use osui::prelude::*; +use std::sync::Arc; +use std::collections::HashMap; + +// Event to signal a counter has changed +#[derive(Debug, Clone)] +pub struct CounterUpdatedEvent { + pub id: usize, + pub new_value: i32, +} + +#[component] +fn ChildCounter(cx: &Arc, id: &usize, initial_value: &i32) -> View { + let count = use_state(*initial_value); + + // Use `use_sync_effect` to emit `CounterUpdatedEvent` when `count` changes + use_sync_effect( + cx, + &count, // Monitor this state + move |state_ref: &State| { + // Encoder: create an event from the state + CounterUpdatedEvent { + id: *id, + new_value: state_ref.get_dl(), + } + }, + &[&count], // Effect runs when `count` changes + ); + + // Simulate incrementing the counter periodically + use_effect( + { + let count = count.clone(); + move || { + loop { + sleep(1000); // Increment every second + *count.get() += 1; + } + } + }, + &[], // Run once on mount + ); + + rsx! { + format!("Counter {}: {}", id, count.get_dl()) + }.view(&cx) +} + +#[component] +fn ParentDashboard(cx: &Arc) -> View { + let all_counts = use_state(HashMap::::new()); + + // Listen for `CounterUpdatedEvent` from children + cx.on_event({ + let all_counts = all_counts.clone(); + move |_ctx, event: &CounterUpdatedEvent| { + let mut counts_guard = all_counts.get(); + counts_guard.insert(event.id, event.new_value); + } + }); + + rsx! { + "Dashboard Overview:" + @for (id, value) in all_counts.get_dl() { + format!(" Counter {}: {}", id, value) + } + "---" + ChildCounter { id: 1, initial_value: 0 } + ChildCounter { id: 2, initial_value: 10 } + }.view(&cx) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + ParentDashboard {} + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); +} +``` + +In this example: +* `ChildCounter` uses `use_sync_effect` to emit a `CounterUpdatedEvent` every time its internal `count` state changes. +* `ParentDashboard` listens for these `CounterUpdatedEvent`s (which bubble up from its children) using `cx.on_event` and updates its own `all_counts` `HashMap` state. This `HashMap` then drives the display in the dashboard. + +## When to use `use_sync_state` and `use_sync_effect`: + +* **Inter-component Communication**: When components need to communicate beyond simple prop passing. Events are excellent for sibling-to-sibling or child-to-ancestor communication without prop drilling. +* **Centralized State Management**: You can have a central "store" component that emits events, and other components `use_sync_state` to react to those events. +* **External System Integration**: When your TUI needs to react to external system events (e.g., file changes, network updates) by mapping them to internal `State`. +* **Decoupling**: They help decouple components, as they don't need direct references to each other, only awareness of event types. + +By combining `use_state`, `use_effect`, `use_sync_state`, and `use_sync_effect` with OSUI's event system, you can build powerful and maintainable data flow architectures for your TUI applications. + +**Next:** Learn how to arrange your components visually using OSUI's rendering primitives in [Building Complex Layouts](./06-building-complex-layouts.md). diff --git a/versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md b/versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md new file mode 100644 index 0000000..890ba0f --- /dev/null +++ b/versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md @@ -0,0 +1,156 @@ +markdown +--- +sidebar_position: 6 +title: Building Complex Layouts +--- + +# Building Complex Layouts + +OSUI provides foundational primitives for rendering text and components, allowing you to compose them into complex layouts. While OSUI doesn't include a built-in layout engine (like flexbox or grid), it exposes the `DrawContext` and geometric types (`Point`, `Area`, `Size`) that enable you to manually position elements or build your own layout components. + +## The Rendering Pipeline + +At its core, OSUI's rendering works by accumulating `DrawInstruction`s into a `DrawContext`. The engine then takes this `DrawContext` and executes the instructions to draw to the terminal. + +1. **`View`**: A component returns a `View`, which is essentially a closure that takes a mutable `DrawContext` and adds drawing instructions to it. +2. **`DrawContext`**: This is the canvas for your component. It has an `area` (the total space available to the current component) and an `allocated` area (the space currently used by drawing instructions within that component). +3. **`DrawInstruction`**: The actual commands to draw, like `Text`, `View` (for child components), or `Child` (for nested `DrawContext`s). + +## Core Rendering Primitives + +These types, found in the `osui::render` module, are essential for manual layout. + +* ### `Point` + Represents a position `(x, y)` in terminal coordinates. `x` is column, `y` is row. + ```rust + pub struct Point { + pub x: u16, + pub y: u16, + } + ``` + +* ### `Size` + Represents `width` and `height` in terminal columns and rows. + ```rust + pub struct Size { + pub width: u16, + pub height: u16, + } + ``` + +* ### `Area` + Combines `Point` and `Size` to define a rectangular region. + ```rust + pub struct Area { + pub x: u16, + pub y: u16, + pub width: u16, + pub height: u16, + } + ``` + +## `DrawContext`: Your Drawing Canvas + +Inside a `View` closure, you receive a mutable `DrawContext`. This is how you interact with the rendering system. + +```rust +use osui::prelude::*; +use std::sync::Arc; + +#[component] +fn MyCustomLayout(cx: &Arc, children: &Rsx) -> View { + let children_view = children.view(&cx); // Convert Rsx children to a View + + Arc::new(move |ctx: &mut DrawContext| { + // `ctx.area` gives you the total available space for this component. + let available_width = ctx.area.width; + let available_height = ctx.area.height; + + // --- Manual layout example: Two columns --- + + // Allocate space for the left column + let left_col_area = ctx.allocate( + ctx.area.x, + ctx.area.y, + available_width / 2, + available_height, + ); + + // Draw some text in the left column + ctx.draw_text( + Point { x: left_col_area.x + 1, y: left_col_area.y + 1 }, + "Left Panel", + ); + ctx.draw_text( + Point { x: left_col_area.x + 1, y: left_col_area.y + 2 }, + &format!("Available: {}x{}", left_col_area.width, left_col_area.height), + ); + + // Allocate space for the right column + let right_col_area = ctx.allocate( + ctx.area.x + available_width / 2, // Start x at half width + ctx.area.y, + available_width / 2, + available_height, + ); + + // Draw the children (passed to MyCustomLayout) into the right column + // This effectively "moves" the children's rendering into this specific area. + ctx.draw_view( + right_col_area, // Children will render relative to this new area + children_view.clone(), + ); + + // Draw more text in the right column + ctx.draw_text( + Point { x: right_col_area.x + 1, y: right_col_area.y + 1 }, + "Right Panel (Children Area)", + ); + }) +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + MyCustomLayout { + rsx! { + "Hello from the child content!" + "This text should appear in the right panel." + } + } + }.view(&cx) +} + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run app"); +} +``` + +### Key `DrawContext` Methods: + +* **`ctx.area`**: The `Area` that the *current component* has been allocated by its parent. All drawing coordinates are relative to `ctx.area.x` and `ctx.area.y`. +* **`ctx.allocate(x, y, width, height)`**: This method marks a region within `ctx.area` as "used". It takes coordinates relative to `ctx.area`'s top-left corner (0,0 of its own space) and returns a new `Area` representing the allocated sub-region. It also updates `ctx.allocated` to be the union of all allocations so far within this `DrawContext`. +* **`ctx.draw_text(point, text)`**: Adds a `Text` instruction. `point` is relative to `ctx.area`. +* **`ctx.draw_view(area, view)`**: Adds a `View` instruction. This is how you tell the renderer to draw a child component (or another `View`) within a specific `area`. The `area` here is also relative to `ctx.area`. The child view will then receive this `area` as its own `ctx.area`. + +### Building a Simple Layout Component + +The `MyCustomLayout` component above demonstrates a basic two-column layout. You can create more sophisticated layout components by: + +1. **Calculating Sub-Regions**: Based on `ctx.area.width` and `ctx.area.height`, divide the space into logical sub-regions (e.g., header, footer, sidebar, main content). +2. **Allocating Space**: Use `ctx.allocate()` to define these sub-regions. +3. **Drawing Content**: + * For static text or background elements, use `ctx.draw_text()`. + * For child components, call `child_rsx.view(&cx)` to get their `View`, and then use `ctx.draw_view(sub_area, child_view)` to render them in their designated space. + +### Tips for Layouts: + +* **Relative Positioning**: Always think of `Point` and `Area` coordinates as being *relative* to the `ctx.area` of the current `View` being rendered. The `Console` engine handles translating these relative coordinates to absolute terminal coordinates. +* **No Overlapping**: Be mindful of overlapping areas. If you draw two things to the same `Point`, the last one drawn will overwrite the first. OSUI does not automatically manage Z-ordering. +* **Responsive Design**: Consider how your layouts will adapt to different terminal sizes. You can use `ctx.area.width` and `ctx.area.height` to make calculations dynamic. +* **Composition**: Layout components can themselves be children of other layout components, allowing you to build complex nested structures. + +While implementing a full layout system like CSS Flexbox is beyond the scope of OSUI's core, these primitives empower you to craft highly customized and visually rich terminal interfaces by manually managing space and component placement. + +**Next:** Explore the detailed [API Reference](../reference/00-crate-structure.md) for all OSUI modules and types. diff --git a/versioned_docs/version-0.2.0/intro/00-introduction.md b/versioned_docs/version-0.2.0/intro/00-introduction.md new file mode 100644 index 0000000..4afcad5 --- /dev/null +++ b/versioned_docs/version-0.2.0/intro/00-introduction.md @@ -0,0 +1,33 @@ +markdown +--- +sidebar_position: 0 +title: Introduction +--- + +# Introduction to OSUI + +OSUI is a powerful and flexible Rust library for building advanced Terminal User Interfaces (TUIs). It provides a component-based architecture inspired by modern web frameworks, offering a familiar and ergonomic development experience for crafting interactive command-line applications. + +## What is OSUI? + +OSUI stands for "Operating System User Interface" in the terminal context. It aims to bridge the gap between simple text-based applications and rich graphical user interfaces by offering a robust framework for complex TUI development. + +### Key Features + +* **Component System**: Build UIs using reusable, composable components that manage their own state and lifecycle. +* **Reactive State Management**: Leverage React-like hooks (`useState`, `useEffect`) for efficient and predictable state handling. +* **Declarative UI with RSX**: Define your UI structure using an intuitive, macro-based RSX (React-like Syntax) similar to JSX. +* **Event Handling**: A type-safe event system allows components to communicate and respond to user input and internal changes. +* **Pluggable Rendering Engine**: Ships with a `Console` engine for `crossterm`-based terminal rendering, and an extensible `Engine` trait for custom backends. +* **Benchmark Tooling**: Built-in benchmarking capabilities to measure and optimize rendering performance. + +## Why OSUI? + +Traditional TUI libraries often require imperative manipulation of the terminal buffer, which can become cumbersome for complex applications. OSUI addresses this by: + +* **Promoting Modularity**: Components encapsulate UI logic and appearance, making code easier to organize, test, and maintain. +* **Simplifying State Logic**: The hook-based state management system ensures that your UI automatically reacts to data changes, reducing boilerplate and potential bugs. +* **Enhancing Developer Experience**: The `rsx!` macro and `#[component]` attribute provide a declarative way to define your UI, allowing you to focus on *what* your UI should look like, rather than *how* to draw it. +* **Encouraging Scalability**: The clear separation of concerns (components, state, rendering engine) makes OSUI suitable for applications ranging from simple utilities to complex interactive dashboards. + +Whether you're building a CLI dashboard, an interactive configuration tool, or a text-based game, OSUI provides the tools to create engaging and performant terminal experiences. diff --git a/versioned_docs/version-0.2.0/intro/01-installation.md b/versioned_docs/version-0.2.0/intro/01-installation.md new file mode 100644 index 0000000..85ebe30 --- /dev/null +++ b/versioned_docs/version-0.2.0/intro/01-installation.md @@ -0,0 +1,44 @@ +markdown +--- +sidebar_position: 1 +title: Installation +--- + +# Installation + +To get started with OSUI, you need to add it as a dependency to your Rust project. OSUI is available on [crates.io](https://crates.io/crates/osui). + +## Adding OSUI to Your Project + +Open your project in your terminal and run this command: + +```bash +cargo add osui +``` + +The `osui` crate re-exports its procedural macros (`#[component]` and `rsx!`) through its `prelude` module, so you typically don't need to add `osui-macros` as a separate dependency. + +## Enabling the `rsx` Feature (Recommended) + +The `rsx` feature is crucial for using OSUI's declarative UI syntax. It is usually enabled by default when you add `osui` as a dependency. If you ever explicitly disable default features for `osui`, remember to re-enable `rsx`: + +```toml +[dependencies] +osui = { version = "0.2.0", features = ["rsx"] } +``` + +:::info +The `rsx` feature is vital for using OSUI's `rsx!` macro and `#[component]` attribute, which are fundamental to building UIs in OSUI. +::: + +## Building Your Project + +Once `osui` is added to your `Cargo.toml`, you can build your project using Cargo: + +```bash +cargo build +``` + +This will download and compile OSUI and its dependencies. + +You are now ready to start building your first OSUI application! Proceed to the [Getting Started](./02-getting-started.md) guide to write your first "Hello World" component. diff --git a/versioned_docs/version-0.2.0/intro/02-getting-started.md b/versioned_docs/version-0.2.0/intro/02-getting-started.md new file mode 100644 index 0000000..0854372 --- /dev/null +++ b/versioned_docs/version-0.2.0/intro/02-getting-started.md @@ -0,0 +1,90 @@ +markdown +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started: Hello World + +Let's write a minimal OSUI application that displays "Hello World" in the terminal. This example will introduce you to the core concepts of an OSUI application: the `Console` engine, running an application, and defining a basic component with `rsx!`. + +## 1. Create a New Project + +If you haven't already, create a new Rust binary project: + +```bash +cargo new hello-osui +cd hello-osui +``` + +## 2. Add OSUI Dependency + +```bash +cargo add osui +``` + +## 3. Write the Hello World Code + +Open `src/main.rs` and replace its contents with the following: + +```rust title="src/main.rs" +use osui::prelude::*; // Import commonly used OSUI items +use std::sync::Arc; + +pub fn main() { + // 1. Initialize the Console engine + // The Console engine uses crossterm to interact with the terminal. + let engine = Console::new(); + + // 2. Run the application + // The `run` method takes your root component and starts the rendering loop. + // It returns a `Result`, which we unwrap here for simplicity. + engine.run(App {}).expect("Failed to run OSUI application"); +} + +/// 3. Define your root component +/// The `#[component]` attribute transforms a function into a reusable UI component. +/// - The first parameter `cx: &Arc` is mandatory and provides access to component context (state, events, children). +/// - Components must return a `View`. +#[component] +fn App(cx: &Arc) -> View { + // 4. Use RSX (React-like Syntax) to define the UI + // `rsx!` is a procedural macro for declarative UI construction. + // Here, it just renders a simple string literal. + rsx! { + "Hello World" + } + // `view(&cx)` converts the RSX into a `View` that can be rendered. + .view(&cx) +} +``` + +## 4. Run Your Application + +Execute your application from the terminal: + +```bash +cargo run +``` + +You should see "Hello World" displayed in your terminal, which will then clear when the application exits. + +## Understanding the Code + +Let's break down the key parts of the "Hello World" example: + +* **`use osui::prelude::*;`**: This line imports the `prelude` module, which re-exports the most commonly used types and macros from OSUI. This includes `Console`, `Context`, `View`, `#[component]`, and `rsx!`. +* **`Console::new()`**: The `Console` struct is OSUI's default rendering engine. It uses the `crossterm` library to draw content to your terminal. +* **`engine.run(App {})`**: This starts the OSUI application lifecycle. It takes an instance of your root component (`App {}` in this case) and begins the continuous rendering loop. The `App` component will be rendered repeatedly until the application is stopped (e.g., by pressing `Ctrl+C` or a command from within the app). +* **`#[component] fn App(cx: &Arc) -> View { ... }`**: + * The `#[component]` attribute is a procedural macro that transforms a standard Rust function into an OSUI component. This enables prop handling and integration into the component tree. + * All component functions must take `cx: &Arc` as their first argument. The `Context` provides access to component-specific state, lifecycle methods, event handlers, and the ability to add child components. + * Component functions must return a `View`, which is an `Arc`. This `View` represents the instructions for rendering the component. +* **`rsx! { "Hello World" }.view(&cx)`**: + * The `rsx!` macro is OSUI's declarative UI syntax. It allows you to define a hierarchy of components and text nodes in a way that feels similar to HTML or React's JSX. + * In this simple case, `"Hello World"` is a text literal that `rsx!` converts into a renderable element. + * The `.view(&cx)` method takes the `Rsx` object generated by the `rsx!` macro and processes it within the current `Context`, ultimately producing the final `View` to be returned by the component. + +This simple example demonstrates the fundamental building blocks of an OSUI application. Next, we'll explore how to create more complex components and pass data between them. + +**Next:** Learn about [Creating Components](./03-example-basic-component.md) and passing them data. diff --git a/versioned_docs/version-0.2.0/intro/03-example-basic-component.md b/versioned_docs/version-0.2.0/intro/03-example-basic-component.md new file mode 100644 index 0000000..120eda3 --- /dev/null +++ b/versioned_docs/version-0.2.0/intro/03-example-basic-component.md @@ -0,0 +1,113 @@ +markdown +--- +sidebar_position: 3 +title: Basic Component with Children +--- + +# Basic Component with Children and Props + +In OSUI, applications are built by composing smaller, reusable components. This guide expands on the "Hello World" example by demonstrating how to define a custom component, pass data to it (props), and render its children. + +## 1. The `MyComponent` Example + +Let's modify our `src/main.rs` to introduce `MyComponent`. + +```rust title="src/main.rs" +use osui::prelude::*; +use std::sync::Arc; + +pub fn main() { + let engine = Console::new(); + engine.run(App {}).expect("Failed to run engine"); +} + +#[component] +fn App(cx: &Arc) -> View { + rsx! { + // Here, MyComponent is instantiated with a string literal as its child. + // This string will be available inside MyComponent via the `children` prop. + MyComponent { "------ example" } + } + .view(&cx) +} + +#[component] +fn MyComponent(cx: &Arc, children: &Rsx) -> View { + rsx! { + // `@{children}` is an RSX expression that renders the children passed to MyComponent. + // It's a special syntax to embed an `Rsx` value directly into the component's output. + @{children} + "Simple Component" + } + .view(&cx) +} +``` + +## 2. Run the Application + +```bash +cargo run +``` + +You should see output similar to this: + +``` +------ example +Simple Component +``` + +The exact positioning will depend on your terminal's size and OSUI's default rendering behavior, but the text "------ example" (from the child) should appear before "Simple Component" (from `MyComponent` itself). + +## Understanding the Component Pattern + +### The `children` Prop + +In OSUI, just like in React or other component-based frameworks, content nested inside a component's `rsx!` invocation is implicitly passed as `children`. + +When you write: + +```rust +rsx! { + MyComponent { "------ example" } +} +``` + +The string literal `"------ example"` becomes the `children` prop for `MyComponent`. + +### `MyComponent` Definition + +Let's look at `MyComponent`'s definition: + +```rust +#[component] +fn MyComponent(cx: &Arc, children: &Rsx) -> View { + // ... +} +``` + +1. **`#[component]`**: Marks `MyComponent` as a reusable component. +2. **`cx: &Arc`**: The mandatory context parameter. +3. **`children: &Rsx`**: This is where the magic happens. Any content passed as children within the `rsx!` invocation for `MyComponent` (like `"------ example"`) will be collected into an `Rsx` type and passed to this `children` prop. The `Rsx` type itself is a collection of renderable nodes. +4. **`-> View`**: Components must return a `View`. + +### Rendering Children with `@{children}` + +Inside `MyComponent`'s `rsx!`: + +```rust +rsx! { + @{children} // Renders the content passed to MyComponent + "Simple Component" +} +``` + +* **`@{children}`**: This is an RSX expression. The `@{...}` syntax allows you to embed arbitrary Rust expressions directly into your `rsx!` output. In this case, `children` is an `&Rsx` value which implements `ToRsx`, making it eligible to be directly rendered as part of the component's output. When `children` is rendered, it generates its own `View`, effectively embedding the child content into the parent component's render tree. +* **`"Simple Component"`**: This is a direct text literal within `MyComponent`'s own output, rendered after the children. + +This pattern allows you to build highly flexible and composable components, where parents can define the overall structure and layout, while children provide specific content. + +## Next Steps + +You've seen how to define components and pass basic children. The next step is to explore the full power of OSUI's RSX syntax, including how to pass other types of props, use conditional rendering, and loop through data. + +**Next:** Dive into the details of the [RSX Syntax Guide](../guides/01-rsx-syntax.md). diff --git a/versioned_docs/version-0.2.0/reference/00-crate-structure.md b/versioned_docs/version-0.2.0/reference/00-crate-structure.md new file mode 100644 index 0000000..3afbf22 --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/00-crate-structure.md @@ -0,0 +1,51 @@ +markdown +--- +sidebar_position: 0 +title: Crate Structure +--- + +# OSUI Crate Structure + +The `osui` library is organized into several modules, each responsible for a distinct aspect of TUI development. Understanding this structure helps in navigating the codebase and locating relevant functionalities. + +## Top-Level Modules + +The `osui` crate is composed of the following main modules: + +* **`component`**: Defines the core component system, including `Context` (for component state and lifecycle), `Scope` (for child management), and the `ComponentImpl` trait. +* **`engine`**: Provides the rendering engine trait (`Engine`), command execution system (`CommandExecutor`), and concrete engine implementations like `Console` (for `crossterm`) and `Benchmark`. +* **`frontend`**: Implements the RSX (React-like Syntax) system, including the `Rsx` struct and `ToRsx` trait, which bridges the `rsx!` macro output to the rendering pipeline. +* **`render`**: Contains low-level rendering primitives such as `DrawContext`, `DrawInstruction`, `Point`, `Area`, and `Size`. This module defines *what* gets drawn. +* **`state`**: Offers React-like hooks for managing component state (`use_state`), side effects (`use_effect`), and component lifecycle (`use_mount`, `use_mount_manual`). + +## `prelude` Module + +The `osui::prelude` module re-exports the most commonly used items from all sub-modules. It's recommended to `use osui::prelude::*;` in your application to easily access essential types and macros without verbose imports. + +```rust +pub mod prelude { + pub use crate::component::{context::*, scope::*, *}; + pub use crate::engine::*; + pub use crate::frontend::*; + pub use crate::render::*; + pub use crate::state::*; + pub use crate::{sleep, Error, Result, View, ViewWrapper}; + pub use crossterm; + pub use osui_macros::{component, rsx}; + pub use std::sync::{Arc, Mutex}; +} +``` + +## OSUI Core Types + +Beyond the modules, `lib.rs` also defines some fundamental type aliases and error handling: + +* **`View`**: `Arc`. Represents a renderable unit, essentially a closure that takes a `DrawContext` and adds drawing instructions. +* **`ViewWrapper`**: `Arc`. A higher-order view that can wrap and modify how another `View` is rendered (e.g., for applying layout or styling). +* **`Result`**: `std::result::Result`. The standard result type for OSUI operations. +* **`Error`**: An enum defining OSUI-specific errors, currently including `PoisonError` for mutex poisoning. +* **`sleep(delay_ms: u64)`**: A utility function for pausing execution for a specified duration. + +This structured approach helps keep the library organized and maintainable, allowing developers to quickly understand where to find the tools they need. + +**Next:** Dive into the details of the [Component API](./component-api.md). diff --git a/versioned_docs/version-0.2.0/reference/component-api.md b/versioned_docs/version-0.2.0/reference/component-api.md new file mode 100644 index 0000000..31dc864 --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/component-api.md @@ -0,0 +1,118 @@ +markdown +--- +sidebar_position: 1 +title: Component API +--- + +# Component Module API Reference + +The `component` module is the heart of OSUI's UI system, defining how reusable UI units are structured, manage their state, and interact. + +## `ComponentImpl` Trait + +```rust +pub trait ComponentImpl: Send + Sync { + fn call(&self, cx: &Arc) -> View; +} +``` + +The `ComponentImpl` trait is implemented by all types that can act as an OSUI component. +* **`call(&self, cx: &Arc) -> View`**: The core method that renders the component. It takes a reference to the component itself (`self`) and the component's `Context` (`cx`), and returns a `View` which contains the drawing instructions. + +**Implementations:** +* **`View`**: A bare `View` (an `Arc`) can itself be a `ComponentImpl`, simply returning itself. +* **`Fn(&Arc) -> View`**: Any closure with this signature can also be a `ComponentImpl`. +* **`#[component]` macro**: The `#[component]` macro automatically generates a struct and implements `ComponentImpl` for it, wrapping your component function. + +## `Component` Type Alias + +```rust +pub type Component = Arc; +``` + +A convenience type alias for a `ComponentImpl` wrapped in an `Arc`, allowing for shared, thread-safe ownership. + +## `EventHandler` Type Alias + +```rust +pub type EventHandler = Arc, &dyn Any) + Send + Sync>>; +``` + +A type alias for a mutex-protected, thread-safe, mutable closure that handles events. Event handlers receive the component's `Context` and a reference to the event data (as `&dyn Any`). + +## `context` Module + +Contains the `Context` struct, which is central to each component instance. + +### `Context` Struct + +```rust +pub struct Context { + component: AccessCell, + view: AccessCell, + event_handlers: AccessCell>>, + pub(crate) scopes: Mutex>>, + executor: Arc, +} +``` + +The `Context` holds the runtime state and behavior for a specific component instance. It manages the component's `View`, its registered event handlers, and its child `Scope`s. + +#### Methods: + +* **`fn new(component: F, executor: Arc) -> Arc`** + * Creates a new `Arc` wrapped `Context` for the given component and command executor. +* **`fn refresh(self: &Arc)`** + * Re-renders the component by clearing existing event handlers and calling the component's `call` method to produce a new `View`. This is typically called automatically by the engine or `Rsx`. +* **`fn refresh_sync(self: &Arc)`** + * Synchronously re-renders the component, blocking until the view closure has finished executing. +* **`fn get_view(self: &Arc) -> View`** + * Returns a clone of the component's current `View`. +* **`fn on_event, &T) + Send + Sync + 'static>(self: &Arc, handler: F)`** + * Registers an event handler `F` for events of type `T`. When an event of type `T` is `emit`ted to this `Context`, the handler `F` will be invoked. +* **`fn emit_event(self: &Arc, event: E)`** + * Emits an event `E`. All registered handlers for type `E` on this `Context` are called synchronously, and then the event is propagated to all child components. +* **`fn emit_event_threaded(self: &Arc, event: &E)`** + * Emits an event `E`. Each registered handler for type `E` on this `Context` is called in a *newly spawned thread*. The event is then propagated to all child components (also using `emit_event_threaded`). Requires `E` to be `Clone`. +* **`fn scope(self: &Arc) -> Arc`** + * Creates a new, empty child `Scope` and adds it to this `Context`. Returns the new `Scope`. +* **`fn dyn_scope) + Send + Sync + 'static>(self: &Arc, drawer: F, dependencies: &[&dyn HookDependency]) -> Arc`** + * Creates a new *dynamic* child `Scope` that re-renders (by calling `drawer`) whenever any of its `dependencies` change. `drawer` is also called immediately. Returns the new `Scope`. +* **`fn add_scope(self: &Arc, scope: Arc)`** + * Adds an already constructed `Scope` as a child to this `Context`. +* **`fn draw_children(self: &Arc, ctx: &mut DrawContext)`** + * Iterates through all child `Scope`s and their components, rendering them into the provided `DrawContext`. Handles `ViewWrapper`s if present. +* **`fn get_executor(self: &Arc) -> Arc`** + * Returns a clone of the `CommandExecutor` associated with this `Context`. +* **`fn execute(self: &Arc, command: T) -> crate::Result<()>`** + * Executes a given `Command` using the associated `CommandExecutor`. +* **`fn stop(self: &Arc) -> crate::Result<()>`** + * A convenience method to execute the `Stop` command, terminating the application. + +## `scope` Module + +Contains the `Scope` struct, which organizes child components within a `Context`. + +### `Scope` Struct + +```rust +pub struct Scope { + pub children: Mutex, Option)>>, + executor: Arc, +} +``` + +A `Scope` groups child components. Each entry in `children` consists of a child `Context` and an optional `ViewWrapper` that can modify its rendering. + +#### Methods: + +* **`fn new(executor: Arc) -> Arc`** + * Creates a new `Arc` wrapped `Scope` with the given `CommandExecutor`. +* **`fn child(self: &Arc, child: F, view_wrapper: Option)`** + * Creates a new `Context` for the provided `child` component, refreshes it, and adds it to this `Scope`'s children, optionally with a `ViewWrapper`. +* **`fn view(self: &Arc, view: View)`** + * Creates a new `Context` directly from a `View` (without an explicit `ComponentImpl`), refreshes it, and adds it to this `Scope`'s children. + +This module forms the backbone of how component trees are constructed and managed in OSUI. + +**Next:** Explore the [Engine API](./engine-api.md). diff --git a/versioned_docs/version-0.2.0/reference/engine-api.md b/versioned_docs/version-0.2.0/reference/engine-api.md new file mode 100644 index 0000000..ad3985a --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/engine-api.md @@ -0,0 +1,164 @@ +markdown +--- +sidebar_position: 2 +title: Engine API +--- + +# Engine Module API Reference + +The `engine` module defines the core interfaces for how OSUI applications run, render, and execute commands. It provides abstractions for different rendering backends and includes a default console implementation. + +## `Engine` Trait + +```rust +pub trait Engine { + fn run(&self, component: C) -> crate::Result; + fn init(&self, component: C) -> Arc; + fn render(&self, cx: &Arc); + fn render_delay(&self); + fn render_view(&self, area: &Area, view: &View) -> DrawContext; + fn draw_context(&self, ctx: &DrawContext); + fn executor(&self) -> Arc; +} +``` + +The `Engine` trait is the primary interface for running an OSUI application. It abstracts away the specifics of how components are initialized, rendered, and how the application loop is managed. + +#### Associated Types / Generics: + +* **`Output`**: A generic type that allows `run` to return different results. By default, it's `()`, but for specialized engines (like `Benchmark`), it can return custom data. + +#### Methods: + +* **`fn run(&self, component: C) -> crate::Result`** + * The main entry point to start the OSUI application loop. It takes the root component `C`, initializes it, and continuously renders until a stop command is issued. Returns `Ok(())` by default, or a custom `Output` for specialized engines. +* **`fn init(&self, component: C) -> Arc`** + * Initializes the rendering environment and creates the root `Context` for the application's top-level component. This is typically called by `run`. +* **`fn render(&self, cx: &Arc)`** + * Performs a full render cycle for the given `Context`. This usually involves clearing the screen, calling `render_view` for the root, and then `draw_context`. +* **`fn render_delay(&self)`** + * A hook for introducing a delay between render frames. The default implementation calls `crate::sleep(16)` for approximately 60 frames per second. +* **`fn render_view(&self, area: &Area, view: &View) -> DrawContext`** + * Takes a `View` and the `Area` it should render within, executing the `View`'s closure to produce a `DrawContext` filled with `DrawInstruction`s. +* **`fn draw_context(&self, ctx: &DrawContext)`** + * Executes the drawing instructions contained within a `DrawContext` to actually draw content to the rendering target (e.g., the terminal). +* **`fn executor(&self) -> Arc`** + * Returns the `CommandExecutor` instance used by this engine. + +## `Command` Trait + +```rust +pub trait Command { + fn as_any(&self) -> &dyn Any; +} +``` + +The `Command` trait is implemented by types that represent actions or instructions that can be executed by the `CommandExecutor`. This trait enables a type-safe way to send commands between components and the engine. + +* **`fn as_any(&self) -> &dyn Any`**: Allows downcasting the command to its concrete type for pattern matching and execution. + +## `CommandExecutor` Trait + +```rust +pub trait CommandExecutor: Send + Sync { + fn execute_command(&self, command: &Arc) -> crate::Result<()>; +} +``` + +The `CommandExecutor` trait defines how commands are processed within the OSUI application. Engines provide their own implementations of this trait to handle system-level operations. + +* **`fn execute_command(&self, command: &Arc) -> crate::Result<()>`**: Takes an `Arc` wrapped `Command` and executes it. Implementations typically use `command.as_any().downcast_ref()` to identify and process specific commands. + +## `console` Module: `Console` Engine and `ConsoleExecutor` + +The `console` module provides OSUI's default, `crossterm`-based rendering engine. + +### `Console` Struct + +```rust +pub struct Console { + threads: Mutex) + Send + Sync>>>, + executor: Arc, +} +``` + +The `Console` struct implements the `Engine` trait, specifically designed to render to a terminal using `crossterm`. + +#### Methods: + +* **`fn new() -> Self`**: Creates a new `Console` engine. +* **`fn thread) + Send + Sync + 'static>(&self, run: F)`**: Registers a closure to be run in a separate thread when the engine initializes. This is useful for background tasks or input polling that needs access to the main `Context`. + +#### `Engine` Trait Implementation: +The `Console` implements all methods of the `Engine` trait, handling terminal setup (raw mode, cursor hiding), screen clearing, `crossterm` cursor movements, and text output. + +### `ConsoleExecutor` Struct + +```rust +pub struct ConsoleExecutor { + running: Mutex, +} +``` + +The `ConsoleExecutor` implements the `CommandExecutor` trait for the `Console` engine. It manages the `running` state of the application. + +#### Methods: + +* **`fn is_running(self: &Arc) -> bool`**: Checks if the application is currently running. +* **`fn stop(&self) -> crate::Result<()>`**: Sets the internal `running` flag to `false`, signaling the `Console` engine to terminate its `run` loop. + +#### `CommandExecutor` Trait Implementation: +The `ConsoleExecutor` currently supports handling the `commands::Stop` command. + +## `commands` Module: Built-in Commands + +The `commands` module defines simple, built-in commands for the engine. + +### `Stop` Command + +```rust +pub struct Stop; + +impl Command for Stop { + fn as_any(&self) -> &dyn std::any::Any; +} +``` + +A basic command used to signal the `Engine` to stop its main loop and exit the application. + +## `benchmark` Module: `Benchmark` Engine + +The `benchmark` module provides a wrapper engine for performance testing. + +### `BenchmarkResult` Struct + +```rust +pub struct BenchmarkResult { + pub average: u128, + pub min: u128, + pub max: u128, + pub total_render: u128, + pub total: u128, +} +``` + +Holds the statistical results of a benchmark run, including average, minimum, maximum, total render time, and total overall time in microseconds. + +### `Benchmark` Struct + +```rust +pub struct Benchmark(T); +``` + +A wrapper around any other `Engine` that measures its rendering performance. + +#### Methods: + +* **`fn new(engine: T) -> Self`**: Creates a new `Benchmark` wrapper around an existing `Engine` instance. + +#### `Engine` Trait Implementation: +The `Benchmark` engine implements the `Engine` trait, but its `run` method performs multiple render cycles (e.g., 40 times), measures the duration of each, and returns a `BenchmarkResult` instead of `()`. It delegates all other `Engine` methods to the wrapped engine. + +This comprehensive set of traits and implementations allows OSUI to be flexible regarding its rendering backend and extensible with custom command handling. + +**Next:** Explore the [Frontend API](./frontend-api.md). diff --git a/versioned_docs/version-0.2.0/reference/frontend-api.md b/versioned_docs/version-0.2.0/reference/frontend-api.md new file mode 100644 index 0000000..0e72e08 --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/frontend-api.md @@ -0,0 +1,78 @@ +markdown +--- +sidebar_position: 3 +title: Frontend API +--- + +# Frontend Module API Reference + +The `frontend` module is responsible for bridging the declarative `rsx!` macro syntax to the dynamic component rendering system. It defines how component hierarchies are constructed and managed before being translated into `View`s. + +## `ToRsx` Trait + +```rust +pub trait ToRsx { + fn to_rsx(&self) -> Rsx; +} +``` + +The `ToRsx` trait is implemented by any type that can be converted into an `Rsx` object. This is crucial for embedding various types (like strings, numbers, or other `Rsx` instances) directly into the `rsx!` macro output using the `@{expr}` syntax. + +**Implementations:** +* **`&Rsx`**: Converts a reference to an `Rsx` into an owned `Rsx` by cloning its internal structure. +* **`T: std::fmt::Display`**: Any type that implements `std::fmt::Display` (e.g., `String`, `&str`, `i32`, `f64`, etc.) automatically implements `ToRsx`. It converts the displayable value into a `Rsx` containing a static scope that draws the text. + +## `RsxScope` Enum + +```rust +#[derive(Clone)] +pub enum RsxScope { + Static(Arc) + Send + Sync>), + Dynamic( + Arc) + Send + Sync>, + Vec>, + ), + Child(Rsx), +} +``` + +`RsxScope` represents the different kinds of renderable units that can be part of an `Rsx` hierarchy. These scopes dictate how and when their content is processed and updated. + +* **`Static(Arc) + Send + Sync>)`**: + * Represents content that is processed only once. This is typically used for simple text literals or components that don't depend on reactive state within their `rsx!`. + * The contained closure is executed once to set up children within a new `Scope`. +* **`Dynamic(Arc) + Send + Sync>, Vec>)`**: + * Represents content that needs to be re-evaluated and potentially re-rendered when certain `dependencies` change. This is used for `rsx!` blocks with `@if` and `@for` that declare dependencies (`%dep`). + * The closure (`drawer`) is executed initially and then whenever any of the `HookDependency` instances in `dependencies` notify an update. +* **`Child(Rsx)`**: + * Represents a nested `Rsx` structure. This is used when an `Rsx` object is embedded directly into another `rsx!` block (e.g., via `@{other_rsx}` or when passing `children` to a component). + +## `Rsx` Struct + +```rust +#[derive(Clone)] +pub struct Rsx(Vec); +``` + +The `Rsx` struct is a collection of `RsxScope`s, representing a declarative UI tree fragment. It's the primary output of the `rsx!` macro. + +#### Methods: + +* **`fn new() -> Self`** + * Creates a new empty `Rsx` instance. +* **`fn static_scope) + Send + Sync + 'static>(&mut self, scope: F)`** + * Adds a `Static` `RsxScope` to the collection. The `scope` closure will be executed once to build up the content within a dedicated `Scope`. +* **`fn dynamic_scope) + Send + Sync + 'static>(&mut self, drawer: F, dependencies: Vec>)`** + * Adds a `Dynamic` `RsxScope` to the collection. The `drawer` closure will be executed initially and then on subsequent updates of the specified `dependencies`. +* **`fn child(&mut self, child: R)`** + * Adds a `Child` `RsxScope` to the collection, converting the input `R` (which must implement `ToRsx`) into a nested `Rsx`. +* **`fn generate_children(&self, context: &Arc)`** + * Processes the internal `Vec`, converting each scope into actual component `Context`s and `Scope`s within the provided parent `context`. This method recursively builds the component tree. +* **`fn view(&self, context: &Arc) -> View`** + * The primary method used by components to turn their `rsx!` output into a renderable `View`. + * It first calls `generate_children` to build the component tree within the given `context`. + * It then returns a `View` closure that, when executed, will instruct the `context` to `draw_children`. + +The `frontend` module, through `Rsx` and `RsxScope`, provides the declarative interface and the necessary translation layer to OSUI's imperative rendering core. + +**Next:** Explore the [Render API](./render-api.md). diff --git a/versioned_docs/version-0.2.0/reference/macros-api.md b/versioned_docs/version-0.2.0/reference/macros-api.md new file mode 100644 index 0000000..7905a8b --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/macros-api.md @@ -0,0 +1,212 @@ +markdown +--- +sidebar_position: 6 +title: Macros API +--- + +# Macros Module API Reference + +The `osui-macros` crate provides the procedural macros that enhance OSUI's ergonomics and enable its declarative UI syntax. These macros transform your Rust code into the necessary OSUI component and rendering structures. + +## `#[component]` Attribute Macro + +```rust +#[proc_macro_attribute] +pub fn component(_attr: TokenStream, item: TokenStream) -> TokenStream { /* ... */ } +``` + +The `#[component]` attribute macro transforms a standard Rust function into a fully-fledged OSUI component. + +#### Purpose: + +* **Prop Generation**: It automatically parses the function's parameters (after the initial `cx: &Arc`) and generates a `struct` with matching fields. These fields become the component's "props". +* **`ComponentImpl` Implementation**: It implements the `ComponentImpl` trait for the generated struct, making it a valid OSUI component that can be rendered. The `call` method of this trait simply invokes your original function. +* **Ergonomics**: Simplifies component definition by allowing you to write components as regular functions with clear parameters, without manually defining structs and `ComponentImpl` boilerplate. + +#### Usage: + +```rust +use osui::prelude::*; // For Context and View types +use std::sync::Arc; + +#[component] +pub fn MyComponent(cx: &Arc, message: &str, count: &usize) -> View { + // Your component logic, accessing `message` and `count` directly + rsx! { + format!("Message: {}, Count: {}", message, count) + }.view(&cx) +} + +// How `MyComponent` would be used in RSX: +// rsx! { +// MyComponent { message: "Hello", count: 123 } +// } +``` + +#### Generated Code (Simplified): + +```rust +pub struct MyComponent { + pub message: String, // Note: `&str` becomes `String` + pub count: usize, // Note: `&usize` becomes `usize` +} + +impl MyComponent { + pub fn component( + cx: &Arc, + message: &str, // Original function signature as `component` method + count: &usize, + ) -> View { + // Original body of the function + rsx! { + format!("Message: {}, Count: {}", message, count) + }.view(&cx) + } +} + +impl ComponentImpl for MyComponent { + fn call(&self, cx: &Arc) -> View { + Self::component( + cx, + &self.message, // Passes stored props as references + &self.count, + ) + } +} +``` + +#### Requirements: + +* The function must take `cx: &Arc` as its first parameter. +* The function must return `View`. +* Prop parameters are typically references (e.g., `&str`, `&i32`). The macro automatically converts them to their owned types (e.g., `String`, `i32`) in the generated struct. + +## `rsx!` Procedural Macro + +```rust +#[proc_macro] +pub fn rsx(input: TokenStream) -> TokenStream { /* ... */ } +``` + +The `rsx!` macro provides a declarative, React-like syntax for building UI component hierarchies directly in your Rust code. It parses the input and transforms it into calls to the `osui::frontend::Rsx` builder methods. + +#### Purpose: + +* **Declarative UI**: Allows you to describe *what* your UI should look like, rather than imperatively writing drawing commands. +* **Component Composition**: Enables easy nesting and passing of props/children to other components. +* **Reactive Flow**: Integrates with OSUI's state management to define dynamic UI segments. + +#### Syntax Overview: + +The `rsx!` macro supports several types of nodes: + +1. **Text Literals**: + ```rust + rsx! { + "Hello World" + "Another line of text" + } + // Generates: + // r.static_scope(move |scope| { + // scope.view(Arc::new(move |ctx| { + // ctx.draw_text(Point { x: 0, y: 0 }, &format!("Hello World")) + // })); + // // ... for another line + // }); + ``` + +2. **Rust Expressions (`@{expr}`)**: + ```rust + let name = "Alice"; + rsx! { + @{format!("Hello, {}!", name)} + @{1 + 2} // Any `Display` impl + } + // Generates: + // r.child(format!("Hello, {}!", name)); + // r.child(1 + 2); + ``` + * The `expr` must evaluate to a type that implements `osui::frontend::ToRsx`. + +3. **Component Instantiation (`Component { prop: value, ... children }`)**: + ```rust + #[component] fn MyDiv(cx: &Arc, content: &str) -> View { /* ... */ } + rsx! { + MyDiv { + content: "Some text", // Prop + rsx! { "Child content" } // Children (if `children: &Rsx` is a prop) + } + } + // Generates: + // r.static_scope(move |scope| { + // scope.child( + // MyDiv { + // content: "Some text".to_string(), // Owned type for struct field + // children: osui::frontend::Rsx(/* ... */) + // }, + // None + // ); + // }); + ``` + * `path`: The path to the component struct (e.g., `MyDiv`, `my_module::MyComponent`). + * `props`: `key: value` pairs for component properties. + * `children`: Any `rsx!` content directly inside the braces after props. This is collected into the special `children: &Rsx` prop if the component defines it. + +4. **Conditional Rendering (`@if condition { ... } [else { ... }]`)**: + ```rust + let show = true; + rsx! { + %show @if show { + "Content shown if 'show' is true" + } else { + "Content shown if 'show' is false" + } + } + // Generates: + // r.dynamic_scope(move |scope| { + // if show { + // // ... rsx for true branch + // } else { + // // ... rsx for false branch + // } + // }, vec![Arc::new(show) as Arc]); + ``` + * `%dep1, dep2`: Optional dependency list. The `if` block will re-evaluate when any of these dependencies (which must implement `HookDependency`, like `State`) change. + * `condition`: A Rust expression evaluating to `bool`. + * `{ ... }`: An `rsx!` fragment rendered if `condition` is true. + * `else { ... }`: Optional `rsx!` fragment rendered if `condition` is false. + +5. **Loop Rendering (`@for pattern in expr { ... }`)**: + ```rust + let items = vec!["A", "B", "C"]; + rsx! { + %items @for item in items { + format!("Item: {}", item) + } + } + // Generates: + // r.dynamic_scope(move |scope| { + // for item in items { + // // ... rsx for each item + // } + // }, vec![Arc::new(items) as Arc]); + ``` + * `%dep1, dep2`: Optional dependency list. The `for` loop will re-evaluate when any of these dependencies change. + * `pattern`: A standard Rust `for` loop pattern (e.g., `item`, `(idx, item)`). + * `expr`: A Rust expression evaluating to an `IntoIterator`. + * `{ ... }`: An `rsx!` fragment rendered for each iteration. + +6. **Mount Hook (`!mount_hook_instance`)**: + ```rust + let my_manual_mount = use_mount_manual(); + rsx! { + !my_manual_mount + } + // Generates: + // my_manual_mount.mount(); + ``` + * Calls the `.mount()` method on the provided `Mount` instance. This is typically used with `use_mount_manual` to trigger effects at a specific point in the render tree. + +The `rsx!` macro is a powerful tool for declarative UI construction, abstracting away the underlying `Rsx` object manipulation and `Scope` creation logic. + +**Next:** Explore the detailed [Render API](./render-api.md). diff --git a/versioned_docs/version-0.2.0/reference/render-api.md b/versioned_docs/version-0.2.0/reference/render-api.md new file mode 100644 index 0000000..bd61313 --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/render-api.md @@ -0,0 +1,100 @@ +markdown +--- +sidebar_position: 4 +title: Render API +--- + +# Render Module API Reference + +The `render` module provides the foundational primitives for drawing content to the terminal. It defines basic geometric types and the `DrawContext` for accumulating drawing instructions, abstracting away the specifics of the underlying terminal backend. + +## Geometric Primitives + +These structs define positions and dimensions within the terminal grid. + +### `Point` Struct + +```rust +#[derive(Clone)] +pub struct Point { + pub x: u16, // X coordinate (column) + pub y: u16, // Y coordinate (row) +} +``` + +Represents a specific coordinate in a 2D grid. + +### `Size` Struct + +```rust +#[derive(Clone)] +pub struct Size { + pub width: u16, // Width in terminal columns + pub pub height: u16, // Height in terminal rows +} +``` + +Represents the dimensions of a rectangular area. + +### `Area` Struct + +```rust +#[derive(Clone)] +pub struct Area { + pub x: u16, // X coordinate (column) of the top-left corner + pub y: u16, // Y coordinate (row) of the top-left corner + pub width: u16, // Width in terminal columns + pub height: u16, // Height in terminal rows +} +``` + +Represents a rectangular region defined by its top-left corner (`x`, `y`) and its `width` and `height`. + +## `DrawInstruction` Enum + +```rust +#[derive(Clone)] +pub enum DrawInstruction { + Text(Point, String), + View(Area, View), + Child(Point, DrawContext), // For embedding child DrawContexts at an offset +} +``` + +`DrawInstruction` enumerates the different types of atomic drawing operations that the rendering engine can perform. + +* **`Text(Point, String)`**: Instructs the engine to draw a given `String` at a specific `Point`. +* **`View(Area, View)`**: Instructs the engine to render a nested `View` within a specified `Area`. This is how child components are rendered. +* **`Child(Point, DrawContext)`**: Instructs the engine to render a child `DrawContext` at a given offset `Point`. This is typically used internally when drawing recursively. + +## `DrawContext` Struct + +```rust +#[derive(Clone)] +pub struct DrawContext { + pub area: Area, // The total area available for drawing to this context + pub allocated: Area, // The union of all allocated sub-areas within this context + pub drawing: Vec, // Accumulated drawing instructions +} +``` + +The `DrawContext` is the primary interface for components to issue drawing commands. Each component's `View` receives a `DrawContext` that represents its allocated drawing space. It accumulates `DrawInstruction`s which are then processed by the `Engine`. + +#### Methods: + +* **`fn new(area: Area) -> Self`** + * Creates a new `DrawContext` with the specified `area` as its total available space. Initializes `allocated` to an "empty" area (max `u16` for x/y, 0 for width/height). +* **`fn allocate(&mut self, x: u16, y: u16, width: u16, height: u16) -> Area`** + * Marks a sub-region within the `DrawContext`'s `area` as "allocated". + * Updates the `self.allocated` field to grow to encompass this new allocation. + * Returns the `Area` representing the newly allocated space. Coordinates (`x`, `y`) are relative to `self.area`'s top-left corner. +* **`fn draw(&mut self, inst: DrawInstruction)`** + * Adds a raw `DrawInstruction` to the `drawing` vector. +* **`fn draw_text(&mut self, point: Point, text: &str)`** + * A convenience method to add a `DrawInstruction::Text` to the context. `point` is relative to `self.area`. +* **`fn draw_view(&mut self, area: Area, view: View)`** + * A convenience method to add a `DrawInstruction::View` to the context. `area` is relative to `self.area`. + +This module lays the groundwork for all visual output in OSUI, providing the necessary abstractions for components to describe what they want to render without knowing the specifics of the terminal backend. + +**Next:** Explore the [State API](./state-api.md). diff --git a/versioned_docs/version-0.2.0/reference/state-api.md b/versioned_docs/version-0.2.0/reference/state-api.md new file mode 100644 index 0000000..b824b88 --- /dev/null +++ b/versioned_docs/version-0.2.0/reference/state-api.md @@ -0,0 +1,166 @@ +markdown +--- +sidebar_position: 5 +title: State API +--- + +# State Module API Reference + +The `state` module provides OSUI's powerful, React-like hook system for managing component state and side effects. These hooks enable reactivity, allowing your UI to automatically update in response to data changes. + +## `State` Struct + +```rust +#[derive(Debug)] +pub struct State { + value: Arc>, + dependents: Arc>>, +} +``` + +`State` is the primary type for holding reactive, component-local state. It wraps a value `T` in an `Arc>` for thread-safe access and includes a list of `HookEffect`s that should be triggered when its value changes. + +#### Methods: + +* **`fn get(&self) -> Inner<'_, T>`** + * Acquires a lock on the internal `Mutex` and returns an `Inner<'_, T>` guard. This guard provides mutable (`DerefMut`) access to the state value. When the `Inner` guard is dropped, if the value was mutated, all `dependents` (registered `HookEffect`s) are notified. +* **`fn get_dl(&self) -> T`** + * "Deadlock-less" getter. Acquires a lock, clones the internal value `T`, releases the lock, and returns the cloned value. Useful for reading the state when cloning `T` is cheap and you don't need mutable access, preventing potential deadlocks from holding a `MutexGuard` across `await` points or other blocking operations. Requires `T: Clone`. +* **`fn set(&self, v: T)`** + * Replaces the current state value with `v` and then explicitly notifies all `dependents`. +* **`fn update(&self)`** + * Manually triggers all registered `dependents`. Useful if you've modified the internal value without using `get()` (e.g., via `Arc::get_mut` if the `Arc` is uniquely owned, which is rare for `State`). +* **`fn clone(&self) -> Self`** + * Clones the `State` handle (not the internal value). This creates a new `Arc` reference to the same underlying `value` and `dependents`. Essential for moving `State` into closures or passing to child components without moving the actual state. + +#### `Display` Implementation: +If `T` implements `std::fmt::Display`, `State` also implements `std::fmt::Display`, allowing it to be directly formatted (e.g., in `format!`) by implicitly calling `get_dl()`. + +### `Inner<'a, T>` Struct + +```rust +pub struct Inner<'a, T> { + value: MutexGuard<'a, T>, + dependents: Arc>>, + updated: bool, +} +``` + +A guard type returned by `State::get()`. It provides scoped, mutable access to the internal state value. + +#### `Deref` and `DerefMut` Implementations: +* Allows `Inner<'a, T>` to be treated as a `&T` or `&mut T`, giving direct access to the underlying state. +* The `DerefMut` implementation sets an internal `updated` flag. + +#### `Drop` Implementation: +* When `Inner<'a, T>` is dropped, if the `updated` flag is `true`, it automatically iterates through `dependents` and calls their `call()` method, ensuring reactivity. + +## `HookEffect` Struct + +```rust +#[derive(Clone)] +pub struct HookEffect(Arc>); +``` + +A wrapper around a mutex-protected closure that represents a side effect. These are registered as dependents of `State` or `Mount` and are triggered when dependencies change. + +#### Methods: + +* **`fn new(f: F) -> Self`** + * Creates a new `HookEffect` from a given closure. +* **`fn call(&self)`** + * Executes the wrapped closure by acquiring its mutex. + +## `HookDependency` Trait + +```rust +pub trait HookDependency: Send + Sync { + fn on_update(&self, hook: HookEffect); +} +``` + +The `HookDependency` trait defines how an object can register an effect (`HookEffect`) to be triggered when it updates. + +**Implementations:** +* **`State`**: Registers the `HookEffect` to be called when `State`'s value changes (via `set()`, `get()` and subsequent drop, or `update()`). +* **`Mount`**: Registers the `HookEffect` to be called when `mount()` is invoked, or immediately if already mounted. + +## `Mount` Struct + +```rust +#[derive(Debug, Clone)] +pub struct Mount(Arc>, Arc>>); +``` + +A specialized hook for managing component lifecycle (specifically, the "mounted" state). It tracks whether a component has been mounted and queues `HookEffect`s to be run upon mounting. + +#### Methods: + +* **`fn mount(&self)`** + * Sets the internal flag to `true`, indicating the component is now mounted. + * Executes all currently queued `HookEffect`s and clears the queue. + * Any `HookEffect` registered after `mount()` has been called will execute immediately. + +## Hooks Functions + +These functions are the primary way to interact with the state management system within your components. + +### `fn use_state(v: T) -> State` + +* **Purpose**: Creates and initializes a new `State` instance. +* **Usage**: `let count = use_state(0);` + +### `fn use_effect(f: F, dependencies: &[&dyn HookDependency])` + +* **Purpose**: Registers a side effect `f` that will run when any of the `dependencies` change, and also once initially. The effect closure is run in a `std::thread::spawn`. +* **Usage**: + ```rust + let counter = use_state(0); + use_effect( + { let counter = counter.clone(); move || println!("Counter changed: {}", counter.get_dl()) }, + &[&counter] // Dependencies + ); + ``` +* **Empty Dependencies**: If `dependencies` is `&[]`, the effect runs once on initial render and never again. + +### `fn use_mount() -> Mount` + +* **Purpose**: Creates a `Mount` instance that is immediately marked as "mounted". Effects registered with this `Mount` (via `use_effect`) will run once, immediately. +* **Usage**: `let mount_hook = use_mount();` + +### `fn use_mount_manual() -> Mount` + +* **Purpose**: Creates a `Mount` instance that starts in an "unmounted" state. Effects registered with this `Mount` will *only* run when its `.mount()` method is explicitly called (either programmatically or via `!mount_hook_instance` in `rsx!`). +* **Usage**: `let manual_mount_hook = use_mount_manual();` + +### `fn use_sync_state(cx: &Arc, v: T, decoder: D) -> State` + +* **Purpose**: Creates a `State` that automatically updates its value whenever an event of type `E` is emitted to the given `Context`. The `decoder` function converts `&E` into a new `T`. +* **Usage**: + ```rust + // Assume MessageChangeEvent is defined + let message_state = use_sync_state( + cx, + "Default message".to_string(), + |event: &MessageChangeEvent| event.0.clone() + ); + ``` + +### `fn use_sync_effect(cx: &Arc, state: &State, encoder: E, deps: &[&dyn HookDependency])` + +* **Purpose**: Registers an effect that emits an event `Ev` to the given `Context` whenever the monitored `state` changes (or any other specified `deps`). The `encoder` function converts `&State` into an `Ev`. +* **Usage**: + ```rust + let count_state = use_state(0); + // Assume CounterUpdatedEvent is defined + use_sync_effect( + cx, + &count_state, + |s: &State| CounterUpdatedEvent { new_value: s.get_dl() }, + &[&count_state] + ); + ``` + +These hooks provide a complete and reactive state management solution, enabling dynamic and interactive TUI applications in OSUI. + +**Next:** Delve into the details of the [Macros API](./macros-api.md). diff --git a/versioned_sidebars/version-0.2.0-sidebars.json b/versioned_sidebars/version-0.2.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/versioned_sidebars/version-0.2.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/versions.json b/versions.json index 87471a4..220c048 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ [ + "0.2.0", "0.1.1", "0.1.0", "0.0.9", From 6fe25f0320c2720ea779a916d6e1fbb1a74cdfb7 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 20:56:23 +0100 Subject: [PATCH 2/5] Updated docusaurus --- docusaurus.config.ts | 1 - package-lock.json | 6647 ++++++++++++++++++++++++------------------ package.json | 6 +- 3 files changed, 3809 insertions(+), 2845 deletions(-) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index db91b66..29fdc20 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -13,7 +13,6 @@ const config: Config = { organizationName: "osui-rs", projectName: "osui", onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", i18n: { defaultLocale: "en", locales: ["en"], diff --git a/package-lock.json b/package-lock.json index d84f795..8e09ed0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/preset-classic": "3.6.3", + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "docusaurus-lunr-search": "^3.5.0", @@ -18,7 +18,7 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/module-type-aliases": "^3.9.2", "@docusaurus/tsconfig": "3.6.3", "@docusaurus/types": "3.6.3", "typescript": "~5.6.2" @@ -27,225 +27,115 @@ "node": ">=18.0" } }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "node_modules/@algolia/abtesting": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.13.0.tgz", + "integrity": "sha512-Zrqam12iorp3FjiKMXSTpedGYznZ3hTEOAr2oCxI8tbF8bS1kQHClyDYNq/eV0ewMNLyFkgZVWjaS+8spsOYiQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "license": "MIT" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.15.0.tgz", - "integrity": "sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "node_modules/@algolia/client-abtesting": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.47.0.tgz", + "integrity": "sha512-aOpsdlgS9xTEvz47+nXmw8m0NtUiQbvGWNuSEb7fA46iPL5FxOmOUZkh8PREBJpZ0/H8fclSc7BMJCVr+Dn72w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.47.0.tgz", + "integrity": "sha512-EcF4w7IvIk1sowrO7Pdy4Ako7x/S8+nuCgdk6En+u5jsaNQM4rTT09zjBPA+WQphXkA2mLrsMwge96rf6i7Mow==", "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.15.0.tgz", - "integrity": "sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.47.0.tgz", + "integrity": "sha512-Wzg5Me2FqgRDj0lFuPWFK05UOWccSMsIBL2YqmTmaOzxVlLZ+oUqvKbsUSOE5ud8Fo1JU7JyiLmEXBtgDKzTwg==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.15.0.tgz", - "integrity": "sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.47.0.tgz", + "integrity": "sha512-Ci+cn/FDIsDxSKMRBEiyKrqybblbk8xugo6ujDN1GSTv9RIZxwxqZYuHfdLnLEwLlX7GB8pqVyqrUSlRnR+sJA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.47.0.tgz", + "integrity": "sha512-gsLnHPZmWcX0T3IigkDL2imCNtsQ7dR5xfnwiFsb+uTHCuYQt+IwSNjsd8tok6HLGLzZrliSaXtB5mfGBtYZvQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.15.0.tgz", - "integrity": "sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.47.0.tgz", + "integrity": "sha512-PDOw0s8WSlR2fWFjPQldEpmm/gAoUgLigvC3k/jCSi/DzigdGX6RdC0Gh1RR1P8Cbk5KOWYDuL3TNzdYwkfDyA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.15.0.tgz", - "integrity": "sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.47.0.tgz", + "integrity": "sha512-b5hlU69CuhnS2Rqgsz7uSW0t4VqrLMLTPbUpEl0QVz56rsSwr1Sugyogrjb493sWDA+XU1FU5m9eB8uH7MoI0g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" @@ -258,213 +148,125 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.15.0.tgz", - "integrity": "sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.47.0.tgz", + "integrity": "sha512-WvwwXp5+LqIGISK3zHRApLT1xkuEk320/EGeD7uYy+K8WwDd5OjXnhjuXRhYr1685KnkvWkq1rQ/ihCJjOfHpQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "license": "MIT" - }, - "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "license": "MIT", - "dependencies": { - "@algolia/logger-common": "4.24.0" - } - }, "node_modules/@algolia/monitoring": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.15.0.tgz", - "integrity": "sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.47.0.tgz", + "integrity": "sha512-j2EUFKAlzM0TE4GRfkDE3IDfkVeJdcbBANWzK16Tb3RHz87WuDfQ9oeEW6XiRE1/bEkq2xf4MvZesvSeQrZRDA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.47.0.tgz", + "integrity": "sha512-+kTSE4aQ1ARj2feXyN+DMq0CIDHJwZw1kpxIunedkmpWUg8k3TzFwWsMCzJVkF2nu1UcFbl7xsIURz3Q3XwOXA==", "license": "MIT", "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.15.0.tgz", - "integrity": "sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.15.0" + "@algolia/client-common": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "license": "MIT" - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.15.0.tgz", - "integrity": "sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.47.0.tgz", + "integrity": "sha512-Ja+zPoeSA2SDowPwCNRbm5Q2mzDvVV8oqxCQ4m6SNmbKmPlCfe30zPfrt9ho3kBHnsg37pGucwOedRIOIklCHw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0" + "@algolia/client-common": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.47.0.tgz", + "integrity": "sha512-N6nOvLbaR4Ge+oVm7T4W/ea1PqcSbsHR4O58FJ31XtZjFPtOyxmnhgCmGCzP9hsJI6+x0yxJjkW5BMK/XI8OvA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.15.0.tgz", - "integrity": "sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.47.0.tgz", + "integrity": "sha512-z1oyLq5/UVkohVXNDEY70mJbT/sv/t6HYtCvCwNrOri6pxBJDomP9R83KOlwcat+xqBQEdJHjbrPh36f1avmZA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.15.0" + "@algolia/client-common": "5.47.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -489,15 +291,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -505,38 +307,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -555,17 +344,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -585,13 +374,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -611,56 +400,65 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -670,35 +468,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -708,14 +506,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -724,93 +522,80 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -820,13 +605,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -836,12 +621,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -851,12 +636,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -866,14 +651,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -883,13 +668,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -923,12 +708,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -938,12 +723,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -953,12 +738,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -968,12 +753,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -999,12 +784,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1014,14 +799,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1031,14 +816,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1048,12 +833,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1063,12 +848,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1078,13 +863,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1094,13 +879,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1110,17 +895,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1130,13 +915,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1146,12 +931,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1161,13 +947,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1177,12 +963,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1192,13 +978,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1208,12 +994,28 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1223,13 +1025,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1239,12 +1040,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1254,13 +1055,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1270,14 +1071,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1287,12 +1088,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1302,12 +1103,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1317,12 +1118,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1332,12 +1133,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1347,13 +1148,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1363,14 +1164,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1380,15 +1180,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1398,13 +1198,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1414,13 +1214,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1430,12 +1230,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1445,12 +1245,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1460,12 +1260,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1475,14 +1275,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1492,13 +1294,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1508,12 +1310,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1523,13 +1325,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1539,12 +1341,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1356,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1570,14 +1372,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1587,12 +1389,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1602,12 +1404,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", - "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1617,12 +1419,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1632,16 +1434,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1651,12 +1453,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1666,13 +1468,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1682,13 +1484,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1698,13 +1499,13 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1714,12 +1515,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1729,16 +1530,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1758,12 +1559,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1773,13 +1574,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1789,12 +1590,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1804,12 +1605,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1819,12 +1620,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1834,16 +1635,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", - "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1853,12 +1654,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1868,13 +1669,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1884,13 +1685,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1900,13 +1701,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1916,79 +1717,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", "semver": "^6.3.1" }, "engines": { @@ -1998,6 +1800,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", + "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2022,17 +1837,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", - "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2042,16 +1857,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2073,58 +1888,57 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", - "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" + "core-js-pure": "^3.48.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2141,9 +1955,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", - "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "funding": [ { "type": "github", @@ -2159,14 +1973,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -2183,9 +1997,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", - "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -2201,14 +2015,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", - "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -2221,21 +2035,21 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -2251,13 +2065,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -2274,9 +2088,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "funding": [ { "type": "github", @@ -2292,14 +2106,43 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", - "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -2345,9 +2188,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2358,9 +2201,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", - "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", "funding": [ { "type": "github", @@ -2373,10 +2216,39 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2387,9 +2259,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", - "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", "funding": [ { "type": "github", @@ -2402,10 +2274,39 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2416,9 +2317,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", - "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", "funding": [ { "type": "github", @@ -2431,9 +2332,38 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2444,9 +2374,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", - "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "funding": [ { "type": "github", @@ -2459,9 +2389,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2497,9 +2427,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", - "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", "funding": [ { "type": "github", @@ -2512,9 +2442,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2524,9 +2454,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", - "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", "funding": [ { "type": "github", @@ -2539,10 +2469,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2553,9 +2483,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", - "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", "funding": [ { "type": "github", @@ -2568,10 +2498,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2582,9 +2512,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", - "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", "funding": [ { "type": "github", @@ -2597,7 +2527,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2609,9 +2539,9 @@ } }, "node_modules/@csstools/postcss-initial": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", - "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", "funding": [ { "type": "github", @@ -2631,9 +2561,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", - "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "funding": [ { "type": "github", @@ -2679,9 +2609,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2692,9 +2622,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", - "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", "funding": [ { "type": "github", @@ -2707,9 +2637,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2811,9 +2741,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", - "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", "funding": [ { "type": "github", @@ -2826,7 +2756,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2837,9 +2767,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", - "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", "funding": [ { "type": "github", @@ -2852,10 +2782,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -2865,9 +2795,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", - "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", "funding": [ { "type": "github", @@ -2880,9 +2810,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -2918,9 +2848,9 @@ } }, "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", "funding": [ { "type": "github", @@ -2943,9 +2873,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", - "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", "funding": [ { "type": "github", @@ -2958,10 +2888,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2971,10 +2901,32 @@ "postcss": "^8.4" } }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", - "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -2996,10 +2948,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-random-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", - "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", "funding": [ { "type": "github", @@ -3012,9 +2964,35 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -3024,9 +3002,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", - "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", "funding": [ { "type": "github", @@ -3039,10 +3017,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3078,9 +3056,9 @@ } }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3091,9 +3069,9 @@ } }, "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", - "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", "funding": [ { "type": "github", @@ -3106,9 +3084,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -3118,9 +3096,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", - "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", "funding": [ { "type": "github", @@ -3133,9 +3111,60 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -3145,9 +3174,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", - "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", "funding": [ { "type": "github", @@ -3160,7 +3189,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^5.0.1", + "@csstools/color-helpers": "^5.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -3171,9 +3200,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", - "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", "funding": [ { "type": "github", @@ -3186,9 +3215,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.0", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -3250,27 +3279,47 @@ "node": ">=10.0.0" } }, + "node_modules/@docsearch/core": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.5.3.tgz", + "integrity": "sha512-x/P5+HVzv9ALtbuJIfpkF8Eyc5RE8YCsFcOgLrrtWa9Ui+53ggZA5seIAanCRORbS4+m982lu7rZmebSiuMIcw==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/@docsearch/css": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", - "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.5.3.tgz", + "integrity": "sha512-kUpHaxn0AgI3LQfyzTYkNUuaFY4uEz/Ym9/N/FvyDE+PzSgZsCyDH9jE49B6N6f1eLCm9Yp64J9wENd6vypdxA==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", - "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.5.3.tgz", + "integrity": "sha512-Hm3Lg/FD9HXV57WshhWOHOprbcObF5ptLzcjA5zdgJDzYOMwEN+AvY8heQ5YMTWyC6kW2d+Qk25AVlHnDWMSvA==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.0", - "algoliasearch": "^5.12.0" + "@docsearch/core": "4.5.3", + "@docsearch/css": "4.5.3" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { @@ -3288,79 +3337,10 @@ } } }, - "node_modules/@docsearch/react/node_modules/@algolia/client-analytics": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.15.0.tgz", - "integrity": "sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/client-personalization": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.15.0.tgz", - "integrity": "sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/recommend": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.15.0.tgz", - "integrity": "sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/algoliasearch": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.15.0.tgz", - "integrity": "sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==", - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.15.0", - "@algolia/client-analytics": "5.15.0", - "@algolia/client-common": "5.15.0", - "@algolia/client-insights": "5.15.0", - "@algolia/client-personalization": "5.15.0", - "@algolia/client-query-suggestions": "5.15.0", - "@algolia/client-search": "5.15.0", - "@algolia/ingestion": "1.15.0", - "@algolia/monitoring": "1.15.0", - "@algolia/recommend": "5.15.0", - "@algolia/requester-browser-xhr": "5.15.0", - "@algolia/requester-fetch": "5.15.0", - "@algolia/requester-node-http": "5.15.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@docusaurus/babel": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", - "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", + "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3373,42 +3353,41 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/bundler": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", - "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", + "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.6.3", - "@docusaurus/cssnano-preset": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", "babel-loader": "^9.2.1", - "clean-css": "^5.3.2", + "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", + "css-loader": "^6.11.0", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", "file-loader": "^6.2.0", "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.1", + "mini-css-extract-plugin": "^2.9.2", "null-loader": "^4.0.1", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "postcss-preset-env": "^10.1.0", - "react-dev-utils": "^12.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "url-loader": "^4.1.1", @@ -3416,7 +3395,7 @@ "webpackbar": "^6.0.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/faster": "*" @@ -3427,19 +3406,55 @@ } } }, - "node_modules/@docusaurus/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", - "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", "license": "MIT", "dependencies": { - "@docusaurus/babel": "3.6.3", - "@docusaurus/bundler": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/bundler/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", + "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3447,92 +3462,91 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "core-js": "^3.31.1", - "del": "^6.1.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", + "execa": "5.1.1", "fs-extra": "^11.1.1", "html-tags": "^3.3.1", "html-webpack-plugin": "^5.6.0", "leven": "^3.1.0", "lodash": "^4.17.21", + "open": "^8.4.0", "p-map": "^4.0.0", "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", "semver": "^7.5.4", "serve-handler": "^6.1.6", - "shelljs": "^0.8.5", + "tinypool": "^1.0.2", "tslib": "^2.6.0", "update-notifier": "^6.0.2", "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^4.15.2", + "webpack-dev-server": "^5.2.2", "webpack-merge": "^6.0.1" }, "bin": { "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@mdx-js/react": "^3.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", - "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", + "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", + "postcss": "^8.5.4", "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/logger": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", - "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", + "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", - "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", + "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", "estree-util-value-to-estree": "^3.0.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "image-size": "^1.0.2", + "image-size": "^2.0.2", "mdast-util-mdx": "^3.0.0", "mdast-util-to-string": "^4.0.0", "rehype-raw": "^7.0.0", @@ -3549,25 +3563,25 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", - "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { @@ -3575,25 +3589,61 @@ "react-dom": "*" } }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", - "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", + "node_modules/@docusaurus/module-type-aliases/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", + "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", - "reading-time": "^1.5.0", + "schema-dts": "^1.1.2", "srcset": "^4.0.0", "tslib": "^2.6.0", "unist-util-visit": "^5.0.0", @@ -3601,226 +3651,663 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", - "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", + "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", + "schema-dts": "^1.1.2", "tslib": "^2.6.0", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", - "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", + "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", + "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", - "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", + "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", + "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", - "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", + "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", - "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", + "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", - "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", + "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", - "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", + "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", + "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", - "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", + "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/plugin-debug": "3.6.3", - "@docusaurus/plugin-google-analytics": "3.6.3", - "@docusaurus/plugin-google-gtag": "3.6.3", - "@docusaurus/plugin-google-tag-manager": "3.6.3", - "@docusaurus/plugin-sitemap": "3.6.3", - "@docusaurus/theme-classic": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-search-algolia": "3.6.3", - "@docusaurus/types": "3.6.3" + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", - "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", + "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", - "postcss": "^8.4.26", + "postcss": "^8.5.4", "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", @@ -3829,23 +4316,59 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/theme-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", - "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", + "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3856,30 +4379,30 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", - "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", + "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", "license": "MIT", "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -3888,24 +4411,24 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", - "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", + "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/tsconfig": { @@ -3919,6 +4442,7 @@ "version": "3.6.3", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", + "dev": true, "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3940,6 +4464,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -3951,16 +4476,16 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", - "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", + "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@svgr/webpack": "^8.1.0", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", @@ -3970,40 +4495,76 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "p-queue": "^6.6.2", "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", "tslib": "^2.6.0", "url-loader": "^4.1.1", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/utils-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", - "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", + "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.9.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/utils-common/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", - "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", + "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4011,7 +4572,43 @@ "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/utils/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/@hapi/hoek": { @@ -4059,17 +4656,23 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4081,15 +4684,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", @@ -4107,15 +4701,424 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.65.0.tgz", + "integrity": "sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.10.tgz", + "integrity": "sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.10", + "@jsonjoy.com/fs-node-utils": "4.56.10", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.10.tgz", + "integrity": "sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.10", + "@jsonjoy.com/fs-node-builtins": "4.56.10", + "@jsonjoy.com/fs-node-utils": "4.56.10", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.10.tgz", + "integrity": "sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.10", + "@jsonjoy.com/fs-node-builtins": "4.56.10", + "@jsonjoy.com/fs-node-utils": "4.56.10", + "@jsonjoy.com/fs-print": "4.56.10", + "@jsonjoy.com/fs-snapshot": "4.56.10", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.10.tgz", + "integrity": "sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.10.tgz", + "integrity": "sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.56.10", + "@jsonjoy.com/fs-node-builtins": "4.56.10", + "@jsonjoy.com/fs-node-utils": "4.56.10" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.10.tgz", + "integrity": "sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.10" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.10.tgz", + "integrity": "sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.56.10", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.10.tgz", + "integrity": "sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.56.10", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.65.0.tgz", + "integrity": "sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.65.0.tgz", + "integrity": "sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.65.0.tgz", + "integrity": "sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.65.0", + "@jsonjoy.com/buffers": "17.65.0", + "@jsonjoy.com/codegen": "17.65.0", + "@jsonjoy.com/json-pointer": "17.65.0", + "@jsonjoy.com/util": "17.65.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.65.0.tgz", + "integrity": "sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.65.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.65.0.tgz", + "integrity": "sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.65.0", + "@jsonjoy.com/codegen": "17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -4175,6 +5178,18 @@ "react": ">=16" } }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4210,6 +5225,154 @@ "node": ">= 8" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", + "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", + "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", + "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", + "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", + "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", + "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pfx": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", + "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", + "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", + "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -4595,9 +5758,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -4677,33 +5840,21 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -4746,15 +5897,15 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -4826,21 +5977,6 @@ "undici-types": "~6.20.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, "node_modules/@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", @@ -4860,9 +5996,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -4914,9 +6050,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "license": "MIT" }, "node_modules/@types/sax": { @@ -4929,12 +6065,11 @@ } }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -4948,14 +6083,24 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, "node_modules/@types/sockjs": { @@ -4974,18 +6119,18 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -5311,32 +6456,34 @@ } }, "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.47.0.tgz", + "integrity": "sha512-AGtz2U7zOV4DlsuYV84tLp2tBbA7RPtLA44jbVH4TTpDcc1dIWmULjHSsunlhscbzDydnjuFlNhflR3nV4VJaQ==", "license": "MIT", "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/abtesting": "1.13.0", + "@algolia/client-abtesting": "5.47.0", + "@algolia/client-analytics": "5.47.0", + "@algolia/client-common": "5.47.0", + "@algolia/client-insights": "5.47.0", + "@algolia/client-personalization": "5.47.0", + "@algolia/client-query-suggestions": "5.47.0", + "@algolia/client-search": "5.47.0", + "@algolia/ingestion": "1.47.0", + "@algolia/monitoring": "1.47.0", + "@algolia/recommend": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", - "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.27.0.tgz", + "integrity": "sha512-eNYchRerbsvk2doHOMfdS1/B6Tm70oGtu8mzQlrNzbCeQ8p1MjCW8t/BL6iZ5PD+cL5NNMgTMyMnmiXZ1sgmNw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -5345,45 +6492,6 @@ "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -5522,6 +6630,20 @@ "node": ">=8" } }, + "node_modules/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", @@ -5531,15 +6653,6 @@ "astring": "bin/astring" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/autocomplete.js": { "version": "0.37.1", "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.1.tgz", @@ -5550,9 +6663,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "funding": [ { "type": "opencollective", @@ -5569,11 +6682,10 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5613,13 +6725,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", "semver": "^6.3.1" }, "peerDependencies": { @@ -5636,25 +6748,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.6" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5676,6 +6788,15 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5714,23 +6835,23 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -5822,9 +6943,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -5841,10 +6962,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -5859,6 +6981,21 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5868,6 +7005,15 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -5896,16 +7042,44 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -5958,9 +7132,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001684", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", - "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "funding": [ { "type": "opencollective", @@ -6334,25 +7508,25 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -6429,9 +7603,9 @@ } }, "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" @@ -6468,32 +7642,20 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -6573,12 +7735,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -6586,9 +7748,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -6695,9 +7857,9 @@ } }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -6708,9 +7870,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", + "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -6720,9 +7882,9 @@ } }, "node_modules/css-has-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", - "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", "funding": [ { "type": "github", @@ -6769,9 +7931,9 @@ } }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -6883,9 +8045,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -6930,9 +8092,9 @@ } }, "node_modules/cssdb": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.1.tgz", - "integrity": "sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.7.1.tgz", + "integrity": "sha512-+F6LKx48RrdGOtE4DT5jz7Uo+VeyKXpK797FAevIkzjV8bMHz6xTO5F7gNDcRCHmPgD5jj2g6QCsY9zmVrh38A==", "funding": [ { "type": "opencollective", @@ -7100,9 +8262,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -7174,16 +8336,32 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", + "node_modules/default-browser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { @@ -7238,28 +8416,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7311,38 +8467,6 @@ "node": ">= 4.0.0" } }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -7589,9 +8713,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -7636,6 +8760,20 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -7655,9 +8793,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.66", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz", - "integrity": "sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==", + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7726,22 +8864,19 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -7761,6 +8896,18 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -7957,9 +9104,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz", - "integrity": "sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -8072,45 +9219,49 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/content-disposition": { @@ -8141,9 +9292,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { @@ -8180,16 +9331,16 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -8202,15 +9353,25 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -8346,15 +9507,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -8368,17 +9520,17 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -8442,9 +9594,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -8461,134 +9613,6 @@ } } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -8616,15 +9640,15 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -8651,18 +9675,6 @@ "node": ">=14.14" } }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -8737,16 +9749,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8761,6 +9778,19 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "license": "ISC" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -8779,27 +9809,6 @@ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "license": "ISC" }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -8812,6 +9821,22 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -8842,53 +9867,6 @@ "node": ">=10" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8910,12 +9888,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8989,9 +9967,9 @@ } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -9043,22 +10021,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9098,16 +10064,16 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", - "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -9117,6 +10083,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-has-property": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", @@ -9370,15 +10346,15 @@ } }, "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" @@ -9388,6 +10364,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-string": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", @@ -9427,15 +10413,15 @@ } }, "node_modules/hastscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", - "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -9443,6 +10429,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hastscript/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -9535,22 +10531,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -9703,25 +10683,29 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { @@ -9739,9 +10723,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -9796,6 +10780,15 @@ "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9830,13 +10823,10 @@ } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, "bin": { "image-size": "bin/image-size.js" }, @@ -9850,20 +10840,10 @@ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", "license": "MIT" }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -9912,17 +10892,6 @@ "node": ">=12" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -9941,15 +10910,6 @@ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -9960,9 +10920,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "license": "MIT", "engines": { "node": ">= 10" @@ -10046,9 +11006,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -10134,6 +11094,39 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -10150,6 +11143,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-npm": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", @@ -10180,15 +11185,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -10231,15 +11227,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -10348,9 +11335,9 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -10376,9 +11363,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -10388,9 +11375,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -10484,13 +11471,13 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, "node_modules/leven": { @@ -10503,9 +11490,9 @@ } }, "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", "engines": { "node": ">=14" @@ -10674,14 +11661,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", + "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -10695,9 +11692,9 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -10793,9 +11790,9 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -10865,9 +11862,9 @@ "license": "MIT" }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -11091,15 +12088,32 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", + "version": "4.56.10", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.10.tgz", + "integrity": "sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==", + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/fs-core": "4.56.10", + "@jsonjoy.com/fs-fsa": "4.56.10", + "@jsonjoy.com/fs-node": "4.56.10", + "@jsonjoy.com/fs-node-builtins": "4.56.10", + "@jsonjoy.com/fs-node-to-fsa": "4.56.10", + "@jsonjoy.com/fs-node-utils": "4.56.10", + "@jsonjoy.com/fs-print": "4.56.10", + "@jsonjoy.com/fs-snapshot": "4.56.10", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/merge-descriptors": { @@ -11570,9 +12584,9 @@ "license": "MIT" }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -12989,9 +14003,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", + "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -13074,9 +14088,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -13117,9 +14131,9 @@ } }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", @@ -13131,19 +14145,10 @@ "node": ">=18" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/nopt": { @@ -13170,15 +14175,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", @@ -13305,9 +14301,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13326,14 +14322,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -13362,23 +14360,14 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -13429,6 +14418,15 @@ "node": ">=12.20" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", @@ -13474,26 +14472,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, "engines": { - "node": ">=6" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/package-json": { @@ -13587,12 +14608,12 @@ "license": "ISC" }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -13611,6 +14632,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13639,15 +14672,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", @@ -13720,83 +14744,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "license": "BSD-3-Clause", "dependencies": { - "find-up": "^3.0.0" + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -13813,7 +14781,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -13847,9 +14815,9 @@ } }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13891,9 +14859,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", - "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", "funding": [ { "type": "github", @@ -13906,10 +14874,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -14006,9 +14974,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", - "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", "funding": [ { "type": "github", @@ -14021,10 +14989,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -14034,9 +15002,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", - "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "funding": [ { "type": "github", @@ -14049,9 +15017,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -14063,9 +15031,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", - "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "funding": [ { "type": "github", @@ -14078,9 +15046,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "postcss-selector-parser": "^7.0.0" }, "engines": { @@ -14091,9 +15059,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14129,9 +15097,9 @@ } }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14205,9 +15173,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", - "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", "funding": [ { "type": "github", @@ -14220,7 +15188,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -14257,9 +15225,9 @@ } }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14295,9 +15263,9 @@ } }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14365,9 +15333,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", - "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", "funding": [ { "type": "github", @@ -14380,10 +15348,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.6", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -14416,9 +15384,9 @@ } }, "node_modules/postcss-logical": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", - "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "funding": [ { "type": "github", @@ -14567,9 +15535,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -14584,9 +15552,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14612,9 +15580,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14640,9 +15608,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "funding": [ { "type": "github", @@ -14655,7 +15623,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -14667,9 +15635,9 @@ } }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "funding": [ { "type": "github", @@ -14711,9 +15679,9 @@ } }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14954,9 +15922,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", - "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", "funding": [ { "type": "github", @@ -14969,62 +15937,70 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.6", - "@csstools/postcss-color-mix-function": "^3.0.6", - "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.6", - "@csstools/postcss-gradients-interpolation-method": "^5.0.6", - "@csstools/postcss-hwb-function": "^4.0.6", - "@csstools/postcss-ic-unit": "^4.0.0", - "@csstools/postcss-initial": "^2.0.0", - "@csstools/postcss-is-pseudo-class": "^5.0.1", - "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.5", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.6", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.0", - "@csstools/postcss-stepped-value-functions": "^4.0.5", - "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.1", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.2.1", + "cssdb": "^8.6.0", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.6", + "postcss-color-functional-notation": "^7.0.12", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.5", - "postcss-custom-properties": "^14.0.4", - "postcss-custom-selectors": "^8.0.4", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.0", + "postcss-double-position-gradients": "^6.0.4", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.6", - "postcss-logical": "^8.0.0", - "postcss-nesting": "^13.0.1", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -15066,9 +16042,9 @@ } }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15159,9 +16135,9 @@ } }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15281,9 +16257,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" @@ -15381,13 +16357,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -15396,15 +16390,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -15456,15 +16441,15 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -15515,132 +16500,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -15654,12 +16513,6 @@ "react": "^18.3.1" } }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "license": "MIT" - }, "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", @@ -15690,15 +16543,15 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", - "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", "license": "MIT", "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0 || ^19.0.0" } }, "node_modules/react-loadable": { @@ -15807,23 +16660,6 @@ "node": ">=8.10.0" } }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/recma-build-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", @@ -15888,17 +16724,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", @@ -15907,9 +16737,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -15924,27 +16754,18 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -15984,12 +16805,12 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" @@ -16211,9 +17032,9 @@ } }, "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -16259,9 +17080,9 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -16471,18 +17292,21 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16533,37 +17357,15 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", - "license": "BSD-3-Clause" - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -16582,6 +17384,18 @@ "node": ">=12.0.0" } }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -16632,10 +17446,13 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scheduler": { "version": "0.23.2", @@ -16646,10 +17463,16 @@ "loose-envify": "^1.1.0" } }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -16658,20 +17481,13 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -16692,16 +17508,16 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { @@ -16732,24 +17548,24 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -16770,15 +17586,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16819,21 +17626,25 @@ "license": "MIT" }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { @@ -16855,25 +17666,41 @@ } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", @@ -16881,12 +17708,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -16897,15 +17718,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -16974,9 +17795,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -16985,33 +17806,70 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -17218,18 +18076,18 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "license": "MIT" }, "node_modules/string_decoder": { @@ -17589,11 +18447,21 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } }, "node_modules/thunky": { "version": "1.1.0", @@ -17613,6 +18481,15 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17706,6 +18583,22 @@ "node": ">=6" } }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -17732,6 +18625,24 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -17791,6 +18702,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -17838,18 +18750,18 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "license": "MIT", "engines": { "node": ">=4" @@ -18012,9 +18924,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -18032,7 +18944,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -18431,47 +19343,57 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { @@ -18484,54 +19406,52 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "license": "MIT", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.22.1", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -18542,10 +19462,40 @@ } } }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -18872,12 +19822,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -18911,6 +19855,36 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", @@ -18950,19 +19924,10 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" diff --git a/package.json b/package.json index 20c19cf..1709512 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/preset-classic": "3.6.3", + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "docusaurus-lunr-search": "^3.5.0", @@ -25,7 +25,7 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/module-type-aliases": "^3.9.2", "@docusaurus/tsconfig": "3.6.3", "@docusaurus/types": "3.6.3", "typescript": "~5.6.2" From 37d2de41ce55be834ecdfa16ccb830863d7d1d2b Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 21:01:30 +0100 Subject: [PATCH 3/5] Improved docs --- docs/{intro => 00-intro}/00-introduction.md | 2 +- docs/{intro => 00-intro}/01-installation.md | 1 - docs/{intro => 00-intro}/02-getting-started.md | 1 - docs/{intro => 00-intro}/03-example-basic-component.md | 1 - .../guides => docs/01-guides}/00-creating-components.md | 1 - docs/{guides => 01-guides}/01-rsx-syntax.md | 1 - docs/{guides => 01-guides}/02-state-management.md | 1 - .../guides => docs/01-guides}/03-event-handling.md | 1 - .../guides => docs/01-guides}/04-lifecycle-hooks.md | 1 - docs/{guides => 01-guides}/05-data-flow-and-sync.md | 1 - docs/{guides => 01-guides}/06-building-complex-layouts.md | 1 - .../reference => docs/02-reference}/00-crate-structure.md | 1 - docs/{reference => 02-reference}/component-api.md | 1 - docs/{reference => 02-reference}/engine-api.md | 1 - .../reference => docs/02-reference}/frontend-api.md | 1 - docs/{reference => 02-reference}/macros-api.md | 1 - docs/{reference => 02-reference}/render-api.md | 1 - .../version-0.2.0/reference => docs/02-reference}/state-api.md | 1 - docs/{concepts => 03-concepts}/00-architecture.md | 1 - .../concepts => docs/03-concepts}/01-the-component-model.md | 1 - .../concepts => docs/03-concepts}/02-reactive-state-flow.md | 1 - docs/{concepts => 03-concepts}/03-event-propagation.md | 1 - .../concepts => docs/03-concepts}/04-rendering-pipeline.md | 1 - docs/{advanced => 04-advanced}/00-performance-benchmarking.md | 1 - .../advanced => docs/04-advanced}/01-customizing-the-engine.md | 1 - .../advanced => docs/04-advanced}/02-internals-macros.md | 1 - .../advanced => docs/04-advanced}/03-contributing.md | 1 - .../version-0.2.0/{intro => 00-intro}/00-introduction.md | 2 +- .../version-0.2.0/{intro => 00-intro}/01-installation.md | 1 - .../version-0.2.0/{intro => 00-intro}/02-getting-started.md | 1 - .../{intro => 00-intro}/03-example-basic-component.md | 1 - .../version-0.2.0/01-guides}/00-creating-components.md | 1 - .../version-0.2.0/{guides => 01-guides}/01-rsx-syntax.md | 1 - .../version-0.2.0/{guides => 01-guides}/02-state-management.md | 1 - .../version-0.2.0/01-guides}/03-event-handling.md | 1 - .../version-0.2.0/01-guides}/04-lifecycle-hooks.md | 1 - .../{guides => 01-guides}/05-data-flow-and-sync.md | 1 - .../{guides => 01-guides}/06-building-complex-layouts.md | 1 - .../version-0.2.0/02-reference}/00-crate-structure.md | 1 - .../version-0.2.0/{reference => 02-reference}/component-api.md | 1 - .../version-0.2.0/{reference => 02-reference}/engine-api.md | 1 - .../version-0.2.0/02-reference}/frontend-api.md | 1 - .../version-0.2.0/{reference => 02-reference}/macros-api.md | 1 - .../version-0.2.0/{reference => 02-reference}/render-api.md | 1 - .../version-0.2.0/02-reference}/state-api.md | 1 - .../version-0.2.0/{concepts => 03-concepts}/00-architecture.md | 1 - .../version-0.2.0/03-concepts}/01-the-component-model.md | 1 - .../version-0.2.0/03-concepts}/02-reactive-state-flow.md | 1 - .../{concepts => 03-concepts}/03-event-propagation.md | 1 - .../version-0.2.0/03-concepts}/04-rendering-pipeline.md | 1 - .../{advanced => 04-advanced}/00-performance-benchmarking.md | 1 - .../version-0.2.0/04-advanced}/01-customizing-the-engine.md | 1 - .../version-0.2.0/04-advanced}/02-internals-macros.md | 1 - .../version-0.2.0/04-advanced}/03-contributing.md | 1 - 54 files changed, 2 insertions(+), 54 deletions(-) rename docs/{intro => 00-intro}/00-introduction.md (99%) rename docs/{intro => 00-intro}/01-installation.md (99%) rename docs/{intro => 00-intro}/02-getting-started.md (99%) rename docs/{intro => 00-intro}/03-example-basic-component.md (99%) rename {versioned_docs/version-0.2.0/guides => docs/01-guides}/00-creating-components.md (99%) rename docs/{guides => 01-guides}/01-rsx-syntax.md (99%) rename docs/{guides => 01-guides}/02-state-management.md (99%) rename {versioned_docs/version-0.2.0/guides => docs/01-guides}/03-event-handling.md (99%) rename {versioned_docs/version-0.2.0/guides => docs/01-guides}/04-lifecycle-hooks.md (99%) rename docs/{guides => 01-guides}/05-data-flow-and-sync.md (99%) rename docs/{guides => 01-guides}/06-building-complex-layouts.md (99%) rename {versioned_docs/version-0.2.0/reference => docs/02-reference}/00-crate-structure.md (99%) rename docs/{reference => 02-reference}/component-api.md (99%) rename docs/{reference => 02-reference}/engine-api.md (99%) rename {versioned_docs/version-0.2.0/reference => docs/02-reference}/frontend-api.md (99%) rename docs/{reference => 02-reference}/macros-api.md (99%) rename docs/{reference => 02-reference}/render-api.md (99%) rename {versioned_docs/version-0.2.0/reference => docs/02-reference}/state-api.md (99%) rename docs/{concepts => 03-concepts}/00-architecture.md (99%) rename {versioned_docs/version-0.2.0/concepts => docs/03-concepts}/01-the-component-model.md (99%) rename {versioned_docs/version-0.2.0/concepts => docs/03-concepts}/02-reactive-state-flow.md (99%) rename docs/{concepts => 03-concepts}/03-event-propagation.md (99%) rename {versioned_docs/version-0.2.0/concepts => docs/03-concepts}/04-rendering-pipeline.md (99%) rename docs/{advanced => 04-advanced}/00-performance-benchmarking.md (99%) rename {versioned_docs/version-0.2.0/advanced => docs/04-advanced}/01-customizing-the-engine.md (99%) rename {versioned_docs/version-0.2.0/advanced => docs/04-advanced}/02-internals-macros.md (99%) rename {versioned_docs/version-0.2.0/advanced => docs/04-advanced}/03-contributing.md (99%) rename versioned_docs/version-0.2.0/{intro => 00-intro}/00-introduction.md (99%) rename versioned_docs/version-0.2.0/{intro => 00-intro}/01-installation.md (99%) rename versioned_docs/version-0.2.0/{intro => 00-intro}/02-getting-started.md (99%) rename versioned_docs/version-0.2.0/{intro => 00-intro}/03-example-basic-component.md (99%) rename {docs/guides => versioned_docs/version-0.2.0/01-guides}/00-creating-components.md (99%) rename versioned_docs/version-0.2.0/{guides => 01-guides}/01-rsx-syntax.md (99%) rename versioned_docs/version-0.2.0/{guides => 01-guides}/02-state-management.md (99%) rename {docs/guides => versioned_docs/version-0.2.0/01-guides}/03-event-handling.md (99%) rename {docs/guides => versioned_docs/version-0.2.0/01-guides}/04-lifecycle-hooks.md (99%) rename versioned_docs/version-0.2.0/{guides => 01-guides}/05-data-flow-and-sync.md (99%) rename versioned_docs/version-0.2.0/{guides => 01-guides}/06-building-complex-layouts.md (99%) rename {docs/reference => versioned_docs/version-0.2.0/02-reference}/00-crate-structure.md (99%) rename versioned_docs/version-0.2.0/{reference => 02-reference}/component-api.md (99%) rename versioned_docs/version-0.2.0/{reference => 02-reference}/engine-api.md (99%) rename {docs/reference => versioned_docs/version-0.2.0/02-reference}/frontend-api.md (99%) rename versioned_docs/version-0.2.0/{reference => 02-reference}/macros-api.md (99%) rename versioned_docs/version-0.2.0/{reference => 02-reference}/render-api.md (99%) rename {docs/reference => versioned_docs/version-0.2.0/02-reference}/state-api.md (99%) rename versioned_docs/version-0.2.0/{concepts => 03-concepts}/00-architecture.md (99%) rename {docs/concepts => versioned_docs/version-0.2.0/03-concepts}/01-the-component-model.md (99%) rename {docs/concepts => versioned_docs/version-0.2.0/03-concepts}/02-reactive-state-flow.md (99%) rename versioned_docs/version-0.2.0/{concepts => 03-concepts}/03-event-propagation.md (99%) rename {docs/concepts => versioned_docs/version-0.2.0/03-concepts}/04-rendering-pipeline.md (99%) rename versioned_docs/version-0.2.0/{advanced => 04-advanced}/00-performance-benchmarking.md (99%) rename {docs/advanced => versioned_docs/version-0.2.0/04-advanced}/01-customizing-the-engine.md (99%) rename {docs/advanced => versioned_docs/version-0.2.0/04-advanced}/02-internals-macros.md (99%) rename {docs/advanced => versioned_docs/version-0.2.0/04-advanced}/03-contributing.md (99%) diff --git a/docs/intro/00-introduction.md b/docs/00-intro/00-introduction.md similarity index 99% rename from docs/intro/00-introduction.md rename to docs/00-intro/00-introduction.md index 4afcad5..6d6b3b6 100644 --- a/docs/intro/00-introduction.md +++ b/docs/00-intro/00-introduction.md @@ -1,7 +1,7 @@ -markdown --- sidebar_position: 0 title: Introduction +slug: / --- # Introduction to OSUI diff --git a/docs/intro/01-installation.md b/docs/00-intro/01-installation.md similarity index 99% rename from docs/intro/01-installation.md rename to docs/00-intro/01-installation.md index 85ebe30..9be0ff6 100644 --- a/docs/intro/01-installation.md +++ b/docs/00-intro/01-installation.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Installation diff --git a/docs/intro/02-getting-started.md b/docs/00-intro/02-getting-started.md similarity index 99% rename from docs/intro/02-getting-started.md rename to docs/00-intro/02-getting-started.md index 0854372..dcec3e7 100644 --- a/docs/intro/02-getting-started.md +++ b/docs/00-intro/02-getting-started.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Getting Started diff --git a/docs/intro/03-example-basic-component.md b/docs/00-intro/03-example-basic-component.md similarity index 99% rename from docs/intro/03-example-basic-component.md rename to docs/00-intro/03-example-basic-component.md index 120eda3..b0e6124 100644 --- a/docs/intro/03-example-basic-component.md +++ b/docs/00-intro/03-example-basic-component.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Basic Component with Children diff --git a/versioned_docs/version-0.2.0/guides/00-creating-components.md b/docs/01-guides/00-creating-components.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/00-creating-components.md rename to docs/01-guides/00-creating-components.md index d19d9f5..438b18e 100644 --- a/versioned_docs/version-0.2.0/guides/00-creating-components.md +++ b/docs/01-guides/00-creating-components.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Creating Components diff --git a/docs/guides/01-rsx-syntax.md b/docs/01-guides/01-rsx-syntax.md similarity index 99% rename from docs/guides/01-rsx-syntax.md rename to docs/01-guides/01-rsx-syntax.md index c5525d4..913080a 100644 --- a/docs/guides/01-rsx-syntax.md +++ b/docs/01-guides/01-rsx-syntax.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: RSX Syntax Guide diff --git a/docs/guides/02-state-management.md b/docs/01-guides/02-state-management.md similarity index 99% rename from docs/guides/02-state-management.md rename to docs/01-guides/02-state-management.md index 833a970..d798fbf 100644 --- a/docs/guides/02-state-management.md +++ b/docs/01-guides/02-state-management.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: State Management diff --git a/versioned_docs/version-0.2.0/guides/03-event-handling.md b/docs/01-guides/03-event-handling.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/03-event-handling.md rename to docs/01-guides/03-event-handling.md index 3723afd..718b22f 100644 --- a/versioned_docs/version-0.2.0/guides/03-event-handling.md +++ b/docs/01-guides/03-event-handling.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Event Handling diff --git a/versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md b/docs/01-guides/04-lifecycle-hooks.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md rename to docs/01-guides/04-lifecycle-hooks.md index 60827a0..665dcd6 100644 --- a/versioned_docs/version-0.2.0/guides/04-lifecycle-hooks.md +++ b/docs/01-guides/04-lifecycle-hooks.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: Lifecycle Hooks diff --git a/docs/guides/05-data-flow-and-sync.md b/docs/01-guides/05-data-flow-and-sync.md similarity index 99% rename from docs/guides/05-data-flow-and-sync.md rename to docs/01-guides/05-data-flow-and-sync.md index 533b38e..3f3aed8 100644 --- a/docs/guides/05-data-flow-and-sync.md +++ b/docs/01-guides/05-data-flow-and-sync.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 5 title: Data Flow and Sync diff --git a/docs/guides/06-building-complex-layouts.md b/docs/01-guides/06-building-complex-layouts.md similarity index 99% rename from docs/guides/06-building-complex-layouts.md rename to docs/01-guides/06-building-complex-layouts.md index 890ba0f..1cbaa96 100644 --- a/docs/guides/06-building-complex-layouts.md +++ b/docs/01-guides/06-building-complex-layouts.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 6 title: Building Complex Layouts diff --git a/versioned_docs/version-0.2.0/reference/00-crate-structure.md b/docs/02-reference/00-crate-structure.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/00-crate-structure.md rename to docs/02-reference/00-crate-structure.md index 3afbf22..6bc6d83 100644 --- a/versioned_docs/version-0.2.0/reference/00-crate-structure.md +++ b/docs/02-reference/00-crate-structure.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Crate Structure diff --git a/docs/reference/component-api.md b/docs/02-reference/component-api.md similarity index 99% rename from docs/reference/component-api.md rename to docs/02-reference/component-api.md index 31dc864..ca09453 100644 --- a/docs/reference/component-api.md +++ b/docs/02-reference/component-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Component API diff --git a/docs/reference/engine-api.md b/docs/02-reference/engine-api.md similarity index 99% rename from docs/reference/engine-api.md rename to docs/02-reference/engine-api.md index ad3985a..8430adb 100644 --- a/docs/reference/engine-api.md +++ b/docs/02-reference/engine-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Engine API diff --git a/versioned_docs/version-0.2.0/reference/frontend-api.md b/docs/02-reference/frontend-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/frontend-api.md rename to docs/02-reference/frontend-api.md index 0e72e08..446acc6 100644 --- a/versioned_docs/version-0.2.0/reference/frontend-api.md +++ b/docs/02-reference/frontend-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Frontend API diff --git a/docs/reference/macros-api.md b/docs/02-reference/macros-api.md similarity index 99% rename from docs/reference/macros-api.md rename to docs/02-reference/macros-api.md index 7905a8b..7601222 100644 --- a/docs/reference/macros-api.md +++ b/docs/02-reference/macros-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 6 title: Macros API diff --git a/docs/reference/render-api.md b/docs/02-reference/render-api.md similarity index 99% rename from docs/reference/render-api.md rename to docs/02-reference/render-api.md index bd61313..5620d20 100644 --- a/docs/reference/render-api.md +++ b/docs/02-reference/render-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: Render API diff --git a/versioned_docs/version-0.2.0/reference/state-api.md b/docs/02-reference/state-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/state-api.md rename to docs/02-reference/state-api.md index b824b88..8f9a4a3 100644 --- a/versioned_docs/version-0.2.0/reference/state-api.md +++ b/docs/02-reference/state-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 5 title: State API diff --git a/docs/concepts/00-architecture.md b/docs/03-concepts/00-architecture.md similarity index 99% rename from docs/concepts/00-architecture.md rename to docs/03-concepts/00-architecture.md index 719ac44..9f38ebe 100644 --- a/docs/concepts/00-architecture.md +++ b/docs/03-concepts/00-architecture.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Core Architecture diff --git a/versioned_docs/version-0.2.0/concepts/01-the-component-model.md b/docs/03-concepts/01-the-component-model.md similarity index 99% rename from versioned_docs/version-0.2.0/concepts/01-the-component-model.md rename to docs/03-concepts/01-the-component-model.md index e83fe83..8eb9fd4 100644 --- a/versioned_docs/version-0.2.0/concepts/01-the-component-model.md +++ b/docs/03-concepts/01-the-component-model.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: The Component Model diff --git a/versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md b/docs/03-concepts/02-reactive-state-flow.md similarity index 99% rename from versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md rename to docs/03-concepts/02-reactive-state-flow.md index 95bc768..90b1171 100644 --- a/versioned_docs/version-0.2.0/concepts/02-reactive-state-flow.md +++ b/docs/03-concepts/02-reactive-state-flow.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Reactive State Flow diff --git a/docs/concepts/03-event-propagation.md b/docs/03-concepts/03-event-propagation.md similarity index 99% rename from docs/concepts/03-event-propagation.md rename to docs/03-concepts/03-event-propagation.md index a2f3b72..902fca4 100644 --- a/docs/concepts/03-event-propagation.md +++ b/docs/03-concepts/03-event-propagation.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Event Propagation diff --git a/versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md b/docs/03-concepts/04-rendering-pipeline.md similarity index 99% rename from versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md rename to docs/03-concepts/04-rendering-pipeline.md index 5ed2ca6..c27afbc 100644 --- a/versioned_docs/version-0.2.0/concepts/04-rendering-pipeline.md +++ b/docs/03-concepts/04-rendering-pipeline.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: The Rendering Pipeline diff --git a/docs/advanced/00-performance-benchmarking.md b/docs/04-advanced/00-performance-benchmarking.md similarity index 99% rename from docs/advanced/00-performance-benchmarking.md rename to docs/04-advanced/00-performance-benchmarking.md index 36a4ffb..ddf1a46 100644 --- a/docs/advanced/00-performance-benchmarking.md +++ b/docs/04-advanced/00-performance-benchmarking.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Performance Benchmarking diff --git a/versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md b/docs/04-advanced/01-customizing-the-engine.md similarity index 99% rename from versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md rename to docs/04-advanced/01-customizing-the-engine.md index 658879f..3ef97df 100644 --- a/versioned_docs/version-0.2.0/advanced/01-customizing-the-engine.md +++ b/docs/04-advanced/01-customizing-the-engine.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Customizing the Engine diff --git a/versioned_docs/version-0.2.0/advanced/02-internals-macros.md b/docs/04-advanced/02-internals-macros.md similarity index 99% rename from versioned_docs/version-0.2.0/advanced/02-internals-macros.md rename to docs/04-advanced/02-internals-macros.md index 21e671c..9b004c4 100644 --- a/versioned_docs/version-0.2.0/advanced/02-internals-macros.md +++ b/docs/04-advanced/02-internals-macros.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Internals: Macros diff --git a/versioned_docs/version-0.2.0/advanced/03-contributing.md b/docs/04-advanced/03-contributing.md similarity index 99% rename from versioned_docs/version-0.2.0/advanced/03-contributing.md rename to docs/04-advanced/03-contributing.md index a27300b..3042e66 100644 --- a/versioned_docs/version-0.2.0/advanced/03-contributing.md +++ b/docs/04-advanced/03-contributing.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Contributing diff --git a/versioned_docs/version-0.2.0/intro/00-introduction.md b/versioned_docs/version-0.2.0/00-intro/00-introduction.md similarity index 99% rename from versioned_docs/version-0.2.0/intro/00-introduction.md rename to versioned_docs/version-0.2.0/00-intro/00-introduction.md index 4afcad5..6d6b3b6 100644 --- a/versioned_docs/version-0.2.0/intro/00-introduction.md +++ b/versioned_docs/version-0.2.0/00-intro/00-introduction.md @@ -1,7 +1,7 @@ -markdown --- sidebar_position: 0 title: Introduction +slug: / --- # Introduction to OSUI diff --git a/versioned_docs/version-0.2.0/intro/01-installation.md b/versioned_docs/version-0.2.0/00-intro/01-installation.md similarity index 99% rename from versioned_docs/version-0.2.0/intro/01-installation.md rename to versioned_docs/version-0.2.0/00-intro/01-installation.md index 85ebe30..9be0ff6 100644 --- a/versioned_docs/version-0.2.0/intro/01-installation.md +++ b/versioned_docs/version-0.2.0/00-intro/01-installation.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Installation diff --git a/versioned_docs/version-0.2.0/intro/02-getting-started.md b/versioned_docs/version-0.2.0/00-intro/02-getting-started.md similarity index 99% rename from versioned_docs/version-0.2.0/intro/02-getting-started.md rename to versioned_docs/version-0.2.0/00-intro/02-getting-started.md index 0854372..dcec3e7 100644 --- a/versioned_docs/version-0.2.0/intro/02-getting-started.md +++ b/versioned_docs/version-0.2.0/00-intro/02-getting-started.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Getting Started diff --git a/versioned_docs/version-0.2.0/intro/03-example-basic-component.md b/versioned_docs/version-0.2.0/00-intro/03-example-basic-component.md similarity index 99% rename from versioned_docs/version-0.2.0/intro/03-example-basic-component.md rename to versioned_docs/version-0.2.0/00-intro/03-example-basic-component.md index 120eda3..b0e6124 100644 --- a/versioned_docs/version-0.2.0/intro/03-example-basic-component.md +++ b/versioned_docs/version-0.2.0/00-intro/03-example-basic-component.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Basic Component with Children diff --git a/docs/guides/00-creating-components.md b/versioned_docs/version-0.2.0/01-guides/00-creating-components.md similarity index 99% rename from docs/guides/00-creating-components.md rename to versioned_docs/version-0.2.0/01-guides/00-creating-components.md index d19d9f5..438b18e 100644 --- a/docs/guides/00-creating-components.md +++ b/versioned_docs/version-0.2.0/01-guides/00-creating-components.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Creating Components diff --git a/versioned_docs/version-0.2.0/guides/01-rsx-syntax.md b/versioned_docs/version-0.2.0/01-guides/01-rsx-syntax.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/01-rsx-syntax.md rename to versioned_docs/version-0.2.0/01-guides/01-rsx-syntax.md index c5525d4..913080a 100644 --- a/versioned_docs/version-0.2.0/guides/01-rsx-syntax.md +++ b/versioned_docs/version-0.2.0/01-guides/01-rsx-syntax.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: RSX Syntax Guide diff --git a/versioned_docs/version-0.2.0/guides/02-state-management.md b/versioned_docs/version-0.2.0/01-guides/02-state-management.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/02-state-management.md rename to versioned_docs/version-0.2.0/01-guides/02-state-management.md index 833a970..d798fbf 100644 --- a/versioned_docs/version-0.2.0/guides/02-state-management.md +++ b/versioned_docs/version-0.2.0/01-guides/02-state-management.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: State Management diff --git a/docs/guides/03-event-handling.md b/versioned_docs/version-0.2.0/01-guides/03-event-handling.md similarity index 99% rename from docs/guides/03-event-handling.md rename to versioned_docs/version-0.2.0/01-guides/03-event-handling.md index 3723afd..718b22f 100644 --- a/docs/guides/03-event-handling.md +++ b/versioned_docs/version-0.2.0/01-guides/03-event-handling.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Event Handling diff --git a/docs/guides/04-lifecycle-hooks.md b/versioned_docs/version-0.2.0/01-guides/04-lifecycle-hooks.md similarity index 99% rename from docs/guides/04-lifecycle-hooks.md rename to versioned_docs/version-0.2.0/01-guides/04-lifecycle-hooks.md index 60827a0..665dcd6 100644 --- a/docs/guides/04-lifecycle-hooks.md +++ b/versioned_docs/version-0.2.0/01-guides/04-lifecycle-hooks.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: Lifecycle Hooks diff --git a/versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md b/versioned_docs/version-0.2.0/01-guides/05-data-flow-and-sync.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md rename to versioned_docs/version-0.2.0/01-guides/05-data-flow-and-sync.md index 533b38e..3f3aed8 100644 --- a/versioned_docs/version-0.2.0/guides/05-data-flow-and-sync.md +++ b/versioned_docs/version-0.2.0/01-guides/05-data-flow-and-sync.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 5 title: Data Flow and Sync diff --git a/versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md b/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md similarity index 99% rename from versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md rename to versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md index 890ba0f..1cbaa96 100644 --- a/versioned_docs/version-0.2.0/guides/06-building-complex-layouts.md +++ b/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 6 title: Building Complex Layouts diff --git a/docs/reference/00-crate-structure.md b/versioned_docs/version-0.2.0/02-reference/00-crate-structure.md similarity index 99% rename from docs/reference/00-crate-structure.md rename to versioned_docs/version-0.2.0/02-reference/00-crate-structure.md index 3afbf22..6bc6d83 100644 --- a/docs/reference/00-crate-structure.md +++ b/versioned_docs/version-0.2.0/02-reference/00-crate-structure.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Crate Structure diff --git a/versioned_docs/version-0.2.0/reference/component-api.md b/versioned_docs/version-0.2.0/02-reference/component-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/component-api.md rename to versioned_docs/version-0.2.0/02-reference/component-api.md index 31dc864..ca09453 100644 --- a/versioned_docs/version-0.2.0/reference/component-api.md +++ b/versioned_docs/version-0.2.0/02-reference/component-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Component API diff --git a/versioned_docs/version-0.2.0/reference/engine-api.md b/versioned_docs/version-0.2.0/02-reference/engine-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/engine-api.md rename to versioned_docs/version-0.2.0/02-reference/engine-api.md index ad3985a..8430adb 100644 --- a/versioned_docs/version-0.2.0/reference/engine-api.md +++ b/versioned_docs/version-0.2.0/02-reference/engine-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Engine API diff --git a/docs/reference/frontend-api.md b/versioned_docs/version-0.2.0/02-reference/frontend-api.md similarity index 99% rename from docs/reference/frontend-api.md rename to versioned_docs/version-0.2.0/02-reference/frontend-api.md index 0e72e08..446acc6 100644 --- a/docs/reference/frontend-api.md +++ b/versioned_docs/version-0.2.0/02-reference/frontend-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Frontend API diff --git a/versioned_docs/version-0.2.0/reference/macros-api.md b/versioned_docs/version-0.2.0/02-reference/macros-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/macros-api.md rename to versioned_docs/version-0.2.0/02-reference/macros-api.md index 7905a8b..7601222 100644 --- a/versioned_docs/version-0.2.0/reference/macros-api.md +++ b/versioned_docs/version-0.2.0/02-reference/macros-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 6 title: Macros API diff --git a/versioned_docs/version-0.2.0/reference/render-api.md b/versioned_docs/version-0.2.0/02-reference/render-api.md similarity index 99% rename from versioned_docs/version-0.2.0/reference/render-api.md rename to versioned_docs/version-0.2.0/02-reference/render-api.md index bd61313..5620d20 100644 --- a/versioned_docs/version-0.2.0/reference/render-api.md +++ b/versioned_docs/version-0.2.0/02-reference/render-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: Render API diff --git a/docs/reference/state-api.md b/versioned_docs/version-0.2.0/02-reference/state-api.md similarity index 99% rename from docs/reference/state-api.md rename to versioned_docs/version-0.2.0/02-reference/state-api.md index b824b88..8f9a4a3 100644 --- a/docs/reference/state-api.md +++ b/versioned_docs/version-0.2.0/02-reference/state-api.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 5 title: State API diff --git a/versioned_docs/version-0.2.0/concepts/00-architecture.md b/versioned_docs/version-0.2.0/03-concepts/00-architecture.md similarity index 99% rename from versioned_docs/version-0.2.0/concepts/00-architecture.md rename to versioned_docs/version-0.2.0/03-concepts/00-architecture.md index 719ac44..9f38ebe 100644 --- a/versioned_docs/version-0.2.0/concepts/00-architecture.md +++ b/versioned_docs/version-0.2.0/03-concepts/00-architecture.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Core Architecture diff --git a/docs/concepts/01-the-component-model.md b/versioned_docs/version-0.2.0/03-concepts/01-the-component-model.md similarity index 99% rename from docs/concepts/01-the-component-model.md rename to versioned_docs/version-0.2.0/03-concepts/01-the-component-model.md index e83fe83..8eb9fd4 100644 --- a/docs/concepts/01-the-component-model.md +++ b/versioned_docs/version-0.2.0/03-concepts/01-the-component-model.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: The Component Model diff --git a/docs/concepts/02-reactive-state-flow.md b/versioned_docs/version-0.2.0/03-concepts/02-reactive-state-flow.md similarity index 99% rename from docs/concepts/02-reactive-state-flow.md rename to versioned_docs/version-0.2.0/03-concepts/02-reactive-state-flow.md index 95bc768..90b1171 100644 --- a/docs/concepts/02-reactive-state-flow.md +++ b/versioned_docs/version-0.2.0/03-concepts/02-reactive-state-flow.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Reactive State Flow diff --git a/versioned_docs/version-0.2.0/concepts/03-event-propagation.md b/versioned_docs/version-0.2.0/03-concepts/03-event-propagation.md similarity index 99% rename from versioned_docs/version-0.2.0/concepts/03-event-propagation.md rename to versioned_docs/version-0.2.0/03-concepts/03-event-propagation.md index a2f3b72..902fca4 100644 --- a/versioned_docs/version-0.2.0/concepts/03-event-propagation.md +++ b/versioned_docs/version-0.2.0/03-concepts/03-event-propagation.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Event Propagation diff --git a/docs/concepts/04-rendering-pipeline.md b/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md similarity index 99% rename from docs/concepts/04-rendering-pipeline.md rename to versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md index 5ed2ca6..c27afbc 100644 --- a/docs/concepts/04-rendering-pipeline.md +++ b/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 4 title: The Rendering Pipeline diff --git a/versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md b/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md similarity index 99% rename from versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md rename to versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md index 36a4ffb..ddf1a46 100644 --- a/versioned_docs/version-0.2.0/advanced/00-performance-benchmarking.md +++ b/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 0 title: Performance Benchmarking diff --git a/docs/advanced/01-customizing-the-engine.md b/versioned_docs/version-0.2.0/04-advanced/01-customizing-the-engine.md similarity index 99% rename from docs/advanced/01-customizing-the-engine.md rename to versioned_docs/version-0.2.0/04-advanced/01-customizing-the-engine.md index 658879f..3ef97df 100644 --- a/docs/advanced/01-customizing-the-engine.md +++ b/versioned_docs/version-0.2.0/04-advanced/01-customizing-the-engine.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 1 title: Customizing the Engine diff --git a/docs/advanced/02-internals-macros.md b/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md similarity index 99% rename from docs/advanced/02-internals-macros.md rename to versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md index 21e671c..9b004c4 100644 --- a/docs/advanced/02-internals-macros.md +++ b/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 2 title: Internals: Macros diff --git a/docs/advanced/03-contributing.md b/versioned_docs/version-0.2.0/04-advanced/03-contributing.md similarity index 99% rename from docs/advanced/03-contributing.md rename to versioned_docs/version-0.2.0/04-advanced/03-contributing.md index a27300b..3042e66 100644 --- a/docs/advanced/03-contributing.md +++ b/versioned_docs/version-0.2.0/04-advanced/03-contributing.md @@ -1,4 +1,3 @@ -markdown --- sidebar_position: 3 title: Contributing From 74d37206b44bf3c13923919f0aaeac11ba485fd2 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 21:09:10 +0100 Subject: [PATCH 4/5] Performance benchmark --- .../04-advanced/00-performance-benchmarking.md | 6 ++++++ docs/04-advanced/3dplot-gen-dot.png | Bin 0 -> 153057 bytes docs/04-advanced/3dplot-gen-surface.png | Bin 0 -> 207702 bytes .../04-advanced/00-performance-benchmarking.md | 6 ++++++ .../04-advanced/3dplot-gen-dot.png | Bin 0 -> 153057 bytes .../04-advanced/3dplot-gen-surface.png | Bin 0 -> 207702 bytes 6 files changed, 12 insertions(+) create mode 100644 docs/04-advanced/3dplot-gen-dot.png create mode 100644 docs/04-advanced/3dplot-gen-surface.png create mode 100644 versioned_docs/version-0.2.0/04-advanced/3dplot-gen-dot.png create mode 100644 versioned_docs/version-0.2.0/04-advanced/3dplot-gen-surface.png diff --git a/docs/04-advanced/00-performance-benchmarking.md b/docs/04-advanced/00-performance-benchmarking.md index ddf1a46..f50026b 100644 --- a/docs/04-advanced/00-performance-benchmarking.md +++ b/docs/04-advanced/00-performance-benchmarking.md @@ -7,6 +7,12 @@ title: Performance Benchmarking Optimizing rendering performance is crucial for smooth and responsive TUI applications, especially those with complex layouts or frequent updates. OSUI provides a built-in `Benchmark` engine wrapper that allows you to easily measure the rendering speed of your components. +## Current performance +All the latest benchmark results are in [benchmark.csv](https://github.com/osui-rs/osui/blob/master/benchmark.csv) + +![Dot diagram](3dplot-gen-dot.png) +![Dot diagram](3dplot-gen-surface.png) + ## The `Benchmark` Engine The `osui::engine::benchmark` module offers the `Benchmark` struct, which wraps an existing engine (like `Console`) and records detailed timing information for its rendering cycles. diff --git a/docs/04-advanced/3dplot-gen-dot.png b/docs/04-advanced/3dplot-gen-dot.png new file mode 100644 index 0000000000000000000000000000000000000000..24d36733391ab723d5c3b2c247228c4d409fa248 GIT binary patch literal 153057 zcmaHTbwE_j_xG~0vVbCuf|MW)qLiTEib_g%qk?pI@2VKIAR;M9H_{Czq0-$-gMhT4 z;5&C06n(zG_a9yM&d!`U=W}w-+(*ia(npDCiC{3;QCXR*sxa7L6byFg9`Z2wW=mn` z1q?xw7)@})}SN{sphoT_!qQaBXj2rc?$Lu6(9WnP@h zy%rNqX4*IwPWc=`&eTSZ;_;2DHa;{nU0Y_WF`OSlH0;AT_t}YV*m%cIV_02RnE%Ra z^d@WxZ{$!lf%~y<3}fQ;UI)Iw-(eUV-Cgth>p_Lru_2T1$MEn;Q83I9VVg1Z0sGhf zKS(1q^^^e`CNnaMSIoHoEi`C_8O2TZXLMsU3@U||4Gs*>@XcLEFoXQMjA&m z#+$HB_ut`;tYL#NnUK7*3fKPL8H%Y4E_iZpM=RVY7;9Z`!c!LP#7byt?1zIpKz)Z7 zf2#!4&y!v}_&uQa9tSG+593z2z+CxS39c+?lmxGDvujLrp9Zk>XJi}sUyxwx1q(X*Y^`>=5B!ZfXh9rEp;>K_ zq_Bz`uYSXii3d;j?%y0mqe2jl6tJdcp|sh9oW|~03Vr|gj$Z=QXy1{>(eauh@!G$m znMiA4ygAG$SjyoevHxt(n=-NGz<7NMCYa+V%yaM+>KVNFZ@xi<sO)dzTv6Av^xF#wRy#bGT8CdXm#n-042U;QvXf)~~{ ziYUezll_r@2*OTZAcKZAo+20CTL--a@A`w;{pnxRn0HCSnS$^2{jm`^;?O_fU8KLK zHpT$D5KPrqp&udv!VXf8-3$(4+d$xRKMMYa{kJP<-QV&7`>wwTAhvqm9Rq_WA=^m) zf(&+kU-b1?SLY4J1H9TrDy#iH9zz5sqdI=^s4Tkle-nk>1ZDtGW;s|uu)n2m z^5}tsL}52kABQTy3#*`B!QUT-13jSX4prifeVL(n!I~u|eIeK%q5a@p$Nw`Pf`$Un z5exEwH-D@M_LDwkqT>EkUCYb85e=hh6{T$x)A5GswS=$pJg0yGnkq4L3r%E(D zFcrY55Fo8vz3)D{4&L?uv0@59H1wb$dNXxwYhVMCk2KWCp6=0OPAs}s4^W<;GTz(p5^UqX(v@{ey zURVsT3BiA+!e>GKmJH@L0*Myne&>KAt(+Yd{GX{HquiGUb}Ib&{L#N9#YBwPjMZA4 za1uoUK0b*$P=Ynb(qJWj49%YKFy9d7%y4A!X<#6Eg%uAz$K>F1{H@vMQedM3awqSi ztKeNn{$3cc>o-JfAdwylR{KMEA!VZV--?WfPfH9&Sx;<`b&>qvQz4n!3c*I7Hl4@Y z8&pW0=>6|hq)4O0PHJ-4ta{k$KQ^9J#t2RRhY(##CRoR*;}5Vlwwwt?|L4)(C#=Uq znF0GDwmSYd(e)v))IZn*+9wZ2>3;bFVmte5XwQR>uqeeENkI0@RlqlP&o~gj?E?-i zjwg4J*Gfzl}Xp+auWY zKZG*1RRHd`9PRvs8TuE9sQr){n)ngWW!bnVNA?CKs^PWlWnBAvz^ZCDRYd;I(6xrUWzbV5^;h+C2;w7g7GT>m3 zW=5k_;S>MH=fC55CIui;i@9)-eJa4NJ`vlq9{3Z2`5hnw^0%zntcXV9KU>@T^xJVj zyoa%h>p6PD&HMIi0aE+&)TJ0R|BsAiuGja&WNz}Zvi#?fy(T)~H?%Dv11A5}8^>v2 z4FvuYKST*67;{-P?BQwifPV~d23x)Gf%yU2VBsO$6_D5$2<@r=-YgIZF3zY2;XNt$ zN6NpnxCDPMkldGB3P?^^k7}%3P4vNQIpDi-+x~6%(Fnk3>M&0DZ}uf7z<&I@2^lCB zSxJkZZ0!HPF$^%(1uRaA;&r^eL2WYVo&PZ&y#So*OI}5ff1e${`#T#&qnaW8I?Uz; zF$i-T|NPO*VSBvggpf`am7_;CrhPzsI0}9{5GG?KAarr7KMr|{_@As9(jQd{ zdp20OE^*U;qyIRv#8dlAqoHh}G=&qFdSKqct^dIi&Y9nk0$e+HC;e}_n4ZIn4`u|A z3;cRsjR*it*#HgY4Ev}#XqGV7f$cJRt(bJ+`23)6wU)g|WqE9Jvt^&Caw@A@GVHy~f9NsSNMBZ>iG zE^u(OSY|-hhaQ-yFOB|*w108xpSlLd8UoI^VkVL)Obc(|@7xNS3MWf@NuVDTQ5ZQK ztFh7}&4ck?+1GC@k%goH6aHeRQ#$Ca9@pam@=5gZvwmaX9xrPCFPi{{ z6`TQlEft;oKlLBN?Kud9Tc;EE_P>|g{T3vaI3UelT^ZQh5^hPKe-@D>O+5OCIVXT8 zZu$;az6fRuJBFwG$G`6risi)+IbdtgdZO^3Um}@E17Hik6$z|@xekn&Nwd;tfU*ScHzhpqQmQF{N7c@AVO;mp3Z0cj-%*Te~7KPo}h(*w3H>JwY; z`&{KxJCCn%D4s092-8DUQIpOyD~r7T!e(U6+!K-l`O8#oza^|ai;jjYr+%$i*Plv3Jv-hUDA1lj@)!)n zUe2WagY~hyfN_j@;ZZIr9e;5JwGBVSt(9VgJPmZ29?uo0m}8*aLh6=(RA}E4jN)gU z0W^<2tDpK5OP{S$*v&~vblcNYtp9q`pY@rJW4ho>uaNDe2bqPG8@u8*Or!2)DRkSo zJ5i^~wV-E_snpGl=3^HnURcf5C0(5eJ3jnEtBDfMf;81!)KZ6P)>g!y zVmHbY@UWxkv>7;MNru^A&GRD9fgPyS}_z$g6%*-x6NM{>VSfh+!sFqLZR+}lWpqKTB0<0o`xMT(B$Wc*KR>U`F!(qdac*tpqB!6CMk_vMS ze`EdJ=uoU*3-KUNBJ_pdWwR|mKb|PCDA*3I_VGl zoWs-uD6;xsn)Zs%O8CVi7

k)lWy~HFY=})+J|VoN%x&;BD(3zEvgDyb5X|dpkw1 z0)pe}uBzi|%NS?;QoBLRaNQ;5c-nza>qF53uEfs8#noxr|s<_NdrF(AA_hRnhdw;kOduXQ>w2fOPEDTNko?ctQ%KHnY=W)$#?|#>xeMG;o6m@+zgy3*RkmD@vNC=AePd9fpx=Dq>01G|EBm}iQm=!T9`J;Z)VS3<~Eitl;b&lNMZ%8d#Wbkb_au3as2?Q(`^9n}Dz)jP-H{Q(>V; zdQqUU2-Oe0OzMVHW5wt@Lqx6@3}hR)(=*9_$ZbdwOz|F{{XUuQxrY`~G{`Sud@tw} z5~;CYNf5QQJC0{%Mii9w`P@3x3W25-K{=sWFt~cVE7w;`Yj~J`sq4-}%&C{-L5(m> zBEI<%9Bg+%l({^utFo7rlhcgZZqlVtjE|?Kcf%TkJ3VkU22=yw!2f20M{(?{yIvcm zUR=|^BZ3wpR%)0-slPgi<8Wv-mqZ1&ST6UoksRF)E3qQ@RG;-KaZqL)IEIs$=xFD` z7bQu>QtFkdLya}rRnzZ@A3RqP+LwPl4X~!Q`kZrEV>tE#z3Eb^%dlR1R1jz7G0OOb zKMh-c&?+ZYKQPDEa8Z_UldqYOO*wP28yDJvtXu5D6n7z8z}bjN&Q2?bSEE~6Oh2@= z2#Id{k!4)I37_>zJFR(bTA*VIa*QJvbQ-`T$#^FGJyJi z2USX7_c8VOY?J^>h#syOC>t+kHwMq0%nAuh*IIlRqqe_)wOcZHtpm_Yher#{yCJZV z%PWN{7Pu{jlNr}M*a`vip0*pK0_PA^#w>6T@@LPEm-P%4nF$b~pUAZ%QC3G&|HJ{| zU~}?qloUCzqmYHKrY;BAJCeh&R(VuiLI=-f&7wKV#OX9-pz4({o$0O59&x*Z=v47a zDj5?k-psVdiyq|f$l@5-le>F+#yK1WkSQ$n+sEEt4+@QauU4Bfz9gBaqi|_laxn7{ zyq1tMQ2u(w&jh>fyy}Xl2K%)D9U}yDVa$EY$rXn2W?gn*e)BEf{ytJlgd+Rg0N#rU zy*S9a^CY&AxOln`;b(=QUckZh5#}t7M=+^2(FYZ3b9V~UTcb!jHe44I%iL*dJ z*tT!RHW1=EHYRgt2VrQHyp%uA@5(5Sz1|X#>hvm(xs}ntDDHT^D@|yaZ-hcY%^|S? z9<;Xn{R=|hML{;YTTp#l5B2;P-?uyl6H7&!yhARy0FjCM+s^y&} zu1xU9A9AU*USI8QPlWq8$>E$DIGu(wF&i0RkEm1FQ16)u?b9cNvnyN|5>IGfL(SYr z0yRyf!0ehDO!@ou+HLF@efV^2_uaYGFLio1YQLM?vFkYInPO5uXz6gP%%8EKXR|_R zQWgVO6rj~F5g#4%u@wFUdlXiHLPsIL^8ywv%}X!fSTv)JzQAioI;S{l_+ar)jfy~3 zt97e~U75?ee5XNMjr?#0MWwGz#NeO?2V0a*qi9KAso$=9lef9mW_3~R_ZihyB?-%h zAC?}@hW$x3GklaEySkjSKE)holo$HtA8jTCH|a z(7l7&Fm(M9H(j>GvZUz5*#u*d%rDL)-w--WE^p^rl) zlJA+*una)+RngTaCvaIM@*2cC{U+k+mS>S4Dku`#VIm_G7q0+e`EA){DNU~SUh>J0 zuom5{M7gOw~4T{^-uwG>>YtKkwm!c zVk{r%vR^*E5U#$+M20tPk$HiSqUq!6b-~T;@7nRR(iiO*yTRisxY5oO)oS)HyIo4T zUti9!ef+iaW)4GERkB)FESVGrT(ep005RIc<620ac%137lj-JDx%a8-GE-cxJ581A z_^3R!Z@73CEdsY8Kvi2XQ|){2O1OV);BDh|Bs$m-P1aGsrD*yc0_-DfUnc%;dU`;lParqCciVLUI-3s0Un0w0T!s(_WcR01h%M< zg_9JMoXMQ*cdYg4f_01Tw;b*9w-^t8!-?!7ZS!RO_4!h*+3w`A4^#e8qxlY$u?CdK zwS~;B6&nQ4N<1aJJ5b@8OE>Bh6JYiFGaXss5mnQbsYGR944FpZ#S)}I6EXTSF}MOP zstO*nky+L^yg2(RzF|22m4PZP@b~n@VVI+so0~spJFK6~>Yj+Xuj&_7u9;shq4i-g zMDfvl<9>zwBgl5ojo#G)w4;3RHcpWyq8E$1=%et2b931o+|tipkL~Qydk_Iu=f~^q zO_mAJ>om69u1i^&XJu4)mpaRFp^4>_Q)_%vLkzzKEhyL;5-RI}G(-{&lOc_IEQP~K zTW!7ns@ccc&YyQ{eJ;0Lg~}l_&p|{S{<6Z?-%m2wDrc5iNWo;BB|`Me_rW(!CS5oA zXc2SG8G*o_8I87wLcp5x^(Uf6P7VZ{Aa z(Ga2jdAIjD`XdoluG5*X_;TIC(yGLkZ1RjA-`2C79PZYzQaU$iLvUDdn>jkB>}jAB z#!}GS$}H8%Su5$8;(Nl0n5fne{0zzFJGh1beCRj`9VkPA3kqh`jX!NG#NQ_SxWxmr z4WfRdA>A4r*en1^$qz1k=n(D8<7cgK#1vGF4u)SV#7Q^&?@|R;<#+G^sL^*qj^SAt0C)}3q*D{oc2VLOQAJo zR;#|x#sG)ajT2YONO*^y^v^dfFMn*dRWJBNb~$*iqj`6@Zdot)WXs-3_Omu55`EA0 zn#JA;iw!bP+@(6W==H^GYGD&T+w8pCv6I7%I<-Z`qy=K)MLCB|S;Fqs*Uw#cTJA6* z*O?R!eYxylWz%bxC*hS#rLCf@l&QYVHJJX!?wFY#MlAI?2v_@v9(HF+eW-dbb*9*x zgdK+)QV=VIh2^o?K-ErF3a0TkL`#A=g(rmtBV2*doc6c^L1)*ilK}FUiF0%W%yWHe z-q|{R))yXqH<@{-#I=W8Muc&O?Ve|YNk!|_59Ul)OPdou`KKcpw*Y1g@y*%cH$a$8 zIPcj(iwkH5$dw=56=N6>6D^2vZYW-iBgxU>6_QS7>N?TeA$#&`39NIhyWHElr37rx z3y)MG|B03LF5LC1Wah7(?EY&A3Vmbx;KfF|8mNlu5f+ebglZF5qr#; zLeg|t-_uv^BdcPuG_E%eY7WFXm0E-#!@F2nQ;8}O^C&AJW^#?i{DEtv{wv`<*K4Zat$ zQomp8wN5`YQ=YS7#2b2B!+CIW?)Kr~t~S@hd&hDp7yux={Gn?MiW3WOX5x&9>+z<{ zWsggR&LmzlEa|gaHM{4M61rObzy)EhKn{2IcFpV4o14EF!RFMs;?ywd-w-=dPX&Fl5!fSJ;l6<7x>ag&4^CoWhJBN4}02ve=Lv3 zIPK9o>Hng=g63I5f?W4l^Jyv?Y@Cnb$B!XF-)q;`-9Py1#ur?;pEjCN8ft@EwVX|vhwrQ!XFlEw6~WR0aUDgG zXKLB>F}sBWr}|4ml$^YtCL7b1SnU-V+HbThEOAlBXH!t&(x-Y5Opp$Kd4fIL9g9Ha z%{3d`5#bY|es63)z5}&QHm0LLm7IObXB0{3XqRbHNL0&XZLgVZOx=?_U=?Im6Q0DnSFNHw$uX7Fb(PT=1Fm>d33+E zRc@iRqNrvzNl9t8EdYCo>xHVFna6KhdUE3fY=$nHl>Vfhk14*@AgVxQe;kg)hpOX^ zALNqvQZIus%l^6xbb5BD%>=noq!~Jy{GrJj$O(f)klf7091~6-JQuPXr9ql;f`n08 zeXG(|wr2k2jRh_;>GeN)bQk?*RyUi$r9_}rW&y6!#G!<;_XdEHb}zs$tj zdg%J~6fyGj6S^VTlbCPULHK4y6EwG%6+f--FTzLN)Vp)}y@?Q`kM~jct1wIpeoxMc zuRMnuTKS*?mRJq!Vaz292b-W;RoQF0N;;8NHA(c;eG%>Jvnd0#ybfR9HYpa`FX{(> zj479dy{#a=;tz4A0r)<_O4Qdq_rVUg>LsC7hzg6C>ak&amDmqM5~uh0gceZX^&&Kn z-KU4i4*D6dC%!B>Uta4a@6(Tu5*9sI$Si-?V=0yPjJG}=*V}e-s~)>72md}?9Rg(o z1YTm(hdZD}<>B)g#t6=RQ%PP;aF)(lJomBcis7JNaW#2KrXvfJ6T_~Ml+MQtY2>n>R%;s!DkLs>Yz<4UtfN^V@07pLD~ zZp(yCv;0X6fLj8Ij|GN!y7d{zR0Vy!8wo5&++1Y*holDXqf%ikzIj&oYi$}Fhr43l zDa_94R`bsCmfj)Paoyddtctj8#eFHNH{0IFCtP<-OB}4EsaI^^7iDoTF98Hy(Ddfl zKq$qndomCef^QBrzl53Lxp=ONb#OlEcG0eKZOiCn&t56w>21hVEL?kGErO`5^cu=} z#$M8K6i;GgeUxiyx$J?S`02>;hW8D@*(0=MVmb+OslyhxX$Rc;-v`ruZ0fWP(w1AT zG>sIQgz(D@m5R3JI`&Sdbt(HQZM*`_?s=4_eYT&>>*M#2x6x34S!8yCkm@q%h<<>$ zeY+!9-zf8mEgn^c)!JRD8=BUI8|oMWEB|iJ#>u)%hc(yeqI%gg-_w3^R@tt)-dUn) zb!M;Do&oaVlmx}R&33HhK-Ke}u#t0BuQI*LT$ttNPtumo;k?Rup?jrmhw-@(g2SZo z=8>l^=Cc)m^wBa_t^cV8sbum`!GSZ8Qivy+Vk0iM?kOo)`c!gk>bb3FIk-Lv`{9Z0 zL;X)PdnBBywP^0#s@e7ZT0mGUMc@ z@{OXCX4{-^U7gQuUJN2l57ZSu|BRmFG&b{g=T#PfeR0XofKGg%WTp7Dy-)!{U{JE$ zwy+ zcwCIqxq_afE>r=*BsVVMCe;AYRyVzYjp0#>2*=T{Kx?K)m<~7oh`&!kF`ib|NAEN- zr{eU>YIjXvDCYes&@Kz*-k-eUrvh`tT-Q(Jw{8m#QcI5LATq>Wt~zwdC2x>-*|5I# z1$euHR&zWB3^6-R%x#=CYYT$W*NHsQPY4;8;_dWG+iGzku<$%x9_y5uZzAYdStXQm z8_CLx@+C&Fy>Fnlm0NJpa#OPO=>4Gmd>PpNb&{8*t&?>8-aoyJ=SvrQ^5S#v==+BD zol884H3}QRL>EuL2URB0EZBl1(=^=q=hV-mC~Vu^2jI>QE5w!l9B`#bzaZh9UNN0O zuQE{WQS_*D*lmgb*kZp`sdfKNVOs{d+|qZ8vt28O&z3=QOk-QP;t33OIY0a=%VJNS zi`#%~RQhz*x>S>;x=QZ0bEUy^GQK)#F&oBdGY(Wc&@5tL_A1Ih3X7Kn(`@p zyTzG;(B>cT*Sg;{)XeYsL|Pc|)ZcQ4Pq)O)maEJ?(`-mqJ^8HdmZ|-hyLx4OM2Z}! z<-uRyl5e*ziC>H==2djyzY<#JV_ft|&D8%)^##k3?May@Qc_aa;|zV)K|JEO8+zOQ zyVmVD0~#v)S6!41xLY@8E2M6ksEoc`?uRu-ew9X-OMKybG@8njXD4H7J5>HE?qa+` zB0sA%HqM)Xy2lOkFD~Sru6G42W!i+tP+Z(Z7QsFWi3isI0*K2&i~Xc}rraTeM6i8H zc}yYylrji@i0Ir~P7;(LUEJ}?R0sQ;-?dinQnW6NnmzIT*?URw$FGHBQ{koWI7x2L zEJtdQM4zYs5&MQskzMM3F#M%lH{a{X{t&PD^otq2VlAhO3l~5NmwR%g z{bfWE=3&S=^Hmcq>dl^D8jy{b_6ImCb$VIc+^BhK%h@!|FfhtbM4l#SpttgU0(Z<7 z2Lh#OKEl1YiRl6`t}VxRSOltQ%heofr(#?ihW%qQSQP0U`MUhYzH=wm-%~9ay9cL~ zb1;?+ovRL2n`|URaDQ2d*_CbJ(m2cxj8E&`j>boUG-pmA4oh)KDRF2gc3Inhp^*+1 zKB8#SE~?K#`EhNnOFveFAoz&NV6n<8QXS6YFM1bPgG0=xt6f`8lpeRv%rOFa%htJ~ z>B?nEKR**qj2OboIUtQ7*XdzImE;dPDHc^L#FhAJm^!xS344@Ae1;$&SHx<3iQaX{ z^fQ@yhECH$-Yb7-d2Q7_<`y2JoH9;1Kw4qurK2S~;>4GfmbLT9B=l8N^r?}&TVKZ4 zk1Nfq^PW$F`9r%DTjrKl(gCRZR47U9JZC!&RjPfjHHyh9EOdI9Id$;_|$gS^lSM($eW& zS(OsK*0p|C-7HNDKgGjS*gT-J_!b2?DXz0p48-k1n^n2u#;2H9%~2ITc`b)rPEAmw z@3VwGMyJKKFC~QEA$Q0+qBuk1hdA+s(*5CG(z&mB)NyUT^w}vbtHD-UCDn`f;G}Xy zGU|spiWOw(7g?y1c?HEI_5^r>j6mgUm-;$P#&n$WNc+0yRvU9NnSdwbOil8p_M`*x z^ZA-Gdp+HJji;e3N5a>RGtz~oU64Q5nzEt_>+EjlEE&j1{A9BA9+|1zuvNU1_T{IF ztweV`_N;=BXd+ipWHR^F?;AC9#5oMCuv5$~3>g%cTUTSiF;%s2ylXG1a>Gk8>&Wo9 z0a?tW^O?zF4B{#}!OhoRa;Lkhj$Ot>o_2B7B33jvIvJ zGSc}vz|mrmFx4*$x%BhzUL6+C>J(Lse1+8+F+Rn)jGjiq(+bm+=@cw)+6}(YiYAdP z1ibJFKy|`Bf1Nz{ze_HE#Ru6Z?9f$Bqb-68W!@Lq&F6pY=(M9(_@ z6zmPPaJlp2UQD|2GqIqqCi2woyJ>xT=YZiKc4{R_P6<(g^thc&j+R$N)KhZs3ngQA z!};?`4b7XcK!T-k(eXuhW_*_i9Rd4Vh6;sT?O}E<1NRUVFXpDhBhIMN?2@X@-ji#ZOKH2RVq&~vMaW{zBIr_vNzmhpp5~w)&p2o89>!>a*UucE}PwjVP zaO29d7?15EJ-v*h5JK32NAsv0DBjC++3=s;9-|FkZ0r^!?=_rUP3L~a@6vS*^GM@v zT7PEz7uY=p?z};no9>ybEV-0N9to#>yD}=m zX`&}0AC>0rJXw`S`wU<`t6OVOGPYUpt&oCqJgx-`iU<0NT&r2LaGlWgLYUhA5F?lK zMqZJl&*$*zK8)q*Grk)iyT>4O^ORzw+6B%=Qg#;we{|xDRVy)v{T29G&!EGwYJ^p$g59KIPOLrRe5xdh3 z)}h^>IJSL0mQv$RGRBI4BYU3D;IfyeAuz8$T}!^Eqt-Z3!$a3)4y@>5>GC=~dKaSW z9PcoM;+g;kSOXL9Ew>cKu3(CWpaWrqGyaP@r>ba)+DY@aWHAaVv~s{93eOy1X^+!q z3!XU-d_XWTy{g858K!P4`t-bW_Oqh;d#&n|GiV#Mg;Ef-12%skkDh;7qQ8 zse(|<2Gm1FEivD&LZ{4DP4C)F-VK+aVi!ka_EhoEQn41wXUbVZB@tqMlqL@&#DpfIl+PYUl)jT~c+Z*8BO40&a3IjFwVt-& zzM$RZ*#H$S{I7&FtCuh9_)yOksi~RFu9gpT7IsxwmC*WldZ>#n>-@N&N$>y^)B=L5;3ECJA$yIY_Hy-s%^YD##RY`}8-3$S(RLE+ zEUSG{3Fq`|M{BWi5Rt%4lXutLF5!Jb>mkduLBK4Iy z8Rx4L2?Gr)tEE1^Xf6boSM+HTeMPCtInx)?`f&+|J98pagI3*!&+2z;^sO8Ibz8ZN z(Nz-FonHqx4|VqT+SP8i)?E^ryY+Qt=JlIc-`tX8X`^REe7rRYxcJG~6=o^Zn=|9F zVoUu3qAGF+^cTjRaitjds*p#az2n^{ZrT2*zpci7zP+WAg7!ud>b@!ne1mD#E@a;2 z<-Ro>$vvLaoURWN2_=-<=6q50M!)aU?3`TLu6SzCg&Lu2PbEgzEAj?ry{?UNR{{uxCX)Wx2!nVW*X~EvP0k z)Rwm9Nb-yb3QKeT*D1(Qi6O8mQhV(&48aC1LbNA$usY+Z+i*!|j!|9z&(BLs z!avLoF@^ekj%YvY_UZ7|H4|&=t{fw`TSPfZKHE-GEZ4TTpIW&Mr;uzarvFlT5GvLZ z`K2Cf69FbOBV^*Q$w7{i69n}{a&Ko#`+uuf^&UCr&&H7fTa#l$5nn zc-twq6I-`k+b(>Xo`NyIVZ}?Wz44LmD?%EvP_Dris9FnZLI|-Fj}w=a5m(mYUl>1> z+Mc~|o#pWQaG%FQcoTDWi8OW3$fR++t?xJ9us*e~!XTX@j;`^^9X+w5=rIW6T1)w?V-MF@u{eU*`#2 z7vjC>FL}(2`aCo^yl-3k{FnC}K*DFO=Txk7v$%2lZ8b9;ASg~#` zH;b2Uu3PT7kYt9v)5{*)z2?vT3yd7bcrj2jhdXmyZ*N^j0&!Wq=XAMF=~%hA*QFa0 zKhl+s2a}3!OntuQ(KS%u-TmIY>*`5sh@pq_}H@<6&XT4!x7`vKV$zCB2wqULs zJ~Gl%O|MC?UkgaTBfCNy2K5#i>lxql=2<>P71!&@O!S@G2_fmaG+W1u#tEYr3&cXg9@>tMkehx-trzw?43Es_@14xXtt=DHh2r zcr)H5H1IEwk~dcnllY+O6&P_A3J>U@gtwwgkP=FG>$Nb=7I|NU%`3UZm-GtK8YW+= z*d)mR*x0H6IKp`gQ%b|bZ+7XQfD*Ep{OtO{|0R>Ia)tliZ!n_qp- zd#W={0CkUXkI8=dp%>1qC* zFCex2yixi6O~VqVt%q-Zp3#0e_i{W$-xB_c;SCUR`4P0?yp9=y zvP&5~o>%26<DPxtw}BnHxT7^%Tk9w2*%i9; zV^@O`zh8ik$HTan!N&60v+Y^hc2LrnBDOd5de?f9(Ai~kBD12H3R8^~>{iU(Y3st! zGpJhyr@9C5C`6>5Vi+pwHLoE>TwfD=v zJ?{^>TH`b`XH!A} z7<<*Y{staGAmRH8%M_iGge~P)Wlvw>J{28Pgjj;d_Jygf>CI@j5n0;-E|j?Q)okMR@vo9Nv%AlCob*zU=#o2ikYNO|__N+Zp!$E5|)eVvvzp&vkshoIDvD6t1FJoz~^9yZA<2G zC81U*+45euxBy8R1{cEbVlHwNwPMPM;9OEeAzax#g555Hml@R4V9befHk&gwwbWjx z>ejD+jCi&yt7gJU3eu-8yu5WuiE`hM4lBtLKh3>hOV#WB10sl31xh})e zDoimraLOX$IIrv?El0QR6MMBMhHD0tp025x9Q|eamIL|1xY0(hl!xek@r4!EN1mEf zpB=+)7+>?#OLpQKH2YB@)ivXzT%-T1lna&dxO}%ejuu;(EoTEAMSuGB?NMND20BK! zL^eXLq~NbB67Uz<%GOt~*NZ_zX(ciCG)Qr(*QuMMab8Kyrww_#BaQD(R-W0nB(I^DXO`4vla}5|jP8ru zZGXQ_10moc@<%eGS0e~$MjmB`zhJtXETWe}71tpo!|lJ}RX5u+)mtq4;R)_a+G`LQ zk-v9Ip~8y%6QR92F+6GKN~M2V>xCz<`imrn5EPKCtj1M$wO)lWO8f}&*jfM8dt|t< z-#maPn54Z+mQW}&)mp#y&1gd`N;0 z7h-ZsMZepC`Y2&-upqw@{BvrwH7b`PtthwNN^;MXA zK+bipN$n&F*V+dgH9`Ugu3rrb=UL%%}z%tZaGL!h)uSEAXtXiya# zZ2WM6jNj5ILpIsnnfHq2XgkY;E0!cSO>$^Q;GHo#Kt+p?Klk5f5r~kiim-Pejvc&n z#YyqxWGSqqiaG4T?9K{9d5uGfo?of!g7G|iiO2i5-?d}STwQfNvXq4m0l!=#X(-{` z2s+|vf{A3E0&<#yr0Ugee%=YLMf~#el27Y$V<{*}6dkEK3AF(2@_7Netx}$#*Md54SOrk5)^Ed{2Rw)!-l293)0lR;9;Z?UuPC;=Ai9$Yt_f zi^T~T&E=#E3QHXmV*OP_*VqU1<>>vqw2zIX>~#!ysf|iebuZnJT(D55{DBQf9HAB$ z0-9*Hy_$arda=5b-hCmCu0zx(RrLkEM1LRd@-^BD9x*;1t)3ZKA9#m(*^^l-FX%)r z%?pdd@Mov8BR%`>$(?Jwl|3T<&Q{=Y`wz}w;XM5j3U#jz{!`d{-IyuF3JuI+;d)?u zL1G@mCXa-Q|HXzfRd{z@=aUL!6>UytEP4BEmN{77PLIPjK{K`tXe5=e7l|B3V0G{> zyn=(gTq`4#)054o;jt^pJ256sY#6ll5GN>?WDz^NXpAOw^^B+*sp^Qvw%WrxFK`}T z8QS%cn)e49QjrU40vXb@jg?zhL@+6j-E=){fy2nn5oi)A-Y~f%18&ZRS>e%MG6FAA z@jhmV4Q80o^)A?gw!&rm9aCFIwq`Xcx4TnN5fzPggXatjxHakeI!=biyHE;Ro(fbs z%%z1{czVM!PFeICNa5S}!YA;5%uRtN&#nwZz1a1#(A~q9^AkaejvnHXt}@mkZ!Ob( zu=W>(aET6UE#~To-sFcI)QNp*8BNHJYR_gZ@aG1o4W`V#gT@mu1QNo=VDX@1~nEr}ZW+19)<&Rsxfyljni!0fh`CrA?cl z+O}`IQ*XHKt}=f^iD!3q>qqB`5!OIED}rt|+D>g0y_3ZV=WzL9=-RUmXl}AHW47?Ao%!+3mChzA8+GRn zGpJz!8&wnLVx<+$GcX!d7CNtVPjDeVP5Q%4&+^+NbQ1Je46tba=RHK)O!jIo{a!u& zS))Gvsn6Z_5Yt@Zio0dX&zc(+4vPrq2R=rR+PxNP$*g@w=AATHjtu6SRZUy?1oAX% z_^kV6F+IG)?B9P>&vw{akShh0T#Fu*iiH>b z)YmYs5>J|Fq4o9Z1Cb*LBK4_|{WVr)DrU8Y5iv9w4E*N1-n}711+I~z4qsBNx?f0O z7hnLV#h^!7#RXet!S8@PxkA-L=T#++&F;HfN71ZTWuTjF;MxWeLw{CEnr5~ANDJt$ zuyHi?2~5(nyZ$nhvyc+$0gC-jg9O5Kxil-Ua`l4Ys*x^b>qBMhg5Us$fQr9u=|1sg zF})>`X6!~~loO>i!TWgX3r;}E3y^LQp@rhCVxCz-I$Vt)UhJdT^6Ij_OD({+PmY+2 zEfdPP3@_|W6|w)F=!68tlKT;pnd+;d0!m(4x#e;Gp?TLsd(=#0gaN*rxgP|jHPY^O zKdf+TAX#k>6*sX~dh7z?Xn$+Px&+_4uU|d67V0g!az}_4;y#Gt7_AQArmEnNYZwA= zB?=)ybg6`Q(?6rvjPE3ykwItHiG3M2!B-`lS>$_`nYjjMijgyatqMzV#J|d=Ep%>J z{p`w%_sp8YQR&4*G7B$2w8dHI`~9mx`(-HkSTKH=@3-2>eTQgFdT9j%)4dE_0}~5g zz_r9IAoDC9>-{@Ogysw$v1)fRuG4gW>`DpjegVB{q5c#G(|vd9%V~)s>Q{m z?sUIRqGwdK!N1xNE&LdhOU4(Rbxy#**12(L7neu`gR1$uWCv1nMm(|3M?K_BQ)Hs1 zs$p)mNH|x7Hfll9Qk#&)@5)5mUl`4h-eg% zr+|qZq11@kP)x3~K5t6(P#d&!1WyU^B&UDkJWO>26uEP0&N+W5S(jX_Fq6JH?>}S5 zu(QxvfJZ`4Iv^N7-O^`7*O2rhDKX1DNSHCMMH0dQlaeI^9DrsVK;KzXD zTrlb(yq!{;GY_xBHr@L|j}GEgp1#Gi#2)ieEFhxaTpAb# zZq4uG$M^fS0Nj0_pL6Is0PdgLCXq=}>oWtlH6*YN6Uci|=hDY{xolhHH|*7s#6x() zgjPjYGVW$MS_VM(O#&*aqStXV61Y#%VB}db{LoAOL{>`qiQK z)J|RIm{V5cQ%N%}*_WJGrL(6^JiKLC*aYF}_D<4%P9`3l9M~6w)vG|cgyHcl-2Fy0 zF?>!vk)rPz?w-nJ8a~+w7nzNMyu}3EjV~F6#Iimc@A-Ng>SS<41=6k<@#@KOYu`~I zi5cgKYacQ+6x%i}bmy%>_?HVEmm_o^Jz($F04qkwYGrVlvBM>W7r4S>crH0sYlafKvDVz+l7Wdp zPQ>8EclY?38%uNXE(tv8#ZN!Dh#}4zdQ2({UhDamFZBYleq}cOsv^g~48~~H)SQmc z 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 m^;h! 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≠>lE2ti|in1((-T9h)oLW#7LWTp4NW@ao$(5nGxZ$PV%OnKg}@Nw9ry z#stb`COdbi7Pu>B{OqF;+j$}zsMyapjIwS_1cAjjWV>LJ7j*~9YagY#Wqp7#gUAmnUz5Q^ROtMWHw`glhqjBU`Dc58g*TC^pek3kabJAfcnc$YPm930{`R*yZ#S(9kSqG*31v+Ml{OKx&Ehk_&pnoHPA*Z&M zotuUY=psLQ9Q1`6b8=rljwjN%U-&l=k1ejx=)BXPr7rFjY#J#E^BSSvh>nXYI2)O7 z>T;`Jy?p_%{NA^QS8kosA1x0^NO%o`s5|+*suH0FYTE`8BV70{l(7Du} z56RnJOseSBE^j#vK?oD%(C;ZK{EP-_^KVmR1G1wlHl_=44CUN711#KFA2jN}U9q|S z;VUn8X<$PQ`-GH!p>b(yVCx%c_txf<<+znT+wGOC?Z;k!o~(5G+^=f13@_02P7k#9 zv3b3^YScAlxFT0N3e4DOc`w;|Zz@(05}~GB;s4RkU4o5+_pH^QF%&A6uzXK*rnlRz zwZVyPWpXpGd>JFMU`=B4=C;^E)0bO>HlBS7k)8EM%lcTc@(K3kX8VdC5s{G_>)UH$ zTc75fM!#7Zd2f4c*F^gKH1dw&odfWM8byipU8KYK9(eh`Tr#v%v7Y zab8^vx2^|OZ1!w7(z}nZKJr-U4+6>9Q%C%jyF6v7R6KMr;`pnU*UfY0Q*iDvgZ6r( zAdNW4+|QR4cm#kR)c+4e<VqZ4-;ZN#YZD2u7RO{(wc?!sCg_-jY+n6A9AW@U& zQ7vLKstnnJk zqpbxnAxn#)0?P`>VMgt0VTQ#NM@VTu-G!Gx`F2<#U_>E{K;i%Qa+FQ@p;rRG4g9Ja z5ncVk%y8Swb#ru*x2QueL=j}3hIjt&H>Ajn8TRiX_|P>W8`(A8ZWrg7R~(UqhuJ_% z2uS4LsXs95SoIs$Ee@w%YQl%tixgpSP4V5nzzdNd$c7&Y_|fM;80joJ9uzy3-v6+a`QDfw z=pS9B#|LfE30?OLW@NpEDi5$G7XRQ>i+L+ zSn7`|mu$(Pprtes^6UQu0u3KK`KxyZF0u4^zg)8G2?aJQA#^T(C)GQ2u&+SGhh;0i zD&p}S?Rr6;vjnC*>+#PRW8Dg;xKjXZMLd>-1_%h@)R+^0Z+16xLc*Y?Fkw$&*6tSL z^UT7gP8LPiLY6YS_jt^I1YSW;5;U3atKg1vS3?jxu6pg-H>tkPvMlYu z0Ny_-IY<~vRSKAx2*trv*C24mHxMT z0CMFfs3#XwVES8D9wk3|y*j(Kh+Jn|vBmXl3Vf8gmuL#Q6pGaS`e|>d zj1X}|NvbO77Pe=t`LW@5H`Oonr43Jq zMrCU6nQq)n*r7+lUF|v)95={*ixX4#HQ{im)$AIj01KYR+hwpNASUe4ysK(|?R96@ zXk(auwxsQo3!Y8PF5;vP5YX2c216cJHqWt5jZpu>-@gaJd@)Sw2Hj!mx=D@yqVjl}|Py3!5^1!^j{|IWM zd=*Ude>!RE$_Pzh&%_-fVqvAp+#@rNud3GXRX-M1hXcro_^XpNNAg3YGt}}JF0Xza z5hySRCNC989+~ZhNqYWHz)eP&mI=%80k402MM$Hn0*(&)e=;auR6S~^i+Gyq=o?+z*Nz%@S_jbSC>Ws83>XWT~g9z_(bQ(_#ToSBFn|p{Q>Wh zQK)N4Smv?_8#uI_|3s$orK9R)`Jr-n_{~h8lgckT5E9c4xwktgh9)G;_l#lXsx|lx z^e(&W^YrG-xVFxi08_){U)(TzeNuHf)E8U=q(g9RWc){ZDn~)wyLYmBdV0JC#I&?W zj7Jg8a)wN2dh1eO)i2-P-p1vrj4|(29c&aE%` zQLQ)5((`#WFmZk|P4gTNJJB=GBff85kIHZjhb;kM z>kdq~D=9$e>Uv19@0}InvGztqrI`<8dWg_xm5YmZdS3S~Cw3QRNoCE9SR|437(Oo8 zF=`zGWzyZZLONX;9Y2!FKi7ln=_&%VA*Hsakpgv9|IzMH4y(L;nSn0nL%#W?E<9wQ zkVueFL%igZphM-f_@c(h@U(|qN^%IR75nAn)2afBZ zO3%P6KXjQ+%=?p~*u8{MGiQ1hL*7w(*4VGZZf79*kUb4eWyf>|=$Lb_u(*_vKFnWe za6Fy~;3MGAE4NNi->fHBU2wFoe|P$`PjQ4t@|AzturN`p`4g5^6GHcw-t)X)g>E8& z@vnpCrT_W6Ya@|eBU`ikJN?saqv84Ql@WJ8a%T~3m`(|R^J4^STDWhe<9 z2dlE4i}A)hXE6T-8G|4#rVL!Ya|f^_c**dr-fqd>Wu~m%l6wr4<`N2WctKiUF%0)pPpO|_(ysw8sV;b~h zD7-ooKD%U+*=z46aF|o60VD!2DKWXWp>A%}Nj#(`KjfBox%lngn+)j_CkmyUqZ9p6z-}dc}8(LbMq((8+_2bKz9T3ta;f>n>}mB(;uQ z(r4$ke$kK{#~GB{KbK5+0_Xxju9ETZbO8|8&@H5~*}uNVxH3FlyvgrC$mf-vMB1t9 zCp1RHQ~Y*q5pT+DsqoJFc7=wJ+36OKv{wD@BP~ay1+@7YJ)vARm5$0tC<+*`_YmmZ zDWNeckoC}F6}qInAhMT6FURNwgRb`6%eRB1S-)_eYDRAA2o()WPZH-lh@YG3%S*;E zJG?xcpt}t3#CNZjy*94?>-6fnRu+rhp&JsaKDg$;YZvnSg@goL4!1YqWjK*B#D>vA!sBF zVypR~T=#xG|M`R@DXxu5+C#|K_!PQ^Vv&y;s*){P^2FigT5jA(LBH=B(AL?REArQkCQ}B7q z!>&Z7{k&vQ`u(-ee*k8`g^#a~pacJ0aDlT3P;WeH`<;2sZz=Wi8zA_-$s@a` zXGsfC*K`wI6+msfjm{pW<(E$eO_}D)#so0IK0GIAJO-qa~r(1_EY|#zW`Y-w6XYY)OAPu0N zO;s@A=83H44+HZy?E!D4K`iMD;?_I*0XeO$V{plig054RJ@@Km(RSdp&v!+ow&H+W z0VJ0N@9RvRmLHo2;yE+rtvg%xn)Iv%pUb|@8^7I~$md{z>(mz&7Wa~J{rP(8S4Sn# zD~p!r+|@lcO=BH!XxEx4DNWOl=qr~M)Yd;tiy||y0gv&h2~g0*MgoO*#USu!A|>P4 zxfjkR_B#8;b{plR=N|6b4sJ4C ziR_Gbg~`fGAV@t}`*~u45lS)lej(VTgr-8|R*(+?2*`Z!5q!l++oGHO$?pdP7@}3w z=}B0@p?4c#+&fh^zA}bj;Q2ssEUDsd18BO84H9pR?&@-jF{%*;soqWIa4&8vsKw|R zYG!j;Qqb(q7bB~np5LmNtl0_4ZzO%&Yl7{JkbiuK%KohTfgL zeyO2IN{~C&dejRVz3ARhnx!N{vy4~iwo)Oxl$D+t-rcu}M>X?%C_AYjCf10p%{$0{BkQGf&vKkest!U$VT001Tt9m7#I8bq1$u$>BxBP@BDNrwa*F5jq`g+qDV0zR= z$`Z&&055SDq7b*@Y2w|#NZdTAC>KmDY;itbY|EbpQd#%I7VF;im^trR^Ttx-Qjjz_zW%MEU=q~69Cm)G4ND0^z4H+}}5Kj{B_qI~(X|D4?~N4qFd zo8|!9s|*)XCS$Hlj(j>@Ne*?P>MUiw2orbdcf@iRcQh@F_E|5*yR76g)r~cZs#lw= z)0=I7yg@Wmwb5i$ie3Ju?#S}FqzZyHH7uBCFrhPQ=FN*G4i3gfE%s=}bR$XP1xrrKx~yF*3*>%uGsc zzuPVRyz<*(s|?nn%?jkr!A>lAw)V;=(+8K)^;{9kkqVP;b9FF zomdyt*%qMo>dg&F{&A{ae&{J-r;qUu5(Y!A7>k}?3_FRLdYOmS^%pHY%TM+jReb&^ zQ+l41ACoUQub4(<0l-_a>0S#B$nW7W#n_bo06d+mlT}IZ@}(FJpOf#Tou;f)!^I0T z)&(vtENIMqDx9&OUv%#IWS;NX7+0fPOQ|MxS@k;tvO^JRu5CmQ|FFGDg!$VJ=W*pu zaI`n_N9)ZB4X(XJ2AI@dj581}(U0<_>vN-_oiL1x2+*GsT){s41I(kH8AEI0$^v3)XYAARWWpw@yQzzX}&V{02&&I?7_pk2l}-YWh1Y*4E1E85xl#{&Te;VY=eM zx*kPy4Rs%bJb2+%@uhdmgQk~HAe_&+VK-vzYll5maZ~Q0uR)hPbSm+f`OCuR%+1TE zeGz)|wC&g`*gUX2g4OrdPL<-%iDBpAZ@W><{VmJlJ;6IWsptW+6u^C@a@<|BI4$6# z@_iP3@n`MJ=;-`{0(U&5)SFrx!A4nj*o0v({sOs30-9NdRHM%An&wylK?}CN=nfR*60SHb8WpSyZS# zDvPxK1xQAF%&&ci1yHtZAepc!n+wmT!~U?&>an{##lfZAM*7u}C3%t&%2UA==ki)@ z9}CF++P)Fq0{6(7D2C7w{9{L_(Yqa(7ObAr^|r92z&)w;SBT?pxUX$ue(8W{-t6YD z4GE_K$z`YAZZ+~51Q;|Yq2{a^a&-Dg3KK63+XY1mYt9!*^px7jU+wqyy7;qthN1?* zq!6r3A8s`<;R2YT$6*eChOo@_0Pf`^RH`mbX z6%EIjoR}+cmh=*KpL%{LA}QImXEHJE0smH0{AY>a7B{#To56BGu>#Q-*Y%L~jZERW zGtM2&%RN4S423sqqMCzWFQL=;G<4g&l6EFS(7&P2$c-H*d24L@a~&>J5}oBd7$u65ncsC@EJxePIN3h zdZ(+WoQfRqi~JMRQy#>A|3;dx)1wgi*02Syt!c?$syRNAFdp4Up1;k!MCgIRWyv*; zu9;l1>YxryjtNc8#LMqf16Sfw^eT~PwjeI;`pD|@e&LdN7UyIWj$yDXkDfD=>@@6Wn_X;U*8g7h#b zx2%S3W^CLqd&&N#FtSts+8nF>^nv?RG@NJ}+G=c2;Y9V(2y8_~0Bl7Lf@ zAjfdy^Ixz0%%`u!Y+W)i>Pw?nPk8qww$`pJjq6x$j`Pz{iS1kV_)_`thLEb|(dY8a zdU_!WYQ_fc6WJbln^z!t3q0%miZJF`y=4mRc-SvV((F6_MqP<6Qf}|sX6EL|)f9r~ zFYb15(BEK8^1k%#4GTQC`_VZZETD^248k4CC?4G4hzLw#8E-zDzs>#4lcQ2hW_jct7}mw zkzZ0D#-3y2D>5!@zsLYBS_g4Pai1&>3ghvDYhe~Z;3k(-dw55B2>mu*SFraBjmSCOLAzr5 z?48jvqzE*@ygQ8zNN7xPRR=I(lq$MgbBOEhf-@1oaZ^Os(oxDEuH6e^Kl4&hQ3l)wVG zw^@?2%|L89Kq{e}7^2RkVBh_UAbafLL!cVXfe@n73z&RPFGiGNqGLIiSEJ}Ne8a;X z<{p=b;K_w|7v27%_?mERF0>pT&np!cm|OMn*HRl@A-?_6){~X)3F!v^j%+f$H``i~ zjl4m{f~C77TA@M6UJ`eT=-Vxe-|jGio}WEW$*61#)&=T^9wL4Rit1&i^cx6Ibkfsd z_Vt@w^uac^eKrQQFo|2EXThqAR|oHp5c*SvPP}!PynY3oXgD)fa5GVJ(L1f}P`H(y!Or2Eoc`mdHHHZJy(p>~`~F<%ZF%8V|B{Bo zsacuxjR7-0t?pC(-^>?-AUZ}N8w+HqCXr;&TVtcPCgrOhEU(0{P52q#?WmK;Y5M1f zYbRky{%-ZTqK9*~FFk-%)I{K^=FVpM6%i#X0VT*s@9CqY9Hw;Ajb@A=#U+h6bR>UO zi)94Rc*a)`5Zy@T9W8Mox73AWT7C`wG`;<7>@wN?)#<<)v6_;M+6k`ob9qiG9#EO# zIdH-cM5MkzHyd1mJB9ruk+tV%(l_rS>xyOb%cG1g7+9(iup>^-<1M`}dI4Fph|5z6 zHYi%rF;S8fs5@)A)6Pb75UygRJZQMovL#JId+VuM0mSxT_!(aZQ!9>oJWw`3uV0LGc&_wx~jnMv28_{2{wXb!lUV>M?_8ATb?ZD~DFE{^usGXFq3iL!RK4xpNbBruxq3mm@krgIu11Vf=}wAq zhXtO-tD@Be4D^*sHJM1t>c87NbsffBsX}%}0#oaBRWM^NSt&N#%j4F=`_Af4ElG=c z(YIN9HI*8rfU{KGt|p0ZejuEf`%kd+8aC&uBmC`irPWL}J!o}3nw`Q&<;Nmy+}zl? zH7`_5H3)OGw8zrC2T*vI^=G5r4!2kt+L@K3L3mP_c!>9UTFtkyhRU(45q*rl?gt}{ zK%5VSMPG|_dV!^%w|-v8$d_7q1#94G{Hgs{jcz9S+si9y6JWRx*~GPZZ_7K(FrEcb zMa!iC0b(=G-(>O8xi)K_1rP*~_ZPxfTTQDreBys_)yuaD;Z-e$0HfxB^W|U(Jq7N< z_s)M`SBvdr`?X}U1}s12*%bW~b_F-I%$Hp`RP`ju{u9Xu$smE&0P^*_2~q~#g`Df7 z>E+_3Gg9fN41t;49wx<_Ey-uEx8$hha)^A{te`d1p6b;@=X_3irF371CYjLArZbc+ zzaMhJH?~%o6R6;0K+5M@efsl@b$U^fHTT_9-CPO`4-gVC&ma!8dN#n(A$JD$IW|45 zt1(M|8=fUi!;?G=}YncqOZ=}dd*> z!9;KQE#oUc2MP8Y%PC!TZ_WHLFZVjmXMsEE-hyC7YxA32)%V|@eKoRD^86H@N%;$qoVw#2bYtZ`L}}`kuU5s@k$M z{XGU$Dkf2#^nmyI)=)~s)*(;5kjE$69VT4^%9- ze7Q|Ck;wj!ChEcSNll^6nzH~u z1_6F}&c7(aR#ssLHXDLa58^nDq57rO zbNyEN)|SP{B^wcU1&cFx&n*9@wqf}6=p_+NTLC6;P9u<(xczgu{4;F(!O3W5g5s4~ z(VBSFLyo%^7UyciFBvk}x6*w9W)e+a;pyVK+7!T_wvi%h3NU|MO0v zcBke2s8%*4FMg5$6Tn!*%I{D22Vo2p1s(UXfCqJQy00$)-=s)ae!tx*lH~IwT-}vY zH4glYW6`Hq;33uBCJ_~W?&0FiI;U+QOtCgjI=w5kTlt1>+g+%yND~gUs~$it@BD%Z zB$dkfA!O-GR~B>bI%;R#kvw_~1(@5p`9%G3OPDM(P>-#%(HXt8AN8`8$|1CPT~gwv zRw=BRbaOm{5C@5Rs_}vwro_em7zK`f;BGcDQwq(M^xto+?o>?uCB&mFIY{`)f zZ6~>qEr5S6frx$?>d&H%2^jevE_a9(@hB$~Empp>qKCNQpVCMcl~I?I)?w?wCpr&f z3d8Z2;5>{otXYLhH_0~aVJr;?u{N7lrNl&Mjyd7Gwy*69I7eu#(%P!rl6RWwD}V*5 zrZHz^#e6TEJ8_Z1kys$^)vJ7Guz4#r?A&?~yyX6zVd+GdVAtua@@@+C`teZpOa4g8 z*(|bk3WKs@y|mlz+?m6QY+31?hHED8C94}N^ZD1--P>qX zfsCWMi!Gm<_S8<>8a)J^6cAfcEDP!QwD#qXqOFA&Fs>@H6R#S2-aA-lbw+aBhAv`nxbf zb-6VJfU~t_n0X=^xOHmOd?yCVnv%!oc?UCrf$Ue~x~hE%zUBZVg?2`b?!+s8Eu`yO z6Ly(D(!b6sjz?($IAot(-*U|$ZggUvUnyeBmF-=W7JK}7%kDwcI)c`TbAjPijR_wm zTgkGrNOCU61apL*VHP5(t%UvMtWe*y$|d^;;y^gSrPe<^(TMcP(!Cf2OkS#d|aIIwqrt zN%(H;VHf6+=qpNCt8$!)&sUL{?6@3Nk&$7XxkkjB%JI1!qe zwSMp|o&As~AToWq?k6rZi(PI_9BZ_>N&J>nKAa*&#*d1FlN}RZ`4FeA&Je(-yg}}I z{XY$^ANrb6H?nrNmiKxs-^%|1uwl7%IR7ZBl=ZpS% z+_R}rObO_)=v}qR0p@mfgTbGEWl0r*p32vmk+*2vPcKeP^cAjK{-ZV;3ly_Wyv#7t z^1Ca2E>pHe(OX9JE_LZZk^fNiR;(-jX4OpYT-U|AlB`KDd8r9b?2g?bl!KA2^cj83 zA#Dlt^#$4=LxD-iSii$bNDLfI;#>I=@;|QLJD%$Q|NrOYL?|kft)y%!qX_!naJ1cVu6Vk7qo2886nWi?1! z-bX@~shSnI!eIXDw8ZmxP=!8Z@d8AYM4?ylz&NPTw^p4i)NbZi4x^3nUNz+Yz#sZB zdP>?Vie@zPxbx$mgI&c2?9NA=(`A{t7@lRf7w)J*<-mE8XqLtsmtl>>;*r)xUC~FF zE$q-GhozjDkMf5WV^C@RCb45Lse+Lo|D#-{Y-rqGiSOJu}VL2oHg^0?%3F#5IyLT7L4WN zZM4{fW!{vVG(=A!H+bBBmPhClJfTt0VF(iWK;4JBGokpU!ehT$Y-=S?@zn6zL@9rm zPzU?ho1Ry&B%ckhft-sw#O*tg!Q+$vx}PK5f(Rb}DUr%zsLs8(|}T{>kGbn8Zib2ks4!$IPky zc^iu{`UG>wYDF5K^$?gl@w^pI7mFPIm;Y9+0n`flS{RcgCWI-=T#K>e0Ai8-*4Hl3 zZIHCLy-%S%tEdi9YP-@br+Obm#Lj&?K9-vy7_JK3^Yw{Dyi=2RY)sr6RJo(fMo2c5 z1@16#18-${A77I=MaEbo)r#m}W`U20QZ0G8XWK(V#W9NLEx~uA2h!-sA8ZmUtnGRw zHRg)_qid^w3*FAIB}04Bb(kau+YN&~cT7{cOt96v_!Hb9Dq*}d+egldc_~@s)#E7& zp$d@JPgHtcB(sk%^IB&xtC9_ECpcoSBV;8xK*1=%v>(Lmzi(c*-k*XG({Vx9 z)@g+&jj?@PjFPE8spRPlB0|Bbz%jMZ*K`h{dQE=$F13Ci62z;)D)JKgt7m()Q4w6{ z{ddG))p5*=3q~Iiq~{DIW-h*G@Ky3{Y27Fd;V7DvR$tuN(=?-Do*t?>g!M`txt_v8 zcwe!?)f<+Y-G~kPFW70r$GE%-D(fokku51-`FFn~Htc13im=~U2n(Lch&mDx< z?J`-`*=zsPDEx$2Q$8`$y@wGO-*B>;`4rE8W;+Enm*PeY>R3a}pSH+-oqkPuddoU_ z8ok})(^{4c|7cKN>^5h}?Bwec;nwp?7XOWrd=voZw;J82zCkvyIYB5nHS*Xz)42|8 zYO(S7@_E^jwIuHc3t0hb{EwNvIINweMfx9`vlS>uft(GWg(1rCcKp5}F4wWeCOITX z{Q#c(_0;i&0r%e1f*2jpJZ+8)+Fw60nV5OE?nYYcO#FoEdc?<*(4~zJC+JW2&4ElP zcg0T*>jYaGpx4+sx#~i9H&yi;9S_5IvKX1afr{p=U#Ki2tHg^cAxx>L%>U51_^TTS zl20lSEUjSSch=)=lWNUdW8Y3tjFst!|ItIuTkm%jJv3&nSx4^gpf+Pd?3v!o#_>24 z!SMWO1#44(#v}%P{YjILO`5CzRNx{9m)kXPRWKQ_fY8k%ak;m~jMpK$u z(rA3q$^J146epT36_{OJnEV%qu4VrYGWY+$rBdwJ+m(`_Wl>iule+$p-~3f;xmIGY zAjE9r_j7adyz#z1iMPrIg61**egrFbO~T7Vf=@b}2l`~8EARkBURU`5^too1r|R;I zWym#NpAf0PHwS+)EI%b^V%##K2D4i@%j6ylN5usHf+hl+9vnBH#2 z!4ErWdR%b3MOfXVHrZ)g3h_6|8wV59`=YMPnOgCFx4nFiDqgDIgUl`HH8dOU3^*1O z>l-+1!NNcRbNHd)bGq^+LBYZ9nPatQQ4JUJ2E{slzgMny`coY*B#A!?uBTFj?cRv| z7tF<2|4rlROd@U@yyLQGF#dF>v-6pd=+sw=2dmg$hu8TCUG0k-ll-IBmy5dQ6Q0s2 z%F`*K3h!JL>Zn^Kjah_$LStRJxczwl5Iw2Qnq6@){W%{l%hlD>GjaUw?ay1L%zV2? zx#R;)B2&F)abEbd``vArC*>%W+)UaXcabaK$IG72Yfalp9`@euaD?#um9!hb@x>r9 zVQY$x$84UPzNYxq+vUIp^b%J|K272dMUS!0gF(YQ+-qBe5hEwNjuVb2KWw?DemGV) z7wxrbD!hJ_m5?d<5quCF+7bAiwcjV8fidqanpo(>0ni9<>l3V~{ zwmbrC4qeo>2|#NWPXVcopq zlU=GTw09l#LK>z{K?ZAI)$U2=4xK~|wSC>^pz)OmVK3U0?B-tCpR>$wx zu$d#;)UpN6E~e?%i;5f`fyn9Xnv^7YGTg8zYldF0)j=5tnpcBN9S9bO58FxvpW__` zgIX+%V-fqCO~mLj+d_96-Ex7()SRO7O<&@TvIz&zFg&>0X?1_x5x1XQ^Y+N+{rQ@Ey$=x^Z{FrV}tx$}fM0i)TkTZJnBXg`!NV#+pq~4r)?CcS80x~^OB^|f3xWb4C$cTotu5p0%0*t zqKAl^LP|aDiFnlrzI$_VJH;v?2Ryh+muuQnu?$7jqG=}CKT1ky*muskgj`w@T*=J$ z36_zxaZU-kusH(CzT9*Bdp8HN>84EcM{09<20W#ZviZ7o)_i9H8xBfE^nTZH8Y(r} z97giAqr}rO`4i>S4s^|*(MhlJy#_Tc)3EBylhc-={~N(A6Er#EvJN&T0+_Xi02$c>nfi8lPpYLXJf5 z>QC6*YI8in+QM0$bh^sN=Snhntd$!ujtH+WBq@>|3~mWNOD??}JOx$HOWdv3(sjJ( z&5ig-JDLCKNZCq0^Pa?4CTAjfRl)$uYOEk z$SU&~p!aU?Pp(3(yR9!QN;D-M3KFle@p;uw;SRewE>In-$X5+ng)75XOue4S)!Nm) zb$97Lk5jRz^T@5{jhA0|QS@TM`n4k=Tsxh@-lNEz1M5+63**$)2$@KjMuHb zKyy-x<~ga)n$F~W%x0SuY$m!leL8%VL2xNb3wCQa<;~Li>Yna^SaziSS~TD7upTWPfdSbdwR z<^Q@3&fLY|AGOs((hiq2h>gr`_Y^kmGkk%x4B6;FGb+dH?EESk;Y#`4h*Dadq}0>v z-jTn$sWpU@B?h;C{0PFIe*VeAJ_Gx@KDpEE=b;KoAu^i;&hz$I!j)4R==4#6x$B0$Rrx;Y=@GI5LVlN{%foddkMRwo{}7XWSvI_YJsR-- zh%NXzGkz1okAvLg^VoW}hFx_m&hnZcP*4{HiLgpv+kpD2WK|J51m8(^*|>?50v#mE z>=Yjgi)!KglB9!4mv4)_r2Y4MjgfgbGg_a>g{1QQ2a*AV??IP%7StSHzjz2ED96Xg0@d#*IbY-2dSqx+@I;i@ z+AL9~jJ$saR+WkupAbN%AQ6COEW9c{`b!f#`I*O^!qIwcaV+1hg6O}7BK-fSaXEY7 z>yXCXti)y#@`eIL?5`vte^0?zodM_SDnFeBcjE(KMFv8(#gXq_$8U3{$mZ$ytYLFy zZj%*kEd64SGoEw1ZARV6qam;!r{S8k{{7ck2E+p;mlmf{NBT|St~y_yVP8ZoBjE^O z^(odztK z9Im~e-#!$Y5FDxZ^tnY7a+rJ*ca(6d`rw-@#M6X*7FQHEEc~QTz@*Xv8!&8=r#8V6(k2*5o3q$12apL1Wwu2AMDYs z#ixyF8umm=sD|RdQJEK{#4{N^U8oni+Nn?&b~4SP^w|%+9A;T{%GwyB$~l z^ak?H{@9@vJS5l~fFeVv&$>0GQ+ z3YVHcgHHDO@ybi|);5>md1aU2%OgSf0SFE`4TRxRK_8NZvXfmjVmIOwN@I9K?a~-Y zRQYdhcb3=RSL{}bndqithPxEJnb@&p=G1WZut5&~abwa?XO5L6_i-LhUvwvWVu8rA zt9fx6qgB!^;*IQ|k2SKOTOP1w?EKr5W7lJO@BV~$>2e){-R;Zt%n|j&Xbt#(U0mUr z1TH{Z(*TKINI^4y!d%H858^^%8%r%NFz5qK8k%+nQ%&nuVz!<^mNA_}Ejw)UWj!gG z0Tcdt+#8OJqgb|Fq#eZ zP0luGE>DW}B>^{=3eUT5SN9|X#EY+c_1d6+4({l8m(A;S7cmea#?_50xW}*WU9MY1 zs&zso5sL``J3ePt1`&T){~fD&<_j^<+9icI8Vuf*y%215D_LfjdguptsCw3A4-dx- zjGRuj3i02-^b09)>G}bTW>{Jqu|$8V%ja~f!z+S>5xU=Wz-lWB!Ooq zSNwUf_gV1Ui*TQ|Jz=lC2L@c`Ga?~V((MWhm91K&+x+%VkV!Z(C!pi}vGmwa)f0-hx4-Lt%3C&s_;#n0SfX%P-e7{9^7P`DjQO0g|*edZUAz zbthQ*HGDNYA(5=LaHc&WZhFE|V=qQoQLCuC{A|is%3VnN(QBloa_!fcy=jAI{Z5gq zIAn|rS_F1z;aV;BWNNIIYi)mu$i+dgHyhDpc-ZWy z5#TehiF`qU*An>Fl6;TApE}>&7Kbg}Yp1eTD~#k^uig+0{AZu#N5D+#Y?CbE^yS6p z&O4{*f@dZkxlLT_nquN2MYKS%Hf^yRME15iFTI-8nl#^Fr@Q9PkHNu=f`S5?Z5wSJ zUCy}&%aV`DU>WP2Tohsl%tZxuee5jTHFaoG@KjlRk>6MI=uaM<`9;_je9m2Dr>vU| zs@Pap)fP9N_%Qm3K<;t}!+=7{0aOMK7#X=C)9P<)ruGencc^UJN8b=L>#gNPuCqm@dc4{_>ku>@U{)+!%4}m!m{h=zaahdkY}Ji^s+os zk#_m2;G}%q$LJz?YSLwT18fQkb1gfG%=+7wgU=S>o9^_WYQ~VRSK&NSQNr<51DgANSF$OEhfx?`u_w8%yl}kwBFU zxp`y4#R(xzh^=lEq|k}6l$Sk@PDp406e?MwfhF^mf*ZWe_eiJV_e7iHPb{6le=kc(Ps;VW4!LN%3=1g}X{Umv8h{BxY_0(`z-KK;n? zhs$0wmOcAo5{ZNWUe~KSq$-+v7my@r3o%-hXl=$YE#%6`8Mx^vY2%pAbN@cY*wM_X z(9y6XPI3aZq0*{(_$aY0OV{Qv5Ng@xd^0 zNEtC=YW`y#yHitGHCKgx&HckYUiN!#!I!0Vl0$IBA1-=jtn+yi{n*}C8;|ba`JDN3 zTunfRj?#TmblM^Lcy9fq`GhqL)&Ju{@Y=+EQ*%^9snhdfhnl9MuzZG`GYvlrv+n~< zBpUa&sU~#%%OxX^0PxX{r3okz(-n3`-T%L?v zPBK})`S0xfb>RTB7{S&=Ia2?)1O0$8OyU4%1bAFekIE!Y>5qOgdnV#mlMfk>`f;bm z$+)go(aL*u-=Xr;2S?1Mt(sbEmM43iRr&N4FaopZ5BJY93afe;t#HPAkm20+A(V#T zOCsNPcqWr==J$u2A6E_z%P6Q_*hAIt`i|iS(2t+eJi|ponDj=h$MYp?AFlf4C?1^J zQj%3(FfwjJ8cNxlk71tCvawvz^|Af>I$;l|`oo&+=!`5SAZ5H{DC2=br!mFPcbLa` z9)7zv4aX$9Vs|g->F88Cx^Gd80;1Ze(aC(W!`RD>Y1}@s_rc|(?O5iLje}6j(R5lx z!Dj?!WcQ)?Z3vDAn!dLa=8Dhmz2PdGQDfF#@$X!-y;SxCoGah#v;zzJcNu9lWiRl%~&PGgmVU+6@$RB9A?)oSa;XJ$;s#u9{DqO}JRD{qqkvuX(uU!cG^& z-@2M-b>A~GS`gk1(|7shOd=+t-F6dKptXq#_YZj)-gj~lMBDBs-BsEi6cMYA$19gT z=oWa1X*$28@hV)@{p+z!gXO0(i!Yg6lSU&wd(6Ero9KCaZN*O84Afb!Cm3$tI>Hv! zO^WaTq!`5<4=`6*itj9hTr|QO6qO$yeq5V5UE{JFg31eNegbDhTb$1t-Ut2e28^qN z(n^Z=qIW^kJ%!=cC>Jth1P;{F(;s=|T+dBJNA0 zjQ*0N*Lyx+dkRJ@l>*42&TV)Wp@Q0IPEO(qBr0D3K?G-5nzlj0Cf$OVf}*0aJnxk{-1%M{)^WeaYszzD zW^8%j&bpS@y1nb+pVFgyykdOMiQ$vU~2t*d32}RT>|&nkFJ)9j-7*~ zl!* z#8~UJ{$0Fbq(3g%=fN^ixam#=2Ith^9U`@1g9ybovib$Xp1O~ zsjCDC;8IS8R~;MlA1i1P2^fr~h$njMQBxiQk)DPSixV(0laJe1O0nE0lI^ti`x5to2IkocD^xjCm`%Zo+G|>a@$@Xz8gZ zkW@H$V?%|<0bFh?ghy|I-z&6dRpGz-h>#L%Fbv7vNbUk?Z0Cj z8iBKr-v(DQBq>xdB!s1u8?YbDRlm5=)gJZvqL09F*Zc%-?A(BtS$&;=Q|wK2TB||Z zchTErnp`uk0h&kSx+gOyysS(5`#>f1Y|-!GP;Kjv?S3`>^<{@PpbEyM&2~;er}L;N zbG8Q!nox39EN3N1A&7X~uiWv-R^3@YmJX_}rJhzj#}m$PLt|Ujrynt+Zm3;v4CeH} zH`d!k*yw0T%ieA)zevo=5y$7aX>NbyB5YtYpDQ6fAXanF2sw! zKxN0u7oUFd&Qd(t-nP<3RUL)j<}+Q9W+Czgm#N$GZ{FZ>$*`Et0jj#ir}DgxFGh?D zK2AA7VGEbKYuWa^6_htzY0M9aVJm#@CKOT$nsQC2WO}qeBEw}m$vN*S%!Xf z#Glw+)vfVaOrLaERRq9`T z9+F}QT=)Ul{uG11#ke=Vx7tkFgDI*qvP(suSB71-WhJmRT-hP!A4A9{8;V>xi%2Dff&k~Q?iOa zjFCuS-S{VSBlCkdZ-O-E>qIh+IJvue7bnIp+Z17WxoDLpG%R3G1_lBiiRlg*-6=oA z!2!n&Xhb{CN6pI4P50VL5*{A#^cJ3nu#D-bT|L_|TaZlVSD;|IY|oxf_;b#gHi&0F z4m+ENe*Jbep&BdWz|qJcpzXViBlW5Ncx&Waj52Taufil<-WD;n(n)*fx)4)0jrr1b zrrM%!uB$p#94bGYKX$Us_@{pocl_W8cWu#-t>h)icLs4X(Qw*&Lb~eJEar!0I2qG? zo_j25vl*enGOx#|@w?0TC1E84=#Fe%uJC7B*WXy&YY;;U%LSUNBUvj2!=}K*lT`VC z5aL07miY0*i7A&GeUsDif9iN~smx$P5C6lu&aj1G1Af+FsH&`5ak{8AeaK1Q_80%| zL*W-Hy>?ZdsLD5R!Bc;`*F@0dDjkERTy9yexu2Wi`RA97ex~21N;$wQeTk!dXoZGRX3CNBPUT;FI*TZPx^8~1c{F@AwvN01 z=qMDVyt4lT`@OE~!$`@llhT5N%8Q?40JxBC$~aKBXdmPFI3*npp%W)bgS9EO+cQ^< zr^B|bw53)D*$dL@3>QcefmdI#X)*0+a^nrC5AEt{V7L47&lCR4exJ5sJup_teeR}W zB5B1y)FKHLXJZriB?WvRjPW=uq7@sA`c^nCE2l@8dI0+N*H<##GXjE&q;IaGXax1E zD2N0_vcX-&k%-TXdo1AruxS^CZUx^Cf~>^X->VTQ?T6qp&_f=_2LXK%XXLL%$#g6d*5JQC_*VU>t@9q8dvc1{+#ft=kd{cy~*x^9pqz@D7)ejfHIJQpj*sIB$7 zl8Tx^uTYy{4#dLt%TiVWJw9!+j&(!IUtHRM6H1tCy1_D99nOn~Sxa*pY(hsTD z_%Y%@nKGa=?AKGOXO9Q0=Oy`oF)}_%=M~Rhb#{^uf^8X7(73W^v3X6{Wv+AfvAg3_ z9LXFPf7uKa#!KRQYldOKMP+7i+S0~BtKni-j%)W~k@oX5Jg4tI{~3{S1bzF5 z%*agGd*_*AO^24mGRKM3PrNE#iAO%yfaBLW2lz9IhaOu%AHUJx(XX~ea*jzAGXR{` z-+lCgN^}GsGRjDuw`*}Fj8MOmYc63NJ9ef6O;Lh){BcnA9Ok-ssIs`tx5}QHu|f=c z9Ff6z_8vm0`hwK32pd+>nQ$fBr0p^5hVJR`0Y%{nNIOnKzp?qVOLsfp%aw#>8jiO+g>(xO*qB9K zyP}=X&0|nUiTe$1$f4-G0u zBmNHNAUZqBG@t_OPiSYJ^GxJDWi^V4#cTBB#`tO?!g{STe=Z>?x@uRi!SCm5jniG< zqESTiKTWcefWI8(89PiR_@kt^NB4OvI$ai*O%7!cpp)|bwD@Qv;n<2CtTO2UhzG#j zR`?z`yZ&UAsIvTtO0J(G=Ami>`b(+Ka`bDrDRYo3WUZr7$mTonzGbe_Un4Z=hKc7v zkwO|O^9aisGn=}OKZvozfLD3fZM>mj3p5Ks<99kkq>hBEx{Ujj3R}aHizSV+M29p6 zvCBDoX_r2)zS=!0>N-_+T4(rtCaff4<99XHcb1Z*82YmlTIxCAIIP-Z^M6p+v$!z# zP71}wuHw*2#n)^2zlDR|#wqq0q%=zlPBt6SWV&}6+-QNTmnx$?eb`yTLp$EsiB+x^ zDne+10@f=0{Qc;>{CT?1sm3znx*;9ai_DR#w4@KL1Og$n%qJfuFuoVTPl8t^3j5Jw znCr5NDc)0)tE$ZZshV-Hsl%rFgkY2QecxIV;^6Bg8oxevTspr#_)9A2n%nrT>OGe) zLh=|RcVJz4*&y(Du9q*EOgXr@F*6n4wV zp=z(i|Aa8Xa`Gie%?WEZ{!t|H)wF9Kb81>56{Q-T!1dCNG}?7d z?fArGVZ|-&QNnZL;eI#@;$xoEduWRLJu(Kb-{2lipQneq zij?CDk2?x|@6^ltzOp~_pCYZq8*Klq=8cpPI{?Z0Me_U=_Wi3p=ce94qd%Ob5|A;n zrREm!SZ95?Ci0Mam3}#LMV?Gm+76d6Ql1e3#VK`#f*)bJ`5$j(Cb7bteKVrmm8Wz}Nj*x96E(DUBm z)xO^5cTaZZ)8mv`-J$WxqGYVMW>dGD-H2z-6E817*;0RC6XbhCO zYLy6~U8Yh8CxYpO;@!;47g|FZ?<)>uMBx9eWh}GMRI?P#Q@zN6kv;Wz-NH#VpN#u8 zpT}icVYe4ad>*9PGm{3^?=U)6C8B9cOUujc#oY5B!B?Iz4PAP^*mZmio1iX@6Dxip4F4mh@8VHyz|>8^<2unb^L?& zwG>}8@jUy_Dnz#tn85z%Z{w+s%{D7R-!8TJI#FAFgDW{fCsUo^&$OG!75OqVRB5gG zrJBe>eyFfW)pU@Wv2(;lcwIGOzP=)Ug;aYIj+ye}%)}s93nrBAx&S4wO#BNQC)W-G zhGj?&*BoK1bW3G3=Cy_i#OvHD`}YJ>B>K+fSD`mJY9DS!t^h zbzQ3*z>eZROzn(9rK#jzwdhI=kCdJ6BYVnZ7MJ!|9w9?-XWizx7-*$4H2|naP0m|@ zC4hK+MZv$8&Z!rPapt*Dm(8clzQp9pMQm$eyVqq*UrLR?vIrn-WZz5ZW~V2PCdV-+ zZAEKoTq3gv9O-nROG5PYFI}LU+G+**G71g9qDbv|?)SpU%yYY5>aMs@dQ^}pr;k8edvQ}I0gUTs#KysY_Bv+dL$Nndh!8R~vqD#hvJ6PU|>Db!7MjyIU9 z?PdEoN96@Kp0b)puAOyJl_3V3tfAevEmtL=!vFy~f0)iux+@~`dLdup6U0_}itkC0 zx_93dFCM-`u3yD4EcCuJiX3j04-0gH z-p4PEN_`nDQ4Xx=oMp&&Ie%J@LUU3J_VBH--nZjnU47Y~?n&HInn-dfYz+8lRLvr{ zz0PlN%lfSjUedGerA{|s|A$#IYzEzK%{36~B#$C5Nb1>JW#qe5?U;09z51z|F&;>Pl98OOu zFye+^Dmoc4V9Fl=zf6SHi|6pXn*l_z|8i*oITcvQsqF+6(RV02s=iXUEeWaP2*M-y)e$6(&UV5+UmXO%bZSLX! z8&gY2bT+^OLe(eyx=td6wD`*x;hd)fj|ENQ%kok4`HrnCr)1#pC?B9w#|y)$@UO&B zUBQ|Nd}Ql_oKno^ZOuT@lH8B>4{oF3sPQZ6_$OQ6LK_9m+Do#^m?>za-z~k!i5^D7 z3B{fvPttr)jO_&V-cZNcAio>6fQ&Y?<%$aP^OOHG%{M34p3VeF1(r6cKodGG^xX(c z=>=TN-w}KE16{k%XIwONffM${yq~hhc4h&G|DGEq7w^;6&VKt zQwiPs)SOHKPH;ZzHcWw)HjzW`hBAs;Bp-ZV*Tirj&OhE5&u)8xAqgKf;I7bDn-;D4 z$Uf3I%7#iL3nsq@jhU$L5Bmqk&7i=FmJRp{NXMMasP$K3yCO6{J$xQrpAMHu)y)TuZTAj%SNOoe5X87%MQ zh7ja*!Uyoiu%Weq5rr0~__L{A{FOeSlej9k-G)>SGk6H*Opeud{K>Cs#N+l|A6s2I z3-ix1(++0IUo72%daR?D6^ zaefUJsi(brirWHl5uqI_Fe!BfgVCEYgVHbzI@r|Bcks(GG(t~E4vl&38?I^aq+>k@ z@sO?p8h`UylN|2!>onh!Q>HZm>EUK0L)yJ?(~T?^dpV4z_Jud^0%SUt7{WpfRiM~9 zYPFZPUmf!JG)kGXiq3EWEGoplZ7w%mpKdG~EKCpF+0k~1#%ZO9bi5kbZ!R1$fjk`| z^C5!B-v3+Jm4gaEzhO=H;`(o_53slgOZrNVGyWFBvSf~c?1X#Q#GI~6rLZ(+LjW8l zrtIL|QAkjOlQR30Kpfs*!+p`>-J@Q3@M33;T5kNSPV>2E9H5P7XMshQ}g({IU;loh6y9uB|C<(q1BXb zs!#RTYi7zwS*PITz2DUF{T|M~6v5qA_mzR|6FA7fJ)ro@1qLG)0I+f+!3SJ-x>ysP7GKZ_XjpA*O{Tzs0lhm_UqHhkeBrFIFDd_gPZ9~qkXb?=qS$~K(Ouy$L^eKR3j-9{6 zv;T#nNyX(kIsY4aJ2AHYya?=Vt=2+#nM2-5n3YrQsr;}V$&y7UeE>re`}H*MFmP)< zyGC)~Nw^-beIG|3*Zj*hUoD+TM2K@Q=j8mmM=wlV>`R{~n@|+Oyoa0WO(w#J_7!U> zbTuu&)Cqi)n*_@jUO&Mh$HUJ{>KCTPSk_N#(f5Js(0_)B@6s46EMSRdd&v-U7u?D)Wd;@iHTV|`9tw#p%0iynXe(#6*#nXIzNLo&(nY7 zBZAPxIZ2WkoG#tucnTy$(EGoca)wODez+DU^JvU%dxcrqAZ9pYVp&ptej@#`GE){1 z0A=1CLWRZO%xg0aM(1e6Qnc@ghuo*GJJlW&H(7KJc>=;ehh}jS2A^jw8H@ zN__(52NH;?8J~&}%FznGFO?kzzvBv{BIo>AtX0xwlg=yj>mQMJZsgq&R2-5v94&8YLJzpUBux}h86!YML4P=t#Q<%+J{wJ{x%xxrAg zB3I<_+~JEM%?;%c&4(&>xTchGc}^hupyn<P!}Vt%*0fDq{e&?UfN z$LE!7aBT#L7yW3l*GgjClR?x8>?*ZE*>|*7 zC)@lhy20zW+!EdDYGCr%?t4`}vYABJTn|!oeJ!EsdmD9-5mLXU4Sz%%o$&R3z5_Lm zMhIOVYAA?8%hm%`t3Z?67&lEb=NX^#kL5!Sy$Kb2@p00-1Zc|goBx+B_zM!N?-YP< z6b3L?WuIG-Vu!=hV1a6uU^&mN@ztXa4NY+WHhn4&AvIfS=7DlkRrduMfG-k>PlJy( zyc>xh;_FI0u^fp0z;Muuy#a}$>8;6@E@x{w0S*>{!^r|Cp7&KxW6nR--!&T{)JmR+ zXm$!h7oyryS(l3jaj#2Q2gsf~soJhve&7HHKdJlk zAC<=W47w>w>2ZPRN1}El3SA0c>K={9PeKf?vH=)YKS5Au0ar`mnvgIX&FN-3Oo+4S zS5!sC@kV0$vTN?+ERIren&6A;X3f)lw=%3FUFj}FExM28I3RhM3daQ$Z1Y52^6srt zALJ>RTC<FX;sZ4K4AtggU_tZZPla&G9)fQ2_)_!`rGIXka$u;C$deczrc zYH$p*Uiq`ups=B5T{Kw>H!+L1B*Dc_3FNYLRD1V??I%q+u5bUGaHufZpowfLX|?yP zJ*C!Se42bd77#Rbh7cyTi_@NduNg8WZ=iT(mMP9G&4d^Fq8W&8YFXwBFD&>mp=$t{ zN7i6o;s1}Xl_FGhbmQN`OjP$|`C_xYFF`Ozxe6`Z?Z@*4E| zbd6UU>s#oWQZvYIBv&fAXUe-E2l?#t-CWosuh>fQtVLK%5?6~|D{CXOJK+>zNil9X zLD*Ls*IQx{^(TSLj`4`+gENvi#WgonxRsMf{W&4Cja=MmI-ieKxgDcYFJO=})=Dy; z1(0+%XJ!S=O<0xQaw{hU+qa*iisdq>$~4VRNqa}!=|VCQG?!iEi z{5^4*`||iCMGuqOxAgtdQL_1zdqZKV-6D&NqH+O6DJ?i;8~-+vYDm7nvQwR#2C5M5 z_H_34Zk!o@G|+!1Z{aI`W*jN7KnR_(H+JOAUE_HqDsE5u;q6={2HX5q)a?gvtyPgV zE)2IbGGXhr;2-sBZgvmxI>tyP=J1Z?`0G;S}k!y8YMk&OYxn z4rUir_#WNVofnirs#OoG$^}*mGuO1*J!5twL|ptZo^UJevmrHwVZb~;RCMxi%wxNjdS(nbrVXy^|M-<5$6n24Px#wGT2kfiP zKdyxeo%cD8I{Xg6P^RF4e{8*NN^R{?)0zGCqGAkkvA|0=@61;;B(W!kw^ELSE&D4b zaVto}cy1>d)l5ZFGZ)EqT&n8DC{q5Q!{PJv9bmO^J_@paTQbl`K5(y6nuXrC{o^9` z6TvGQX(@)sBhOytTbFhHj**vI>q5|wd^IW@7RK={HByr8Hf?{A?TJUUt<)Q}siU^7 zGl``Fmt<}vT!TBtaf@UwKQ7D8>Jr&!))s)9q;v_rwEJ6Y3A`LE80u+S%Y`g*+vp`@ zrx^HAUv*J}AhL>J@2t5qXb5WxEsu&djGWw&nkQzKL)2jhPqA?TQFgd-+Ej1?qAm$L zkvTukX0-a=dV;{kCju?(ez_<^>(hM*je^#EVTdy_`j%S>6-7*!eHLrWwXyFld-NJ+ z(9^ZL>;rGlj{2(aVwmYa0o3GAH)xzrjvsRU@w$PjnD|XkHChBDUl7}$``r%#WqA3k z1M2e^XhYN5alP1ESGG;f{zre8Ap+fH5*Jz}_xOGoqqwK{0F2T7uT_u56bxdYv-dt0 zMI3q7pU|B28J?0kmL#9HR2}3L_s_O2o}$ZQlmhm!Bgp=u0WnD#Yxx-F@Gz(2d;7l{ z?wDsUzE*%IXfvL{OxBPJQPvFTVB_(DK@T!v@@H9M~4Q624!Po7GFC}PEZd0mFhIT zhv=1ft7lFDqjwA*u;o~$+`9O-T6c0mT;<9-+M6Q$^M|SLV=j5ovQb~bu9QJJrwX$IxgKfagA^EYQ8TSC@Le3;H~ zB$7P7f_b*FVStd;T-DI}uT=q@cL|V3ooch{$=Emw5BB1%S^xHOEuG=y;h~HplMMLq zqfy1fzWVoz!eYI1-IU;{rZix1xx?JPB$=|Bj?U=r$5j|Tqqi~%i&khrlGp z5*|WO!4h8NGhMYJR{IeihsYXdze8r1o{y<=XbveogjTBVx4bE{^YS$)7N0?r8;BBy zr?!v&o%7{84Z&B9H>d>-a~+-U*{g*p^BdSkH_o-}@LF89e+mhn;&Wrnu+8+1oOqN2 zjF@*5M2b_S{n;vOVYB*8tmYOT3X(38=}!9m9XRS;UuO?gI3J@od(=_DlH&xseR~9= zU!w|SBDFZ{KSkMcKK%B4_=g6+-<3YkLw2W)oxL9oiLwzLUcTO8%+j271rzR6IgfsO zXer8ty$`380uWqdbstN7+CxngFJP~B^_;%On~VKF?1*k-fF!-H;b)6#ygpU40r~Q` zEY>fc4eB<;;`%NKk+iX?F@Z>38@}Sx+25n^dcYtXUiG@6T#sEzT^U~bp^_y+3il{9 z?8CE@Dyp420d36Ft@63H$$IH z?z{<_v$=~hGK+`UrXdI^-PWz7kCz;uU2c6EwzV0n)t{9)m!)iuk#t|gJziM276{6= z;L@nn-&{&CY1Gmj2^_26wf~sZ!BceUKBI+U>EKzlFFe*~dg@4c3yrJUZkvCFl^Mp@ z8f)e|GaKYX@6v;wn?Ro^biAo(uW&wSQjFKTR?1+-c+aI2qZbw#J+EqN+mqB$jLQ z`qPw8DOg|sAXyvRYohaem?!FHL(5(_Jc?2;$LYk;s0JCfN)vB8t&WV_C~2slfmsM3 zha^ku)zWBqeNy#g%cK18(tsWCoL^r{KKom}%l_&ka}k)RItr%)DrQ*Y zJCCwH2RV8A#jM@kVl#4;iay`fxMJUj*A&ndthkK%ogI8ZO znQN_whWQDx5U5cK1pO^%qkP0awXII%rLHXdXQVmy(dRMu}9NE0)bf>�>AGsz9GxqqtIVpY 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

43ugX8j0{KfwbsX_w0$WT$ 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 U}M}Ir1)XahnP4>!MOS*-&wDy#sF(DGs~e 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�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

Zb7*CZ%bhC3y9GS@lHq5o> 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 literal 0 HcmV?d00001 diff --git a/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md b/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md index ddf1a46..f50026b 100644 --- a/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md +++ b/versioned_docs/version-0.2.0/04-advanced/00-performance-benchmarking.md @@ -7,6 +7,12 @@ title: Performance Benchmarking Optimizing rendering performance is crucial for smooth and responsive TUI applications, especially those with complex layouts or frequent updates. OSUI provides a built-in `Benchmark` engine wrapper that allows you to easily measure the rendering speed of your components. +## Current performance +All the latest benchmark results are in [benchmark.csv](https://github.com/osui-rs/osui/blob/master/benchmark.csv) + +![Dot diagram](3dplot-gen-dot.png) +![Dot diagram](3dplot-gen-surface.png) + ## The `Benchmark` Engine The `osui::engine::benchmark` module offers the `Benchmark` struct, which wraps an existing engine (like `Console`) and records detailed timing information for its rendering cycles. diff --git a/versioned_docs/version-0.2.0/04-advanced/3dplot-gen-dot.png b/versioned_docs/version-0.2.0/04-advanced/3dplot-gen-dot.png new file mode 100644 index 0000000000000000000000000000000000000000..24d36733391ab723d5c3b2c247228c4d409fa248 GIT binary patch literal 153057 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 z z3kXG{_)MT4zj9tm&JC3^y3|4infUg2iOKHdpLVfkdk91?)jD=%H2}eNcmg|AZlWHq`MKHNQZo zDJh%=>C&81e@1UHMvI5fLJ*-T%_e@@iv_jK^Hk$e_(o%3bD^cUQAKrwiI5y;!YO$? zvhF1)yaxu@rFy=^j#K`FV9xe7K}X}$i?}EaTz+Srwu8lh*ffc#jSoMZVrOM9$}bZ*C(ZqYuJ>%3P@X0C_^jd|ex5O`sp zVqf#mhvMJ^eN= zQFB;dzAmX4cit2_5GA^=9((G8<+~UTYf!3U3t5>Cdn8ZuGm}RM+uQ#QydCPHNK`<; zskRuHG!((f61HvG1TE&Nr{7df!@WXeETMkODLq#`3tV*633@vdeH5*2VSHCoSaiT5 zzny^SJ~*^wBD$Y(LYMohnn?xiky!(VmM1DJm%KKD`ebd8_Ry;k(0@0*!Qe&km~{PL z9PvKQzmVm8s2x&s4wP~kvx@C8?TVZRxj`>4P)nv5*KE$>xvHkbnP^nO8#t{KN#yYc$b$~Ub=9~6uhloaUm!5Z zTCUvg&#H3)t$O7ZNWDLQSo&A`L9J4?z&b?B?*1BC#E7M~u2Vb{gOt>S{PM?|3A z`kA>epJ`8bq^%8fV*_gaQZnI(zl~f!6)@aMMZS1Z!+7p>#kLwh=W+6U8pp|I?P9}+ zX-&=|N2;lSRB~Loh-sl;!z&L`cxp%-d;o9$7Z| zr3z{$7T92B2N-o5uzoIC1eY|6poS|_wvLAHdOP)<(>7QZJOdZEO==19u|5sD+0BWZ zv2C2)d=q_>8S!GQ$b?e)Thz0|r^fv2KVGlwK9VU=5u*WLJzSq6uJM!0rva(GE6o9|10DG2!D4042&qLba_( zZ=dG1q3G?^J3qRfYR+eIUiJ(e&P|xwSq8UcN6IjVLD1#}F1THrd_6$Nm(TfhP1lI% zJ}5zfLc#Slwk};}Ia$P&7eWH(wB^|>uM=I;clS$c<0-tZhyDqy6^0Fzd;~FXnfENC z0n@A^9;0|`!Y2oqiT6-O^1Ful9@%)aw4Lbf+z3}kTWvVApP`bHQo8F)!T7d!@~(Fh zbcSaa!Q#U4YFhD4y}I|CDBdU7r&PYNjb+*+x1Wk#cDfAw+e$@-_fTT9~j)`NaNfJq7k2CX%X4 z*Jyf1+KLr)^>{LcPe-=~`6rf1`E%g%zE=lIl23oVm$})T$GRid1T}qII9V1e226r; zFR<}A=yfMe{%O&;ojaeZS4X{nvVHpyQ%$PkakYyg!#QW-F5Oam-m-*z=Iqi03WNG& z1>I-ul9PRsGU4C(ocXIR#Hwe<*(kR_IbczUyLx*$>-O>#P&-Xs> z``6ybb{~gpt-0?jf7f{dDG2lcDGzw%gQJ0%h`RM+zeyj@ruQv@oi3#TW~XhUJ^J3_ z8ql`3(|+o0!FB3FY@MVu|KYuQQu%}o|mX@tx^ZZc&-z2B2Z}^aa5mQ|DUs{1YY!8s#^Q|7(no4$-v9ygZ ziU@vWbmJy4`*S%MaNGZdft29DcGt}ns&XCwyN=NL_SEV9$#Kc4D0E>05q)|QW2M&u zU&aX$ohUq0wHRC7Q{Wm}Zj~`&cFxZ22n7l#1w6?@O`XRP0;}-b4FiwX8noX8A~-H( zf8mrMr=X;4Oyt>*8afX=!9woMx1VPZ+QHA)ZYkf`1BpiuwRqt4ZJ@JT8eprq1;?{1 zrX9)lv|;IMo0ml>4a7g8u|hq$y0+o)tMbVWb)5FLZ#R2u5Is6KnvMjK#2JvrZZKz0 zW$;9OJMc_p9&93Pv5 zJhDkGNHQ1?QB!!`&^q-6xk3Vx<5wMvb2g8wsB?Ca4~nHEOFC^&h|q9F06xVE{vekn zz&*^fIlb=7ubY|y7546J-KuOvH|qs^Wv8{GEzd`GMoCSM@08T_FY)P)l|`$P)4QeA zM$I0I`yC{V(rcgB_|`ytvoWLezM-^8m=VLyaC%LPPa5dBuCMgSUBhi)R!R$vTK z9~ccIILd^!sv1B(+iDMuW;l>Z3*z!{5_QHjr5b#Q@Ii8r<^ov-1>W`ON7ekYhC52QGSe{7YhF0mVxEWA;YhPBCmyC#^JsEf%kS*$m+}T zN8ISriJ8JF>nqWDECW;{d4mBUpX^)RwOsfNI1oIn46DTIh_&dw^XO4-`H5GjXm=w7 zLdc;;IzigGmlz3<#U3IZFp6ms=IZ6@oOB2--?~%JCbvn{DUqc=ckd27JLqLBj1*6c z*_0TEb5CFXBq4PKF2F)$t77h1Tw24W&qXP~chG z+WHKhcT04ZPdE1tIMj0r1RRV+CZ8tZ|(M2_mE&N!o17xh|#OX{I^;^4OKP zck$%NLb0(rty(7iv0+i2v0U|$C434f%d1%@CS8jJ&=C{_W=N_3B?oMRS3Ms4#EQE%IyK0ZGF#-Y4mtcJCM|=8@ z2{v`ZkTOQsOII>U5a9dMX6Isr!pQKRe*S>psxuUj#~^EzChWFZ{<{$mdnZ?Ig>QH` z0*lsV7v;@9Jm@LgJAJrmFG%#9jX7H)LPq=Re%*dyKevI!2-~-j$Svi1!jY0Xx05}7 zy~V-@z>*2(%m#b*rSXG8@wriR>$`i3nV;%pOa(pZiqPIU2x8ahymKIxq`b7PxlCDs zPooe~1-cl5!kiDe;b!_Y%WR6+A>@U8YrislJ#H~#GsXjTNR}jKgn(D}SaYC%{puFS zEgED;sK#3|9FCeFmB3W2DQW%Bk(;O>ltnaofv}B}3QoLick*Xr{2>-?uTZh(-;pF^ zo^9o~)JAUXx2Ag<`3jDP3%f1X;ujv_wJ;=`SbLARoXh_JxQnOU)Mtd&>1h;%cfunF zm$N~!t28MoikTlf*2re;Rc%SnYZ4}-BEo%iFypM3)!RgjVM7u*j6P;Wov9KT z!WX+9Wj35Jd~B3ne&2T;^3~B!e7MN^mKmZ!Z73W+Pv9a~#%LwdDo?=V&Lwqj0EG12RPKP!;p+g_lDe%+^>FuQh z+tmjoNGait~lwh6GX~ zyo~TSm`AwiB*W)aRJLmA;1@e?2a5y4qNSW`uI5l$6e}KuZH8p84G^`Z6 z)vZ03lb}wazbhGx54VKOJ28cV3q1<6s3UX>rlWRm3)k1v9mQ;&og4XxaZ~r-i+nlS zvDVD;(er69H8SvZ2wJmRw6n9IUEsevWoCXK(_r0oFQMv4={?z8j73@QYWw}$hN?=L zwQXlJ3}lsq+aYaO@$S=*vJ3>*+&-AmyhuZF)fQC>EXpXS2=!xFD=K+0$F$%Ih9Lx?wGpX{*htV6gLTBDc-_ zOJHPbU38WUZU_1{>?+;t{P3kHa*t9NjNW9yJ*ox{6{#?(&s0u>6cpP6j2WQ-CdB8m z$skRrc&A2+8f`}mKESa@>^4MZG_4$DvZ+PHDpi=ebTAJoiA%31$Qy~Zr zJTAUEQDU>llYRy-l>P|MP>UL#-4Qy}*%_{`0YysK55Q{=*@3H|F(=7_XL#FpxX?_7 zo@3A2B>iR_`GD1rFXR1Hxw~){@w4(Kt<2oDp^*eFm5ALzQn`uZSvUBBEnZd)79DH9 zrRy*ML8F@Sh5YYScd7X~RC={bF!lQxBaT7i#6N27&}?-`47qLUuX@PgAl{Ha+xoHB zv5nLAsQOZjAdY!~MSGsCY4-1U{nj$g5wX~df~%Iys@Im(8l~UCGem*MC%nlB-YDRV z|KeNWFax0>vsX5B$+0Y0lRX^R*D4eY7Mpzrk4K-ds}< zOyt-I-kPzAa+jaz)P|_|jwwu%t(jODaD<$dY z!~0=KsVXvS$sL~{Bd{j?6iE-qdeOEF-+gh;Va<1!rl9EletN|+!{x&dfhu5Z;)A2h z24-}Q1i79GzyMgMgg@xc?^(cxzBw?Ha6{`R=IP#|EHE;%HZULuBG|1~&#=bjPm{>G z&;z!jVX0tze*_BJ0Fg&{z4 zJXZ%b2?hA6ceL(?y2n#bh8-YJMGN#+ z9F#=|Rp5J3esCBnl|$kGG#J1#ypc818hsp$j}E(lNdboB@%2`nf|mzuz#oy~a8Mzd zOoa*+Tr$8Ez8tLgY8}~>KV;@s01*UoI4P~)MeW%9or<>f#?1b1{wys~t36G&;m6|E zW)p6H6k&t1jBr>D#FjD!0}w#&0}m<58AMV&D{c>E<<=K{x82Uh#tt<65Je+Mf(aOH zp}~1{H2?&{_oK%G3t64BYg~q-^@f^J57Iakf`N?m|FCK20?z7AP0ZNLq=jl7z>hMv z>VPxHatBU~!?9Nw$)1e{f^m&halPAJg5 zMQk~h;AP=%JxcdY-}lKIwf>v>{KC!Ylyt)jslTQuPmtj$r4u=yc$%aF>sPjKAs&v9 z>fI1Oecd?sOgFn><@Ud=9MLr(jmnhMODbz@QK>D=aF>bv2@F(*$e5|i=8VIEw z&rdl6_zs)mnA((Mkc3Ih&hNcDt&5o%mC5oTqYds?hsM8`847^@D}ylNg`R*>JdEV{ zTWc)H6fd(a5c*;u8h*o@nBjkkuMY?Z0ipvP-U@g5h{r02r+?qNh`$vN-pjoMOOn%p z!^E|B7Tv|0y){Q*mb~}&(&tCV%`%U%nOKLPGio`3bSvcUX~~Mx*%|x*^=Cy;oC@Fh z3OYSGfm~_*ywat)NF)AHeMquoa*;aLi`9JauC=-!EtZCq!0Km-`}?Vr7kxB?yDEV_ zO3EH7(!$hhwDAan!4vK-`OcoDcyHiephS*4w^Ir()+U#L z3{nOs&BuztXJg$!?C>w7XHP&r$)Qm`eP{DL!ybO0862`Qd~oo1CM0d1%}IX12jTIX z5^XyaNN=q{V3V=#Xn2P7F*pC5`)KWBz52uVccUQRU2!=epJ0r^P(pPB| zYu`EqA`rJqt@jsuy?+;va z`a<+VFvH|(F{G|pkOWma4i0Vvx@ClGWV*3aIPQ8vbDz-lEdoK6*X?o0z8+<4>)v?` zPwla*XuZ|yxEPlITCE@wMh?u}YAtk#dfzsw;lx1yh7a<0W9U6VJw`ghJyYDQ!JsmM zEpg+$LA`@2pOmW94`jjIE52Ekg+TBm_FWp9Ju*^`a4X zi;n@x_|z+FLexzMO&^{=^EdJ@g9lW3-N^g-9w^aC6dp1W+}%Mx_`|OZFF{|1POj=Q zouX9?-uB;K9}JJQ%J84IcK;@I_rh#t9Va)cN}kEbGriY{_H6oIBd3T4v{dM>z6NrT zr>oO>nWMNtKkH|BD%$pPpfJ=O86@+#=0s(6p(WwFkC32fjN7+wUzLT|OBpo4)QTTI zbHm!xu!bcL>@SknmQeN#!stXQ4FWlSw)n@A0!W6Z1i_jGGC9O|Q?4o^B@)@!`BTVC zc78(_#BzIE@6Q-WF0XGDnb+x`f}UNR!(^+BbCnvx&bz1Qj@5Q!GmUTw z4wE~)>!VJ5c=00Vj0jj`-5t4-T8MFI-4w3VkH6}rj76^Dt8b&I>v`ZwT(4mgDQ%h^ zlux@;&F%F}(JMW-V`xSrc3itxk>2h6z$q#@=>`qg;nt65knEeCC@1EzHk*aZe7-^0 zgTzsN^(MZu^q8N6(_gORtJYa3&60H0#ZRHXX%&=)Tym(vvKb_pP$&+1L7iY1(Bfvx zAjDyOD0R|yI9-t{E4~|JjrX7oD<|gO;A8gF0i)P83HzU|Dpc3HK1-Ah0#$t| zA<YZlo=#)Q=n;T4c)w`fufsim0H>l?jLK;F(I|D$hhN3&oOM~ON zLE#fGt@i(`1;A)r%pzO8e`vKu*4OXe8iJ*5)|k-9CwTs;i<4bnc7`<7(I#N7Prewi z)kJ;2;%xz8qHQ9Q`ns|IsxqgGHE3ko9r5PM`ezQ>(F=WY&Vg zDXksUiY7u*nbGZg@+%bicXv|sP~5<)pg^#zhpOumx&!`}w2qYh)Y$KD(^_uMIVx9h zP$Yn}^X*Dsrtoy7j0Q#{kEVzM@&wSfw;k79<_^@DNvtV{EWz#+B|`Cr zP4`jQpyrCJXX+y~T?Li?rl1Um^V?kf-6^8eHXw9FVDzMs6HJ8>4!ZFNE%3%?QWAE$* z04W9{wHH|c1A2VXGVfknSz)|T$-Q@9Z@~KsVw`G4CiU!chb6*CH;07iN7l^TCe0J} zRqYc^${r}+SbE-CJfc16^Je<~x@qEC%#)#TT7-wfJcIEyQXVk?t+$K3)`fv742y>-Q4RM7_$T#p zy{nCiRLS=t)(80)OXK{lSRJcpOJv#5Z^0H^UcQ%7ViRqz#Fo3=%P{uAYZ=9|yQavQ za!z&z$D*U)v=Vp7E79b)c@ioE&p+H!;9K6&^3nXjXfXV>@ljLNdtzDiy=PzoZz!nf z`VT5g0fGCzh6*cGf9_jPk7!cVPY)&EWC6nm`a})gLLBVYM#8Akl`H-pD)|qG%>S10 z_j1m7O;5ddC_!t}vKIBfm!BC<7&IL)e9BDWEZEsx=$)PB)lR?t*nA z;5BL0R6(#IN>gy4PI>7%Y zA)&&|=^x-L9@}FXfzeqOPwgGq(EQNs4j@&itvlk$i+^#oscmH9=OiEEo{AYyyb~b` zy;3Xdjf6rfSafkk@m~k*G;C(`^Ms>4#tD+iuRdnnVuU{a5xLrLflXps{Lp>>v%VtDK@{*@ z+k8^>(`~7eoy!^V9`Wq+QK+1-~4`Hq!tYuvk2{ zkkV*fpZ|K0R5HS&5=c*Pl3Q~MkCxg@JAkU@sH*M! zbp(&PL=Hl8Qp^JMYX=K46Hb7Z*K%)K9lAqhIFh8NHqFE=83LyV&Tkr-QX!1h*HPRY zbGtSH{K>&An|o*s$N50Q0{)^SQy>x!>4rGLhZwWXR8T>Vrf` z+o%1b49n)Y9s^7sqjrYf9@dJPMJzosXSA_gP`I zE;dXm89YGkG{y&`JMPoc<6!g;)4dvISZq++Wd7&8NGFP+?$I&*HR(&k_#ciaH59`F z{YwZiJJ*V=nU-y6+ql+A71e81>1IhWF8UvHhjCzo_CoNLD~SgaM-Td+=gNcN+E75( zxBF{-B#ojd(XTaJA?z@Ymi56|uIZm|TWF|T)wcPQ{*j>=AgPm!2G>6|nO|@VC#+o9 z7Jg{$qnnZj=?g}$@Z_nQs9;r>$@hvMcYpqSO2E=u#XFQ+b=+It8e>WOgdg9q#oQ`h z*;4FaOHtxpB2%${SU*|mZT0o-2pc8<3ZLxvo<-zBC3jvmXElHSI-Dh4|qape8fo| z39Wb(@t$0+e~Nwq%rmK4*FOf03bvtm;O4}KCqgoYPF7{d%7AQaxm{Y85LPj{TX(LQ zA#<|eZ=O`q9*1g{3T6?e`7Q=GWh2@dUOq?#rg>@W#KU9Hzaoa5#+XhelMGn7-y5nI z7qehI=a22$ql+#ZOfW`yPl9(Cj9J8%b2g$?^0Y*`LHX4Kr{j0CY<>=VqPekP9IIP#eRFptBpso!Q}@(%iFuR`^; z{zT~RK#`h`1P!fsI*hfg5Cl;31&uyR-gG+4510TYOeiz0s=Z#=Iq6um8qepl zDk(%6_ixW795e(_AG$m!@-ENV9NL6Wm($i>#&=o49Z$TAKM;3q)Dc_jJ=Ij!ZFDvm zsu+1xA<9bzn!&VqdL3I@OB|Pm|yR>y|#OAZ@Si?a^wbf>6 zqh|Bf4RkIJRx4meix|Tv{*moqu%fp?a#_Z8RbWi1Mw@gIy7L6sJlY1#!wWq2_L4XN zMb5+5QzI5pCZWiP=!MI20IAM@!TM1z&f&YsI{VkfT!LbEM4R?Ljdo_{P8epeG9+l{ zA6YYK6>;_y9dm`|IRi`GVTGv(XTo@XE#>)Tt5O22CC(&QQ`Ru{>@6mt?-J<(1V_6kxJRpQC&(p{2CE7||F5mW=VX7I9#R*+W?lUd zrFK3OebP0&EJ{>xxq2ZRLYZ#9xttwz!nECv=@{85l&w{6EA}?Pr}us=?y6;#(c4^j zrk0(E`;xBG)!WC;TnlfUwV+A~+lbXix+|At)(Kz2@iY^n;cVeQN)IL1;7yW(wfy&*1L$dc3fEL*T@k<}AG{L>9mFUbjH! zW12aXCuxzbtQ9v2#vs;k>jxX{OVSib{Z%Fjo3s)umhnEW2ute9~ho65Wak{%AVZ3J!ymb;AG&xKbN(6Z<2#E z7tYOL+~@H`W0E2mpbNm2YymQmUuTTh%Q1P->zX=9FqO-)1K;^-On)vZYS!Pqg)v0) zrS;3!XVEUO`$CB17WLij2UxQG8Oib$&+!%tl1>n5W2IgBpNulc_-&tE==E=SN|y=! zPfzc7pE`$E(mt}AS(R+VtVS;fKe&{yq-~`p;d^m;WA%!_|5N?F3|on;^*S<1?pq4$ zjT9}aB7`eghCLwqGHwI2DSP;=QO%5BS-q*5PlXS`aAB?tT)_1&-0gPTQ(V1OsH(eJ!7VCek$BoR8O7&T~JrXIZ#v7Jw@-903RU`o2M*vOKGnjJAFiC zdvjYUsv2_j8`wMv*$91ivJD)G8kGb@-3S}9D2B6|l3C7mZVq#ICtJz`MyGiW^e4P& z7VgJ^%J8L+zC$()tmtex8XAg0S^wLz1_sdlL^M1Z)(AE4u4g<+=Pe7{>QTDKnYq(> z0zX{Uuhk!G)9C7+9xEGV>zemZInE#P2pdwLux%C=6pQG1!nE(OXlREtSko%zwC_#& zuNGi+z@68(CEaX~EeR;a)rIy}{N@jRmbup{s>{U_rPC$O?Y!=l?^g zytvuv7M3bxE1B*lUdYdau+f)Tr`tP7Oc9&;h6RY7Vmi%5LMJtqZqgxdx314Ncz4<# z)ow0D-k7!lLlR-*E#7YNkVgM>V)m@I`%|l5#+P_S3Qko^#}UU4_1Ov=1n%I8awa@^ zo<}cO?S(t_XgL>^;G}uAAbM5-Blrn;9ENUrOW-8{QamjT?2vBrXkg4sU&c_=cqO(# zqJR^BV-z)Lf(d^xhHrj)AbwgnzUzB~T9mbt7)KBSf^b*nh}-@JbfaE__S=u>>Boiw zPrKY8tliR9v*$YmHQ$qO3`d{zP49)UBqa(F^|Ww3ni*VtgGJ|bThLa_>sz|zO5LPz zH>cS6D9XykJ6(jlxjje{gv=VI&PjUS-3q zm6p8IX)RZScIueD0DW+H`x>FWdeEnIk`*KUH!>F1PhQ2!m_t(x)=$2I8Bip~D;T8$ zo;fo>8p*Uue04iHOul=uf1?+u@Kil*FDmFSCBN=i| zVtAncaQt-h^IA`5&}Zf@U>a_c7gBVp4S@1J_M`Yc!%5Q4TTK?#>JRD5BW295U#v}p zUsqNn#o;3DQKOXtyb|s;Y_4A|Lf(ELX-CFjtYOT)8?Yua(A-(sI#ijM8EvF|E2Q_d zA7sm%Q>Z~ZY)Poe6|caEJlp`o)-`FfAQiHF-clXI!cH-L&LUUaqxIF4yS_@3`9Ur!_q$6#K&8c@~Z7mongehB4QyP5|YcCwW(Zm}Jo zAO|UZrU8g23u;?FXI^crV~PF)ru`5vD5+wyb5*RArQ@-6&`4}eH|Y|NH4KwS58riy zhYx=JU^Gp@_n;@uz*==i$fIXPw8UfeY(|0h$(Z3beL7%zTa#txuNN;1avPP`r~b<- za#=xEp*^F+wft{M;wcHPh3zYk#a$uT{fgjBk6EU)Fo_3hY|+_4p+c^;Vy|9M0-cS6 z?ojw!+jVoGVTm-we#D`i;ytX`NZJ`bIlE?t=IwDBWBmki=dw&lXU&M8!<}uPv!N=r z=3&Cq8WLO=E7tt4JICqbF2Bs@u|x&#tqw}u;Ynt_%%B*+r^}9btc~_AJ1oCDuzY)) z;HfS4ekMicJknB=35TaowygI~VSIXLEmxaT7P=On9ZzZERE&126&o^vel_+((oVIZ zbuR*he(-ffiyAF`hOt7FPuZpdRgAh_`ddTepmCXXjsV0}&|cYGnrUx$^H8+ASf|RL zetdUqB_~Jo4?cdBkJE&$LF>{FTTiy&=#24pgSC>h`_0_s(vE)^Dy>u%??@^rv6*d=mr0 zOMG0SmEuFk-@chbODMfkT7V9sMY{SF2}EZ*fai2dzmCm8+A&agow0S)`fW^1jI}Kb zjIy`g>W$)?e8Yf>t!tbYV-&sb`Dfpbz8t76^>zNzH#4L0rDQK-O}I**$-{@y_`BeG zQCyX^=WX0ZpYNcDG>PXPdR!(akCv8Kk9PNA!T*IKC9^ zLTP{mst>ZmBdE;a(L66h_)mGGeDUU7I+!T4t(|XLh?Ku;{abYY&d#x5QCX864~1uLy%3ro_og6e z2x)BBtWk!(eaj6mZncXDQkBJJJJ8e9-*1+X*~t=vZ`_|fwiB%5qRRC=*gcuhTRqpJ zrJcS>zFfY&So-2dLan-K@lNgLGTzJ6Ux=|@(7#Cm`JG8>m0PiWGnGTq^00M+4fE13H6|Z7?|_s0Eyrls3l*DeU%SK6%| zjg;fQu-qBlQ|`T;bnu8O8U8PvSel^`?(yALHO7CLYvc?&3cHCyc?OqD!5GYmUtpkT zM!29h3Z{@W`W7$9n)c6x^>X*OSsMT4T<(nu}|*EdAs94AONk4^gZ!(>z*uLNf|} zC>fSs37L$7*9yn}KYaoaG9lLSFA;ocVh&858sp^HclXW=8+#9+G~9tguU-V+(eAQP zsORdYN{X9IO{{TPYVR3|Fz&2_T}zl56OUF?G5?47_JvyGZu6xJS304z8y7?%zAXn6 z5tnV|o&G!ACa0%Ny~xa?@S~8~S%-j=`d2+?7pB@Zsz?dHQ0KC^Pr9;eh#&$?Y%bff zxc32PKD%JfC`1Oy#Un}I3FiVs9_L@bp3v=akzP@AE}O6>Lc~@+V(*`*b;O318trc7 z)aK~3$k`#aB5_>=iE^@(*&KEko)%xO5e$NZWO=lU1-ILoha^4^=MziTG~ifGrY;2E`^6fQUOtdhcn_E0ey zMg+`y=OZx66iI~-5netlqHDEvY$GYg3U<%agy7w$8{%SCH9D_^5VgwmT$1`s^b4MS zjob&aRDXZz+3|!U2$zCK4gfE2>fM00GbculT{cGeOnuXV3$6Ls*0km1fpG13a&Etu za`mcGs8CV3?0UKTkP<}X1N98By$d6}nGbateqpk~lD^3xUHxdVheoDJM#Q7UYp%Z8 zy4PnmY2(KAKgS)>Ie;`~`|qT`pwPc76?`52*m;7jT3q)QhRV^<`L%KO+XT<;Y>T^g zv|4TRs{4ZnDR{>!vj42{Z^cx{CcKp){YheanF3!;-3-@YQfcL?G4b56MO@F*8SVPf;PT0E6k_H;af<$}wRla8 zPdc>o_v|KmjBqkuvJpjHZQSi^x7rg<^-!$7buC6ZIpQ`=%X<6F1oN?2Af(w*HsY4~ zumrMjJrqMKHJDJXWqxW_eVW_7w#lCSv3Cn`RiW4)JsQZv*5NV^q0vS&htMgO>w`+i zv-{PH2b(b+o7GXC{(sL`8lA)eA8N}Wp~xu=28=yY1wmNta^Mbs!y2CL{w-{ahnlaP zzutbvzUKZbp|3pmq~!adQ}N1i91P{tJ8D_bN@>coyaOn_*bKW#pz<5s)A%oNl$B3+ zZlV|L3zNM9Be5Yub z`3axj;=C!j=mR>q;nq(WvGUUij`sOLHPV|@=gR>$Xxr2taIkNk`ru&0|Hl+uw<-N0D-$CA zu!x|}v6=j{!ly(LVG?L3(S#8bJ%=6*|8_gSLtmPx6A0VBy?b#>!Kd88g;r`ty(erMhKay3A*rvchf$6_L!=rQT8cbqP7{4=I+D zv5PJ#_xC;u<}ZKWp;D`3gP{OzwF;u6<%wCKOG68ibHPTwy_*Ioc`>sY5sx1tyLm#{k@R;TG~G5_;dQ8g{n};NU_+((UE}Hg zIq=C;3F?Ba@j@K6VqY_6eSd)9o)`Rt^ju(8PWA}Ip6Zl%I?OCy>P}D~;_}@5M}spz z92HI!Fz`z2%ARme|1T}B{)fZK$$NO2UfUBBx2Xtn`a{_33%IGwU8l~$#D{PiucVqL zW4`D9#CO5ArLweiJ=)w*Q)RZz_x`0aRS$~?>x3@X4nF{|S*7-J4EO2HtXlvv8`WWE z^0#2=#>L!NFEZ-1-22z}sCR%4wr+XRcK6+wvF{^=HbwA$s_Ty*v=|#rA8coRIbiC0jKd3{pg z*=kfk3=KZ9b@p87<>{H=cmHn5Io9=W^PhcJcnFxpa|pJjZyvfs@LcLi@RG*t>0Bhj zmF>G)htRq@bHaYIub6g*@5B}fwq(HZRKRe1&g_)`Y#$0n2bz5zB`YXzu<}Q9Kbs33 zjUGYAX&hdF-f#^dY1aNx;wB9T-|7R*+m36uQ~S?XNi5HfdyO@JWDs`omX<84j}@ad z{CVzyz`2+UiX~o9r06JITG+!RA1D;)OV9)dY4r1eJC{B^WCR?5PU`g6iuxxZN;i8E zs>mq8|7roC?{OV_tt>7EWgY$C1#v6BOr81TQsNiKle7_4>j}vV)@lDKb|{$sxL0g}EHSRPtwynl%|Vw5qw&F`&iA!*SR-wW2Bq!p?FV+DNjy?KDDr$XzH zG0dLPN`YVxq!Dky=xA~`oXdT=hJ;8922D>TR+QPq3@_DBZOGWUt#B)2PN|GuRe$*L z0KUqe(DOx+ABJN8#NhlQf6mom8pmHY{}GoA=J`LlOw3c-Cm-T@)>1n190Vg6LR8o( z`mUkhXB=NZ1M43L4N7~7%7aFa|9%AuDZ4;$**$x9`?n)t_a;0xdii?_#Lm1cs4G+= z-(M&9hGVm@22PdCOVRLxgi-q{7f(VwI9}#Z?#O=Kyz>>DD_262_AV?XM|qfd30d1! zQ#C>Qbi{Sbokz~ksCY5`D<8IzyO|`FH-BnDN&2A;_NzV5f#47vC5>PrBdN*YYRd`- zwr{IWl)AI{Wi=sY=udtM)#fgEbFsnW2dTnP@ZgRjPl(vq;`Tx3!WfW$rrQ+?4Ch0G zuPbwsMg2e7xtqbdxwUN(fHWOX6<(iiEmcXbN$KKMRZR37CdIYTPv$`wb~XQF;gv+n zu<)cdim6Ug65PbjzyCFr{eH~64#&1UL#7IsIw(VlBiytLYOth^`;_m2>Lmc9f-VEk zt$Q6?RkXz=zkzWnr0Zmr2%iY6q}qfCmD*x+0eLw3DtvegZSn=9 zXHjoJ^<-F)4D4c(8cZxb=vuFfoD=k(^qwz*UbxumD2C2-^V<~6(+kZ4l@zE-{K~Ppwdj6vxlnyk2#uKBw)Er@q1!^eZ4J~na+Uy-`dAdftdLc} zeaV@neg{Or4uE(m{v3ib=In|4Z>YGfp~4}pE(#Mca7hz(nKIA1H|Cj^x=(h;O?$AK z1FW{-&8p>zvXi2Sk8i zkWz#80QEd~ri&Z|i_<_8J`2U*Ltmy4m+5iUks^ss)y&DeM>Z&%G6^~F?z6)HRQOf# za@Ek$IcAT`rdBlc(0d3Lpg;i8a_}oy{cM2jC$kAbi4O$I?fa)6{Fer01ICz%ssm@+ zQ<4($f4<=tIryu&l&X5x{MTYQ%Bnx(^^%km+^5I`ixR&eNu%J!X0yFn+ETvkn<&C% z7t7-6=7LW#SzsGl^eYL^Y}5Sw{Nc_CX1Qo{rdF8{(x#>!Xe|of#$Q@p3ojr!1cU?>uAt`d>dU?9KhUl;7Dy?o) z;3Eq96dh0P|4bj`F&cbD9$?)~&>Ln93Q_v#vYB;u<1XO{E)j*W?~*oGC`GpW0FM+B zBXx<(Y3V80s1z778hDxr0#uPceJz|G^OlqARsC8VCc#t^6 znX7UQ)D?SMI#kom9JW|Jnh%YODRGnW=rLSRH=m^@y{o#+TMB`=D)&CYrP!57PDKJU z>h6X4kJB$EcOIIYO&s=GUF==k{S$cl%@V+|?K^&QFa1aji(@Oj$AoRj^HIvq-Q0}%+LIG~`4q*o&#Sxnqe7Hr3yYKQsl2)P#I_7- zi#TBsSKMV=Mq{7Wgb*0xGT&O4mZm8*Pubq>9;DS%vf!ETSPAahiO16Q4j{WvbDmLt z{pD16Qi!OoW=o!_g0X?pk>@pm~?aQ>7SXlk3IP z=}=#qPE8OiBdERGzChv2J{;%q&J9~% z!6uYZNqYo|srA|eLI$bm>SlzyUQ<^Cv?{WlAg(8_1(2J9Chi3VDFWYW*hGaEJ_30n zrZV?_Pjv;Qa@c-FrvJ1Ecj^Rz5KjnM1$&j%Hq#Q}_WC-%)A=U#pq+AXo;vNx;aLX| z@5}a})!~3bFMXnalr3xn$8lv_e(AoU{N+44MarNUcfloImF(3hzspq^A>I#tt|sxa%&cVj~?+ zC9)DbCTc^BRr}RTjB4w+y9*MpgMp^3L3wchA{IPl;ll~Jt^kj@vh}yL0H?T+P?ejs!OMF{VRdB2NnQ3J@LXQ& zd~5bEd)z{e4Bm#4x#*de=Of!xMRC&b*yd@WT0MO%@!C&e#B{}0sj#%m0TYQ|;8fpa zVwAdk++uvgHW6FE#g`SH7394s%DUomk|>o}&)=Mv8w5`u(lmn3o zB2uRBC9>OR-N~lc7mN%w>rgkJ+WxFAQ8$$WM*O^jGlfAmWY6{t@yC8_c7?U!uvy(s zOSr^D5l#lbd=vzUt#2uaZ6!|``u20NE)XDbCV>bOk=9%~gI3{0mkV4fUj*_G z4#!_*_ePh8YgjtQG*X=}zcIkr<7neT8yUd7!uC6e3htmSky}wQ>$lx(0!pnPnUD@* z7oGFW;eUO~jD)RuT2)SkZbYS6N_$c-XP4CwV*=ZFP&G6t~xsTIfhrT#fNpu~Ub^KF)!e}C_RtwjIqQ7six zf}AF0?G=$Mb8kLae4(2DeN-k`j_pR#p z*E$?M9f&AKn+9fKjz$h<`q!RV=y{$Ij95?9Sgscws)HgN;Lph*pQM(teZ#&l;Rao6 z9MF^&@KP`QHz^-x@yPeTT7VcH(UsqSifc`*lt=Jz`x)vhuXNM57f)oB z#Kp-Jt*P({v1JwI43($Jbkw(LemmCW3}=<29ut0js7Xc7RE7J}njvE5ll(id zgcWT+}j^8u( z80H%ZN#vV;hvKK5J@L~9yQb>W;}2CkzA|IOn>;73mG-Uc$b^`;j)snk4)zl5R&obq zXT3$Nr$6BqzLvtvYO>9UfO>0W?1>ynGRrlMvwQnDYJ6Fj(QQH6Xb8Zf^|TAUQUGX- zuT|cEvdFtE2$Gfi&a2{QC_}FU8>B?%A_ZZ}@WnEJ??P(e`V;PJ1H6Hh?w&rovQ~k) zFPL%8cU5!VY@8!zx%Stb%xo(P@9_p$<1tMWshN4+Pc^#Ujd~$>&sv9V+w0`Ffl~_L zT>v7?F?2Az{bAOcr?cBaG(o%a zT!iYHO)Kgco3O`YubDi)NP8Xvi%cZ^^#CQRKVR3EA{`8Rfz)9A>Zm@4-y3xo_EZ-b z+K3f{ld7@Ec)0k$#x!pckZY)5jO3R zW0KR+_a`)GVklorq0|_X9l>Zd+9#T}WR5Cgf0sY)BO}p=ehXCeT@EMIz|!R3`a#|F zm1?G6Tf8?ay*FzqkTg&zyfoPF_xV)yZu2lY5QgT4y!T>edCkm{a?aY$-=%FG)UMHt z39Ehxx>ZslJh`g#%jbvJLZl9L_iAExErz|4f4n1Gr|31zGQET+V*5K!Ck%?~o9F%2 z3*cWSXxF?r_VWxZkqVP(AB)tDew`U3lzP3^3Rgr&o?RNIkIhOqZna-{^~7N~fSykh z^f~?Dh3J`12_jhk-6;xee)MjFbWM6Ng6Ffex(yJ+o+>mqau6=`U=bP+Wcv1KKBV=e zNV>|;Irlq8|KvkAN|y50ZBbW&5RGBBDyUero#)2y=QOC2H8VPW`o}ujcWe6D5MdKf z(=UqukE^c?tGaull_Mn~-5@R9jkI(KNT+m3cXvrh2ugQ%hja-@cS(1bblu+pdH?s` zZ=UlY?3le~&6?SJ7~WlS2so9?S0~RLN~Se2Bimj8)mT7cDv^COMqf>~Ytr73>nWke z0obFhUA}4Fzm5cEul}B$P0g;~IcgB_Exd;s_2z+T1l9YqzV!L?N|>N(lTO;y_}J3Z zL6wltcKmOQq|t@dt#SptdhOBcUhWqP#Rbh_gZ8?RLqhybrCM7O?EnL5qxsoGant;RU20K|LDB#_Gpxj->A(a8IR60zfxImP%>Ewj?^u)_! z;rnEvvN1>B4~+n>%ePaQ3IjXFpNDiGL(P`W;7&`Wp8Gc&#|*q|c<5KFlti}s zu>4-<1NSeRolI-&B8|zN4#EQ7g;bj1uP5-d)Yjj^PGeG{k0$0wI_1roL=@Yu)D&rY zTFAVeul7pQvp`N(?yn{=~toT7u<1_*NBGHHdgUU#KdT z@M%nSWI$;6*uer!HGQ$L8+goE;e3EKF)oO8V#LE$`;I7-UI3feT!j?~3MZR`3C_M-HYIWN-Q%<>SJ&R?Wy8jdjHu z5vQH*(g`&SH`d_&G}%9st`YQ;`RX1@L%(-b_OVrJwwsh_kXQPG@l&k0=c^^q#p9q3mwhs2m@IA*kCwo3LU7NV zVPi|onPFk0t)>G(>f%$RizH=l;k6@Z?q)A0a@A$sK#; zEv;G2A~FQLI;)&NRZ=|fa}Qj1c`T_tAb7V^vN$XeaCXO`ma;<@+Bvijw94M!9d;!B z8ETQ5aP|dA9)q9jXbGq&L0ShMgja%qd*2FfN~^8;mijRhjvU?E&3`Xuq_%jHCjq{K z4+h;tKj0GVrtuiqUuZ`_j%dz}9sbCyS>F%hRy$$8`@#LkKFDIBgl%6$r~HKmavgEn zSEqSoYkjHfAzY6Kz@fpzAjMUQ`sEE^EfC1Gq|?PP0`b?@VKnB4-o4=x-xi2SY?-MC z;1R-ODd3?Cz_5_5!SAxN{O}DSLJod0@F;Wv_iev|-f$nC&m9i?0eP%crbXuyrbC`?AU$3lhh$bn1g`TO?eP6v( zTP@QDJ%xFEK;?)x=aW}+WF!lxyN^JKX`7n8@sI`817B_(u)aK%QTdY}4FUqO zxtiB_9&qzOBtjieSb|}409x?x*5?zOH@jp-6TQ*3+byi~UkqMfLESr7vfI7D^IeI48Y+cGV`+N12=w?#RoJI*u#M4Ce>_F&^bvGu%C^4 zZrZQ9K96Kci=986JXRp%G#VNFQXPE>T>1@eb)NfyfWz&a&m7Rstg1G;6TNOk?E`Z< zM!%K!S;`Qnb5}=CY9j4a*?xfS-WgPJco8uC-Dr+cK85+`SpCc@7tjhN8f(d^jBPBo zZx52f+zE0>x|Z)QOVqE?eJis5=71n)Y=mg%){$;{sSgpSNlJ>ZG@0oFz7FWySHH>g zbQQgo955exEyNx0O+TQ+F>o>c;&yb&aZ0$<<8EZa zBG;~$j!=Jm#^IXPiSMVQRvr>47KEFxbd|7a31{z+t-^r!S%?xlQXAfEjc3C3g)kSD z$?;BMkaR8(av-qV-;|dG`o`hP=kG4tnK|OJr_PDbKjl%-#ra;W6S5{9=JV^{7h-ndBzox5lVEXE;7js;s<;pZxNf4rI2 zApu3|AP(H+Yi${+tSEIpEu@`5wtN(g$*nwD${fqrd2n7X^@`1qvbz5Dt3yDIfGdVV;UaMFOrdYCD{LY@>4#~H{Zt+IuvX)1iOKw2gO*kH-s?>!1}I{T zu)oFo3FpSE8^o3CQ#Fa;&ec~-lf_1-8v`3{ylw+Q2S2+_yl^clP?AgxdB0}O#tApD z;tGHEE5gP$cL4$rKSUtB%yL#35L?XTyMN6f%yoZ$)GpHqUN~QjG+j>sxsG>T561_g?>s@dNc*Uj@#_Y~Zt zTHgD;&sU(&QlbyW-N+Si{MkBMaDnpO$AbL+#D_a9a2-_GN$BgNz3$El-w9lbefzbe z-HmWkF&Uan!4m1Z<2ObA7uoN%Go#Vn3yK=7hA_&cNnkfM8UWc7I2zuB0J*rW`!Eh% zXiCCL^96K$_#&-$TNb%We*zr|t*Etk`#)c}FAnO@qb-(TpNXWgK{%Kd*l9t8|CYyv zGoy@4PYd+L175TG1-$>sqtdF;(ug@ce2ofcw)arW&&YqjODGEQ8j9P~=5HSO(c?sY zFT3d^Y#jDjf>xk2N#aWY+~_oF6M+)s{`Hw{wCe0Jo&+xbP!u982J&}zS$vBcIEbTe z-v~4566!r`B3|hp9|12~yxqP?+uuEUsJz%bwlLUCX1FDVK!p@UMOBGHr;;a`$Plg> z$0T>E9jDW9oZWWBbiVd$MxbiZ`8(~9{w=g?ZR z14rNj_KvcZx;lJ*Yz(Cj3Dv<0$d?FWWkp3XN)^scDP4e%fG}-moNLHsu=a%FO&8Vj@WY)(vtZP|rqFEi()Fqc<`#$c4ByoF_S2l!9T;0b5ZT7J|5}_mv!^oPsQq zBq{S5Ius&i2rfD+c6Qs{t6(x_Nxux}E(G8k4(EeoXY2c0D3Rf`yf!HN^SlX-aJNMT`0o5llTNrPSQrm$e~Ah zu(2&SGA{QrCuF=WCJq@SBmfHxBkdgoiU2A}Ed0|)V7LP8knZ;{l9r(g&95mnszDeHu}hK%AMZs+4AOjXH{fxY=z^DU~VmxMn+4qNc(*DH&;P zLh>DGn5@wvrg3b`ZSU@|w+_2|6&TidveZ@@E5}nROXIQS&V85|5pla{Mg6Lr?8(qG zi{7#yX%88YIT{LSF4m-{efs3*QueDQ;x=hb*97Myc(~y4NrFhcvxLbI9~TxFwmC6~ zTRK+ug=H!ASX*=)B_t>rrU9;PAj!kPH3jM=7Pg(E9D+GDNSZhMaddhHz}m7&`itSNpS;hEyLDP#D6T+uuE zDdhAPFV^Cr>ISM`YgieWh%VCWg_j}nxA@HMLhC3lMU(3{$t0;%7wQpT5^h~aI@VS3 z930Ndm2Bys3?e{4C-jmM)Pq?+!Yl)x7T8LRP^N#&{$8w`G{!W-5rc*G0g<+f=!u$? z35%LqGsXKt2Oz#-k@U;Yt@G}q63t0@o(T$WWu@KE+?18ND{A&c#5SEPOqE} zl0NfW{Vd@OPuI!BWKgK=;eIh9UjRoRDTOtYLp-N@><;x^zV22)7x{`-H{OtuP zN*%JSpr1T$6xe!|#)E+s|4N9H-PUCQhl|ecym#y@p!+_2)S2@gVmHi(^bMBO_Y*;$ zAof}fwo0nSeMdZyk28dD@?QK{sZZ#kh1M416FZ2;~(qiUf6he zFb}-Z6g;L#eT&G2*+^1zSHXb+t=#QeT<9Pn9Y1gUS3Y!t0+5k(Hi?GO&z9X!UZylk z()H28Bo79QMQ@km)Fld#;Vd?88XPui*cCjzCdL)eS>yCVP;kQf)6&}7^(UDm{ccRl zC^A_|L=Z!83i43mUCox12~{uAd2h0*$HQc?(2ts!}b;(RHQ^3X-=nIh5G zRp@KEKxf0wme4cctgCI{*eA!ep)siyL|$?`4QwdqCx4~v9Tfea$s5ys{H$J=|1 zzTY2z*8Xwb?<57=dMhRokylPltIT)c1%YSd-#|W+e_`{pAE%!r(;p;-c}&K^F}kg# z@hSBKi>W>%1bt1uJgzh^22OT*2yWPDT905kU`t1VSU5r5Ip~1d;e5$p9S85=2?3ps zY~;ajOiV$={=|JdQ)4*Va9)A&E79iDH^~jw5JRav@ydUb)$#)`Yl%i>Gb23u@}Wpc zJ<`fL-2`nSw|nbkL!(x+^&9d8Mp+8>M&rLJ&2e@-958A9t)xbH-X2;B0Z3%2h3}2r z;xms<5|cApJ{Zpa+)X95z>K21D;`FD4W?`J@~uES)(G7TR75Pp^5?u5b>7B zMQ4k14Uxw!$ZN|(0H1+2JMj81DRd^0E6B>%=`6Ri|G#shqW7-+R8X-**C?_b0Kdta zTWzh~pj~O>qr@#qaCGy7<@~yTdn$%cA`?kkGSt9PGIKxn>aJl`qnc`O0*gl24`Cip zalZV#K_XRxlsJZKZ`v#)HHxRJ=4k?3vP9Z1M!XQpDgTWhZ~;spG&Bu`7t5d*V`}Ev za~`Yei^>TH-&1Hr5CNpm5H;ALg2Sba0#61u?EjmKSq${W*wPBsjRb_dhYHh8#}sms zN7j-mj$81yl_z4~`-@mRmoIOvjdfmx@o~EB1Z=@a4E2j+h@d2S!M{N={f*akQ3NxZ zuAkA9;4bPH7kfaf;vNuPKr_RmqSDc#6dFLmNRjwW6YX*JeFj7TU>b1XH)MYTrbu## z?HmT5z`*OOlk(knX7|O%5`Tr~AKxeWFkM}I)bh4gla|V_3-;;*jZhA$0X}SEQy3;~1p~pg- zCMrYOjpjL7cjQTOTVGt#JJig3s}Z@%%Dj_ewalwVExdqqPajv$A>Mr8Cd#pIvnnJp zaW<_rPz&c&ZPWy$8G!RzBrV`Rrw%FnVn+Q!!|2(JTG2r)c2YWT>=mFZr->4YQ){~- zL*C&ai(_UBGJy#VVhBDu+c+iS>o!V6F{PK-v29RNaJXTUoTt|~hO0;B3bG?L=&P{k zGj@_*21)vA>W-X}m6ARfT=-DImCHjGZpK&%i3ubOIG*M;*lmaI&6xz4o4E?M*_2&d z`1kkNbaI?p^hb-tRLK2zL2@{7d~ugU)V?3IxTlSbIm0+-aice65|98C;FBav-BxG5GRWVXv)VC-1V5ie0l?ge4k?YGuR5K zyo>L6U3sC~yJ4pfbxe)dqJLvP;jyU4)l>g;_EdiWqnm8vSc&h2G~j$%*Wrj4sVDe& zcvC|<5Nf|Sg%tT1k9+m$Ti5l?X~KI&1Rf7y0VQGx?%!1K0i@Lae@44f0KocTNApMj z7q2cG;oZMQ`?ntTz(QO8O|PhcyDfQZnsAyOf0dnNVW8(7x`pn{yq#&R@pY)>W&G?~ z3mWAg+;R?B(vNVN&r5vA4Vhv=H{dpI}R*P||JAq@(ga z4dcTs{&q7*%^5yDyj=fR+6J>eOcn*d<0`0(-dBN=?OP2N}L)lH0w zjsO|vjd2P^S^Bo9d6|`lf|D&M@23YXf(VDplbe?g&_e(mC~aZ@aBw$^H_ZhC34Kvh z@g1s<(Ik*XGT!+KgGruF20_`;4_fXcH_cwD4@4<{}{I!TRZC_TirnGGOMa zwTW;PCR@r);P{d@*ErfYFahj5;k)1pdukPmb-e- zvNHPJO6c=G%K#CKiC&cCMM*nSKUYzWAX0X#WMT-m+(vd<%hA@y?aEz~dp2sR+or-eQ^7PQh68dNE zmCbhLktn#D?v-;EI;_x{%)ovRr|_He-||O&(V$U|?afJL35|s`C?|3qZuu@0tU)Te7nl zNg1%om!bOD8OzeN%-8S1w=c@m4D=#=>POaL{sO(c$i%Wy+>Ml~YcP zh5~l^=7PX>o3|y>D`0{@0^`$xhT!w5#~>l@*NNZ9)`a~C@Tg&(1T0YlMrI&`>(-0UGWl}ir zwI4xF`EBIjAuiUeTd5{=*RoLXmTFS!AdPLM0ud8#r?MjCee&2({@cXvmJXMI=wD0d zW}?4xMoseF(B=^=1G%=K-y=N1yLa|0V7s^HNC*FYMyAvR@ugyY2vSOwu70gTzXY75 z$Kc_SieRnOO~021yG(?C8isNV0H%B+{eb(tWt!r>y;3`V@vo1-jYRL)R%Myp?*w$) zhR{Ac39hWHOXd;rs>E7sg1-uHWpQh6#6r)%bUIX(MbgU@ z{N4U=u++joJ@`97D10b!(d`FKYEB?7`Zd0-A<^9vkOJWXdM4v7I>R%rKF0nJxpD9) zP#cbe2e!-Ro(u3wVAQ14mg`ANJC^0U<67U=n`Ame#}eXXRFD;UT4C_az=089E$4ks zR25t&`@U4GELyJ={=_lIA&@}U5J3cGqI*767#ewQ{QYclxD~8nAiI{v(s-G&l^}n1 ztM$9*{HE zuS#jaxIfO(ayLTr!$VjV2wtjcWZ>-?ntzX2!Zfy7>moMIuNPhBlUBeUaE6i7GIu()$&4R)OmIjnboQ_P%7A{MKpiNgPQ9)RJH0UlQT zBaf{-p#Ka=2^ayMSAZGx&arB#>xU|cOR7pc*xHT(?4`+f40jtOrPG#^(l@CPL%a{D+OFFy zyPGp_))H{3)MB1APH@l;tomIz5Y$Hs3i`R39jRh~k7$-5^H#mvI68#9NH#g#YX=@;YHW}~Sp?Y4 z0Mda=^w4qj+d&bR`($HQ@wEjab&FFq;3-$G<~RCC^LXPOVbjlgs17Hfha!m4zEq9% zz9fGlJ)a@5w~xCPuRM6p#*eE*j&?gni1$p)5eY4BBc|rw{bZ*e^oBMR@(RhE|C-2+c-cE~4 z3K_Y0zv9(;c;CR^-hOK?YS+MFjRshLm8d~X;G~|*_IJK*I)c*I009QX2%D2}_}%-B1f$RMa?mhg zlD%p5B{Bd+hVn_UM)ioeRB+i{vt?5qqG9dFe&cBwju7WR-TR>2!E$YG^kMXq5tJc?pYaIhrQKS1uikJGpxoQdU8n~VS8-JyU&kIgL1lEkF$rCYCTtt zkB*ijKc*h^tz=*U+Ilg-ngQv^-8KdueS4NB#u4a_9^r zbq!B*i|2Td%+aP87G_E7^s_2(p~?YJZ@(wt9r{dOB#jVlF1VnDO_vL?2D999jhu{q zWK`hnfKkh#SYPC(V(c}1VxDENfGyG5l6E3KGtnI6U~K<(QITxCPuGyUb|yf!b68y+_7a6$=L6_;&&WVuhAX=1;;QbV7XywKQC$AtBSM@sz?8~UsqdOu=ksrOGBWhVrdmVJ>o7U$7IqERA0 z3+W^a7-r+O+_-sV?d`Xrt27RejC65ihkbQDsxG}}x}SSEZMa-HyyfG2pm~tYA6o0$ zMDosm!@OOIGs|3ip`3JKROiGD1Kulv8c1kp=rVlmX+Fml#hSNp1*w(emQ-GS_>Nhm zw5r6o{(P!%+Bt)&wAU007uik7(?XC21;DcT12hCRkm%t_>jBu=1T4bei{;KrHs@nf zx1(NJo@{jH%UP8N$RG4gz3+Jt;EANe&(2EkUfp-JJRrKCD72)M!?p*&8aoRLG1UcV z$IT_?bJqNhshxGN{p~TYc^WeV3tUzaZtSqX>4b=ckP>`?^`$c#Cm6 zX?2fqZFM0yPvL)-52palBx_&bn7Dtf9O^z}b~_$dg(%9y5>M z399}mu-4Tj7U4TkWQRNE#v-fLTMLanjD6F5+zMe!oz) zVEUx^V)A+k<>~Fs#SRTa=FPC~o`qG!&zz~=42CODEZ6XFJ+H@j-~Rj_ajoeO#gZvl z^qre_%&lw4wVB^7{+f3G308GJgMHlYyjOhra||Q{LJ|vN-L)&;N1 z+PH*2G^z{tQbX`)*>^)3{cpvssyGL6B$JQMa9l8S4%ynF;;+|+!#+2B1O0SeXL6bF z;Dp|RdI`oAy1~HLg5Fpq?z=0z(gg;f9J@a}McjA?r+V3VzCXAiEa}^?=M%~b=IRh4 z1<&LG7UB-j&+xBt`evi+3F?Qx4+T)!8N-{iwRM{}Gp8U=Q$y}KCK4;G`_g&kA~4-g zn=nTOj6l7-yIab*UftkoIi|XG7uBIWJ%h1L2}*&kQTe{D_w{1;&pRvMj98SBcgj)( z->IrLHr^s2MHtM=%>EZ4L<#(rBk>kKjr=d?DI{PF5^?mvB(rzyle2RVQ6zyv5TX4A zb`}1RLd5!S4MqLcsiOjJe68j0I!~{Gkm`8U6>bqbYw7aOW*^b1T0Fr|jyNU$;t#j) zEQMKNNsUjaG))KC#<)f6P6Q*QZzSBF%m*2CMM4A;Z|>=cD@loaZ1}1b~;V31yv>FTYHh^dH zp_37K%K%9N#sG=;U;lYx;IPfVa<+FTQE=KsU{%#$|X+0>8&PUV&>xHI(fs$D$j)I5N{+4I~*q=xSP(aEqw}xfcYo{8m?9_l) z!DWWaiQn4UQk{rJ;OmpDKy5n1$XIo%R>8}#neku2(gLN9K?4IUDI-ZB$K7zSNvP)A zww{n}vC8^5@fno}lSpa*ikR2y`4AVWy<@}7MaVtg-mDnl_|Y8jAqIW{_|I_|G6)*k z1jx9h_OrHD#Z@8u4Ekwdo``CyQ4qoGLgG8>V@^%MMEWJYnl`UVvM|A6)Gy~tWC|1$ z9d=u1u452q5B)8gdp4?aHF74=i~(O~Dh+{mfie(UjU{A=L=j<~#M zc$p|8@av!2ev7Ol3C9;7pE`2NVMbXN)6!;W@MJWq6mkcwd`hY{`f{C1%|zWPeA;qI z@csQ7yH-gvQ5Z9#elaS_rC#*#XK8XIZt$_Cmvm2b@ETZRVXquLfS^M>{io-7ns-z=O3w0wG*+5=v}?#W)M(ur%)i{w zeq&Abp0|8YR8~C}lME!Zq1?G|eAnJZ>$qiCd!Fv@>|i+JF>Da<;uCc38V@ds%gRbZ z^qKu(&h8vH7Co$v&X*n4{x@*}YH%i=gly{B($SeA;4cq=v}yze3mv0_jo|YSibBSz zf4T9^3Zd+AB7-2b>@m@U<``rHQK(#CBep9V{k8JmpQ_JwX%Hp;7#OG++GF0tA|2d+LN*Q6agJ9M#&9SdvvwV3zDL&V|I@HVSE& z4}FuK7S|xwLHFsZr^=L0v{aGsF&utF1RGZdw0h9Dj=JjKH6C7=3E0TVsk=$fT|zbH z5edM+I!W%Dlt}&MmWzSdem8t+<%jM}=TUFyl$d>owh7GGn+WV2{Q&dEmCKU+&+dkQ zv?~AMXcL3ztOr2FgP%!H26jzS=ks3%yDcn-viL9Y#KZL0VPEWd07Q}O@R9=im>o>I zL0PfnM3?q}+xU8NmLO@a$<9va-|R*l!C}zp!CiMOfk9&Zj_;?AjW&uM79En4u>Tz< z87TqCNEx@!hI&FvOb{-Q->$_A+%<0=>Eyq@;rokc;6yzDk#y%J98YO#mj|7TI7NYVPU&lz>EJwimUECy8=paYMguPmgvEu;Ypc9 zP^Fm}6&o%YHr#S6nnf9IZI&DxJ?8b>16+k!cO~Y>G_p5xFew20_^3el&*z={OCmSs zh<+x^6C@`ACD}J`J#ip3SE=zHa`|ogA6i9*?|Kw0peL!KEFRYSQ>5KtlvzV#_akp zUtkB;IA0s%i2VE8t=~y?XsBL>PIjVAe6AiSp?_$qldINAr!WYAJ31@}NPJ8Q71LOt z5lD80o%;Q`TD)jbXp5AQFpTwL?pA~TpP4H=P2tk_a|^Fmp{a=altaZO{0D2z6zH{f z8^RVob6Atm`dV8dXIH$?reqBdlfm%LUCDT2Lgu`nUSnF2xGkTp(tifp6WtnOh1nMx z!Rl5@tNtJ%Bh$@NR8&|vR2IZq%k9&9Y*W}kc~4G6bU_b+?N>-8P{ltIa6o}Xv+bp> zp%Kgafx&Z+<+3;RniF8U5WDK?PT-n~Kxh3b&b9zu(L0=##z6V6PItd#Xm1*i`&nnL z&Z!GUvdC8UX{$>==|K*F{di=CU;?fgZS1uiWQ&8#L(sj~DxOA<{ubhR78f$- zASJ@iKci=D-p=MMu{@*3a~GD#y*(k+Hu0EGbkI~!&kmj_Y;E}-6lJ$S+nso~5bu$C z$(3H#X8U(5A-L_1N-rS1$xR(&DlWt1s2K*x5lXNA{axDg`=e1R0G2IC>m{|0QN%*MxP+0V!Q8Jl@*l3Mve(! z?rR#@sgASU&99(MYC?`LR;aQjdMh1dTEKe%4avH>5?6#=?LOm?1R#oKStqYMlQUotCn|3|)kj&Zf>goz=VLxhVSk-ZsHx(d=hSEkg zVjrh{6*JnT*OWVl$}eFOv%jE&A(`*JvFSUgX}pR2`tpmg>OzN5FmzPjr2Rof)uTub z3qb>*d}oN02=E4ukN^xwPYAH0LS$#w@z9yMMX{MR4eaLI2pu!p!b_tnLXmUk%pl|& zA)PT4>lo#9yT#lQyUW_6d(sEO^*Dz_%M7j$!9pSdeX%tdH7Ws!Yy`32%SLJnF~S(r zbd{#-oR57`i`()LMXeb1-ea&+T3SQ=*gvDJ%C3dY2>O(7PKM_6@oZqjbC=MR@gZWi;p5-sSE4L?qPjkLAH-23F6XeoX6z# zB#;1d|3fAZSZl%0=H_;}uSZFM#-3jCqJ4+vJD02#W93ncJa~AcVlbe@R>-c1g5TfI z;(;QaT@2eaWSy+9Khu79eH1m%YlkKU=gWc-MJ?sFg3;OIzV2Ly;{l~2Iq4zj?5c}y zXBDW`ZHtzMjA+`vZA;gb_&hd% zHA#+(?qt5=?9f~9*WB?!JE|Nqi3A8q$Dw{zQ2vlm+aGVV>Ou`s6$kZmL#vmOr+L$7eG{v3*uciz$&-kpcBOC^1Mrz+tY| zqKRVe+bcZ6%Of$J+Bt!8(qs>Iz}|8)LqO&}XoKXVi1d&xo*M{tEg}XU?A>9JJvpgL zH!<(f#87zvLh|G++88g;vTd2oThRmI1tWD8C;l2-Bl#u)TxOl`Bjnnl032kFW(qa| zvtg1sOqAy{RHK3q3<^#@)_=ajp1drU9a5!D=4)=tbozPkvDQyKX>Zv-r@d}|K{FK_ z1QH*M%yW1JDKql7^S-{>mlsA5HFaO2@Wc(9UCJ<~)?Mx9cgFA$Kn9lra8twKC7PC} z+AZH>q6_x)7kmmc@byRGyHU1~82HGu0=oXPDcc_0Wq1GjtwZZts4|*CRn8C$r1Ph$ z67m9lw;c9LAy(KHFXe{AFLe@4{|v`R6_lv@;!AQt(*HQ#6`5Sov7!^-9h3f^kZR0G z=u0fK8odOTrpqtMY@pNAFR6^@H=C2VYL~I0{_5?}V{#&Jcv0JVBo{N6#}^L}z(3gw z%hDa-sWwa|3Q2mRQr<+CDkr*6WuuavEECo<#iCw7nOd5S4nV`omk zD^sv}0+eYAn1MPnt(FIyR2Z2if`at1V)ZAp58|~#Rds<9%*!k`Qg%gMKZo)gbInF) zh=MX80VZ}(*#_0O$0J!fWpr&(juG4bhCUxivz)P{!M3|$&ascUxEMNQNI_|&Zl_>{ z5iQ-Lb$>|u?J_t~eU?_7gt%?sEwuDEQ!Tj&$M{!mk?c6ap&?&}pf8Ol_FbY8zDGIj z6Q*b+15{As4vpv(ux6b~l*lVsh(6Rhn_>p5W-gkY^2)pS)71}|d5bgp34}mV&XQh~ z>B|k5G$8hJId8pOuASv&OUXNj{iZNweX($1{m=$HaJH}9`#ByrNVb{9%G6|t=+LX`|%sGy@=+`MUF6G&MO9<78eI2N0g_Pm8B zQ*Po2SouM1Zr$ShGC6r^Y$x9zF$5c(1-n>K*H2co@+*8(lL~|WlJX}(+DIeUh|9V5 z#W?93wS13ncJFV4|AvkbMQy5gZw{se#tI|T5r*ewzUcWIGBdm3Ngd)nKH}4~-MR~swkAoQ9PgwsQ2E?58G?6SaB9OSG@aSU-8;Fa%k%#?W zaLBN|Gxjiz$764BoP8yBnegUR(#X%0>(7B1&&b*77T*cf-u#1&dEtThWOiC92Dy&K zuPg(E&uDoi`7n5F`2)S*mcvl=RqKuE)&dcPSH<%G3U8!)Z3LeMZfj4y{P$ z_j%8MWmSGLZ7jc|sjm=irGwtC( zrYfp%_x9zGm!WH_rfQ57Slmq$%C~68FA>GU>N&a=Kw9po55U0vWpp;yd7;V5@3I5M zC`n9^*c^Nl^T921uD?I%VHlTJ{Ofr=7Pi-oE$g?u8`mazKuR|^s66cdsc-wZa{w(N z8UhOVdQTA}m!E(ekZzzrbn}D(g$FOp$v=-^V@x!(lk_lbQTm!FAVA;7xlT8DGNJRq zVL;GEytN7%3cLGc;epi%e=I9gQzAvQwSg zzDmENdaSbq6X&%iFB}os1Z!sc?$*v)88;C%_fNJ(>If0{2l+9@_p4ELu0b8)8_C_P zJ7)#3P*a^LybWHc$+GUaZnN5ol2bmPgiTFjwL5~7@nN%2*=v-h(j8Rb^*E3(oU6vb z2z)UU861vp*^jxugDAZ^`qznZqveZO;f0Oc0itHgy&L5FkqmKe=ekm;E+6+`qV3CE z6+HSJv6<0j|3xiPT^re0#oMH8M*`9DA^%Fwyi_JXTANfLrBE)5`9F8+?^y(6ZJ505l0a&)E?p%_4%`Z0}V<)T5%r< zH2ga6xV6bnjlg+wW6V|zO+rG>ink@Frj$)bFAq7=<}QRLIWA_QGVbto=FeYq#pI+d z*)(J);LAp)2k2+Trer6c$F1D+;+IJ)L}s{R7MAisN5>Wu7Q zYrYCaRmZX~v70*7kZr**O&}5PaqV~d&Ge!#=+bsoov?sf zgVm!b6h(v;Z(VhpvbcR=GGa;Kh9cG}Wz%F7b-vmkF^ByNIy(^VrsrhpmAJ4GOw=|X zI|v_C61NAETjtY$pmmOglF%|=p9`Khf`3rnIVIy4iJXu_`I*X-bl!}4mC_RXi-JF= zV6~Y@-BaFqtYAotfOJ+9qr@E{c_i*?fg`|Ijedlvannew%m7jq_nArl-yv{-kiaca z{?qy!GAF3?SA8v`2jRDiq3#K*oDjnYe8>HBeb33452HmVeA5riZ)7g;_y(e2th&Ml znM4cuN^~KVW8UqeFK3oq6BSUaw>rTQyM_`0zDyIr_w|F#F}-6dqSAC)UE8W~J2X}$ znDOUvw*;KeC$gh z_fviKANGa78w~Bm&82A7Hd>J*sfs0&?J4?e}iT_IW`T`p`A7`-w^O7SQ^;soyg4pb~fp zjjSIu9f}-J-E^Xmdgh(uAZEPTJsu2b-I?VkZyNL&{2&a6ht7#zo=$FV?YI0Wk=QG0 zx@VLTZ|5<$kbaG(7P%DY_j-qy;$sm?H>%{1<)zPvzL!5=@(Hd;99F7N5RiR1fefvI zgCOC}_m?@>UO+|DlHS$VU!tlq)_Jc(HJU-h6C%ybwVes`lzEc4~&4T<6J0hbGzl zGwq5mmU1(-#dp5T`L`cSesTO;hSTr9@8$v!YriM>yTUa-i7ZyP2rr(s2r-)Mp_Tb8 zMZblAI4LsnFek_Io=x3S$6^O+pP(>E*(uHCwsf@i`0%3Ip`pGG(3;mJ4_L=ewkvDm zh7MJo7K9`x=yORHE>RbbHP)!nXaKhp6Y^)wYmTh^J*mnR8N*bu-@IvS4R4kq_su(H z0a|pfmy|6{j*Yzpj)&pv2Go2#%pmh$%Zr#a*@&S@FEg{S*T+1{(0VfjNgfE$Wj$3ayb-jfn_~F{ANToXt#SaM%uJg9`7l)XEN)c=ONzEgh1!U z@1GD@a`sb*A5g?&DEzsQ9!~H#HiOEx5|{Fq*V{U3*}9KP{y+sFeh0gH6jB0RKOtyR zHtnnP9{`mVg4vDxYUXMS`a>4CUB+pW+<>+p&hImiIFwn?7_XFAAorKEV%KiV>>m4d zttW1f2468O@l~7w(U-{Yd+L1du}r73tvK35o6Wq^H~KNKddia2u}013-|AQxy`$0v z@p&g-8rK6&z9J5XE%@J(Qncm81F!-#aC=}WO%==lYV#8Z3P2x9PQTwj!G4(oAg)$8 z98~u!KCJ^gsShaeTX81@Jv4gU99Ml`m7JzPp4H^n^E}h7!QSRr?i)&P&H**-RgmTy zA71PMM$z{_5CK@s$Jf7@R+}JIu1I8KZ8uB6qTm<*a32j1`S!q3iPh}Wr9cyrk<83( z3b~eIG?|H@k?LLG3387X(bD!Jy(*Z1h>GZfvsXvXUaO(In?`TsaGo#H7(e&H?9 z6Cz-v-1I+w3^>dRBApG83+4gNC^<8Adn5#V{D`=2=1p&hWGD2PEE6Kem^_oKpFF<$ zjd{|$2LjEX_bo?*>kovkR(Do^b{Z({`q-v5gc}&c4>1rI2A=bfZGyU&f&At?K2zEx^E&B--LQl z@m2)EW}3bGE;PARX(%2Gp_G10u^ZhgUuQ z0Rn<3I@G8+WK@*7cJ|5`9+*bF3EwfX`rVkTYD(b2A;4?L2UKtvko`40_nIxauZ(%( zZXK;dT0}&5Rlqox#1dQ|E$HJXB$idibZ3Hz_Dw+tEa~ZSQv=duh+n%XztDZCLkSLjQ|GKE$6Za3=t+J-5C1lG&#uXTiM&#rDRvN<@@+2C@pXIc~( zV!gM$y6a$zEbA@La$G%G@+Azqe9j_m%g`dC>m6}fHf)apz=?Z&0g|L9@Qwa|B*_sn z4w|Gc+F6k8UE$2&#Md_yf zkd5s0W;D^2bA#JB7U6U6nZ$Dj5G3Jn{kJ!HJ}jL1pUr#Is;d)#?kZ-9 zS&&teS}0aehkytV$o3e#m$?SSY82#8k6%Iwd&{EGJ2#ch5J0UtSe7vJ!YSy`-Wc1g zHt}~4Cll(K6=7XidSTU;dU6@gru-58v};kxHC%N%Q~fPiC8z^YG(cEUgg`VWliRgQ z422y#`?0c@(acX)P7DrDnh6~i(qYD!^fyXqGJ1f^Xm))U%rL5;Q4><6IHwLjFWkk3 z&d(fS_)FI?LA-n5oyu;{o{l_bP8ZC!iS@jnLOid?g00oyh8mDJ74rD7FmP7uueByB z23y1cf&PUE^8KV~wM4Gv$fitgyrqQ^ZB06RR~C>Hdv(vtsFB8$=)umxq|EyJmnh#2 zx==#7`$=!#G;`jQ*EEm@h*emW#DB#HLPQ#%Y(q=)!%H>$h}=al`Vk7xRj!T*P>zl_SV>)M84MY_A;Af&sc86Gs74#{^%Pp|tK-}e*v!&qbOYtFgVOab$kf4fPF)wR(-q>qw|gf6OZJ-f+; zvxvq+xALnlAuQ|_zHGg#9HWF&M`tGi<{!Ke7KzPN-6sp+h$irWw{&+*S586xdi9`t zF3DMfLEH?(`S_9O=IHqoD+eE37<1z=U53{T#px5xWrOnz-Wk30k7gELAEc(4vsyT)4jrVhn=k>65L`gp7Msj3%v;`$b6H2CSacbp9VX7WyWpK{PDSs`IuLH!9 zJkCv8Zp+cc@;wlo7pH=^S>1Z?Gh^VD76WbD_YQ9cyP~G49bep#a{m!j$ZvDc_}?+V zd!0*OX#@zt4osbp1&=GNH=4ao?Z9w8K6$MO)C2qv0O0pBw<|w&_r7lCSlH`O-m&Er z3m#3dfw89$i)E*e=?>f)s7OHe<%UQsD+Ag$L*RV|dhl1~065ZfD%}NHl@F?=hl};K zo3^**`r_Rv(=(3xCR5dWOSfjF`AxHS>#1<-vQEzq6-R|$8D)lY;El|8Mq2oHa4jB( zvbL9LhRm!0uO z5rk}ro90p1X>ev-M`ycifNb54@EVwYn+t}39GCPtY))aKR6_z$(Dv^~o)9Vh&g$8h z`HaPh8PiE}V5hDbK*vdl7W2EkfTSLt;QOufz5G?1Mi63Bpq)1#Fh7P02h4PQ^FQwSFV^T>PtqYpqeV|YkW<{-Uf!!Z zuKMR*>Lqe*-8XlmFnFFDDCbqCcC-I#LyDTbt8|%eMM4+f>o%so+2~oVblgoI**G|9 zLUZ+bC}01$$gn=QqAThZU-$7_8B$|i^!Wu?h<%QU zN%9OY%F&3x&hROjtmWom_VdN_T3aoby3e!7I0kN7j7$L1;!ergW#tyqmc?CKe`#51 zKj7Z~f9%!1p05(DRTqK2zf641HtsLS(EZd$-=!&b zJ3%`S<>Vb~jrd~(kkHgk_hI5dtyh2Wdc`gSZclsK8aE;9&1D^;AR?_W(ZqL*pZK3~ z3vNc~m1f^#mXSV~km8EnFvJFj|pJQS$j*d|ses(eE_Hj*9sNs$NtOsBn*y zU?vBQ{|Q*hvA-E+flqBt3;Z*?5D^woJGX>n@BazXU!`hlN#}a*Tjp91>#6)-Cg9d% z{G$-tP~4ildDc1Gz0;0}6z2B4FBk#!1&PXB=G-fR>nRjpmt;S*dH%%!GKUSj*6xyC zuI~5)roYEp|66qKrpgMrJGdHAT-jAw8Ew*_LR4rt8Kiy&vDb&Fo-x;q8CeI~WTGWW zY`a+3!dM54iZS>(bc%Cvbo$Md&P+2mTQi$Af3CWX*mlp=b%VYH zf%DuTsCNcSuQ$PIURx`e{eie<0kK0{DG@VR$wTEmvpvv30eG~nZ)&za3Ag)fVsNix zt5v>5w8MxaKeQOJ!nldj2w+Wc3B0K@)K}2I4(1*< zJ+DH_Sk$lKz}JON;+xfW3U)bLS;ZK!zg}{7^+ZZOg-&>ta(ZRTK)Ce$){n*l1r)*8 z=y82oaW;^{lQ*cOR9qoQEG#YFJAeR7;8e@DrWkV-EbEN85{=3JY7+97ZM)HFjQ|D_ zwJZ9H-|l8hPWZJ5%ZIx>l;x%ZiVffU1GU1A&L`g8f*zp(q7F_FdLljx~y@@hF`uAw|oJvEHY0aEeRJ4UM zmR9lwppoYvo}JC!xrbOs~zh$f#UPy1T>6RjT^wDulO*GxK0 zE2V8-rYbp@DmlTCo0o$Gh>~mvqq6NquR^Q@hy!K~4oSz7$*C@QrZ$yGppR|hDYhKa z57T|$0_ye6ts*SuR)mz}r?F)0TTT!a6EaPrU*_M2(KW2zsCnYh%jt-XuO(4nMQ!X zOgGN2FDgA0dT5KzvN{bnowE~3Ja=%DP{V>Uh_GFMcpixEd_5uAVXbJhtQV>rUP|{K z4P%jz(m51O?eX1uF&)SpS`rGTR$DAI2M*E_T06_YR$N?(1>26_EeaZv&HBQjWOHis zFfOr=!yo-=JwbmvV9Qr0ujR-Cef2+UXXdBO>}*(c&gVx4?+8_$){;0`?*q6)D?B{S zv+0MZ@(dG)4$rya@bn)xOLKbw+u zCg7!DoNlgJ2Go@RP0JXqNfEEbipt&xrsCG<1Po6!(7#UWvry(2h_6!lR964@eK|rq zIy%yT_0P85^xrM}TynNtTqORnSsl$yWIKYqJ_Ha%;+ds<_jo1~Wt6AS|J_wkK_G+m zDr2~#;DZsfWVH83!H??6EH_3kC zU<0k8)d>-gYA&qNP!U&|Ybb|8fmYnu7^s>yftO8sXwKz4z6l*V4JwfjJXBN_exX=5 z1*+l|=ofv&`pXKYOl2#DuqXQ>DDN{;-AtN`nhB+@qKxH4$(}Wdcwe$Lx4((jP<$GN z70CUx)mps-p&CdtVe~(JikuwqNl_IplD)cofgzwHfkKb*i)7+T4+a0ZlG@!Jtm|VQ z|HIf|2)dZ-neDWHAAtqj7P=@lo&CPTl@Q+|8I9+?gTDUTsc2&+*VUZdocmuKZGfZ; zIJQ4{!x4^@ahYCu+Uo5t+f}{EW+deHWB;3x%GMiVlK^>ozW>4o*|;@JP~D2?=hxTk2vfx66D|j8n@}cV9@nffd5V7i^$&n@|br(4itpb9N=3MV1ltXi5uq`iTsCf|H;#!2aa$8A_x0Fi5YPPCrn{i|DJF(bLYeav650lcOI&P?rY%l3!wcAh#T zZqF{83yWd95Bsn9>q{-sq~6{;irU#oaeM%%T)HmV<2#f5u=Hf{>S#?tKO*LUYTx+{ zX$+{|xI)k85BES%zV7A&9*Q&HOqabKm+M;Re7&3s)~HLh%d01Sn+q|oMN4fvt;p)( z&&kw_^DQAA1JWvjU&b)2D2_)5zU3mY(yNqOi+fd29fT2(%@Meg6w8#Oi5I=|_SsNU z!S4rY^aO6J+Is&sYB_#EbRFi>kyN@%wGdgT2Ey3Zvc2kJ;6fjzl`~F7eN4H~@moXQcbpaaRpG{4!0FSX_>kgG1ld_5Fm^H}}8o2{4Ji2H5yDX>a^^eFWe5 z2|y=F{PB3&?zdJ0L2rtEM&KX&+pHh^U#@1=k}`S|pO4xpuajG*Pq@O0wz)o(-~uXD zVbN>)8qgC&92dt6i79zngk|$lM)$Cz&k{1a7&*nS6Q?E7bQ-Q(FI>d_KHgoXLq|e# zo1I@GUu`x@Q++byd@JrywAk29ymIeQIPG9bV|IV@IcMVY_A+EP-+|v?v?IyR^M(8( z*(6b3Duj`wWi#y|R0=e|VD=KDhG$rfz)J-X&cWq|dl3wDzLk0at1H77Hnhcx3WzrB zg}o`IHy4S1B6ZE*DmbrsDwxn%`gu?j=25Frt*x%+xPF&{C0(4mCzwEvkZ6ldzn}SA+KLK5b*WGAAyPZe=LNh5Lo+D@5`H$+jG$KlTF`9)HS*g<<}l< zDfvo6Kq-a^{1nlnJ@+0%i*l2ESS4k2EnSt7qaJf!xE-@~v%&3&X22;LHh){+op3=) zX)xVMej|7xie%u%>iD3@Xmu*tkT1=oC-_%`5m~&(j9W?0p1g_@A)B|wxi=Z^`(oyU z_s!oD#`zorzsrMvC9lcC8~frkuRc^dtNr59aC!np&fdG`B}+wzsQtK0j4ZUTC(Tv)pYJcoU#Y z#0|3QQaYQm)y@-W%qW;3zl9~JFZ01TO@Dcpr*-%w$;jN3xt=||fOf>+CB~lGnDI{h z6Gredx{U0UiyZ0`m8qHw45KOIeY75#tIl(=Q}B0tewPMKkiJ*S)3kyP-0DR^8Bg zWG5Gv=d6#SZ4LKYH26`Iaa0xd1l@(tiiW}x_v9=h$YSVfUK6@VqktP#k;wrt+YWkU zW0CfjiWnLz=$@gVJ3G8!nshl2)yBj8<$MK3UnL(nS=j%nQi&@Xpl~F8jNt{}xuSNzd%!GRdFtz1dsP8W#n9FJk&I4KZ#@Poso+N|ur~zKjUf^3n}*EbPW7d?0zm_ncYCU9q{J#1b3Kil??E7J`fF zP}$BNIQR@>tgiT0)L&S??>`f?*u3o8U3I+pHd#T*?Y%6gyQBFgv1&^Ca>9>kQ(YAq zZTm=@_Pg`HIGR2sL0S7N=r^j+bjF(6L;)Pp=GuvDX6t_7*~8fS`1dgqJQQm?dql%T z@(=Mf;kYQV#s2N4FtZX2BB4Z6y_*f{_UhHZk|+udAp%qQV@Oeo5iz&IEt?pe?u*-W z4>fE$KT3HdzH%JJFg$;GFXQvAH5W+8S3AbXkM)}`H5c(|( zGXvb&6t6qf| zXK=_I7A3rDVk`a6#8)4!VlS38d7>SR_`5{=@my!^a5*FyNDEO)CkfqA39^Ju5stgR zj|<}Kc+pc6s1EwVTXs;KA+VMwsffO<7C~M$@Wz~>GMD9_^mY||tKR{a+y+R50Z^dt z7*0V)-KrzxKIMmn<;0Ml_Yru+ay2#ow^;eVeWqRsD&y#n0yw4Z;}Qkp z=08vFnD_5@ccrV3^VdphfC<(}M9j}r^OF`g#|qMLOL%;sKCP4oBd;fh%jgS&-=~+1 z6j@=fG4zzt+{3pI#TFTgw_kIFbL9O}5VkYaf>Nw)SJ@o?Y%Wz;xaN zOs6L<40kL9xj-c^?`y>HJ0-J#IHD=4Mm1b@86QmKQz7@emYBJx9NUsv10{ zCWq$sLZdgnn_PzA)dbx`Uf}@z0!|fzUYTo9utc&30m5Y@CO23X#uXF;^(>29)?PN5 z=Qt!OAFj|uc#9FGDmaSHDlD18=XJj)pczoS1!oFp5FiFMF;2f@dciy z6ZBtfd4!!YP2XxWg7sKhkA^|^gn^2Y;vsXpsH-@YE@4*F%iJsGCQVbvLm=os5Zu(X z=+*RhpWmXd8(MpBvh3O_b$*1r!T+6)wjB%KadN+F`(tx9&c5P$(>6|t+`{^Rjeg@G zzNuG5s~8$&g!1qMAW)~o?cA=#_Yl7KUeCDL@!jF_WTgfHtHAb-DNzD8pbq`?aRkfX z;ykVEl>TB>1lln8RO-zTP2C>{&a(% zKdo4FhcSR?_2sbTaK$hzxn;t~@5t*wT8~6Y|Hb{;P3~>Iu`Gu<>)}WlE$mAaHfO$y z2Bo(TpqF*}W^Jh1A;&jmV|NeeG{uUh0u5zByHsg;`%jVbxV!s#zySvYWmsu`a&K1+ zwfy)`8xD|Aly$Kz|BIFK6#>uHflm7LWrEl}S`{754ArciwMA}r`4R%(^B^&P((4K? z3>kGkUoNVEq95hAk|VkIx9+U&_8{Tl_AjKo?U7IE8IXs}l`%4loTu+bjH}@mu2Ukb ze^}Z)GNu$G`IEqhH+xbb);)itEybC#>MW5>NynWfH2PktqX4ci@k3q8fQuEjT`W$_ zGQ)E0>1^F#!t4%7dOhKAW5KS0UelxT3eU$;yZYhkG3bln`RmxJZ!?d=nt0OxcK32l zwJxSC5)wN`eg&mVW2>LFWCK?8Ys}1B#sfp!YjdGKw%!rf$@91PbPtq>afHD+g*>AP zO7F=9m{@P90T|bs>$j&nic#egTKX=_F`B5nnBn`2k%;@(^x+%$4FJS=^Nm!jI(apq z6Djudrec#9;IRe55Mr$z{;ED01HNEmfVsb#4P{gQ1q}dg#>enCSU-P@m}x{JnAe;Q zyn9h_#3e+;fTz_z&}TrBrjd2@fs6{N(Y&cpyAZh@!>hW>uv9?DGe2wsXg+nz#g*?r zicV%N*`b=6ykUT5R&iTdxpZ#!+-|ua7uy|SDfs;)2XxP}#&+Y`hQB@mZ z*A8z?Dd*AXt>m5D(;C7LZ9DAnPd41+FdF3yE&3kt89HL}p_vh_I&A?@QSzgzQrxG* zt3}-Os!+4DyLzc1(lCg>v>>3BDEZXq^joTEt9aZ55l5CQzZ(eU12SHNJTx(`HgH)2 ztP5216Gj5=PFXT!LBu?%=XufpYGEr3`k|HF(I2T%1Tm2c@EFfYf!_rj&8aKLtK0+y*#V^1^=4bHcx0-c7QJ6w>2E%|9s zs*%fAGbk~z)W3F_(I)jckK#>BU{)8K6iw&7(d#xQ)i@k^Gp-RV7U002)Xrp0by$jH zGd|Hv;2FKB>|=mepc;AioOGsH3BOtIg+e>s7+h}e?f7`d;&O`DfXjy{=6O;#U)z3Z zo$AbMWvr=j47J&`5H3+EnFDCz8Vu@8Vf{sCb9Q*6pw7^j5p_piUef3dv5p%V#H!RU zF2zu`KFUUKV;z1Q@t?iG@#;D!g?s6Xh>D`#uShDUx=2xu+MkW(*TZmOzUhWV;m6^o zBVZ?fn;iS+nE3(ZX|G>__Me{XRb*TUIO{TNnWPgFjqNTU6KzSgtb==z3CCn^@R;Ye z8tT>z>$y>*OeF2;^b2SiJ+^nxE`Dy)@@Ob^X z_0J6f%ikH#GE?K5UB}Pg{rTpxSMoj`uR9f&(%T5j9`25B@dexuKA9rG5iLi8!chhB zi79aXo7WJPX-@0pb{rxcXF*B9CihyO*x*jnS!I#a2QUMgPd; zPy-gKnVj}JSib?w zbq;htrWc$v^3e9Tk8~e*czlpv6ZrZakp@iqc6?<51@nO0 zAa(00jVd=EWX6B>)n#|mHnXgfEK+4s4#VFuEHzxf%Ig^d z85JQ2>!&B&rkd*()B6j5!wM-WQ#hi_YGHYKO3RXjZE$(g11H|ql41?E5hLm^rnsMS z?2U~Ds+EZ<0z}K%xknH=m6#D`SAJ#mOvyg!N^p)pQ+<#q*`Q^vm0^EKyHnj^V*PEM z);fPCba&OY+~CejL+RSH;J|4vkA^9xCVRfQHpo;1!7X2_QQG1H5k;(u^4WBU$33_` zu=$$}<#yLod)M8gG-BgEtfGG80xvdoW4M{7GYY*S%|gbz(tD-w)1o&}LK7%7<_{v* z2iJ4AdTM89m?NFKx#^I!b*(tNWpWsnoqD4gtDoC0IKF_1SFs<|vP6p_i$NATCATq* zTAbd-7NrZ>l!w55v+zNC1xdrgg#ZO!TwZ=Jxo&Sw(ul5WW-;E?wf2n&+gGJaxxKR6qXxEj9RMf*Ali-bmk+RG;G5bkC zlsogWUvIA+Jb%b8BhMqIpP-?lV$mqy#7%W!$^1t+CFOa)cLW&<42KtdtZs<@hUJFt z&-BJv!SS0G-);5{xRX&-)sDuSPMq0kW{!QW<2sA*OBl37%5+9}uP2u#p~Xzfse3_5 zsw0{k>6b3?zcjkAxa>^!NeChOTpM)MIPkPI&y;DdKkjdFBx!yN);qj6 z7yHE$ccfaSKMGDXYHq#+yCeNRi*eVc+sO+wZFu;EY%2vG%dCZS_)87jKP*7=O0hTQ zW_Tszy}e~?R6o`R)&!Mz#8~+ZgFdNOOudht*PLFAb4uPeT@+qwP^dMBYThQc-KLL~+?`W9bn@0-Yn4@aU_QUw`G4PwH_UpV z+IoB+_AA-%x^#j0*dY1l@yEF@!qA8JQGbLeb+~Vn%ZY(wWCAY%nxlXBQ2_<;njy_d zqZ9I>V1oF32|Q#vj9qdMj0dipe&yIXTag)s$=YGDn?X!TA*{GTsM0^dSnIsNu5iCV zVY{8Fs8rKcQDCA~F`Eieyx4CbSQwU{n;GU4F?Z4#LDL^qQBtV4*)kxG4ZF!*Wx|yE zpn8$6`ntHq79`O}$u#FG1?l#M2X~jJ9{RAA@s6X`Qu+aUSqL`uFi`pff24M4ft==I zUW*ICqiDs71ezHP94I}DuqNn6Uv`fOG5EVMwLFR9%Q0o>0rN~ViV?O4U9o-wMI)`f z38~-R<8NRgMxOOBs^;kOAPqzb$MrV39XJ_CARDIVP2vBexcMmaC5A9h`C$W>lLoJ& z@M{Acq$=%$F`KyB&3+0j}<%@<}x!HiHqTL8gvXVNqP&8&3 z6w+#6`on5>&orA9KdxNVsjJS6xw!;EZ}h>M*g{R!S2U<6Ud~XWpZK7P+l}Q|P)D;5 zq)ogx61qTaEyqoY-7gcb1$jE(Oc2~N%qHZo3HxLVx+euAEUNz@`poMV4HP(4TZ#O=6v_Dda@2|^(CQbE zJHf)_h2X-o+I`%4`la7}eq=hzq89aJ=1x>Uj7Yij?q2Gc!W={kt4Ge5vUibRcnh_& zp3H~Ek=XgO8oJC{1fhp*&JTkkmD^p9fJHpYg;C8cet z2q!OR9e0J%gYbS~-r2!)L=nV>uy4FW82%+~Fv%9tw&B94=BaJCwN#R3M&DC_8%mYh zz^}v%4Cb6KLAg~%J=dOL3@Mi|cWfoK)Qw+#0OE15jp*l{`SnO$6jiqth6R{W9s9+6 zbVjdd6ocVAWaz)o)t?nNj^fmi|HnNlf&2MJE*(```Qy-9_uP!!csgf;-eJ8!!m-@0 zr-HhV?yQ#FZza`qCZphgI;T0_&%6)0F`a+Na%{3mVOL52sGSKTB|3vT=T9n0F^+A@ z)}xGf1aq9Q{S}fXYl26ou-p|a{hA>==LX%?GKfZaYIlPBk!~s7RhSCv1u*Eg^POfzQ&h%4Egc`051FiTQJiNV<-*P~f{Y0$-n8jnf? z^({pkYqx;yu)64|)g4F6bp@D6rCo#{wiG=lQs%P9N|e)UqDT~h=!bR5mVea)^?+K+i1Fhp^IMG z4ytH{Ejx{^uZ{ZnB@pz#Rc*|lpWnb4xfl9j32==M2Ydmzs(856w>14fSPbbM+E5}! zb(CRqgod#dPnpOm%GcX=S;0`UFV4<1vGF{RqWX)9uv8mn#;B)+ill z`aN!aV1d-picVB2>j*x4s2mndEH7wC|A8HTF{3MtRx~m{T749bFnW>XP3&ri%P?#- zC*tsLfO~mBwMPW=gj$=@50Ffc14&)mS~?prj7=nM?5()@-5QAD6o9i^qFgwkG$l3l ztKnb;t@y8k#hbyS+vLgqca{GOhxq>u>I8IA$k=Vy@8%LfUyAbQv`~oX9}y^{-u#$P zA(Nl}neEa-^yLWAIlHSFAsCEeyvqD>s?J#G6Z-K)t}r@uZ**CLk6-?A@H)K>Fsb8> zufQrPi%8qOPO&3uZ*w=!pHb!C;n{A`TL>NAW3?{CLQ%L}-SbNd4~rW&-af)wa6U!c*&kS{@^$SU#tG9|s6 zrAm;eS2W?fl_VbriU*U5yMGN&iXHDfgD4Rl4$vOl^AWyf-+c#< zBlxxN?}rU6SMEbpxBTH&`QK8d*I)a-2gkI|yzPI%NNj%rF(G5}qtZQ7RLaREh7lBT zRJFPsZWk6batgjo()NKw_~}O6OX6?VzL~<-cA`)R!zqWo5fTK4d^UlbkB5#(i075y zqW+G@hEK|`w3uUKmD^s~U8Z94B(vVVT^N44y7UF*!7J}7QLDQ(R`cA-vCNF=6RquB z399=Ey@iY`T`Jr`{`&mYh&TxLjk5l^Bn{ilNqXtocTF+TbLZaLDg!L%Y&aTWvXF?C zwVe$I2RJ#=z)9x%Nu9$y)}J0fMSPE5$4bjnv$xVGU&Y} zdYeG|vU0oxxa1vc$qU`@cV^cPfyLt(?vUa_1#!0ra`wcObUB>txQGmsEPiW12Qy3e zTLtLcjX~&~#lwWm>#kC0V(c(@xpuxWf`H5NH8(lCDW5NrFq!R~-j(H0FY6b2pcV#6 zo%&uv$bb1*nP|QS=|>?r|B&4#RAfUU^^hUI3O0B z?;T4MTWRUB&`=ptcF}KjB^B~EU7-J%4tA#AWM`euX{l4-%qQxy7z`a{K<7sMouM+R zPz!$Jw_oUb!e|;D0pu}33T*xocG)BTae5~71yfN$% z1^DzeKK$?;Ho!ZTfAr15zoVEx3&uy!$|fWL0rt*s#Q0q=LVmval6<*{1tYKW&}iTF zCbM`EvvBFOQi-85r3RIJnRwd~^|2qq`L%iKZ}n(*?Az~Bo-2m@@E#K>{O01{>lY9U z3!2(lt}$^q2^|I;zc2^$8exe(cCgsyKmq{z3b!5leh87)hm2$v>vC{_ZT5hCO~R$x zt&GQItW6$EZ0=aoyxN#i)e!?^;Nu>v@j}lo2oU)|qG0J&Ol%_{_s}B-+XzEuj1{Pi z>HD|#=1)H!i$YmtQ>rypqHjlvgLIuT#vKLa;vKT6+Wwp7u~T-84IEC!>i?sz6lB!O*%osn|Gl?~Z8e zF%Jte{TG|@YWxHo956CX0BWYk`nD376gyOikYTZJ!H-qeOt$c8Xf)9$NS)zfi7TCW zbg4DAQWY>McDum_`ns&P*z$a37?ew9QWBO*EQ)+t8Fu9M88o`s`XR^&;!Dd!+;%w+ z9T-a-3DO(k>9P#pYk{=3{myGVKpr%hl%EeL&=>qn3K2ajT$XxB@PugW)qS{Y zc*$XB_!xifP(r{+;u`}Kv67k8iHg%GXh*7k^_o(_QCL(2V;(-fQC7;OEJe!%Y+W&4EuD84}__?&wv)yFlHQOXCv9rd1qNcB%=)dvLZ^n9o@Q2!4~ z1CVn;JpfBzvhsEfN$YwO<81xj(Zx;zl{!A|N0uE4a{1wx1v zCQ46x{KEns?kkBG#B?r6og}ymrU1P4qps^P#Qw%cc8jPV?fnll6gizDI`?mi^nnp$ z0J0W!b@gR`#J;ljLwhB^620@qM15HqAEE9R*Pa$V{2h9w)v0}eC{+H1=BCBU$ zu=#06p#YEFgbF9Qf?PLYGz3<>#g}5i9?<$Bxn*R#;3*OGxxYWletA zRJc7O8`E$$IOHYRIp6fu>BumfFpRu|( zJwtrwyJDDVJ*c5X+rfZVM7_G8< znayW=5HLc}{}!deO})g>9;)NHSXL{un?i9mO-lv!jEq#X8$!DnQ2ZZ2W#eMK;*zvpdyl zHkOGlzdxXOXXRkSvBfI2Va`ZB{ucEo1oG7!BKCU0DXacD0s$!VKhdERa80POrIeMq^nxscCt2V#B;5gEOL?0xu5b5}HS_-&3mRg|RMxq;q zuh`MjTSKc>-cWuSCQR$tI?-RMUKXgJtoPjGK8Wr?%t|}8^u$EFK>-Lx%H0FFF>xnM z0q1GHz;y2KFmQ~BM%Y-riOq-rh#Yq*jEG%5?0?7*{u>oV|t!9wVA)i z*FSxnG%)&?7Ny@+Sz0HcC+lz_?Lmr4rKH0smmcE*JEeu~3XTYXY zNjKSzaq=ULW#UzXzw4|l7>aRQVdq5L^!QooDRnO!3{n*|URd+|xS#3ACi`232Xf(yP$%oEe!$np+ zYd-WbS`zC8S(W|;W~KQIs=@uYtf0O~NvXWka|Lpa(PDc`C1pP)n$0=SUD*u#Y?BDw zdgy@zfow_pkbJnXRYqrZdV8edL)(|WgKmwHsxmy?hESK27o1U~C$=Rhv30l4I#z8o*!x zLR{H((60<936V$PFE)t?ICCqlh6-`%48|OVRrH^cUe6+ z2%XnY@YsvLX4s)praZ9t0ZE1wSt|@TD25V{n265cxNYcupJL4@1ePr##w%}+e5l#2 zwvC^mQlV_AVdIJBaw)Jc+YRT>Yz2L+Gn@lnhzUF?T@gY5JOI;jPbsGU#*Vo=bqVZ6 zFtf79*V68b<8UYb4iC0|+F9fBH8_DbZL<`wRiY-Gj6iB5&fN@o))vQP9OQl6t+_rs zi_#;8OCCm~Q;q~6WdpN5qU@K?d}g7@#n2Z$&rd;lyri097w5NW{lDpdt7Y!q0)fDc z1em0D3QTLOyep|n$3I-tkxXcRbF`VLT*?25fqd;GzS6x~Gsq~OfcF*|tPdHv1Xx9d zqLy@HI_fgd5w1t{1mPl0s;;79Z8LMUU$$7Fo*`pon2CWdkU;KPVWk;Bx&?l_V;k^m z@&j3QWoiDqba8JS>1LVCtVSqV{Cis5ZiA0id@bynJR|iD%&I(Sss%0(SYI$5-OXJm zID7%OOV}$4JAy=Y%5mQgTipXy)yVN^*d`ip;DMa;EiwBbg3C+-`FKL%);lLiYO##k z+LkG$3sN$-0R^WuD?TO6teBj6*ltdc8?UB#es6HWs(g5Q>%&7E3m(IPUX}HK{D$q68S`?6N$Mjb4199Kszx zeYjJH0e?5wrp+BTeio>O2H{@NjYx;mRlnD}eM`TgCL5ha0^R@Vwhd=K3hv6Bnvt}B zqRQ*<)}Ia_B%^fb@O81pVSk|W_|j6q`g)9zgXSZ~YfkU*Yj`u->vabEjPshs`FGkI zCud}tgzG=}JlzX~q(CyfXe()FWyn3Q;j3Uit)XS}7|S2Jr4=5zZ;;I$PY8WdRD&;a zw18tPP8WQja}CeV*a6i?en|}|v4Y+9Vggv^))!v6yS3)z4Je$E;pNV2-*Q8Pd)ysN zLOsU~-suy3aYoaqk0z35HE!ymm8lhrmUY+DN}<^tgZOzO0iTPC@=c5deM#lbse9iH zdl2C7^}j9#LL8t(h9x|Oe}3t-pSYYoqZfbC$zzQzfCPAuKA^4z(MMQFm;U^f1r1`W zGnRv%H{vf$0}^v-LSY`AL_h3&Xa(UzzSW0ZSBdU+;e&X&}Gu)ebnuArOQGxJz^Y zoMc5Wv?T*h-`NNVu)k3guDHFcUwuYR*y+C%)7S6I;dIV+AL(O?caEcEqggQm7w71K z7au5^rf{dCbLbBRnJi@4td$ZxbGeKBBi~ zh2cp__S6N+H4OBRcu#3F<|B70Ks$tAoo@uf=^YSi-re?VYe9*}RQ`VA9Hoy8L4qY_ z>y?fv+jkz`BTgKG={F>n;pnD<=j?`Cr%Fk3PbL|dFyw6#e~L@3F;V8K`0+LBaJ1t~ z6~lnIj^|HDJ0=3L$$SBrkj1}Et=B}MUyyf7&^ zZoY*?j)$<}!i$`Gp}6rT8HX|Ew-{_et&%=y9;-cmlF~E1(55Z5^t7H%06655V7pT- zk-#t)Lm2~WN+mYED+D$-t$a5~3M;ZEbhyN!jX<&jY zGB}g*StzQ2HPeY{yT@$BZa#w^WG8Zl zR{irk=oulDXYHd&0tz=3zBIZ$OJ*WpWWGS{`JCD?Exia|+pC<`OVE>ki7#vey!m-K z*#qaMRs6*uSulN|)PJ8HrUX+B1J{T)HLyez-{wlR|_JH@H?eN=Rg&;0T7Z-N0u<(v+$A{%wQL9Sm_ht zLc7{5Hrg-v*3anpH?>S%(y$jk`}tke13v@Pji<$z2T#r>`d;eh4=U@o&cp(v#3hMs zge-i=CAuu!wKAaKJzZ#~T2}=<63!rJxNmhGPHgiohe7 z#eFB=P5G;k+I}t_#X~9{spuO6gFP@zLbHM%g~j~K6FNi&y+oakkYheeC$h{lyV5Hj zKT+Sf< z;}QTsb&Y@lJ@-(F?2hC>b4vW!D{suf$5aa#6=3m!;E=-!Jc(|2T}nj!BMnVTlda&^ zITRz`hv;e5ljvfWgWUfoD5m;`)HZ&4j~P8<%b5Dd0ECn_yk^fw|5E9xZ;;K-tty78 zBfbkw^fkv`Fm%l_R9yus+`oPchbO@zUNRQb1_s7duC*3&k;+gW$b%RCuBRjYanf~wWI}E|fW+d>n_`O1fk2wFS~Yv85__XU`G6T-QUBO-*Wys`_t2^U#jhs?o@PJsB@yBjwW)~RssN(fs`KtJ{8 zz*(RNur#B%h6K`(t@10*eV$*5~VLrkLa z8A!9RB?8L~Az?F zZ)3?uVm)*~q1MWx+)dCf{ zy*+I{|N5uZPCQB7{=DteZjgo&!|tO@R`F9Py(7OHws`anrR+-kYqH2G6c=}8vlY_) zeOXS+aKfdU2IPUC^d7wz?o7$GDa^@?dA3J7%Mc}e7}0VtVooEKM^@~E^&VdqErRh7 z@z6T+0Xq*f81P5^b2`-tsvKV@bEym~vI%)_u4GJ>*8}zq0N?UMX8a~lne6{l?SFUt z3o?;!%Gm}A1QOwFbE>>f{W)vBMQzwjP@LH!ctV(`U7b3IW(#>wkM?vU$!CKT*K}=J z(^2DS-4E*5c&XV#@*08N+U;TAyW8{PM!f*(E-F`1H$-rbBkybIQnT~1(2s@~nXA5~ zC9qdo3m2&F-AWi}ZKCC|5|n%6&(`oGX{rl2zc(su9@#~r6caM}s-&Cx({^);m}-ut z@#nt|sKi&RqwpG(&ng}H4$0$bmO5FhEvuao2ED7#IbsNGnRCu%EvBFN)L0^T8QZ-s zX4YV;Gh7)9S6SQvZ1O7#6`bsV`s7@%8miF)0CE&%~)P!J@gySo`0B&0zaM7o+PFuh z&;28!G(q|kWUU(^@`8wWbbu+w)Y&A!|ITB6E-r?r>30+6n_#7TBYl>b2cC)+ zNE8$ddtOL25Su_)+hxtaBf}StQB>_|GWi0~*y#zbS2A^yE2ZHytLeZG{<~jeT`%@t z>Tcxtm<+@SGSh2A?mkrSIe$1nNHMSeR|I(FBsg&}Ej z=-mWOLi)7njBum^;I5*LR8qoNyV|Ik6tv1;JCJnxkKG~GB>{nXtItIv3s;$)zyICSrj~KbryB76Fp}vl7njU!g-&eX?0da`$y6Nn$&<`q( zoo3IMQLNTY_mA4q0$%hE4WBoEn!MHPVW0!_Yip`I)%x0v{<^+)^)8tJj0o&+Cb@tC zKuCQ|at43}nxx_Jag)%S+dv|#t)6%5MVIUUAC}C^0(=Dd(avQ`eUpsU70I?cLr3jLwj=Sa9^QOLzG%@M}6+B zjL1yq%sMc_dI>}gXL45t!aaM9oP=;s1n%oL`Rpok;)};DDa|-2wykMtE>?A{N}2i4 zsV@QG;y}o{a{lYc6&Y^MnKhBlnr~W-4=*z3FQ?{P&*9XXJ@!Hu**u!aM??4hcsLGQ z!}mW|ngCV?vO(S>chW!jA2CiU8< zu7v?nUmjeWa34FQBQvi)Stovp0m9G$1-*k)Lh?3vyf_ z-y1o8*PnL}JyqLB(XzPfF_WSccdxd#hxdr02OK8H{6&E~0T;XbReNNV@jXfo z62GNakTQ8W;Oye7byHOFGwQAi)5U3g+}QGAicn{`-5an}Y$eLne5da1dIWFEU`B`9 z>o&fdNFj6FE4A-5-&lW6lua~k>mBuFbByx(e^bJ1fYHK(W! zy2=b(hlSnM;rS8AssN4QH=kA_{xqT_U=^oqs2Nh@L=;;r<+w!H7J)$NSWQ<_ZNhM+u_{@mBQ^Jy}{D&CUK~O z{w&||@Gl5S5{A4$0uHeq(H#h@-8W04axJN|TpDZNekiNXy*Iqwe$tEB`M6}19@QYX zDIOH!`%-Di=;a$^;(Laa-*pNwto|9_)hj+0FQgtcUYfLd5kQsEm^WCxoO?GG5;#y( z|Fwi{N@=(KL=o$QvOcw9d%TTTNM)g82j*1~5VAd+9`862rD^C*2=p|C_1CclSRwQo zeWD@KnCJh_@9a75>HaKv;_m=tREiUSOAm`@0Wb^ZlZ}jM8|av~$07ld*1=CPd4qJi z_oDV!F*|6#*XOW#o(H|J47bSubo*s+FlHir^GDVdMhIGiwG{q9K%aF}}6Ozh4{lV;<>vqqHFYBa)yr{`@6?2u#UEqoy z@5@(HV8Z%tMD&6j6IcZNrX-NMBAFtMlizu1V9asAb?ZrGnFuaVlTq64{H>L+!M%v< zyu{@_qjPh*lK`F?CqH#@-VauzWAU9E;<2Pmjb4mE37fLl`n4Usi1B6o)VnfRd4R_- zi@)|Ki!aS}gjYr1;&(26a&s!mpuHw6W7I4))?WquX)#dWkoN;81{>dIlq~wcNij$U zI)?M-)9bHIojl>n9 zF#qa1%8`pbR@m=P`kR+>QH~QRLNQ~ZS8@Dfa3KC{`SX|#Uzppd9J5Kj|6 z0vv|am(%NfW`-4(;1HAwz_08z!Z;2R@m|4>yt}cJZyp&_Qc^T1#%gdybKu$6KLpa>Xmgm*{M;hNy(hL_ zV6H5iEg6%|DD6&4cAg?h?2OnwnCU+L3FNrYC=}Q(?s!}*@38iE{5OXH&RH~LjWBF~ zem082iQffeo0wEebpo+~K~z_bBbOii&F_8|uifLdj8mHJTc7NCn$jVj9&4A03Q3|*_S&pMo#DX^C_9_ zFi$RRh-`wM2vM>)U)RQ3?2Tr!s*Y8#gQ$!PLHGbci8>m(8aKIHT?eJ3kR=yl9^Q^^ zKQl0){RCJy%;rX6fG}e(h$ogc8AIe0^MMotcEHDF$!MJyB^QduiG>6g4y|A>rwiQ9 z<281nCTA~^{mwSp%w2QE4}Uop!^Ck{^__Rk0Z2y{oofHnIY4~9-(m75MK~BY%4$bY zO!6ZrZy1X{P&x3Ld-T6pScO|XUU0}eP{hjffpD482ZMM=B91mBCbiWpTkT{4vSfni z!q1sj!{*Rlg7RiweI_|!9msXm?ByUITOp12hPUkjirA`je_gH<<--?KpfI{ol7|6k z+aOHPhCno}`2YEHiIGQkl?37eKH!`E`%f^M1`lyf4_C=7+@ud?j%o;>6>MJChsH`= z?l$%H#Q|xnZmCpuwXWmgPB#myqSw`i1KE}xA5-rtKG@eYDJ{w1wS#5QkJ`ZLTxTB)BTl@qSY#)os?igiwT2EpM zTlAp#+xzn8*frV-M;3ZMxe~A3(r#sJE2C{FT$BQgpS9uw#hm87x6_G@p>XlJ>*tC= zIWiTwdTmb1$%Xa6(+_b_8Uf-3`p|^@$ImN5GL+!ZBMCvgG!9iK>5{lSE*YOSp8WF% zs(45k$ByWB#X{^GHC*-gXr2XhId=7byuR?&llMLp7X$1C_McH9yH$HOwq2{;YFFpp z?IXtAeqN9Alaa9N-A(Hug}m<_dE+g<-*ed76e;IyPLgC$Y(3j`LxMS|?7x@&!veTD z^A|_sJudVs5!g|km7@QB13!WQi&Z`m5RMo*HT2|vtO}=1ovb&s0QWaF08aC)k$dRK zpE*0b*>aiLcYa`5(T{`fi41~&{?vGzp+X1i4l*@_;7UH>94yakeEd>0H zuMQEW)f~-P61G||)~j{A3=B^{_}J_~GWRyC@cDE4pD_{l#s2HpdnWMIdc>K;WYQ%Z ztRP@Zp$QiYh*}4t$RN=anM!L`j>k%{vFqzt|9u})&L`=?2+eH4lrYzB)_aIin2UCo zsSQg=dz?g;O1m_4(m5QuM;kv;8O&D`JDsB)zE1~#jq2MPvkIb7HJq{^ALo^f2U7ed zeemh+qo2dyAm)7`cGonWp59Ra6d^9U9-P|LEM#oknd~I z)Z;S`++|Ha2oM>kE*Ujx4iw}RUa4aBjtnBMmW4KG{RzG6Ruy>M}*`&Xg){PKVJ6M4W^P_Fe)4-y-^+;%h>lGjXf}7SNl8y=f+|Szhr6Oqnay2vpKC>VxhFVZhqg96F z<~%PIABG8>D%g1RyJ?WCsr&g7~xYqp=8`OsuE zH@gzVn{~BuTX$WN+4H7u%iGQ1{O91(%;nwhS*|z1z;uMthlZ!Vwssshz74q26WP+1 zD0IRX6q%IJNjb4d&g7#UYpE3JXPKcRG~OR?D6{a@*f)FdWy>V=DDCSzA}|@zg4(MN zkqidx22&K$z=1FfT*l7`)=(wJa>7D}gP@@#1>2k?SZ?oCHP44aXp{CTN0Pz#gP+1%1;PJP< zTM`4Q{|jpS@S-bJy0FLLEeQOcOclcyToku3^!PzYWl09N9o)`sW#s3ExQU~>k3}So zAvG6QXlViN<6#=Ewzq3`eMm!u&ABG`=5QwhoQ6%(QeDPAVubgQaN>=prNz;^%Y~@# zE!{_H4x9BbM?)*Ciiaw4Up_S%4NNnlG(b-7a`DTPHGZ#soxr2I2xIHKd-1(OIWe*P zAqj$;mg#eZNaIn((~~9oI0n?S>?Uvy(4?okJfSf?Qk^-TC^CgwH_E}-$tLvk#0DvKBUW}?x2YW3w^M>CU58<;u z*Tv6Y(fEMN`x#U4N$dCU*QgnGvHh1ViuVu3KimF>4v$ZiUbHBFcoO_%AZz^w*mpcX z%HN!TBm|YFYXyNn=MUn5ayCGez&1*aV~av2FUdlerX^?x)?)1)b5dr%;QL~Lxu_v4 zEz1y}gQD-b&yQ?kt*MXtXni!OGsg=2T5?JyFXBQjM%vP1H~bw{lbk|X_egW>GF6G++A(l)^o zPALQhG*Z#8b5elW;*HPdG)iRGgnJdvR1nmX!M${P`?c`t-Jvj;zVhKKHdwSe4Q&fpO57ERzLW}|C zPAr?VVddSn&nk7n?B;#+WBIz{zQ)IjSF*Igi>-kP@ymI zV+Q(jrYdRh<$NLlGI&^%oNOO9trIXM)2#q=6iy`36m1SS2xdKbE9nIwDd?77cyL@0 zE|u^TXo85##axdsaMYt@lxbn zoo&!30KBcUzn&8qHude*q2RBp1%(hrvcru47c^?qjWk$%*~rh!%ZyQQX5SJJo+!Qp zKrA1+cGy@oh4aQ?*Fcu!!dg`{?n<-qrttm{Tmi`g%Dp3!8T+%-uC7AV99}8TM?@yB+9N->I9U&;%3kT9nx{^&cM}1?A=;BV74m zD;_@Kx_REK0(RJR4Z8(A+kVaQU#!^te9{4gFIVu7!S-{c8I4z6qbH3%0{q?jsaIEF zmLY(BXCo5>p=}|iPOJvjDckr`?FV+tpBv$fYYU&8+(4tgSC$;BXJ^1%ZHHdFEYCyQ zhh82PtK_Z58MqIS{f(v#r$bMWrdV$$<$^d>{DhY%9|I}-t~clzHF{|9S2y|}8J=T> zfAY7o-J$OA=F1pf)Rl%a22ff2{&K;BYZ=n%U75w3d+%`O$x$I1i#xNpWCZIFYmwKA zDf9U~#~&W)uQ(Cs$FMI6|9e7%#HgxFrBQ^Q=%0`~A;*t0-jzi~!`6K6F<7*p*{XVX z0N$*ed=em8Vu+bmv$>FBAs8{bI7mCPIUeb#4fRn_xH7&0rzw-33aGqTmpneGGghpg z6p}UXQ&2itb2f7h#W!ti<<2~dZL^qmJ`VMC%7Y{;<6aFZ>%b+~qPM0Az0W{XB;qt% zIpAt+0BdY?0dbmiDDEJhM38#i_>5Iyhb{Lk1rKnkJs-P(F<2azr>t#|5GA?8arQyP zWPA7=U>$CDfu}pQ^Vi4kvZ({n^brEz(h3w{iV@v1$(~rZtTCoWm0GrlJ?c+ji%!Z9 za2OMTza3KDOWJO_q^DiUrqE|b5Gj@hqpYyQGnU!LB$vcy1^Gpi7vF!MbARl}hkPCE zmwse2X!8=q`gRf9i(GLdn(&6GGw+`>Mvxc<@W{SeE|>pZDkuH75k*dZ(HARxe;gS1 zY`TSVUi-(L3^09L9k&*fysBw>=^x7&3`i!AjOqk z>q{02iA3gpTwo4-5qPp1fYEuGCLEG1bVn#~Iel72jf>1cn-(SPeAB~oveenNj{nHm zqWBi(P^M|mJ8xG;5g7VyKkPgPx4El_mx zur`<~bqNTd$)*K-AlEr5nRwpSQ|4gL5Uq>zaRK9|Z=KQ-&+Yx&XE?xnu|h*>ZB2}! z4;5gNF!<4Z-Ii07gfd%`B5T1QQLvnspRn*UgN@eP{Ct;YB1TKKu6se}i_Ow4T}n$S zsAWK5(l>hK7bQpV5>*uQexx zn#guc;@ozdSmZQ2zgiiQ!CbAWzm@|;J>X+03Im^6_6O2HTO5A`b`tsp|FP*Wb^rP; zBXekPkVsjyq~BjkITSD&eZtzApNk24T)CuzdGJrk%IZ@+*2STpWj1qSVdeX9oAi!n zKQ3qb_U7$l4))fP!2~?Lq@x*2`3L#%aQNzjD8=?qRXtQqYt61xKZ@`H-!jtZ4qRy) z6T16bJugg6N3+m5?rduzOuR@AW&*XhK|r(v1cMkH^f12Oylnt`y}Abd5-t`P*}ruG zIVm20?j;dm<+1@EMdy^~l0cEX{b;mug(S0;g*Dequyo~x@!9Qw-!7@h<47a2yoe)% z>5EN|uiw5D^VQKoSLUa}s>%xj0CedN!=AT`$Su3TegrJ|vZo$V`3?lvoC}<2g7s>% zdT=3W1XY(*xPbZ#BTTy5cTQnT&HJY?11v2yd}j)6L$AV{q?7J(!M?E(6}Gvvj^#33Fj0kk0V7*J_-dT9uQ2XI~G~y=71Nj)xO>ijpt`-q!2Fekt&Tazx-|*U~-a z(GrC8XeDsQEtb93Q$&=?V-2w39?;lw8{2_FCXQZvoKsXQ0 zmerKyx(A1jzmN0dXxy!m@J#6MPySX_jmDa9@iQ49t#Nf~=k+~Nd^wDUW!hm|UeGZ&0ncir{cU|7ofU-|=ICz){5$A&*@W9H*yLz$$G1Ll8^giddK0tn_Y;`O)wIrofqY%hvcFO~po8XyYUU3H^6JV)q82@)DD_}(F%dTF82aP&k& z6D$#{ZLsi7;)BGjxl3Ccwo>M|(LBYPhWt26#!vOEn>zCT_^CQ^(r7b3rePu}xGN3j z*=RojbRj|?v^eO>%{%?bS97^3Cm$4*RM&u5!n4o9m(EU4Xh(fuSM{}>RuA!r`L*C= z3a7RJco2_IrGW+o4}r3TZ*`yk3bAf}dhLn^ar?(|y&vnLSa0$bG!ydy2c(^a%P6aI zp|Aq`@E^>!&9&emZ>eFmLHdBqy>82Mdm>PO!Z*51oH`CInM$Pz2@<1p+MU$y+uF_yeCxd}D=m#r z6Me#y#wN&%{?rQxm^0+IoG(pXFBi4=rSnYtzcqm`M8sB2y4pQCL3}6cGVZuSfJf94 z`^eW4_rQlPcrG~|-WOJv!SZdrVGmutbkT;di$m+k-eGh6^m4oF{ojb$L z#s~`i(vXVdJgU=U@^P`4@kcM`Y_`~`DWrC%;>p@=HURdL$v^9Nr`I|Kx(CVZ1xHm& znfCZQUuW7?-g^3jQwjCKXcF&H#Lhedt7rf9LLcQyrAjo3om9DwO!+W5Rsh! zfTUOXV5J^0kiMAmRd=|r_sfni;QzCP|BI5jBk@W|cXU+VIKjnC_9Wr$|2h~b2_YD< zE<0$p%)jpjrj}Mp4`87zycyMb4gt(UucdF!J8xL&=$3ANYCiGoFR;dp{AdqAO@AVi zTM~{7wT?R*JKxH;QhvQJ>as(CYQ@|Qt5LTPKjSKJ^-nE)MR& z6CRa+NtsAb$s7b+2p;vp zC|-czWd7Z-6JQA`xwO_z7uWpbopZ=s3?>iHs`e_&>c;ToF!4S8x$~uu`iW5Ek&SAO zKOM2V%dKl0cl4z3d*lqZlu&j7MpUD;~o zn1Y-p@G(VS?BH>Z$-${CVD;)FR``Q(Pk9)yYI^^M$YT4qvZn5NQ&NZH4A_TQk2jK} zmXW8)4+KyS{Sjo0W5krXa$xY+Z^>c23kfI=zqeV|ef2>2O!O&9J%{E7a(?%foo99` z_m&706^12sFVs8xy%`F&_rIX*Ul}6KD}tB^e*u+eP%HTL31HRE4A_j`5ITupaIbi2 z^9I~F(G)h<9Xa&4XdOH&{!#UAh)y!Lc?oBV&!?>_3-WivpZym(>Gt@XveJ@ zV2k4B*E`Rqb_XL;if=HPX@lK3bc(Bjv(1-M{BWz!+xgG&ycoZ)pG}U|x}aTa-eDq+ zN1(G%m{k}P#2)4gaF#96wtw8%i+Q?sUugcgOty^1)TFv*luCy__TY50yxG2Xop3Cm z*%`GP850|i1NgvlG#d;n#a8^7($c$lg^6kex#C>+ZWoP300c4B!Y81m(wQPB`w)IL zw8&Q%Z=|QJJpo?Kpog&^&^UwK*yRTj2b%$F25rcv!Gg?7v%b|pLHpk(-y3(}p3qM{ zxikE==Y^6_^Zr@(28q3@I%OUdJ8e37NF@Bn7n|pRWzzS-`7<|w#9eTO5%X(WA{@Uk z;9xKrxj8XjChw7tTT(-2rpi_XJsk=%YQ${cPYxuIRnOU7)y&gPjY$hQny^a2o`#2( zgCCP|$t-$;gBGE!t8OlsD0xz#rLlOryTj<5PW1GZ%uCqf267n~Xn_hBAde+*^Q)<) zs6>uo2n8SR9QT%u!yVl})6vA~-u)u(@x@$N2jGQtSbY1MY1=PC@wM*}Mz=;s4zB_E z&cMz6X!^k00TIdKtEsyy69lcv>I4U(f^I$_9aYcuco;MmchBgc_=GsuV}ckrfbTd^ zPyYdsQ#(RBLL2cqBhF=?KGLtR_QS-%f%Wbc8!!gO+D8eTSG#Z_7|tHIL_FLOoEhai2mgN znax`OcAUL(KiR(gyPgDs{Zq)boV|ZcN5K;&^557kw|~ z;%KZhx3@5!&0XNmN?-?{bYGRPFoy&q^kH_a?m^f9_E2P{9s##FsuI2`t=`Inn1CHxCYE5Mg+?k=Gj^cdItEYRCir^?9AD|wNt(5P9RP_I^g~$K zE~suQo^5h9+aOD^aD7!IF#!r8qm!3LcTHs+y-3u z`mKSu1i{LFL)A%cY$xtYGv>&JDs?w>ZVNMdmdLi}r{nur6*n`VH<$dtI2k&jb{~6o z9Y3L>vBnvTkm>-~y2wgK?axtB6)3B#CuqTHJAS=0DjsZHv2u3VJbx*%&Zt436;3RP zSt?EYE4AC@!Gg%G%eM=WHh|jnX@xH;1U`n&;vYPw6$f-tv#rz{34iWvRqXh;NI`Ch zPOnl?7I*8G^hi4Bsdji{jf2xHln*;+JEop^eu2o5Q+@a zo>v7fqU!+q-<_RvgsP^dZ+-~PH^axTSAqATRwRh>ir;#KWN@@Zm_Z5^Pd|>W281W< zfTu6PA{GBvUf~i0OUT$k*3gE{NtG)fW(T9}9_rE!ccVuk%0QNHG`_m}$xRsMz9IuH z>TwA_uesQ|eX+Oq=B}FfPpyq6C+7-%pY*IS%Wr+v@xS`J0c-aL9SAUW!i0{~`ES7}M!@sStMEqs0$(2-lY_ED?}M;Harm(vSc(*tmIsYmL~(w;x~;P( z1}Ivl08^{9LR}6&Zu8yl;t8IkL`a@J!}kmvSd4#IK$wrT{s|D3{HIy0mL5~_?e`x! zF!Bzff`+FgPt#rOS~ZpmneTpDiELsB{|75@aX!m@FAtN3kp3^Fv>54R$XIA5t7YrA zO?4ag3w$cBsj{Z7Zb>y{;w47_DQ%K|G2R^Sv+p4sX@|b`_7n(3R=!#_0wLgQXsZQ@ zV=(dWt%hgBj8~-9EDl$B&M9^)>(m=q&Vn_fq1P#__A46Xt7$Tawk2@e2zV3T3R5nY ztjb3cfj9wfMbY*>T7k&WF}bR$vYVOm_-*^I2f5#y&9#Mql;X>4TUDAlfcM*@D-=J!-7fTSumzIR-#wCeM~whr?}wbUt*2$KCSvp! zVr`RO8_OL1_=8Ov5J4F<@}Y^>##w;fUcXG{a#sgdO1ds9_v!4CiQ3%BCQ)=kDr;-= z0NS3hZE@J+{O}X)#1mZRt!tca#PTs4A$NWuJq>Zgt+}f+{5Az=fXhTLl6;$~EQ0(# z`Xy`F0vEo&L2dYmciVab76YSP2!-WXfA4=V5n>SZD*#UpS}Gb{EBGVW1aPGfB6QGt zPk_IX zf{vuabq)rgj&r3TZv*x;8e_Chc|I!X*S=4m1vyN;jDeUCa;~)7Zk+A*waXlbMW}-n zXKddzL#5d2p{LC@!E1y@JrLsdLzgQ)|4Ub0kft!Hp1|+x&lBqR4l46X9chIIFUA)a z=Tu^pwalmCv+jO-em)l9wk1O!OUu#Zqd=srrja_bxivCSnJTus^eRMTW91EPY1u0q zWksgmALI4lU@Hj<+@}c^s16jq;Z^u;Q?fsFm+Cya_xQ$iP5&hLnnIgMup$EO`5c}P zN#m809jx|4{#tLE0{K4or-GqLss3( z?fH)=+Nu4(pg6%@6ND4%>d-0cEI%{DvZ?hpI)Z0V2FW-i6zkN4bNDJd(M)@a5GpK>yF& zIZ%MqRs;xRxM!(N!k@Mdbstkr4LAp-PpE@9XzXZKN2e-jSJf|DtwZ4yBFRDR9%={u znV)*zIpfbsuDd5{WS>VUnriOT9$4`Nx7#z*Z7athAM_p@0@4q$S>RY-4Ka~Taq*P| zWqsG>b_8_6iYizivQ7cVAwO~%Te&-K_QpgF-BQjHTf6F1*^Phe3Mg@;6q@%0d>E|% zXRu|54c&*%oq8Qe(C}%8`kXd^<3OYYPVo)>*EuBsQ^^*3rJx)VRS4qs zS^{DlXN-eFXjy2S^xC|jKs+hiSp#}%oVHk(>pO@Z({pA*L#Vz>9S{=O;E5=8kR)kr zXL5G_Qrco9i4*_ztE`3}#B|uIeYDMV5RB}y*x@GtsV(_)> z1eQRU1w<%cVE2X`&{ogsFX7+`5U;O3Tt=RVs+-G#rGtwoWHw{(PNLZ$tDl79wGm_+ z6b?X=n3206(Hs3AHro2S7+G^Iv;_okL!FB{9lGsfjcv`sh8o+yX_-bD;g zZ@A2Y9bBzqwYPp2Yde~mLt-&PTeK^YP+`Ixe@sY|9bh zk=@R2?*e{uo;`|{S@^?2Xm94#YhHO21=Nlyt5u|{94Mii7?d>DQ_el@Md?h~`zp}d z_boda*^lTQ7A$5_3?3{A?Afs6cz-7bk}-eOlL$Aqyp%JJ&bkIR!yJ^k1aLjaGRQdI zts}l>=1-r3SlLFkYn-=I|Fl}NnDK9Q0H3Tk?bwC?H*Yh_8kx8ue(%s8y+!ER`1m_i zUg<4sPMw+kM3iE0iDJ0w+6}N&4uVE--91mIb>aaI8%UDYlQ4Nc^yn2MV;{Pod0kx% z8cdB27eTav(N_r+gAWM8{mX#U=&y_VwvS{|^)ZX-R{qTvbxS)+ZVH^>+j&#VhzBjH%m(9pK>RWM1q~HLo-`oA+yeCa#ZuR#4oYk5XR_`+?RR}Ium*+ zRml7OY?FHV-&qkz0oP*Bk4WP`6;n*a0QiT&_!syBzok~E4mh2U+bsOE)m_#(RMwu8 z>T}z3VL&`rz|C0Twq1dsC$I&Lg|9gN0bkj>qM&OXx@5Ad%PEBac#wuMWz zvoN~EWRC}+C#~~J$}r&pk??DS7aDt>iQCaG*@#1{wOWN^8G>k>xEcqXnTt^Gi*1i5{ma=>vYiy(vM*Eex#Y?3LZgXpHg6cO2oc3Oza8K-wtT`g-RhUIKq{u%9X0Nz<{iylX;erb^|i`COrin;{4%yGv?c$5V42F#1Zb? zioQs4N%T!vEy3R`?44J~ID&RxtwXxc2j>&NiVy!!AbF-B0?_JLp`DGUaN?2v0;D2R zus~iIVC&=kBygwjq^ak9DZFvDXxP2v6)5EqZBvF!tVk>ntPc^6d=Pv>)mMBX^E#sJ zL>GE9_P{+Y`5HL%K9zz3fRL>Qkg1fi(Bp7<-est-1>040B=arp@ZIh6+#ej%m>XVO zcD3jozFY`g*oF(Gq#UUFWFM%d*F=gZI;Q`Wm7@0uMJjM7q-EI<=Ni=m>alg%$fbK^?$gVa(djG?NXVXnnx05<&tnnOIm^ zV@gUQ6M=q!b&^PVRby!`I7{BYyuguB1$HPIF|nd?Y_dKvX}6*AT`S;oBkRcIh^xSR z`zqt_nA_#@OnO{m#0vjcJnZbDd>0A161AsPs7&k9^PAoj&-hFl#v2!tGDHvahg{ zgp7Dh&zSuzUt46~$bIrKoJ^FFQaoF^AtFfi)5J0YGEXAOU0iQkr7%k8$=aqWM>0?# zlySgfDuEgBai*+2y|n8&rjuj`Xm}NDE+MPx$Rq-ej>ksqsHhk83F@?#S&wF7Q71Tzvfl+-VI|*Jt}jh` zo_;yjyW|d5+R^OyRI{XpKrwku> zFNT#@(LhyB>aUJ()qAw%|E?I>;iGI^xct8T5SdJAMncR@`;L$sK|UTn0p50D zOs`SVp6M&`TRB9XR53Le?_NeU9yAo zJe^b1W7e9)dF94#zoCTf7G&};)wwkapD8#vMq@zx$x7=*a}g-e$)NPD=*+FSfl`W6 zMn}M*RCjZ!y^HsC*-G#7nmR)$904*}ZT4F|jW+ zeAHsfCe?X)EJ@JHQ0Qa7NT~|?UEF*3uP;qtWeWVGt;UZ}Is_T59BkOS+a|ae?K_ut zYw7|w(*MI8p(vk03Rv}O+JB`U1$%yCJ~$GY)6&!71s{fox&8a7K|MJ^pE?8($8$~s8FyU{7mrFSF9I#s3x`I2s<(RWTMbjLF8$+ofK;jX zm^;XidSHN4)p*NpX#*Yrndp5A63_);UfWH8q$1(H3DgB7 z8+%NpqbS8OfEdoAFzxijN{w%C7~c1Km}i*QGc@q+HYZ&z6A%!*xGtRsOs1!|{q%kv zf5FW$uld^Qs7^M)m{$ESB*@MJdNxzHx_%kw_+K?agrdjs+AH3?=@Gv3P4~A&4!n-} ze&f?5aD6Y!+p2fqL|q3?s|}UnV7I3*jmN@EJ#bSAtVK z2p?dpBk3|wHv>&ZZ|M3{a(iH$<37W+|HQx-d+m;)Q^t;7h4lHi#QgS0jPgH4jJ{AU zA?KTWjP;c-`-1uEx^B~5-)rCC@KL8fEcl9j*QuJ#=`yR-{^q9Q@Rn97l`GrYbimqv zz~P`bg4obxK;c)b-O$P%nkCOC&e!{FuhHIiPG+N&cTVg3~*&*H&1FW~%Pm~?y3%FA?BXXk09^zxH4hULkxX|+jtH0zQR zU&&Oud!bhn8`pcy=m=EHOG^ywt_nezNI@_r2omV((GnS2cDAluvK~?$<4Wq@^3cw` z+rj8?B!`xLhI9-hE!=MSH!F)w*HklUkL}jmu)zaGs7MV*b&YwE=$=}~l&PgT7 z#LGCS90ea=s~?WHSt(Zk+BL~5Vg%@@~4FIXmH@il5Me+sI zm3Mk19WFW)xFWxQXM9Q`eB3B;MQ=sb6IwSV8g?4p7DGiL_u$~TZ%<4ljWm)Mof;~^~Z3m)Sf z*m3Rd=HTqs2BCuEY2Slqst!N+dXAbH@>tQAqes$X()@;H4U&-AK;zY4G`HD45ExD% z$$*^HH~8%-`L)<#)aAdkQbtsI@iviPlK<~7R6<3>M$f;J`AcWs&zeq7Ei--oym|Js zR60K=hiXGjYiiT<`@SR4L9QS+F4zTgi>W-0WRj}u$+<)K=?pUv%**xww*VgBCG zA11-Bi|JgsV>Q<7jh87Pj;`hS^mu8t@4^QH=RQmaetyH6ryb{zBy@)C(2iCH`f$qX zQ@_mUN1Q~D|FnT8_OoY4^oa_Szs`q|rpSOPtO<9YLkm;TgX7`2CScjuZ0ZgIJ3yn$ zMHhyE31yOT1gGGMNUX(;kOQAnLGC1S(AC`cskE$T!gqlRlOiDpnFtm`P-VE-Yh5Y2 z5s^i}-+*dcTK)5v>xKyS4V`pdp}2mi6}QTAc8!uOtC1Af0BIE^Jyp@u9*7J*ui3HW~CJ6S8l7RsuhR}t#_iyRd zSTFbjx!Mib$fjJ_!!D0(*^>f`;MC(eyN^;j_$260wk1|GbG0L8Y^|Yjo)9;rSFcGE z$T6Yz8o45PYegF7o~WD88=e{utnUMdTIxOT<_YYeI%F|<;>F;ti`PV^b;5z+QkC3> zd=D8Kp%*<}JTZ8a6|XxFOX7V)!fKR#o1~N_6Yb*d{(!j=8y5uyY?YdPXy|dkqOK*{ zt6)&R=DQf{w8Z>M{Lg0a5Y?!nm5YmL9({#kI_4|q$I97iN`H+pErpgwoU?*0-0R1@ zZ+7)S!4zUYY^B1M!1R;ecpw@Yio1Uk>QyD}MoVG6!OAu88VVax&%@1MvYgN~D(UWg0^5xj%7E;@{w^t+OCdx4LyFJI; zhmH=j67*z?*~G$h^RyeU^lLiKzPWUq!9XKSs)??N^oDi1^V~rYdM#>^CRIs%*R{RR zr{7ARC`}Dp^Ac;u;*Pr3JM!$XkX;JQ`bzkaZ{)fjCsvK5b<3^e#Ce1{l$7r7J_6Dqt#o%tw=_t1 zmvndC&8vQQ3-ph9Jn~l!Y0wfK^Mw8cJzVxx12;2uMqLOc z7M7=O$A^bWp+Yqc+SDI8#TCnJ*D`e(h6&@=R=`)AghFVu3jCH88k)s0UUtv7V~}y& z6?edNf0xfC#r`@vs2Hh4QMZZtdGj3Y!ei8pq1F7^(?T==#y}!A$U`-+O{xu z%QCV$2Q@lb6)!u=qoJ5(LV7Xe*rs{Jp}~5CM4Dt%@K={Lj=4Ix`SD}h>#aV`SFB2Y z%68Kr*YlgtYx)d5uPV9ddN9rkgG``aO@T{e1Aa6g40!ujY5dej7id)kP`0x_L87@9wP-gM+fakuc?uLCJo~T<4^Y zCfQf@`)R--Jf?z}FbroIG)0pI*>3b?)kA)M-HZ7zsy^^x0zR-%jDvP5LKnIJP>cZV z3y}}Ga|-F{)^Wk}?cKuZS1IGxizOodBHV#NKPh|ZbW3Mso!T@9Ph4<>&Zh0UGZkxZ ziH-VGBap)@D~d4^S?8yS6mCVV!ToINfDZfWo5rq48bhI zi`UbpkaO}p@8AY6yc$~lWny2ypZFE;lqSLnCWD{E$0gigP=kuDpSM)p?d6uSf~1CG zNg&os!hy$-{fw*(q$)1^^!03aanGV*3*`(!)rt;oK0?lUs$@=2k;zi`h-D9>)b~TF zEQht+08kwFY4ydH0YP?lcH%hr_!gw3xU#+qzdeAZ2x1yg?KB z8^Je`vGA|G_d4vBOZ2bzOcog;-d$k0o+L-~vc9_s*Mfh+5I80U*)}d57@StarQ0gG z)-bXTKo{{6xDqf7F+&em$Vm&XOiy-3R?H0;3Psi^sYYY0so$PHdvyGWhK9i^nmzDb zvDvAX&Ei31nheRSWm{!7{|jYB>5ER7r$55+=H~>QwvN-Z*7vTqWb0;a?!ZNX-5% zp-2RqSQDe1i@Bt>W(4q?QJ)FWKFkOlO}R~x3O?FsJ%g-YZF6Q5T6bM&3ntR*Xf9HN zi`TAOqt-^hH4Ec4Y#I9BCT4Q*gOimwe|o_C?6A8dtRjklEanRNX{ke#NNxANYqaznvZXd9ZRRLTEPMhAr(&J$|!L zZy7pt)CILwt`2TeV8CB;CCPvigJO+G!2X^w|3MreSAR<=3@IB0(iX0>v&2n0wdEEXL7IaIo+)T6VeUWkCg6+))l6 zILj<4`Ii4mfg<5uCmKW|6uG!hYq=@GQb8{mj%*;VFxQYjQ|U%bH-2~RmBZJME;`e> z)tMi2jKw>di8ZpO%y1p6(sATro{hX_7rpgJ`aZDd^l+;Uwey{cWkRJmOxQOfj-F+A zt`kMPpAr?6B=U#*rvl?+?k@xm;LD`CHhKd{9?Eif=H z;~|LD=0nG!+Lw0C!~$dmb+ZCmC>SIlH%uH?bGVeD8>zaqoN&dqyYf1h|@07>WP&o4xZu8d^*63(Z%qRliJ$ga3Q z|E8Ab02@k%$NHKu&H2aFN;n@YUpDU;z#?$mO9`>8($n^(q|Xn>Djz=)nIyBqw>Q@8$&1;xUp;v)Igh@rzO^l+HYDsgqjLhwt*-kw1RFg5wZX?f zIRj9Uz|eJIUL%B+|KJuufLl?Yz!vd!VNtIZjHL~ezwBQ=uk?e0x*Kc8_@soTyXQ>e z4%?=cOG$1FHy|K`oK1c5o;-u(`>c6Cq>RZC`-nq9gE6#pM$0t@ej||Rb4qgW=hqHJ zN-*HDE23Lzl@0Bb1kOcQ(T7FyXeBf6BG$sN5W-s9lul^5? z)gql;o=d6L@2dK?MMNT-XB}335LSl1-XvR4RNYiW#^$?`4&VoDN{(SxEtbJxUYlHj zJ)a(oen&`HJIYY&O|h&PGZmwg56t3A@mTrWRuuj8ZM_-;hn)-uG*fXndbN;t-xeg4 zt#)l}F)hvCby-CN-QRftF3z}kl{`%Z2fJe6uo+$T3pCz zI`}cd9*XBe$TzO6a`k$e@e;Tg&es3=>j>Y}b=TB2bK^1cV#qsYm(wlw#PGofNuM}9 zaum~Y0C(x0kFjFF*v31$a9;3J15q(`m^y&Yk*TgS8L~- z0wJ#HoYUd4Y&rYenFCxtFQ!4^VX3X((wHd6a4kkqFc7uX=VTRVi}vqH?C5g~cJ^X9 zJC&$7miscj2MCL%?5PG3VqVMqhW6rEtuKCN~0LAlO{$ zly5dc&nwZo&AXE+s16wuovm;*im(!PRg}ENpD@$yO0HD=vba5!yp6f%3Cuy7YB>pUX=h& zb}|%LM2@?fWCFt2SbIJzTQr(Y5-SoF97S}&^;TzG{cLgPdZPAxordpXwGXQcBNA>c zXW7o~iOlg%D$hq5UE^HSJ}8{MR0>*OSLY2C=6*d;W;#jCW}0BG8vgBlp(&f9%*t&> zE>eb3?MOfU3v2~*hxn?9KLqpmNq=l~7YqHPKSqZ>Gr{r^sOPGv)q-E7+P805hARLzEDDTmsUHgSF7tdK^*x;43`feb)(68#1 zj|I7FP#iHc#xgDG0o^x!f!hs!k&*MERr+isAbXJ zhcy~;lj`KKu1cZYP4bIG&TEH$9n|oxzi_vFV<5n2)J!gysI~(cHO``{6#gkY1-#Pi zF(5*7q68c%=lzf|Ch|R$UVWYc0ffRcfh1aps5{dfJPOuY zu{9DH67(BmCwVDu_u!VIS%F& zD26T0c=DLaAAG{ zpsm5Tm_P}y_=NX-eq$7T$bb1M5*fHO5dZbI!+82%bh$39kkTR$-3f zC)7gSfeUtseKb^E9MSKCiqUT}B#0=T5XGn~f?0ZAyX-fvV}ciN*kB0cfnU=8shfwV zzyWIYpN0-EO~S;fwmgke<5e+WaV+Q040cp6h)V+hzd9L(G24v`}sFmmR~u&`9H(`|H1KEo#fzg0%2 zmW2r7iYXSa?N`DcGe+}c7Bi&OTavB0f|{Yo;~Mz9qXy^Nl6hp-EGC$d0IlI7cYd3KAWOTpCwV~ zHQihaY46SbFFzQJvb-!Aj)@6VoeQn_ycF6gT$E1x7OXXde{!lF5Qpfy=k{(d1bxK* z1mlYILmwMT3bq$xt_(ByRhsp^@bZyE5E(np;)PfNEqJP=RAHJ#1rhwMH2p60%!yc~ zZyX&;%%{_Ws}{RdqtcC1b=YF3czV(r*Wwyi%aI<^5TnH2vq3tPXH-62m=Sy9+0)DD z$kT?R&s_EWr%xrvOd9IWp(YMv)a;8WjcMVtUs5XPvwC`%0B7#htYRBaXtR8&NN8zp z5jkHaRG!n|jb&PQFgks&m8eU_o?{suRa1qFc#+I{@ngUI=Md7R1W2%8O65lc=BXa< zlz#Qk=U%KRp{6wCSq0uan5W564yyJ-e;NZbC4eY@wsL|0hbWJp5T)-J(-m&7k`fLi za`dMeLnNQ`!7GTcim$L_7c(mb@De67_dH{9ZgU|LDPL+!yz^{&Tw?wT1h#?w?8`2n z-Eq4@qSKszUc~2P{%x1rTo%54%XC0=E@GDPXXhWGnksc(VmaH4>iC!tH4>g|Qoclb zuAre&y*GQ3H?RAcZa6h59%o>0Z1#e5`CE=p$h{7dwFngKsFfsw!$qR4@83GI?zFt- z8mz1WVmyxLCaWy#=E|tJv25apqas60m;C+S=AI#Uudi9ninT@j!pK{|jD^7QH~SAp z(EWFnN){dWdy3+Ex7a#uMqi|g5?WhP5YnYv8Bz{<)|j-sma-vK5Ur9*>Z8wA<2=JeR zM;pMPu^dV>jT-sR@5{;-?Fi9k3>HADW1eKN54Ux&{%YxvCCokRMO!>5FF940ehVdj zi*0>xz0iyp%sj`a?WRBykOwDMCz?3q?1eGagKtAUw8*qsq~(VgPRPlhmz0RE)9$ho z8Wo%Rt7%lpv5dx(y;HqNPmQmvpx)U+>rM&NCX5>$T~0kW-P9V6&LhP8@Jz%}2?5LW zpBB*N_T>u-AD@&PwTLFdTiH4`r-hO|@&~9bBCGvR^(Bg*W1BXAr%#!T4{Q$$^6UTM z#?EMgw+5s}9l)abtqQ7|$wu-bbRM7_Y$_lKho!cZQebV9B}ejydw`2fuYtF@0CI@; z!ESe#piKI@xUiTj2hAEP2I5W9O2@R=-+GV*+ppO+p^G9U8@8FAl*5oAm0W8>6?|zH z=pAtmV?58(V-}M6$+ZgkNvK0Nj~J{|!mg93uPlYv-)BOWAzjvl?ocpv^=o3HB7FE- z>FZZTUA~S^psw;0=i*m{jlH_+jU4OjF#|asO)^mPcjl~BfoR?vZiMD~cq4mucE>@+ zu2m?ceqj;v&l&tWH64yPAK4LRUJY?a((t z2yz{NGK%d*XJsU;1n;)J#owMp;;Zt4jg6yNlj=2&G8J_OWce(h6~-2hFkG#q!?y>B z3e&^G6s#}#c;M%TMJu$KI(&4-k=Lw~re)*T0!VE+X@ri}EQxEzvy+a*ku19$y*6_` z4%(vE$yxcE1`4$%8w6Z#FQH4EUULOKzDw+6Tt`~n)`Vn;oln`L5V*u~0SUHwVN&qg zDPXj_uBH+egYqi}ApC3yoO{PN#i947s-(yF@fz@(_$P*9>}WeQQ4Do)F)10p%I)0T zIiqcG&A1(E{1i1CXsOs@)1XXG|5*?un3H3imC5k>tN}Z zudtVRx)VyW7ZbsiP{yp~hb*=)f8b2p6ErL%6tjPt)FiG*Hk5BbU|)wy$2$Gqo2ClW z!*_i_spvgPef#|zBiyZ8i#C4xfQn$*`XYq0NyRtw_of>*Ksi91WrBOZ<}kQxKSUSo z%zlz(|9I0i*H$j)Z^Q;sVx6^4?ido7vfl-Mb)&^M2+oUgRTfW-y zG80fL!M_)6P9pX(K`V$~@b`Hq}DgBDOwoF4ik2 z*QAr5pA?vVeRVAnqW)PT1Ld7+&^GJ(+)ACQNnAhborv_Peyj;Aa@K51peR=`Kk#5e ziD8gQjtz#R{z4!hct4V|-zh3)Dx97I1vSm`Cn08?nl&0`HQw(ht+>Bwqg;~5Izm9z zFjUlwXQ~L{pRy}QlF%oG6O%t%?@%x_tSU_6tg)#de>M2VOmwJAE;hgN$m42?)v3T{nfxVl+>9J zt|t^V=d+MVqkwPrmek^q0x5|dEK}Ga>ZsT7V=(uzI&>lg&kqG8ST@{S4oGx^++pQn zonczPr`X;G1wM#?LbX!r_?yp`$eG!wR=seYt32m83aI!ffCD$>?fZZ$Ne4O$iSwPYf^r7L)7??r6#Of8P$FIR4faYgLL z$H$@dXx-DO4bkz)yVigPvuIo?NsoXwP53D}F)fsY%3&`m13*RoT#hp%QmG=D?;N8`}pR(tD)`U^utKzAt$=;ILh<>;J z1`217+AMU-xcHW;kfZ|SmP41Uf)IzH!fNl+&VHCF(O!w+(YKRGo ztUO(skxa(+@x}`l_CQZ8LitjG`#By7mK0|DLVxhh=rQ(pPQfX~P=^BxYhKtY=u_NQ zMM?N{;q0~l*ZS5ej>gAY;>2IyhcIFd^bf|huS&Ie#+A;|gSd{wI8)MqQeMHUyBPt& z1}EhJ8+$S?5}UkTn>Qg?XLj;bIWZ@MDM~z-^ND$2he~&koe+n{(+tB+JuL9?uyfBl1O8^kTCB$Gs z{7wh6Ogzpv&5nda9jTONXi&oGb@Omi z7=zuu{&H7KQVJR?xf+03?H151mA?jPUj&lhxEu)0lNM3ogKkee1M6J2t#PhJk|ihw zab&Du;yXmx|Y=r zJMwyGn(orKq`0VX%T?jRZAR(g((c2;BcrpbmlW-3(%If(E|YhD8Ms8!l*mn&QTH)f zJC&OWBr+T1O+|gV{YDbGRbOk3fwal{$U2F&f#sV{iN*{`;Hxq2bu-PS3ie7ChScrB zRf%K`##3G&Bt=a{dde6{8Zon68%6nzA1CWI+n$Q+v~jRg1T^-l)It(jWKjKBUw#t5 z#+mt|tmzK>0f8I@qrT}*i}&a1pZ~@=I#ECyA=2=9e_hlco+&_!d3D2?7H{HpW@*Z2 zueigxTlvk(Td(v?XD1FN_c1}>$YyXDxu*P~c0+OZG^iu&6FL$xNKkprrqT8mZpU=m z9iqQngxuhdgIYPDYC3!CI%7MPV05{l7dJRZ?8MV`_E}YfIrbp;gF>Zg;lVwnS+Hwe zov!tdZiCm*Ri7T;JX9nAnv*yz&$FuF0I|0ri8e6Gihu1yPDVLp7NzmdJYw49<{XbQ zi@#_Sc}CT))No0r1p&j@V5K30(T@a270|PZwRA%5S>DbtE*O+TEgLEFyU-m^0Eg5D zfV<UMT&x*TV&BLs!t_cLw(Vr~!$>~=X`fWiMTH$9fbEL>J|`+C~#2D*_= zPmr*n2-FVLh6qNFQBsnE?+F}xWZY+Z)a#p^dO)=0`jYUoQ?o*&qQa91jk+>^TwFju z-_+D}W>hdB9eOkEG1sAgQO4dfz^O6%s?X9P{CRI0sN8{K81<2u; zKCG%my_y(bhF5_})dKS0Ql%66ESUM3uLIn)0M;LT4*bMS5zy83jlS9WP3*KlDE8=V>wuD)OB zscSQV#K-N)4}+g0eto{XiRx#s7V(<|asldsiOS5$5d*dPK24qRl2VLN3N?*SU+Oi7x2tyCTFgLD6PR_-bENQDSVM9uFDYWS`^e%GYStBu&#> z$y(Jc)@v$}mk)apKqgYWKUYabDk91|Y=4SLr!QK1+vW8)9IY_`1C}S?eUiC-)j`X6 zZz8kcPfm+Zeo^t~T5RA<^wA>*-()p3$a00RlglEmkVGE~oAR)7?bX)b&$_lu`8B=$ z4}~8ohPi})?0f5;=0>!&UVP3SaVZHb4y2@#V+WN|d|3;Acx*S|S`&VG%RfpqVWr8} zhok@oKmaA{(~=6rZL{cLpBexV-0~R<%t2+95yR)=oZteqt$>%)ORDgZ<=cy&(D2I+ zd+QVicb&R@jO!Ky)3(#k4tPdxc0awNQz5LS41m)@ueoXx{?&O%IKp(*bhywUUY4D0 z(xa#M5Cgbu19_G8;x7(O-_kWg{Q*+vw`AE9)cL*bSS_M|(evjkK@xR6;`A?Yq)%e& zvZxOgP=B^mfTVIz>+}3?@d>PAeN6!;z&Yde`=js0b`#%1d5^2*C3h3CM%QrPxz*2+ zr!BV+^6q0eWBa3R8t>cHouc!T>uf(%GSW1-Et)2Tu_eeqe#ae6)aoIm+M4Zwx*K$$2-Pqfi!%oh}0w6uD9r|-gfnCO-3Jn+eI6U?$qut{&bKp^l~&9@ zPsv8@bsBB^Dyhx7udK8QU(4a=KAL%J@s|A40!Ws4kL?siyOu9Y0F2q=%O`>kX}f)r zFs(%_S1!YsxH#@6t+iVi*VbZ4LrJDsOC%%el)$FaXcx9)j@x}+T0dnuRXfscrm82Y zt^ske;{Jjt=s{LRMFn|ML<+LZ2FS7hsV@$IS|wugZ7&=kE3LFoy)F_H{<-4-&%z8w z9TZdgw}G(b=)%n*>x3?QCMVIe&H5)zBXc0kN%SQn{FbZ%OK-z^MqZmHwIJ;yQ zw9oZ*>$<2e-&M_6j9y%5Y&)Zf_mbGb*Du-JXjQPhT>0kkgEISk#~T<7Pu5Y%N0DSZ ze)du#e9TX}E4sq#!j=m=7(y!->7Vw893A@FgfA(>X6QuG?iTq((V$6bWQbmekYIqB z3w`^{4eXNH*~tNN=UZ^CP1p;LWv%m$nL5>tN0TlTz&_5$HWUo+`jMYRUniaas49oB zy|F`(^zt}N!<2BSyt&`(^7Z)-(bQ*%e>})gR)F={Hp76^{tf83)|e$XnY8N>XNN@H zw7KhN!KI9;U3oFRgdC!0K1aTJAiiLtgWbvOhW@PxsinY{o;)q2y4fZAt)V;hAjC5) zv&Jtk?_a_~Rq3E4X$mBmB&i9ix1VBNb2di{y&D~0M!{Lz0(;&-&IVF55VCH1Ssby2&EP|aGxoYW6naaL_(F{a zfdCZNg^oypNJ7tV2sXRG59^g9Z*579aYu91OP;|*gwY=>Fs^EA35JK0!~GnW0Ci*&Bk+a?5#v3b;&VH)kapRLdb?r$qZO zCOu)P+*wri{;hIufpKxA4yrDT=JTHprnWIfdY1=ASjr|;B4|(o5NBlla||L7-;wI& z6Uj~2dul!iB90$)CG=QXi|;p&Pe|y{B5?<(70~Hql;j8({KN$hxHljjhPZ{dF4BXD z6q=7d-Jas%B89gByRUe|?(U%!zxu-5Xz+BXCeK)UrI}(2!UnCF*ZDB>kun|*NbQ!L z(W2m5Ji${F6LjWBDf|ocSA#%mTn&m7^kUGoM44y)^}mjm2$@++9<`VP5&)%yijk4T zsj<;NBA^N@mZVl6751Is|AX^Q^qI9y!{(QA#=v;baz=mQM&q$bb#%hhV-h>yBQN9T z+E8MhEw2NWpcwpMtcI^v*;R zzeK?^x?LG65E z%IOLsk=vikzwH@Q{ELhe>~=4|;Lx9)Z7VhWC&U*4^3Tv7CEs1wb{w*oYlVlsq`H9j ztMURA?V*&1v@^gK4dP$4xLY}DJqwN@G+!pD!vU=PHU#t^}u z_8~Ty+85Lcj5TtZ%sR2A`=nk3+#N-(!$bHm-=YB>^=I9ys(`;8Rf6Q1uVw8%nhpCo zBmOz+GaB-k&%amHf^7ikS94Zrm2bD<++&Y!34s%7W%t3(& z8mJZK{p1x!_rbCI7xmuQm0Fjs-Hi!)mc~L}NQ3uJ%lD9Patg%V+LZ zWG-5KU(W^plDBmu9J=WW))S+(q=qbd=SsUYBw}3!?cf8PtimLwlnZ9QK{7kX66w#& ze&jrgQ5`1FB48_nu6+AJq64op;QKPli{s1&t>|6>hJR8&!0c&t%}an7Kd;@UDKYX} zD}uj6au~ta*4RxE#FZC}`u)O}8vBk9rJ86r#wQJa`qfj%#S0XuS9tlI=>Izk2-@n` z@%p!2pH4?ThDIVj4dm&%2A#Jf3Mml_+dP>iz=x*9cz6ptH}GJgldT}ZRU!mC)88t- z%gh{Jf@SAtEpODs7Jsp*U9znIzT7%u>R+Ojjl1j*cTA6*U4_$k;<kelaBt?uno zfruXoL1*(@dTZ^+CT#0GG;S8kXj54Rvqv3!#-UK9P4aEc+8V%#$oR+b>9A{WBrY1L zn#lYqNm>N4q>6L;^n072U=?L^Xj{!l;UaKFl*oKkPwO@qbN?^B-U8PM@WP)R9mra( z{!$VW57<^FLA;;DM!*~-W#1qkld^s)E9SHEd_9DfnQS8pUK!9yZ(!k=JsmTJr_C-M8Usv{e` ziNZBbW__c4%r(mFZy9koettajq40KmmlzM!Smx8B!v88$`iPxmgJ6=^y;kOITO<72{@uy5={;o+YHIyVM+#yRv*HqY~)A4*i|i1bBPp z@SEYGph9pyf3RdU_M-YUN=|G*A_#+pK4iammOY=Egg zvUPP~G z!!&MvXU#N@rufIn*K!SHbX{m7X%4wf8)KOr%v1mssShFHD&eiObSo_)EKSf+a+d7U zt{(nz%qT!h1I>w=hQY|nE!6q^J}fK!{p{wtxOfqA*Yin=KkhD=OpruGHYxbedC`C5 zq@4obwU`jHU;O?0an;Fa5{_etS%&wz%tl`oQtY(ivjrqCW1(1=4mLv5ty=Ty5dinn z1hz<&oMhap_I6~bxScT~h8ekoAmHO|eUwbiqpadz#$2#= zrbMN)gt@ubCnOf7R1GeY(TRe#{Dc`7T|A8@z74B<$BH79P(p}O`m+9Bk!(WPq5$ZLUX=CS1E+h|xn!kq1=<5!| zquQS5D1c!#SRYRNC z9(6d}DKK?cEje!Y_Ba8#etd5Td<(Fi zl0e8pPIV~}9v4ZXg{AS0}0t&Wo4T+2wz1+2KDq10xmD$CbjnU1I4SvZ#-7)&Ufl&Hw-etzi||xhf4Bc zB9R$)7MaVL|BZ}DGkAy|9Ok!Y`mM=AF@JlW54^_<5`;kWMN;UM57Mdz+!hq+m|i;2 z0AgguVfkfFd4ltY$`&OVWO-Rcq}wdNKpBy06IA;GcwGp@D`u4vla@A>?U7oG#fgwZ zY!d=?@nK!8eoIwT&gr=`G!)T)Bx0e6asAS(vNblILe)O-tE?-hbVh?PZP9|elQ|kJ z@SW11yFk0V9OVl^3F7{z1vqKjgogkcfTOE2(ER)?QBf7u)R;hAvpn2!pU{91YULuQ zih;P^1`BBYk^3j;5HiQMe_2FFk&Qsd#-z!5lh{{62l1oJ2W)<<^_`Tvj#PM91o(rc zOG=D8r2xBS;^>5xli1&V$Y;P^AVIdoHw(BdBk|xrQM`!sVT3o%$%PN+FrP6Vd^ic2 zG>@lpUs=CWSI)&N26Q4e0@JePurHfsdo2X0kWY{V*&6vPZz;%09`GWI()tN32 zsZzLk-}9AB&t(K(2&M`-tb=Y$i}a$(wdsuRiQtUZL)rMN*Dv2|wMYY2%F*enjzVEx z_b5%Y7CHcsPk%Omg7fCb#+vBuNRs+lqv3|F$0f&6+kXKk$3~}Al(+E_eCT4pu$GUx zaao_uGfWe4K#v3BN^AT|!zpuB<=0>=7T@}OT!weL=#{UGp4fC1;;3Y!t(Kk6d&Wb!(xu~U3bE@1yuKqO}H;U3E$ zU3YFJ1C^GntV2do=_+;NnQt7cFSP&`kKIiZ(MK%_AKi0S9~PG_3rL8dWTpf3qFJS zTX~U}%d7w?eXqg3<%c$!>ER9M(*YVRbJkc>H&-8DQs-XTK$V~wt5rf$nB~(=Xr(Rl zufNVndOyghNp{C5t$(5?OZq#e4t#$*$}MXat9oB6)Jj=-5vD%OrF_oh1QF03$9a;& z#;ksuy=>{jw0sZz^ndeAqV)p+wea?Weu4kS5h<{h$@>`2^$vwtwPx7k=9|ZzFHt|? zP{hNEMs~wV2!T=hZ{WT325sU`F%Kp0LJ3~@-M=3;w;POjs~^Bsx^x4>Y@(GQ%UlnIAoZt_8npep8fl*PDNVL>r8(8QVS<*U=z9kE0Jk2%#HU7BkPmwM|H9umuwyI z9M!szQ?3B^XBNf|$A~3Dkw^xuT3S>7a~9D3&cv%*(m#diEApfc<2pzFTg?c>BFV^w zOPlXX8tradC46t=H=3(E^|?E3xsw5r!eYRaNyf@RO=|&w+vft}nbmt}$vT~Qq@C7l zvJs-;Tty_~JDH+?0ZO|Ngzu$0W4J6@a}BE%CbenJ*HBU-?;!%9|MhI+Hf#&w~ z*`C@iq+gpPnSh^GtLCxEBJUj;WU9bqodt-7{C>Q3M9?iN%E<&v$E3pWgewJ zn>!Eieu2kV>f_>3$Pm+B0R4RnW^{WQ44~N#5{t&|G(r(H`8KR@k3kq-WQA_0IyDXQ zu1v@VdNrW?46K0!wN@!Q*N>Mfj zCJY7?=gXCo_RkmT~`8t=_N$R9n*1or~+geDqZ&_hEmR=H9F#>CVpf zDJH_(BAEBOxZCiPgnQfMr<2cOOXgGYu3T%I#$oAe1VX{@aMKh>^WaQSz)5NO1qx5ccEE3*rc(xF@&xG&(98^5|siHo7?SPGEzEUBBVn&~Q)Es#|aEq(tv5Wi9B$ zMks`2)#3N5401v?##~#zrAWi7CDsp;Xxc@mytPaDn*Q~>Jhy^9;Hao#`$KlLpCk^K zv2ji;H6xINub+^=9bhitMUM@_@F3w1@=IhAC?cxdH|~48R9H?YxItul{ZwmG6c!|4DN?lkG+;W50ym>m%40jpA41z=;9S8@Y-}Ur@x8# z;!)4GNoYGQVcZ_pnE;2tkRzFC&u-nsie~byQsP&0E}<3H4HxdNE7y;tARf@n_k^Bu z0&fq!3nECBW_4`C6BRh{nriZ+4g+McuWyu$K$T7Qwv5IG2&|F)8_|H+S5ZK)S1fBukB{t26Xd~GJ9s7(~OiTAcl8@hOx-RKP0y^Js z;mLX0FdHS2+wtBIzOr^8uSba@g#K<%0;}u6ZSP@I?G8$yLEe$N39bJ=IEY-?KGjc# zWbP4_NO~`bSA(_1p5JD)QxpV=*V%VZr$Dsq*Evqz4Yek{W)kjwzm_&JFYn+oU>J^1 zFokz*Q)B%)SX}w4Boa9~O16(oCuI<&Z`KtlnEq2bMbL2TV$M0>J~`RxoxES#8@eZn z-Ny=k8si0C0j zdY-|jDpt@MA3aLB7hgN_z4=E@8!e4hY)+7T@22b}-JH{$uT;bH#8tiXdXKg6kT9;5+oZ`%0|~7e6LwMsyiI9!tZ$l zE=wI}Gk5u>QOTZZ%a+w;eRom;JITWNN@ zO>;^5FkMbsCA2=y0vaY3v9kbf-x7LY+A>Q@bWKMA>wZxOOqB4K14U6Z-i}zQ7gyi2 z+Ur?s(7ZDBX_-}AKNAuc#8uvFmn-q_TP=VAP8`PRP(3ZZ5m`$^POfMBGqhpU3ZYUNr%y9 z<4n}!?QHjm5F}j^^Jf4Efp2J{R&j!}CMsUc(Ksl%KLR^MB0A!u=(dtrAbD zZ`#XYeWKfd4HJ*e0)yB5Y)y8PwPn9h5RYsr5^=25V> z39m?-i)EzX;obfOE2PZ1=zQfx*03#M!)rO3l~G9?0?HCaA-hmS>Mgp zM`a>$J|(E?EHm!P<}G;EMwQoqO*qDRlPA%|3&KU|O`VF+6ZTu@Fw=F-TsSZgrg4yH zrLSVp2f|xv*>83Xl{TSss0gRe>m77Q(Se6|aJJl2NG5NF@*pB>KyU=WxK9MvgahRxPy@ILy*)!mL>@G_hH zkbrmL2e6lLvsHX6)NJHGRZ+zzAuhl=baQj`xXD2`;=G0Se08b5RS6DGUB5cBGwrwp zUJL#wl$c4JSRNbnPj18uWn`a;PF*}ESq+%pF*W*e9Ch_s@0zu*kM(^8-CYP%|Ljx1 zN0CUW5t7+5yT@18@duS$Afpp0pGz4fXj0M6rs0+$0R;uU{;1DT$&vyt@>?}ukaeWD zcx>k)Hp+!hv-sLPyN*kftlfM44=kwZ3B_;GORiCPIbR|{KhEd4zLPV&R>!oerzcag>Bmcp~-%k_X%I@Xoamp)f*w5|~ z@Pg$E_RF{PYQA^lrap6Cn;@Y5cBc=;x_BBvaB!)oTxY&UeBgPUo-0 zjjSFa&(=G)YTs~w45cV3sk3S4d{tXxJ+StE@{YRI_YUf>jB9Tty!KXE4rJxjKg#z! z_B$_M5ammc11pQ%%Uxyg2LYMf$ik&P+l#He$EWtLR{Dj^GgS3V)QS!*Ub8*;v8zDE zf|MP?=p;BM=mM`a?Ga9TTf0y$_?nyDG*wvY9B)DpZ3@+uNDHg>_b4>I@= zO)Zr3WoZLz-{&v-5PbL(-kBlbc2@59w)Y(UA!)A_@*OM%87cMLyuJT9JRt ztYwTjmOlCCMS4o#MvnUyu+0#^N^->hT@K!03nKP*2I&IPk53T>=5I+~z1{oh=My)N zNvj#Cd*cC+%42(LF+6kY>rzY`Nen-(nLqIF=M_oKE`Qi|-+j4@6V0Kq6a_?)RFn3n zsM)U-%z_4A2(T)%)1>A{%Igj@N1IVmL&sd)ATKA>cZW%TaKm4+Y!%ss4 zgsrD69|(@P*xBg_oW(kCX^l}F;LT0r-cK}lk?b5v1m>AW#P%=L-)L(x^q=bb=w{Qs z1qu=gW!L|9ZO)W&IiG(rUib)ut;P#Oh&VZEwY&2CNlW6oec~(5tc2j>j{e%5Z7P4t z6-|2lD0S&~uCCinPlAV24zry&c-bvJ?Kx%b@;dZ>oamY?X1WcmG`!_uU}6aGg`kqx zKU`p#V51eT{b3jVS)W5sIi`d!+QFt1lNvQsR^qx~#=Nsyx5#!bUQh{lX$?F>81mpS zmhG`I|H!;4AKW8q4KbILd@4PA0kuqSJm9Bpy^5}q$}zv&tV{G^7J$SC?0rLV>xYq! zDqo!sQ1mX-JlZirzI)Vat#@5wq>C(ZDA!-KgX@hv%r2m3S)Tner`JmiuUC8izD^Le zVu*7frIeyCaaq~WwU{eFL!mBDQc@l%b`?bbQPqPbt*%}b3Ux?>Su{@H(Xq4?Es9d3 zV5jmm(btw!QstrX+wx}RSCM_>QQh6MZp_i|ETXTJ?0ekY%z(4Y+oWEu3F~`4Um=Tk z@)%*WwiUWt1Op3GQNExCMgsbm^X|p9?J-_GuBqKYwq5bZM@1i&=nY0kr&-_2*0u1W z@zd!JzF{?!9K0faP~gDJ^~}VYi}RTl$AB;kho{xxo&SSx?6}ly8)g-2=-DQY-~Y9~ z5=#W&bylZw7>amG-S(e`kXUQG^Ivw*u~$@6<;JrpwH zNQI85`1ECj31sW*amlu&h!;2QMN*Dm5Sh8$RqKZp^<77qKvR>`QlyZ`_xcd&Dj}BwKFCG0?;~7o|*6~W?Vy%;yp6&HuCxDV~Wre z_1xtsjUM!*XqtJPydPCk)Y~Y#ELtz+SacQp*;`m~huSYZ?KEff`svxKDj~Imym}*! zZIJmhJ)E#)76v}nfXFZibGF!*P^|l<_r_!mlKrf}*$?02vP*A%gS{MS zLd<-BZfVLx!?H<74P9y~{-PbuVRi6JCHtjXIH^W5&EwdPR!(VkO1EmAi?Hh1%;Y-H zdtFw{)&>`E}DKqvehi`Sd7oi=G#f1M=(v)B(ZzS%N z@@@Lx@)`q;^mSrmI&LZ!+EH#zbsRL35;e)M7Cb=>VMV%Gdh08J z=-rle*4SWpHO5{wVFPAN8`;@^KoTZ@bBOL}3i3c&SwXL&o*J|G!o8kiMlui?Ntw#S zPOn@HWkmIxe_=@PCk&h=1Vx6`(Ob6luLK{}PM--;2E_ZhXG=SmPhUEwxJFs)MTmZC z{e>G!IZUqa+VG?*UH~UJG_Fvytof;@&;kzwixu834H3)W6cCin(@-wfy9wllDoQ4fO95DoKn!R*=CFD{)@mRy# zJ<5MfTLWQ@J&XS-tg_3x{oZKmq$JR@6wt8`C5?WC+D4@dl>g#rk6xioDL=;~AWaTM z4_K`P0&C4^1ZtFt&Cj~}IZImy6bcLdzGs~b^+r3YQSw=KNg83K;n>LcZv$V{l}k94 z5NwfqOb=)QX_vY_o;oRwpjig49#8KsMFn79>FU-d71LP(r3Ug z&eru&Uw-O2(>3@P^!{<4qbcFe_7iw)QY(%gnB)mjF+%&-A)W}8o8YfDXLv=W<(VCa z2+H3_Xbdb2SoIG@ywZPoss32Ik<}aW(maI-7<8U?K6XQ^Szikwl#Ex1&#m~gsSl=# zkqFMEkE^Io{3kqWOB1{stP#-CmS-dc1zYbRr(g?BPZU2>Xghecwh(swe=&G}9{sgz zq5g=DX_hgM(<{$v;5wn1p~KHJbzMx-_cK zvjydJud>1+BTyHa85BPnW#^;!3Pc|)Mmv|vbgGxe}wIpf;t#jiQQU} z`Q!JxiXnbpBkiQp#&|7dnHFq2orino0kp~ipHmk~i;70*Q&%s(^w7-&{Q84h)xX;J`CG@Gtz4e%=}Us{F!pn zO&NeYVsB0p*J0F$ue!z!RQFE6veTu!hWZ=R*4OXG&&xc&Kx91-R;d|}Hm@Aw`YgB7 z-)DCp*_~C+${T3-U)n<<#b|cO486*KK@ZxQ}pGo;MLqB~XnHSlNOMzJ7;RA@4 zWe!bF+Q#$Ml}~q_QFAhfN!|69>H#fp=;4qB*3hZjH-4seuJ7_4JCl1rbQqIP8j(d@ z!O(r1;!2zOq5Rj+XCqu(xlnYp7(pZ4k7u+o+=wH%Jt|uN3}v+Cae{B&q+wvqti_7A zGRk|eUiX`d=q?#-{%xe%1LpGlu z0~P+G+K1l6_Op%y7zkuSh|uwSWslo_`CN}fO`=R53g?|R6h*cd6x>3{B1PqxJ9QG> zuY>cui1KX)j|Jbkn^AU=WnzbJv<0s=Gb#D;tgSf$3*CvLhI32E+<4$;;zABWr>0Z+yhuApZjtfdJUQ$L?`7AgOY zGGa(Yj5tBcd*!?vXP1_ef)fGlVDZJX`oUs9=sD;_gHP?5XVmdPv-J!?sn#y~7f}s7 zy}Md|tuqS_vZmP=m9gDqSCU1hF6%VvEyhyY<4xGk~i4u#u(fe3bW-V za*Z4;Bt$zunIF-mA~5V9HVH~K8e|fhZgGwnG$?P&Hs-N4%Q@dz5T?>9_vdPDn-;9S zSCJAGQk@fltP}BZ;_or+%=l%CmHa~Y&*(~rLxGi<{vuRh4z9S5xA(8;6hPGTI{QrO zdoKocP_Fy?9BI2k@K4K!CuySe^yyoovl??n&8V^Z#q)G!>&|+_qMoXhK7X8PjJGXKU+t- zGx`nB?3vW)>YFPEi4r_$j5&q1%Tp|_x|m6?>HOS6C6TCPeWi&t)CtS2HwI*^Q}$D) z*L%D!zZjs6Z>=x+E~NOXC2wz@JGgtb9tc@rgqr5N?iRju_a24X39Du zF<_yv#7nwvxij-BTMcXzUH0NL{<+&KArkUQVGiVCl!7FGs(=+yIBW_DkM(*gx(P7n zR>Pw3(3oB^)#m8#BDrxVncy$ZSTMC&+Oxp;qMa3b@!VXy`Kkkoh+Wo>DrZC3fEY>r ztNn}RS@*e=m{_g4X5Y*n8VMShnw#cz>7Af$n&kERkFgi^e#)mhft}N$SydP#@S~?2 zGbEO1^HbH?-!CTKrnWaY$PCwDru)UC{YI`Xg$wwFp@{WfmN(#YN~&rM`j@5#waHC| z%9!+CQnmcJ7dFWlv!Nf5%b2daVy!C;QgDZAps(L=DDYq%chIIN8Cx9|>L%*ZPgLV% z9b4cFp7!D&w1yGc%{qk?0gJzk%oFA6V7XLZrbz;(*uaVmi1@#;O(!LIyk6|%mi&9X zS`o=TPMKi!4h(6%Q$s~ZKp=V#wp0W*zPu7YABH+SZg6-V%-XcUiI6@U(%9Ue?TI6{ z`Hn7)Q+u6o!Xha|nH#u?80$`6q}MXdnxvGh4Apvn@#QKbeK~T%?Cg(MS{NS}_oNPC zaCe+62*o?33H>%*P~tUh4@}j=Py|M-J-~ax%>=v`#RL8oH!dti7m6|ZEM_mwcXxL7 zljByz{A7*Puu%L;{73n^FoLrDDRI^b2+%~H3#cl!JYM_+aBT9LK<-r_<}CQQs|sQ0 zy=xkyDQ%AWavaxY!fB!Ax4WBNhI;QyGPKk03dCEdvB?`OJnnARasy|4@3$Qn(2s=4 zn6;fu*1~nUiuDT!x=ga-_3`2zPswT37D<}-%>4eU^B}hHTb@{LEq@Elw}?j4aIqB8 zd{?R-XX81?7liyxO+Fi=DC@9k80?L{`e-)>WFNdQF?{iuWzUQQUL>YA`CcA+KI4~I z_3Rdii=o(o!!#uATlB8#Ce5C8`v*IT^(l@A?azlIGnHhlwV+Vbk*QP5!o?fK!g&`B zx4p}3ykz$Xbak6%coe#sFVrCgRXAAE+)Qc2$qO-dpjuZ_DWncbHTDA{zT4|r${)p% z#X|E%{f*@jJIE*kqkKp$NVet+5Y~&mEbJCxbsNI@)^DEoi8wdmSG#Wo!_T}aodi$6 zRlzRST)Oru`1YrnWZYti8k6spkAHvHUpv-Gpto_>U$(o-<>elVdn~q&es|-KcHsJo_K7~X33f}vU!b`3H4)lTlSFXWuE2 zSe0qL)3;ty(5TxmPr{0Y`5SEl@tY%?Ev|8$lWt==R$Y~VBPl_LdMc-V*I^<6+b-j+ z$o}lsy=wBz!Dh8u>}9 zUB`u*o>a4Ajkm*>k?5e&uIX{*QYAv|^px!S@~uLSE7~xn)_MhN2gyw&{E<9aD|@k| zii*xgt5Udr{m)Sv&K+x9ekEihhDpVhXp(@~MrP^}&bFq%>W3bFg+JCQV$HCl-~)JEyxC2A$3t7Oo%EQ)*H7zSY4? z)+TkV*I@&fvo!h?E`ya*}t&62Z?Z< z@Apq^v(QHVq@oQ(lHA{XnNmVYStKi@o6T>kWp!&w;O;wxb3F) z`l;6-Kr*RT?HE)ae{6CDskPMHe7=^UF24D3LS@N<@(r8HURCiaif2?fEr0 zD;#82%>QOsI1=ulVaB;5aDuIsfin<6g7OC<|8>e6rdSH5K|zsTT>a~@{*_#)eq$~3 zr^TniQ%4hFeu=-8?`6wF;IhvLQ_|kB7PyC3+l%<8+k2_~xZBgu+Z&{ixZa}Z{pH}5 zJ0Co+=R*Rp5AGz_umYX9FE&1Hr%u1AD;ES?uf0G zZ=&8*6lkyX^_CeTH$3Nl9y4Z{NiB-$_;K>~6`K?Xb|%Gz98Cbg{Rd%@eitjy~nu_a7BpIjF|GN+Or4GQq!I8)!ON&q%r`PH&Lu^RAx!hP7NGSi8%gt2LZVcY}37%11IYyQoU~uJwLK#WO&^y6C+bs zx+WzIrjzYnfVWnP`@V=l8&Rz9kS}}#GbpgNI-AF={mg2Zl-=$K7YJmO!PoQg5W<`^ zD%Y^da+&?}_L^)wxxx(%QE&ghP|n+|*^PHL(?-p@I+H9$T4U$-^!wJ;T;BR-WIrri z0RZ-o9_#;#*2iz*WdB=(e8uS@|GKB4Qu~c6&49$|U>@ms##-Fe;`5^r z$*ON2rZ4ED0;$QDmSxx*lnJOquAXpFa|3M6d(hYc{k`bgTjOKUQ32l&ApgX({hXb8 zwW$wgmYH+5Amjj*JJXaqGpuSAm0IHb-D0n{?Y(dVW$8RPt1~v9o?=9;lmhb8 zJ4Y3ErD|@ni*(v0b&`sH6?6Q}>P|XWXJsMp@2<+%SeqeB2Rs9=^leywjt(ahHivIC z`(YL;UE9(1pvyJlqPSKr&8Vyv2|BqrKtbfYA1{4!{a`%9y1^V;Tvw{rh!iu@Zfg|e2i9?x#U6tF#j~`)0Vnch zth8C2D`6g&{e+Uco2{M740qIn5>@nDu1C>#>o^z>5rTZ}cvz=WO0CZAkYWROqD4K^ye5S2x~pj8@fB7J}S298I4%V*Vc1iU=4)lP^u9{GIv52wG^pH9(iYHrdQ3_TlC=xN0-0Ag{*E zL*>^IpM_3l{|XDTb+DLX3DD@YiQ27GS<fzW8sc}Vk^*5CzJ<(9y8Xv>QnJJR(-r%;@QR&PdW@v2(15crtld^) zXsWPJ)aPN+&BguXNSCT7SYPUus`#eSk8}e*63A4`R1UsMxQvX9loS%u>!c3l*_h&e zIo1(0y{VCXA1B=2_VLr78c2~QrkAXMzVfI#<6n0yXkyX(1guPxU*gIDvrk-Jz`*V?qF`ly|rVKE`0K*vyxOqXzyo$0_Pw ziSCbPJyF#}j=4itdhANe-vjz2HhvQP+aHsHB|vZ^9mjvnA)I$`dmQKwickDG`N#IW z7H=Cq?!pS@1a)R;YNXMZ1viXyS5Q1E{Z?;u4Vi3Gi8a2q zfU+3_5qK{7eHt_=Khql1qHLJ5RC_wE^s&IJ2g`>U|Ijx1<(&LpUbkMAAxfO)w_Hjp z*-^zu03U*X(6jkE;UVScal0aY@~-sQR_|SprLwuIsMzQuW-t`slLmJNG++}g3L8K8 z%;&%J__xFJC|x>7{D1+-R%-hLZfs;?uvr(`6l-u>JyE16NF0fPC;+`1Au7 zPXK@zVSRWFkKtl-z+6`D{C>=l%GX6hYh2m*Amdx>n!#?^Pabeg#<(9{X=A>ESsCqq zbI$s|`ZxxTT8MEDUP9MLxy>`o+tI{?J9aR-XwN}rWzU-XNe}Wf^z=A)gjwY^L1JQ{ z`|(GxH#A;0;AUD*ml2DlDQb&va_+hLn$FOx(}TPdNNUdAgywjz%=vrT4m4XlStx*vi>j65?RSDYU*iwtMFnm9u3TduUu3P0BFWOE($c$m%SddlcU zPEj@*KEPR`8`8i0`$UBjf+y;TddN|d5)IV>9UNEp69=#fkF@=WHBq9goit+K)y`1Z z;-jmqoWtN0IbS|-8Y%4A(1>Jj08GhNp7>;TqDn4?Z>j<;67b@~Mra{NFE~8)7_BG7 zEQ1akMRR-dmeupt+vRgRSb`}TX>S&&?WcDLkj9?IJh;|QCBvHg$vRm~n)f=C+-u^l zd6)V6!!C=ThMPg_&f8-?ArTajN5wSNY^lIx1k`Q6MW{d2a@6$#d!e`4rh{yQXpBJb z&aHrI?Z&69hyC7+`4awMcln53Su20+L*0Na^dNCCiMPwDfvzDBm7vVBL5G#7o{KRQ z@u&f^7REHl@S~E5=q23`9?FY@x0D4vR_w)-4lD06uooo^zv>| zMaL8jc^Aop8rTghLC&e)v7vb(o^C$HNH#F-~B`}T-ANkEMA-Jtx)+&$z|P? zV8G~}XWb(p6xdY0i8vQ?mA39Iaj;Eos(%;jMB(z=Q_dqz_vD$)tFUCqqw0*Fby}d` znTHSMG%hI~oO@cg-XhOfRhx^BGw1=MHvEa{v($T}V$s)^s2RepfZw6p;fH{sL&lk| z`{zvr`uIrLIeeMsn=hvFw!&9w^v z)!>f>yajk!Yl6M=kqq=*?Ho@t3G*IZkKM<@t~K;3(BVbV*Ds`t6=A<{1z#oD4GDG;j=9$QZu z{P*U;0c@F=&L;cn)W1JSLgNE_?0!(EnRs}uSZBr2w_bjL4P;Z&PxY$Z>lNcj+m7s8 zU*vx`i`TyCWhzpPI*L`V*25NYDBd9uGIx+@x5Q91)?DLuDQgod3@3GvqL#&{2HH+f zoxU$+J+qTK&*;9AymWC@DYuhys8OyX$TsC#aM>+jeK&576>>IJV_5bJIXUZ0Q0-u_ z4tYUC|5E1L45@qf(x3yk^Z2jw#9>m1n2%SaKAKXnWnO!DmS{IA(N6vtCx@hLO6}*2 zj7<8CQypVs3gIu50Wz|Ku>0y~&dPy9b{JZzN5~Qs_mo!ipFBh79gY3898ddoYDd_>)NfvJlQLm51A8o2KJ4$BMRb@+#&G<-T zih5y1SOc@uM}%jwtLw>#SW>EMp-IY4dAI~_4kvVQJ-$irehBNcwb0G$?&(GOED|$6 zcI9-^q;fjB?K3Ls zgyW8JpPZS)^)xc~-Z1`n%7SSFu|ImTm3`|P*3&?8 zA%{;;hF^a8A{vb4j_VE}tat`zYD( zPZo2zX<+xmbAkt2@rbai^qcG&-k)KeQgqvojB6xpig;W%sP~$o2e29?!zgI=2Mb!T z(Yp7IF>fvq`1(VX^jc`+XxZ}$U!*N=4GvD->OFLMfW<8z3mS5+P|`Fm*1Q?E)Lv{0 zes^3xCTGj$1i`cR`XtlZ{s!5DMA=#X{9Q+KIRP03yzelXwl`kRr&UN!{3L~j4hnt{a zZLhFZV)-gh0wUrgc=MIp>xsX4Ui6k(g~afR7KlHgf6^E8?UP{z!CJ(0I-UPrA7CfD zOvg-yPiSCT62AXeK+}MN+9KNkX5{EsSI*T_|3eN6!)euXi8p03{jL|uS1B;}Kw=bUyV zN`|@>x;mUjPwbG1Eet{_2?>WJ#5c0m&%*T4x*o;Ob-_J=uFIc=`^ghPO7 z62!!PL}hb()kOG&HtJqRp1CBDKpdBw1C3VT!4J@I{a=s&*BwjkABNVrwyv32_z25N zTtE;}=pA33Mu1PH9Su!K|5)kobcpusL6`4YQ|0nw(;}J?cE39qWR#muHFmXKG_4W~ z1(d11d5<(^`O=|^m3`pt+TVQc2 z*(_#U1D7YCb}C4bsIPnD!f5R*xMl$Wh6cLSB7=e^%8ZA?@om5+U#O`+z-h*@V)+H5s~{prh6!_f9AfM5FYBp-DBciTvTc>9mhA7g%m#wz$~mVuz2%^ z#LaQG9IFqey$EZ4-(Ml1H|C>@V{I7Q_8`nww?dLYOnzXZ2&vxLKE4ebTp8}G#KV9X z7}b1Oypo_I8dWiD70skI|BIi?>2WRKU(Q^BrBGzSX{7Zh4!m+S@RakuK zUn7utb!U(N;=i?VtLNSB@$WNxzLN63Rw9P%^v;V_AccM!QR#P}-&$HM8{jI{a=K2B z6!CS(v_G+(P$|_%uL4HzKB+gCk+?ekZY;^l zvzKfyt>;vz=}cvfxUPA2zZ9J}W*C{7W<$DaIXD=4#4er#`GsSLk5fnDiWZRN-HzfD1Z><+tYl%&5=d9u!|59ig~Awe~S+eq?ih zIxgQ2)1FNtSJ3Kh>;uOxP=~J7Ohz$20hLa1<>U#%{pR8e_PpXg>~I<-c@pZqfw;N} zdqT51)Rl9iP{Nqf&wxh+(MBrepIa=}{PxGPnkqBxD}IV629}5z@yOQB^S4S`m9)L! znK8h&dzSR_J0vhwxwSB6NYf znI?4RN{zuef=uhx71LzV7x5HbF;lgCp9ZJ?rm4}U$=doq>_wJI%*V17Is+Og(;FDy zd|oE0R{yK*BEg_H^k^TA8KTmmX z>cU(A$fE~373#=0M7z>2mO?&y{XOgtdqMW36Ma)Ve; z;7yb;M-4!ILqOo(DqHQu$BNL6pTsYxDxq~25w2kYC0YGv3w%dxNI8_PaJL8uQnK79 ziGkdH-1F_i#j?NR%rv2PWiFw@W=%4GRwpi+h(dTIdY=!A@RlW`nB>b-2ZFd|QD-=5O*`4es`oL=s@zL$kVe;eNA}Os{#Yd>}dJd%xp2 z#Jg8nA$Pw>O6mIUb`W8`#H7c>Bgv58J+Qkf0EFhhdrYi}v zlIu+b2t{8KliAhk(f5_Kno#et!677^?P~eO;x7ehKWXi zZ)f>2tgXt$E2#+Av)t!`5_dLP2%YyQQ4x)BR{`k7QzRar@86-W+hOytg5oW~gQQr& zV+fGl@tw!9|1H54;d`R)bTm(LnzF@!M%>|I+%H|#!u$6q3er}2LOi!O(67PW3yFR-AaiA|~ToY^Vwax7<2r zEV)mz9vF$=C^Yc+vWB7$ulRFlfSBZoybp;&YhT$8UuGQzm)1&9I(8NaVW5NHC4BlC z5ZoP(&Lz2(YHK9*vW$l<8wyDYs#bvT>|Za5BauXXDPlyjH#^s>?Sqjx0m&y3Sj0_* zoI+VWp)9w=M0pP{SSE_gRNX}_Lvy#e@CsVSb*MNeUh$uZr%WdtC}&0@{n_<>`XDn% zcQVrAuJnVoi8|wK4F}(0 zK5rzhm#GSr4_^X4$Mm!w8WIs7-*33fm{on{=zn!is>$Qvw?9{-U-8H&^jam^?@Vv< zHDM0MoMd(ZMg*M}cVV5~xod9s2y*230f8XvDS7e&@Ju%O8O?)4bKwyV^gYZe%m4APsSv+h*P(>UJSS$Xl#<00yQ);AHQ1l8l zeD>8Y6A}LPw6`#BJB~L2v#0z;k~Uy4!c;a!P?OiuNCkI*TUpA3;vDQ3+mTvQhU=+n zyrS}8s1#fnIC9(N4zigzjgfsZU?(`o>SDdg;36pV?&pKyoL&|SVTG=$^+9F&b(l8V zVbcV8DNW6MMG}EC8UIQ>kqPPQgy1S3ML&N4i5oLwE5d&t~7T`qS`CZ{X)$ zN&v?l)xtvm3E#2hx&Dv5_*Iy%(zVzytX?x?$VPbaU^G#QY$hX6OdUWCBm$ z_ycoVP&2rQu=zfh{iT4U%7O>j`SU}i0Nhxg z*dp~s?<1S|RWS(u;`kDoR%#6-E}>pLI|k^*4pSAF|GobNw_(Cr&vU*2qAG^}e)1L@ zZEXA{Lt)wWcHP6yU>IaJ4#yfu_>Nbz$O%Jfj;gQg_3sqOy$wQO@L9%d6pE=rFO%?^ za)~9xuuVQ(%iVgUcoo&jCvkm_HRHY=tVeQz`08-J$RVM%Y^kfd*8;!XC_N)6tWKC} z(SYLYwKzvMbj&eeI*t7Vf7#en7nSO3Z6#moW@u_*GXsXGbGpeENd$lgSlevGeYZj- zi+7#`7y%gqJfT5^CWt9wh=&3uh8CLN>NuVU1X?b1D!BHTng<4C2qm4O{EUpl1BO-9 z5_YAc-#3Z{$KmyM`hkJ=+AlNls?yVR&ZVR3X|^%Q^)iqx3+2(QdBOBgRO|$MyOEy9 zR{cSqN*KbQ*)1cCilZ}!Vsfh~8_CMeAYl_ejo9RZLRrhvt}UistU54mIcE>o(Ha&w z2o4QCf8$ZO=zqCGTzGYO1gMDF)mFt+Z9ST0DubWx{KMi7jKNR$Y7wR=~B67nv6+3 zDM`Ig#aTG^g4-v^Ly!5aV_MLAAUtD#Por&-y_u#*OspH$GTML;aSjIi%_fHA$_8MC z=AE`5z^{YLrl0Mv>4IMtAL5_>4>SjkfR@QW1~JCuU7N>0O&T?>U_VoC!s`ZxA&;e- zsx05Srr+C&Lo2y_uY3;l~KO=`&zn&5Er7yVh%eDa+b<}<( zxabYM3SX(u5!u#mxypv+uTe(SmpuZ_-!Hrt|5zyaH|#7xMI%ttC;ae5k|WDc1w;K4 z@87}mXe9s8uIR8|Km5xSjJo0yL6M9c6=D6&@Wa9I z)S75Y#yP%~f?3vnbVNp|)#rJYRz9w5ey(J4E&d)MV0bBJ7WQDYlOZFR(d}96`&&a- z2V+mDWkDgz*u%>V#lJxxGW0mK=m_?p+dEij045Yj<3=hXNVbMviaHV{2f{v*AUb3T zFFpp$MQNJ~({cWM{jIRye)VVhSseRhr|{sOOCd3+RZUAP>CicJ9dTnL1HMOvxkqNL zVu?>CfkOj4uPBe^nH&TG%?HWSgb%Ds9z&@ihru=E_IUC`Q84?D^n&9{M&D6f^+Ws zmsQ8TIr_2VL6AUsI_i`DBKu}2nW8wu$k$ds!Q%R91~zS7{M%3DTGP*R_drOw&Y{QbXmI#>=`&NmZKA z=q?lyn%Q-|X)qv-SdKHoK!wcOFJjlCu3XMZKKazKIOtlh zMm==LN+m|*mIfN!TpA#*+OlJy|Fee%_%CD>+mX@v4FbUyMuEF6M=(D;P{#CUTNK?a zuG|!NKwRQxW(D0pn>7Ps4Dy$zVhw22cnI-e#hU|i(Yd!B*b(qF?-Gdz9~k~8=|Lsu zo}@_?j)n#hEuc^4lv$iDf1pTa5O;Ap4Y6YPP2Qd%=)l!Y9mFnNagejni!e1bU2q#* zzDcxJoA?ANET0&+!I=G27Kny6iIhn=OH2YklVSB*obvI%;4r1t+>F%B`kLQLl(QcH zb7Bbw!K1b!(U$W(nE3C_ER5SmOc5>c8ym(GN}{TJe0*l_tq*uEWlj;4Y|JsHHc^aCp`}tpW3d!pBVzQ1cfXmiPlMhCR+i&lPX(2SNA^$A95B8R*#KaArKN z$vE@r&H~B+Gm@M8I!GeLrtr&YOBe)3ZNQ`o5PY2F%6*neecdSf_HT(NDF&8Zaq|jt zf8#e@(W+}R6B1wd!k89(gaXgXBoDdxi#CWzn+vR+I?4*lBAp?1TXeG-hYSD1sE)jUu8pWG=7k(<~E()gU@qGBP^K za(fUdwWGfflca3VI7Ahiyi_!-+D{;an39?r8-9FI3JtCaC{I%EUqF@n)2hBjd<_%& zJvJ!*kLC*MGBlAkWmNxZd7t~bfHNV7^zUg5qs(Ccc|v-YndW1qR#e1zw$D{~O+ri> zGd^PQZ5VZvbK&zu_{Q5R?APMiqRv5H#^a&E4zmSDyw9r$v=R$xa7^0nYBA(nXv8FZ z@*c0>mA|j+mBQ|qbr9) z+SK`@>bk`VCV*}|;-FgY&P>U~Db85gvIugfKn@mVYNnOG0 zPi#!A$y`{N^A-J!iOWV@rG4{NlgwarFuShqOq0iospLBqjm#km`A<1+w@MAtp~WmL zg8>q3s=p2ihnIKzB3xxzSKxxS-)_IMu`WP>mg{1*rIfmS$wo;tJuYCtmBl{$0O2AhgQ5ySB-MUp6$nwJv^7#H}VIRQ+#V7Um(8+WB{po z1i7TY8$xP2@PH}>*nmt^L3l~&x46=@Fj7iW(@a?(SeC_o-|;h8aUjrZ=7|)xqk_O_ zra?1(n&YE=p{O8j-k{@!(tCr6=44x^oAK3tl5u)HFI7;%KV10SeU3F*k0jpK`{QQG z3^J?burbNW(dG6Nkpi=|Pel4%9)BQ2HaI~QqJ=$;Ehi!#u*ff*qF=7T%xU+abM&)K zUu;Q)H2eiH->+?GbpqHyG0xd)3X<|z&k`K?yB12kb$;T%Mi-OWq`dn5Pm?1-$%!gB z1w=-$xBL-(fcKHK{C@^P$m_TiDPbD2cb^s(nWgI)h>ED=KQLV~c9#fS?+{4opV!hx429yi38iP3-f2)^jYHqgAR6m)H z{cSg$arb51?u<*sMjbvd2qX^h;EZNJ@UT~ZzP*wu$PgRf)j~r<1>Nl&o025 zT&Vr}mi4)h#^=tY?K+M+3FFbIy!gj{E708Vl1yx}yC5uE`TG`L@zq87CV7^Qm zf2OXR+|+O63g+d?jH6tVcB!hA92%oic-XXRt0C-IA`s?q@-GrFF1o{a6A~PaM7aN& z4$#|6$WMeh>izkm(Z(<$j=8>SIiIIbV6YCO6c+aBuW7njBS0m{sOsmt#O8a@q^VP7 zX?=)^p@eJS`2|aiGZn$wh0+v*phKT%(Env&pbHx^r|_w&UeT?ag92Hu1)YdL*jIYa zz7oX_;tIkkf7V-X0zf}1wWFCBsfe}C6l3hEs{4OeXy)N}D6jNQ*cYyX? z=F}{Im@(QY|NB227WiC!a^Rk;TwD&_=;{9RF~dX*EXw7{@7qK0Vl4;omZ~EfB@Ts+B(mO-Q>~(e$^or~YRnKO!9T=j5RTA65qRz=qnHhFFc3MO;D3 z4WC84hSyb0alSWUBN?&C*gfEVjP+>(wtveOXJqEipb}i34h+RQg9e30rKB)?bM9ex z#Ya@)3!!`-V&%-Y-Dsj$%JZ!6?Mc%VVKCBMEhks!9G-~x1&-36>Av% z;pzJ5DCgClYZ=?w8t@A!DU#1`Y8$#$U_6>0r*d7W;{8{A%7NKU+)0a*+MmzMAO#mo zUW9rapGBTb-*Q(C6C$q_7WjRE5D`}c@W$=iDzvDg(2eAP_eXBfpkQ}dvU3?%R#tIm z(gturh0n?91L?W?-6?O^v;`sx4Y(Zl-5sUJ9QR)Cwm*&ec|e|H{@Og4K;oV2&s)B4 zM^L1O)y%2fnB6=J)% z^wj{op~x2iE2jfPg&gXDgdgg?rG;<$GV-qT?zD1XIccNRlknJg|88_4274s{KF@ov*V~<#sQ5J!84x4BR|x-{=%!&)$|t-S*5N1Nv)x;rOE$E}>G0Ezn%qb6 zt>yQoPQqy?uoBbj?Uk@eC%2+nR=C8X`PX!!6`S7;eOuR6b#?Qe4I8nO6%i!1v?FGu z-zJ#eHGTH@VPh0|PL;}y=T|b$Iha)mA(Cj;+Hj71&58Er096GECMN4dsmc<>{Z|XO zp;|oSO^R)xkM80N7Cv|v^FrXKal@rV{Dl&Hq)}T_$jY3ychL&~7cpH<{7U`Vvu9)> zrlvfy3JSTHJDQ$s_1P636Cs=%G82Yp)tZOGYwd{ra z({Mgb-FFu6k0@9WD`#c!?V}T!vRGW+oSvJk%ay^$b}t@4a~ei#o_RN!dYZ1ExS;lz z#r>laoA7d9S|u8I;{mQQlV79TIz2`xPI!5WgetnH&J;h$9(IdaM0@A+H2Huj){zRKO7E< z6h|Ls(NlhrZZC1w9()XC4ELh1YyV);e`_sYs<%6<|NP3w-TMLLna;8UoKnH5sgxj} z8konvMkaXc*t{~m;+=F-)jF*D@|h&IfuS)eEP}UyK~gZC-5E*~4=zaEhERP!iAJ2Hcey7M1-yJV$&?<>dan`T4 zZx^_bFG`|F-XbQG7CwiY+$05wx*1+*t&BGkr2&lF`xp?ZCsh25LYzeE08WPj{YECq z2Y)NDCiN*R3-F(|S?1CZcF0w^{HK8riW&6|wOesj5UKO^L7}|0^aob-OLZwrxA`^P zwwUb@If@Fics$HocX40vKM*n4V6-_^0#mMNMoj#N73HBZJj`{Z*#@z1=|4%{iMl@c36}c&Oe2 zhXV9O7?*aj+pr})M*DeIxoT@?geNLX!dyx5yZ z6PQ#drq^tCPu29;ehRVeFAr7NRkwl?pC?n#+jv~ds4Dir6Bn*LqFLvWo(pZM+AUN2 zx4CZOAe%S66vb~kz(eWa@qG4lhZf-BdyvI>KWe0Wx^M*0KAJ%!j0tjRY#LBvldk45(fg_)3YBQ%l#?8d%sWZ|UiaaJuD8 zKpiu&5TS>xwZ&_t7ycM5!};05t}?{Bbcj82eqKU4W_@cP_W}c0*K1x|y~{*MbV&iU zP)pJIeyyhMP5;&a5^vRAT91aX`OeBGIF=L{Y8aTetGm&KkRoC(IWyDP*UeY!njHvd#%}|#zl)lQnPptzYYYcG& z)K0f(Ki6y&Pl3$&B5IaIDUKeFE7g{f-Y+Nn3L*FE+fNe}JF%o$Evm0EP?``x(e}~d zy;_m;xI%9$NO;D643_}u@7b~olAN8*_Z>1P4}>dsLM6FKzu7RQwF6Am&& zB{Mp{`#y96-a^}8EhyKMlqGFLZ}aTxV+s}(1U_j4{D|XgC+T9rN(sGCH0~^UE4~Iw z<28{l4TZwDl-5MZxG^Ti{IO+4e!N|QEi3vpsJiCW!Su(+dM1)i0ctBLX7T(1?4 zmBb5>yM)EG*U$2{s0(Oyws?&9@{W}#bd&SUH7a3cyJ<3|qq~`Ye z7+B>v^VHmY+YgK+ZB67@>76Xzd@|c($Yx*5qdh)qDX>X8$AA4uamyOtL5=@cJVgWC zzYX&?MFm#b7ll1Fy?GM4wFicr9lkfoSGgHrV0EMEC|Z&>|Isuf3@#3)FbnOf@Bbrb z3IxY!UrTjTZ-m;%82|to*Q5=>hy>rj^D()M!43u|g#kkz+>ubQ6Pk~TUWAa!-=^!Q zv8YW_2MM*P`P)wuDn*-bF5u4k5?wX`+Q*OQJ!WgN5xo$p(kz}gInb<{>at2m0v?BW z!WK!FG{aYU&mbgiSbdfiYgYqjCxh z6g&9Fb#uCj+dA|h+`fC<(UD^lndDYFqQHl~EI2LhjftUxrB}Fu|22_F>3!@);T?o= z1|NA>l_Qx1hpN^RK%1s(l;ByOo1^f({%oF&N)q+6Oeb?xs{9CaOVd*XlR6)T^bujQ z0ttbsUWJ3r=U`jB|N7YROrUbuJ0q zo+?m2(U$)F`gU0gf0Zs908g}Bbc4l)NA;s4q zP#Edz?yh^vBT4u*i$vL{{4nu>watXy#Y|S7$@(OJGcs&?joJF<=CGZzmEb2*xKUkX zLI)dfYz!LJwU00}Urz5faRNx=QmxdVO}f}%We3<4PmT}G3wGl){d2oC!RY;Ca%8Ig zr`&V?pF#v%5smoisy|HnVILUE1(frOn48qI-d?$oLCU)hHMhVPiG`O&3-j}#oyn0n zsgK^T1(^S4XXmCDEXR8h@w2U-r8mbHbyrnzoS#zs%Dvt$wb=(>ROIwun~^c4Cw;5l znA`J~MEss`jC$9~{F`4FbhWkn-4GoPpP{(rPs1eY3!q8-PynLpZ7z{n1pThXua{?1 zA$JL4yh%~p@H56Ul7mf8cSAdLKS0}?A?SJj>sO+4Mcp&s&FuCui?Z4!t9^hS(d-jT^v-=Q!kTV=O z6F)I_C8=lF_o_q6&I8bBqN=L-YsE0aNEXa(74&lm3Q~Nb33jo4!%_w*|LP zO8N!?GD&F*Cm%@Ld3$9~2Yk3!#Tiw+(0<_{f`Hxay*4rA@v(S%``Lh+#wi5H-%ZqU z!5Zu16J-#LOu^O`!-4QOsv=uh&)do}@Pz+zihY2(eNBtPR1nkTydc(4Eq)VZBKswb zz>%`UcwG2>bEtWEJZX8=^;?n|tifT+1clCxg*AFpde=Uy#z+=nRB{d#tUWFK+=k{A z?D8dAG$FC47}8~1iw(PKLPy>Mty+BZ{X!lo9iDW;s`c+vtbAubggKM#E_Dvr9RVsX zKurh$HNkp>GqwplIw@~B;E#BjG1pOdiRDs9a}jU<^=nx#n3xx>s=m4uXF!`yzh#Yn zTcrORaS|>BB)ko^dRwSy!Dp#tej!A8#3AmjHBuIX#6qXb>Q0X?j|@-`w7+!OT$j77 z^%*@T87u^)1VF{$=nZ{Q6+8rr@x+N!hso&V+CNLE(2K8*@}??z=Q3kb<7cx2JsJuX z2&SzBna^itzteN^^f7}JUWa?R(mcOw1&NrT`IXibcvqy&Te@lTLa7j&n?DCz-x=Y3 z98oO|2^mksdi6%y=&6%>#_OK!fnRAMA$4dhA+Q(=_`^LjmAVo!sp%6W?IbN_&qVE2 z-!aj><_>boNBf2nruI$zB(4}gGf)Oh3~<4Xr!3B!?gH3m7l~kaNpldog(Yu$0=I6ud?j!7sEQvDONz%JCMzHDb);Mw*(5XHS zzn;un?)Af6YH|J*R>F?RyW)QzSSGXmw`9#K3*P1XF zBpQGtKb|?e{QN`7%__f7sT_8@HH5h379-++a>bD1p#b4}^^hQ5DE%oM)c#RdwW4FI947hJw z`sF_7W=0})?928)9KTV(X!(;lxZ^z-wKRkc4**@);r?RDw5nRope;7)jm_1x)buvl z94Wh^5bp!)rt8eFEp)u!HK(IV@7ex&m31e^TP8NKSXxyuI>JmHw}-rXfQ9{w4*c%w zLG=a!C#|A&Y_0*Lb$nFmB-A#fdzXa{zRNH)kGLP)+MB$rC|E1tUtJZvZiw3|m4RCg zd_PJYThP1-JU_40Yn?(dU?;3T&UcfQ5s^j@g%mJFZimFHv3;jPeY;GAN)Z>fcv9$A z1)$}@>SY^I{AbFEK@d}hbJo_2bH{GJGvtMfUooT22=G2{-{2p>0(~;StonXF$;I~u z)2M+{%})hZvI6?QiXi*NaJnRb1+FjhXx8IT<5b?bZH%B-?=`1oKy2R$~GwlO61peMclUU1FTc>ju&;aJ7 z=J@g%n=|v(ub-Nm@8Sf;U%m7(w5IY=iEV2%{$2hdj|2~KsDUbb{3;2x%SCE5qRP3I ze+7#~_wZWzTc=wTpFCRzd48SdNZ_vC5(@GhxPIRCAvC zflzZx2dTi0gF;8k&G5^)`m>}0@y3Er?gVZro4Lwa3*t5*6=okqduxA{v?rbae$_df zPdax5%qog2A3qHYiE?*sod;`jUt6R(apV8V06HF^;qXT#J)aae0<-u~qy%qD7+FiN6{i#I?=rvKHPc%l2}7J(5j zA-R@A@E&xVs|=MUkoQF!{4r9Yu8hd>dSGhWye_qi{L(ED*(W$iD)qr7NQBgxA5~=X zFRr~CfVZ^zHzwNg%jDlCS(MgTQz7A{E!L0S?(T;U(@{4Vf?r|_Jc14btrMEA zfMK5-+XjWoP;&~QUAl@28-dp5cd{cY{ySXUB8-AK(wMA>jtlLVwBJ!Fi%%8qDDLOn ziKi!vqaUlpcUbe+>tkhm@~lA4`g)K0qfLnfGHD@TWYiux+p2#tbqW-ps>~&<185;@ zZh^G!VS7|H+#RJ?VqQy(DH!gB0~qE8ut@xOdOy^v&cw86^=OLNU|RS*E>VYY^}#TZp-E$tItsdy8gh-6vCyoTLe9-M4)x&{azv{ zhkMI`>F)IlJnMt5N$&T4`3Bl7i>x1l&JLf>P)lJvgbQXe*#{(T&ZX3B$bZ&h#vi!W z%F}A5W70{qb|S*9ckrm+&HJ_}-O5S{k1i#uhj5a6F^EMs1tEC;lBSBAA3m_|(|KLF z9CH>2&_KfE*eVFf4y-DWCra39QBwZX-wQEMA8YySm(VXDr1i4MgbJ)i=}R4X{F2++ zJ32Vz{=%4Psl0uQ#v|L(JsyD`4p~#Bux?r9Z`YvaZWbo#SNCa|0tmMmw;Wa7V`$%F zkx<99o5L-;%_!-NS?r{aq6rdxXm=cmw>H)@`d9~{YlQ}A$k!&JMo!kre-clJ?gD}M znzC)nnWhf*#2%B1iTW&G^=UzDy4X2+?55$Nt8yTX2(=dooz?#s9e3YmEb)?%eY`XB zsz$la{W0E0JvBvL8IpGK94RJe(N@TW%K$}J!!2~l!-X6Q z!SK{A*;g6w2=0+kMKPVJVGfWb%X#OCdwz@|Y*l-QL94;&G__v)k;6kQ2(7-Rq%UkfjK?USUhB0buy_5krmCr5F9R^Tt-t!-ZJx9NpEYGjdl+OR&OhOsAR=M zgUYPY%G_1;*8oO{ijXfJq@D*ZDOk8OU=w0p$2YTemQF<9RHW)O5Oz_2#^22xSXHHW zt@E>!CWtqaN=hOEO9zZ%TJyZ1jl+D-DL}OCTrg1dgGLVq;5Mck ztVNkd_m_JCZVzXHmo3j3*Kx4`HoQ=F`*egB!j->=;Kk<gMtB5Ao8tzqi06*Gc;bXDMBbtUs6ix(VA}624i0MUYF)qA>l9P zF>~qJ%NJ{*@p`zB&B_+#r?OMlzv_c=6UgoZ5P+!MvpH$5IJv-3Y@xdYA6^=)MRbwt zSy$g$y(s%Qk4~t%_==ntj%&4f6W<6n9EX(aWmTzAD-4bS*7{2c5c3^l2bYr`;;_2$mi$qE8v0n&~``IsPJcHSRAR5 z`-u!n!<>tYU$|c6?{{i#zMBZ}VB0$Hd~O>jricmwg`SEg4q`OMh(Xrq0GY%^%`I6B zju)9J5h}c6@P-TF0B+9y9{bGShh8bL@1XrJWS{a5fQy&YdF@LiASz`MU67Em|t zNdlk-CnwQffZbe6B;1Kem?)0o_#qK33l=#F@3^Hy6=w;{#yyA-CqJwJJ3x+L_&LeH zZWz@djFG_nh=B3D`xo}WF67(MZ<5C{o%y4C~96gY=Z_6OD`OEL`Oz~ui5ersXaT>5Ip z_3M=3jwK}tUk@`<=x)VWwksQ&x*6|j`^v#L^K5%D7mNNqIv52(i5Lhtowl6?dt(bQ zk_Lkf@=Q3zPLZc)P*AOQneSz+v4i8;3?=PxSYKJ3!>f20a`1oTc+~jwe2r zCld1UJXPC1IJ0x+uqa{tUC>EA;pL6FXLeqBw~W?MbpqFf2WwT33;%L!T4w?~||$%JO{ z-i7iE%1U6ss0U1xC>M*R0en3|yMm6~$v7}Z#lqQ!IS!#4u-oB* zItYDlpj!gBry|uupMZ*9C8ng1r1|R0%bjsQ;Ze(;8wRE zKYVjxKOs5NV^q?#;ap#UK4KPB!T|OC=D#m{&J>6;f|FlsY*YRPp+P6H%q$8EJ}4h& zVl~1F8XFA`*BIPjHrY>fUe>IjZkFL8o}n$YoM`=a8B}^TRleBzP9a@HGkR4@%VoyV z_P!D2^5P*}H{jyI^Yfr9U6Vwd^q0-GYZfr7^9t?{uxxy-y6U{H4+=sIU}g6EwE2O@ zQMxF>oBFEMDBlSr4+yZYkn2hZ%z|ZImWgfOyS!GI=|oox@>a;hy%j2rlVZtk-OY6H zg{2OwXW9FiK7!AdwcT`G=2_N7z>7pWwZs=IZHa&!MoBW@c5H~RR^FD9m9h6;ljcHR zPAJ)%=6q#@q3{%T=C=eRPG4ZV{Das?md|gL#bMwK@4pRAl}=+#8VYt zykGA3aXc`&&*N)YNVeC2JhJ)EYRo^$m!k53j>J`t`00fOP|;Cbk-7Z@FnE~pC*9v0IzGOEC*DSm zgt{znn$LFKYivJ!`}Ak?#Ob^c6nr(3jCmgdpKapHrL0q{4}LS?V4ou!4 zro%08!lOQlNPMY#+e4A==9iox6?K2Icv;sUhZWxg&9jArrQCeGj7wMA_{k|^n&D{( zDb_HBs6P8V10{z@ z#Y-@KTxTgdf4xO}QoLEuIuC>xV_?~=+8Y4kS@X2W%5&`xl_ zgH-@znANE6J|jL`nM-s%Fr+*UOdx>N(;gch4g4-5*llL8l;ooFQ-5(`D8BRe?@&6sF&!VEVc^p7S-cJHdiw4k zKP318BBthuVlUzu>?#9S!Z!;d2 z9S>N1mymZG#TvuJu({T@nlgwF&_!HEq-4;ul9wy&g*V_0-(O8?rVc-#Pb<31BaqFp zT#(1ZoR^(WoZ03AZRlyZ|H|bdfPk8W0H0qj23;Ah%Q{_p1fmKxGW<)-7H9P!$V{Kw z#rI3z5Nn(orU&>L`g#;EM_e>!Q8mQYy!2*=vNxP;`sWHkB&+k9C~Uk@M7961>5~kO z8E0(lRfmHX5l5LetjK31EUYbkaw^bCSi&voArnE(dDwwlyj-(6}?H*5Nv|C-88C!NX zPc29xduY+qK?kPR?RqRi@GCgFf0o2g60pkSzblS0HHKLRa3U!5rS34H{2DrRxs z9WAuc6$Kj?S(;BUz!m_$Yaq3|CYVS}MpCKV!d|Ol`{!tY59PpE?cRBG+QW3Rxd1fa zB^IfGMYaHeF>Ol7kW{>UUQ~>orPo3TY@YfVI-_1v6WMIDN$onW^K%Vo&bd{!Ht&N+ zrEQG9vG}0TWS0@c?67Ca^}yiI>s7qX66(YJ$oU$JC`9I}p1SnNuOw<%$Q21$4UI%3 z_OIOKQ;#yDRb+BV`(Vk7cPp~+qzIsbLlXMppL4safVv`QqyciHn$oop4&3RF3+XQK zsu+(CIK?*RNWr}V@UA8RVWk4{QN$z@n0*$ga8%U@FqNd11cL zwcnTQhSMOq>%+=d#?^t6`h}`stKzg@OEwXx9bF(Qo|CJ5Rnx-DZa0Q@y`J9v#=0AQv`}m1-x0@( zTTnT|px61-(}kljPAozt8z6NC%=hCzVcMi$9pZe27~Pw>g56FHr!vymJ#ClWIEa$~b5*^|5fFbLRId$(?u~!+bUIcrR(zdnFiQ`C@Hd8i8emaHXhF z$5@c1l4!#DgG&gE!D`;iGWJ*JTBNO-+KddRqO)<&P0`|yN5NQo?83?gT{u;cDTH+$n;a7R}QZ?t%L3_Tiy-~ykQHZ1Jtdv+0#;l=?eIm6fa{viKf4yON)CZWfg8cD zt$F(&J6%S>JvTM&x0F8Xdq6`0z!i=8+g`|$~I8pnQ0dNcm0r= zLXhJ#BxAhycYJSq2Jwx?rfcgQW+Er&6{Qe^dY_?9mtyW)A3)viVR4`@d>ZK!1Xlh{ z9L*FGb#gtta+)c-6Q%EG1@APHULgtu$?ij)SQ&fdm;jh20k9%97Ah|@+R-4o6at6Y zvW@4L+*X8vuvYD?0|rXZU_h6Fs!=$*j9@uz(uN*TJx(linQ|j0&ir&i14KHeVC$GB6G8zyEG}z1Z6k6OQSEi zu@SiZ023Tt2~GkQLWO}~WN4!0UxEnY33t5gk7K}a} z2OWhF5>C#L#lok{cW#?sS*+L@&VpoK8yc|*&yscFI$cbcFq~a>0UZ+ZC_t4$S{`Md zO~-h($X(^ThdAiY(FPTd7)H1d;L}LJrclaqbtd|w7HEj*_AJ{W*Kh5kJoj6Hk;K5? zWei^4A>cgqZy2s(epZ0}V#Z+Zvuy=!6NQqCeZX?rv@vCsyQts(kz6`_)5%SWL^x)D znm7?G=!#V=PU*z$7%7^e7TWq{C5(@C@oe$1u-!0Kg!-7cwY$&?7NcJGm*U zsVkq#2^Q?2eW6-=X#jIUTpf2?(J&ElaaToalmS{X4q>(Z4cq?|B!azy3UE4ywv$6( z!!iJ)!#RNGRrTIj8XD%b{oo))lP73b2 zFPVILvGo4Zw+*<-?`*Lh1cU`o(_Rf2^%xFksuH3GBbKz0g_%;>A6V-HSQF8wk~ zW{N=>sfD*9Myf~7olgcFk8Q+xKzJLxo-=`XmgCQi$(vTg?XCgP6cXiEOe2v~yIUKr ztP;3ig~&KaJP?WFU=v>x05rq-yO>NY?<^evbw~Nldf`E4nsa*E?Sd@fXKILsC|~$# zT!OTL_`c3B9}>rtpZDHKpzhxPu663vHtdBHe|`T-QR-Ir^MTKs8-$LYa%FE)0zt$J zZR*qDlXBALD29gqk4lX+ZPwZm+ejxQ>F(@iDfHZgk1TYwO zLBNMA{(qL_oIKPR$}zn|);+lzc&fI6h0DH%#_@5_XZu0Jgr4aQx~NL{x<9HJ26sx% z6`Afd8ZX6(!M*@Z7;>ei?X>HD#jH%Uu;OQwp*szaZJ&Kyc~kl)hx?wDT~`; zCBIj9U#E4$+4IUm#qn`+DLc25&r$hXO-;U0Qp3k1IOve7i+$o4nAmXS$uC4JsI06L zDsJE*9^}CYsW7qW*j5Yq2j~a5k4x>BHa|Jo{)HXml2(zV5cUiS{!{~)a)yaUb;DwN zsqQQLO&kx)=L5FYC?4BCC}$J$$ZpP}%Gzlj5)Xc^i(AvZv8O zB?IIIR!c9h>}orEBn&;~!%Iz!u9P#&W&i&r8d07l(7g_k3w-YCyu){?MP>sLV(p4AZ%+8t;6 ze2qllgH@q=+D%a`V}}3UZ-fAj(J;p|77<8?sFR^u~8&@C1O6o|2P-0L+Jo1tmsc`n~a20TTlIW`? zuTPGT`T}cT$)~BDud>{9oi`(Hjd36Rc1S?U_xE#I5U0Bl8)I13wyXtz{k(R`rm|Y> zWa-=RK2Pi4jvpO=guSq^%lqNhme~m&TUUMY?6A^hE=a?fAkAlZ8go1QK_S(KT(}920@Mxpo(?gmzPyUIYQ-m zCRz13S4IDQKav4rx|h1MWZ+L@Sr{U+mAGh&B>fdh{<5XXC_&q@rBY(*ip}=q56e#k z+DIPT&$^FS6Lbm*vgrWAtFp4=7_>YQVsbaUb}BrO1o;MG(2G~%g4+@OP3kUnDp}|# zf`k39BT)siCXzUJj&}_^v9{x6|Aw-oM=q94vUx$@#&jY>thw|L%h~GZ+wP(R@mom^ z&%WS9KGAr9o_=EqZH(9l6tO#i639)Qqiq@2&AW3ih{cX}JO-MlFACF$=aqiTQA^|x zH|V*C6Af;l$-^m#wJ%Op^MtODkbJsxH*`GCA&;rW^wJBX2eD~F=B|-}+K1nm6c|{d z`SEIqPH#yWbpVcrn>c_?ez~$-!kk@-UJ&@{W?=6YA&6#68LS8~tN{;`=^L zh`-uO=kJ>s{20-w*?sUl-<8^B2AqD;<+;$ba+WQb!LL+BSOb zk?gJ$BiiO~nvJGUqt@IC?}vt>4h=TLM0Xq^myx@UiA;k0%IL6knw(Tx z1=KD__ZAiw@{f+*eoI_le#iJBeOUB=6%u012T21%ydsP;po7#PAn_V#uCmi!c^xx> z6X6-+anO*QwD_8}D9o`i_-&(>xjRv2=UUkcXYR>SaHrFgtX#}~v*dR*O!jmfM3tJe zbw3d*cvYjB-f%%QZ!Y3)0}wDb+RE$aVgR=UyxJaf!^H=B-q>4=!%bzQ7Akq8Y1@vL zsC#;ImwNwfP=r|Djp~l;&=>$0twSwx#YKrRJx{srMAwFOi~milRD)*kxox~YKDy|Qvb!H zsZdtna;v0nvPsoVa;w|xAry>Sb8MDuhSHj{JjWM8hucScEp&0E`e`Byc#7V^GmpQo zAIV!hPsv|iZh7iZjw+kz`A-SrN$H?4;)NOl;xHMNf2Jm@zB?sW25T4gVPd&j%@Z7X?W zlkDt`lH^hQ2oy>dypix{juQX#H@a*TvOJ^{*rVE7`saDib1{X0*G*dPj_sruPgK&$ z!wM#d?B4P1zoOB4Bdfnekp6d#Uuk7;@sHdr?>TKC7LY?>_>%R(>tAD7p4coWMtI$# zcZyOa(B9AZM-R4A>=$y5fU;KjI5G#LCUD}|{Z+X~Ol@tt2n=!0`nveXVL+dzU4e6k z!sjxE*d5av8xQ5gtzmcmGA~&nskY9&{Bn+~zu?>EVeTiQ(rxz6Z*~o#F&EA3Q|!XP z1)VBY0;k~a+lgv5&8MPyCbsAwc);RNv)`mWeHOTw6~lwJC&N=_&P+iOmR8O`Lmm04 zW`P~sEVmg)8j=k?0F*tkn-S}*6K??7P%E&_8)w%mOoG6eXpm}GIyo&hH?V}pk#pN4^U1Xbh=Z^zw6j_((;cnCIFzF!fsFe&vpcGMG?cY#Z*X*-~20R{kXGc-%25)+a}Z?Dw_aOU5=YlwRg*XfWf-zLyJ)3|z7lGB)kU z@byH5g*9Dh&GkBCNpQ23k8yTIVWPl@ti9-&xmy z#No3Kn0(~5%sY=Z=lHc-UmK|Pr-gqcF4-||nZJskRgu-(lQk-Ib<=4)Q4LZq3-gWI z!@u^QPalRk?6#@VyN8(+lf;GvBkwgRs#Pk93oQ94e?OOZNUMnh(@PfmB@&EyVg7=c zWtZKiId9=`>4&VyN=4sfqmlccg29J;vVhH0fj45G;-+!?iTyh>c|EGiRu)5=Jy1K1}Ys!t(*1r&w-$0$z}uc}+=z5hYm>wbsos85TBm`uXi(Q+wCtR@pyrn!K6>2giQ&_jtugZb_caIWJlt31 zwO~QQGVEn!A=TGS0w_cbsxENdWuzzv4bnbGww?swEH55>HLIGPK7Ru zz|5YdEpAJQ#W3v4r)TD(PrKvnk#9y{t4h^K?+Vjk;s^#F&xs5c9;b*L%wlRyq-7m@ zTEtKE{9G>E(#~ZshD?FIqvOCQyHdyoIVz(s7uEnnP%DqBI?*bKu}BO|_~?^&N9T5@ z1$(AB(xOp20_i2a5r$~{J{ImzJDpD9W>U`mK(j9Wcw;n4X*wNpc-7Y9RkiH%*)Oal zzLe7S60hj!^|A<~b8#45_~kV#PUrB8HnxH@OjAv>PG2m-lK5NcAkAoQ=ab(oyrwr& zS#d=2%*FZ|8!sG1`xTE=Eo0#+qSVRxIgfF!Q^)M8X;Z%{BDb7;iZOoypLI`GCl=}w)TyYN+FubV&Y!q0F*p= z=EE(ELYn%r9ggh1rHVTuMVhOU6@8qntoGAylaly{ewv{h8%>ik;yzDt%2K^)VJ~VQ z^>|Uck^XAULhV95_kA(G31^}+8ezZ;2-?iEfG9bMxZBa3>oEFQpS_hImsfE2#Wm|X z5*>A$TQy5jK$7CtHJFtTy7M%BMnHV@sUoS`U5hxH_=Zad(G8czH)0W*Ivimf^Ixe{ z#+g`*9eX@y2yD7mp6AqXCcVL~3%!@np`qJp;#7FqbXwE7PTyfsdt+5?IafZD6`stC zR88e`d#C*lQM|HzI7x4 z#}r5$m3SDfmd-W^s^FQC17e6K6upjLil~Y>(cncnnQTMd}dP!k< zTZh{NYe~K>mBgNwg!`rT5^tiWuuk>h(M2v8(9ha{!gU{Hd(X6j(K^hwiJfV*o~(dN z_itLqbp?G+5OD!N=+38iA>HHJ#)lnI?uasT+pm@bLq;z3nLfk1#8O}Mf_Mi5mn>ci zy!zZ&i1Ng*5-vD6`m#N5LG4x8wf6bBk;N+VscfA_`TXve5pMVUiS6aWhtAv9CXxF^ zAZjdKz|GApE$yWFz08hGLdi|i<37xOp0^kPe960F!cB4kY`ZF|s?U6gM5bY^C4~c> zqp>Zy|D#$SumIKa`u(5s)7JuWq>blxH0KjSE&HHc{u5Q>Y#SeVpFodG4o#~j`n&~0rh1^T$q2MUXD0pqlfZZOde{6U4?H{{iS?>$m#~8 zi*0118qjkb*MIjtBj9@4VlRQ|6J7e5BigF9#XXZ%!DJ&`CjA~!#&q0d$v3M>cZ!w^ z9cA;+v?3aHQ`L2~w32U?K4)kBG}mYtKt_e%GPh6Q&GMDu)1?m32J&Rzb}y&k#A$J2 zMJAsRuw{Gpa zT6;D2*ex;55kqrG^UN0>v+ZLX2<}`wPF=!rYzjk8E~61|JP8O~QuJ{O)#KARu2Z#_ z%YR|5kF{Okf6kp**51dpDuPqqVI9MVLuXfRq3y>*ebJgb2Q#qzc_rQ758X-m;$&TT zU$Po5@N5d&udnBekV&4j5qI!ABEsEUk1GFl9_T~nuL`(cicvAv=gO84yXA`* zf8tkQXToolb&}1txeBC9iW6ma$HhWEz1_1SN>~V~Tt)x#o|?+{zOrQ1I?Gn;`QdUH z)c_E@kF4=XzZ@B|A9#&M8bd;>BJQ;Hdw2sK-;Fvy(-CBJSsPCF;Hbc*bg0G=zKw>g zvGMyjqZcdEIWsexC36(2|MbfuF2D#e&s2yobkB3O?UtwaOh6B>C=DMGXd(-(->UDL zfr7g`fvMA9dQ>UZq}XLkJ$%EY1Z1RnS6@0!EhNvnd#u;S6e(`3Owq{>AW3rW+|ycsa2Mx{oXF%|)%Z)|BZGc|sy zbX7mO)laI}{NgwK!o-blc^Z6uag{!z7M(jFp48jRP#W!ZRk0>KSGaIwr2-H)1Lf<{ zGC=ncFjq#C_(mdu>%VBhopqx#yIO~uz>XyyME3IiRN|Vl-*JRwu)3~c?{yc`RBN8P z4ugYswbyP4j+MvbW(%!|u6km?B(Z^#($g_MGOY_;A`wl=AjXjn)kyR(6Mxfvkuy5S zpHu#6V&_ti$n)l};WJ)V!&gl`ya!Froo9G3#&y^WI0A#zN9Qr&`Bgna$LzH9-(4Zp z$7KK!9m1!;21@n-?;<16n8T2l=DCR7Fz_Sh#20IVXt+coGz4RQ4d-uHwtkGDSSEUv zDH`KYOo3*lV5wi)Tw(qZ?jsauqMIvu98T)@GQIHvMOc2^mUvp)ha?X(-5SY$8bHvL zMAf=2UMN5Vp4Hv@|DWLj=i9)4;si2&C<-9t=+r9@-k=KHhMjwqY(X}W?c|VrI3o4) zSC0v2$1Sw9e$DfZnC*<@Rvr#KBz^?>gQcam2bb0_Vf)J=j~#d(;@p*&fAXxCNaQ#n zl_%Vjih$$W-cQNp-EqnLrda+8Lwh&GZB!C7Sqx1NPJ&*pN0{ZlkPpg<#Hc+Me2jg1 zS+%;z3LDLa1h;SGFXpH4FMiCTOQ(1AP~FQfp)glY1V$hCdog_+Bla(b*jQ_O`wsnd zqq?M<0ak|Sny?+t@6>}mMU}=Nv~zsOxyPUMj!pk->+>@@KzvJ93NjqV#}^|icmEQc zTA^aHHqOW$zC(vDCdcJxFaI=>N-m6*di{_xKoXmTt-VMLWNK{8viod{N0y0#`4ZS= z=#>ts^W8#0c{+6hjtg~8vVaBGX_1kq58Ay2UTKFi;rR5QP8_iVTU-4YKJ)#!)B4pl zDmITF{WP|C-uE=kORR%;d|{*Le&+{xQHP{%^V&tun3on_iW3xW?%ndp}ZTV zn0FBWW8;&MMlj4^)>-nx^AIo|o>F8VlFxI)&Lp$`g3yritaMdK-Afl|* z<_w`oNmCxk-8bMbBVI}Iq=%BkVHH=k>x_1tMd?qjMiu3H@&OX?R~JFV;(9bI0^L!i zI=;=9A9%tWnVz@44oAuZJ${LX1 z5Ykxg{~`D;2O!3u{;w-QWre|pE&@Wa#O`gI`u&w$Zga`#@0fGA>##_kK3e`uo$1~u zx}cSQ!6_k8DZ|)`<9PGs#SM#$Zw{|nCnft4K8A{)U=M+LYHG2y-Ncn3K66+A@%_b7 zw?Rhz9WXJqPw!BkaaK7&!sv7UFgb!9Lo|`453z`8s(NJp6D&HvoH+6Kt6Ph*ddR8_ ze?8pBsMN)NFN=?*NZ%X}$O91n_B1F~+qJIfzehmY*aNtoyLTNo-O_N1Za|blj$m)X z9|oi^b~kDeoA2Z(nTB3->@{$R!g__5pjwxiv)**aYhMalxx$9+D?-nINv;=o zT=Ebx(0w3*;Mc5v2YyPL1G2XGJ~poe>6Q--hPpca2Tc?WJ@uQFKk~!w+{=k*ys5RL zdZCr3@#D1r2Z#S`#L1^$2qea1LOH{S)#tgcDe>6izp<%Qs?9+ab3Hx}`q?unLwxkw zA7kS1B#8E1Boa{p%L@cwSgVFOd{Sy} zZ<+zzJE-7Mx)Xz=xiM)y;I*(^0E!^nyD`!INI6$wTri#eFEoG`DWb3-o;iTH)LNO6 z=dmAciNw^*-XUN}#!{kvZfuC63=9b=6Vo&Kp-1&I!N zGo1f|>YB;FgbNcx<;T;f`hxg2xTu+B@~qf}zJ1Zo(XqrLAESgqtk-yU8AWM*_T7*I zItz-6E3d*3F+su0|CEsyNy-nCPu<|&N0R6ZUUo}r6@TtLJAnr3#Xlc>jT9KRtiO+W zPX4c$G&VY(basB8ClhylY+zbbKl=9tiB}eWQqC%rT-yJ8$H-U~oU3*jK)PyOTqvo| z??oC}74-hSs@lB_aH$~j$`vU+X6Z+mR83w3bP2=o`rjg+GGL(zp2&BA8(y*^^+48x z0j9ensrNJUt&(WliUYqA;o-iUaL8~7FiUAoZHO% zkSSf%_6aeJIc;YDGB2U`KlVX^aCy1G;CGXNRP3HfSBEE9h#(yci(K}%r z3bI@b6Uef`eKP?a`;>2Doo4DW(CPS_JBE47-;_ID^_SeOj-QSC?K}TEvFra45`}yS z810?thp2P%(~*Lb8E1U^9rd%f!^6)$Pf*&9DfsU zY^1+Q3?<_^znng>@+pk!tgX!M1u-SltxEp?uSUVs5l66haI`Ue*8>9s m^;h! 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≠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�>AGsz9GxqqtIVpY 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

43ugX8j0{KfwbsX_w0$WT$ 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 U}M}Ir1)XahnP4>!MOS*-&wDy#sF(DGs~e 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�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

Zb7*CZ%bhC3y9GS@lHq5o> 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 literal 0 HcmV?d00001 From 636732fc9eb9a3a9009843f9d209f6d0d0f49880 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 21:59:05 +0100 Subject: [PATCH 5/5] Blog --- blog/authors.yml | 13 +++++--- blog/new-design.md | 1 + blog/osui-0.2.0.md | 32 +++++++++++++++++++ blog/osui-rewrite.md | 1 + docs/04-advanced/02-internals-macros.md | 1 - .../01-guides/00-creating-components.md | 2 +- .../01-guides/06-building-complex-layouts.md | 2 -- .../03-concepts/04-rendering-pipeline.md | 2 -- .../04-advanced/02-internals-macros.md | 1 - 9 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 blog/osui-0.2.0.md diff --git a/blog/authors.yml b/blog/authors.yml index a93b500..1d8a02f 100644 --- a/blog/authors.yml +++ b/blog/authors.yml @@ -1,7 +1,12 @@ kleo-dev: - name: Leo + name: Klesti title: Creator of OSUI - url: https://github.com/kleo-dev - image_url: https://github.com/kleo-dev.png + url: https://selimaj.dev + image_url: https://github.com/selimaj-dev.png socials: - github: kleo-dev + github: selimaj-dev + instagram: selimaj.dev + x: selimajdev + linkedin: klesti-selimaj + portfolio: https://selimaj.dev + youtube: SelimajDev diff --git a/blog/new-design.md b/blog/new-design.md index c849af4..34bd0d0 100644 --- a/blog/new-design.md +++ b/blog/new-design.md @@ -1,6 +1,7 @@ --- title: OSUI v0.0.9 alpha, what's new and should you update description: OSUI v0.0.9 is just on the edge of development, alpha is just the beginning. +date: 2025-06-30T22:19 slug: osui-0.0.9-alpha authors: - kleo-dev diff --git a/blog/osui-0.2.0.md b/blog/osui-0.2.0.md new file mode 100644 index 0000000..6bc3eae --- /dev/null +++ b/blog/osui-0.2.0.md @@ -0,0 +1,32 @@ +--- +title: OSUI v0.2.0 is here! +description: New codebase, new strucutre, new everything. +date: 2026-01-31 18:52 +slug: osui-0.2.0 +authors: + - kleo-dev +--- + +Wow, 2 years into this project, i was 14 years old when i started this project, aside from my first [Rust project](https://github.com/wyst-lang/wyst/tree/legacy) This was my second project and my most important for learning how rust actually works. + +I'll be honest, i wasn't the best developer back then, but i've learned so much, and i'm excited for a new era, i want to get back into this project to thank it for placing me where i'm at. + +Enough said though, let's get into the changes. + +## Rewrite +This rewrite has been one of the best yet, while not fully frontend featured, the engine and structure matters a lot, this is a much more resilient architecture than any other OSUI structure. + +## Performance +The performance is much better and it's more predictable, however i do not have a clue on why the spikes appear on those specific iterations. + +## Scoping +Scoping allows for the separation of dynamic and static DOM, for a more flexible UI, this makes `for` loops and `if` statements work perfectly without any bugs. + +![Scoping](https://private-user-images.githubusercontent.com/103524696/540255465-fe705306-260f-4443-b31f-17ecb9401ef8.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Njk4OTMxOTMsIm5iZiI6MTc2OTg5Mjg5MywicGF0aCI6Ii8xMDM1MjQ2OTYvNTQwMjU1NDY1LWZlNzA1MzA2LTI2MGYtNDQ0My1iMzFmLTE3ZWNiOTQwMWVmOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMTMxJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDEzMVQyMDU0NTNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jM2FjY2ZmMjQzMmRhZGVhZjFjZmMxMjg2YzFlZTFkNzdhNGM4OTA2MWU2MWM3ZjliNDY1YzE3ZGFjMmRiMTQ1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.zuJ_ZkgzhP0Ww2Z3-zu12fQPQVRxl_kr5VQwHbDD5sQ) + +## What's missing +I've only worked on this version for about 2-3 weeks, so it's not fully featured, here are the features that will be added on future versions: + +- Positioning and sizing API, Position::Center, etc. +- Styling API, fg: #fff, etc. +- RSX string dependencies (or ref cloning) (`%state "{state}"`). \ No newline at end of file diff --git a/blog/osui-rewrite.md b/blog/osui-rewrite.md index 8d0ff78..33aabdd 100644 --- a/blog/osui-rewrite.md +++ b/blog/osui-rewrite.md @@ -1,6 +1,7 @@ --- title: Releasing OSUI v0.0.9 description: A new upcoming version of OSUI will come out. Let's re-write it. +date: 2025-01-19T23:16 slug: osui-0.0.9-rewrite authors: - kleo-dev diff --git a/docs/04-advanced/02-internals-macros.md b/docs/04-advanced/02-internals-macros.md index 9b004c4..9e69d93 100644 --- a/docs/04-advanced/02-internals-macros.md +++ b/docs/04-advanced/02-internals-macros.md @@ -1,6 +1,5 @@ --- sidebar_position: 2 -title: Internals: Macros --- # Internals: Macros diff --git a/versioned_docs/version-0.2.0/01-guides/00-creating-components.md b/versioned_docs/version-0.2.0/01-guides/00-creating-components.md index 438b18e..87e9b7f 100644 --- a/versioned_docs/version-0.2.0/01-guides/00-creating-components.md +++ b/versioned_docs/version-0.2.0/01-guides/00-creating-components.md @@ -73,7 +73,7 @@ pub fn App(cx: &Arc) -> View { * **Parameter Names**: The names of your function parameters (e.g., `name`, `age`) become the names of the props you use when instantiating the component in `rsx!`. * **Reference Types**: Props are typically passed as references (e.g., `&str`, `&u8`). The `#[component]` macro automatically "strips" the reference when generating the internal component struct, storing the owned type. This means you don't need to manually clone values unless you intend to move them into a closure or `State`. -* **`children` Prop**: As seen in the [previous guide](../intro/03-example-basic-component.md), any content nested inside a component's `rsx!` invocation is implicitly passed as a `children: &Rsx` prop. This allows for flexible content composition. +* **`children` Prop**: As seen in the [previous guide](/docs/intro/03-example-basic-component.md), any content nested inside a component's `rsx!` invocation is implicitly passed as a `children: &Rsx` prop. This allows for flexible content composition. ### Example: Component with `children` and custom props diff --git a/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md b/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md index 1cbaa96..a8d5959 100644 --- a/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md +++ b/versioned_docs/version-0.2.0/01-guides/06-building-complex-layouts.md @@ -151,5 +151,3 @@ The `MyCustomLayout` component above demonstrates a basic two-column layout. You * **Composition**: Layout components can themselves be children of other layout components, allowing you to build complex nested structures. While implementing a full layout system like CSS Flexbox is beyond the scope of OSUI's core, these primitives empower you to craft highly customized and visually rich terminal interfaces by manually managing space and component placement. - -**Next:** Explore the detailed [API Reference](../reference/00-crate-structure.md) for all OSUI modules and types. diff --git a/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md b/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md index c27afbc..b090549 100644 --- a/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md +++ b/versioned_docs/version-0.2.0/03-concepts/04-rendering-pipeline.md @@ -71,5 +71,3 @@ graph TD * **Extensibility**: The `Engine` trait allows for different rendering backends (e.g., to a file, to a graphical window, or for benchmarking) without modifying component logic. Understanding this pipeline helps in debugging rendering issues, optimizing performance, and building custom rendering logic within your OSUI applications. - -**Next:** Explore advanced topics like [Performance Benchmarking](../advanced/00-performance-benchmarking.md). diff --git a/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md b/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md index 9b004c4..9e69d93 100644 --- a/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md +++ b/versioned_docs/version-0.2.0/04-advanced/02-internals-macros.md @@ -1,6 +1,5 @@ --- sidebar_position: 2 -title: Internals: Macros --- # Internals: Macros