From a56d72c8b2db19b5369b55adcbb4aa296187086c Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 21:19:54 +0200 Subject: [PATCH 1/9] Fade overflowing sidebar session titles --- crates/ui/src/shell.rs | 29 ++++++++++++++++++++++++----- crates/ui/src/shell/spaces.rs | 8 +++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index fa25216128..62e0dc699b 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -697,6 +697,27 @@ const SIDEBAR_ACTIVE_HARNESS_TITLE_GAP: f32 = Theme::SPACE_SM; const SIDEBAR_ARCHIVED_HARNESS_ICON_SIZE: f32 = 14.0; const SIDEBAR_ARCHIVED_HARNESS_TITLE_GAP: f32 = 10.0; +/// Keep the fade short so only the last few glyphs recede. Tracking clipped +/// content lets the shared paint-time overflow gate leave fitting titles intact. +fn sidebar_faded_title(id: SharedString, title: impl IntoElement) -> impl IntoElement { + let overflow = gpui::ScrollHandle::new(); + crate::edge_fade::edge_faded( + 12.0, + false, + false, + div() + .id(id) + .flex_1() + .min_w_0() + .overflow_hidden() + .track_scroll(&overflow) + .flex() + .child(div().flex_none().whitespace_nowrap().child(title)), + ) + .fade_right(true) + .fade_overflow_x(&overflow) +} + /// Ramp height of the sidebar's scroll-edge fade (the gpui /// [`gpui::EdgeFade`] scope — per-primitive, so text fades per glyph). const SIDEBAR_GLASS_FADE_BAND: f32 = 24.0; @@ -5802,15 +5823,13 @@ impl Shell { ) }, ) - .child( + .child(sidebar_faded_title( + format!("chat-title-{id}").into(), div() - .flex_1() - .min_w_0() - .truncate() .text_size(crate::typography::ui_rems(13.0)) .line_height(px(17.0)) .child(popover::search_highlight(title, search_query, theme)), - ), + )), ) // Line 3 is structural, not reserved whitespace: compact states // omit it completely when both Branch and Pull request are hidden. diff --git a/crates/ui/src/shell/spaces.rs b/crates/ui/src/shell/spaces.rs index f4384fda68..0ba6e86297 100644 --- a/crates/ui/src/shell/spaces.rs +++ b/crates/ui/src/shell/spaces.rs @@ -1594,11 +1594,9 @@ impl Shell { }), ) }) - .child( + .child(super::sidebar_faded_title( + format!("archived-title-{id}").into(), div() - .flex_1() - .min_w_0() - .truncate() .text_size(crate::typography::ui_rems(13.0)) .text_color(if hovered || is_selected { theme.text @@ -1606,7 +1604,7 @@ impl Shell { theme.text.opacity(0.55) }) .child(title), - ) + )) .child(right), ); } From dcab7c6f77c7d4d5fe4790ba8df1e0ab95faa86b Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 21:22:42 +0200 Subject: [PATCH 2/9] Extend sidebar fades to branch and device labels --- crates/ui/src/shell.rs | 28 ++++++++++++++-------------- crates/ui/src/shell/spaces.rs | 25 ++++++++++++++++--------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index 62e0dc699b..cb498fc17e 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -698,8 +698,8 @@ const SIDEBAR_ARCHIVED_HARNESS_ICON_SIZE: f32 = 14.0; const SIDEBAR_ARCHIVED_HARNESS_TITLE_GAP: f32 = 10.0; /// Keep the fade short so only the last few glyphs recede. Tracking clipped -/// content lets the shared paint-time overflow gate leave fitting titles intact. -fn sidebar_faded_title(id: SharedString, title: impl IntoElement) -> impl IntoElement { +/// content lets the shared paint-time overflow gate leave fitting labels intact. +fn sidebar_faded_label(id: SharedString, fill: bool, label: impl IntoElement) -> impl IntoElement { let overflow = gpui::ScrollHandle::new(); crate::edge_fade::edge_faded( 12.0, @@ -707,12 +707,12 @@ fn sidebar_faded_title(id: SharedString, title: impl IntoElement) -> impl IntoEl false, div() .id(id) - .flex_1() + .when(fill, |el| el.flex_1()) .min_w_0() .overflow_hidden() .track_scroll(&overflow) .flex() - .child(div().flex_none().whitespace_nowrap().child(title)), + .child(div().flex_none().whitespace_nowrap().child(label)), ) .fade_right(true) .fade_overflow_x(&overflow) @@ -5791,16 +5791,15 @@ impl Shell { .flex_row() .items_center() .gap(px(Theme::SPACE_SM)) - .child( + .child(sidebar_faded_label( + format!("chat-device-{id}").into(), + true, div() - .flex_1() - .min_w_0() - .truncate() .text_size(crate::typography::ui_rems(11.0)) .line_height(px(14.0)) .text_color(subline) .child(popover::search_highlight(space_name, search_query, theme)), - ) + )) .child(div().text_color(subline).child(corner)), ) // Line 2: harness identity belongs directly with the title, @@ -5823,8 +5822,9 @@ impl Shell { ) }, ) - .child(sidebar_faded_title( + .child(sidebar_faded_label( format!("chat-title-{id}").into(), + true, div() .text_size(crate::typography::ui_rems(13.0)) .line_height(px(17.0)) @@ -5848,15 +5848,15 @@ impl Shell { .flex_none() .text_color(subline), ) - .child( + .child(sidebar_faded_label( + format!("chat-branch-{id}").into(), + false, div() - .min_w_0() - .truncate() .text_size(crate::typography::ui_rems(11.0)) .line_height(px(14.0)) .text_color(subline) .child(popover::search_highlight(branch, search_query, theme)), - ) + )) }) // Stable invisible spring keeps the optional PR badge // pinned right without changing no-PR paint. diff --git a/crates/ui/src/shell/spaces.rs b/crates/ui/src/shell/spaces.rs index 0ba6e86297..d6f1acef86 100644 --- a/crates/ui/src/shell/spaces.rs +++ b/crates/ui/src/shell/spaces.rs @@ -155,14 +155,15 @@ fn sidebar_disclosure_header(theme: &Theme, label: SharedString, chevron: AnyEle .h(px(SIDEBAR_DISCLOSURE_HEADER_HEIGHT)) .px(px(Theme::SPACE_SM)) .cursor_pointer() - .child( + .child(super::sidebar_faded_label( + "sidebar-disclosure-label".into(), + false, div() - .flex_none() .text_size(crate::typography::ui_rems(12.0)) .font_weight(gpui::FontWeight::MEDIUM) .text_color(theme.text_muted.opacity(0.5)) .child(label), - ) + )) .child(div().h(px(1.0)).flex_1().bg(theme.border.opacity(0.6))) .child(chevron) } @@ -818,7 +819,7 @@ impl Shell { .text_color(theme.text_muted), ) // flex_1 pushes the caret to the trigger's right edge and gives - // long space names a bound to truncate against; the "@ device" + // long space names a bound to fade against; the "@ device" // tag hugs the name inside it rather than sitting by the caret. .child( div() @@ -828,16 +829,21 @@ impl Shell { .flex_row() .items_center() .gap(px(6.0)) - .child(div().min_w_0().truncate().child(label)) + .child(super::sidebar_faded_label( + "spaces-filter-label".into(), + false, + label, + )) .when_some(device_tag, |el, (tag, offline)| { - el.child( + el.child(super::sidebar_faded_label( + "spaces-filter-device".into(), + false, div() - .flex_none() .text_size(crate::typography::ui_rems(10.0)) .font_weight(gpui::FontWeight::NORMAL) .text_color(theme.text_muted.opacity(0.45)) .child(tag), - ) + )) // Disconnected glyph, not the word (user request). .when(offline, |el| { el.child( @@ -1594,8 +1600,9 @@ impl Shell { }), ) }) - .child(super::sidebar_faded_title( + .child(super::sidebar_faded_label( format!("archived-title-{id}").into(), + true, div() .text_size(crate::typography::ui_rems(13.0)) .text_color(if hovered || is_selected { From 54c32f7ddcfd997535f3ef75ad3c0c0799661f6c Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 21:50:05 +0200 Subject: [PATCH 3/9] Slightly strengthen sidebar label fades --- crates/ui/src/shell.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index cb498fc17e..69be9684db 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -702,7 +702,7 @@ const SIDEBAR_ARCHIVED_HARNESS_TITLE_GAP: f32 = 10.0; fn sidebar_faded_label(id: SharedString, fill: bool, label: impl IntoElement) -> impl IntoElement { let overflow = gpui::ScrollHandle::new(); crate::edge_fade::edge_faded( - 12.0, + 16.0, false, false, div() From 8b0a7b2e589d27c09cc3d81f39daddd4b84d7abf Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 22:20:31 +0200 Subject: [PATCH 4/9] Widen sidebar label fades to 20 pixels --- crates/ui/src/shell.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index 69be9684db..2fabcdc035 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -702,7 +702,7 @@ const SIDEBAR_ARCHIVED_HARNESS_TITLE_GAP: f32 = 10.0; fn sidebar_faded_label(id: SharedString, fill: bool, label: impl IntoElement) -> impl IntoElement { let overflow = gpui::ScrollHandle::new(); crate::edge_fade::edge_faded( - 16.0, + 20.0, false, false, div() From 9e9ebeb468d7dcfd10e4fd85505094460d76c25b Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 22:37:52 +0200 Subject: [PATCH 5/9] Smooth sidebar fade onset and use per-pixel text rendering --- Cargo.lock | 40 ++++++++++++++--------------- Cargo.toml | 8 ++++++ crates/ui/src/edge_fade.rs | 52 ++++++++++++++++++++++++++++++++++++-- crates/ui/src/shell.rs | 2 +- 4 files changed, 79 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04602a85fa..886baf34e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1466,7 +1466,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "gpui_util", "indexmap", @@ -2113,7 +2113,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "proc-macro2", "quote", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "accesskit", "anyhow", @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "accesskit", "accesskit_unix", @@ -3434,7 +3434,7 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "accesskit", "accesskit_macos", @@ -3483,7 +3483,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3494,7 +3494,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "console_error_panic_hook", "gpui", @@ -3507,7 +3507,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "schemars", "serde", @@ -3517,7 +3517,7 @@ dependencies = [ [[package]] name = "gpui_tokio" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "gpui", @@ -3528,7 +3528,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "log", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "console_error_panic_hook", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "bytemuck", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "accesskit", "accesskit_windows", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "async-compression", @@ -5049,7 +5049,7 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "anyhow", "bindgen", @@ -6192,7 +6192,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "collections", "serde", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "derive_refineable", ] @@ -7949,7 +7949,7 @@ checksum = "c62751faa8bc286982334a082fe125184a29fc89d17775766e4f891b7d726980" [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "async-task", "backtrace", @@ -8695,7 +8695,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "heapless 0.9.3", "log", @@ -9947,7 +9947,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/zeronsh/zui?rev=c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add#c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add" +source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" dependencies = [ "perf", "quote", diff --git a/Cargo.toml b/Cargo.toml index b3c11ade89..ff233bb868 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -139,3 +139,11 @@ opt-level = 0 [profile.dev.package."*"] opt-level = 2 + +# Temporary renderer override for the companion per-pixel text fade PR. +# Replace with an upstream revision once it merges. +[patch."https://github.com/zeronsh/zui"] +gpui = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } +gpui_macros = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } +gpui_platform = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } +gpui_tokio = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } diff --git a/crates/ui/src/edge_fade.rs b/crates/ui/src/edge_fade.rs index 1329f0e1a5..5030cf741c 100644 --- a/crates/ui/src/edge_fade.rs +++ b/crates/ui/src/edge_fade.rs @@ -1,6 +1,6 @@ //! [`edge_faded`] — wraps a child so its whole subtree paints inside a //! [`gpui::EdgeFade`] scope: primitives fade by vertical distance to the -//! wrapper's own top/bottom edges (per-glyph granularity — a true static +//! wrapper's own top/bottom edges (per-pixel text opacity — a true static //! gradient, unlike whole-row opacity). Built for the GLASS sidebar's scroll //! fade: over a see-through blurred backdrop no painted overlay can fade //! content out, because "what is behind the window" is not a paintable color. @@ -28,6 +28,7 @@ pub fn edge_faded(band: f32, top: bool, bottom: bool, child: impl IntoElement) - scroll_y: None, overflow_y: None, scroll_x: None, + smooth_overflow_x: false, child: child.into_any_element(), } } @@ -45,6 +46,7 @@ pub struct EdgeFaded { scroll_y: Option, overflow_y: Option (bool, bool)>>, scroll_x: Option, + smooth_overflow_x: bool, child: AnyElement, } @@ -103,6 +105,15 @@ impl EdgeFaded { self } + /// Ease a right-edge label fade into view as overflow grows from zero to + /// one band. Unlike scroll chrome, a label should not suddenly dim its + /// final characters as soon as it becomes a fraction too wide. + pub fn fade_label_overflow(mut self, handle: &ScrollHandle) -> Self { + self.scroll_x = Some(handle.clone()); + self.smooth_overflow_x = true; + self + } + /// Pull the fade's TOP edge `px` inside the wrapper: gpui clamps the ramp /// to 0 past an active edge, so content between the wrapper's real top /// and the inset edge paints fully transparent — content under opaque-ish @@ -175,14 +186,22 @@ impl Element for EdgeFaded { bottom &= overflow_bottom; } let (mut left, mut right) = (self.left, self.right); + let mut outset_right = 0.0; if let Some(scroll) = &self.scroll_x { let scrolled = -f32::from(scroll.offset().x); let max_scroll = f32::from(scroll.max_offset().x); left &= scrolled > 1.0; - right &= scrolled < max_scroll - 1.0; + if self.smooth_overflow_x { + let overflow = (max_scroll - scrolled).max(0.0); + right &= overflow > 0.0; + outset_right = label_fade_outset(overflow, self.band); + } else { + right &= scrolled < max_scroll - 1.0; + } } let fade = (top || bottom || left || right).then(|| { let mut bounds = bounds; + bounds.size.width += px(outset_right); let inset = px(self.inset_top).min(bounds.size.height); bounds.origin.y += inset; bounds.size.height -= inset; @@ -203,6 +222,35 @@ impl Element for EdgeFaded { } } +fn label_fade_outset(overflow: f32, band: f32) -> f32 { + let band = band.max(1.0); + let progress = (overflow / band).clamp(0.0, 1.0); + let eased = progress * progress * (3.0 - 2.0 * progress); + band * (1.0 - eased) +} + +#[cfg(test)] +mod tests { + use super::label_fade_outset; + + #[test] + fn label_fade_enters_continuously_and_settles_at_one_band() { + let band = 20.0; + assert_eq!(label_fade_outset(0.0, band), band); + assert_eq!(label_fade_outset(band, band), 0.0); + assert_eq!(label_fade_outset(100.0, band), 0.0); + // Simulate resizing in 0.1 px increments across the old 1 px cutoff. + let mut previous = 1.0; + for step in 0..=400 { + let overflow = step as f32 / 10.0; + let edge_alpha = (label_fade_outset(overflow, band) / band).powi(2); + assert!(edge_alpha <= previous); + assert!(previous - edge_alpha < 0.02); + previous = edge_alpha; + } + } +} + impl IntoElement for EdgeFaded { type Element = Self; diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index 2fabcdc035..7ee9dccb4f 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -715,7 +715,7 @@ fn sidebar_faded_label(id: SharedString, fill: bool, label: impl IntoElement) -> .child(div().flex_none().whitespace_nowrap().child(label)), ) .fade_right(true) - .fade_overflow_x(&overflow) + .fade_label_overflow(&overflow) } /// Ramp height of the sidebar's scroll-edge fade (the gpui From 6f1a7739870af280d4318a2309ad818c39be81d5 Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 23:03:25 +0200 Subject: [PATCH 6/9] Add reproducible sidebar CPU comparison and supplied preview --- Cargo.lock | 40 ++++++------- Cargo.toml | 8 +-- crates/ui/examples/macos-resource-profile.rs | 49 +++++++++++++++- .../sidebar-text-fade/user-preview.png | Bin 0 -> 147423 bytes scripts/profile-sidebar-fade.py | 53 ++++++++++++++++++ 5 files changed, 124 insertions(+), 26 deletions(-) create mode 100644 docs/screenshots/sidebar-text-fade/user-preview.png create mode 100644 scripts/profile-sidebar-fade.py diff --git a/Cargo.lock b/Cargo.lock index 886baf34e0..c5a284c243 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1466,7 +1466,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "gpui_util", "indexmap", @@ -2113,7 +2113,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "proc-macro2", "quote", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "accesskit", "anyhow", @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "accesskit", "accesskit_unix", @@ -3434,7 +3434,7 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "accesskit", "accesskit_macos", @@ -3483,7 +3483,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3494,7 +3494,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "console_error_panic_hook", "gpui", @@ -3507,7 +3507,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "schemars", "serde", @@ -3517,7 +3517,7 @@ dependencies = [ [[package]] name = "gpui_tokio" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "gpui", @@ -3528,7 +3528,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "log", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "console_error_panic_hook", @@ -3562,7 +3562,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "bytemuck", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "accesskit", "accesskit_windows", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "async-compression", @@ -5049,7 +5049,7 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "anyhow", "bindgen", @@ -6192,7 +6192,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "collections", "serde", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "derive_refineable", ] @@ -7949,7 +7949,7 @@ checksum = "c62751faa8bc286982334a082fe125184a29fc89d17775766e4f891b7d726980" [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "async-task", "backtrace", @@ -8695,7 +8695,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "heapless 0.9.3", "log", @@ -9947,7 +9947,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/gaelcado/zui?rev=736da357c2b80be36d909df78b43c9c4fc92ad32#736da357c2b80be36d909df78b43c9c4fc92ad32" +source = "git+https://github.com/gaelcado/zui?rev=53869c204efb866d19af292cab8b1773898eeedd#53869c204efb866d19af292cab8b1773898eeedd" dependencies = [ "perf", "quote", diff --git a/Cargo.toml b/Cargo.toml index ff233bb868..df76655910 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -143,7 +143,7 @@ opt-level = 2 # Temporary renderer override for the companion per-pixel text fade PR. # Replace with an upstream revision once it merges. [patch."https://github.com/zeronsh/zui"] -gpui = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } -gpui_macros = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } -gpui_platform = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } -gpui_tokio = { git = "https://github.com/gaelcado/zui", rev = "736da357c2b80be36d909df78b43c9c4fc92ad32" } +gpui = { git = "https://github.com/gaelcado/zui", rev = "53869c204efb866d19af292cab8b1773898eeedd" } +gpui_macros = { git = "https://github.com/gaelcado/zui", rev = "53869c204efb866d19af292cab8b1773898eeedd" } +gpui_platform = { git = "https://github.com/gaelcado/zui", rev = "53869c204efb866d19af292cab8b1773898eeedd" } +gpui_tokio = { git = "https://github.com/gaelcado/zui", rev = "53869c204efb866d19af292cab8b1773898eeedd" } diff --git a/crates/ui/examples/macos-resource-profile.rs b/crates/ui/examples/macos-resource-profile.rs index 7ff3673c95..cc3b1683b7 100644 --- a/crates/ui/examples/macos-resource-profile.rs +++ b/crates/ui/examples/macos-resource-profile.rs @@ -36,7 +36,8 @@ fn main() -> anyhow::Result<()> { "Usage: macos-resource-profile FRAMES_JSON OUTPUT_DIR" ); let frames: Vec = serde_json::from_slice(&std::fs::read(&args[1])?)?; - anyhow::ensure!(!frames.is_empty(), "Empty replay"); + let fade_bench = std::env::var_os("ZERON_PROFILE_SIDEBAR_FADE").is_some(); + anyhow::ensure!(fade_bench || !frames.is_empty(), "Empty replay"); let output = std::path::PathBuf::from(&args[2]); std::fs::create_dir_all(&output)?; let native = gpui_platform::current_platform(true); @@ -51,6 +52,7 @@ fn main() -> anyhow::Result<()> { let app = gpui::Application::with_platform(platform).with_assets(icons::Assets) .run_embedded(move |cx| { gpui_tokio::init(cx); + gpui_base::init(cx); let settings = settings::UiSettings::default(); settings::init(settings.clone(), data.clone(), cx); let fonts = typography::register_fonts(cx); @@ -58,9 +60,11 @@ fn main() -> anyhow::Result<()> { theme_library::init(data.clone(), cx); appearance::init(appearance::AppearanceMode::Dark, settings.theme_selection, settings.accent, settings.surface, cx); + history::init(settings.git_history_columns, settings.git_history_column_widths, + settings.git_history_column_order.clone(), settings.git_history_author_display, cx); composer::init(cx, zeron_ui::settings::ComposerSendBehavior::default()); terminal::panel::init(cx); - app_menus::init(cx); + // The offscreen bench platform has no NSApplication delegate or menus. let state = cx.new(|_| { let mut state = state::AppState::new(); state.connection = zeron_proto::view::ConnectionStatus::Ready; @@ -126,6 +130,47 @@ fn main() -> anyhow::Result<()> { })); let dispatcher = executor.dispatcher().as_bench().unwrap(); let start = Instant::now(); + if fade_bench { + // Deliver the initial ready state so the boot splash can settle. + app.update(|cx| state.update(cx, |_, cx| cx.notify())); + // Native UI-process CPU, excluding setup, screenshot readback, and the + // engine/network. Fixed wall-time pacing makes before/after comparable. + fn cpu_seconds() -> f64 { + let mut usage = std::mem::MaybeUninit::::uninit(); + assert_eq!(unsafe { libc::getrusage(libc::RUSAGE_SELF, usage.as_mut_ptr()) }, 0); + let usage = unsafe { usage.assume_init() }; + (usage.ru_utime.tv_sec + usage.ru_stime.tv_sec) as f64 + + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) as f64 / 1_000_000.0 + } + for (phase, count, redraw) in [("warmup", 180, true), ("idle", 600, false), ("redraw", 600, true)] { + let begin = Instant::now(); + let cpu_begin = cpu_seconds(); + for frame in 0..count { + objc::rc::autoreleasepool(|| { + app.update(|cx| window.update(cx, |_, window, cx| { + if redraw { window.refresh(); } + window.simulate_next_frame(cx); + }).unwrap()); + dispatcher.run_until_idle(); + app.update(|cx| window.update(cx, |_, window, _| window.present_if_needed()).unwrap()); + }); + let deadline = begin + Duration::from_secs_f64((frame + 1) as f64 / 60.0); + if let Some(wait) = deadline.checked_duration_since(Instant::now()) { std::thread::sleep(wait); } + } + let cpu = cpu_seconds() - cpu_begin; + let wall = begin.elapsed().as_secs_f64(); + println!("{}", serde_json::json!({"phase": phase, "frames":count, + "wall_seconds":wall,"cpu_seconds":cpu,"cpu_percent":100.0*cpu/wall, + "cpu_ms_per_frame":1000.0*cpu/count as f64})); + } + app.update(|cx| window.update(cx, |_, window, _| { + window.render_to_image().unwrap().save(output.join("sidebar-fixture.png")).unwrap(); + }).unwrap()); + drop(state); + app.update(|cx| cx.quit()); + drop(app); + return Ok(()); + } let first_at = frames[0].at; let mut frames = frames.into_iter().peekable(); let mut completed_at = None; diff --git a/docs/screenshots/sidebar-text-fade/user-preview.png b/docs/screenshots/sidebar-text-fade/user-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3794c71d4f45edb7bc1330f9aae05beabdfcf0 GIT binary patch literal 147423 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

?19z)!I-DT{pArB1cOuS#v;Gjt0r^bWgOI-un=G zSdwc8PSZqM)+HX6yEq%vQ)HIpT}tPN?6LDdpLSWOIt0H8$?&Cv9mswgcsybXt<7;CFZvM&ywi*3QVA+BO#SC1`JD8z9|yjPZaI_-Ep_8vv#F|I zFfV)t$;bAG)a0zj%)Up0fYty)SjZ20`IK9iGEI^SpFA5=ka6~Vyz&{wnQG47QULN3 zKjkhBc}s7Li{N=UALq2BfV06j<}f5m0CGpcCMl-xZhLK2-O&?D`|-6|NldSGSRxrO z13Wo{oI*&O#B~bH1E-BN&!_idbi(`_suoxWi4H_`?46I&WT`wBh`wnybgH7by1o<5 zJ`#-9$V{}R)v++c&}@;<3Ry?b{ZxQekgxR>e7lK_NlUtLD@GRgHg0Hp2>ahHwi3;) zN?wGonwoQlA5Faa1s9?__y8mMCIXRejR+>rW$Un3EK zQ)I!DfacTe?EIZkgr~)1KSc`PWU6}IR+#BoY%beDu$Sn<89<6|FDYRVgx?-$Nf^P; z0;8BYe3Zc8g=LU52mJok)SWL%3@KSAbJ#$%eR)66k{Gh{JPh{bGaIK{)_~b-#*z^k z@#C{jtCCXxC=7|<>&73TP@6dE&qP$x9P=m2VmD@X=s~f$B!}&DfC*Ilcbgy$i6sI` zJ}y-FR4_^y@|az7B_%PIZcakI*Bbdz^L88>jNH=?hu)9qla;Kviid|2qDY;nB&2$I zqFI%*z;D-DcYy23)x!|y(B~AAotThWDT?@ zDcjff9jMQUm5Bkw4I%t-Jhm-TXT+2UgEjrS7hdE$mW*4H)hRW}Y%+wr#i4jVdJ%aT zi{fsW(Eyc=n7c>agUdd>m0B1P^IY1#NXKm&Xp?2tH8QQaWj=KV0~TCUb-BD)^?1n~ zbW_Qr7HzIL5DUHz66@@u-S5Fq2N>4j#GXTe%gbKMy|Eu>15k^ka+}n|)!V8N@|YAa zu=77p9%Qk72|MiH!cFCZ-@ul`{elOzof)~f;bl)pBJF=}pnW{@4qc&h53ch4Z z<~MlX;GjluA9@hgLE;QzOY(-Y+*NyFFFnM6qH1h$s!HZ9eK( z#yL`~)Dc_tqZ>C!QqTS$xaGF+!t6`5ui3{0nx{&F{~D88kr|bu!i|{Sh1)HI>ts9z z`4ge&jKfkHJe31R^FWOZ&aV<{hg8R6e7{lU8iZJ&bzAh|c9E2jtRX7VvLg-zwWg2f zC+65#wtD>zXTV}2ecWOD4!fBFcnF63OANf-YGj#eI(}mz)T~&?Y)L?m%mS_=;si%S9wpakr)yQx6~@TP_v%9|t;F5WJ&P+VaUDwg zGY1_{ykt*_OBnC*&t_OMMckN)!uOTT^!i=o%bE`5ZQ1NZ-V z!Z)|V+`>Yx9lyDr{&wC?Lwkyc6;BGuI-qH7-NZJH!??{aeNv@J*jM|K{G&FVvy8${ zIYx)$PVS^Ps{|SJUR~*OdGJ}H$4E%h+IIjKi3i1k;%%$2<&9f9pi&hv;8$gnYx9#} z*;~2VnZJ~=MP_7@Hlc8*{+Ud*$=i$}TIZsk@C3cWwp~W6S;U6Wxb8-%X23pA+6)s&JbcS&fSTW~+k29vlk>_94&G5o-;CPQ{tzNl+xKXxFi z@~L#UYb8+~%i^`J#jiho{YAIUZtGp{B4W=6P)BYm;SnRdxU}ThhL8Qa>wYU zCdFO&;v#2sol#rl)%QPt;Io{Aq2}ReM+!1-=%yD04V_s!4PE)`&$J!i-tQ$!U)i#} za0;|_CeWj%<#gO;XBNLKoXGuoOFZHIwsjqU!syOJpeDNwOEO?PnO>!(D-e%KC7g{Q z59k~lQ_>nX^}D>hEK??WW`)e?j_^5{nwWgrA4@#uYjZ88rVw(Q|8uJ>&jZ$1;Ftu7h~qe@^{j{Owq&uM=+QoV0dpu`*oLDFx~EVv-{ zCU?Sq``_N7mZcTq&nSM6YZaDlc$pG?_lM)pX#3i&mg8P85E&|q_tQxMrkEY<^;!^P_|961E_xmzVqEo1I^ZjziJAt!?YXMYSoRk<4Mu!h(i*DPzU0*3!Ct*YY zL7hiR6vQ8~v~&zU`afP3jrTti2*^1sn7nqcENsmMgB4#7D#WEKKIb>jRIu{cBISQb z4%~sGD)#i=WJX;4?RUI!I!&@V-luBYh7*kdYH=fgTdRpeOdkC3pX-nFbT+qgCn}71 zcEVP#Zx~ek%5WAqk$TuWQKAJ{SmU+v$z0~x!-*mxULNN#?Mgok{VE>FkU-3xnn)=m z>)1P`uAukb4@2yJUV*n%{2KgcVf%Xz@1I+X_ul9G)42ehP9dB>P?dr7oRc1Bnqx3r zyMiI96fLw~)1rmfbG|(XRfxme6UzNV@LM@{!0+wv_fVCTO+~o<=HEa4StdSnak2&d zf9HSAUu|_cZf8h_$Szq2#nGdH;gBxJt5ERH{~cd0%tO|Y91KGc$R zXjHWhB7?YKyzJL=X!wC}#54IlAuOz{r}w7}O?5$Q%>?24)29oJ5f83OAErk@#A4lG z1{GWUE7{sO^M&!}yJK130}}CoaKJbkx%bUa1bw#K-(grm(FK2cd*JgmMR@{OdbSJr zc*Dh^g;a=ap`~nS=Gq+%PiU#08);2N_C>6hzpBCW7$eTq%eiJzWMtbzWAyH`)q>f- zSiMOm*P;HhdyL}mf1uXgksk8OaE+Xlg8XrI%Lx)1VHgmO<2ZX)wgww>q`gCBqSMXi zmSX;kkc$Cupaq@+MMKgcg1)}CDiP;bB72afZ=DT!k|+#~qhsBF4m4+{mqpMVzZFbz zf3?@#(g5IPsUa|brB6cv(07v%e4vW^FNHZ=?zp4(@N%!Or6q0qv0Y$+epwa6MYG%j4Tx;9TBttt3Domo?M)5I%f z@Szs5w&r8U?{~P@Qys%cHuCz@u`zjd(D5vVei&8;X8rlu>Nc9jqj=8p=NVqRMW);g z%1UUDjkKDjWWt~lk4Lh(lTCqU@#6+Fpm`$?!sZ#M%8B}3e83G_EA^@0<_ZQ+CTe0PM4dGb6Z<(U2)PTCctY%6mHx%3~YL84%uiNAhjMmN;n<-5Y;h) z^aaiFRp0SdkiYl8V?!}M&4q=n1>ObT9{-NHK&OhH1Lo7SmnB;5t&)l%TWA5l^6Kj4 z%8VMF$)04RsGrRme4uN!wZ5O90w3&G>fBx zC+M>#R!Ix@O`k87?QT-#G!)8?=JHt4AeKtc#2d6TtAu%v1!DdnaF^7Wm&>>DE9Q6 z?x+t7{)P>27iCTFiXSZI3#F=idyS5YjEl_;%AhVGWsz7^9KV%p#Dcjqzr+6)C2~+L{HRH0OHKmDL9~|^(tkbWm4gXwKTSg_?b*x_M)*DqpQwQw7qf5GY zdY@I1K=kzV-HD6`F#C!fn%hIrqM`j|Q*?<1PALQ|~) zvc7%#sj~74wRrIYnOu%bKb%wvAgj{-!eqKqycb)wZlfnW0{6;o|Z``bdo_qFb^`}4mKRa4qUm*54>~hdgWU~7E z-~OVngZ`ugvM+z-YW1;?{f}mWJ@W3mZWmSRd^LFR5cTjQj(zZNQV!rg{)`DJMa`W% zM}1$~1F*TNN6%jBjyvuask(zZN;~Mh^x_NZ)mMKPkNf)9uT>xV?~myFZ-4uKHRXM? z@^zAY`=Q4K6o=}YA3pV@`sY9Y5zouTZI&c`%QtV5@wPB2-o80Y>_OkWVL0x7BesW`g!%rD=()=WQ@y? ze$?@_vzapi-EsRZvfU(kaz$f-L&Jp^emt(Sw)4@R2k!q?Jm08Mqt(6NdcaPSbiGiX zLD4I4ka4$$3Oi|KQBORx;R!`eDNhoY*`5W@|QnT|NOtdtFL|iI(6>3=chbh!1mh@ z-mj|dMS~QBVMV182njuGiM(^A-__$y|Q>dDvS3*Qmp|pKnpkfrOTGY+n)fkH4;`N zz&1jo{lSC#1-y{jPHHI*z}PBkLmI>CfwYZ9Qew4Zz{IVRlteibtGn-g?@86CPhZXJ zJ+Xg1BzCZyZu+Jkhy>#PfBg;D#62nr8!PU)cinZbmK?eFqC+B;+%9&El`9f1#5DnA zU;NTn)c^d?Cv+9r-th3l55_&5Y#{S$gB><&<_xhb-em`A>FPU=e@`zuk|JC;HXxmS z_PN@9og{zy(;wAy&nCbH*Y+1*`kj^(iGTOq$?B1Zzs+TwUii(+dSQcm6$1L`VI6+if?i zMGF@u0a+3=kDKMom#Nz&ACrlp2OoS`Aq5A~hV|>zjo-LV-lxNA#E6mVzWbB=z|K2w z?pzs*x7k4{*R->Le@7BaiIf29xKP>#jTtje-FeqNX~*`RcibWlSc$PsUOnw6=6-_W z#Cr^&0%l>z4P;2^k3N=uto`VRPpW_Y>;J+O5l?gFRbLQ~$xrM1-@NcES+Kkmi%T@d z09ibf#|41Aa^-T>Tecke(Hn2PuAY>IfT2OMn8b;PxyX;;`=cNJK)v?bKjTUKfDFlw zg-DAQEi@SIk#UVD^C6j=A(;GJvXK#ioeY%{`^GkI+!#Nyif7xtT?f@(MD0WH7HN)$ z8YQ7x`o7r0P%l8g|NSfKQ=ht6UsKjMZ~lf_B5DCcy?ggok3RZcEs_(4!JGlMZtXhN zyH6kW;s5@yLP~*958Qaeby~{fzR*DS`7eA~JexjA(ONos@PYgEJ~JI4f80REz-9l= zJXxJri<;qMAG=6>@Pika|Z_sKW0vd_hj%^8*m6bYv)22=8uYdiMTC!xZR;QeE z_IYaD_%n1IiC@GH_uXxh`u_g#M?cY?uRP1kF8y>|(rGFx+!ucH+xT;b!8dNa zR-B4ta%R{I{p!~*YRv)T+SJ2VEs_SlzyIBD)pW6;q6TFpj$5>unC=v(iup08iU9)# z=*igRLxN!6UjvzZMhakkL?k=F9J=pYckBLwPsffO^~pH*Kk$%_tEyV99gn!#C#z@v z2N7FHI2!IN|NB*~E+p*_Wx`(&lfrm*w4;}d?MEJYJU+Im_kaHLPf>|EWBb1u+aeV~ zjBU2AY~Suk>9H=0_nl5;{ki*|`_yRJCkC+y`Qsm7RdeUe5vi|{njp4n`pqUA$Q%%S zGHI;+?XQ2<>bka~a%FKeZd_ulJ#hcMYSye7HoL&-7@m47t$mlDi z^Xb#3Xm#XQzVcPoF{bV|1@SISe)}yw4lWY!!g1rq>nO(b6_ZP?lg9Z)Jai}J5z2zpu-cz;6wxtU$_>f*$9u;2$=3X3EY}F)Q z;4NFWkOg41I(qDgn1Z&7)7@dIXR&G|W3NGj1{%ni3pl*O5iH`x=ItWSK;~6%9&ReA z(c!#wix$n7#yemGaB+?zY8HrlR3~QRvksI$s9O-Pam8;Zz{SLY8WE`mLZ1%Ut7Nl}`Wk z(?3>!{mY;Abs>T5s?U8P4#)>(y8uA4aN&Zawzz@pAu)2l|K7VvX;3|q4th#degBH7 z`T!}UQV9Mxi3G7;JW&lX7Vf|QAvJu2^O7R%;`IrA|A`;yRVx$1r2;O-j`r2BU86qy z;g1>?`u7&;Uu;g$e}DKR>T5AO(bG@=MEdnlIy~r)4dxF%aBqAM;KWIj)UCJPnUoa} z|J^IU)st~$WoKLO6ST=}Z5sK4!+YNU*4G0UbjvWCDER ziNx4`hOzzEzZl&21u^VNzkL2ThK;DHzoSs)+H{?$*3LiwgYh66$N;H3?z~6GAz9q? zjq9}y(j;cA*?{oAjI~D|@t0yvKJ)v~!;gtw*cszr`21&MD)a=1k2rF4N8s1K`em8lHt6`9zj>S1Ffb?nP*jMRB@8j=J@>Qc z^;hvAEG6ws#=p| zSEL`CH*YTGIbcR#yXR_Cx2S(31hV!y)r}XwjdbGr^;I$uoQHur0ARvSuyNx$QEv4kB4Sn1Ede6Iviejv0i@pMa9Gc@zS4t_Bs0c>i_*x z(qyIsJ^rwGdhpv1>zM!d|6Wx;7vN#Wz3#f})dywu%BmA5oyyK#G|=CE+c$Mu_6~mi zn(Op6Y8_*%vw@74{4*DSB1!E`hLIyj%f#x~wceC{ir7oTQ2+k@Mcw&*o%9`9Nk8_e zBY_c62q1gpQO5QlUH0EL_IZpLAQF~eB<@X8j+002M$Nklpwz2ACJtCx|CuD#~!_?WkW?BAkF?Nr%GwlH;2M~)tr z117erfB*Ym0zwYx8GcCSedWEv4z_LEcHyqyB_()RUl$V!j4ciydVpgHi~xR(RI-$KBZq? z)Q^nan{K{EtE?#C3j)B~#XAtPfedvIs%JNK74J<>h=AUGcd~l)kpv(S)}TSLmPq>v zaAA;dENVY&!hOVHsf{SA5ciGkPT!wyRbNbzA5T$#)KCk^_a2t*()yb z^a}RMhl-iW8|m}nPdnNcw|HrQ3~$u0$pY6+*#C^J{ga=#P&-eUG<3}uzx)+(@Nsy1 z0a?qIEk*M&R2*44YHv=wx*IocB5K!(noSUp;b{oy9FcjIUlx9tY22hee#I03kfB<{ zOBrv)6DN*qfdNe#&zyG#AgivfPLkN%{Gz6J2} z0Y=23zlB=0YALHt=e$L4AUi6lPRfhlM;>fbHCN8J%NM=;^6#`8JuB@`eBxtC#V{Cg zK6(0SXCimocajpz&2I(paP6lr;Du*UO#s<wyQIiP#1* z>_@1KAOPJgTy%i-2b&kRFX*m2ZJs-(BUG#UTnHw`S_#QH8za>8Bk~b^{sSWO!~eNd-}%fec$G zKmcK@x#9Y2eXIA|S6cPOlcezoL@M*5FNjU|<1xo1 z8^};gnz07J+BP4X&z*ODOFLo_cK6-4t9dfk!qBUK_=|Qh!odLmbSN2_4Unx~y-NDV z(NNgDZ6N!^MIY4wLA>GO2V_mfR(rz@H;K*5u^-wz?Q8nlPa=y0nE)|h{0CVmuwBAU zy~U{wClCW(j_Xje1@MI<@d*r5Cq;(x+j}VR-bO0+n zq!x6+rZW)xu^q7ix>}5pfE@eCSP{3CbI$yMOlfrx38F`t|G7SH)f5i;&!2ef3XzWy8Sw^r!wux3wmKjPh?0Be9oMmJ5(Q{mjp0 z(b7pb|Fc(Is*V3%eeuA9566w!H{X1ts5lqvWVhdOmzpqPq8=-N3kUJyF;`W!MkLs) zMFrANjt+ZLr$tg^&&##f-JtIueDFT;#PXgDz3TAM3ln<+G3K)eiAj_3N8M4szWCxR za`tB-fEdpsgOfdS2Qs4)TqZ8~?8V~HU%(3> zLm$f_y``lk;(gRr0Hdk)USyLc4-|EiACRGz#9NAeOwRdd`RQ64$XIE5(XU^4N$c?$ zSb!aa!cC}$ei~cd;@pDK9I}Dz1rh&$EA}5ZU2^H=>hjA!tAn%IM@Gi$#J<5QxLdbw znh!RE8^t3JwVqA60NE|K-mWH1I$N{5>(1Nb&(7x0wUOL-L0L@$tPnP+YhwH50H&L7 zzE!KWjMT@t!POqy2X;ohs?HO)VpfosUv{x}Fwu-c`~e({G>2De?_Pbh6AIGcO*dYz zIox)~of=r_E4&G>6Ne4x-h1wnJySFFHGi<9{yfd0!G01Mjx+38f{@gH_S`dZuRp^2 z33z|!@h7+}xN4Cyjh7~4o5dHCnVUMx*k8d#qj^P9i%YDm$CJfDDkj|AB{fGRkDZHhb1g4In1(J#v&DYSnZ=_Wbid zR~O1&QQkA0J@9O0F=SKw_8nyr*G11+s7TpNUt1^@$Pyq%9SaI%Ocnve~m{seA6ZL$B=d z4mA7l*d}n#-M8z3ZpzFB$Z+e&BM`!K?dhNX$gqw7Vgq_SHZf!T24D@@o4B!g^zGYE zN8NEdn{(&tYmN;9yl}kX1qDRdxXVW4@Z`J@&p!7{y^$6V+RDn#TB2aH_De5{y+@LK z-~$)L!OPT#$pxF4J)vg{WH>Rs^1DB3wJLT0+*Oyy)$67$pSk2xS;SnaZ-XQ(BV27hbK;@aZ{!e*$El1HhBRV&-&A`jn#U8*%Qf5LD;HZ_{}T2 zPlAB#pa1;3nkH&)B(Ag0I#&Z3?)RM7g5#7S)bssi3kZwv-MbUs!$Lw5l=HM#fPs@FHzH0mg=M zYQF6a>A3&L*++H}2FNZIyA8G*2td9;_K9s0^{F9N+~0oa(fEYL$@+M%LH6X0P3bFN z{z8(P#0EOjX9HyRXIya9xJUNy(C?6Y19C1vhGF{QM;_CB`Sa+b-&XHTPOJdgFZSdQ zp3>k$Jf2lQ_<G-!}`fF{Pamm9rF zYyWbX_)9PUKHj(g`1@Z)W06?+l$Mrh=O45#hHN0iH69mvLmcSK{wPC?H5P3=8|dHv z{-<_jH}UCyZxU?)V-0d_cvJMX{U;wlhJ(>nvKbpf4QlTb!)5>L*W4ic>(0~hK|uD8 zemunUy5E9kRH{FOpUFtEG)Ui;c{tY=I0Ociefm8b5x5W`}m- zJ=wFzd7>=bCY^P5eB6-04P^B9?_+jX;!%Neyw~hGGu6x)GYCpc7k}mwb;T7|>2y3V z&Z=CraDi+s_`9h8_iJ_kqvC?!SvHF=CW^(K9ERxUtB z9a%Mg>%IrY!0xDJOug-2UXt5nZx)-!-852GhxYMHPl?3lK3)hnee9)USqrq)Op9$|i+y;NuUCZ(?{ zD?96W8^{P?tg)xcI6rtXVdA}AKFNgoG7~})eB#L;>MXNn&5%=7?n%j>4bljCT>LA|fP{+gZD^O{4I*|)}O>aDll5Tmi_G zw;R}TxY~2ruC1rH$`VV#ZYqFvB2R}&UBX1MgZ+6i|pVX&@ z05mL0mWzGy4mtEUEV1|RV;}ptmV(SAiOq4rg86Y4sC(J)K6Y&C*nVg7+v-=p`gw|d zFP=Hzf(iEXpZ}t+zj@{)=L_*a|HaQVcyinm^uYc1s2MY+>ud7|wbxZweqNm;>NeDs zHsJt*B;_~O?6h9jJTDe0^y%lWx=iM*LrKYA{_XE|nM)Rn3Q!h;Zu<5^kLZ11K>KJCmYoPx7*_tG}p^lp=n}kYNhPFg(LKA;vh$5eFfmPMmm_jf(u;8!2>}k8- z9~FnZ{UW`gmMkQtb3CaLAfp4C%1ej$7U1P3`}{={$LfR=)Xfo9D^@HIvGNWNX35i= z16-!;Tz<=Bbq#PcU?5f&$7B^1hB&XVg@6$5`h3a;@xHDSD`q5Bo+F) z?c+L{$tFIwbLdCfj&nz~OwR0qLhF(VIb*G@)W2BzFE-Y4wB=lV_1E<&Hq?XD{c*m? zgnYZhHzJiga~~QhHZ{8!bg8MM3860;2N2^3furzbBr^Y!YYfOtmC(DE$81JS*c@7k z4GoYgD)Bt0 z`Gsefc?Q<)j$&Ryy~y0;r(X1HVPJOzM*49)-NNetkhvd;IkE~BjZKKoyJTgyNlyJR zhYs8Ee%Fi>He@=#(Mei<<<*DR#vZVrem#gq`Gh>@Vb8!QORX7Rd`S1hvgZwAf1Ek2 zI;b{jyCQ9ZAnvC_oYO%GuSM@R*SJLHU9IdxX|}hd?IUs8R}+T8>8NH8O!9>k)0 zX1?>UZ$wlj*Bl?bWI3h_hZ{^A>~~A2Y76X+z{r|wXYDH4>7-K*$Y_?CmNM_~dN9kp z&+1YRdvuslVtzfO@%o7*>xb*xb-oc<7gb9#It?2q=YsO#Q$A|S={tTv7T67ek+r0` zwW1n{j;ixOmS{>;J!>YmdQgk1M{5TkMvDDxQ%6oxNYYL1XhB`6MPSzjM%I-Uy6c&F zqkMDtM!3tYzqgm3bsEU>_sr`-?9_Tq7%2wCyjzwumXdC~)7OW3_dsCR1x9-FtG%Jw zHO4oWZ$$0wftssXYG>6sAWLmRzPi&)eD$D~uO7}XUq*^~hQTEzjj5!Y;C%J5$vu#^ z>(VAj=2tuKvTuZMPTz>y*#otsR#vCUJ*&%oN+2eqYM(rK=KY3-bdN9j#2S>y{vk?tqVbn4B`qU9{ZNm&o~%`V7fq$JI&KheHE%$1Cbw#BZ%kA%Lul#|)kt)UI87 zi*0t7UKPxaQ@(PgwmV-X)$`4y2QnNvl03s4nN;SqNSjgrWt6zKbYJe3_T=Ch=(M@0 ztVDyDcMk+)^v)0%8ZEcLqC6u{a4zHF)GvsqB#u|qxrpDo5@rZw{u6n&K;~C5S3PUd zt$!cXqDr0yRmo!H#Ij_O^EBws@J-C9|1wG(z7F|G8Es`#xTORnT2WL{DpHtR0yFUe z8BLN9ztM0BQBcSvC*{!U69)qhyH2XGbCVQgm6IWmSvg&ooN}EB`Bf+r9yOP?9?WX4 z@9mN^7)4f6>(XXce;uL+GVZ&KGlZx_UX$cr;S>%j0m%(0lq8m>8p)L^(4D7b=Bg+M zcr)X=f|F`ka3Bk+Oj6Bi?TzWudN3>eBg%60SlO)0!dJhJmzY)GWtFMW9Ti>K>C4JA#fd{l9GjU(C7mFT2v;Em0kZVfaMh~L+}49x z%{;1*Bg&P`bz3u4ucM`A)puECs)-JYrlKiaQUX%j<}Zzf$ehZ~GbB1rp6qiDj7w#% zih6!Z$)~iu0-38`K2@me!S!HPm?xOwX!1zz5mcC}*YQ%a?zgNn7P7;lsbmV5lmPEG zX=&^f^G@_`X+WrWGaeVI%qFM%LUy8L%nOi(FW#VNf`wt{1 z$irPlqYBloZ3q4J+~VRQ`Ly?1{qfG0EnBIs-MY)?%lFHt;g?Iv2E6#CwdOutrAp-k zpxwLo)cIDeT#@k?dMhitO5e0oTjUe(n>MZwRVZJ=?cRejm0G=OrF?iagvXE%=XUaS z-WDxds(t(RO8FanQbipca#VRF^9YK%as}g8Q6Xbg-V44C&KO-68>3NIpt*c`oUbq+ zJ9bp9S-mQA_I0Auqp4&Pm!zBY-B#SB+#^wjOguQ4py)Umj`{gLe&A4?u~X;FY91+& zWma^&-YFM=*uX(UHHh#jbw0~JZ{F;@f*Bw-WbiQ6uwhBOKFe1uku$uusUbs#$~T6b z4|&d;H%C70zAv68QxGF#TiL46r*}UA=@V+|)c52=peHPT!Iyl2cKrA=B~g*iH)YB@ z!5Lz)jhi%4!-kI3ceCfrP=^j443*C-QJ=p3Rogc0)UMq-)#619yplu|mf?uYWN?!Ax46JxG-_tx&sWtW-xg?^5P|_pDXw$i|)V zLfu>%G^%wslV;Ak7s(mdY(P#E(tZKxT?CGD)Uhi+&X%ynp|Jdg58Uc%e=eQ*TPQO{c4!w2DmgEE>@49s9s=9RPrc-a(x=HQYwM*^Yvs4k8=z5DdhlHXpDXco+$6S9VhWP=58n>A~$cJJP$7A=~e zhzPiAN&(=q25x&uda716eSWB3TUe`Nqdoal-~`)i2)=pxCYY z+$i_5fqM0?-%>|5?9gmexJW?dB@`*ywpj1Q24DAzHTaR zRHph|_Yrq+(*4@szo!nZ*qjs=baTRz$Q&(KQ0mmUP(YT_F{yk+-I1C5y$6eU(0~Dh z^y+oVl0`afh^#^n9y+8}u2>dN!$r%ME!BVlgVmO;TXgyk?c1y6k|x~&l1WTrH~sq$ zP_0_Ek#Y{IIkRV`BxzXEP@Om~`yNgJR$dei#E{@djvAxN%PQ1{4eL}@)oL$hK4Clw z$|+W*r6ua(bRJ|Cj*j zj2y~mjJA|9iZnfEPU;x-fBKonaF7gg!-MV_6 z?2%fdD1i(qtDmT^cJ11!B`xeR3m48;d-f!Ys(t$QQ>7)PI*uCk?bly5C~lyPB$ryt z)DTDQQ!IcuNJ}}}cWe{DbR@sy0$h+ugDTJfnF#|(QYAE{8tBc9j{1*$&MM=i!ag>7 z)Hux-X=?ZG-Ey4(qoSf>v41p@0a>gL9Xb%>ZQ^w{t)?O!D#?VZj5G-P4&^!mg zyP~3zwCS*xuDrP?LYW$hrA|oHOw7lskBUS#Lnq*wc-0ftZ4*($9u%ZN>=JeMx-w&}e{78I*e+u2J>x~~q&LXHJnhmfkp3dzS<$A%s6&-8P$yZ8d%XJ0|joSuQ< zn&bdkI0lUeRH`l?AEyA1HP8NAHSQ<(7mZU#_Z(EKe)501KsTp`ZJMec0y;=>hTK5b zWO#Q~`60*bVAAmG2V@m}I;pOo9IunE7Rm0YNO-wY0?6Dg2*)|CL{<|(M%4kco;`Z0 z<1$$ziMc_HG(CFuR@l>w1T|>T5LGQN@6sjy`d{+d)Voh#QS-I8gW}f<7R(hp-CjKj z_2}MHPo8E)kK;rqdD)>QOBbn~I})pprcIlPU2T|-+aS&uRclu3YyPxp+gA1M(_gMm zYWtW0K_;JGz4~e?6JRj3Pk>>?ilwp&KV*Wm>a|s?)@tjvEo#N`WGS^{r%u`#pmC$d z@$`H4>{6RHZ&LmH4b)*?HnK`lzqM`CRwgtj9}_*!92+*Q*9(d`Gr6#VjKu~((XfGI zTReWET2x-UwWN9YaH7uSZ`iP*>MqZea_lx9IeJ(-6zs72kn|HKOq9PxYE9KD)fOil znKYq|;$T8p5b-+DNBv@LcBfsvdWAR`z;Cc_!h| zp(C_(3&_u&HB%M|32!T;KBO;biKxW^pnjqz_oCISlFRo>W5Rm(?yK#p=HC8Y7#pL6 z;gr-v`nRk+;XuH1+%3;&xr`Gx=ChtQ_ zSzxkYg5Zs+d+pjavd~C=?hfDD@;AGQ($qdBcS?Xs8Sb~ZNk!U(<=xtiEIoI`xXD{;rN6IBc?J{d>v+89g$1@KAMF>Eu~f$-rxKYc7c7`36R`C#J#!`kd-m$B+KcmrJ+V3xlv4BO&(jhHHn{HHduY|v zjOo*K<_1#Mh!G=2A}rJ4fGPGgCa+<`N2*35IiSii;ig2&>(IWV+J9i5nm5<6kKqU~ zV&oWAR_aU&NGPoQSC(l@2D1qhCV3{+ zDp{E@{m9HMEn5O){XL)UDglzMqLPMK3=J4CL_a$(o@>^uRGT(!)KM%_28;6#01Jo% zSWvlu$FSj}^m79^&PtTrWQ*GbQlh1(VQZXjcPBN;Xq5HtO3=RYLU@_ccKI)2<4t9D%Nxb~`b`kJNWN(o5M z!z)D?AZu|(U)AC4!Cu*u!d5;1x;nNA4Ua>u&KacIj_;>$*1kGLwHn=1+sWKOX40GA z%F8FICSBV4N@T6h9jw}p>njqtxV=waDC)@eszF7WIwZ~}2i9y;2NtiBNlPL#AP2~@ z@6=i=k)Ykoj2aVfrGV6`POZl1vnkmBK#pQAR`== zC;6bwTQ-R^$_niif`kGs5|2JssWzF(e1k|8RcjonqNPX!1Nslr$yOmLY}%wJ)mE)# zBJMjthp$~*rPi-stFOI)th}OJjgX0yNwZoek>$&fVt1)>QQ>tJ)fVPP|4ks5!)o245ppRX0*G^d>iki2wvQmJ$lji40j1JJY zrY-%PHnN>!-MY0}{nosBOVw9Y#Havw?%b}HSkkl&WZQRa)vo@i{7$6tK6JkhK{hf} zsQ?h|JSwU`ya4y^*(<8jMhZy?l`J4Tf8JcZsG(tO#i*?8qT9H9*{HcS>z;@x{(%3r*Ak*;fnfGd)Ao3@Vq zdhVQAqB3>1v2ZqOFKHjdB4zceRqDWj1LB=4c9>p$^td6;4P@P9LDv!IDv1N!H;Tpq zRb(6SV(rnh7g-#DU*Z6~4yYA>+@m6VrBZUH1cc}1P8kNsN<=+a(yFQIeBl`F*s)bS z4iAe*VC6?gs|KYF)wU_3vDvsw9a<#|Gg(YSrJY-=?w6mX=aC)a(YXCzb5z`kBb~EH z8X#-`@v*AKfX?ow#P4^_uToq8E;if@uC@jATS~PK=MNGxu~FJUwqoT{m#1ivLdDCZeoQ9S>C@iV`2h^tf*ob&PTYhOqr7*YepufmDKu z5#Ye?wPF1_g~}9KCTeC|swAusKt_L~x;-R7g=3VVa#8(_7&TVkve4Qh3ofXyNN=r0 zimR6T&lO4Sn06e}QQF=)MB2yV!VP32MvfKfvrO8!UD~?X$q@T%0G?+&b?Unbn^{t- zn!NEE9l`bS%;6ar%*QV_43LqxxV%L5z2QR5X2p;HA&wo#RG%9@CUcEaE1&(Bs1y_9 zwn)IO+ZWE)YR5y{_NcYbzo`K(Dj@6p*|SyS%GSCrIC|_|zDYG`RIZx#L~G!5&gM77 zr(tTcK%g`D{5g@Mda_PSWGzK?)4O*c{lYjZyaWLF^p|gNwm^mo5LIG@I7k>eBsKz8 zzwZ5ENLY@Y>ZF<`6FjO&$dQU1X$3%GvO#U-CtZ30nE_N(JF`U%>84I1DRuAWY>2jj zZ1{-L8sM0~QMV;iQQX$I8ueOi^RodmRGw3&yqlaw?oe~}jY*O-XHHc|L_KU1DpPDL z4MYm!e`RH74SbrP?5i_mfJ~PiQ|+0!CQX`Zm9V*Y{~{^i6aobS88)R39UKXA!2(Cs zYxC+a(kcMKqGM^yigSi*PKe5?i2gq6m`6?EGbA zrBde--M7@;*y+#!U|)nr$a6TTA}|162!A&DucLKzNQF>lpbrZQ3A`=r+4p zy-?{cwliqnyjgnjm6V{yZn8(7l$SWU#z5k zbJg?n=j#r^X1D%@w?lVMu0WQ~Q@yCBoIU6PTeZmKhan!74=ek|jhl!Id%40H0+r(7 zL%A6ovjsBh$)q}TsAK%(K6TSHp-QV>I?AMZKvvBFogr2+*m7+3A91J%+3d>xINRC7 z3&@5@`AwxBOt@y-g5l3^ixw?J4eCf&2FL*6@#81j$$YQ3Y~38+{$POYfY|w1&ASOn zW%w}1c)WP=g1EB?5+1fVyaF9B&g7h^Dc`q%(E!=<<%`80xIHOxd$BVj{rV9$s@<|- z8wvt4_T(|1GzCmjI4~HGLnpE9%@F|Z+O3DaMWx6B!Yocq8h(R-%t%Iddi#2+^oLmx z1pyiFM>nZU>(*^V#am*th+i8ZgvJ2gnYI>Zm9Q$gq*QiMHXrxI+MP;|4L}3MGJSzW`YRkWJo3vdBQ) z3mG6oh1W+^hz7uTj@aT*qtb53Pa^XIGTPcfj!^QW_3PKgz2`y!nM_h%?Z;+>lg&Qq z8@IG&HaeTS&zU_-#%k(BMn*sS>zdV`c^#Es;g!1 znWF~s0y4skq;2x@3qW_0ai0ui37ardwpUvjFZ3h!TvWofgEB{;lpHAm(X=cbkm0e| z{ZdE89#rCnf6P?-=T@l}XZBa^#ltZSZ4vPEI=Led$YjnaY1Kp(%lFebwf@-lgi4b# zJALL%)wGA>K(q`X3;FTP6Z=!&n=oxKX=<%Rrrqy*_R1}ADzA?E1Q5b^?A#`* zttC2%7myj%;^8BQ;(MiRewCd&t8QI;=pX}R*oBO05vea#wPewOM?Iw0JeD1A`Om4W!AY%7ja1GE>0Y%DpOU9UO;AQ6J~x10y3>y zltogen~XU&4Lg#t2~eMX`}W95E%W6nxj%w{%(NrSub)H)*bWwlCkR#H`t?}r+dSk|n*GZST7i(c2gu9S}+-FuX z-_*VlxiumkkTJeWWdm~8OD3uY@&)Ow?=4XWR&G{ZK0QG-EH72t{Taa zLv-`8;uU>fVo@DbJ3k=nEY2Q{eY_Tn?d+i? z#ghU;Y~4s~GavyrtTIty)Bkv8LP)YhhTtXGNCP1DIO73mgN05ke+-aO?ldXis0vMd z*k3;&W5L6oN(hG?9D@uo?%Xyq`V9vgycv&+#D+b~ULZDZ(pZ4e0cl$zgXc(b9KpWn zY(0>ZcZw3AT`Jp0@Lq(rik+7|oi$HkM+sxmhkPS^(q|By4#;4okEXJYqB<&W?!9lk zP^%ZKUYe{9S0&pj{fhUpkpWCi26s)$(t1oERVGpw_P5Qi&x^Kl ziiUPCUa$5_I1*aR5k2BgAUkKTQrrGHC!ROu!qumF0WzzM8UZpU>XTyVHntwWBdSt5 zCx?J+fXsH%s9L*5d#~YUZT4h29(`MNt=K?XDWG5jlBq5ylyC?yM4s*2w(H3b{(bxP zlM^!cN1|sUe*3z!`l;eMcEKkl6r>!^axgyv<||KO{Kf zA)_MX+6FSM{#w04Px5T4WvhZ|i?b!c@mz8|8Cz-);klxAV(%3ytXASw0A(tXS>sga z_xl4F8%GyZUO3Y@$9svJvecO^5jdS-=W_aOj|Qs_BB|j~3T>2);pR9oY*DD)pat{i z>i!xyNL=G(D*<4I{gV?l40V$7dH&FbSox^SGbKMDL(R%z!q5)UTCA;FBOasG^6Xma zP4-1%6N79uB8$a7F^3$0Z>>0$aGoi4=*r4%H;~Z|+5_P!wt4etCGgX@AohJo+PUOzKD^WG+zMDs7`I5 zF--09O<1~LKOkew;e}|Q=wW!7G0D9RWZZK)4M$OVlZ<8g$9_2b^n1!e!ef!;M{BUV ziC1IIQ@BwQm?|(b_ZEf$vI?;|braju(Y*)N>L34~!fw`0>}E&z9a5`*^pDV$=parY z&BYnS-Vn`)J^NfQ>cH4y$B)@bS)45Y!QbLGuab7nRi_JO%(ZE*v&gVeC&UZ;z`E^f z%U@?^1Y$6V49I+*SB(G}CoQmo=Y$SAxQW;!=H~e`E&~S2%h{r}C(v;0Q;+VwWUp1i z{?tvpx|~h1vRPKI%J;>`0IOQmYY->t^F60=<0i;mky<7mmfJl(yMd=)Pf-sw6^}kM zq2m02Q_D)3EX^J=c=nTx%6O+ao`lN@iWANvI6*LZ8sOR?PBCn-?IWs|FO%oIJ)!bRS3bPc5o&8( z;%xvmdD!!YGfgw8zj=O~w$D*q-DT_oayS@m5nHGsK&gvt-sc1q<0wL#asD_a4lV#4 z&(QtF094iFYbFw?IW`QQEa=utUoj?X2c;h+fhhtbqiJCnATuQupgN|g(7)Kl8p^R* zMdAZ+Y|CzSvO1x*Phyg$@{s^pKp8axWOM)%N*g%?kx6IEmW^>~B&l=i$PH>eR@0EP zugYJo#N<+1=1lZQ^r_Mb8$>3}#kquIv``J1^BlwE$2A)j;Yk5e+gT+!Z)%;eBjMzb zR%IrGtxWjSPWU5vW=a9$H7zS9Ve0AEC)BG%fL4BDZAoow+Cl;nIORKM69y#9I*RAV z;mY#b#1;}}ITOs1XO8XfsAv!DMT>8)*h6sktFdvqT5Aq`(-$-%+z1Iw6&M*^W6}Xx zfvOQ*gSVHPu6t~JFqmiFMXC5rcphQ z;K~KZT6GAW(8`nLB{r%e%W0y3MQ2&#kl8Y5$Vrjr**cI5r3W&;M@FRpGxO_FVm**~ zbV@7;7kbWFtg2e$xl!6bXI+UgE1iJR8xWPQl{sWh$NH3w&r6@>g=v(Jz`uh2F|P7M zCv@e@_Ez?x;)Ph~VzaHTZ@wHFz{YBI+{_`qB?LyK2QnlwH`yUHKrLMJEpLo-eNw>{3y!tQ4xP}-6Tu}?nV&0r1ndjLBFnyuLK>ri*#Q|u zy@P)p-yiKAr*V@s)`@M~jcwbu*)%p9+isjRwv)zo8r#mD@9%l;>;3_I&z>_gpR=*n zdvSxaR^GgrL>SY>hOHS&ym<3;`t;z^8u5_y?;C06U|QWQI(V66otnVaXgXF^o<*az z-yC?3hwhS`hbNO3ikMH=b<2+(2J~G7Ay{KhNi~Q4*3cgQet@wDZ*oiSQ^|%CUkS^q z!I)jrf`j;kn3z+NeY|znai^!B_R>P!koMot`A2$;s*ct{ti?^5WxTGtAaUTx`@zF` zR`%;p7?vrY%6NVrrwZ5xPmQcatpBf*MF3s#^uJEL7X&hY|F4s=@&7uRZ!u;yQBX(i zCftlx!b-*Hwtbc9Kvy74{q*gkk;qKbbLf)o&DjINBboa4#7(BA;KE>pE&&AevDuc-Jik`=a`7W9!h5lmaGtNdcnTIK`ZlnPXX{La z9pvDb28`fA)^RY{#BXehCJCih8#ilypeWOp79TFj7C~XO#pZBIF&AO%%Lvua>1EFP zF4ausdJQ4|G_QN<4dh$wOG06{_84~6*N%IWP3*%}r4NkTI5;J9`E=2%T4*VGcJ_je z;;?W+y zkYkfPCScRrXc!LKZzQRa;(cVP@SX?!3`BNKf`n)3Bk&XOBZ|z;whPL+j`r7MZ?iBh z6D~`KW#xpwhq~OfRGPSp$0l_G4q}{YHZBdAKhxOE%(I!1ws2$Rt<`7cI55W3g*kqP zj{PthwtrStr7!?Z!;h39ZDm<+20M`cTPEg6>#fjNzV%-&aaix(EWgFF=C?m(3HX=& zJ?nNc_rKS^|GG9UKsKDkWeh(!ASh`d6TN$+2_k`ctcisB8N3eIgdOO<%1P{@1lfRo z5G86g98987`agY3boz~Ck7E%_1v&kPW4@nl*x_u&&2?#I9gnc>L)+~)gUdhdTmx@V z?R&b$!HR&ur}Xo12o-JV1o0CVla#VbqJ4e2*c4(tHCrKH8TtzAkQ8CMvb>Nv{P-C7 zfa$|)6QyN0TYBg%-Oee6hv#{~!38GS)|#Ki>cOLpbB3qOT;Y$4%7d+kh zOu4i5XBj+(oOHF!EgD!XL6#^~Z|TbAuc++{D3YsZSw_{7MQl z4N^mizN?f~Pk&1j$BcbH9f;UFS*|lNhTQv1Xry!xq33f3A?RF{=T3e<7z*#C zKT4nD*Qd9T-r_ek{PU_-(@!rAfM8elRnC{^nVZ_Vuo-HpDGqu`?C^`F0%GO@oh6>>3( zzN)xe8&&4Ckl)pQu30rH%izpMxAz|R* z9nJhAq;Hw;nk8n}m6RVmOkOD!g#W6GVhVkk(g`1Xaa%W{YZVnoK18bvD$AYVdApZB}aqHPJ~D zm-Fk04)S0`EVq||>_&ZvH=#YlN(82R;w96de#I}1c!S1m9uKDYJbf1+wJ!Lx_`|j> zlK8ihv!H3Il$?>iSz!?B9nUyPt4=@C)c!1HQ9!z`)^ZdxjSh|)wE$Li{~A18wzHp? zc`$_NZ`BX~4sx5(Ysw+0D;Drt=Sfyx9ZAQhQ# zfvqp|W+4$+iK|orA2}L0^8pn|#Q&1(wbuL{j3!qTM1ubF_KdVjD5R>2=SBCRnkmew z=#13tV2_HgKjc`XyX^wGVpQ`#a6Nn})n02Ipz($>q&N@{Sqb{JB%cJg zdXg{6Kx%<4Rb6jlyrOg(MAyzR!L8vxtOAVxEszg;|1n()8nY@-ES+7^w7}7ioISh@ z4Ykf`Vfv86;pf7SG=;cvE~)c7Z_w>|^_y6cK=4~~(nM1;xX$FAh;y!~yT)%^ETH+T zP2Pyu&Wp75S0!>1@*saTX+yApB5G$X!fwVfP0;W-&0w}+=IpY#2`JBoROh6YQc zZX_I$RSFNT|C`sG$bl(HTg|r5RKVbnr}X5W-vpv|kQ1{e+bt(zo>0^LvmvoD8Z! z!WXS#fkueXk*6Wl# zobzG4c2iG$IJ~TRk}sB~|DO?{7h0O!>vaE@O2QEqU)<6Wt~zZ!6w?w`_zznIUBjR# z){TspO4>vpyZ_hNED0A)6Qz43eEF%4QLNQo1T)c_Kfc(D$Mvk7*sIvel8;BlkQaKB z(8{M*N9hW}CNJii*-UR>jiCECNx#9tFJ516DQXwGdERypOXap>dlJKhnsAW;-pTlG zt;SM9V2PuM>37^;UIU%0FQiU7-PZFHvz6-;oTygvtxvF8LH2>$4?7fTs?PB8Y%|}e zGI=tDD8nNN{Um2Z1dVl}3btNTVV|o=HXtXs+uo4Z&AZ~ew(_DO~EiyiP*CD*T-`7;kYoW$rQ4@tHe<9 z3WcqYmyvEWnbb0qg<;jXl1bI+oX&+Vzt=g7tpzYJ(7lwHuN8tZ+ECtneoBVzX1nZnHy)K)`o-4E4f!zN`+|f>A%& zk4Ul}OZJ!tcn=V)^|dAd#;N$tIr{=ILUs4tDM>sW&8Xa8Y-lv_6T3AZUnPiIZ*6v3 zpZ=P(Zg_hv5Q&bHvdAtRD+>6RvREm0-6(qNl&Eu{P34^?-g~h0y$6>Es3xkAP!Q*;V)V~>UY3FwIx0mZQ zsIK*Vt)<+{#bU5u)S#$b!BPN~!nAh?-(!EoD1A>J%K4$H>pdRAB`m7yR_I_wYG*a4 zMYXEydkkUab2sZVJ$QyFPO6%&E*-iD(L%9}hZpk?oi?XEm?qaz5;wjdDTm8-dupud zO!;m$OJ&9N^@s%z=e%Y4qG7{HfI}D{$dJ-*>R;cyGpN_o{5`CRWS81AuZM`RAk|f~qRh0Al)T1V4ZW|7= z4Fg-rLJXpto4T@9Z0)J9XVLo7s3Dihu7UB-Y_qDu87%5DasG|%UC z+4ybk2q;)))D8d=wIOxm?EtwlUw%0}ZcXPmuT8zg9Q#;^;m^O&5fE*R!ThvTnxN9O} zvbgnj9&v@}u)MU4X*!tJ$e$-p3SZgV1Nw!(M*V75wz@0ak7pZ&05~w4tpyvT)9P3w zxjrg%pkqg{gJ*-4e(e?mfs?(cNpb$8V3Eg}%?qMAbNnU3hYS##SOS=l8t}p&_e3z? ztl~5@PJQ&f$GFMRgZXEYLVGtAcV~(-@8IOiHIBCMMnc*QTz5tx7o}uY?6g~c2{S9h z%4WXg@PPiY94YM;lb*1-uj6PR#=gWy(AYa%k4(r!X8iE=G3%MkVrKsukB9&ms&pD1 zyF}`53x;CwDgm|2U}11zG#s=W)%}bgE?8`+k&{z`HAQ7Rz-${U%2pgr^Yr(L5?d^^ zU_?>`OUVSj%}M}OSo{M^T8HDgv6xDK5fukzhs{oVl*jikVyxd-K^}7`#O{1S&Sq!LEix?@JbFI-}jfMf^^NS zM3^fg)(6DnFcPI_0`ro_vNFNg6JXm${{rmR|Y9+!)vafNc39A)AK-`N3Urj}&H$+Dt! z6C4w|Cy&w+)97wXnNJJDVg?BUvX*J@=1iBLM0!=`kV~PB9sroEqaP5>MxaR0FEF=R zDM$&Fk3g>aB^-z9^>54!cm9m-Fkrje^^g(O4G*0^sfd^iZ@{Rih9?3qCD2Z|Xu%)b)r1{aVS3(#v0dbOMojP+3g0|Dp7(iMR z02kJot*cy6$in{Peolx29O(7f_XPH?woXIACm>U!y@sbEA^X7iI(;!z{(0nMizD-k zP8MR{RcI*0bJGjUlCbK}(x_&AxnBE&wpW>I3nu+efw#3QlNrdT~oKEldAA660nlZIENytCY zBzoC}slW#njLUB|`6)yp1I71BR9|Y(NVW!1NFPj*kK^*>Nsrf~BAvB#aE^t#Vb)<| zNb7!()EKMGuOy-(3N8)nxvF6*MuCum{v=e6r4Doth59@#@X9y1kLH0Lj|d5iv}i2` z`89czowm0PqGN6U=bpHk2=PUy2PG^<;T~c z4w_>StzK*VWpQM%IF-#ikDtD7OPP2BkKlU*Mc@i#{V|c7KRTQ}n zi(_eNrxP-vACLPtSdr6PKN~NQ#^*iWbw|*~)OrY@7Hki_Ici zLLmAcqX`HhLx^8ylK$&GEds)(-vl;C9T+}~X)7VGL)Wu5-xwIqbR@KY6egWyBs=!S z*V11Ak$32o>mzu;MIs=dydKo--}6h(V2)ZeEavavIR+yu83hbH?F}H2Jux8B!brma z><&}OSc3`cl5wVxMtC9x!HPz5sF0P!cq4#jy{5wS=aQoSA0uUVmt)6pI55NB@oF(J z)8(s#dJ#L~9qCSD#!jadakPF4@H%B((oIX*8riIO<9`j#qKT{n(ysfG!sRJ202<-%4g3nlySh(eM>29VUgT*U~Q zB+j=5*-saU$G&_s{4P=`8=h+P{^Its3Wmd3Qfp?97Dzu=Gf7Z{B&%K~gvlUDhdpMN z;x~kYeqZFHT7*TxcSZ@O%Bhs;da*8kYd~o~)2vNnwm!%Q#XB-!k<(7-p@OytDCR67 zC&b!C)sF#;pnBQ*tWvy~`DXi!$i#WRYA^-ObJS6GSDc z0)IY=M1C4gK9G!wpVG?8v4^cB7fLZHh2`p(IBGC=hTch7Ug!C5I5x zmq5xF*Jk~gqgSx&P%x~;s^oTqJe9^w4u{A_xc`KSJLt!|IPa`NjX z2I0@;A55HgN1HO;Sh9U8W~j{us$qA2ryS>vW62ZIq(xqsar9z3Y-0HGe-rcAy)HXj zOp%>(+`bE$6aKEzoBRMzOJmh(vL?-lI=_C5)y4s_vYX1&EuOegnl^MWMh(y@fB9NC z&?xl1plk%uSHFN-Wiu&=u5txCB~_!$iKXnfVD;Cg$<+$>n_V@_RENYW?ewd^EMB(9 z$aPDt`FNnUX1B@=o3{3XTLM~INz3X$G#??vmF*uPEfTiyf78*Y7inOt(K0ft(E12E z+RLO8TJ;0ox4eTX<0fg*L8mk)Ib8+2hGuPsAG(^1W@J2K?}Yr>Sj%8IR+L%X zQu=*E+Al`=U&UZX)N8fN)hPX-9UULi-X2ctE1Xpo_lYPUcvKs7iW%#Kqmxq_0qTt9 z)eUPz9eGa)D`ieGE}Rg!{p|s_o$(DGSrRBD!{YVf{F*Ls20Ohd;f*PFI_AC&$@F@l z20?Z5_FytmipR(XI5XE`6~7M|Fbc2#J`xPs1pE!~$rATC6!3XS`oN4WH^9XNC-`o9 zQ8HiHf(jX7knw4@D;g`34{=}ys3^aTL`Fs4_rZJ()zqxkty48v6AD!akFPH`q0~wa zcSXq$y*)v|RFO=-ly0A$A)65ZljRkUV)k*b*RC~zJ$~$+Vr>qJh6YVT{>~5}80BV` zcRC(=2*dR#zT=Ln0vQYUia=3^59003ezle;QeYHekL$!YwWcO42s{abeBF(*xB+{y z$np9$6`SE>VoQYoa1^_nKVt0i()eiFn}%&eZ`LO<4z@GdO8LML0>e_SAg6){ZoO&N zNC$>Z0XZMZY9Tvkj;J!I#9S->$2XzOpk;(3k7cw!D?E8zGvIXclZ-#fx4Ak`$UT$` z@h`LeeZB#t9i08mngazmk(Z_#>x}5FX&lrLpQw5AV!Ii z0#n=KuDb)PT$}vngU|yhmy*KG<4>gn!sBv`H@@AE#2CMqiN1cOQ(_mn>>iGE>F)ZT ziqazjXnT3e;GCWel~I78%Ed_iTxZRol|*zf7=24`tR z1Y;g3fC?kS%y+`=` zYCG0~Xg)731F0PkL0%A|2aM$l9@Q&OQn_R{>4Wi55TLl|?ehEQ<$7L`RKVjtcZEvI z9-nWvO@KtQ$v>pjB$?%)WzBd4!a&BNkHV_frM_IsP@`5d+Z9uxp>ZvuvAs4&q%(-E zaEXx@bk8az?xWB4AQu+*o?)?`=OPHHMx`dIkP!k7{ieXuZy=)E5bzKc1#Rytz(jdi&`@GAn*A52VEaTt{r{Av1K;4o{sH3<$C3BojR zLOw3iK3lRr9f0ZiKR;Y<)t-C93`mA0e@O%1y^ONR$!z42oPS!=%YaXc?ZT$@1K)1l zLP;8WGiK$Og{|Q1;T3jNTpb!QMgjD8U+O;LRYZ7LPVVzuxvK6k+L`WtfiWT*hHCz; zV`2;0H_RHh1=%Rl#p?RKo;=2KgM{VrS~-P=UfnO+u*edh^rX}~%wwtrzr~YB-tK9~ zJKCCc^wa&)i8!y)#iaX6<1b^obsuHqJM|%MCd9&cXIV4j&zQ1EYoW zC=Jp>>?A_-4vaWYXBtYIADI$-5&*5ODWW1356FeW-m{?j&ROX@#*ZH(C+xI)If^R~ z>2<^ONhyR6WUz07dE~?o;W%p0pg>4O;OCLF63(k-9r$PsiiR7mDpHimzey*9L^Cwp zQ6fh`5d`5efnmfojD_+Wx@dBQsv~?g`~u)}Sk2aqc$9jG7(p)Gud=(HV&||pQjw#X z5lI+bSeC{~z48#mZUy%J2@uoTC%G&a#y@dECXmfI9{NI|kfU@;tmm=i6>h>-AIn0a z8?%zBro3cmxcW&PfjI8CBSr82Xn+V#^+KOg_AizRV6-8rkjOH83$F|8hhcMzEc^0! zS(nI@9nv8CH9kLao@~@)qvG7()7Ut`SQtxe9{kZKTs*v*#_h1uQZ=6-@yl>bRzy1V z&T<`kVwT#GjjitTMA|&DAgD0b-dJFp-)zSe^VBM6f^BoM3Uj@om3>N@t8P0TE(Z79 zHvIcqJeSds)kp}OGeo>4y}T5t@Vd%Z3xl|=2(PGU8rXBAaJ>9=IzwMkmB|S zNJdt#L7tmC+>Mqy5R(A39{nEPs=Lb5VzMu@N?R4!OTb&>_F}HR{lv-_W}C33&7dA1`srGj36wK*C6e#Y1d<$f8C5m=Ncy2)X&O+GAkG zz9lKH+DQDz`1O`}bRf7D;CaBz!k%cKnR$lHZZerd;>0R^Z%Siu-~r85a3vUP#_!1P zQ*bQfwPRLDQMd@!vtx5D*{*gF|C;xrc{59huqdQY*g4qLnh)Y~*~v>l$Oodzce%C4 zARDVonI(8m;aw>C_x}(+GS(mwS)J zxeqKbY_gl(hnsB)Ffd}w+}QN9kZpt1YrqA>VOA=9<~orbdoM7#D3owXG6dqNob4i+k3 zkwjdH^)tgrpi|(VDTg=#@XU1AeQ48^n|eGH@l}ZU+hE4%pbD(`{LnOjQphkRXO$duN+_itSwIOtHf}EW#l{T7YaaSTca7Vgr zzkcK8zh;sr8cO1nh0X3At#D~ozzt?56T@YV!oeGXQOvm`4IJKuI-dEuSMHL^;N9Vn3jHrA%?~Kz zE|QVzpvBZs3AwlW<$X>5vrtQ{Gn$zaDPzImQ@m1S69hRJmf@uJ`S)bldi4T$q1vgU ziAcm+;SNY{J+P(>r_Mn_m!o)-zY^!7Tp{QKnEc1t$>3X3x#E&sjEPRd2LkxP zcE#&7(#+XW81d+oB&w<_X5Go=eclHX0^zVYbtu>xg4qMb{8bSFE89{mQlR`-=AAvS z@RkDrtl#*`eT;euZmY7Wz7t`?p2TGI^|eI3Mi=$uA7v--M8C873`qhLoYaLg`hEr$ z;Za4d3DNUikc>!G+@D$3+k>j;O@MCd=8bh`2L z@rfYM^ttcekC+N_E0JI;I`qp>vAlwt5rG0Bhx>?1gCb`HxQrK%o_*j`$xSB1$fGL6 zeygI$-sfd=bqQ|IEW@vHVDcKwc*pmxYxPQ{Hd~v79_{yahCCwwmF_F>-DPDQmG<4| zX3J}lr1eKm10fipIIIW=2^b;&h?;pSY zk-2^`amZ%XCDc8Mvi5h0ailWpH!9AD^WN|d>gxHaE)g9gc{l^Br?q#&c97e8 zgGYUhD+bcnSBUf&Y#xotH|D^p*E-Fif#zytCL?5H;vwF?zP)UZv_1T7 zLi!5vO%#bH&kS&!I5tQd zm)&%n7}{!6Ag?WI)faG<#(#}-(m!Il^&t-$qmWuNObM0UQsy)VNS`+$xD%%l8T zF0$NbQf0!>R_@+8u5)q(r@1+z!TcNs?eBS!s5wj(O-)Q%OaMcbjE6koQKcBCh`5z4v)YyVUs7^Z#sUv zW&G>A;ZDEi)mMG9XOuG-YK&v}Ai(mJh_Zl5BT5R68Vl9;!LjErmqvUN2^Dmmn%XD( zi$dVY<9AsAPxuRjF-Es68ML~LQevH69sHnCuVUf%hgC@t8)t6Za(!PJ z`7#TX+R{d$Qjgeo!5{_sh>l4cC@1!R5DkCJU(EX?<`}h4!5}{2gES6#JUhnk9%#x0 zOMJtr$&vh@@_;~%u(98xY_;QF$!sTx1zOE1CPx6UQJ5l-_5PF>PLOk8| z4ZU1^lX%S25<(i*6hfLZ-JxJ@she3@w%_!ld|N{Q6ZHc=mge>G919jP;1xY1fq{hl zq_9PdB^b<~k3)&x>;9*_DNUI}mY`YjKW_saz}HgjSIiS{F|xmxL=~-ieY_OZ=dy6JqP~ zO^n-1bFL6D4QP)1Ui&i%T@(l3~5UR z8iU7t`p){+ssu(~7NAU{>y2*2(nH}={rJkn`{r>{@CIZ~+Q;0~;`sn^5UQV#2U1lT zLyP@d6=i1Os*zCa8Y(+Jt&y#!zR-!WR=f^a48LBP=~WHFn*Pns!T7WL(A2S-(e13) z;7_DNy0Zvh$|;Y*OQm=xQ33phu%Gmdwmfkp{pOQA*>hO`j4k+U`0pWbyi}RE!1LMJ0*h z&M2p8p2Kw)D#xB;#2F%VHy}a@_VDrxI`+=nu9XWypmTIO{=>_qPjhNu@R?><;uVgh zl@dQ%1#h0yKbF-R9WEDa^hCQ=;74k^nUA)DW4-@}aKyT3?G)kuG$^>61DfG?&)~D0 z%h6RDX|BYJ_IzTz8eICs!s3}TIdepyI9fNNJzvxVqAM#>%1AbK?V~Vz1#EqXyC46p ztT)Iq&%BS)brk|jb9-0B|f21U)>>?B{3ry|0QnG-MVSsU8&af^h z;afb1@QAip5}mBwNf2E|SIuFf2}%e~6*p!=R%Z`1paa-%HunNl?R8(XaY>|vF86=w zu*L?83qh+C%wl4tftXl|t9)Til>rS1U_>fAyj+7!M^rVSSosd%A0RMO>>P^rZ(*4e z7lSd2%SAGdk{?Q7_NVgWH@;OgcSZP;Dz_Jd5wFab5RSlK8JV} zL0}|_N)(w_kApDf0wj9KAu!7oDA>tVng7=ifksiX`M+eqQ~JI zfcTamY{w#_T^U4|X98KkaujIUy03#fUiOPRLIr~5DEEzQvg!N1(68J><>`e5$TnnE ztoAbp1jPiPrQa*0^NBaCx&RYPpo^Fi_#mv9nWiUH7Vz*jj-$0oO(o&3Xe&TFN(=vu z`KDEVOQZm|EaBcThc?;bA;Ikj7OCE24-C|I@49G)iBiklZMyN8KpiN$H=0~jo9Tg^ zApgOC?0hE~^N?ElL`%n$d?&rQQVs`o%3h`fQgc7jj{dxI^l*}do4Gm>4*EceE9%GU zx=dUw1y(Inm`VS+rlq*td9E7#garfp{49tQ^ZCDF2xorKz68V9p8|DuIA-IvGBD}s zE66QYt0ht@(venaIQR#l1e8`|-7L@I}7TwWF!nsup2(j49i zT#BvqTzT?#BW?Xuc6%b)DOGGP7elkd8p+uB_p&se!SYxM_FqYhw9Qx!nqHLynUbYZC>f zC=UjwHqbh99CIHc%|m{i>>SI&TOCsuc>Qyvlcm(%@Z{-L8q>% zreyXjDVvleAzaA+{STVc?m$E`Umgra9jfH9X-pkbu5@sZ6bPp)fLQzF<`j+Vc%3~ofOzFYPPNMRy_y>bwi=uM*Zd7;){FUw;yb>L!ychIJ`lLVPSc3(*}%P+d2 zZBt5GQW^T^Pvg5Zr-D42e9Od4+E_w*EJ2?aIE)2>NhmT5pJdaNlB~*z9V->n748_Z zmc9#L3U%F%;N%%6zv%q!KkoEjxj1>f>ebKI+f>dr+I8j^7g^-Z%}Xq|x*)U5-3jf^b~P$N{K?EHC^wA9E61MY}* zvP`jneKiB$SKd_COq7q;oHTw5cM(k(oUjlkSte9HfBv0;9`xRFqittO@n1PP#QL7s z7zt}^sa78!pZ=ug{yd~iey=c24~$a>@uRZ4vF#Taz{CQODA?B9pKI5djhkODW(Kre zLZCCNIDMB>m6PUvG5n=0zL*xw>HT<2%EDT&`3w@dzSs*2(_q0kQ=ygv1hA4za8sNJXCsTdFQ_er1J+9ytQ=wu5vd3c z25SH+mVFrsBtNlW@jsr;881`}&^V@~#yuAn;LT2VUZFWiDn9KI>G$HHLyEw&>`}^o z6KuPoIk>C!*u=c-xHVtb-NQ+0O{WB6LSXrgB$k_IYlL;p%*8pf=~&>z#XASeW=sYF z;nhGGkw3_q3Pk50-Vor#5%y+|#>EhH564Nn-CO>cz*!MJ7yGH0sVXAf25tC@Mf}&V zUlcHi_;mH7C##KKq-|#p5lV$ak$$g_k&~GmHw{9BZm-n)`XZ+s&jkqL?B=GXH*MI# z0?n!RhYvkgEA_=xG$*8EW6ep>d)I%-m593U)e`iaM~in!cv!*so(Bqz0b;FyH#$Cf z4}LxQhnK49b!^1BQ1S1-pl)Il%)X}C=&bmTOcI$dkdO&nuUHl?;l>gqoGs;^R;!hC z#{k%P0P=CmE`BwGn8rP%D%>fhC{SFsD}F+`WW+J&r%NqxvL6m;wCc9qBW<5=id{F= zsIL?eMxfJ^l0>B|qBo-Rz{e3Wagl{u?AFE(&40k6{ChRel!Bvx-&HeR)&p$Kar@_z z_VebZW`t%oXqd^|vuH~wdGXy3_fg`H7yPXVpZ<>quK&QKPrm7x&vwE;?vbbZCpi&% zU-{!g+R-ieTO`PQ6K46j@dx$tz_qJYBH4b6LD~u*02tZ*Xk5d$PFxGgHPGM*9K!im zlg%5hU%o8Im<8WCLJ#r5x$emN{M^ubGKiI9X7eYqMy<-ATVDKdQmXyoT)Z?kTO2qi zee$y3>Pk73d`{4WsJC|7rUlx8tA>bhc!WHRW?v7<#C^Y`tb3a>Y2pjto zZqy$ZC6!d-sM2a^;d=vDDkIa9K)L;!?D#qA1CSz0xl#xKU~r69WC$FYmed>Fd$K&x zwwLR%at}F>koWI3G5bjC{$wF@-9qkJt2d=FYU<|(D04~?IMpKi`t_#=lm~r_?IuaH z{f4bo=r(v3Z*CFm0UCUfp(3F>iu3egJceVWu2!W6mP(VdR9m0@hB!mEhQ_Q1p^;DfnvTqNm%TteRnJ8dN=r^d67X@#%-!yHZ_-e&@t8`B?0l*Ke&{PqN#hHIBiyS=d&wJehAf|Cqf6yGlg9- z`t7!xtm}5;lKI5%adR+;$+{h= z2$7YwZLyGM^Ug)%BZ=?N(*}DnL2dH#nljv-@dht98k%0lMlAiig9w9{{;xJpZ_7>s zDsRx)^nZHe{PVK4z+oAu;{t9}W@VhiR4gw+8R4gS)#? zj62?0k68-##&kC{+rHR-pKAu6Rj^#;_l|-Ak3Jelk8}%v+#18>e2$?-$u5%=1Zh{3 zSORT6O7Ln?hvSImGJEEj-|$CUPH5@zm@za; zZf|b~?>X1|#teR4Gs-pY4aZ(*X#shP`u|Es>|2l3nN3F&hdTEjGU=6~9C?ATut)Jd ziq%e)Y$|dfJ(5h{=iW^DhJ}iTV-7E&ul?dBliC>?~8(ioBZuA7w ztYVEk*uU42ew2E4@T_taJ~7_<9QmVt5ntIB(-YR|rgx`I+wZoj=XPIVBT}IIUrq zuRot8whn3NNPygqg6clCH4&*dK(BL8qLy&{QyL-?(Q!wkt0H+QF&;6&;j>_H00F?F z(E~Yc0!!BezJq;ND;Bxl347jZ30~|^!-5|ao1fF&NS1)P9IIu+J(Y0KqAc3{H;(Vl zvxVE~Ynb3mMAwL1=0kyI4b+$WQ%<3E|KSaubRfOyaTi^=0L^ju_L?&1fUYXvBH$sp z%K7aln$K1Ku-M*EObl0v)%AoVN4G(;Z5IDf_?U5hh(MEY(6bYeg9+b<^tbNy7^{y=)4Wid*X)>svwkfoI?GlV6WAmZ)@cg>fZPT1ElOWH^?Rd@(CoogD{VIVb_G z(5)!+8%{D#ji{lYx-bn3RfCFK=?JNtSoLDNG2LBK!!aMbOgV`tRNld#zfjF8rta`? z_CGH+ystXz&Q0BRSlGZ2D0Bq~c-;^5C@eEQU~o&fKSPyF)0iGN9zo}}e^^9Y!vvnT z{gkw|rPWO(uKyu0?oK=AJM*?d5fxhs$cB`dHk)up==}q8#sc?$%``YxU*7EWx%U^= z^1HmD#kK&7S9oD#dx|5LINv?F2ZiBG0d!;GCqkUebdLCL`&MVx247kK?o(X%Cz6y# zkG<{7-I6#*Tg~qv&%^VU0m@uoDwbK+<;a&Elz<6!?C_4Ow`sBKu@qag-uJ8R{u2W=hXoYKr3y_?5j|M|zo8*pl&^>t69}KNsAQ%b#%RHFSvtGc)!hYneyQ{f) z=pp}JQXIG8mzt4!f^Yw%8FhhW(m-0>-ijUqk0x7@a-fdVrj%GV`nuEMMu8yxU10TH z$H(nvw`J*{Fg>NcA%(w%;~aDLpUk-l=|Fb`=Rm66Xo8jFmfl14<y3S0mkBdi zPqn~(Z6Z0{VDLt7XY%tT^p=`AJchCkE4`C5rS_Y9vyc`#RTlSoq?b4 zmyp*>W#jPA4t}pb5b9kaK;CbJ6=OH30iW1s5JPbPZR_&^D`(ofSag@fyBRBBPq~Jk z^zjm?__Y480O?iavPWYuK0m|lXC zlQsn}asaZ&Tv(T!QFbVS5Df)_WqY&e(Cje&994Nne~nmI|>IrjEM% z@&h)VW-%=H)0d}oXLtTvPy>mLwEgj+f#**SJydO-=A;RfqgfaZV5ln9tXSIXtm!Is>g5=nK zExi&nEUg%)s^aFgVMUh6-J3DM%o0$I_eNR(XulUQkpv^dt7mGko119ab0rSFz#(pI zefW+E&#!AE7P_dNJ}^Z70@-@Y)WRw9@vhk79G)Xz|3EtPHuQ3j6~^%m{EFLOE0M!% zUfeDL&m)Y=gA!DVLR)%6_;-EF=|9*`Gyi@!Ms&=eyYJNHGD^O+pXyIeo%PxENf@b@ zudwC6Tho4NmKB4?8BR&)GY}Z32l|E#L?CRwa-Qo(-Fw#>qEOv~L$Z-yUvzIai&+Xt zJw7>_!^BIYSv8QnKA+Y`0vL;Y8kiX`L4RL5>ubG8ZQnJE`2t_NntVML5}Qh^$7kNv z;)+A--yL;VeKBz2kY-UXkc^5LI2^=rb0Q2IT$WKtlhZlmGVIoq>n@Myz6W7ERM`j& zf0O0m+A<70FL3lF6=4H|TX#Zr0Cz({SL}MA;$2MmVxvZ5yXG<--_4b3HIM=Mgg$+h z>ShYQy5Y!AJ*_S0)z?SF?aZbj_|((cY;U!q{;}z^rK()j$@Ti?BFJj1@00^e9$b6h z!+Kq5@R4PPSUBR?w7Y&gWg)Q4X3Ux|0I7TJb#`6)q|6+zZ>Xg{ldc+@_Hn{!$&c27 z*^3dy$_(e3dI8eVMOnoM+k6||8hrh{_csXri|f`e*W!rRI(ud7ak)9@_4Xs?vAShL zDpPI}Ubo(}&hx#=%A5aNI^si*7UO{*VnKtl{FLU;oD80OR3$~tp2)q$%vw^Ew1@og zamLS}G`@dy1SryX#{f|@v&Hs+rE2mp%Y}iKMRQNFhHLNTWiZt-gzDSMEP2%P(|1ad zh_^R)SND~SLy&Ib+R+!u;EItv&`Q%0NxQAZ`~4D?S!7jSUVNjEkACa56*U+gbt}W~ zwPk6>S(W9{MIm#PpI|!igRezzhzx^jd*05|MG#rnbBHFh1`-Rq!*y2&u z#PNUr_0mXru58gHDj9eqt7i7?@Ai5)TMDS=T(nmZY6-mraN}!;OZpz9)Nx9>Z}`-- zZNjauo3G+P+*<3~MY}yItx;`TdF#K$wLy?~9GD75`bFC(xRTfybo(BjL*P%J;HnV5 z4R{elR5}l^^)N?L2*)slMf&6^yOzxXGyTtX*IThKbkF75L6NiVhiMUF;^116F{zNJ0)yAfy#CGI03+Q+V8NZ3y`j2 zV1cw3_e<=jl7q~pj9pL4H*CHsQJ*)5f{}5fxU7)L3kZyIhm$Y@&5nvPt-Y<&$((Jk65ZOH5dmRfA9(tUXfEDM}_oR3s#j( z-?48v>-LZ^h~}u<{izAOt)Pt*U8v=JBj%y)J#rOrVG>AcSE5M7ztuh{GbL_a!pHf9 zyyfIFXRx}(hm-{06E-5n$zC983kg_tBh3R9^tEvt1Tv}p-%kxrsIIA4zPA0t)D|kJ zLD)xKX)}Iyc5f%vhDY@m23s7Wt?jC5|1yKgYv3CJJrh(vRFp39agy z?_dwWiqh!OS}ngPHc|FUB@iz|9;)!99SD3|Nzu?BT<~=2q+?NW$)+Pg^0~i|!RlD6 zk4}pVkH%vbQQ;5*zVDB?DJg;M>xd}{3WnE353BxLvne26vEi;a5aZ3h<723H)GclB zpQF}FkarH8jm1UQO0+w1+pA#$q`vpD*T~TnL8~cg;nI%y(<`D4Ou1$|b0|EJa+@Rf^o_gf}u=SQvaW&Dl zDDF<<-nf&--7UC#aF^i0-Mw*lx8Q+5aCdiif&>jtZhzffWBqu!MSs;Hd)G4R)45~d^edE_UhQ%408=9<+Uh3LrNHY}PaWXc@syrZ zf0D>XY5si_@SIkfMRzOga}Rh-s=>SdC-U_DKQDIN?Jx4J6V%7`>yCN>U9-L4`%jPk z=aZJ^nVhlMum>U%>h@r0q~4IDC_&#LW}OC{LzD&4sPRF9q{3bk|NS_0N<5-*))R9& z;=g){)7ivjis0byXnm2ksI1>3hRqt2indgt=IsWQVFH{Ci#;_g{9o>^d6Nb|J#aen z!~uP8%53Y!$*rh(l2rahk5J6T9%xxijiGz4Y&}LNH@zF*>^Clu8xu`sMt)s>!f~vhRDS^{d9uO;Ni=LIYHo6@077C)G;hQx1kE zONAkKViIJ#hDc2dq_GTCuKs5Vm$$gwhcTdp^F3iQE0p2;0!8e4N^1gZ?-9R1iQQZ= z|AArPr4|Bj#X8oBmg~T)kpH5Xe$NdP$U)*u_FrP-%I(iOnB;+PrY_5RC(dEaPdgqb zb!PoxV*n%%Y=hB9uxo_%IV95GuXN6>Ip`wdaC)PeD>6sawm@oM$Bj2T{Cq^=XM}v> ztE!8Ld9kwjhl^16#~yk=9Ri8nKNJ5iUmWLv>Z)Rai5IC-(%7I|f+IWP=j)(`XGqsK z7sLhIoBlj>Df)g#=pg9`Uje?EK4GNH5(ov69KhA1sqTrt1|g~;zq6nsQeSXXSO+;7YpDGR zT2OiBfJUDXzt?%PuonwvP+ShtwQXrdfp_|M?@@uS%=Ygdxt@7Zy_X73%*bQf7S6CD z6z}*{US=Pw;^eF>d@GXgaVjD>&DLPw9D%5B=VckK96q@dBF}@=`<4Q{1A3&jf??T# z(VN@z>f#(w^AP2`gHCDQ9XV^Zxve%b<4zD7>E{o__ztTQqtNMs3H2-UDQPqtD|2){gc*rxHmsacNc;+6%YN>gY33lGfT0JgwiM zM)V?W;?P3+i0sL#r@3O+YQ+56^~1CkVc?e_~IS^$4xx{yuNY!#PxTq z;mr4+F9O?1qYbwkPCc=ffoDS}qh&oIJXvInd=hTFrr?1rRD4D_wJccwcGI9hXB{U# zy}&1BhO0Q}hShDackZ`sL@f)Oe}4CG34c3<$ZzWzf9IwW+EET1>AXS7vnGWe*JC7v zR+^t8bN<#^q2!?RX?wolG-K^hyM%HbfDJ!!K6uc%DJSzvh?$%mO|WTk=ns?MM+7LL zWqyoLxL*aZ24?Pt{_AGnemmLm`sM%k*%n}*G?qi^mr8aL<@H#u;arzp}1hP7oD3+m^H zK@-fG=q`KSey+!nKFEST@w$~Bj`!Cs!_kBk71)&6zck5duYFWw5`IRl=jeqr<;eNE z@U49IM3%xg`MfcRvU)CVAZ=Wfk6tW{;M!$x&CevZIpVAIjKr>6;P0`K`{in&B!F~X zA*jsDnu{1`@8sKNxwOxi&l^x*{Yqb$734t)09FG-mx}az#N2F#0c>=S+d3sz!iF(J z-YFDJm+sutDzelJxcXBP|Y?S-OIK7%1hy%pQnWeCWS+{Q`|DRfP(!H=s8 z?)IAqdz-#$)0UI`!05DXU90{plq6Hv=t>B3C@N9}2Pf1nd89D?}@m_~MbyU(fQ1 z3gZmhF-6@)D{d0&fX(KmKN{%t=U$#Ue-A40iE3n@}XyJ-c_! zj@SD~{=L@4YENAM=zzL56QlE{ zB7g6rufNK9DYTKD>w{u_;jqHnH9L=G|MfYRQ|C^!J>~}ICMjs*Z%WByjRnzD<%*O= z#}<2t$rrz8Zj`R^!q9)X`?fDn4;Z)AazQ}f7{j)Pd#J}9U*1TMNHq(BfFt{TlKV?F zD3-{PGaorUA}?DqDJ<-5S%+Jw_7+SXDhtU%IT;y&jON&sT0FdIkypca2iy0b5Bpix z6J%U)u3-k=4P$$1wV(TTpZI?N4Y!zFQBxr&mMzFU3$mF6_nNPVEwz_<43( z$vLH8|HudE%NxAL{xF!q)KN`%km(5&Oh2t&k5LKgHQ)w<4e|BX^bCJFo@-+at||q_ zVXcsN`|au6v$OUJ^i>pe6;iwt0X8eZL2j)}H9FBHM@Plh-@oiT2tbOOOFb&1 zV1XYk8_o@WS|Ce{I2O9)sCeaKp+`e{;9$uls{G!)W$dqVp->5Lh(WXFdeorF51Vqw z4>|3Cq)P-|-e}pn1Eb-^`-xp~sdVW$adm_dnkTfE_jvJQ&@xp2bQS>c;02&|I~ds5 zj-72Mh1-*IxSaYuuAMeLP8=|uih!H-uMO0KclBdx_E>q zxn5>|(NGVQ2f58a3L+?*pZejwH(!(0IveD$G+`id>+W1fTT`4iSlFw~H9x2|jPeY};<QDQTQp~?7dpS$~l-Q{}Ym#<1XQ4E^#-`exU(xp_eEX zRntibLvLMx8T6>;{vF=Z*ICEH=DT0MTiGPN<5+(UC2FJ{h~;(!o(i z!NGUm%7<${!|O8CC7=TF3c+sMea&cN`;N~!+5JiNi@wcR$oM$ZOYBVIIfY8b5hRv) zUVgmXFy8ce%}Zv{^Y5WrDRimpI9e8bRs@`L)cW|vOw=d(N8z)uKSwh?2*&EB6pa=R zCZtjXY4qF+Z@S43hC09e z^=;=U?@eV49rbC6eS3GJR*pLPqA0Spx&86uo&DxG=bu<3wL1*~Dn2u5|A0|QJQiTB z=i?#WoJ0@W&kuw$qZSYk?|~#eOy7#2&b56wW_{x}M8G$xgGEF3Ku{3+^7mW!i1f^y zF!|;mPS|c-@3XQDmroyTd2c2ygP}F=$qH=dw6Q8U^1VO)K=eDPuQPD3;lBxrah(c3 zDjrpDEhfHRMYDS0P^fvd|3T`N1zXQ#)7JR?17@DzG6%?s!>(sMSW31h-K1rT{yTeY z8A#NlR-K%gThkNBtD7p|&DdQ1K0)_}E-p1k#kZfZ;nXAryPu*;m`EiVdFCX=HH;0v zX}aqXQtQttWpmN(-WR^l;tHlVQ4ELB`lBCr{_!SOY{7ir&t7N%u)iPwU>FQ!DG;rC zptWC~^+*d`-<*iK-Wnt@&Yu3mx~B>Vb>XsBTnuUA{F(5lfnfJon1v?}9o?R$xF?uf{=vWj&yd)uP_YSNW^lw0@&c>^) zSg!^wTDX5c=vzbm#)^(h)!ciQcfc0U%k0v2T#q94B)Q=M#o*P4*ziR0`(X8+mqQKW zkpO<}OypM?E?)Pk4fR%5cUs(H5EL#&rHHD;=;`9%;8g0v+Bh<6w`)NYVHO{+YyBs6 zq-@lR(O&qUDC%p!SvDkEZs9VIo~pU~ueHQ_5e=guz{9Rr&GYF}_a^egEG`6O@Y0Cb ziALlw>b8odgf+&L1SHh8g7CKxmQbs3DWxw@_GSjNWq4xjZkdsV?X{98H1vXAJZ!6DMR?;mHTS*8t zOw;+K%Rh^oE*sOR4&TKtUM@Z^nHLIIYp{QX;d}X=LZ3`8!60u`^;0{-tbz+gY!iN| z?DJmQX=%Tf{7;vg=wlh6ZXUfPb;u`zxU{bhm~>-m790~ICqF064gEz65TpvIcR%ft zFNtI=vU3^x-%8y|AuZXeROcfVt;&!*(_94|tCA*)iEJ?Crj;6)|2MyorDroj$(XW` zM&z)|Q2AQ`5zTup6DP$1@hLwyrC?mpOz_|6p7l|B z7eubeeJ{A%HSN7xnl0j2DK~2DuIV(}T2MO5G*A__ATGIPl=6nCev%{MG-T#RDv^W| zn|jx+*T0xnqPTPcX_H_E0W!IlL-{3KDu963 zRtzgQir6Z`QaM8{CG-YkE@Si`L765{OHb4E&Y0$JSanb7AGG!cHk1ePreZpvmQf7{ zDKdX@#l_i^)6>pO7jZFh^^(!q5}*1>m;?jEnaZNZ2_!f#ENE3D!u*fw-uG*V-Ds@p zh3?8136z0tdQ%dvoMH}`FbCWtWl>xHEMR>1Q6^4<`?|Ub_5jJi{9xlQ;2pW<=Qvhi z8ciuym4?NstFW3C)yViw5w|9d2^@?_YS1Y%76(6##KS-<*xvF~`KkCfDq|dy2=YeZ z8Xz2-(jtf9+l%~HDGKPs52~4@!8hLK%NEBX<%M6`vZ$$i(iBbgf~N0s?abh$kWy`M z5hA0y6(Qyr)8T4+!Z%6F5E(I%N+?W5D7%m_MT{&}hzW<$SnZtMj4v{1KnbW~I!z58 zqy@NLnT`dO&#a&1oX*`zt} z(Ya7#?Nf!@B=dRW$}wt+`f=Ze11jme86ZnD$P;ss(ttdbiax-Xz@v6`AIjNyPZz&m zh*wzUSmB83QGC@Zpl=xc6F2S3+6ozK|DFMa7F+GHPfVACE|+^xoLyl8C!x5FrKCO! z-er+^9B3}0m!LF-RYMKC&_OGZ!sDVn%a9MbDaMfsRJV&?^W1KmwQHgE0%*F{YiIrP zvU4*&Tc{YN{32&b_sW(t(e<62moje~8|k@0f=BR|f9oFkPl|kWVQhy|7j_h>PgqTY z#&tYUeGGO%_yKT8!RB~0CCKk}(l4R4@`xML8~9BO)7#ioVu%ajQIli>&jyhvO8aRZiE@wWU){S}2Bij1ajl zMhr3$hWQ1M)Izz^P(S<~X- z+U0Q|C5T?4@Cu}s#rxzcH6MZerRyBI~Ce1H)yj9AzEKS>hO;ciPPF*cq zfABmYrQJ+tHq*tuFSQmxb>~Y^i#PJ)PitGk?WA2kvp~LJ>Uj+Y8Lpt{7pp$U<&sbv zQQIJ!%{JPVyj3^3i)=lX1gA}+filit%ErW0AQJ15aZ>e-?JWA=43pb<#kYAZqNY;K zM9kC@4V$)V7NH1`Ik)&deVSE2AFv}Y_#Q_uD2%L+^iIRyJA>! zA;y`ePFi4)jiV6F!cJ#38pPKv1`vIDYMvG;$dAUd*CuFgJzjXfw^sNLhxT!DEc~uZTTK+z#<`l=Y%_4PL8oRDbJ2(*K==Cv(5! zzdymug#hq&brpqm@WA-qO*=h^}2}Ez{ zPdd%YZ#Wo08hOmP1!)!1V01{ynSLS$PeE@In_4Cof~bq-wvXXwf6ZF?8BYkwUqKXw z5%*T2A$14rX*Zmu@HO|&+d*Nuw)jNDip=^M ztByOL)`g3E)@g}J1&v4`Wa4-_ihy}x(;Q3j7CP#%t&7%upq_4aLmdd9XI3PL zEAiV%IA=%cE_PfEa?rLQa>w@VW!=Hjllr5%#pq(Pr0o*Z-8*MxgIR9me;CFPaOUWe z%*G)rXZyEX-S%m-@>$GJDl;g?#pSxB`YZBW)?3?DQ_I;@Y2H2)b@Ni2x$g9 z_yPNBgP2NpYtyIqS$m*Q5>Xn?icmnI=lunrxNx=#lcfO0nqkCEC9+fa1PFltTxR z^@D0^l-M!U#Dy)gxt<-$I|7W54J=lNB=p9u>2)pYu-64ndQS z+04qz%k#Rq4MKwLwRid_bGbzQu59{z887YAH1-J4e`X>KueuHn~tmkL<^hc z+Nw&b$8m`7Z|e|6&)5_k%9W2wFzAIK603#)g4_Hv-Ep(OBNs5 z#++?wF6108Y#(Je_}`7l#;=9lqI@uXb1%(#B^G%ToSFqIB7RKqA7yMj-^8di_AW;K z`#(%RMgeV=0`7(^fyZBy8~>6Vp&s$>MtpC?qsN|%shyB6k$P?P@9;VIMIGGcw?B3D z%qH}k`5{FYqK4!-#fn|_FMr0iBJg(Pfi|2!rsfCE)fYQ+R37vGn91_ZHvg!8$aP9d zpQ`sq#NW2K06=RIO$Ma3ih#&;p|nRrg2ySXRU`A;?}nxi|FSo#z1uT(Z(Ty?=P%8+ z*0}{xz6_EJ`^GNU87%Op{B5v59TIiF4q9z@`Nbz5BPDT%&pH%^y$<^Y(yaYdZBfAl z8j;1gTk~S4;<>G;>*wPsqrPeZh_gjyNo)+FBOW!~u)JXArI>uUQ?$6F-NJFju%Y}M zWh1MNk52`KAJQ~mXEqS=(1v=q>VoTa1F5yft~Laa{czE+aJ;>f&X|UW@$UQ>tS9$OFS$Q8B5}tZo z!HHV7w_zol56?eT`fYYoB!VrKwY8-t#r{Gg%FDL5TvS~Uoz$BzRyX_bEm;D!3VN$` z6{p&(c?JJ!XGE|G?QIS4@E-7|vVRml?m-ot{ffP<2Ts3U~(SJ&9v zTn+K0sDt-t`@M*df#_k`IuM#xB@~7$LsWkvaDq0&lSre7q_hDRas-)tx^fP_|7>Sj*`G(boPN(ae8<0T%{6cs5HW2_lhx%t6(es zk}UJ!ZG{|_dXH8aoOj}!_hz8{(Jp%lUxb9lDxo157&d;s;6>mlLxl4)SN^bVr|qzNg5sOu>HPL(r9 z2mPKE2-b5IQZVl{wqZvE;D+d2m=Li#BiihZ6>W*68hN&r z1E$)ww9?EVxK8(SoM!z9FpSe#QP2;kEf$_+kOuU)dH*1zVM|=?3he8n%ep*Re9Rmy z({l->z4G^Rqa9_2I-^#?KBSKAw%(vY z^1G%T6>M%=aYdBa^41CS#t{{Blx@n&7qQSxFo*IWpW5qZm*3M;T}=On1v~L!2#rfx zf{GE__~A&+Z{Dd~fsS4Kg`w#Nm+qVdT^`pQHlMbJ`$q@Mw|82i+l@Bs@8P)QsTD0P zdCs}xWd^HN4W)4i^juRD5RGI#wq8*Lxj2tpVGb!MdvkI&!4^R6(1Z1Z#ryIh~PVp z-0!)8bS><^#4?tdVj8i{kNs-5hKBe4#i_GP>M)zPLu1dQ$D5=H6do&<2ttNJ<*OxbpK9>ER1&o44N%9JAF5&k`S1=N zPmw&q*Od<${nVC8B>LWoYx-=<-he+DV#EuDpVcA)*1=mdZCYPW1uXDsYCtK9=y^)l zl2WcfO8sy@F&sDgJOl~s2FW>YZ@Xf#!ZfEs4FPG%lNKtnK#!(124H+t1Jy_(!>W zmfw>2nmPga&e9nR%A$FxTD-)lsj&D9R=aZUB?q1|2=GWlDKh^2itgIqndr{<;l@@B z?|(0;aM5N^dEORGz3FCr*0N~O=1l^Ld|r`hAY7KNqt=~`aN|c@$x&X+jp`<)wnf{M zsi%6pLb(-7&9I*-4XP!Yl)Jq z&=^`D9E4x!axi?6oJLOEKCP8xAJHPSC{SvuW#*@LQhGsetq@Amnp4=H!7F=%`LB>%kfOtioMW5w=_){eZ3h*s7> zXu|WfSYVq21Bsv~@?UBy8%Dej$|r!7Nj|`2Jb+7$@4*1=%>edpQF`G`RUI}Ejm1+)V&KmPLFW7 zL5L3SBax~2=TwnjQfxR>Vt4OZgCpQwUCLg5azAd3b zb)#G1%^9IBP%APsUp4_m)2a~V?$G6Zj*ixvF>WS^D0sp}w^YFPrrw~6fo2(S;EG%= z=>@}>r*x+skag=?SfC2fO}*)XbGR6mKAB%n<_6f9dq96StT3(`-JLdWlM)O}Z%4wi zQ;5N_4!=A08y<=ZA`^7NsVM4FINPp(i+fKhqJHiG{W|sbgm91{X#uajk2i;7*|*xl zpw|Zynw(^_DnRBRsL6qP`0!eXbk=xA)y1=cVtQ4(FzrKOaY|UA26L*M+Gr%FtHW<) zX_V3*aDD~6YVD7VQ6}CRqj?1=3Mj!8IIt)sA>hO+Z9g3)2o+;@c-{bdQ zmcFW59BME4%A4~h!Kk|4X3wu}nX0|*Z~P?nk?_=JZ=i!v{j~9ilT#T$4W-_IoTRw` zA3Y048`(%VF0Opp6N~vYYqD|^+W#n7!E=;B@$Nk+g6habEnbQV2p|Xgp$=r%c^*~+2Vi2iexf|PhnrBsS3_B)%=dMKpg70&3P9DCHUn}Gph|%Q`)H_A z@D~ZP3G;M?sglbRZY;Vf&ZwUuN9LE$19o1?@?>%N9c}f8pv5Ui+cM;Bqt<3wnWnpW z=VM?F%9D;b2Plmt!(MFvN*TF^a8Y0SXYl3%O^`kRY~%i^VTCZx6FnbZ+cB)ujXLq2 ziBH&c2S4%XVqFHMjVECna(_#3TLj|sFhnWFtoE-lgFV4%YisekRpLAhyhMs2%_@^>P^l^k0y`EQ$Pr2e&W&dLYxh)s|L3%~8jG(6Yx*Y%;_fxz#7xdp| zDbU^-y4;J?NNFkmR|{a2VmXu=A-3Y5fgmsSwkN(GkDhO+Q%7dm=0{H%u+tlN&Qp`! zCA0r>MPv1sk9J!!kbwDdaGG-t37TGdXJIR9Y zW{~x=Oe{-$@g$_nLSHc4lvq!X!lU9jr!kPb1nyDF3};IA6i zFbc}BDl{r~2+JGPrW#U&DjtNpG==5NSWQ{Sr>l(={v&iuW7;%pk(0e@)H5}W_-eIC z_$4?9BdB`Rd6yNI%=wq;&h{$Cgfe( z8Y9v(DE5&?jPBF0J9;U9y4@4jQFwxS>pH<~&alqiNHu8wI?!OZ&ND@LCy*^|(Y6A3 zPqB=^{}K+hlBwqNhB5@dYfjdodD*K3_P78D3bxpz^44muNBs!9wE$Z>AXYF-QUPFrKBYPyxhYvnik)8+gjNLsz8a|dfB zP2dpOYtoSv18i~CSo|s4^P0|4dU#}1Op648f-J6U$dUR$T1T>C$~<{sAwR z;C!W=R2w+cqdxO=zq3epEBR&3yKN(>KNPtG5~*J|n4Q)1B_icvpGi^2zjEeJW z$h|xN%!!z?=7*0vRDTkhA6nSPOY6kE4Y$v2Hg#)wD%#P|70F|SC~mL~@f_;cmWZZz zT%7epryPq;m|Zo@3K6 zzEH#=?RC9=AmrH8&RCtYXE;RO)%N#0O-?9)$G$rkIzqrZd7s#FVMR(9Bs?A=E|K#S z#y5&xtcNkQD6`tCDzis}Ppp1W?9vFir0N2fW73hQi*x|nN+%os7S7}T;5w%b6~q@1gsxg=~aOcdwm+{Rw` znAw1!Jm7|SjDsT*W$$ydW6PbMObJ7%~uhNWz+*=m+A$v)RGQFZftx&G)I2HRfQ;qO6Cs9ho|J3S4>Pc>-X zztIfF=Yg;y$1psuL>77)LBgzKxRzhiU=HxGX7*O}cFSQDP-2`K3vR~N=iu5M>?q7)qg|8ry%Fyke< z?n?F^kt9d1Y#|LN41 z?^}kdBdjulmeTkq-1EbE)&L-(U=e!w-ae5{<{*xk+9*RVBtNl2_)Q)r$YCTqe@Ds>e~Y)D~vc*qnTMRi2`z;y_>Dv^UMz!*w#8q;zA;M z=8xsv3e1{$UFP|JJ^+nkKf8^TS`cW0TZ_JV^om_NpxzlU!O6*FCd~vq}o8M;If^u) z(>`udyZ$C46X$>JDGAxS)jjU=SuZ~i>QE6>EuPSjI)<)akC-z@Z_|21`@7YS#WB+r zcG#!f`D~)bHWXBjmw{%L#8+F5=aT+*MH!^I=v8QY=kfJ(w*0d zG75;TK`_75n0SBE3@VU!49TRxL+iupEMXI(U}hEWly z&{x0}AzLx3!6&nl_8Cq#C_>AD63!)^ygl>j}=vW0Gc z-|7CN$gPqLpavcue*VL`*%cI4|A=3s8+>I9TO2SnEm%%+Gqj)05MEGvxkwTb#i5r# zEKFD8TYw32&1}NUdejS=y`?din5344gSa|nR2Z7NeqnSt>@ol!6WP1e9bus#f#FL> z9QBSxUV*VLSwo?72Ij4t*x`OD<4Mz!j!eh-=*2-J~@jFQ=aDFA8t^h+lp!LZ5_Jl7NquKiZE>D~GQJgg3n8c&U>2Fp`)17Yx z&~|15n}6b8vVaW9hyS|2jWoCk8 z0kM)Pt0?6@|pj#FB-nF#Et8Mr;Aosh_YJi zTBS_OXiFHt5SUyz2f=LhDa^5oX5X)H70t9%KxYezo^5y7G4(`o}%c@VwI z^7Q>K3Ukp+#GXMGpJAk+&7`j5oTM1Sw5fA9!rFB!wu4zA*WMTPG*V8NXT(@c;0Yx= zK27ewv;_#gu@3?lgJ~$)>C{0@50;=152nvNcUCdmq(a5#3~QWl*%8BsW}#s5fg};j zvE1us3L(EU)hPT7F_d&d?3FXBe)k2oKQz(YJtiQu1<3^wox-oauC9FI`PuJLDgOjs z&4Q`3Fa~Wuo-#vdx(*ttd8gAF6W$oCSgIR)Isl)=6*!(a+zlLvx}VwYYu}&GZdT=L zwwj|oCBE!JnL#7rYe&2Zycx$M1pqg0zcaNL0n_`QeNY9AM?wrG55f}hN0E5#NsoEe!1)hORUGPv%;&69(#*=B z+w0`YUiXE}Zz1ILv#tWpp;`C|eDB(C2zPMRBTfk4Pj}^(nTa9PEJ&+2<5GT)vbPs~ z6&NGK`qDUheMWtpl~t7jKeKcQKihWzFA>;4B-W5ZRBDfQ6o8kNWn>~P181^iG7udf z1{Yudmz|Ar0A|Ra7f;|@f-vXip8=wBIEDf$Ntq^`fj2!lwcgVL=*fN(CUYVNJ%@CY zc+)StfwL0iG<(}&`|u`ypLkW-Z)j*28;i4icnqHz*I5_v5ci7{T0a5j7GeDq-7g4T z2;_y`BNb4s@j+7LQrMQ!-^q93d!>!JdnGK_qlz!F?xC|?#dlTSl3pRN`&0`Sh0dIO zhs}6#>L&PH@k*}U*TRc)y3OR%c0!WxiV6#n4kpWk&?zWQ#kKIV%0L#-5}A#B2LX7S{@vnPgkE4b8*qQ&UM#6@ z)D{#pf&L*SK4uAyxS$m6ez&Rz_ol2qS2l@oj|U&YL~(49Zi5A7n1KO{;VG^K*CX<` zW|LMbJLRn~hJk&V^+t?kA}^qW;R#U^gJGAR9{=XHil~+;Op|)f@H~bTCGIew=1z@>-h!q8+9ohtWJSCdYKKhoGFS7FV+X1aIARD#f1 z2!u?z*SB}CMPK)|2pQ3y5N*RWS3_zrJ>Ib>G#8nfuAIluF~-kLafVih#qqCUUrJwA z^S?krAI8ky-64-3Lup)_u zI7s)KJf%O(F-Hjs+2H3x83*G#suGviz%HvIH3cuU{7g>Lf7X^})f$`G4Xl)p{(!RO z*L&mbCMEI0`7Zi-QbSXLz7^l&u)Myc1{NpIJ&r%x{OKX|HeAz!FmonLLNZfGHqZnQKvu%R}Wh>fa>{?14e zV-OY+Jx@FWX$lYQj#{ChMd8_HHDUsS}zc$^8>vWSaK| zB_d_@7lLe?>xe#sRWwJ5sGxd5stx@O2@)b)ZGffCzWw;{6l-4hy7=5DVltKe3cdKO zLrzPh;r=LZl%3Ji9$s4(?qkC!ZzT%J1-VclXWYmMHLgiL+?jLoC;~QBRXb$bCjG%A z*X?2Umc;V_Y!{0IUDISv(=`Uk1C{>Dny^(+iD=?aRunopX-w(DjYfRJ})#mVu2H7fiv^ z?~T0T@NkGtky}sSIb%}%EGmhOzBJlm6Gl4ZT|vo!S6wRV@hNU;ZfyaH8H6Rz(I=Njtzyq@5zjpIiU0 z9U=c8J8tNyQgJ0{8Vr%id-+C(vWL~XM`)yQXA>YLl;9yEv)^0{AR!hqiD~*@?^(%m zcA~J@m|?Y;U)!~P?sS3hVTO9`+QWm2icI5^Pbq}+(S?j9CoR?&+cevz<9-EI({vJFSu8rl5sqFb;D05O}Wb)lW*v^+qvPDzXc~@GM)={q{ zt9%y`!!n)xF+kI8Dy=Xu=ZL17{vXRD)TL5VN&Fo ztYt50Q3R2Wyj?sBe#Qz*6_D#eDUp9Dj7_>4&a|9))5CalF1cDM^f7dscoyn=>TQzR zpLsV#AV-x`bx&QTW?{mp%^sOo(Fj3ib--^mjBcI6`>oO z)f~`W7Ok0#?4A55#W6-AKw_>*QP;Q&8hXL?k+T>`Dm9xjW0aqN{7R~%MGjtM1U019 z{9=+2R_Tnc6@jaI`tAKq^G5S#>2}6fpz0k%N(igzLl+`tmotJRPj@K4jY~ym=T}8o zvWr43G993gn8LVBAlf4AB9R=+9a|>korS$`V@I`AI65h5Hm(3qirXbD=*u{I&~&0Fge^Nir z>v$WYooiOsQq3)M4Wd#8IxUu?5`RhyihBn&E;<2bVbj>$CJB7%B$nW$tyk<2&02Yu zqv^pSp6O!@&4+!t-*`k`6R`9~2@z5-vXo7$zpOc=&4S0rgGEw1!%hFBJ9nWuwpfGnRSrRgM1T%imDM@KJu-2UrCmW2YciuIWLU!Q)W6^9M3B6B|TwDvv>n^}t=)>m>^Aw+C+dQc)c8geRgvsM?w z9IPbAR1c+i<_kyB4%~+=bIC7=R={wmxydd!LxTj#WsiIMdZU9VIEox$#IX|sQ67WL zmdPxA?|=8}mq~O}kt`zz-&is8M@%vujtbmpFY-o@L{Bq0be|cuDZ{t0&r0I1 zMdks81ASd13CQA%)W2ASRwaahX$;tZm{Z8>X6PwormF+LrKA73h)eGoGIXp1P5`#2 z43kqy_5QB-^=z)7k%1usDr32)n-5`?d^b4}$$_=a9ES{2;;t%Q_;9g-fw2^3Rtc9d z2HzV)l`CK=3?f4;?Kk^6=0@1{u`$;Z$dI5|l^4082p)yG*}=$A z!;I5jPlGe{w~C15Cg8E(z~E$*2z$wH*~Ia(FP|U02&p>EFJq5{@hRkVGjtU)iT_?n2-6*DBV+HooMIhe!ZPGVyN4rV4KtTDFJ{CL_|d-M zzNNLa8(eDg7CI4>pjd2J<)p_a%8SUoNR#7AI}jA--%>!g?2uzA*byJXC4WdPRQG?g zYZ(K|zfyIo+4KRLBD16ap2-eajQ`h6>@I2<%AeOPQW3NrR$Qhhc6c-Yi7}Ii_)sd# z{4bcQ{})X4>OS(IYWx2lr|V^7u$3Ic2jN4wxsSA9Dp$(m5;!FO$myk4=m(6kyM9Nu zFmJ;r7aO@Lq(UFmFGMZc*EiP#a#LnXPz8jMx+8yFDIgEUN)hPR%w;$|I;p~m!dNe8 z!77{^mK%gE;?Syhyy(c^)F*h*3vYMiUNyi8=Qm|zJz})4o;=j~R0-F$x8S3=Eu)OB zL1H>CGZ(W7jhTR>>{~^oJMBo2@?uA;HpJ^V@eVYC7?s+^LGgkWz1>>4Cf~f+l7N@^ zR5nC@eJBec`GxJ{|3-gFz2yg z6Xki-p8j#)LdO~+0~x*4Dj7Zs7Sz0vW#wFYj7#iCkp@;^GMw9%vlV`ApLkBG|+rb~`l%p|z{n=2*r_NHb*)^DlZ#Yo1b} zMJbZR^%ddVcwo~_9!Abs5gF(dPow~na4$+HPHtYl17RBUh`;hGpeZ>ac1L<`NciU` z+S8~beIi9x0(Dj`USSv$MDd2NebRra*KD#ZA){1xI*Fh;uEqAWv_UgJL$t?P&Z;U! zvlNkNugJ5CPqjAR()k@P#W4?+c1Ud%GrPEBm0|^q`xKP~-A*V0`5Of~nJD%5Gx|H} z9&~vs8%kCzrT+Bv^n9mXT1qA+ga6c3yMrVB!!3f5Bu9%<`VJW&VXxaW7Rr#Cudn)Q z1_o5lE*X&k+qEB1r}i(fd@N`p4*f?W81<9oM(Q!KH^0KRRhdq;N1hOtt`k=zLY`A} zn!07ZS_t`GU&u?@Jn^Y=i2PrA$=IdG%q&+Q19p2=6@C^Hni6C$3ZF$ks(2g{xkjrb z{arb(w5$qWYd&RXXuH?+{_mIkx;jesS3op9Gddpy7N)@;%VCKl6Z`v_3R@lrK4J#ig?XYwDZIPRwl+fm*)4mv{+nsKLL?5ylx_C`IoZmm zu73dSw7=2LK!U06fJGl*=*k|y@)zCyNy0zu4abNA)M#qP?x*~j5s{|M_vu{!^_l!q zE(RgLRJ~O)+rOz#U)sHj=#YirVk^*`B0p7HOI#q}%AYPgR+xZ!Ho9@>;v!ix_yD-_ zzY)_(V}iJR5{6>Hi4H6FKPfrQ_lp&P>`Oww(qJ>`dN`Q@$exuQMLq!E>T>h2VA5eV z%j|mRN7_?86Bi|HT!fn#8N)s%A_AmW>T_9j_V{bf&5MGrUAh$s|IMhoOMMx=OA;V) zHK>EJw-{VBS~qq%1qFh2?_1m~Ap$}pMIpx4?|(5*7gHiulHXDeBCyP)ejkjd8(JOn z+B?V^{A{pWHM#}t;4P$o;pqV+WY4@Act<(g^*TMdZnG~11}uE30qLV0`E_Racfa!$Zgy-;aO?LT{LwYhRK2Sx(cG_$QlX6XZ(5>`iU z=u>_+HsgBB<)DQh+#4?>{52|{gljfqe(gtsaO&(=W$?HwtaY2Q!=?$j3()?Z%=gzv z#@PL8+rJ)25H|G3;{>MM13}F|#{H(oolr}-KUqSEtz7OlgJaaGMn3|B!=eD%rVE~- z*7N-Z-5+UzPI@9Dy}ddsWi}PW#LY&M-7ZFhHcM!w`p;YftHR%3fMWlKh6dAr-?)b0 zT>vkL(3v1f;?piVvXTYhDrXs}oFGSlU6bps41}#1lB55BL%T$T0PW_Y&w}YqAXkjsA)d#3{nQ7Z#O7 zYwXnt!`tD*)6Zyt(=DSoWoYcB@u_I^Jc$$pvwucJe6QEOJy}=T#4V@hOKxZZN;%9v zN*qn);dp|)65ZuLu9_VjZbCpE;7m9hF`8qiT$FWr^e&00x7>*&+#r7!oDAZI+Mj7VU7Vh+(I z2YxQ|z{5zi>bg77Oc_jjrFPw3E+iySWo1RQw=sm{5ebb#Fo8!GmqSiKMcXw0!pjw? zNF^JG*IaL+rK5w)3`WfSt~f{db`Ojx7ytMqZ@b|g_^J=`*BSr`i=F7}@-p;*{cReu zR|>!zFR6tVeG23d@tn~U_#C7gQuDjKs%o0RPLIyNh_bw*0^7x6JfZ)I&G2(@80!8D zWWM|%^K-Q(_SSs8o(t(}6pkpfxmV3m^lMwP$`><0dQo$UMU>6uMz?+#Xq`BoBNROV zxW2B90ucOf{q5f-No#+32(*e(&>e^#(D2d>@fH2fK)P#gd#U-_Az|vfR{pD?id{f; zz;9T6(3q5pc(Hg~io_G1oXt?l50~fwWg?Z)60NiA=%%i0m;XPP;WnvBloA}(%=yzQK8w%-i?Mi;M(d(gYs?3R@G0b-P z<8GD;0OfT_mjn7 zW;A2CpWj5p^(bMf-U^l_O_ql7JsUvaykJ*TxqnpjV@|^UHydmS=-0bUr(500vLouy z!)E|fH9Q_EgHTk#ixc_qR?o`Sh|Emesvta<%Po+zRt3)BF-_l+#Y{B2(~O?AhDa<4 z3LC#yq%VxwY}Q23rTSQgkb&5{L?_4bFS+IvGJ&2p&LOccYHFarK@0Vks0X1|>n%L_ z6?4zx%N0YpaCxrhxurT}&Q9Ow%YmylUh4MawOr|&pKT_vL>{USgcm?D#qqg0jJD<> z>z83p+wN%8k=n;Dy~UOW8`RHJfDl$qQQ*{&7LCt_VVnl<`ev1btx045Z+jAcLon`- z+CY3UVHGYDu4%NJIA)zsm$240mK)Q;%VReaOLTP73)$ZreV=v|r6YX3@1soPU9f?R zLBaOtTRZ@>Tio9%GX{A?W~vJc`g@ywyLB_M-s&D5)FYv8yJG(|t0Go>HTN`R2AWJB z48nJZV)i19MziT3*1s4>p_x2S1_+K#!)fZFhWzc=$&}Jtbh< zP)8rV3iTf*@WTpOaq+dxct<()eS(I1N77>gl+!dTGCE%r6VFSy>WTz0jFIgu3AN;( ztbb8RODzUTIFH_MxtT4`ED>&t5DHj-V%Ygqo5IYQNd*I#?aKMujG8rj&dNY!*OwVx zG{F4Tp{<?V(HHFcalW^^Q{t|7&>VdBU-q8Uiqn1)B~hg$lBMZvcD%%*^u$7?ICJ30N`* z6BSf>acC7S{sad};N-^{O?|PwE8RcfUQx;94yEe@_64p*8-E=9ozYxp_Tf~9VzRbI z@D!F)W{MO7kM!m;+ve>yNbc@Z7J+0AXKI2A9Jr8 zTA2ytd<{5t!W5CDGYXeWXEAOJ!7oTF3W4`}aD=!|$3{~U({Wtj-?Ysd zHYYfJ67eQFqnI2LbUo|)KpMOCw?~G-C>pii(Jx8~qauumOLT9ur-$^`-c7av`m)Vp z;w6F)LAM?e&6x-#2@9p2*u<2)7|hOBGdn0Vi#FCx$}b5R+dnQ-Vb{b={QiWe=Q`5W zu#wS*1?9o|uL7&ONhRafeKiQ2+%1I6F zKFboK{z*uYs^Do>g(Ok`25n!<*RC`(m+%`$yr(;=qWMM^_`S1*#S&;(#6+DUhSth> zQV|K8mF3&F5@b5*#=r%}OpTpV%2-~SCEOm9E(^`L-veBRY)zH2vvQ1hdVYQ#goJL* z6eFnkIQXAXq3{{c#-MKw`ty$f1YJodeb=A@bQd(3tqvE;@#}cWkPtFJq3RF&f{niu z7>qExob;VF1m0vEqNRv&h~}tf5+0TMrlC)`=ZW>*i9Z?2gp!;X?Qh-p^DUQ!huyr& z+*D(UB`!`PY8WPz5hTv*9jR7ZC`y#CSmeKydPeX@g7LkUK;imUSyh!#mUCGdJD z5rmSP?$dF8XnFzI&JhPdsg9+reA|$3JH&&ec>FWIwDC^!_p`#QAiQV-6_~wbl-rgD z8ZU0JD17_SVVvh5K$>hHbU#)xv~;czjRX~b;-T$_8$uRsyM!dTTiE+db^9is2cs#i zEg6l>tU-UQ52;?l+}o2H3|fnK-2J+S1s%x*`=tecO4rpwkPxN*4u(15h{}Ynx%|@J zBxd`hcZX$CyGE|cs6FTk^G?wERyVuaF{@W!OycXY<5e)}nn{|hLh2YDN`B_5?pq|Q zbtssjOCM@WVCc6LN{2#sM55Ue7u=tJzjn-R8@R34bZZvriT46xr?1Q)i*)gZOR$J& zU!#_8C60p}qVX&Fx8O3St%-vlZ{J30-lw9NS0<0*71%O=tr_h2g5I5QYeItx8||0- zLTX5R1%JwN8AT~NhhvAQgx_OBv1uZc=vi*DD&P)34iPGQnk1+ zzEcx_ZiP`RZ^jrBS9kHA_w-iIY+uG{f4zvY*-~e z>99~3v*{FE3@Fw-rHp!dC9Oo3ybcNZvZ=rdFM5h+ zNnLQN3MKbUjXQie#!=4O;goD|FFRm?7LEqCgfM403mU+fWc3_KFbbfH=QdlROiQC( zeE7lk{dK9W?4?#9G{po_HFHKN;Q33sD=pk2-$Xw(cy@*B`x@MYDb;TmS%wmCNzdfF z_;Fh1hNUnL32h8dqN7(RW}0gB2dEu2FzG4Z?4S3+R+_a+5ik6!CKi2uW0&_;?i+Qm zGi-D@TN=iCE5X$P;ok+l9A8sllC1Oku`&d<$C59i{3zLKX!%Z3PoJ8=vj=}Ui(dGf ztm{lK=fhgww7BW$1VO(v{l50p6CiC+`DDLbup5%hC;uO8O{ zMsC`hPosJR7m+TjDkc;lwUmRiml$#|>Lb*9lm$$2DywXto!3tvW~O~Y)3P$W_6oF zl>l*L9GzKizUf0b51nkGK_7bfhu*_DiD-75$#t2BTO|F2Y35(Aou+l&q>L^}czbDL z#pJ8uB7&$PuYe z5&j9hyc&SPnF3idsC99a45y1%j#w-RT~R{{t)JkCLNP871MeA@B6ly_E}NI@kvsa1 z$&j-z;-{^iDu<(24&a`U(Hs>^Cw_m!RdD8baTokNX+jqS;9c~msBJ(^^F3T!wtU+i zT`7NsIk81)tWON-5nvUXEE8*d>M0MVwU`RqCE$r3@eqbX<{$!puCor-1_bCl*j!h6 zK?C?6l`&$vD1U}uJRcu3yM?GsILO(PAS++G6MPtY1a*vpVl2XvRYWDVOHuI0?vc|< zqtBLcAc!we_02PS=ZLatSw17jrUUtrwu!C&awweEJZtO~fd{NRI7c|kU`rS`ll&P8 zNfb^Eg<0WzKdZW(0Xd1hpqPX4pN>H;H}qK>XnDx7VKP$e3XP-BR)<{U4;3eg@QAe4Pi17dt zBmCC|#VF5^NVt{nZt)!^_N;5|bM%m+W%pbcGMUn@?j8>>!SJ&cP`#5cB`fF0N#OKz zI7(Coa;g*?zoY<(zlP6pn;>wWEFwlFlmt61kOiqZ!kaLfw?cH9SRyK!_;%A%?>JT3Gt*YVfi-Jf32H4Akj#u zwUdE?m_v9^nqzUmkVd8;60ciVMZdW%&mE}oAGZuMZG&BD#WR>~?#l!R< z3!C^GXr-tO_5q)7NP6(;h8A1;p=tm)IR8o45x{}W{f{&WMAC~o9tuat62ve>7{KwVq}35`GSZ2&kvHNJ zYwQ7-fOnl_iy7u+i3lsGK?6=D#vwr*wia%@FGYjU5Fj9 z(;iC1yYw}Q1tDNGd{kkE{Q&Q3&rN0iEACq{I@vgQrRegnysnDTKjYv9)kK4so5^sQ zg_i<$i+Q{zeLhJVrNilI^119Y40(v^g`<vY*9w|RWU!iH z2%O@;KMyakgQ3%R>oR@t{?A}S{v)^N<&XH>vcPhB2*T0P!QNY7-A2JnP?FUF_5|Gs8?@YnuXDjkQY6rv3(CX+Z0 zy`hs&n06hLPhlrnIktGn8Ffz)l^@Ko`nn0y zTQ3eNeq?oF9s-`Mo^~8f0pE|e(>y%>ehe%Ym+_jG&qlB%CW0^6;41b^^B%PgieY2n z;e>z$9>>zTB!Ojk7iEkf+~fo26O}9#b#_o3&Ztkw@^65!@c~I07w#qmon=V(t^4`n zS~eHK$27*C291skhHvmB!SxU~#;GnZJt)?0`d$*EY^gwY`#A^s{;w70IqoD?peXxI z^DZeX44vaT`V9y)P$&9#z`U3!zv`8COct7_?(5}O%+Cx%{2c|gS)p{xQ-&9@@MHE_ zmocY6MeM;I3G&}D3A?OW@TiD0 z^MTW$=O4C2_9Y!ry4kqrAGKW>-CWW@h9xqNs=)>P1gXEfvA*DA#b|+MI`|CySOw0c z+T8>u70^JotHh7Qjd$}?qH%C$A5=Q5!-f6W9IXLS`Xy@d1b`pEeG+1OPL{tR1 z$5F|%QB;-OW)}9;^I!#eN~(0)GWR>jDq7j1d86^l>v054T2G8;Hn>XzVJwA>M^7~1 zR^A*sgPh8jZSic7JAVBucQHZ+xf#j0+Ij6tJgi0nR=lXd%2L)arQ&cua{TI!=XYT6 zgx22B04$AQHrro+h%JTcBoDX^h1;zf2m_*z-zJsKg;lX`t$YeSSsuvcFS+ODhO<;9AnqRDmg7f{8ZCAtifs+yI<@$jiXjSCkcbC^^ zF)T1ssukx$ZR_aG5gr^iXPAtTe9#!7A66sucVs=X2E0^S^LFEzr~nDb`Q?2DlA2T9!GSE~>=sK6wZp^_KI`0jFB#dhPD4dV z^1)dJD_&?uyfRQN+DF{#det=TrIcjqVDg(gr-aOS3gR&#RM$VHL3SPAwQu0;mx|S$ z>?Hej@1Z!a4qR@lqSp{u_tjZLiLJMkQ1-Hu@koe&ZRhQmD=)&*8rNgWc#`{I5`W>$ z9jK?{g)ZZgz=vLOS(cO7MdRsy&TPXh4JOkqw7?8UPlqGJ;)GpaBqOm$C+SIFLvCM8 zj}sUkVQ2MHxnV zqdRCf0rmf0XnV~CCLB3J_M8U|R^`z0NOQ#k46J<;W5S@oRV+d&(0SlwkmW@flxyjY zKZA#C6Qrm0^3*9l1B3E_)tU=6VaLrkK+7GITaSzRCqKRt2mYF*bS_cMVt+u{QnD;J zPO5;?ifwX93A<9R_Q1EFvI*0hLrN!)v9%MIyy2ZG_6P{F>?c3Eo|R_FVgGojh#=J; zr+h@NdV7|L-Z}6PDLJxMo{7ev)cKg}1|RtGqpUM8#gVkqKY>5?P8Rd1=!2WwLS@g>7YP1EYp3J}%=%t^$!06yuxq{ z3O(Q2k(5K=Zp`ycijJLk!`wJQPD$ibVuLB{1uM2enh7J17z9XdIcM)iJ}m>Yj+9S% zgFjrky-B*MtFz9rsHF)M$fg&jslt6%e#F=QO;a0cH-qcA#6$o2MsqhTv$Mt)_q^Tq zPXmc6H7p1s%z%_nzJ%d>Apkvdf$L=v1g93W?rhzK_EC^*Vb8la7duERKyZPu6!~I9&3o=`P#YiPJDbN8;&f5m?KX9EC6>w;;Uwdatm{v^N3a<`OTLu zj^Q6h2_(t(GVDb;kr}$XihP3HqCwI{tP@W)KS%rfT%%BuK7_-xV5(pne{9)^IimFy zwvw`wsvYK2YN6+)*ii*RSVJ5o3?<+xuyG3|>afB_DRrfB!;d9tLNz`xr3woXw55|d zfbfZ}aB*qZ>M*J*&wEBnx7kaBEtH!=!jAQVHrXgb)r2<@>Asp(GXQ;O*n0YLO>X zAy)gSW_zua%o?Q>!LON6j3WAp3DG7`{%3>l9vJ@ zFQ||;TSZHjU+@j^{v?dS`Am_{wi(IhLA7D2Ir*T*zK($i(vXTJe?p#QIcR&U(r&KF%%J8JMwxbox>1ZG%fZwcqhM zVYDnNDoH9sIyg4qY>Z#s>EJ&L%FwR5Dk^=Dr~6;#h7(87(?_iV{UTNW)9}-O{j!^g zEHE}i&X@GHZH@-s894#Ij-&EhR|RTN4B6@&nT2pbuj3;Tk{@GH;IrHI`2zxar$gU` zNobyaKGRwM==_`gWA{4`})=cuU8R91sZTKaGVsoX;0x46ww_~0x-H#NZRT&LCjq8st} z=T5JkP}|pizT6hq^Iwpi@|Q7TnYh=MVYzbtu|qIHgdq<^?Iv zISswFhzkW)knw3%{jU=gr>$kqqHw_g=uiFi83UJMfNcnYr)r^6zZ~!e+r~L)*xyZh zUavm6-i5r7lZmDMG3gd=01l|9y1*a9Fg@KsfmDvn1MM<;=}&))QpzF)_)#bt-t zzP}z+79Rvpz&_IOM(-R{l82C;=#!Eyl*2DA-+LER4Zech#a|zqOXi>4Y&f|;`lc8^ zUcA#8yB?Tce-rbp+R`#{MQO>vBE;&4FdqLgaVE=SOP&MU`bKD!lE(?-)a4|Ctf^o5 z)1Bd+Ifi1uBR_wu?J<5%P+L7&Xb-nuE3Jh@s+ec=M8H%j9NI_u{RY%7Wjrmm)UKX-ejVEPbeQc;rV7NQe&IauUz7PLeuLku z{@vU2#qhW3%82)`p+&^cTQz8+fBD_^wHCel@82$2Ie5I`^>Fgy{_BzopLhztSqr6k zx5dqhm3q5VoBixozucd!dV5UK6Me?p?e}7Z`VIC)|IXLTJMPyNK462dSdOywYM7;o zg~lD!_C!sMX_aQR|64QyQ^r`vLe9Q{f$3IEx!5q!5S5cEJ#XJuv-uhyjBE0x)lCC{ zNv1@vw7Ta&ILsi0HjBS11>KMH^|>7wnEnE$qorEq+T@qJ2^>(KIfPeU|IRAEZ|x@C z987RJMyZJ2C+AQd6@F)wVbZD8oD{wb(QoA)9pT42WeojsKCR$ymDTF1<^Hl|AHOy5 zu__S1ZesMCa){swZb%dtm*{u6L*FN^6Rt!52^*9BC_L-or2dnBf;Tvqm+#fWj2tFi z;%?ok9hCF$Plux?0Pr6~)btj|M z>At1luKU^p&V1-*o9^ege>=u=(f*IW)lR9S@xaGV*nxOzpH9G1pzb|U31iy)qP?B} zHVxSEV{qubP|I{;o~-y!zSPBA)ogEil}w4qf{phwWHDgo$ac<;ZdGk?da=X;JeE_K zT8M9zG|>cQN*R1*(*=W!)?WER%(_^WND4p>F)r(4~RMi z8GJ(g0Gv^y-TPjnT)SG+=CWEd7k*h8X>hdjJ_~bIyK=RZYl0u=ed7A0(QdQYzWs3^ z>4RpxCyg@Ldynx!LL$rUgG4{x+PKM$`-X4z$y99tuCZJHy%fsm%%Rh+N)UOg+!0e2 z`KU8RcOa;P-Wgbc%&Zu`sQtG9#i`Kl2^T;S{m!A+O@L3^H;`8*0v5RRiSWcM&i}4F zy!%?Zq@-?Eqwq$HfLoG()3RirF=czh(6km=*R|HY+)RuNX|ST~RvW@C7L4i}vxM9~ z|Jdyg4xdY)=p}#Q1z+Ml$c#hevB8j|mq|a6?}__- zCJz+)W;P($1`=9|r#B10?x8~zhfkqJ@AttkoFG#`g;8iNX=aF~K{x0D`)|uU6rDs+ zeAl)N(BQ(cxHsPZR@v~XrlVtqVQG*y~v ziF@JR)dgZiJomcDZnwV5hc{|YFGZ|uryHXP0fuZ8!UVSx_1uxWM6xl0-8#a!L4Cl$ zrg4MqvO2ygdAocp$2K2N$RPLPy z#}DSWXMpZ)?4-|Cc8%^Sylk1Q`)3jh;qTCz&u|w6tH+C-owm}=M>`JXVO5j=ro+j8 z@S+1L=wQF0Z(`HLkd4;JXZwKUwj)o6G9o(*?4mlZS_*Y44WY}2c;yj!I9Ua~Z;xXA zMYe)BO7K|>BWm?oCj&9z-j25I!cKR5Ew?wqS=ume4t|Yi@CHhl5%v9~ELc$Z9zuSx zP#JE$&=$H9&mzdA&8z{)#qJ*$d7KsCdh6|0Nm-+)tXZ?o;#@EvNE-ulvfNxa;$&%H z^vh^tGfb}5q^F1!2b?$9L{l5A7t}A>xS&yvl^o-tFw_>|>@fs`8e3rFC#@^>8|GSB zv&pyO*Czd7aSu843;4q;4gTQ2W|-fyi4n$jcm5vDdFA)G%w@I!4CxDqc`ZZk&Dz^g zY`S|x8tqno0WQ*I(`IoxEc*4hv9=?7kuwY1y|R~?m4KCq)yr{an+-F7-^vwq+{*1F zZieuT7M=|y7Cd&eewj1|MKDW)zRopYV}k+YpZ49!yat(4#>rz_X`mWZI`Q(Sv;%!J z^}_e)8oOuh22`8^^v=V+Wvu53{YFa~48qe49y{O+fb2{iqz@YS$J%yD>5#P4;GNoX zU8f)!bo}5%SIXwUU%s)y|2xNkBa!{H?Z2~h3nx>E#HmY8CzSs7vM5&xtzna6px4=S zI2K-u0s+mNk^8ICFXPU)Albl|P2*QV+LxE!yUJ*`9|TcIgYh3Pj5LBVjUmxw{%2p2 zSO$g12u^G1vJ?HBtGDn{eRXIH$hXT%vI2QKY5SAuRDv$9oaDt`&r~$mTkgPho!c$t z!Qhk5j+f1o9~zUFM(nX&@=?kE9Qr@!2<(V64^!w}gj^p*Rm*#2}kchB0YPU~5{LZUyBmrSRmDfW8x zTUUx7q!gp>b2LpStZA@gtt0e%zV__K_#sK~Ir&gZi%CO>3x1i+|BB0P`cDT6g?_K> zsCY>@S(^%rLC2U*RZaq14~F|lSxGskd;Y9k8-_#sW7yNWgI`hfbti=1ct>Hr(ttp% zT*t&|TR7E%X7Id{&sgXExwBJEcFoD`b+OYakvQBv&hZe#9tWD4XcvP3v0yMJC27^6 zRX%7WP2j#wrCi1T$%o;6HYZyr=b=wvqi>=|mdq3L;)I!OBPY=PJ0{=&HUDV~t4Zfy zl7l~ni-FDF3qc$50?pHsPL<)`a-sV*;2FLH$Ab?3uL^Dh>E9GI86K^26MT2?7U#%v z-rN6lHSHxS)TY_ML)RNq8r)xO#=9@bll8UU51hVFu>Iwxy5OU`Q2p~)Wd1AjkAFSw zzrR-+tExxL4@zWCG6bLh19%#3)J7x(k!Kl3pFGZRaNcU=fm$lL|85~meVwY8D)eUC zJC?aQjrhksM<4Ua$9=(oV>_;r{W)Zw-dS5alTe7NE)nuEkak!JGpY!NW$4Jgb<9+s zdvzP`d2UwhAMFdGpDS5C(IGVLhSMOLR;sa6%9>&FgrZBo_a?^0_o~&32zg`g^;nN) z#6A=H1_X@lFYarMOeeZhe`avOygn>Lgu;&V^NXRhg2`cKmzR z9p88TixuIvE^mc*vQVPU-~lD#a#>RE5y=Lcs=grd3BDISW>-i2Jfp-G4I#K zpcuSxljBmo^5PWx#fdK`8)O@irRzRjXl%P}Dp?mwZQ2sJ&J}M@sRY;afv1x?{ACbx zo_Rc-FS{aq-CkM7P_akb;eOP~Y@^ulL@Vt_`Cw4-V@4-0$YSC2wxEi<;CXi-!(lKe z1KR!{%0bXe`2AX0quu(i;VaYw_;ek@#D`h3_uRL;>eSF@X##)QAA$6se@`~mQ8HHF z_HV0g7VSBW)lQA!QR2&{7by z$qtH@`h^~(*JV0p*u`bAkHm8`;Bm5>8Ybf6AVV$+^b>Myl|0l9PNv+$Qg zu{U&=)lU_EHj&Mb^;{Fz_!4ZdchYw~Iq&pM+{r&vQp#+qIDx8SuAk9bWoz49`yVaR^Ofbi_P$oMyoT> zWl}m>5(+x-;;3}mY_31mN9X#bci6ebn=EWgRCRXYa*a!+jA5z~9{Zru!N?W)$*(PU zCie2A{2iAiTz@6ETXGKBqqymb?&Y>*vJ7KQJXie#C#$nj?;W#Vn=U0F<<+NOi70EX z^~J!rK;j{TnA(_@WByTc4a>=?!JlrdemfK^V`3E-^jKaC;?P3FylUUCy~38hO!Rfv4b%+2Z%wq;E;kVUW)FN-HzFSH zdm-XJ;^%iENyeg!@!#HO-+uQ!m$1ziQHnBpdsaB{Oe38MU>L&R?e~4?er`WfQ+lUK zi=PmD#!1RTA)D*PSih(Y(Hn|9^^T}3kWY$^zc6x6MEWV1=0ocHVuf|W&BhsV0A<99 zR+9O><>^GHlU0uu&My=`FpM7bU8v`}S(m)+cE)%ZPMl;Jg3B>jkyaW`A$IXy`Ysy6bQY>bT&r@UMRhriy4?_xDq2S+n^c#oqc{ zNLB1j-%NI%Az3fkC}O9NIj?PnWmkqy%kI~AN26Kp>xl1ii0OMBzE_JkZe{8M`%)~$ zDF4Vut;m$M<|4*Z9{AIe*jx!HxxOieFF#ROWl6f7p1Yf#D(Vb(zRYZrN93f|zui2d zyp4KWSd3@pk$U&##j2`?#E4E0lDdygGjG9Mo&VXKVGjMV!c}mC6ivVuq_xW`pZYn$ zsmk**(3`^Jnz)%e0MIGSdf0GhKfj=c)f5S&*Z4kv$I{Ha;dV@%2(>Q=i!F)>vOS)m zN#cbk%87jb+pZ82Rcse6UQ4k{nkdU7GuZiVj3JVQ9Wj`A7X|2~ufA5g$tbUL>&n$)gGQ)&~sYqc&y zL9jm~k>i457;BOB6Ob7Mt?7ugOaY_rQdi|Mu9tnPhGonRcYTzQJI z+3?y=@&EPyy6zD28q2pHRXQS?)N%JS18i(q^W}r*Yfb0P#Old6T|ImhSH(@A(es|L zj^dIp#v0hh8VMq3t*?8-aaNOst#4r&<{#lltHL{@5QPx8qslwj?vwZbY{Ad6J@jur z#SweI@Pqi2!kL>Uw!A0T-Jf72fa~gmmXa-@g2zb6u-l>`9yX()fao3StBu>X;bvY{ z(@X0NFVDbWj+Zj;qD!bZ!3%u|hwkg|_z-C%xouJDzh-Tpo_{q#ZHMiVNj%f~Ty{U7 z3{Hx&95;!*n!L3itbBwEMQJX{zO>1&FcD+;L6oP^M7mgKg;URRAIjnY`u^U2ZxSeA z{FMLhXuLl=`KnoG@W)nb(P;Mp-IFZ4PxmM2Id?&v%wnqW$LM^*Rh7Y?xRp?HL>Z$G zaJ1Cx`2JSBolnn;^3yTLv-7+0Vz%0&Q#IqiCq-rJwc{4OFO)GebwLM>=>zpc@beCK zej@dzAL{t}-|rPl{0DfZ*Stu5?BPD_xUatnL`-aQO+FPq3D-0AT=+dRO+w5*)VXhD z2awn02*JIaHeRtjaLC4dq8aHfz}UR7GpGCvtk$l?^|&&IsuY>?Lv6*W$&E(I(OACi@*ZvL>1+4@sX{kQ$H)GuHN5Z{daC$9>BKx>&@G6YKF z*rh71^@g8(biqwl_3ckVgC`1%8`5Smi2nC|E1=*S{S!AX#6an8du|wAFVX+^hdPu_ zr&__QzU0Drf^FDbu`mo+Ium8coMOkWHEnm5+DGp`x0Bf)vN?+Sxyxn1jv#{hl%W`^ z>g}|9Z?V$A-Lm>TL@6)m>=zRoie3Jmh}S`Lj%V?VfA5cP!Lw+|8!G^q-JJ}alGw@LG$PkkH4UuhB3tI_O(PV0UJ=9Dvj+rU^xjh# z^6Onox1k0_9VADyJ;o7p9e6a`D+}w}c<*f^er?HO1&J6xKk*e2vGQ+t-;)?5chsq5 zx>WJ0iM+qOm-%;`rQP|+4f&k+ICz01UEiV~$9{8;)HmFKZ`pUqSm1cEe+g3J)^Ghlc|q=7bTn>u>0Te*rxb4$ z7X}`l4z>oH#iaXitP~%6;BS4r*jX8)=n-iCJN@vTrFdu)mx+%2orX>dMaPNYph{S& z-#jzBQtEYjgTD)>x9JDF-^3J4r5OE?td+3txrjl-8L7m%auLgCgfsur@l5u^2(T0} zTz6^}6P!5Pn4NsnoDW{;s(oCLCJ4(XRWi&XMeFR->HLRgLtQwq?Eol3lb8RB#64=? z*vuBkwqVE-nFpr6AtZ0+ypdD;Op$pUaUhEvE~j(nO}AM>@Qh8M;DfjnYmn=3R0O4c zNs|5XJ&X57oP28XS)A9O+qu@8=Q9ReQ0EO>WX9u(NEr=sQN-!!3IQ4Uu!h>r? zBkgN1m>kCi@2Uvv`JSI{*8Kl?ItTx_gRbp2$;L@z+cq29Y;0|8TN|5=ZJUj4Ck-1n zY@Eh;_rCAX^Zo-fzrpUzIdfg#Qz)G#csri}^p&QBq_?Ug;hMaW6oO|;`-P9p=9*QI zDwnvB%ruYKA-fJR~V9o7-L@^(KH2u%N(M`wpj6Oln5Scg*1B`xu*NDg(Y`G_q_ROSqD+tTf@9+pxfZXto_a9~+&LZT}Esb_WXQyk#(TB-lYI zXk9eWNFdT>OL2p-^4Eez77BC1e|s5bGA78!J8Zm<*7Lp5{P;RRuU*6e!|)`Q_q#JZ zhPD^bT2A#7r>u48!ZHZtj^xF6>{ z(pixj8GnC2eHN}r|NP)_T&#)({iR=3kXO6mK}{_T-ZZzHZ`I?0-!9a=jrn}0ds8yG z7%q7|`|MK5J-qaPg>NhOV_j$*N2RfLh`|KH>`CHK*#a{GnPgV~+~*@kpz`3W(Vl(g zuM=zudp}#`oVQMVp5H$|q^fE_(eff!X$X<%j1uUcOeGZdX8PT`sV8|Lv*-Q~8 zJCe5&6ivQM)qaV>Znz6k5^l+laVe{Hz@=g~hi@B?nU;mnLBxbRyJ~PemTTUq9dpNsMou|B_1(!RnDG0j zekxEc&rL#M$hpV)pWn#nT1mTZZEWaTUKu35|F#!=&nKY%CySZwBnI}-Ax6CwDwpzO zb7O|H7;~Jaf1ERXpKau53 zD2NrOAGh4Q?ng?B9aFMv-0$iAJvI^)x(5L|9~T_{!1~Wu4FJ~LhMnOe-MSSk$2e}CE#xNKBSBu2Ju?RPD(`vofT+cJ1)?(?*KTw_MR~MfsP#f zVXagV(*XBI&{l}b{Ir4DJKx)$Nr zbrzW*NP=SFC`+c>3~FQxP6`y!BOx|d3hS$FfAcF%olG;mkDG*i)vLb8I_mZh_WlES ziKvBgDX(jY7k>+%j@Xv2{iezDjv->5rizceD({sl?Vh(fsorcFG zfq+YK5K8!`Ry=%i>}y1Jbl=NouLJf3<;WLEVqr`GSaLXv%=4#M%sX~Y92arH=l54N zZFc-*44j0upZA+MW`DfK&E_KOulyd_S>}fC0-t*R-Ytebiuf+C4zk7*DdC*eVg@&F)%?q-}gwi634Z?OCxCG;a%Iw`Hnd_ zAZN~OucCdVfw7wOU_8&&@B@H)W1<5d5c)MFE3g;v2_ff(bQujw(?SwCRzp^ktxft}DG>3Fu`y!_>T^3WJe zCOg^TSMl^OKhQp=sK;;TtSX?`G(@-bE1~f=N4az&B9H$fxYS`tv6^+3e=%V!+iH zlH?@qBO0q{Ea1Q~9c_ij#YPnJD#ys`#Dw`<6wM@F++V`SY4DM~vVBVY@)Mu*HZB+o zDR)%_;sXQDg}@7hq{rj%MHm?j5K$3elStU}vD?lGv9u+Dl<~sew(^@4V?n1LfE}Ib zpdL3YrO6k?ZEQ|7{(aHDO?&KX)6F8L$4MiY<&_5pelj|NbLSJzMq(il20ww7IauTA zc}AgD5%nb)C$?UgrBC+I&+3S5-0K$PvUAHjIm3Uc4YH<6iskVzZ)u? z777aqu#r~veT%L184sGr4>E5bO=_z4n16ZcB0esb1~-l+XzjQuU(kHe!FzaqDm=gyZwu^YJcRCuNv36)JZGe62n&0tRm&KHW)1$JYw zZ_j5rNsfYr*e^>9M@NG9bYcb8QXjM+wOWV5<1mi}J#!p~g(T5St)a^*^Wyu8jzWo}DVk>6W6dbRM1in VP#_ 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 O_^Cp*lo}MQ!~YLnzx@sX literal 0 HcmV?d00001 diff --git a/scripts/profile-sidebar-fade.py b/scripts/profile-sidebar-fade.py new file mode 100644 index 0000000000..9dda8971b1 --- /dev/null +++ b/scripts/profile-sidebar-fade.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""Compare immutable native UI profiler binaries; build all variants first. + +Each binary must contain the same macos-resource-profile driver. CPU percentage +is process user+system CPU time / elapsed wall time (100% = one CPU core). +The fixture uses native CoreText/Metal offscreen rendering, not the app engine. +""" +import argparse +import hashlib +import json +import os +from pathlib import Path +import subprocess + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("output", type=Path) +parser.add_argument("binaries", nargs=3, help="ellipsis, whole-glyph, per-pixel binaries") +args = parser.parse_args() +args.output.mkdir(parents=True, exist_ok=True) +frames = args.output.resolve() / "empty-frames.json" +frames.write_text("[]\n") +names = ["ellipsis", "whole-glyph", "per-pixel"] +binaries = [Path(p).resolve() for p in args.binaries] +metadata = { + "binaries": { + name: {"path": str(path), "sha256": hashlib.file_digest(path.open("rb"), "sha256").hexdigest()} + for name, path in zip(names, binaries) + }, + "cpu": subprocess.check_output(["sysctl", "-n", "machdep.cpu.brand_string"], text=True).strip(), + "os": subprocess.check_output(["sw_vers"], text=True).strip(), + "note": "Three balanced-order trials; dev profile; 3s warmup, 10s idle, 10s forced redraw at 60 Hz; 25 sessions.", +} +(args.output / "metadata.json").write_text(json.dumps(metadata, indent=2) + "\n") +results = [] +# Rotate each variant through first/middle/last position to limit order bias. +for trial, order in enumerate([[0, 1, 2], [2, 0, 1], [1, 2, 0]], 1): + for index in order: + name = names[index] + run_dir = args.output.resolve() / f"{name}-{trial}" + run_dir.mkdir() + env = os.environ.copy() + env.update(ZERON_PROFILE_SIDEBAR_FADE="1", ZERON_PROFILE_BACKGROUND_CHATS="24", ZERON_VERIFY_SIDEBAR_ROWS="1") + for key in ["ZERON_VERIFY_CACHE", "ZERON_VERIFY_INTERACTIONS", "ZERON_FRAME_STATS", "COMET_GPU_STATS"]: + env.pop(key, None) + with (run_dir / "stderr.log").open("w") as err: + run = subprocess.run([str(binaries[index]), str(frames), str(run_dir)], env=env, text=True, stdout=subprocess.PIPE, stderr=err) + (run_dir / "stdout.log").write_text(run.stdout) + run.check_returncode() + phases = [json.loads(line) for line in run.stdout.splitlines() if line.startswith('{') and '"cpu_percent"' in line] + assert {row["phase"] for row in phases} == {"warmup", "idle", "redraw"}, run.stdout + results.extend(dict(variant=name, trial=trial, **row) for row in phases) + (args.output / "results.json").write_text(json.dumps(results, indent=2) + "\n") + print(name, trial, [(row["phase"], round(row["cpu_percent"], 3)) for row in phases], flush=True) From 643a3e2b1bd6584bfa04154921c401cd55dd39ba Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 23:08:15 +0200 Subject: [PATCH 7/9] Document measured sidebar fade CPU comparison --- docs/performance-sidebar-fade.json | 283 +++++++++++++++++++++++++++++ docs/performance-sidebar-fade.md | 51 ++++++ scripts/profile-sidebar-fade.py | 15 +- 3 files changed, 344 insertions(+), 5 deletions(-) create mode 100644 docs/performance-sidebar-fade.json create mode 100644 docs/performance-sidebar-fade.md diff --git a/docs/performance-sidebar-fade.json b/docs/performance-sidebar-fade.json new file mode 100644 index 0000000000..28f6db97c1 --- /dev/null +++ b/docs/performance-sidebar-fade.json @@ -0,0 +1,283 @@ +{ + "hardware": "Apple M4", + "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.6.2\nBuildVersion:\t\t25G83", + "driver_commit": "6f1a7739", + "driver_sha256": "3efff1035faf6f7bce318bc48ac6345cd25f1b69b671262d27cdf3859f5c5834", + "binary_sha256": { + "ellipsis": "ec3ea3a06d83bae8a376383291792596882246db827b550e6cc966498b38d184", + "whole-glyph": "06a92b2355c9e3de4844f63446baf06dce7a66be6990ed5035e7e2a94c4fdd97", + "per-pixel": "64eb685216dc6c9159cd51cceae3031ad4348b08615a7ab7c0f58c3a0bc0adaa" + }, + "results": [ + { + "variant": "ellipsis", + "trial": 1, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002567667, + "cpu_seconds": 0.766003, + "cpu_percent": 25.51159823702984, + "cpu_ms_per_frame": 4.255572222222223 + }, + { + "variant": "ellipsis", + "trial": 1, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.002825, + "cpu_seconds": 0.032941, + "cpu_percent": 0.32931696795655224, + "cpu_ms_per_frame": 0.05490166666666666 + }, + { + "variant": "ellipsis", + "trial": 1, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.001730917, + "cpu_seconds": 4.002253, + "cpu_percent": 40.015603631140955, + "cpu_ms_per_frame": 6.670421666666666 + }, + { + "variant": "whole-glyph", + "trial": 1, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002060167, + "cpu_seconds": 1.241203, + "cpu_percent": 41.34504077046368, + "cpu_ms_per_frame": 6.895572222222222 + }, + { + "variant": "whole-glyph", + "trial": 1, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.00334925, + "cpu_seconds": 0.029833, + "cpu_percent": 0.2982301152786403, + "cpu_ms_per_frame": 0.049721666666666664 + }, + { + "variant": "whole-glyph", + "trial": 1, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.001954375, + "cpu_seconds": 4.236681, + "cpu_percent": 42.35853155448932, + "cpu_ms_per_frame": 7.061134999999999 + }, + { + "variant": "per-pixel", + "trial": 1, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.001094792, + "cpu_seconds": 1.179157, + "cpu_percent": 39.290894880870525, + "cpu_ms_per_frame": 6.550872222222222 + }, + { + "variant": "per-pixel", + "trial": 1, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003191875, + "cpu_seconds": 0.02876399999999979, + "cpu_percent": 0.28754821820310017, + "cpu_ms_per_frame": 0.04793999999999965 + }, + { + "variant": "per-pixel", + "trial": 1, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.002541041, + "cpu_seconds": 3.755167, + "cpu_percent": 37.54213039074498, + "cpu_ms_per_frame": 6.258611666666667 + }, + { + "variant": "per-pixel", + "trial": 2, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002435875, + "cpu_seconds": 0.834124, + "cpu_percent": 27.78157585130773, + "cpu_ms_per_frame": 4.634022222222223 + }, + { + "variant": "per-pixel", + "trial": 2, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003370292, + "cpu_seconds": 0.02324499999999996, + "cpu_percent": 0.23237168395725286, + "cpu_ms_per_frame": 0.038741666666666605 + }, + { + "variant": "per-pixel", + "trial": 2, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.002397042, + "cpu_seconds": 2.8246729999999998, + "cpu_percent": 28.239960762797317, + "cpu_ms_per_frame": 4.707788333333333 + }, + { + "variant": "ellipsis", + "trial": 2, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002619833, + "cpu_seconds": 0.7476820000000001, + "cpu_percent": 24.90098785676009, + "cpu_ms_per_frame": 4.153788888888889 + }, + { + "variant": "ellipsis", + "trial": 2, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003291125, + "cpu_seconds": 0.02936899999999998, + "cpu_percent": 0.2935933747504522, + "cpu_ms_per_frame": 0.048948333333333295 + }, + { + "variant": "ellipsis", + "trial": 2, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.00168525, + "cpu_seconds": 3.0570649999999997, + "cpu_percent": 30.565498949289566, + "cpu_ms_per_frame": 5.095108333333332 + }, + { + "variant": "whole-glyph", + "trial": 2, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.001901292, + "cpu_seconds": 1.140211, + "cpu_percent": 37.98296109997477, + "cpu_ms_per_frame": 6.334505555555555 + }, + { + "variant": "whole-glyph", + "trial": 2, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003346625, + "cpu_seconds": 0.027031000000000027, + "cpu_percent": 0.2702195676439436, + "cpu_ms_per_frame": 0.04505166666666671 + }, + { + "variant": "whole-glyph", + "trial": 2, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.001969958, + "cpu_seconds": 3.723713, + "cpu_percent": 37.22979588657549, + "cpu_ms_per_frame": 6.206188333333333 + }, + { + "variant": "whole-glyph", + "trial": 3, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002108042, + "cpu_seconds": 1.2509709999999998, + "cpu_percent": 41.66975280365342, + "cpu_ms_per_frame": 6.949838888888888 + }, + { + "variant": "whole-glyph", + "trial": 3, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.000649917, + "cpu_seconds": 0.049112000000000045, + "cpu_percent": 0.4910880833506137, + "cpu_ms_per_frame": 0.0818533333333334 + }, + { + "variant": "whole-glyph", + "trial": 3, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.002268334, + "cpu_seconds": 3.4577300000000006, + "cpu_percent": 34.569458492194066, + "cpu_ms_per_frame": 5.762883333333334 + }, + { + "variant": "per-pixel", + "trial": 3, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.002103166, + "cpu_seconds": 1.108778, + "cpu_percent": 36.9333743276163, + "cpu_ms_per_frame": 6.159877777777778 + }, + { + "variant": "per-pixel", + "trial": 3, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003710791, + "cpu_seconds": 0.033174999999999955, + "cpu_percent": 0.33162694017350425, + "cpu_ms_per_frame": 0.05529166666666659 + }, + { + "variant": "per-pixel", + "trial": 3, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.002887541, + "cpu_seconds": 3.443128, + "cpu_percent": 34.42134069674632, + "cpu_ms_per_frame": 5.738546666666667 + }, + { + "variant": "ellipsis", + "trial": 3, + "phase": "warmup", + "frames": 180, + "wall_seconds": 3.00255325, + "cpu_seconds": 0.700278, + "cpu_percent": 23.322750395850598, + "cpu_ms_per_frame": 3.8904333333333327 + }, + { + "variant": "ellipsis", + "trial": 3, + "phase": "idle", + "frames": 600, + "wall_seconds": 10.003357458, + "cpu_seconds": 0.019225000000000048, + "cpu_percent": 0.19218547453410464, + "cpu_ms_per_frame": 0.032041666666666746 + }, + { + "variant": "ellipsis", + "trial": 3, + "phase": "redraw", + "frames": 600, + "wall_seconds": 10.002494125, + "cpu_seconds": 2.370686, + "cpu_percent": 23.70094868713557, + "cpu_ms_per_frame": 3.9511433333333335 + } + ] +} diff --git a/docs/performance-sidebar-fade.md b/docs/performance-sidebar-fade.md new file mode 100644 index 0000000000..90572ee4a8 --- /dev/null +++ b/docs/performance-sidebar-fade.md @@ -0,0 +1,51 @@ +# Sidebar fade CPU comparison + +Measured 2026-09-16 on Apple M4, macOS 26.6.2, Rust 1.96.0. + +| Version | Idle CPU % median (range) | 60 Hz redraw CPU % median (range) | Redraw CPU ms/frame median | +| --- | ---: | ---: | ---: | +| Ellipsis baseline | 0.29 (0.19–0.33) | 30.57 (23.70–40.02) | 5.095 | +| Whole-glyph fade (20 px) | 0.30 (0.27–0.49) | 37.23 (34.57–42.36) | 6.206 | +| Per-pixel fade + smooth onset (20 px) | 0.29 (0.23–0.33) | 34.42 (28.24–37.54) | 5.739 | + +The per-pixel version’s median redraw CPU is **3.86 percentage points above ellipsis** and **2.81 points below the earlier whole-glyph fade**. Idle medians are effectively unchanged. The redraw ranges overlap substantially, so these dev-build samples do not establish a reliable production speedup or regression. + +CPU % is process user + system CPU seconds divided by wall seconds; 100% means one CPU core. These are native offscreen **UI-process** measurements, not whole-app CPU, GPU timing, or battery usage. Three fresh-process trials per version; ranges above are min–max, not confidence intervals. + +## Workload and controls + +The same `macos-resource-profile` driver from `6f1a7739` runs a 1320 × 880 logical-pixel window with native CoreText/Metal, dark appearance, 25 synthetic sessions, long conversation titles and branch names, and an empty transcript. The ready-state notification settles the startup overlay before measurement. Each process warms for 180 frames (3 s), then runs 600 paced idle frames (10 s) and 600 forced window-refresh frames (10 s), all at 60 Hz. Screenshot readback, font/setup work, and process shutdown are outside the measured intervals. + +Builds use the same repository dev profile (application opt-level 0; dependency opt-level 2). Builds completed before measurement. The order rotates: ellipsis/whole-glyph/per-pixel, per-pixel/ellipsis/whole-glyph, whole-glyph/per-pixel/ellipsis. No engine or network workload is driven. Normal host background activity remains uncontrolled; small differences within the observed ranges should not be treated as established speedups or regressions. No release-build, Windows-CPU, live-resize, or streaming-transcript performance claim is made. + +## Source provenance + +| Variant | Application source | Renderer | +| --- | --- | --- | +| Ellipsis | `720501437f18aef8b303edb4a3fd1a2d385fd2f7` + identical profiler driver | `c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add` | +| Whole-glyph fade | `8b0a7b2e589d27c09cc3d81f39daddd4b84d7abf` + identical profiler driver | `c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add` | +| Per-pixel + onset | source tree committed as `6f1a7739` (binary built immediately before commit) | `53869c204efb866d19af292cab8b1773898eeedd` | + +The same driver SHA-256 was used for all variants: `3efff1035faf6f7bce318bc48ac6345cd25f1b69b671262d27cdf3859f5c5834`. Binary SHA-256 values and all raw phase results are in [performance-sidebar-fade.json](performance-sidebar-fade.json). The whole-glyph versus per-pixel comparison includes the app's smooth-onset change as well as the renderer change; it does not isolate shader work alone. + +## Reproduction + +Copy `crates/ui/examples/macos-resource-profile.rs` from `6f1a7739` onto each source revision above. Build each serially with: + +```sh +cargo build -p zeron-ui --features resource-profile --example macos-resource-profile +``` + +Copy each resulting `target/debug/examples/macos-resource-profile` to an immutable path before building the next version, then run: + +```sh +python3 scripts/profile-sidebar-fade.py /tmp/fade-cpu-results /path/to/ellipsis /path/to/whole-glyph /path/to/per-pixel +``` + +The runner sets `ZERON_PROFILE_SIDEBAR_FADE=1`, `ZERON_PROFILE_BACKGROUND_CHATS=24`, and `ZERON_VERIFY_SIDEBAR_ROWS=1`; each process receives a separate output/settings directory. It records process CPU using `getrusage(RUSAGE_SELF)`. The offscreen platform has no native menu/delegate, and the driver initializes component/history globals before revealing the fixture. Failed setup/smoke runs are excluded; only the nine completed settled-fixture runs appear in the data. + +## Supplied visual preview + +![User-supplied sidebar fade preview](screenshots/sidebar-text-fade/user-preview.png) + +Provided by the user for the PRs. Its exact running build was not recorded; it is visual context, not a controlled before/after performance capture. diff --git a/scripts/profile-sidebar-fade.py b/scripts/profile-sidebar-fade.py index 9dda8971b1..a255797ea4 100644 --- a/scripts/profile-sidebar-fade.py +++ b/scripts/profile-sidebar-fade.py @@ -43,11 +43,16 @@ for key in ["ZERON_VERIFY_CACHE", "ZERON_VERIFY_INTERACTIONS", "ZERON_FRAME_STATS", "COMET_GPU_STATS"]: env.pop(key, None) with (run_dir / "stderr.log").open("w") as err: - run = subprocess.run([str(binaries[index]), str(frames), str(run_dir)], env=env, text=True, stdout=subprocess.PIPE, stderr=err) - (run_dir / "stdout.log").write_text(run.stdout) - run.check_returncode() - phases = [json.loads(line) for line in run.stdout.splitlines() if line.startswith('{') and '"cpu_percent"' in line] - assert {row["phase"] for row in phases} == {"warmup", "idle", "redraw"}, run.stdout + command = [str(binaries[index]), str(frames), str(run_dir)] + with subprocess.Popen(command, env=env, text=True, stdout=subprocess.PIPE, stderr=err) as process: + (run_dir / "process.json").write_text(json.dumps({"pid": process.pid, "command": command}, indent=2) + "\n") + stdout, _ = process.communicate() + returncode = process.returncode + (run_dir / "stdout.log").write_text(stdout) + if returncode: + raise subprocess.CalledProcessError(returncode, command, stdout) + phases = [json.loads(line) for line in stdout.splitlines() if line.startswith('{') and '"cpu_percent"' in line] + assert {row["phase"] for row in phases} == {"warmup", "idle", "redraw"}, stdout results.extend(dict(variant=name, trial=trial, **row) for row in phases) (args.output / "results.json").write_text(json.dumps(results, indent=2) + "\n") print(name, trial, [(row["phase"], round(row["cpu_percent"], 3)) for row in phases], flush=True) From f7f73bd77cce890fdb837cb364d01c427a8607bb Mon Sep 17 00:00:00 2001 From: gaelcado Date: Wed, 16 Sep 2026 23:21:30 +0200 Subject: [PATCH 8/9] Keep sidebar fade PR focused on behavior --- crates/ui/examples/macos-resource-profile.rs | 49 +--- docs/performance-sidebar-fade.json | 283 ------------------- docs/performance-sidebar-fade.md | 51 ---- scripts/profile-sidebar-fade.py | 58 ---- 4 files changed, 2 insertions(+), 439 deletions(-) delete mode 100644 docs/performance-sidebar-fade.json delete mode 100644 docs/performance-sidebar-fade.md delete mode 100644 scripts/profile-sidebar-fade.py diff --git a/crates/ui/examples/macos-resource-profile.rs b/crates/ui/examples/macos-resource-profile.rs index cc3b1683b7..7ff3673c95 100644 --- a/crates/ui/examples/macos-resource-profile.rs +++ b/crates/ui/examples/macos-resource-profile.rs @@ -36,8 +36,7 @@ fn main() -> anyhow::Result<()> { "Usage: macos-resource-profile FRAMES_JSON OUTPUT_DIR" ); let frames: Vec = serde_json::from_slice(&std::fs::read(&args[1])?)?; - let fade_bench = std::env::var_os("ZERON_PROFILE_SIDEBAR_FADE").is_some(); - anyhow::ensure!(fade_bench || !frames.is_empty(), "Empty replay"); + anyhow::ensure!(!frames.is_empty(), "Empty replay"); let output = std::path::PathBuf::from(&args[2]); std::fs::create_dir_all(&output)?; let native = gpui_platform::current_platform(true); @@ -52,7 +51,6 @@ fn main() -> anyhow::Result<()> { let app = gpui::Application::with_platform(platform).with_assets(icons::Assets) .run_embedded(move |cx| { gpui_tokio::init(cx); - gpui_base::init(cx); let settings = settings::UiSettings::default(); settings::init(settings.clone(), data.clone(), cx); let fonts = typography::register_fonts(cx); @@ -60,11 +58,9 @@ fn main() -> anyhow::Result<()> { theme_library::init(data.clone(), cx); appearance::init(appearance::AppearanceMode::Dark, settings.theme_selection, settings.accent, settings.surface, cx); - history::init(settings.git_history_columns, settings.git_history_column_widths, - settings.git_history_column_order.clone(), settings.git_history_author_display, cx); composer::init(cx, zeron_ui::settings::ComposerSendBehavior::default()); terminal::panel::init(cx); - // The offscreen bench platform has no NSApplication delegate or menus. + app_menus::init(cx); let state = cx.new(|_| { let mut state = state::AppState::new(); state.connection = zeron_proto::view::ConnectionStatus::Ready; @@ -130,47 +126,6 @@ fn main() -> anyhow::Result<()> { })); let dispatcher = executor.dispatcher().as_bench().unwrap(); let start = Instant::now(); - if fade_bench { - // Deliver the initial ready state so the boot splash can settle. - app.update(|cx| state.update(cx, |_, cx| cx.notify())); - // Native UI-process CPU, excluding setup, screenshot readback, and the - // engine/network. Fixed wall-time pacing makes before/after comparable. - fn cpu_seconds() -> f64 { - let mut usage = std::mem::MaybeUninit::::uninit(); - assert_eq!(unsafe { libc::getrusage(libc::RUSAGE_SELF, usage.as_mut_ptr()) }, 0); - let usage = unsafe { usage.assume_init() }; - (usage.ru_utime.tv_sec + usage.ru_stime.tv_sec) as f64 - + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) as f64 / 1_000_000.0 - } - for (phase, count, redraw) in [("warmup", 180, true), ("idle", 600, false), ("redraw", 600, true)] { - let begin = Instant::now(); - let cpu_begin = cpu_seconds(); - for frame in 0..count { - objc::rc::autoreleasepool(|| { - app.update(|cx| window.update(cx, |_, window, cx| { - if redraw { window.refresh(); } - window.simulate_next_frame(cx); - }).unwrap()); - dispatcher.run_until_idle(); - app.update(|cx| window.update(cx, |_, window, _| window.present_if_needed()).unwrap()); - }); - let deadline = begin + Duration::from_secs_f64((frame + 1) as f64 / 60.0); - if let Some(wait) = deadline.checked_duration_since(Instant::now()) { std::thread::sleep(wait); } - } - let cpu = cpu_seconds() - cpu_begin; - let wall = begin.elapsed().as_secs_f64(); - println!("{}", serde_json::json!({"phase": phase, "frames":count, - "wall_seconds":wall,"cpu_seconds":cpu,"cpu_percent":100.0*cpu/wall, - "cpu_ms_per_frame":1000.0*cpu/count as f64})); - } - app.update(|cx| window.update(cx, |_, window, _| { - window.render_to_image().unwrap().save(output.join("sidebar-fixture.png")).unwrap(); - }).unwrap()); - drop(state); - app.update(|cx| cx.quit()); - drop(app); - return Ok(()); - } let first_at = frames[0].at; let mut frames = frames.into_iter().peekable(); let mut completed_at = None; diff --git a/docs/performance-sidebar-fade.json b/docs/performance-sidebar-fade.json deleted file mode 100644 index 28f6db97c1..0000000000 --- a/docs/performance-sidebar-fade.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "hardware": "Apple M4", - "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.6.2\nBuildVersion:\t\t25G83", - "driver_commit": "6f1a7739", - "driver_sha256": "3efff1035faf6f7bce318bc48ac6345cd25f1b69b671262d27cdf3859f5c5834", - "binary_sha256": { - "ellipsis": "ec3ea3a06d83bae8a376383291792596882246db827b550e6cc966498b38d184", - "whole-glyph": "06a92b2355c9e3de4844f63446baf06dce7a66be6990ed5035e7e2a94c4fdd97", - "per-pixel": "64eb685216dc6c9159cd51cceae3031ad4348b08615a7ab7c0f58c3a0bc0adaa" - }, - "results": [ - { - "variant": "ellipsis", - "trial": 1, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002567667, - "cpu_seconds": 0.766003, - "cpu_percent": 25.51159823702984, - "cpu_ms_per_frame": 4.255572222222223 - }, - { - "variant": "ellipsis", - "trial": 1, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.002825, - "cpu_seconds": 0.032941, - "cpu_percent": 0.32931696795655224, - "cpu_ms_per_frame": 0.05490166666666666 - }, - { - "variant": "ellipsis", - "trial": 1, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.001730917, - "cpu_seconds": 4.002253, - "cpu_percent": 40.015603631140955, - "cpu_ms_per_frame": 6.670421666666666 - }, - { - "variant": "whole-glyph", - "trial": 1, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002060167, - "cpu_seconds": 1.241203, - "cpu_percent": 41.34504077046368, - "cpu_ms_per_frame": 6.895572222222222 - }, - { - "variant": "whole-glyph", - "trial": 1, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.00334925, - "cpu_seconds": 0.029833, - "cpu_percent": 0.2982301152786403, - "cpu_ms_per_frame": 0.049721666666666664 - }, - { - "variant": "whole-glyph", - "trial": 1, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.001954375, - "cpu_seconds": 4.236681, - "cpu_percent": 42.35853155448932, - "cpu_ms_per_frame": 7.061134999999999 - }, - { - "variant": "per-pixel", - "trial": 1, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.001094792, - "cpu_seconds": 1.179157, - "cpu_percent": 39.290894880870525, - "cpu_ms_per_frame": 6.550872222222222 - }, - { - "variant": "per-pixel", - "trial": 1, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003191875, - "cpu_seconds": 0.02876399999999979, - "cpu_percent": 0.28754821820310017, - "cpu_ms_per_frame": 0.04793999999999965 - }, - { - "variant": "per-pixel", - "trial": 1, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.002541041, - "cpu_seconds": 3.755167, - "cpu_percent": 37.54213039074498, - "cpu_ms_per_frame": 6.258611666666667 - }, - { - "variant": "per-pixel", - "trial": 2, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002435875, - "cpu_seconds": 0.834124, - "cpu_percent": 27.78157585130773, - "cpu_ms_per_frame": 4.634022222222223 - }, - { - "variant": "per-pixel", - "trial": 2, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003370292, - "cpu_seconds": 0.02324499999999996, - "cpu_percent": 0.23237168395725286, - "cpu_ms_per_frame": 0.038741666666666605 - }, - { - "variant": "per-pixel", - "trial": 2, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.002397042, - "cpu_seconds": 2.8246729999999998, - "cpu_percent": 28.239960762797317, - "cpu_ms_per_frame": 4.707788333333333 - }, - { - "variant": "ellipsis", - "trial": 2, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002619833, - "cpu_seconds": 0.7476820000000001, - "cpu_percent": 24.90098785676009, - "cpu_ms_per_frame": 4.153788888888889 - }, - { - "variant": "ellipsis", - "trial": 2, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003291125, - "cpu_seconds": 0.02936899999999998, - "cpu_percent": 0.2935933747504522, - "cpu_ms_per_frame": 0.048948333333333295 - }, - { - "variant": "ellipsis", - "trial": 2, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.00168525, - "cpu_seconds": 3.0570649999999997, - "cpu_percent": 30.565498949289566, - "cpu_ms_per_frame": 5.095108333333332 - }, - { - "variant": "whole-glyph", - "trial": 2, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.001901292, - "cpu_seconds": 1.140211, - "cpu_percent": 37.98296109997477, - "cpu_ms_per_frame": 6.334505555555555 - }, - { - "variant": "whole-glyph", - "trial": 2, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003346625, - "cpu_seconds": 0.027031000000000027, - "cpu_percent": 0.2702195676439436, - "cpu_ms_per_frame": 0.04505166666666671 - }, - { - "variant": "whole-glyph", - "trial": 2, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.001969958, - "cpu_seconds": 3.723713, - "cpu_percent": 37.22979588657549, - "cpu_ms_per_frame": 6.206188333333333 - }, - { - "variant": "whole-glyph", - "trial": 3, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002108042, - "cpu_seconds": 1.2509709999999998, - "cpu_percent": 41.66975280365342, - "cpu_ms_per_frame": 6.949838888888888 - }, - { - "variant": "whole-glyph", - "trial": 3, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.000649917, - "cpu_seconds": 0.049112000000000045, - "cpu_percent": 0.4910880833506137, - "cpu_ms_per_frame": 0.0818533333333334 - }, - { - "variant": "whole-glyph", - "trial": 3, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.002268334, - "cpu_seconds": 3.4577300000000006, - "cpu_percent": 34.569458492194066, - "cpu_ms_per_frame": 5.762883333333334 - }, - { - "variant": "per-pixel", - "trial": 3, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.002103166, - "cpu_seconds": 1.108778, - "cpu_percent": 36.9333743276163, - "cpu_ms_per_frame": 6.159877777777778 - }, - { - "variant": "per-pixel", - "trial": 3, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003710791, - "cpu_seconds": 0.033174999999999955, - "cpu_percent": 0.33162694017350425, - "cpu_ms_per_frame": 0.05529166666666659 - }, - { - "variant": "per-pixel", - "trial": 3, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.002887541, - "cpu_seconds": 3.443128, - "cpu_percent": 34.42134069674632, - "cpu_ms_per_frame": 5.738546666666667 - }, - { - "variant": "ellipsis", - "trial": 3, - "phase": "warmup", - "frames": 180, - "wall_seconds": 3.00255325, - "cpu_seconds": 0.700278, - "cpu_percent": 23.322750395850598, - "cpu_ms_per_frame": 3.8904333333333327 - }, - { - "variant": "ellipsis", - "trial": 3, - "phase": "idle", - "frames": 600, - "wall_seconds": 10.003357458, - "cpu_seconds": 0.019225000000000048, - "cpu_percent": 0.19218547453410464, - "cpu_ms_per_frame": 0.032041666666666746 - }, - { - "variant": "ellipsis", - "trial": 3, - "phase": "redraw", - "frames": 600, - "wall_seconds": 10.002494125, - "cpu_seconds": 2.370686, - "cpu_percent": 23.70094868713557, - "cpu_ms_per_frame": 3.9511433333333335 - } - ] -} diff --git a/docs/performance-sidebar-fade.md b/docs/performance-sidebar-fade.md deleted file mode 100644 index 90572ee4a8..0000000000 --- a/docs/performance-sidebar-fade.md +++ /dev/null @@ -1,51 +0,0 @@ -# Sidebar fade CPU comparison - -Measured 2026-09-16 on Apple M4, macOS 26.6.2, Rust 1.96.0. - -| Version | Idle CPU % median (range) | 60 Hz redraw CPU % median (range) | Redraw CPU ms/frame median | -| --- | ---: | ---: | ---: | -| Ellipsis baseline | 0.29 (0.19–0.33) | 30.57 (23.70–40.02) | 5.095 | -| Whole-glyph fade (20 px) | 0.30 (0.27–0.49) | 37.23 (34.57–42.36) | 6.206 | -| Per-pixel fade + smooth onset (20 px) | 0.29 (0.23–0.33) | 34.42 (28.24–37.54) | 5.739 | - -The per-pixel version’s median redraw CPU is **3.86 percentage points above ellipsis** and **2.81 points below the earlier whole-glyph fade**. Idle medians are effectively unchanged. The redraw ranges overlap substantially, so these dev-build samples do not establish a reliable production speedup or regression. - -CPU % is process user + system CPU seconds divided by wall seconds; 100% means one CPU core. These are native offscreen **UI-process** measurements, not whole-app CPU, GPU timing, or battery usage. Three fresh-process trials per version; ranges above are min–max, not confidence intervals. - -## Workload and controls - -The same `macos-resource-profile` driver from `6f1a7739` runs a 1320 × 880 logical-pixel window with native CoreText/Metal, dark appearance, 25 synthetic sessions, long conversation titles and branch names, and an empty transcript. The ready-state notification settles the startup overlay before measurement. Each process warms for 180 frames (3 s), then runs 600 paced idle frames (10 s) and 600 forced window-refresh frames (10 s), all at 60 Hz. Screenshot readback, font/setup work, and process shutdown are outside the measured intervals. - -Builds use the same repository dev profile (application opt-level 0; dependency opt-level 2). Builds completed before measurement. The order rotates: ellipsis/whole-glyph/per-pixel, per-pixel/ellipsis/whole-glyph, whole-glyph/per-pixel/ellipsis. No engine or network workload is driven. Normal host background activity remains uncontrolled; small differences within the observed ranges should not be treated as established speedups or regressions. No release-build, Windows-CPU, live-resize, or streaming-transcript performance claim is made. - -## Source provenance - -| Variant | Application source | Renderer | -| --- | --- | --- | -| Ellipsis | `720501437f18aef8b303edb4a3fd1a2d385fd2f7` + identical profiler driver | `c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add` | -| Whole-glyph fade | `8b0a7b2e589d27c09cc3d81f39daddd4b84d7abf` + identical profiler driver | `c2d273dc3dadcb260b0fa7c35fc2fe02a14f5add` | -| Per-pixel + onset | source tree committed as `6f1a7739` (binary built immediately before commit) | `53869c204efb866d19af292cab8b1773898eeedd` | - -The same driver SHA-256 was used for all variants: `3efff1035faf6f7bce318bc48ac6345cd25f1b69b671262d27cdf3859f5c5834`. Binary SHA-256 values and all raw phase results are in [performance-sidebar-fade.json](performance-sidebar-fade.json). The whole-glyph versus per-pixel comparison includes the app's smooth-onset change as well as the renderer change; it does not isolate shader work alone. - -## Reproduction - -Copy `crates/ui/examples/macos-resource-profile.rs` from `6f1a7739` onto each source revision above. Build each serially with: - -```sh -cargo build -p zeron-ui --features resource-profile --example macos-resource-profile -``` - -Copy each resulting `target/debug/examples/macos-resource-profile` to an immutable path before building the next version, then run: - -```sh -python3 scripts/profile-sidebar-fade.py /tmp/fade-cpu-results /path/to/ellipsis /path/to/whole-glyph /path/to/per-pixel -``` - -The runner sets `ZERON_PROFILE_SIDEBAR_FADE=1`, `ZERON_PROFILE_BACKGROUND_CHATS=24`, and `ZERON_VERIFY_SIDEBAR_ROWS=1`; each process receives a separate output/settings directory. It records process CPU using `getrusage(RUSAGE_SELF)`. The offscreen platform has no native menu/delegate, and the driver initializes component/history globals before revealing the fixture. Failed setup/smoke runs are excluded; only the nine completed settled-fixture runs appear in the data. - -## Supplied visual preview - -![User-supplied sidebar fade preview](screenshots/sidebar-text-fade/user-preview.png) - -Provided by the user for the PRs. Its exact running build was not recorded; it is visual context, not a controlled before/after performance capture. diff --git a/scripts/profile-sidebar-fade.py b/scripts/profile-sidebar-fade.py deleted file mode 100644 index a255797ea4..0000000000 --- a/scripts/profile-sidebar-fade.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -"""Compare immutable native UI profiler binaries; build all variants first. - -Each binary must contain the same macos-resource-profile driver. CPU percentage -is process user+system CPU time / elapsed wall time (100% = one CPU core). -The fixture uses native CoreText/Metal offscreen rendering, not the app engine. -""" -import argparse -import hashlib -import json -import os -from pathlib import Path -import subprocess - -parser = argparse.ArgumentParser(description=__doc__) -parser.add_argument("output", type=Path) -parser.add_argument("binaries", nargs=3, help="ellipsis, whole-glyph, per-pixel binaries") -args = parser.parse_args() -args.output.mkdir(parents=True, exist_ok=True) -frames = args.output.resolve() / "empty-frames.json" -frames.write_text("[]\n") -names = ["ellipsis", "whole-glyph", "per-pixel"] -binaries = [Path(p).resolve() for p in args.binaries] -metadata = { - "binaries": { - name: {"path": str(path), "sha256": hashlib.file_digest(path.open("rb"), "sha256").hexdigest()} - for name, path in zip(names, binaries) - }, - "cpu": subprocess.check_output(["sysctl", "-n", "machdep.cpu.brand_string"], text=True).strip(), - "os": subprocess.check_output(["sw_vers"], text=True).strip(), - "note": "Three balanced-order trials; dev profile; 3s warmup, 10s idle, 10s forced redraw at 60 Hz; 25 sessions.", -} -(args.output / "metadata.json").write_text(json.dumps(metadata, indent=2) + "\n") -results = [] -# Rotate each variant through first/middle/last position to limit order bias. -for trial, order in enumerate([[0, 1, 2], [2, 0, 1], [1, 2, 0]], 1): - for index in order: - name = names[index] - run_dir = args.output.resolve() / f"{name}-{trial}" - run_dir.mkdir() - env = os.environ.copy() - env.update(ZERON_PROFILE_SIDEBAR_FADE="1", ZERON_PROFILE_BACKGROUND_CHATS="24", ZERON_VERIFY_SIDEBAR_ROWS="1") - for key in ["ZERON_VERIFY_CACHE", "ZERON_VERIFY_INTERACTIONS", "ZERON_FRAME_STATS", "COMET_GPU_STATS"]: - env.pop(key, None) - with (run_dir / "stderr.log").open("w") as err: - command = [str(binaries[index]), str(frames), str(run_dir)] - with subprocess.Popen(command, env=env, text=True, stdout=subprocess.PIPE, stderr=err) as process: - (run_dir / "process.json").write_text(json.dumps({"pid": process.pid, "command": command}, indent=2) + "\n") - stdout, _ = process.communicate() - returncode = process.returncode - (run_dir / "stdout.log").write_text(stdout) - if returncode: - raise subprocess.CalledProcessError(returncode, command, stdout) - phases = [json.loads(line) for line in stdout.splitlines() if line.startswith('{') and '"cpu_percent"' in line] - assert {row["phase"] for row in phases} == {"warmup", "idle", "redraw"}, stdout - results.extend(dict(variant=name, trial=trial, **row) for row in phases) - (args.output / "results.json").write_text(json.dumps(results, indent=2) + "\n") - print(name, trial, [(row["phase"], round(row["cpu_percent"], 3)) for row in phases], flush=True) From cd247d721113a71065c2e4ca1ba92877beb78a9e Mon Sep 17 00:00:00 2001 From: wing-anara Date: Thu, 17 Sep 2026 22:08:08 +0000 Subject: [PATCH 9/9] Preserve vertical scroll fades inside overflowing labels --- crates/ui/src/edge_fade.rs | 175 ++++++++++++++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 4 deletions(-) diff --git a/crates/ui/src/edge_fade.rs b/crates/ui/src/edge_fade.rs index 5030cf741c..c78b8999e7 100644 --- a/crates/ui/src/edge_fade.rs +++ b/crates/ui/src/edge_fade.rs @@ -5,11 +5,45 @@ //! fade: over a see-through blurred backdrop no painted overlay can fade //! content out, because "what is behind the window" is not a paintable color. +use std::cell::RefCell; + use gpui::{ - AnyElement, App, Bounds, EdgeFade, Element, GlobalElementId, InspectorElementId, IntoElement, - LayoutId, Pixels, ScrollHandle, Window, px, + AnyElement, App, Bounds, EdgeFade, Element, Global, GlobalElementId, InspectorElementId, + IntoElement, LayoutId, Pixels, ScrollHandle, Window, WindowId, px, }; +// GPUI replaces rather than composes nested EdgeFade scopes. Keep the active +// wrapper scopes during painting so a label can retain its scroll container's +// vertical fade. Window IDs prevent a nested draw of another window inheriting it. +#[derive(Default)] +struct PaintFades(RefCell>); + +impl Global for PaintFades {} + +fn active_fade(window: &Window, cx: &App) -> Option { + cx.try_global::()? + .0 + .borrow() + .iter() + .rev() + .find(|(id, _)| *id == window.window_handle().window_id()) + .map(|(_, fade)| *fade) +} + +fn inherit_vertical_fade(mut label: EdgeFade, parent: EdgeFade) -> EdgeFade { + if !label.top && !label.bottom && (parent.top || parent.bottom) { + label.bounds.origin.y = parent.bounds.origin.y; + label.bounds.size.height = parent.bounds.size.height; + label.top = parent.top; + label.bottom = parent.bottom; + // Keep the label's horizontal band independent of the container's + // vertical band, including asymmetric top/bottom overrides. + label.band_top = Some(parent.band_top.unwrap_or(parent.band)); + label.band_bottom = Some(parent.band_bottom.unwrap_or(parent.band)); + } + label +} + /// Fade the child's content at its own edges: `top`/`bottom` select which /// edges (pass the "is there hidden overflow" flags), `band` is the ramp /// height in px. Horizontal edges via [`EdgeFaded::fade_left`] / @@ -218,7 +252,24 @@ impl Element for EdgeFaded { right, } }); - window.with_edge_fade(fade, |window| self.child.paint(window, cx)); + let Some(mut fade) = fade else { + self.child.paint(window, cx); + return; + }; + if self.smooth_overflow_x + && let Some(parent) = active_fade(window, cx) + { + fade = inherit_vertical_fade(fade, parent); + } + if !cx.has_global::() { + cx.set_global(PaintFades::default()); + } + cx.global::() + .0 + .borrow_mut() + .push((window.window_handle().window_id(), fade)); + window.with_edge_fade(Some(fade), |window| self.child.paint(window, cx)); + cx.global::().0.borrow_mut().pop(); } } @@ -231,7 +282,123 @@ fn label_fade_outset(overflow: f32, band: f32) -> f32 { #[cfg(test)] mod tests { - use super::label_fade_outset; + use super::*; + use gpui::{AppContext, Context, Render, Styled, div, prelude::*}; + use std::rc::Rc; + + #[gpui::test] + fn painted_label_retains_scroll_fade_across_overflow_transitions( + cx: &mut gpui::TestAppContext, + ) { + struct Fixture { + width: f32, + top: bool, + bottom: bool, + observed: Rc>>>, + } + impl Render for Fixture { + fn render(&mut self, _: &mut Window, _: &mut Context) -> impl IntoElement { + let probe = |width: f32| { + let observed = self.observed.clone(); + gpui::canvas( + |_, _, _| (), + move |_, _, window, cx| { + observed.borrow_mut().push(active_fade(window, cx)); + }, + ) + .w(px(width)) + .h(px(20.0)) + .flex_none() + }; + let scroll = ScrollHandle::new(); + let label = edge_faded( + 20.0, + false, + false, + div() + .id("label") + .w(px(self.width)) + .overflow_hidden() + .track_scroll(&scroll) + .flex() + .child(probe(200.0)), + ) + .fade_right(true) + .fade_label_overflow(&scroll); + div() + .child( + edge_faded( + 24.0, + self.top, + self.bottom, + div() + .w(px(300.0)) + .h(px(100.0)) + .child(label) + .child(probe(20.0)), + ) + .band_top(12.0) + .band_bottom(30.0) + .inset_top(7.0) + .outset_bottom(9.0), + ) + .child(probe(20.0)) + } + } + let observed = Rc::new(RefCell::new(Vec::new())); + let handle = cx.add_window(|_, _| Fixture { + width: 80.0, + top: true, + bottom: true, + observed: observed.clone(), + }); + for (top, bottom) in [(true, true), (true, false), (false, true), (false, false)] { + for width in [80.0, 240.0, 80.0] { + handle + .update(cx, |view, _, cx| { + view.width = width; + view.top = top; + view.bottom = bottom; + cx.notify(); + }) + .unwrap(); + observed.borrow_mut().clear(); + cx.update_window(handle.into(), |_, window, cx| { + window.draw(cx).clear(); + assert!(active_fade(window, cx).is_none(), "paint scope leaked"); + }) + .unwrap(); + let seen = observed.borrow(); + let [label, sibling, outside] = &seen[seen.len() - 3..] else { + unreachable!() + }; + assert!(outside.is_none(), "fade leaked outside scroll container"); + let overflowing = width < 200.0; + if top || bottom { + let label = label.unwrap(); + let sibling = sibling.unwrap(); + assert_eq!((label.top, label.bottom), (top, bottom)); + assert_eq!(label.bounds.origin.y, sibling.bounds.origin.y); + assert_eq!(label.bounds.size.height, sibling.bounds.size.height); + assert_eq!(label.band_top, Some(px(12.0))); + assert_eq!(label.band_bottom, Some(px(30.0))); + assert_eq!(label.right, overflowing); + assert!(!sibling.right, "label fade leaked to a sibling"); + if overflowing { + assert_eq!(label.band, px(20.0)); + assert_eq!(label.bounds.size.width, px(width)); + } + } else { + assert!(sibling.is_none()); + assert_eq!(label.is_some(), overflowing); + if let Some(label) = label { + assert!(!label.top && !label.bottom); + assert!(label.right); + } + } + } + } + } #[test] fn label_fade_enters_continuously_and_settles_at_one_band() {