From a07f4c48aa950793203755ba8e3c2c5e12e17f98 Mon Sep 17 00:00:00 2001 From: Hare Date: Wed, 8 Jul 2026 19:50:04 +0900 Subject: [PATCH] Expose tokenizer for web highlighting --- crates/decodal-core/src/lexer.rs | 225 ++++++++++++++++++ crates/decodal-core/src/lib.rs | 4 +- crates/decodal-wasm/src/lib.rs | 85 ++++++- doc/manual/souce/development.md | 4 + site/decodal-site/src/lib/highlight.js | 60 +++++ site/decodal-site/src/scripts/playground.js | 20 +- site/decodal-site/src/wasm/decodal_wasm.d.ts | 3 + site/decodal-site/src/wasm/decodal_wasm.js | 19 ++ .../src/wasm/decodal_wasm_bg.wasm | Bin 299962 -> 305965 bytes .../src/wasm/decodal_wasm_bg.wasm.d.ts | 1 + 10 files changed, 415 insertions(+), 6 deletions(-) diff --git a/crates/decodal-core/src/lexer.rs b/crates/decodal-core/src/lexer.rs index 496919a..8d43efb 100644 --- a/crates/decodal-core/src/lexer.rs +++ b/crates/decodal-core/src/lexer.rs @@ -54,6 +54,66 @@ pub enum TokenKind { Eof, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PublicToken { + pub kind: PublicTokenKind, + pub span: Span, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum PublicTokenKind { + Ident, + Int, + Float, + String, + Regex, + True, + False, + Let, + In, + Match, + Import, + Default, + Underscore, + LBrace, + RBrace, + LBracket, + RBracket, + LParen, + RParen, + Semicolon, + Comma, + Dot, + Colon, + Equal, + EqualEqual, + Bang, + BangEqual, + Arrow, + Amp, + AmpAmp, + PipePipe, + Plus, + PlusPlus, + Minus, + Star, + Slash, + SlashSlash, + Gt, + Gte, + Lt, + Lte, + Comment, +} + +pub fn tokenize_source(source: &str) -> Result> { + tokenize_source_with_id(SourceId(0), source) +} + +pub fn tokenize_source_with_id(source_id: SourceId, source: &str) -> Result> { + Lexer::with_source_id(source_id, source).tokenize_public() +} + pub struct Lexer<'a> { source_id: SourceId, source: &'a str, @@ -91,8 +151,26 @@ impl<'a> Lexer<'a> { } } + pub fn tokenize_public(mut self) -> Result> { + let mut tokens = Vec::new(); + let mut previous = None; + loop { + let Some(token) = self.next_public_token(previous.as_ref())? else { + return Ok(tokens); + }; + if token.kind != PublicTokenKind::Comment { + previous = Some(token.kind); + } + tokens.push(token); + } + } + fn next_token(&mut self, previous: Option<&TokenKind>) -> Result { self.skip_ws_and_comments(); + self.next_non_ws_token(previous) + } + + fn next_non_ws_token(&mut self, previous: Option<&TokenKind>) -> Result { let start = self.pos; let Some(ch) = self.peek() else { return Ok(Token { @@ -242,6 +320,42 @@ impl<'a> Lexer<'a> { }) } + fn next_public_token( + &mut self, + previous: Option<&PublicTokenKind>, + ) -> Result> { + self.skip_ws(); + let start = self.pos; + let Some(ch) = self.peek() else { + return Ok(None); + }; + if ch == b'#' { + self.pos += 1; + while !matches!(self.peek(), None | Some(b'\n')) { + self.pos += 1; + } + return Ok(Some(PublicToken { + kind: PublicTokenKind::Comment, + span: self.span(start, self.pos), + })); + } + let previous_token = previous.map(public_kind_to_token_kind); + let token = self.next_non_ws_token(previous_token.as_ref())?; + if token.kind == TokenKind::Eof { + return Ok(None); + } + Ok(Some(PublicToken { + kind: PublicTokenKind::from_token_kind(&token.kind), + span: token.span, + })) + } + + fn skip_ws(&mut self) { + while matches!(self.peek(), Some(b' ' | b'\t' | b'\r' | b'\n')) { + self.pos += 1; + } + } + fn skip_ws_and_comments(&mut self) { loop { while matches!(self.peek(), Some(b' ' | b'\t' | b'\r' | b'\n')) { @@ -390,6 +504,102 @@ impl<'a> Lexer<'a> { } } +impl PublicTokenKind { + fn from_token_kind(kind: &TokenKind) -> Self { + match kind { + TokenKind::Ident(_) => Self::Ident, + TokenKind::Int(_) => Self::Int, + TokenKind::Float(_) => Self::Float, + TokenKind::String(_) => Self::String, + TokenKind::Regex(_) => Self::Regex, + TokenKind::True => Self::True, + TokenKind::False => Self::False, + TokenKind::Let => Self::Let, + TokenKind::In => Self::In, + TokenKind::Match => Self::Match, + TokenKind::Import => Self::Import, + TokenKind::Default => Self::Default, + TokenKind::Underscore => Self::Underscore, + TokenKind::LBrace => Self::LBrace, + TokenKind::RBrace => Self::RBrace, + TokenKind::LBracket => Self::LBracket, + TokenKind::RBracket => Self::RBracket, + TokenKind::LParen => Self::LParen, + TokenKind::RParen => Self::RParen, + TokenKind::Semicolon => Self::Semicolon, + TokenKind::Comma => Self::Comma, + TokenKind::Dot => Self::Dot, + TokenKind::Colon => Self::Colon, + TokenKind::Equal => Self::Equal, + TokenKind::EqualEqual => Self::EqualEqual, + TokenKind::Bang => Self::Bang, + TokenKind::BangEqual => Self::BangEqual, + TokenKind::Arrow => Self::Arrow, + TokenKind::Amp => Self::Amp, + TokenKind::AmpAmp => Self::AmpAmp, + TokenKind::PipePipe => Self::PipePipe, + TokenKind::Plus => Self::Plus, + TokenKind::PlusPlus => Self::PlusPlus, + TokenKind::Minus => Self::Minus, + TokenKind::Star => Self::Star, + TokenKind::Slash => Self::Slash, + TokenKind::SlashSlash => Self::SlashSlash, + TokenKind::Gt => Self::Gt, + TokenKind::Gte => Self::Gte, + TokenKind::Lt => Self::Lt, + TokenKind::Lte => Self::Lte, + TokenKind::Eof => unreachable!(), + } + } +} + +fn public_kind_to_token_kind(kind: &PublicTokenKind) -> TokenKind { + match kind { + PublicTokenKind::Ident => TokenKind::Ident(String::new()), + PublicTokenKind::Int => TokenKind::Int(0), + PublicTokenKind::Float => TokenKind::Float(0.0), + PublicTokenKind::String => TokenKind::String(String::new()), + PublicTokenKind::Regex => TokenKind::Regex(String::new()), + PublicTokenKind::True => TokenKind::True, + PublicTokenKind::False => TokenKind::False, + PublicTokenKind::Let => TokenKind::Let, + PublicTokenKind::In => TokenKind::In, + PublicTokenKind::Match => TokenKind::Match, + PublicTokenKind::Import => TokenKind::Import, + PublicTokenKind::Default => TokenKind::Default, + PublicTokenKind::Underscore => TokenKind::Underscore, + PublicTokenKind::LBrace => TokenKind::LBrace, + PublicTokenKind::RBrace => TokenKind::RBrace, + PublicTokenKind::LBracket => TokenKind::LBracket, + PublicTokenKind::RBracket => TokenKind::RBracket, + PublicTokenKind::LParen => TokenKind::LParen, + PublicTokenKind::RParen => TokenKind::RParen, + PublicTokenKind::Semicolon => TokenKind::Semicolon, + PublicTokenKind::Comma => TokenKind::Comma, + PublicTokenKind::Dot => TokenKind::Dot, + PublicTokenKind::Colon => TokenKind::Colon, + PublicTokenKind::Equal => TokenKind::Equal, + PublicTokenKind::EqualEqual => TokenKind::EqualEqual, + PublicTokenKind::Bang => TokenKind::Bang, + PublicTokenKind::BangEqual => TokenKind::BangEqual, + PublicTokenKind::Arrow => TokenKind::Arrow, + PublicTokenKind::Amp => TokenKind::Amp, + PublicTokenKind::AmpAmp => TokenKind::AmpAmp, + PublicTokenKind::PipePipe => TokenKind::PipePipe, + PublicTokenKind::Plus => TokenKind::Plus, + PublicTokenKind::PlusPlus => TokenKind::PlusPlus, + PublicTokenKind::Minus => TokenKind::Minus, + PublicTokenKind::Star => TokenKind::Star, + PublicTokenKind::Slash => TokenKind::Slash, + PublicTokenKind::SlashSlash => TokenKind::SlashSlash, + PublicTokenKind::Gt => TokenKind::Gt, + PublicTokenKind::Gte => TokenKind::Gte, + PublicTokenKind::Lt => TokenKind::Lt, + PublicTokenKind::Lte => TokenKind::Lte, + PublicTokenKind::Comment => TokenKind::Underscore, + } +} + fn is_ident_start(c: u8) -> bool { c.is_ascii_alphabetic() } @@ -427,4 +637,19 @@ mod tests { assert_eq!(tokens[3].kind, TokenKind::Amp); assert_eq!(tokens[4].kind, TokenKind::Gte); } + + #[test] + fn public_tokenization_keeps_comments_and_spans() { + let source = "# hello\nport = [1] ++ [2];"; + let tokens = tokenize_source(source).unwrap(); + assert_eq!(tokens[0].kind, PublicTokenKind::Comment); + let comment = &source[tokens[0].span.start as usize..tokens[0].span.end as usize]; + assert_eq!(comment, "# hello"); + assert_eq!(tokens[1].kind, PublicTokenKind::Ident); + assert!( + tokens + .iter() + .any(|token| token.kind == PublicTokenKind::PlusPlus) + ); + } } diff --git a/crates/decodal-core/src/lib.rs b/crates/decodal-core/src/lib.rs index 0f7c47d..69a611c 100644 --- a/crates/decodal-core/src/lib.rs +++ b/crates/decodal-core/src/lib.rs @@ -21,7 +21,9 @@ pub use decodal_derive::Decodal; pub use diagnostic::{Diagnostic, DiagnosticKind, Result}; pub use embedding::{HostField, HostValue}; pub use eval::{Engine, format_diagnostic_with}; -pub use lexer::{Lexer, Token, TokenKind}; +pub use lexer::{ + Lexer, PublicToken, PublicTokenKind, Token, TokenKind, tokenize_source, tokenize_source_with_id, +}; pub use module::{EmptyLoader, LoadedSource, Module, SourceLoader}; pub use parser::{ParseOutput, Parser, SourceForm, parse_source, parse_source_with_source_id}; pub use runtime::{Constraint, Data, ExprRef, LiteralValue, ModuleId, PrimitiveType, RuntimeValue}; diff --git a/crates/decodal-wasm/src/lib.rs b/crates/decodal-wasm/src/lib.rs index 1c5f7af..8e938eb 100644 --- a/crates/decodal-wasm/src/lib.rs +++ b/crates/decodal-wasm/src/lib.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; use decodal::{ - Data, Diagnostic, DiagnosticKind, EmptyLoader, Engine, LoadedSource, SourceId, SourceLoader, - Span, format_diagnostic_with, + Data, Diagnostic, DiagnosticKind, EmptyLoader, Engine, LoadedSource, PublicTokenKind, SourceId, + SourceLoader, Span, format_diagnostic_with, tokenize_source, }; use wasm_bindgen::prelude::*; @@ -16,6 +16,33 @@ pub fn evaluate_project(entry: &str, files_json: &str) -> String { encode_result(evaluate_project_inner(entry, files_json)) } +#[wasm_bindgen(js_name = tokenizeSource)] +pub fn tokenize_source_json(source: &str) -> String { + match tokenize_source(source) { + Ok(tokens) => { + let mut out = String::from("{\"ok\":true,\"tokens\":["); + for (index, token) in tokens.iter().enumerate() { + if index > 0 { + out.push(','); + } + out.push_str("{\"kind\":"); + out.push_str(&json_string(public_token_kind_name(token.kind))); + out.push_str(",\"start\":"); + out.push_str(&token.span.start.to_string()); + out.push_str(",\"end\":"); + out.push_str(&token.span.end.to_string()); + out.push('}'); + } + out.push_str("]}"); + out + } + Err(error) => format!( + "{{\"ok\":false,\"error\":{}}}", + json_string(&format_diagnostic_with_root(&error, "playground")) + ), + } +} + fn encode_result(result: Result) -> String { match result { Ok(output) => format!("{{\"ok\":true,\"output\":{}}}", json_string(&output)), @@ -145,6 +172,53 @@ fn format_diagnostic_with_root(diagnostic: &decodal::Diagnostic, root_name: &str }) } +fn public_token_kind_name(kind: PublicTokenKind) -> &'static str { + match kind { + PublicTokenKind::Ident => "ident", + PublicTokenKind::Int => "int", + PublicTokenKind::Float => "float", + PublicTokenKind::String => "string", + PublicTokenKind::Regex => "regex", + PublicTokenKind::True => "true", + PublicTokenKind::False => "false", + PublicTokenKind::Let => "let", + PublicTokenKind::In => "in", + PublicTokenKind::Match => "match", + PublicTokenKind::Import => "import", + PublicTokenKind::Default => "default", + PublicTokenKind::Underscore => "underscore", + PublicTokenKind::LBrace => "l_brace", + PublicTokenKind::RBrace => "r_brace", + PublicTokenKind::LBracket => "l_bracket", + PublicTokenKind::RBracket => "r_bracket", + PublicTokenKind::LParen => "l_paren", + PublicTokenKind::RParen => "r_paren", + PublicTokenKind::Semicolon => "semicolon", + PublicTokenKind::Comma => "comma", + PublicTokenKind::Dot => "dot", + PublicTokenKind::Colon => "colon", + PublicTokenKind::Equal => "equal", + PublicTokenKind::EqualEqual => "equal_equal", + PublicTokenKind::Bang => "bang", + PublicTokenKind::BangEqual => "bang_equal", + PublicTokenKind::Arrow => "arrow", + PublicTokenKind::Amp => "amp", + PublicTokenKind::AmpAmp => "amp_amp", + PublicTokenKind::PipePipe => "pipe_pipe", + PublicTokenKind::Plus => "plus", + PublicTokenKind::PlusPlus => "plus_plus", + PublicTokenKind::Minus => "minus", + PublicTokenKind::Star => "star", + PublicTokenKind::Slash => "slash", + PublicTokenKind::SlashSlash => "slash_slash", + PublicTokenKind::Gt => "gt", + PublicTokenKind::Gte => "gte", + PublicTokenKind::Lt => "lt", + PublicTokenKind::Lte => "lte", + PublicTokenKind::Comment => "comment", + } +} + fn format_data(data: &Data, indent: usize) -> String { match data { Data::String(value) => json_string(value), @@ -231,6 +305,13 @@ mod tests { ); } + #[test] + fn tokenizes_source_for_web() { + let output = super::tokenize_source_json("# hi\nport = [1] ++ [2];"); + assert!(output.contains("\"kind\":\"comment\"")); + assert!(output.contains("\"kind\":\"plus_plus\"")); + } + #[test] fn evaluates_project_imports() { let files = r#"{ diff --git a/doc/manual/souce/development.md b/doc/manual/souce/development.md index 4f2a3cc..b4ea1ee 100644 --- a/doc/manual/souce/development.md +++ b/doc/manual/souce/development.md @@ -60,6 +60,7 @@ site/decodal-site/src/pages/docs/[...slug].astro site/decodal-site/src/pages/playground.astro site/decodal-site/src/layouts/ManualLayout.astro site/decodal-site/src/lib/docs.js +site/decodal-site/src/lib/highlight.js crates/decodal-wasm/src/lib.rs ``` @@ -80,6 +81,9 @@ site/decodal-site/src/wasm/ These generated files are committed so the site can be built without requiring every consumer to regenerate the wasm package first. +The playground editor uses `tokenizeSource` from `decodal-wasm` for token spans and maps those tokens to HTML classes in `src/lib/highlight.js`. +The documentation build still uses the lightweight JavaScript fallback highlighter so Astro can render Markdown without initializing WASM at build time. + To run the site locally: ```sh diff --git a/site/decodal-site/src/lib/highlight.js b/site/decodal-site/src/lib/highlight.js index aa5e7c3..7cfcf1a 100644 --- a/site/decodal-site/src/lib/highlight.js +++ b/site/decodal-site/src/lib/highlight.js @@ -25,6 +25,66 @@ export function highlightCode(code, language = '') { return escapeHtml(code); } +export function highlightDecodalTokens(source, tokens) { + let html = ''; + let cursor = 0; + for (const token of tokens) { + if (token.start > cursor) html += escapeHtml(source.slice(cursor, token.start)); + const text = source.slice(token.start, token.end); + const kind = tokenClass(token.kind, text); + html += kind ? `${escapeHtml(text)}` : escapeHtml(text); + cursor = token.end; + } + if (cursor < source.length) html += escapeHtml(source.slice(cursor)); + return html; +} + +function tokenClass(kind, text) { + if (['let', 'in', 'fn', 'match', 'import', 'default'].includes(kind)) return 'tok-keyword'; + if (kind === 'ident' && ['String', 'Int', 'Float', 'Bool', 'Array'].includes(text)) return 'tok-type'; + if (kind === 'ident') return ''; + if (['true', 'false'].includes(kind)) return 'tok-literal'; + if (['int', 'float'].includes(kind)) return 'tok-number'; + if (kind === 'string') return 'tok-string'; + if (kind === 'regex') return 'tok-regex'; + if (kind === 'comment') return 'tok-comment'; + if ( + [ + 'equal', + 'equal_equal', + 'bang', + 'bang_equal', + 'arrow', + 'amp', + 'amp_amp', + 'pipe_pipe', + 'plus', + 'plus_plus', + 'minus', + 'star', + 'slash', + 'slash_slash', + 'gt', + 'gte', + 'lt', + 'lte', + 'dot', + 'colon', + 'semicolon', + 'comma', + 'l_brace', + 'r_brace', + 'l_bracket', + 'r_bracket', + 'l_paren', + 'r_paren', + ].includes(kind) + ) { + return 'tok-operator'; + } + return ''; +} + export function highlightDecodal(source) { let html = ''; let index = 0; diff --git a/site/decodal-site/src/scripts/playground.js b/site/decodal-site/src/scripts/playground.js index b0b79b1..1d9c2b0 100644 --- a/site/decodal-site/src/scripts/playground.js +++ b/site/decodal-site/src/scripts/playground.js @@ -1,5 +1,5 @@ -import init, { evaluateProject } from '../wasm/decodal_wasm.js'; -import { highlightDecodal } from '../lib/highlight.js'; +import init, { evaluateProject, tokenizeSource } from '../wasm/decodal_wasm.js'; +import { highlightDecodal, highlightDecodalTokens } from '../lib/highlight.js'; import { playgroundExamples } from './playground-examples.js'; const STORAGE_KEY = 'decodal-playground-project-v1'; @@ -18,6 +18,7 @@ const exampleSelect = document.getElementById('example-select'); const loadExample = document.getElementById('load-example'); const project = loadProject(); +let wasmReady = false; for (const example of playgroundExamples) { const option = document.createElement('option'); @@ -97,7 +98,18 @@ function setActiveFile(path) { } function updateHighlight() { - sourceHighlight.innerHTML = `${highlightDecodal(source.value)}\n`; + sourceHighlight.innerHTML = `${highlightSource(source.value)}\n`; +} + +function highlightSource(value) { + if (!wasmReady) return highlightDecodal(value); + try { + const result = JSON.parse(tokenizeSource(value)); + if (result.ok) return highlightDecodalTokens(value, result.tokens); + } catch (_error) { + // Fall back to the lightweight JavaScript highlighter. + } + return highlightDecodal(value); } function syncHighlightScroll() { @@ -165,6 +177,8 @@ function compareNodes(a, b) { try { await init(); + wasmReady = true; + updateHighlight(); run.disabled = false; status.textContent = ''; execute(); diff --git a/site/decodal-site/src/wasm/decodal_wasm.d.ts b/site/decodal-site/src/wasm/decodal_wasm.d.ts index e88b72f..59b9615 100644 --- a/site/decodal-site/src/wasm/decodal_wasm.d.ts +++ b/site/decodal-site/src/wasm/decodal_wasm.d.ts @@ -5,12 +5,15 @@ export function evaluate(source: string): string; export function evaluateProject(entry: string, files_json: string): string; +export function tokenizeSource(source: string): string; + export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; readonly evaluate: (a: number, b: number) => [number, number]; readonly evaluateProject: (a: number, b: number, c: number, d: number) => [number, number]; + readonly tokenizeSource: (a: number, b: number) => [number, number]; readonly __wbindgen_externrefs: WebAssembly.Table; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; diff --git a/site/decodal-site/src/wasm/decodal_wasm.js b/site/decodal-site/src/wasm/decodal_wasm.js index 800a76f..0f2ae92 100644 --- a/site/decodal-site/src/wasm/decodal_wasm.js +++ b/site/decodal-site/src/wasm/decodal_wasm.js @@ -40,6 +40,25 @@ export function evaluateProject(entry, files_json) { wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); } } + +/** + * @param {string} source + * @returns {string} + */ +export function tokenizeSource(source) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(source, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.tokenizeSource(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} function __wbg_get_imports() { const import0 = { __proto__: null, diff --git a/site/decodal-site/src/wasm/decodal_wasm_bg.wasm b/site/decodal-site/src/wasm/decodal_wasm_bg.wasm index b2f4a2f3fcc9d70d9dce09f6482f31e38722d469..ff3605f7e6577ee566b351192bc956900ddf31f6 100644 GIT binary patch delta 49915 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 B?+E|^ delta 43628 zcmdRX34o2&`~N-XeP`y*+&eRO%owv6?!5+M8Dkwg^U9KatjRuhgDfc}+#!SzUL2K5 zrBYECxhfh;QkGPT`YMD{Q7TI1TmR2<&ime(D}BGe|Npo3Pc!dXpL5Q0p6xtmnN1&+ zd*zvOn+LL5Kl3Zx?T(6$a_erlJ32Zd4!@$JqAKg<%EiTL(NVhF>2}9OxuYV?`&rf4 z2t6u7k9I~lW1>7xvxH4D>+-J2dPG!IL_|bfY(#_}6A__tmmaBeb2T5`WW%}F9j<`G zI7r{9oh&AD!pI2|r`*jQ&XIQ(jK8B`>PW|PJl+oHPnlRaa`;ro2D5|KH?WqM8!}|t zu(7v|7(Mc~AyY;cj2}O7xZ_D4UnX_bl#wGHuX9hCq}!(!OquF%L~mluVK7&pV*VC? zhcD+l`Fg&NKg@q;+xdQefW6OtWJlQB{2&YR%WNV0h@a;7^Bw#OTf{!+7kJ<){y3k* zxAK{X_)2z=Z{{obFKj1U!4C74{1LW|9|!u5@E_Rw{5^h&zs!GP_p^WSqg?P0_?LVm ze}u1PZ?W(BYkU`fh5yVJvlIMPew8g@=XtOD_-A}C|B&zDvsu^u>>D1l{oB|p{Mrbf z9?)l1aTsRh#$7$vn8W4e-bmx}da&oML5Mh)SX99fkrddgOG zd#GC&mqFw678-k=+U+pXJnxuwZyL=WFxT8v*Zi{j6J}xCcyw-h+t*kfvuV3*Ge5by zxuo5uh$=jf=b1f{)684jPeh5g+h^hT#H1Yjek^G%ewTEpZ4LeuFZ6UYf9f!+>o6Oe zo(CA3l^I?h8{v+mnR6LO9+fj^&0}fIjZs;%iae{L*(!M!8)oKpOhJEd?Klr@p6pmN ztj*;WavDgo&@p|b;Lvs!U#59VIH2j?XyfvFt6jrsWO=?a@9b3BESK^PJ8sVIoEW`@ z`?*(Z=J1$%a4cbN!-9Kw~8h8`yXf7Q%1XJ|wz_f-B zFn1iG?Z+l5i}|%W)#%tnpyYW858U&-Sxsi$N)<-e=H2{LZPBjo+sR`S3eX zYZhB*&K_J5;YSBAlDQSkydlX5-7=&yL5XsK+j*W*1FUhzoIm8Lc$#^Yrer{~q4$6% zw-4-fnM;SSkfGu1V{_h!x>R_?Bx|50^*aPW5ujm3 znHXM#%Nq^uEhV||Sa}R_uaZ&@LShmjG0~f3@TnGC6Zcp0W_ZhcY(|;Kz3J^@BfJ&8 z=|+m;eriTBvFRKY7ef2ZnX0U#Y*`mIqLpdHd~{SE1~af>WtOvI^j=`gXfy%8Uu;B} z>on$W{Lag*Q9IGAwTsoko*D@j?$(KAxN+n$n^koTbhnC`sbi%*7k>R@_)9m-}B3%BL|YQWzIEZO7Q(LJIG>`QJ(5q)z`& zQn>iePBHBNS_H31^P5j~`HDSV{6N=NZJFCGqnTOM^GWlC{7z-1FhuhsNWUo4NDv?U zI|$&h#fAOGyVrNbLzhJzb<0Q1R`7Hze&WN995ZJGXEI$CYaY~ zG}x00iLaBykM!!&SPK`qxt0F|QWl_=j$Oe9n!dtk*=h4Y;b{E+ZG48AKdy}x+B|Lm zLhkX4@%zE?1v0gt{9VbMGGS!}7{Fd%jNv7v$o)~VFm4Sm%-hrVHa6qu80Mx1&xO{mPD_ zw5uoty=X@jz-R0z06rF!2zuc5YwVP{c5_8A+jGRzxjFGl$cf zn=Hq?9Y(GkscQP4WtzScG^aveQYl5@SnrWiFHi|wew-dsDXhH!0% zHCe#kWfiu@ta;0suE}n5=yVs`XO5qqrh~aM&DqncnVY9?WM7+u?io~OPuLnf*mF4*KWee+SKp)y8Py;$-N7aDdw4)f%E)~9RK*r1r$bca;JBNC| zWu~96+hKkSM{H#@mZ>J+ojoc=PWLuyE7dC6jCh5iU5VrroQ1bOc5 z%BGrw@0}UKW2M`2&6K&cR=I2LKz7djaPCr+7%^{Ue+-}s=DkX&`wIedn< z+HW>A8vq{$b)*#St%2qA!3_$@C*!khM()QET6Q8nTn zb`&Gtyu*xJR5QM8pEID@IxLz9dI&BW9GdHj_uqz;`|lrIqioqEH9quiC-Y-CaJgjh z-Lw!R*Gjp?Z`24wBUWL=JRv#eCC0MgnZGYi2PLH~DZ=lEm(a5H?Iktv`^P1hGeT`* zu}4&y%Ts_UCE=$Q>koJsI#+&KL5QelE*lc+`k7@1A-*;*zb};1YDMiKa-Hi_2$VfX z-)m?)SYv>eejZ1*hV5EK>)inCS*SaK)}a~|Q1=>RmkJ*Uk{s~ek_SNTwX(&{E=x78|is}<+M z&KVdAZ4ZS!YwX;@P-t%`ROvy=&3n*>^}dW#E43f8>&*{^PFbPGX48k$LKyD<@a>qK z!w*-qv0D87!xvbfcN(a4y;Qw2xSx|2?w#gln0w;_+-O*^kK2P3$Ty7FX#_f9ygHJd z3mjb~;`VV+0QIMqMdPbC|8`qqL#RDJxGJ^Fs+pe#Q--YXY zu-?Tx*QdIZ&z^*EEh5J!D5zU3@e;aK{LSVTEbzdoJ@DumvIzNi(3gtv_k^k#Hz?rx zcLn|}1ZG1BP`A)#x}6~7S$0erkls*nIS38pzwWASUWS+bS1};phAZKu0#0Ca2#~`| z3A-tNgHD7429cHpg|LM(tHa^B*EL+WbU=auZNquVuBhN_vZH|WlnQIcHRz4c&2~GU z8w!}#S_NIzESNPM$Lv~4E4*t*70kEnC}5VzFqax=gg=>t`aqIOnsLHGjdXwc(?oI% zLc^s=4S)bGh+4nW$ce^tXh7zSS88>dzuQ6wS#~uXf7op(#r(4!RUP`yj;aoQX-84< zWQqCxD-AG7RbTaJ6{R;i-Iw95=u2~X6AX4U`j$)qD4ia!EtRuavjXf_H~9>ubSJ%| ze5IzZq)U19@-6IA(0Y!^_1s$y^nXrCUA}ymxvivk9~5A|gfe)v=cb0^(yp*MK5s`= zw@=wobo;mpOP%hI2jT|p?nnrddfR+qcXI6|uZ6){U`G|KB0CCLS9h70b|peRPSZ~{~;4t?m0O9)Ho`i6z=gq-;lk;bnNR@8$>o0a?1^RnCsz85bM*;e@ z3@e^E3J(Bbj9S>cw{snf7hpLlrU(TZ+9@e^zy~sG`DXfPyHj!oNt_TCvmO8W?nTjr z9u0M``$0`8#+ED=b zZKqlA4l&)G@0_n>O>VM1l_~(CcnOmCv^nFz-B1@l9awD=Hx^3A)c-tst;jS>u^1ms7#{>V>759N|HS~()D&gslid)_~;`HX4!`yl5zIihh&^}{phKvs3K|}`_R99+BzVuuD>uL z{;f?_DXb?qFx&nugpT26%MCz;7YG}zHyztXSl-caing8{&y$Z3>aEc@k#&mVMdqB- zgELFb%P<&31ffxw`scZUOR^4Z#C^4R`2eSF{8Nr`exB*@a>J3!YkPSc@;nw{?UIS4 zBaT8tpW>sje zEA&SjX`N#kiU#rw=8c|em_tI&E}l+(rEmyt z1eyeFEGg*BLYEa6^nlYJr@D@Q4=Icr#Tr?^1wvyAsligM_Y_76hsfgqN zfMfPSOsU>DZ;Yg&Y8?=vg52s`20Y`}p{}w5sj8-gs@Ccdn-W&li>fK%&HAj~z%|3X z0qLre81P%^$>GH-lx?YesHK|<<9K8QjwqBJQEJ(;NujbWJH#f1^(qa$!T|tO4G`VR z=Bt*in^?APVp!d3sGAtxZ1u8L%ayHKF05)6s+Pks5aRuQiuVIWp2j?1@ilcNnx=wW zhVfv;STMH5f7C@;Dh@md-t)U)(c_E{c-Lk45%9+QJRA&E&5G z-y1)!D@sTK1GkkErI@FfQC^^*556k|di!I&9&k4RCZH@f_l*)ZxtW97-_0f)k#`z- zQ+&}b$|2WEj4v9jFKhZdvK61(&@jMg=^miI+W&}1AO%QRd3;XkBURRbE0$G8UlOHW z_EJlrxM-3z7Ag8&!uc5U2V9o-^w(FUA?q@f!v9fihk!$BIKEL~>K1hpI7!1kK9Gbi zX)YrMAMPTKhww3?eGpplz8D)}ID*pgUmz=BW2+zJ7vai>LmRQ+7J`7b{%{a_V-RXR z8K9;R)?60G&=4|!F*^R^^u`zZ<7x6S&r(R<04eQaqflG9i@%fu4j`^Ze5%ZdkIOJk z7|k)QCosk69JCOfVsOC|&ES|szT`1QS-`BMALAORCkkX7nv-N7vyCj5>Vh(|7Qbo) zXxq!~!u(gIy(p3XyX=BHUa^BMF4BSI>ylECg!3?EcvTUHk{=FxzKxvrv2Zs<8s(tD zpu8fd8h@-SKRJMPyHQ0k+4Yb!tz~V0 zr(~_z-M(n6dr*haoBK4>yTfh$k#a+6s8%Y0+fK50V}s`Oy!yfaC~B5f4ZUcmk~h$v`VHSy`Hok{(hx z2BM4!kw9q|V@Qld%Tjd$9b%y*L*m&9 zUSLvFmV$u|24vaHWu>b=`z%mOx)av}12H(U<&7f@(B4p>5CexAMX?sEbpCtKDav0qy+n`Fh4pFejXrLrpfiWGG@BwXsK_WWFMxgKHY@v@g znlOzI=$$$VgRWs=ZOm!j&9RYkUQkDtkw#+_f=1FF2l<>19}`_QP%TTbaQm-KdIIo3mP(k8Sm zIMdB%m2L%kSk;7q_A+MWM zK{@D{fcshuG!NxirQ)fi9GTlmeU8RV#~2$he$PJI3;k;v!HVL~G=lYnn*RuU{&`sv z2@t7-$|xEs33Q1i!+};il2m9o<2>B~o@YDq(Q{ry>*ue~#=GDd46wp8kk{NoM3}-V z??ac2@)pO_kfGnDW8sLcB?C%p9(UbBGbHQ|On+pMun$&}{@9@&xc99d)mB6Q;t^2j^ca%=B0Aru4d<%E*R* zZ^$$k)_@UM?d5r4rUeRP9n=^dp#))twH^jovtd+d6Eh2q%=A^Tz~LmOo1_&11DmO) z2t4=-gR+P6=W#d#G!Tb15FS1d=pi|fUNn#y)<96k9!LNKfylgr_5p^n?t|Z)u-BE@(HTZa5~m0Zin(;fmk}2Aogc2X4421cw7RVkrb412=$`d^g+* z+yJ)n$w>eiLm{mBxsgC2Ec3ZhE|&-LaUvhVL`uZE9cQ>G1oh4hU^1T;)o}AtNUo79 zPzY)pTL~1RRjQFnAuKJh^+q9S^QTh?>oHsyp^%$G85E*=crDrsgu&V-5_RJP zjKgFk5`}0c5+y>4f@p(_5uD`&lO+2pCV3Nli6HezFI;;t1Bgn&+Mqa|2@iL2-P*)P zR5{jWxLCW-2}I%6Mx7k|DMw+ZX?%VKF7Zj{GtB{KT;;H92Si7Jn7yEM(B(+;t}_eR zNRypi!j_p2oNcNvV{T^VeQ^(J?ffFAf?|9!M2-1$0F&%l=2>PgJvR#_W`CLK#*z#I z#@haC`2{7TV%lF+WbRmV`8k3<`%Ai|v*pXz@O#qvoT2C&5DM5VbSFYuZ;%NjK-6Bx zcQ476ZM3x`{G}cBNTcGU9aT2PF*^#I;@y|bKh8J87%yF>9&Y(M)9mzvs}dTOQasDr zckqF{SPcz^svITz`bAkdXRzuWw|WO3vfVe*IR6!W^P5AzDM(V=ASBNrWSkItXwm%e zn-Bh{aMa}D-xo(sF8a*}zxxXu#a;Rz!_nmL|Gqey{Jr0N|Hp#BjpzstuM)58Wp8A< z*InXuzwBk{qkI|(+5d8;izbd$T=(kbhJRbGd-bxCdk-R>kb`%Pw|I z?2cvWX3byeie!slP2BW5@+*mv?!PreX7^Y&NtLOIH1D-(Y^%BET32=~xFwF^ADxDy zf6DbC4#l(A*n{St-#g%U^dHmN>!N!COUshN8HSSSJYti;J$P={Labomiv8y=?Xh@RdBRs+COaPvSw2*k3-h%aH zC&Zx^Z0w)#^i50Fs_JamTeK;RJJ2{FiNy)5QhSX9eXkSOJ}u zvgQY|xMu7L(W(-g$lT(EO6-~c#>q;AFoJyzTMr$(3NMi6aoZF7cbGo#A+QnkFDI}y z&@{d|Yx}=AkHOKc*rq5pUX*W-S-TjV*Ph)Of#|i)>`r#4xV;N&s*eYvh0%>Q4}Q~y zUF6ZA_GKLRZ_kL+-PwoX(d6KV`D~O7>4C4*!CH7mjZ4q(w$6@#bh+n- zIm(MiG@Pf~qif06eVUQ`8Eb9VNZy6?<=G$)%kVXKrO( zDx7}~CF>e%?2^WDBzR7W_Wjv7m+aOC$~q~Q^=C=qNPn=;Tv25JYs)5zF#}jF$cvQ& zSeNp|g&O*x9vaZ0L=h5K1~8KuV&Onm$XbcZ1KBV(T--8U4h;C|Ei$ zpvaDZmm`dWP-ljCd=N{CZK}NF)hFt4-uE#lev* zCwT;!BoL9-niFm*ELBH{gi)*xP?$H0^}uJvD2d+PqwoxX>f&DvOd2-Uz|dnvNz^_b z%oxqyW|;0xQ?OTdHu&8XR$ZDVFo<<|&PSS2L&uRo4z|97Enu*n_TR~lqw&Y5G2B%b z>uzH?bWf6;5?IY2Tqj2hA3eo(s+jopHmN$V-NkZIrOqUlB0AsAJV~gh(Ll?Q?Um$( zcMx6Z>8NA=>AYh#r)fGmqKy zpLL+}JMU**(T|wL7(-o=znHbGs>}r@>%c^|>;R}&Wd|tli8wKbP0}zR;hWF!@PQlx zKG*JLMFe-&T$cZLK}rxv87bN2FYy8U_tDv`{eLG$dM{;zaD!MXA#4itg8w=ZNAaXf zU+iBBiF-y|T?)S2Byt{rO4%v~JiunNmEzL}Sl#q&GId$DL-*;lV~7i2UOnAU8|P<4 z)-u+q1`@eXH#ntmzmv{87~D25?PMJ4h!lHFaCPxA)`i`%dO6J6t>VH8Sj7F7GrxR^ z0tyV8#~bZQ5{p)`G;w?dOSB7pyqs0XEaRD?Y$WBZU>)(fdj%BX9pW{W2w#;c&rwu)O;fhA z)p~5|MN@-rS$5r1EIF4NU^7a)Kr4rsHhiwvHQyiC23LCQzCmGoDM5BtTzHDzQBHOQ zQpFo>rw4C;n%%4M-7ku(&$7+QzcFYoPFkIu&In>R)MJX*o@31#gy+cvWp0nj;cF&0 zIHU|JmcTEtgDkMxz~4Vvu-5aeB1=Ne5KJ6*!&MZ(9I%m93d_Nc3)D4omTY7d!g9t? z&UobPz-3Byi}=Sz*3b>oWH=#92F4kYzKK2Bs%$gZo5|u0(LG-j^dFkXhQ}J}Miw~4 zQ?_Ilm8=cmKW}2A0er{{tatUY1+eLp#ak#)y0z<1ZWC(vlNZ4;2fWHX5!rK^xA3kHrJ^Iy z_1MkVVJwew+9IdPW~iK&;-$@OZ5T?i*PF#FqQJ;4tV&o8R*X1mjGVPwSgWucFXdz+ z=i4pPM9SD|8P3j-;jCGP^Q^6GN_An!U_wHo)6UC|HrIKtg6=_Y&9Dte2Ot293s!IO$zX z5T3{arm>qQ#LKKXV14j1y9b@>{)*J)FTaAGmO`!|;$CI3q<%79Wev!D_zw?n%&ySz z$V`*H*pH^+LM3^b7<}M0wwnDt2b=u{1pi#I_6&6TI{$+#;CnlEd)weIyz&%b@ z#@WwGi5f>({}{}Bq+DUVAeJ0q*_BCnL*cngADBWNw_V2}>K=kr{X*1!8=j+MV(EL* z>fQOCTtA(74+j2uQRjWOTKxVFOx6F$Xoej8^JoM{^RyUv7>mQd%ZOfeo_ZY$F52T0 z-@lJx_6y$h0i3d|pZMx1dm-`~GCli(k9^4HvdFb>$Vl~Lu+Sqn%81x}oK=fmM#Go%@dC1ld5ltQbv z3$hoK66tjsbo=*+>env#%UHABAG9I0hhxfd^OZ`|>C_4(d91jMB*;h`Tx~)-uo(7# zAb$CT)#dMeAZq=Cy%jj}>Fac5^x(GQqjiKvg*^x0p4!agi!#z!WZV-x*dn zii|q=4#knPu+rw9Wu8doFc9a@z+HVkfOpQaoET*XHX)~hb`EVOiF)T)qtWD`Y!@s2 zpuGXo_Dzz}2(?Fp!EmvGjy#ADNpE=0P~L~}JTJ3kAvjP~AzdBdAVZDXqAw(Q6LIJq zO9jt=dG4=Q`nA81YHYw4a;3lN3yGM2e8FnepuUrf_Hjb}W`@_@a0oC&()1*p?Q+Qe zk`2V$BjWxqS!-5H9QcwAz$(A`dDx<8z57=Z=FG1!yT^jhe8nDuxx3o z$1mc+(#03W_HWte>_KtzJ61t#{tmd5;XYW#HoC+{G0%g<+hiBwNCWigzTorURFmswWM-u-aoWIJ$ZXlf4IdoXXx9>Y16QaDoT$P|jf zAfwoRG5s>SvP3+48Q#w|!g~cee6bjK1;o5q?7qVKAushOR#n1{`V(BFl!1#_2=0WR zB;2(>fm~h_-~I&O`DNGkNK5!x@ZaLzB-eOM#b`~rpgjfnb{Rj;w_J&4>QVtu$3!3d>sx$Z%_W_U3# z-r!?VoU^D)2O(WxfoyQ{HK9m{Xg-e34Hif9Sz7nahfqR7#2o}cTo;PF5i6pY6g60z z8q5A7R;HvVip5K;$HYz#uP8>w@x)}ssb#i!Yf2+;X&kTL>Cj8^&{-tEXqyd=AMLut4bn2=SYT_j7(%j03=_@D~qA;4PgCwjov#v2_U?3o@}i zfj4umr^L!gyqdrp$H+%Wl*!k$9IqdDV4FNU5=kR{V;gn2az(j^WO#xklwGRycMOKAC@YBzYK7B3eOx#I|-LY%M5 zU%-9i;F@~86qW^ll3@h*uusbQtR> zSqmlac39~fDLo>TUc{{Q-IN|vn$E5C^OT-Q>5!E4?2MOmF9}W6t%N^4Ya()*^GC0n z-%py`^Q)HLXN2B@cftJjXu+NTzt3;^JYIuVPpu996%nzHQ+%4-H)`017pW8tCN=FO z?QX;Cpy+pP_))v4%6RuCneqEge7|2gy1Y&$q3{ZtC8{8>F~d++UBvmed?w2jquTLq z@#ilXK5}H>>@5^`H}OV0UU*$%57DAMZ_m1kd)xCWtVi&f_Ixr!bYpv7G1%y4FeIBQ zKI@2A4!#t{o%jUAe4Y6b#D3_^H{K$Js`WG$ljoS#dki262<$9+;K_b4==8X+k;DkrY8ERy7i+lPr*MO?lpBUI(0JxNeP8 zteSzlf;Y$&lX~z9QC3m0v~6z@A#HU4Wu75o zQ%~*-lr|JeYT2MZs9vquuqHe;<6hZTy_vsF#Ph|CYJW&oo%L5{CTb)@5^oz zEpCNM{a6gVm1p2H{Z`&Tyx6H*`5-o5wCc~h+T4tD^XRYW&pQz3pB%u`@cDHBUnrF! zt*{l(YTigJ0ag!$?Ke&EL3|*3Ib;wN?p9Geh&RVB_IHE053z*7JU_0LH;T-DGVaM& zGjTBA1vg0c5IzPTuGK?;jgQ6YA+oJ&L-=DzTssu7j)_Y{fzB?XegVcK1yPEK8pgB4 z+XejD@UhGqcD+c78E%WD=f&CKyoM@|3no%vrH-)W(j4*52;Nm6m-I2T|yEFLfNIo!%U@<(ruXOq!llTDi`LzjraLPnzD-c9mzZ!8C4*07< zzc-n0uUNJk_s3!l8bw!oxi=QAMNZ^50ZgZfy!Bs$d3++UyH$LOLcmYPB;J@FZ4s}G z=WG8?odWIta63Q8ipBA%nBHTe${oBJ-csUu1|7+hk12tgVFH(kDR=Ok+S`h)M`DzD zzOh)Ew{YZ2TYkMAg?wFGEDqhlyGJX-T8GtH^-ewqO>DRmQumlRaVHn}Or6H*h{F15 z-0N1W2HGI@X>*NyMVZDr^2+QclW#LZhR--^CxErza~PJ_MkLSV#gS{tk911BI}^-&ySO-$ zPxsue{QP({it?~9n>GvAM{Xy1MdEX(mHNyq-px9}F3)T^h!^FVEs~$dM0@~}=a`rk z;B+EV1SIEeDdKeABee(u=$J5ycsf3Vipu7lL>}PMc>yQ(Z~TA@osQ#YQZ8eMf3^hJ zbhfP9XEyA?W8(hVyjHH7Ix0$)7*%qklKOK8(idX`#GRi~fEQ-NAUPIHp2Ih>^3rxx zek&vNoLunuy}Tl8Seh4Ing=wKv#hMuSvD@R=J8)Vi$5{^xJ()eF2-K!{hx?>^TCbB zKH1|a#N~GBl#DdiVwZ_XrARE8&&PVseo(f~nGXcJ4|Ph8hSkACP*$CO_wkY3{797C z$E#Lc`4LLNIWPsb70lg2Eaq{TbOS*@xq1O_&VM{1S}s7r%O~uDkx-#17*SdRffAz7tnAgoj^sWV{6(1FRm=Y#55L_@8>hv-D2(i zye{8+SRB5edsFP{7}Z-?@Ed+(KcIMa2O}4A#>zv_ljor!v?>`p_(hvV6_-Fbw-=q4 z@L@NHm5_9+Lo4Uv{Tg`ga6626K$jLId3-U&xZ8P@k#aAa>S-^oEWzK%x%z_Gyp&fd z51XL0T@STOTT$ni@_OM}PRfGq5v=n7gmdJ!O<1Iz6w{XRQK03|mhl=8L&ouqGS#!3 zpG4}V<&x~9S8(!+9bF+A=-LW?lakNm)gzmrv&pM5oMxV~5`Wg`Q!#!O?*^gy>MGtm zJByY)I9W-aW-1IHn$jvs>W~ri3s8k^U}!Q(*44a=0!`*QtugOeE%ni{)x1C|5)7fO zy6J|{&18Y0TE5_uls>Ym$uj|7%?D#mn&#q!kow5GhBx_ZFq76ueYA0n)JGTA@NSu8 z<`+jYEr92Tj^O#B$V_!sMVUmh`7>hhgM2it)zxY0Ll5#?EXnnU_)1DtYy5Q&@sUW3 ze3-wc#z&9i()f-%4B7O#`2AttSHAEEJra5~ElcTd6vbkF(ptVMG-<9!Ih{1B_bBX) zGPBnEF=>I%drZ#LrpNe*RMO$JIq3)bG5hL{6b{JXuNnM1l zle#uQ$!0dd85{Uv9PjM>Ebqwf3a)yVYmD6`9()caS**D99HzgXsQo`Mk`*{~@+QThv{+E^aQ#`b zp?G!^FtbX$w}~e*Gk9(jU&vA{v4kC)UjCSLUvx+;&3}=1C?f)8fshDnNFu7jW{~*Z zV!&pe&LQ~j+FUC5YS@wsg3pp%7sz8N_4PFpW!c6?Dayomn|T&nAX2vQJJ<~Iz!vW9 zbpCyqGx4x^VWZz^#81w4$P~Q!g%oF*lyWk~T_y$ZETW9ZP7%Ls;a&Lo_eF=T@PIWF z*S7M?JtZ(azA zr-Gs>1nWl1j{CRqo}k^wUXs-6ehI5qoacE7OmR$fd8usPA>?%l0|Y%60%SGdqz14O zBzlw$lug&{bgsl*%k8`gnz?g3aE>l)=V{>`b(DcG-ro*4Vf|ockf-bXS0;>C`I4x; zM{@O&H`yo>i{ zyo8JPdw6%(0KZ;n#CY{_o}0wFJs_Z6?~Cl$Vg9}PzPPjp{@j~H{v9t6C+TZGf071)1{(@>ENI%3JmZe>Cbmo+_qM zHrmUBQCF?Vk9+xM7LR!y|r$A|I_XT)Rsc(QxJuP`&n)TJ{+d-m~jl(XS2 z7}jIOiMMz?eB$;)R@W5m_QQkAF<%>bnFy;$yzw!t z7wpx1%=6i;;-*h{R@0?&6CeWS)lo%!gafGANMo)&B6P!}_P|ueSqUt-{uBNpYjurw zwWYBO$!c5(#bOXU7>Z%_iWhPGBzEFEgU^ihqKOR6ofZh&8AAq!wq6$hDf&n2Fk6!Z>im?HTOv zWjoN3?PvHM_E7cEP*tc5K>hlmVv_+U@MtKb&z26AC|(UUhK4FpvH5J+P*o8dwD|oj zzom^eRLb&$;AyC^mS6rpfAV3gJ%X&$lr=Q^xALhlDS zMWZixGl;=SU+}KDQ-pO1mIkyrTk3TBIC%66{sDudYQuTRhQ8v2`rxcQ#oDURUHAn0 zVo8Hjwai$s1$-Cdd4nSX_rRI4qD%rVax-HsCAd`yI?QTppoBP;0JD@C+bO}R5@^fK zc#RS?l|Z+hjXjj0s{{ybmT$aCDHc?$6|l0Vgm_g1%LHbeqJ&tLKx=2?A|+VuV$BB> zKnqH};(0?%|C+xF?BssKx3j(C;x{}abspTR#yoW{J4LP%$;e@z<)X?3NQo|D+6BJ9 zS_`>cr^gK7T%(q zl*1M??BGvu)MJtK6R%LQ)Gm-mHKbjD1IkLze}7F{uDAXy_57Tl z`8-r}UX@OrCRbq!%@r4~@*T>jRG-!b*aMV4{QB@Iz48msy7i%A>uL0?LfR%>VLOq$ zGP=l)s+Wf6*iq$x`gLoV1L_Am3OHYH70rLe-`l7v&i~3AVmXlU8+RaVQBR?07_X{;5I?hDV&+MpjseNQek#(5D;7>Q#4Y-lX%_AZ(5EHI>oeb&}!m(sSCAta3}QLtc)-v^waX zpft=#XY|kNHQJQ@^ zKpxwNAqZb)L#LL72_NLtCPWa{pAa6mR$k1gsnsG|mGA+5p)`rsh9q0YMbe|05 zPyS>)vq7c>`IAMomI*<%Gg{lqN`ez(GZ2kf??=_17+~J&||4SgoBKNAqI9bNCBYp0C85SZx@Vgy&+l zm#{#5I8K{}^Uy@5Z%fcRP#(V;LQ@ekeGwympx< zZ;*T4WJHo{Ml;r^z3)*e+A6G&ucc^>@oAW<^=9LP3sbci#@{?FR;6hzGFPG`y;WPG1FCKN|C?!-jE{77V)#zMme79Jbu4NFO zB$bL6(zRNx{u9JmRt`jorWG|0h_O>ejYQJ^idsEgS!)VX9$wYKr{usabsQkK%MCEv181%r1c! zzNnxoAp!iG9IL3vtE{EP?)?$s2s{Fj0{EjVYlHZ+7sbBHnqS+hIm~(y^#vBmIe|Ci z5>sxXd1k@1VaDRUnC}!A0W!9pV(E6QgkouS>|=_h+OZ!fM&^aA_dCTB?bz}+%f{AI zjI4@yR{#xeEsY|!n_?j_2gC9{35%VlSg48LC>HA4s(pyHvYY>aVo7%FONupAv3zDc z{1&3M?aa3*mTAYnp_u9^y7mjjLJcn7k61;!^ z`}aw{h2+59&Jrlxz7zCH+k%hezs&9Yn#bgK}e+>!0T-I=L==#pgs z24e|nS$xM^Vv%2~m5SO@uoD1MH_BdPp0CAWzg8D+)j#~25w#bR%-C~Kbf}^=-Qo(K2wADhGYSIy1s-uc)LXCecKCh`ggGpFaOY0G?!@jJg)kl6>ZEY>` zgSEBkHREXR+|X%g)vXv=$Ga}D!c{sQ0kdwD56IT$<5d6W+1ecP8jh-?)lKS&&e>+I zt;xl6b+m?IIU$?jhdSCKoYt9{qgBWLy!G8?eP0TFGa71r*g&*gMVSI{R{IZ2hF{uVc1;QbxhMc2se}TXqy&P$IQgi?AcMRUleZbG3;;EG)?sH)s?M zslQS!Hsxv+GSn^_(4wp3%+};v_VejnjrQAMKWDf}!Rz+TmAuBsNV>gK-tp3D- z7Fwsc6YoP*&|eV%EggAZRA~uV4~k_iwVUuc+ET0EbK9?mpBV}AFB=#-=_))s9zS_X zwqx^qZIDx2zW8hOE<`w${1kA)L78Pc)*P1E-Q^!mqWgG94z~eAtT`WGt%qC?v0PiG8vDy+);5l-nAqP+8=Z0D-0L7K9I}|~=di}eHj+s&$UN;tm)2UB zt}5=S=Y<+EPVI+4sbegAn@j;R7S%f|#`s#61Fabsw?}oA!-SoGeFKTS_tG)H~w)wy!ek{Uzo9+ zIG*QMch*uO(2(nd$mp!KuN=S;aC*`&#)G%ty?CI~8;4Llp4d*nGs6Kfzq8hye|S)I z>ZYaf_YR7aowa2!`X+VJhRHkL|Lm+yvEmWrr+i<$*i~y^{)S*hY`1V=qq=Ehv7A5B zO`D6G=6$+LYx9Hd(%Ov3*D8}Q-l6_vvUEhLo9{K{bhOIX>UTQ7RW9^7wt>m0IHeZr zgmsD@x1&l9AF-oK4)3?4D7hO)t@5?1Aox@H5Ry-djy<&6Rh68z_r@SeNy$PLTI6b} z&xd+wgD{AzJ+wD~Z)z;DSn$%01!3xCkURn*$0$9$_9cqE9d&Y@(dTF!6v{OiL z4e70Q143Ttt<|iw;j1?ONCU6^I$$$k$x@ihkpzl|)Zh4(_^G$np!LSD+JInal=vH< zU$wywT!N0`SyU1ZL_7ybb!A1*MewFvlVjES2_%QZwO@?sqqT==8lnX8YM=0lO6sdM z0dlt70)1a1ruT#F*e*Q%v=qet(NFV=j{UUM>k7R5?+U!~?+UzHrohaM19a6^K8~!x zRMQdRp@L|EowNQGO7ti@svqAgy|}Yvg%+Udaq+p{H-GgXhsR)jGz? zjFnr-euR44F-Xhx#Ul$M6jIOgNpxlE+CKw?`M!;`^MOy>~qa_Bhp#K?hHVd79NgS-k$3N*iR>D5w2 zB4m+T=199&V#&GRvbnEyLas|5T_}~y(n5`1Ni)VtW&CX+<_lL{!xG1j z!?xvh@~uF8i5jJZk~&^%9zBtq2a*B@jo0dzhs6MkTCV7HP`R=cq{_0?9Bn)(orN|} zjn|AWSIG{5WK&*wKh}p3$=Qx*&t`Hgv5>NWoQ2nTVm#7$4qNnB! zi+e@xR4fs~tGL68^wgSM7x#q4dxzC-A5U9tPI!7axSDxhEi(YG7<8xB68iDsJGB?9 z;_n{lWZZ(7zrdrA>JKddR4>YsFk+sZtXU`jpr;Q)@0Bp9w2Zh9`v# zw1%^^I!)GX!kF>bkm(cYbr_d6BJdo==vW}m7Zg$WMfwH98}0*R8N!}t#6z>R^c0C4 z5V~iwJfmnW89cG#&@Ama5bj+8jgH{H5dho2aY+0g(E7PLpyTpkC{Mm9D3bL3co9V2 zG4WNARqf zTCS_P9M5Lx%zW|69Iav4r2jHUYf!I@R|YJ|p+TUZ9Ig&F3&M3Jz38MK<+4x%8_@(iMbNZ$SEZ^kv0#@ zmuE!5JUFi(6pzf)>LxCiMn0^%_bfxxb3~k)r)81|Mz0{%-1D)FctbRuj~$1;qW^p? zGkHIJ$*?LhsWJqE0&AO9V&!}w;06GhI5JtAAK1(k$L`ZI z%k3r7AqinqFWwVbpw-|<4~ixWFpTd+U;)@;mw0%Amce%)60a=4sNNQp76Qh%qSrz# z3(r^3&M^yMB@*?iGXm@!{I6i7#J9vYOpCVJRTI6?$^>1`??Y(nyli;z%_!!+VH^Fu%p!= zXe98zdU9O};Rz_BQmkZnSh*`sHY4XkfaLyM;JTEL?RG*ya$QLdqdTIxe81#xxEJ@H zYxD0xh5Dn+0CX8Ci2!7PVY)5RD#FiCgJPu`_2xyeycN6`L0M=u zEft&rs)Q^CaL)sr8fp#hz~6pQ<#wVkAz)PO3lu{QB`i9*B%>_9h(akqU9@WO9GDH{ zNq?jR0@>w6s^=xtlYwKfz+^6K=BTs&t2VL{-Trd8A|0N~_-Ii58V;Ty=sI?eWAnGD zXt%?);asr%1KP?Y@$!1@*5I(Gwae+^$W6L8*!OiUt2WCQfp1|{4+}1<7Yd5UdPWN{Ctj|pYan};Bh43r#gPR;%6Ry9>vc~ z_}PP>ckpu*KWFjt8-AjPc^nn+lZl@u_{kgQ$#M)pU@U&_#?J%zS&yF=@$)8r-p9|U z_&Gn!BYIrb5`+7%XrJjZ{l<74{qZw!OmOqBT7Jh48{qGARm^de{->7)RcPscrr%aD zVWgv6!ibT>Cypo>KV(|L?Gx(IFShwDc7;PC_2{doi3i*2?%;&BdOi*v3*R8Uf+*>t zr!%M6)lSdh(M_n7UwGQ<$vmbs5-IZA>mGRV3)<^9;gMN<8i?aa;;{uHewaQWdP2eY z@e_x~&E?`q2i+$ocF@nTc+u--y*~HUS4}^Dv!22etjLFm2wz7%v)qUgO_~gAG`zvE zx^+hltCu?>(JIlhqn?82BKmgJvxB=k>R)o!MC|FWr;6HL^~%gIx^&gEd6kw5_K~i7 z6`t8vEbpvmh?D*GWRcZPPr&I5Z+8r5U^hLUS8J+rOSX#gid;8(I#K7 z#SrmP`-YKWqqz<49Eyr*6_GPiDv+ow(u-;dU7^Tr*hN-NP~gdWYC+$`Q3 zgHC*V4-j)_FFaw>yLF+6;hr*f z^q8qbZXYvt)YR@GufLuL=`g#$-iq}QyZh^1V4B4a(A%(HB7cBBlJ{;J!dr!iNfW2l z?<2k+py%o#uExIsaK#v>XG5+4lGJM+Qa6sa^A ztT*RFjL_8haeS)vRNY9Z-?)B*k@XuCjL2=;G`DG^dIf~L2BPs0jDA@65S_K)!#k-- z+&5EC5^oRD)A@*QAyh_-xFS$L2+}QHyj@Sy2h<-lQZyP0)*sbMaZ=GxJ(G|AS5@i_ z8Y8X@)$8)HZHS&Sgyg8M1$sqZIHXKdOA7Rsd|c^RoZ_*79wmM)z~qe=al`a6Y=W3J zOs|7msB$Vl9frY7tS@Gd!^D3U&|UG(nvI$`WkP|4)k&hsD7~TRI~>I(50|7AGhrko z&)CtoP010jwF8@-9S+vK{gx1mr1Ggv#OZOmS4}B>@m~(D^S$=?(a-zM@_cc)Q_fy%i5M7d-~(S>ln=7=4l0GForKW{a;! z>kYIy#N{Le&~%1&FYYwilrN{trw^z%Xs&o{jGn{hiM)ICCL(Gq*mAxK=TrDTQ7~5T zi@PF36@KxLvDgk>$Oed_ar%J&)7F)TM^R+)ue%;OAmjv;pg_b`t~_C%~^Q*f)I66HgR=`7I$h;Dsay3pt&@ZH!)zp zqL_M!&8RYnao9sde7Kl;W82O7V#-t+Ier%9;=JIIv&e$K{7j7YZO4~uqdQupt9)Ef zb-Th})&QW4ktdc=LcHA_CzgUhe9 zuh}4LUd4oUcu*%kH-{3%Yapm!sF%U>2hN;J6VeVVN&3^C!ZJ^(K0X|JO81q%E(h?K zcmvGUs#Rx>okw?xBRC!c{_0@QJP_kiICLa=>cU&+!AFis%a6eVIblB8@P#kJaT*g{K9F*@_%IU9cz{iOq&#A}nJmS?SRdmL@NI4a#O^0P!C@OwOctNQ8XX)n zLoQ+$fmi>;A^G!X-n)pVC}*W7j!AK79;eOa2Y)&JE`LBj#|M@I8&)rd&z?8slT!ZN zlxYd%FSz>>8Y(UzMIAd9a9X^Cdg7IsapOVR;44$UBIUoB@_?m~zcyuE%HNoBqm(b2 za*t;qUozwruSM4!u5718&$4G(JkD>;CY7?uccy$?%HNyK{a$~-;mFQ%*a8{|T>HVO zP7C<$u52w^&vIGqPSpPhK#F)_Z{@E%ZW(!$pLqW=;P7RuwW*q;?Gx4@?HtQs05t}A2tN;%-{;b&=}_?t3C_B=TTiQo-TKjF9AX7zM213T%1ylxGi6Sw^RR9xM>CDiJM4QWo*=~q;#=JjTSnm={}d! z>-9Mu9=}Jo`nAPs`+Tr+C2YHd8&=XtWhq~4p}xKRg>EA)bkEbnA>IFs8Uu3o6%{Xw z+&H9??h_S}l1xz3ync@}+pfD@SU@m_KxdG&j)jXt%?6Ebf zCeuiB>epfyjbZC!Rn$w=su~ZU0!NrOol?a*b%HrxW7kl+T8DECmePG`SvF_DVR8BN zEUPPEce-%6fQdE<)xfEGL&LOeukO-ZcDruzc`QzAV7;0do$NHRL2Y%#Q`OX6*=P)( zJJnF~ZJX2-w|lm?An2d22i@jUuR$$|!r5?TGdI>C^tbSZ8X74YRSOTR!b)RW19cWn z7)-Pz@pvm&t))A9Y*SO)_1d~7*p7q60be^fzLv&_W;Ms;_wrgw#XHRETCiRVAE`xF zvJ1`@Ni#b4eqOyj0-k*hK$J+Y_eJ(!v|GJLPRVT?Tt`Xb1r=~x4-Ve5jvh$bqjqVR zyzk|tI(ihF8$5N?KW@Kj%k_prg~pU92lz-GRzWXHvuNTaOi9Kjb-#}JzSe+zcU<9Ao0PDQYDO->%8S)!a* z53hh$cWlNT?{#SK@MbhP)xIjl>$e0f&MYmJYImCw@)zk7nQfEiQCog8YUiz_G9IePS0#W&d*EAxF|CCQQB0>Bt zqJ4T3bpaKkGJ{7oQ4;uYaubacXVqWH;q~egE-NW@7kh#QzH@xKiJlba)qFnFL{p?) zK8M#BTx-nTzOBfDzu===DIhLHjE(S&<1yP{<1f`w(OFIArQ4{t_)2}moZ2Hh$O>*e z+zk4^b33f}wR*2<-f`P0UVNhtYAeOHLheOgzMVYclIm!?mg3gK;ZWE;!xQuu>fvwI z)+`3Nk{9bKfnmenapMk}D87ev4b_vIsb}mDz%%*ILQ)wv4Z52tpRaEN^IvL)GCv^_ zjLb7*CwSwsI^PVH$9IySuHb*NMT;Xic_*dt=`9qWI^S0qDk%%={VWSJ`(_Nes%Aw4 yES9}3bi24_f>J+jY{46@pCzvhR<3i#E*geU^Ud*hmge_(L*ddJhbnhblk$JFev(1} diff --git a/site/decodal-site/src/wasm/decodal_wasm_bg.wasm.d.ts b/site/decodal-site/src/wasm/decodal_wasm_bg.wasm.d.ts index 4f894cc..7af5cbb 100644 --- a/site/decodal-site/src/wasm/decodal_wasm_bg.wasm.d.ts +++ b/site/decodal-site/src/wasm/decodal_wasm_bg.wasm.d.ts @@ -3,6 +3,7 @@ export const memory: WebAssembly.Memory; export const evaluate: (a: number, b: number) => [number, number]; export const evaluateProject: (a: number, b: number, c: number, d: number) => [number, number]; +export const tokenizeSource: (a: number, b: number) => [number, number]; export const __wbindgen_externrefs: WebAssembly.Table; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;