From 4f66907d08a8ed18b41e70188b112d7c915aa0bc Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Tue, 14 Dec 2021 14:24:02 +0100 Subject: [PATCH] Add Code Block syntax highlighting --- Cargo.lock | 196 ++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 + src/eval/mod.rs | 111 ++++++++++++++++++++-- src/geom/paint.rs | 17 +++- src/library/deco.rs | 37 +++++++- src/syntax/highlight.rs | 69 ++++++++++++++ tests/ref/markup/raw.png | Bin 10127 -> 22260 bytes 7 files changed, 422 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 706cd4818..74035c539 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + [[package]] name = "arrayref" version = "0.3.6" @@ -44,6 +53,30 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -211,6 +244,16 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +[[package]] +name = "fancy-regex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf" +dependencies = [ + "bit-set", + "regex", +] + [[package]] name = "filedescriptor" version = "0.8.2" @@ -240,6 +283,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "fxhash" version = "0.2.1" @@ -260,6 +309,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + [[package]] name = "iai" version = "0.1.1" @@ -284,6 +339,16 @@ dependencies = [ "png 0.16.8", ] +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itertools" version = "0.10.3" @@ -299,6 +364,12 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + [[package]] name = "jpeg-decoder" version = "0.1.22" @@ -314,12 +385,33 @@ dependencies = [ "arrayvec 0.7.2", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9" +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + [[package]] name = "log" version = "0.4.14" @@ -335,6 +427,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + [[package]] name = "memmap2" version = "0.5.2" @@ -404,6 +502,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_threads" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.9.0" @@ -417,7 +524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36d760a6f2ac90811cba1006a298e8a7e5ce2c922bb5dc7f7000911a4a6b60f4" dependencies = [ "bitflags", - "itoa", + "itoa 0.4.8", "ryu", ] @@ -435,6 +542,20 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "plist" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" +dependencies = [ + "base64", + "indexmap", + "line-wrap", + "serde", + "time", + "xml-rs", +] + [[package]] name = "png" version = "0.16.8" @@ -549,6 +670,23 @@ dependencies = [ "redox_syscall", ] +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + [[package]] name = "resvg" version = "0.20.0" @@ -614,6 +752,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + [[package]] name = "same-file" version = "1.0.6" @@ -643,6 +787,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +dependencies = [ + "itoa 1.0.1", + "ryu", + "serde", +] + [[package]] name = "simplecss" version = "0.2.1" @@ -696,6 +851,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syntect" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b20815bbe80ee0be06e6957450a841185fcf690fe0178f14d77a05ce2caa031" +dependencies = [ + "bincode", + "bitflags", + "fancy-regex", + "flate2", + "fnv", + "lazy_static", + "lazycell", + "plist", + "regex-syntax", + "serde", + "serde_derive", + "serde_json", + "walkdir", +] + [[package]] name = "termcolor" version = "1.1.2" @@ -725,6 +901,17 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" +dependencies = [ + "itoa 1.0.1", + "libc", + "num_threads", +] + [[package]] name = "tiny-skia" version = "0.6.2" @@ -771,6 +958,7 @@ dependencies = [ "same-file", "serde", "svg2pdf", + "syntect", "tiny-skia", "ttf-parser", "typst-macros", @@ -913,6 +1101,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + [[package]] name = "xmlparser" version = "0.13.3" diff --git a/Cargo.toml b/Cargo.toml index bfeeb060d..2da2b02fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,9 @@ xi-unicode = "0.3" image = { version = "0.23", default-features = false, features = ["png", "jpeg"] } usvg = { version = "0.20", default-features = false } +# External implementation of user-facing features +syntect = { version = "4.6", default-features = false, features = ["dump-load", "parsing", "regex-fancy", "assets"] } + # PDF export miniz_oxide = "0.4" pdf-writer = "0.4" diff --git a/src/eval/mod.rs b/src/eval/mod.rs index c16c22083..2759e0d5a 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -30,21 +30,36 @@ use std::collections::HashMap; use std::io; use std::mem; use std::path::PathBuf; +use std::sync::Mutex; + +use once_cell::sync::Lazy; +use syntect::easy::HighlightLines; +use syntect::highlighting::{FontStyle, Highlighter, Style as SynStyle, Theme, ThemeSet}; +use syntect::parsing::SyntaxSet; use unicode_segmentation::UnicodeSegmentation; use crate::diag::{At, Error, StrResult, Trace, Tracepoint, TypResult}; -use crate::geom::{Angle, Fractional, Length, Relative}; +use crate::geom::{Angle, Fractional, Length, Paint, Relative, RgbaColor}; use crate::image::ImageStore; use crate::layout::RootNode; -use crate::library::{self, TextNode}; +use crate::library::{self, Decoration, TextNode}; use crate::loading::Loader; +use crate::parse; use crate::source::{SourceId, SourceStore}; +use crate::syntax; use crate::syntax::ast::*; -use crate::syntax::{Span, Spanned}; +use crate::syntax::{RedNode, Span, Spanned}; use crate::util::{EcoString, RefMutExt}; use crate::Context; +static THEME: Lazy> = Lazy::new(|| { + Mutex::new(ThemeSet::load_defaults().themes.remove("InspiredGitHub").unwrap()) +}); + +static SYNTAXES: Lazy> = + Lazy::new(|| Mutex::new(SyntaxSet::load_defaults_newlines())); + /// An evaluated module, ready for importing or conversion to a root layout /// tree. #[derive(Debug, Default, Clone)] @@ -209,15 +224,99 @@ impl Eval for RawNode { type Output = Node; fn eval(&self, _: &mut EvalContext) -> TypResult { - let text = Node::Text(self.text.clone()).monospaced(); + let code = self.highlighted(); Ok(if self.block { - Node::Block(text.into_block()) + Node::Block(code.into_block()) } else { - text + code }) } } +impl RawNode { + /// Styled node for a code block, with optional syntax highlighting. + pub fn highlighted(&self) -> Node { + let mut sequence: Vec> = vec![]; + let syntaxes = SYNTAXES.lock().unwrap(); + + let syntax = if let Some(syntax) = self + .lang + .as_ref() + .and_then(|token| syntaxes.find_syntax_by_token(&token)) + { + Some(syntax) + } else if matches!( + self.lang.as_ref().map(|s| s.to_ascii_lowercase()).as_deref(), + Some("typ" | "typst") + ) { + None + } else { + return Node::Text(self.text.clone()).monospaced(); + }; + + let theme = THEME.lock().unwrap(); + let foreground = theme + .settings + .foreground + .map(RgbaColor::from) + .unwrap_or(RgbaColor::BLACK) + .into(); + + match syntax { + Some(syntax) => { + let mut highlighter = HighlightLines::new(syntax, &theme); + for (i, line) in self.text.lines().enumerate() { + if i != 0 { + sequence.push(Styled::bare(Node::Linebreak)); + } + + for (style, line) in highlighter.highlight(line, &syntaxes) { + sequence.push(Self::styled_line(style, line, foreground)); + } + } + } + None => { + let red_tree = + RedNode::from_root(parse::parse(&self.text), SourceId::from_raw(0)); + let highlighter = Highlighter::new(&theme); + + syntax::highlight_syntect( + red_tree.as_ref(), + &self.text, + &highlighter, + &mut |style, line| { + sequence.push(Self::styled_line(style, line, foreground)); + }, + ) + } + } + + Node::Sequence(sequence).monospaced() + } + + fn styled_line(style: SynStyle, line: &str, foreground: Paint) -> Styled { + let paint = style.foreground.into(); + let text_node = Node::Text(line.into()); + let mut style_map = StyleMap::new(); + + if paint != foreground { + style_map.set(TextNode::FILL, paint); + } + + if style.font_style.contains(FontStyle::BOLD) { + style_map.set(TextNode::STRONG, true); + } + if style.font_style.contains(FontStyle::ITALIC) { + style_map.set(TextNode::EMPH, true); + } + if style.font_style.contains(FontStyle::UNDERLINE) { + style_map.set(TextNode::LINES, vec![Decoration::underline()]); + } + + Styled::new(text_node, style_map) + } +} + impl Eval for MathNode { type Output = Node; diff --git a/src/geom/paint.rs b/src/geom/paint.rs index d906561ce..f86386562 100644 --- a/src/geom/paint.rs +++ b/src/geom/paint.rs @@ -1,6 +1,8 @@ use std::fmt::Display; use std::str::FromStr; +use syntect::highlighting::Color as SynColor; + use super::*; /// How a fill or stroke should be painted. @@ -34,9 +36,12 @@ impl Debug for Color { } } -impl From for Color { - fn from(rgba: RgbaColor) -> Self { - Self::Rgba(rgba) +impl From for Color +where + T: Into, +{ + fn from(rgba: T) -> Self { + Self::Rgba(rgba.into()) } } @@ -114,6 +119,12 @@ impl FromStr for RgbaColor { } } +impl From for RgbaColor { + fn from(color: SynColor) -> Self { + Self::new(color.r, color.b, color.g, color.a) + } +} + impl Debug for RgbaColor { fn fmt(&self, f: &mut Formatter) -> fmt::Result { if f.alternate() { diff --git a/src/library/deco.rs b/src/library/deco.rs index 3e91d1de1..5f27c8beb 100644 --- a/src/library/deco.rs +++ b/src/library/deco.rs @@ -38,6 +38,41 @@ pub struct Decoration { pub extent: Linear, } +impl Decoration { + /// Create a new underline with default settings. + pub const fn underline() -> Self { + Self { + line: DecoLine::Underline, + stroke: None, + thickness: None, + offset: None, + extent: Linear::zero(), + } + } + + /// Create a new strikethrough with default settings. + pub const fn strikethrough() -> Self { + Self { + line: DecoLine::Underline, + stroke: None, + thickness: None, + offset: None, + extent: Linear::zero(), + } + } + + /// Create a new overline with default settings. + pub const fn overline() -> Self { + Self { + line: DecoLine::Overline, + stroke: None, + thickness: None, + offset: None, + extent: Linear::zero(), + } + } +} + /// The kind of decorative line. #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub enum DecoLine { @@ -49,7 +84,7 @@ pub enum DecoLine { Overline, } -/// Differents kinds of decorative lines for text. +/// Different kinds of decorative lines for text. pub trait LineKind { const LINE: DecoLine; } diff --git a/src/syntax/highlight.rs b/src/syntax/highlight.rs index 9f7365a81..001b28b34 100644 --- a/src/syntax/highlight.rs +++ b/src/syntax/highlight.rs @@ -1,5 +1,8 @@ use std::ops::Range; +use syntect::highlighting::{Highlighter, Style}; +use syntect::parsing::Scope; + use super::{NodeKind, RedRef}; /// Provide highlighting categories for the children of a node that fall into a @@ -19,6 +22,45 @@ where } } +/// Provide syntect highlighting styles for the children of a node. +pub fn highlight_syntect( + node: RedRef, + text: &str, + highlighter: &Highlighter, + f: &mut F, +) where + F: FnMut(Style, &str), +{ + highlight_syntect_impl(node, text, vec![], highlighter, f) +} + +/// Recursive implementation for returning syntect styles. +fn highlight_syntect_impl( + node: RedRef, + text: &str, + scopes: Vec, + highlighter: &Highlighter, + f: &mut F, +) where + F: FnMut(Style, &str), +{ + if node.children().size_hint().0 == 0 { + f( + highlighter.style_for_stack(&scopes), + &text[node.span().to_range()], + ); + return; + } + + for child in node.children() { + let mut scopes = scopes.clone(); + if let Some(category) = Category::determine(child, node) { + scopes.push(Scope::new(category.tm_scope()).unwrap()) + } + highlight_syntect_impl(child, text, scopes, highlighter, f); + } +} + /// The syntax highlighting category of a node. #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub enum Category { @@ -186,6 +228,33 @@ impl Category { NodeKind::IncludeExpr => None, } } + + /// Return the TextMate grammar scope for the given highlighting category. + pub const fn tm_scope(&self) -> &'static str { + match self { + Self::Bracket => "punctuation.definition.typst", + Self::Punctuation => "punctuation.typst", + Self::Comment => "comment.typst", + Self::Strong => "markup.bold.typst", + Self::Emph => "markup.italic.typst", + Self::Raw => "markup.raw.typst", + Self::Math => "string.other.math.typst", + Self::Heading => "markup.heading.typst", + Self::List => "markup.list.typst", + Self::Shortcut => "punctuation.shortcut.typst", + Self::Escape => "constant.character.escape.content.typst", + Self::Keyword => "keyword.typst", + Self::Operator => "keyword.operator.typst", + Self::None => "constant.language.none.typst", + Self::Auto => "constant.language.auto.typst", + Self::Bool => "constant.language.boolean.typst", + Self::Number => "constant.numeric.typst", + Self::String => "string.quoted.double.typst", + Self::Function => "entity.name.function.typst", + Self::Variable => "variable.parameter.typst", + Self::Invalid => "invalid.typst", + } + } } #[cfg(test)] diff --git a/tests/ref/markup/raw.png b/tests/ref/markup/raw.png index 4effb303133e973ecb0db6cfe9a0beea75754811..ec39d3df138677e9d091b51b3a9f73d9b2a78e60 100644 GIT binary patch literal 22260 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 UpZl5p8uPI{J|XUN>A{cx2WdhL$p8QV literal 10127 zcma)?cQjn<_y5nRqnl{aTaf6Y_ZB4xA{adqqD7fRjXD@yT_j4P1wphS7`+UFh+aqU zy^G#|?)|O%U7!2?{_gtzUhDkxoVK3xtbO)=@4cUJU2QcILOMbK07xFIKhgsL5Doxf z3xaP?0E;w=j{tzn@bM!>eXoh_>32r@BRA;%0|s)Ouqm}3t!~CAe2QHp&jw4UTKEzk z9u$7#i+CMD&G+F|m(jTRz@WeC@yM@ZJx#u15p37a{tA74%FZ+h#Ovldxu&nRyY<`s z7UF|58J%}4Q^F@R??_Ijq*te0k$QLj3+UZbBXAJQzaC2KEJaWU5`g}r9`~2=t%Jr; z;0L~eZ+Bq7=g!pX&PcE?3CM1EcjlZFhX+l5lvKi6`iw8Nq>>Jd-rV4Mu8htiyUL~j ziP`a>54hVf;d1uuEp&#aYVDQ{>_`3xGoz-a-4rT5St+YPs=TM=bSC{*J8EP zM2?Tu)vJZFem)#1*0gRa^SO`u!47E`3H&_7D9}>E)zV3-m@Pw@sZ31EeKrV|)xerJ zN}(V1%a^5?56v?!uB>Cz-P=AWm+QeTi~q0+&Cf_pO|9=ai_Y)70T`Y%w&dfTk4&{B zrJp7VisV+ECqwl!l52Xw9XrP^v`k(X7Gqzd)nWcF-baR#3i?Ob&`PM9$NVR7_Dksv z*{E++^cS_lO0!ZaFHZO%xW~%5KU?R8uW;(K_1=KcE{o!=~$Z`pbCtlZ^!bbO2buH zWrLJCNAQ-4miSC{k>Mws5Ycsj;u1f8q@?@&@#9Cl`m8Yjnw8GDM9E|BEDJq7y+P`v zlNsncdB@_hO~MlgotG~c1V`kBg!Y5NSPyqY_^d%d!HD%k z4ymRir=dG=jFyYpxP_lp(X3m0EBO>IjIAfMDpaK4ALgWF&x($1s#&=_wyJsbvr5r9 zW>LlaMm00DUEp;tX4XlEa?J7Ucz7ozFG&r7x#}B2RV}u~sZvM2YFupV8abY%uw{$h z5k9Tk=vpQLo$3gGlWX12diU`?iBB+ejH09U$zpUmyAe};RXr=35nHlI4pwjH$O2q> zPu$23*H83?)b)8E^SFS?e-qCZFrrt!e*J3F^C3Py5fn$e7t)|`BQ^OTYEMPM=1ggg zhB3$RAyh?0UM;B8`uBnOC#@ckS9Wc~NqBdI1S_R}K(;Td43lTlL|3r;!orM)EW^uP zK|Kj}n404|X@+zmD%d2?tMBo>A(GI^?e3DEHb%U&dvx3U@(zcMs1Bg40J zQ1%3qnTT!Gxsid>zO$(b!6MiPQ=wam4s67%{TfC z2>T>s43At$Tw49mb(2$&<$? zY(OWQm(Ra1&|g7HDWA>SX}tQzM9hZds2e}P>;YD3d7hyL>h#h<95?)z@Ty>=9?s7q z==R7H(|G3rOUj9D;V;hIaB(+@VYztBO`F0*Ttd@w(p&%6RG zaa_G!84(hY`28#+_W7s9ZSY>|^{{%&yf$c?jR!S`8z-$g>sA-g)(0F{klIa4eK}%6 z=Po!q4c99zXMm`2_3dU#Pk3F_ECbr;T$n^G9$_Z&E>bEw@r%46srA{txL^E+WJ~kx zebBisQ-G=R1QxAg)pi*3#ye>&U(am4m6_coEcuOPAY(0-b#{t*u3vGE=SUL0y1`RA zzUv%0G`?4KPGwnC#SWaw%ZOLUICv7SYy^v?^i)Fog8Y7Y5i{K@umU>t*~Z*t&}I$v zp?FjuVxJQdQuAq>p;dwltF z!DkOV&+m*gesvGs@&1!StoJy2Lc4=S*6Sg9Y0k|S(Kj3kq%|-Gq6`Y2nC>?{PH_H( zwX)gRCGW#_dTeG{n7_Q>eo#==iJQJpf7C{keVN`&8#sB{?pL;TZMS_ptzE`1`ahMA zHPHel=Y<+p+SsK$57iC4(Eb(m7~Rd#T~MlcAC{5jHIc+XUY7Izh*`NUY1ng=5{X48{5P{0dqkaY*3#p3TIQjiV zt+n=a@hJJuw?$`1IdU3~t(%Cnn^{2ojjLhv4DKf_Aw)D%tT4RiilrTjR4zJ{s%R*L zPR%@-Mp_it@`EV7m~pudzbT$$GVMuV50pGhb^2{#09s?QJ@V1fGZHFL-}$GBncpO(_G# zRZEI%L|r>1gzUUKb+`+s=XM)o^7MJ9T5SfLt=1C*_WF>2Q#m+__w8{A{wBN&VJ1fO z54ZLo(o(6D&9`p(?fPJJ{6xkAOKJhdyHAJvrDsW#EN+au&IHWK9TxUyJQEq4`$>DB zEPU48LN)5A@G_k^RI~WWnZXmEk8ptBoEsZG74`}HnGzGZJIsy` zneJv$z;%mJl?zDUX?b`?LGr}xQ_;N;Umewc@c`^PQ^Q|~EAe|4a|?Dpj7N#-__S4+ znz>Wm3%cnAuUx~hmN4bdfpbXTaxt#?1=FXtvUD$q(R~wG4A^5O>Da$F5AjY{1v*$Gp%yrJUvN_%ROJzWUJ=sORv;0SU(*Wa#8pOA<1ucqVcagrl%rv z)FX;w(}l{XxSA$3Bq_n5Ok)R4wpKwdXP9h=4R-2~m1U5W4Ff3yR5+SVw~Fi1;H;9t z6P(0Pwud@LXG3a1Mn`JodD_@1TjeBEBP{r1W9&l`%YNU~CT9n0ewGKP{Qk7h1yp{^ zVTvX{Lfg)2Bm2t$IgC)#Wuv8TInrwk_zUW7?XG~dRjnU1QT%I%G+KG^} zN!Xcnnq3y|S$R4Ir1OtDOnsDZ z@~k3}VQijM`giA$X$|?W(0=cKkL`2m?{^XfVV2=rn7SA1G5Wiuw+P5!vo`L%yb!jI zjN1F-&Ui_ULk7F30P8$!f|>p&5!Ba@kj8Q&-e(3}w*ugSIgVv;9?RUh$b6Y9JndC< zTn58UyjA~3jCkJVtPl;tx!yy`zO$4^+hVRx3;Vp7|*52{>x`2UOF2xXmVfGmFTxI1Tc%pS%Xr_e-W5%g&^^ z5NF=hOR|}ps6xtGTqzWm<=zwA#R6*Jq@V|F>TfJ4&QkrbWk5vzollL5)fk7LgY;rS%E0_Q0teNK+#U9HJ~pW8q|%OxP=D4Mem~ z%C26f+dwal&N4*;;VRD=7Z5zrlH~2ppT`Uy!!8`&e%3UFK9eG;YQcz8g_laRh|ycT zC61fcZx2(Zhrctmgs2&-x`qiHaPS@@$Hb38_U&})_mNSd{ zbDy5*N;$A@67W0>-hVo~7JQj$_+dMll1+-zFh2oUymXy1h|=wo6KJ*eYk5X~>x3PJ zW`=$#d^62fjm}1|w#WO-v7_D--$3Dr4OrLILG#UWlj7=lE+6pYeEBZ8L2IX%6sAqT zdD)Xq?opWkf2kwJp=v68`P?$iyR&ggpjy|Rq2!DiG`hL%bExfo^vcNdR81Zmjoplk z*Yd^E6C6h)(ck!M*fCbA+UP}Am%9>?m-ZDigQ07*%&AUK{a!jylPf;^jm#x_Fv0fy4(bjlZI2 zjK#Ss65rHNGLe4OU&Boap5VQb8<;v}P`KJ)9S7=7x(;#s>lIPHEDa_fJR7S<9TKfr z(6atk@;6@n(|A}s@$tC@YVq;Z*sCd{rOswk&zcC(;Sucdx4iw5W1?>Y{+g0IPEovr zYvg#&cv|R+yNua%$<|u!1#~{ogbhz#>4zwKq;VYuA1_Zn87T`~&t(O+cA35ehoxgR z3j2|w&mf8g$4Z5rMpmXB6@;Q7ZTY)d`oV26Dv|V`wK#{G`rDGdR=nA(i6nNNZE$+8 z-}Syf*DvvS#<^M|laxBuH0?xif6V6_S~T{O_!r&0#=?B2>d(a%1hi_L;u9m%3Fld9#rX?oc~J znOW%|?bpROs!LdbGZ+0rvA#7$P8SQ5gNv5~*XEJZoZagiA?=eVHqrYoe#0H)dPnz@ z1mprfY99$9T&=E5C1nF)PCPf?SAB1*FsN)MOPRXhD{Qxp-}|1rQ_q%s+=FZ<0mt&- z&3dRdI3g1L=@gza#Co*?KNVgM`BDu=GfzKb&ADJ+#)TJNfZQSciCkD`R1f|k-5*;zZOqr2IRzE1zTEaVfdI7ALaF_h>VRX8pQv3qE_WT2IeiPQS2*LI4t&OcH_CkD$1gT7F!ycbydobt;()p)eqdNQ;vN4y zzQ}m*&l62yxbprC7i_OpySqKKm3J;E+WFtgB%bDdvWhRKKoKcvj9?DB@aDq|y_366 zn?zpW{s9#$%^&D7L6HXhDocZ9g)rfWGno|6PrnN zv&CEzdE?BGVbR*Ri%x*cDSlN0YE=udZ@G$ z$%>+`A?T4IoV#>#P;oTCGNM+EwXYGF7))SCmrq--NNY2DMP-svjwE4-|gR0 zw`T?Ny{+G`A;EBioEkRE5qoF^kX^wZs%U$Vqy4^yy#&QmY6Px)40_U7Z-T?VO9;u` zki{oslJVNJq@IFKGh*$%`T&1iIj96!LO<@HCPhCeJ5Zx3IKua0W}GQsrOJ`S%|!rP zJ2_b%3CH7sR7cocb;mN0L8hNBs}X=(jR}HcBn;%+zjNO=Cmr;A*G*-vdkKBcqj5n= zV5tc%@I!OBgl-&MFMR7og3(s)w<+;5{+RXmsXR^--o${wGwQBK?ip<_-NS(TMT}Kv z*;A_BZtR_Y_L+dyMmZ!H-vOUv>^>3B7-ka1Rx5ahXK>J9tL)0cb!ZItRNfx4w3h9c z5D__iWkkO5ho6F)+PO#dmGNCE%5?X~ttZ<-ZX@C2fNdz^RL$3g#JxsKd%c0|7Z_wF zU>L}&A;r>n8jXc(TjD6LL6m70`X8D%h~*=H%gD@z=1$OvMQGeQQecVXMy_p|Aaeaa zym;TqB6JSv8UAP_vs(H^1)bBLsj)V>dL0Y}*1EgJ0S?>B_OCUMm=vSy#^tmapa&E9Q*f{wCc@<@=b|HS%t_-97=8;PD35gK1y&rS4WszQio-0Bk=vKb+#{{zZ*6cx z_?rxIgtaj1#(!a(=_%?7M*r^rVl0_%$W>YryHmSu0x>EIz*qZl=5--VXy$?j#zqZJ z#_`ib0pIDbEfQ*;3QHqwsSn8juRH_1B17T8NC*;qDUDS6P@=iHq&u~VAfkTee(~wG z(l+9jT}vw^B{Hg{xHuStmn18z_K~`}SM%+E;vdrM!beBfFUq`@h0pJmy$V1P0R<_% zG<*6u>dcNMMcQ(MQoOv5O!f3De>4T&SF2@r^M$C!AZW}7_nu*X)$VjNz_;Fu@~Aqe zGOs)YtA`>eRBlwb49qDXU~_CHKw-d@J-3a z^;)*-&A^r{c0WdtMDp_)$ehasOHUngRlUk8z(*v=$wQZWoq!+~kCso9p5nG&5JTg8 z?b{;s=eMxV+X5D+-t)2_hzzHs&k?S4y~bf=sf*Rm&LRhd4z#P;;_iq{uH=LF-q@iL zj+G%HA-MP(3XRVyX982yFZqfDyDiB z$^Xn8QpSaY@ZZV=2OR6lMk!MF7WcF=J&{d+RYDXMYUnEP4a1UQ!Iw5PMeA`_TScTE zxZrk^$MtdcP=TAvy2Z-Nl7J+nIZEgA+KFfoYSCWHdwTt(NL zAj;j(m#_~~7((40?!e~7pg0dzPp4~<722e24cb4;4I7$go=A-|Ff%jXh!#c0?iQ&1 z=;*M;>TBbl`O(4J8d@S0E_DPh20hGM^8IZN0b{#R!t)Ey)S9SeO-D|I0S2}Ik zfPfO?7)hKPahZwuPv0K0a9IAP-BmF1w(5^M*dit)Bg>~`Vq&_c<|QF(GIk-wnC!x5 z=I8mM#o8ycb}_NDlD`5zx_)-b6lJEPFtOr8yZJ3%op_{v6`s3{`a+-NErqq`!!_M^ z_mBCh2^lXFlgdRITak*-7YbLQxQEX3sr+D z`5#_4)a|7n80TsN)ja|`m=v2D_f9Qw_9-Ug#K)Dt4gE>yghFvQ!}Tkzk^L$53g!Uu&VyHb84j6C@qs z%{f=~H7{A08Z1!lre~N4KsZ6D_Re{&TkCR@LH5SxyYvV^VMV=ZbhCsiFlXYrd*A@Q zC^h6CQ_5cCvMv6wyaG4E$HUSU!L*bd^L=xK&3blNn8r);P|$IBG4P;jgLn?j!uY+0 z_b(f}Z)8+H_#DtGfzZ&u76Z#I^a+MqV&R+IX96vEa9T%h3(F4G*sR+c5OnTh+KiQBv)@uZ%Kjjo3MOf&UfzgHuO9S8+tMI4Z6sh^{0U*k$=bKSH zL3OmXQNEtwy~wM?%D&;ebhx09SY=7XAJL4f5qs)+ox;2N*r02u(B*nwE6+9ADYuxI z(n)l5G)kVx-w^d@7bDgT>abMDa(9vrA72V*O8laDpLN?Y9lobqAsdR0yXW=$u{s?V zE%zHtaHbQ*ws>7GvBQ*?E+JYiW?|sie%v*Eor00^Dt%KU+P9iK4QJ2Zt@fbuXSql1 zcSGr}qgq4m_p_v`ZEMA>;Go-X5juR$`nlSDn%mJo^x*$KO#dS;!EpHN`=oV)0S_iMFe-lI)W5L)GiMsuitE}4#VzO&& z)}s2fuZ% zp#z9@NG(XO4%U3{1PWiqj)k4Jwcip`E}%&ulAhW#fu>~d4E**DJ3U5M52S@$wKMx! zYyZ|51AY~va9t|a0mM`?CGHl2bxRL@;JZoQEmoEP=wbfCYp&eTU?TPLZXpC>zM@B4 zp|wnTzj-)QkM(hK3&m7km0T6<6@J*pTgHm}!UCg1&nywcqm~+wn}Isf1U6B>fg0?I zv_pLaS+`Z>FOT$;Hwr&gFk}f|4M9bEMCKUm%uFO0sByygGESRA?0vE)OH#hipu%3- zarnuTb;|f|=7@v_R^XfBUxdwaX@3Z{#rc_J9(L#L#9ns@J&C&l8p+cRt!!O?NGq7Q z9j5t#(V7#wln$obQD^CP=Qi^yU%_t_tjiK zJvnlcbhptwlG=)ljuxe-&;kiZ_u)t)FJ_$Yx!p|gQ9Qb}*@#Tx=Gxig9(OJ;B#K~-0o+Hg zNysikC}{qwmW_O0{XIAarUEee4fn*z+IfPP(!B1t zEsK1m`%O7JbTSPZ4_?tGMTmHU+aGcvdcUi%Nn|h*viqK9rZ9$Yn~j2x*B?hl0>s-! zS~#AH9htAfEi=9u>NId8pxqoHmi{@nGkFkMLK%1;8ziySlxqZ@+#H>@Sn@C0mp4lU zQ|vH^)Cc;v2)#f>2&VHg(9&kotEe8oQL%KM4=?gLt|Jcm&UA5keDLuzbjkm4^RY48 zJ-VUf$vpm8;dG&Gb)C?uYARs1L$daJl8lX(J?SKNle;+w{elN*D`Il4o@ox2A*bTM zIE&{jV2Xo$U^6P&j>1!W{e1f<%a(;Qics3E7;n8tjmk?D%lC2-g`5wIEm@wv)iimF zjX%1S=}d6{k;nX9ILmzW|KC<;0q2C5TI7p1#whsewsrV22C81|6z^_=rAJ!M913IE zjSe#dknSuWt8Vu#(Ay1+RzV(K+Mp@Zc80)2N2*47v%l>T7nkYZjqbSXJXifmdQ3)4 zOng}4)eeQg6VA=yxZX7-YyjB>Bd)~PunTUir4+^krfEaIJ}6|&x@?RhJeQ;~LYM!4 zbP_aZGtoBX<8S>KUIgoDoK4H*7cqY@s|0(aFV9Lyhp&9;n+eGaJuVLCEpfe+-(gbS zFu3!Q0-K+B?QwXPuHJq~Le(US1O-@rX`)*-$K#0pf-hipdR+0@T>D%kh>E36sHQ=O zU6-TfwgDK2Y>WX4k9adw*W{cgmOz13UYOXhc$G2h+x%pO`c{)B1XghU_sDd+Sp~p{ z=24wWw1j$Vbire#YQlNtOR~{G+{{zfIu(VHfuw{6`})Yw-rO YhM)gSvMk=<&z*LURkR-=l`Mn)509SEkN^Mx