From 7133dfb04ac843886739b16445bad6c34199e3ca Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 11:32:40 +0700 Subject: [PATCH 01/37] feat(nix-monitor): add nix-monitor plugin --- nix-monitor/README.md | 7 + nix-monitor/nix_monitor.luau | 55 ++++++++ nix-monitor/nix_monitor_service.luau | 111 ++++++++++++++++ nix-monitor/panel.luau | 186 +++++++++++++++++++++++++++ nix-monitor/plugin.toml | 164 +++++++++++++++++++++++ nix-monitor/thumbnail.webp | Bin 0 -> 51640 bytes nix-monitor/translations/en.json | 46 +++++++ 7 files changed, 569 insertions(+) create mode 100644 nix-monitor/README.md create mode 100644 nix-monitor/nix_monitor.luau create mode 100644 nix-monitor/nix_monitor_service.luau create mode 100644 nix-monitor/panel.luau create mode 100644 nix-monitor/plugin.toml create mode 100644 nix-monitor/thumbnail.webp create mode 100644 nix-monitor/translations/en.json diff --git a/nix-monitor/README.md b/nix-monitor/README.md new file mode 100644 index 0000000..c251f59 --- /dev/null +++ b/nix-monitor/README.md @@ -0,0 +1,7 @@ +# Nix Monitor + +![thumbnail](thumbnail.webp) + +*Nix Monitor* checks Nixpkgs update by comparing local nix hash and remote nixpkgs's hash. It also can run update and clean command. + +No AI is used here but this is my first time writing Luau and plugin in general, so expect some bug. PRs are welcomed! diff --git a/nix-monitor/nix_monitor.luau b/nix-monitor/nix_monitor.luau new file mode 100644 index 0000000..b65d110 --- /dev/null +++ b/nix-monitor/nix_monitor.luau @@ -0,0 +1,55 @@ + +function tr(key) + return noctalia.tr(key) +end + +function barCfg(key) + return barWidget.getConfig(key) +end + +function getState(key) + return noctalia.state.get(key) +end + +function displayWidget(glyph: string, text: string, color: string?) + if color == nil then + color = "on_surface" + end + + if barCfg("colorize_text") then + barWidget.setColor(color) + end + + if barCfg("colorize_glyph") then + barWidget.setGlyphColor(color) + end + + if barCfg("show_glyph") then + barWidget.setGlyph(glyph) + end + + if barCfg("show_text") then + barWidget.setText(text) + end +end + +function update() + if getState("isRunning") then + displayWidget(barCfg("checking_glyph"), tr("bar.checking"), barCfg("checking_color")) + else + if getState("isUpdateAvailable") then + displayWidget(barCfg("update_available_glyph"), tr("bar.update_available"), barCfg("update_available_color")) + else + if getState("localHash") == "n/a" or getState("remoteHash") == "n/a" then + displayWidget(barCfg("unknown_glyph"), tr("bar.unknown"), barCfg("unknown_color")) + else + displayWidget(barCfg("up_to_date_glyph"), tr("bar.up_to_date"), barCfg("up_to_date_color")) + end + end + end + +end + +function onClick() + noctalia.togglePanel("avivbintangaringga/nix-monitor:panel") +end diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau new file mode 100644 index 0000000..a12fc66 --- /dev/null +++ b/nix-monitor/nix_monitor_service.luau @@ -0,0 +1,111 @@ +noctalia.setUpdateInterval(100) + +function tr(key) + return noctalia.tr(key) +end + +function cfg(key) + return noctalia.getConfig(key) +end + +function getState(key) + return noctalia.state.get(key) +end + +function setState(key, val) + noctalia.state.set(key, val) +end + +function watchState(key, cb) + noctalia.state.watch(key, cb) +end + +local branch = cfg("branch") +local updateCheckInterval = cfg("check_interval") +local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" +local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" +local completedCommands = 0 + +setState("lastCheckTime", 0) +setState("lastCheckTimeStr", "n/a") +setState("localHash", "n/a") +setState("remoteHash", "n/a") +setState("isRunning", false) +setState("isUpdateAvailable", false) + +function update() + if (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then + checkUpdate() + end +end + +function checkUpdate() + if getState("isRunning") then + return + end + + setState("lastCheckTime", os.time()) + noctalia.runAsync("date", function(date) setState("lastCheckTimeStr", date.stdout) end) + + if cfg("show_checking_notification") then + noctalia.notify(tr("notification.checking_update")) + end + + setState("isRunning", true) + + completedCommands = 0 + + noctalia.runAsync(localHashCmd, getLocalHash) + noctalia.runStream(remoteHashCmd, getRemoteHash) +end + +function getLocalHash(result) + if getState("isRunning") ~= true then + return + end + + setState("localHash", result.stdout) + completedCommands += 1 + onHashCheckCompleted() +end + +function getRemoteHash(line) + if getState("isRunning") ~= true then + return + end + + setState("remoteHash", line) + completedCommands += 1 + onHashCheckCompleted() +end + +function onHashCheckCompleted() + if completedCommands < 2 then + return + end + + if getState("localHash") ~= getState("remoteHash") then + setState("isUpdateAvailable", true) + if cfg("show_update_notification") then + noctalia.notify(tr("notification.update_is_available")) + end + end + + if cfg("show_checking_notification") then + noctalia.notify(tr("notification.update_check_completed")) + end + + setState("isRunning", false) +end + +watchState("command", function(command) + if command == "check" then + checkUpdate() + end + + if command == "cancel" then + noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) + setState("isRunning", false) + completedCommands = 0 + end +end) diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau new file mode 100644 index 0000000..2704d31 --- /dev/null +++ b/nix-monitor/panel.luau @@ -0,0 +1,186 @@ +function tr(key) + return noctalia.tr(key) +end + +function barCfg(key) + return barWidget.getConfig(key) +end + +function cfg(key) + return noctalia.getConfig(key) +end + +function getState(key) + return noctalia.state.get(key) +end + +function setState(key, val) + noctalia.state.set(key, val) +end + +function watchState(key, cb) + noctalia.state.watch(key, cb) +end + +local function labelBox(subtext, text, glyph) + return ui.column({ + fill = "surface/0.7", + flexGrow = 1, + height = 100, + radius = 8, + align = "center", + padding = 12, + justify = "space_between" + }, { + ui.glyph({ + name = glyph, + size = 30 + }), + ui.label({ + text = text, + fontWeight = "bold" + }), + ui.label({ + text = subtext, + fontSize = 12, + fontWeight = "medium" + }), + }) +end + +local function render() + local firstBtn = btnCheck + + if getState("isRunning") then + firstBtn = ui.button({ + text = tr("panel.cancel"), + glyph = "cancel", + flexGrow = 1, + variant = "destructive", + onClick = "onCancelClicked", + }) + else + if getState("isUpdateAvailable") then + firstBtn = ui.button({ + text = tr("panel.update"), + glyph = "progress-down", + flexGrow = 1, + variant = "primary", + onClick = "onUpdateClicked", + }) + else + firstBtn = ui.button({ + text = tr("panel.check"), + glyph = "search", + flexGrow = 1, + variant = "outline", + onClick = "onCheckClicked", + }) + end + end + + local lastCheckTimeStr = getState("lastCheckTimeStr") + + panel.render( + ui.column({ + gap = 8 + }, { + ui.row({ + justify = "space_between", + align = "center" + }, { + ui.label({ + text = tr("panel.title"), + fontSize = 20, + }), + + ui.label({ + text = cfg("branch"), + fontSize = 14, + }), + }), + ui.separator({ + thickness = 2, + orientation = "horizontal", + spacing = 4 + }), + ui.row({ + gap = 8, + align = "center", + justify = "space_between" + }, { + labelBox(tr("panel.local"), getState("localHash"), "devices-pc"), + labelBox(tr("panel.remote"), getState("remoteHash"), "world"), + }), + ui.separator({ + thickness = 2, + orientation = "horizontal", + spacing = 4 + }), + ui.label({ + text = `{tr("panel.last_checked")}: {lastCheckTimeStr}` + }), + ui.row({ + gap = 8, + align = "center", + justify = "space_between" + }, { + firstBtn, + ui.button({ + text = tr("panel.clean"), + glyph = "trash", + flexGrow = 1, + variant = "destructive", + onClick = "onCleanClicked", + }), + }) + }) + ) +end + +watchState("isRunning", render) +watchState("lastCheckTimeStr", render) +watchState("localHash", render) +watchState("remoteHash", render) + +function onOpen(_ctx) + render() +end + +function onCheckClicked() + setState("command", "check") +end + +function onCancelClicked() + setState("command", "cancel") +end + +function onUpdateClicked() + command = cfg("update_command") + if command == "" then + noctalia.notifyError(tr("notification.update_command_is_empty")) + return + end + + if cfg("close_on_enter") then + command = `{command} && echo && read -p "{tr("terminal.press_enter_to_exit")}"` + end + + panel.close() + noctalia.runInTerminal(command) +end + +function onCleanClicked() + command = cfg("clean_command") + if command == "" then + noctalia.notifyError(tr("notification.clean_command_is_empty")) + return + end + + if cfg("close_on_enter") then + command = `{command} && echo && read -p "{tr("terminal.press_enter_to_exit")}"` + end + + panel.close() + noctalia.runInTerminal(command) +end diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml new file mode 100644 index 0000000..4e34514 --- /dev/null +++ b/nix-monitor/plugin.toml @@ -0,0 +1,164 @@ +id = "avivbintangaringga/nix-monitor" +name = "Nix Monitor" +version = "1.0.0" +min_noctalia = "5.0.0" +author = "avivbintangaringga" +description = "Nixpkgs update monitor" +tags = [ "nix", "utility" ] +dependencies = [ "nixos-version", "git", "pkill" ] + +[[widget]] +id = "Nix Monitor" +entry = "nix_monitor.luau" + +[[widget.setting]] +key = "show_text" +type = "boolean" +label_key = "setting.widget.show_text.label" +default = true + +[[widget.setting]] +key = "colorize_text" +type = "boolean" +label_key = "setting.widget.colorize_text.label" +default = false + +[[widget.setting]] +key = "show_glyph" +type = "boolean" +label_key = "setting.widget.show_glyph.label" +default = true + +[[widget.setting]] +key = "colorize_glyph" +type = "boolean" +label_key = "setting.widget.colorize_glyph.label" +default = true + +[[widget.setting]] +key = "up_to_date_glyph" +type = "glyph" +label_key = "setting.widget.up_to_date_glyph.label" +default = "rosette-discount-check" + +[[widget.setting]] +key = "up_to_date_color" +type = "color" +label_key = "setting.widget.up_to_date_color.label" +default = "#57ff57" + +[[widget.setting]] +key = "checking_glyph" +type = "glyph" +label_key = "setting.widget.checking_glyph.label" +default = "loader-3" + +[[widget.setting]] +key = "checking_color" +type = "color" +label_key = "setting.widget.checking_color.label" +default = "#ffeb57" + +[[widget.setting]] +key = "update_available_glyph" +type = "glyph" +label_key = "setting.widget.update_available_glyph.label" +default = "cloud-download" + +[[widget.setting]] +key = "update_available_color" +type = "color" +label_key = "setting.widget.update_available_color.label" +default = "#ff5757" + +[[widget.setting]] +key = "unknown_glyph" +type = "glyph" +label_key = "setting.widget.unknown_glyph.label" +default = "cloud-question" + +[[widget.setting]] +key = "unknown_color" +type = "color" +label_key = "setting.widget.unknown_color.label" +default = "on_surface" + +[[setting]] +key = "check_interval" +type = "int" +label_key = "setting.check_interval.label" +description_key = "setting.check_interval.description" +default = 60 +min = 10 + +[[setting]] +key = "show_checking_notification" +type = "boolean" +label_key = "setting.checking_notification.label" +description_key = "setting.checking_notification.description" +default = false + +[[setting]] +key = "show_update_notification" +type = "boolean" +label_key = "setting.show_update_notification.label" +description_key = "setting.show_update_notification.description" +default = true + +[[setting]] +key = "branch" +type = "select" +label_key = "setting.branch.label" +description_key = "setting.branch.description" +options = [ + { value = "master", label = "Master" }, + { value = "nixos-unstable", label = "NixOS Unstable" }, + { value = "nixos-unstable-small", label = "NixOS Unstable Small" }, + { value = "nixos-25.11", label = "NixOS 25.11" }, + { value = "nixos-25.05", label = "NixOS 25.05" }, + { value = "nixos-24.11", label = "NixOS 24.11" }, + { value = "nixos-24.05", label = "NixOS 24.05" }, + { value = "nixos-23.11", label = "NixOS 23.11" }, + { value = "nixos-23.05", label = "NixOS 23.05" }, + { value = "nixos-25.11-small", label = "NixOS 25.11 Small" }, + { value = "nixos-25.05-small", label = "NixOS 25.05 Small" }, + { value = "nixos-24.11-small", label = "NixOS 24.11 Small" }, + { value = "nixos-24.05-small", label = "NixOS 24.05 Small" }, + { value = "nixos-23.11-small", label = "NixOS 23.11 Small" }, + { value = "nixos-23.05-small", label = "NixOS 23.05 Small" }, +] +default = "nixos-unstable" + +[[setting]] +key = "update_command" +type = "string" +label_key = "setting.update_command.label" +description_key = "setting.update_command.description" +default = "" + +[[setting]] +key = "clean_command" +type = "string" +label_key = "setting.clean_command.label" +description_key = "setting.clean_command.description" +default = "nh clean all" + +[[setting]] +key = "close_on_enter" +type = "boolean" +label_key = "setting.close_on_enter.label" +description_key = "setting.close_on_enter.description" +default = true + +[[panel]] +id = "panel" +entry = "panel.luau" +placement = "attached" +position = "auto" +open_near_click = true +width = 420 +height = 290 + +[[service]] +id = "service" +entry = "nix_monitor_service.luau" diff --git a/nix-monitor/thumbnail.webp b/nix-monitor/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3137bd0aa0003e4807a073df328302213d2dc28 GIT binary patch literal 51640 zcmWIYbaUHql7S)I)hQq>z(QfkNd|@qhRkyrwGJ@LFxhc3H99ofF)#>Bo3{MK+N0mB z&)?j4LV5a6ng3a~TC@J7vF*6u`#f|E~FS=9l(U zdEtHQfA?RVKka|Z{O51HU;Y35|H^;q|M7q1 z_u9XUfA;@r{i6T2pSb@@|7Kq&{?9+n|NZ|D`@j5dsdxDI```Cl#sAj->;LxuQ(fHu zE&sRtzxeO^zx;pa7v;Z>xPJg@n^7xth!~Yq7 zoc(+IZ+PYOiF@P!-Tn9akN^GtX?96<`R|oK&A;>iX?@nd<$uqAo&G!jZ~Pbe(E0;^ z0{$NOAN^_lbNh<;N&hF?C(3u%%l@1Cck`u}$Rz5nO> z&-L&2|ERxQ+wk}Q5Bp>Oo%VD7J^feyDg6cekLMrrU*5lMpRj*Z{kz}#|Ji@#JNa*^ zKmB*n52k;{e~$m2{*C|B{^#{O|9|~o{Y~}n{vYc<|Nr>^&*Jay-~4~lfA7Di|6l)oevg0R{H^leYtQ_Tw!i(as4ITvzAuxe zm!!+=`|-(Y9(Rx9*BhIwxTJRK&ZuFxNtrI@`zLRKM_x9^NtM0puN1BhSlG;NtE&+` zY5G~c2dYOpwz~X0$#J*({+kExe*X76ZS<=+0M>A`V^0}syUT|2%r?d=||XFF%)i0=*!cJSSu0;a@1?o2_np>wW0Ku(yXZ?Cvt| zc3iktfTQP8;kx#6i3R6_|DQkOYo}i#esz6k`yAE@R~YYTF!kyS%jL(u-)<9f^rrq7 z``*ox`*z(w!gqE`-A+bR6E$YVy{u`K-pPskC)$0qIrFFVbMU?8Hjf@i%xN-oJN@s| z&krSAZy(gN(yrH!%|Ac6@{p6|@RD$NwvB*%G+oR-9MpJf0j<-or8Fb)Q?rw9*5MW>1Jc z)jmgN`M_itON zeyeNxU%kcer~bH-`G03>h2-7`sV~az2}%6yio9}VT4jRL;^U74Z+~i;@$|sd)Yq$$ z1zQ=6UWm=V;9lR5=X@+LyxmQxWY^o1Rx*m;C;0i#OL%N0C$!gka_+g{g-^4%R6R3A z?m4jin>01pBU)mAO!IfgRZlxSy22;DE4Mod_27v4O_aqV*m z`_4ti>!(H>oiQs_dVR9dgda2G8Us|;u`fP!a_;HGUx$;^uB86>-y}Bc^U}l%x7E+z zocJe}SI+#YRsOMCEsNK#_oyq?3@tshYNp(e!Q!8)EWU^)jTmO5W#XLW$ zaMR~oO(|V5r?1{W+N{AM?doxRL$zD>zsd7AuwBl7^PcTIuf?vL`K_<^q7n`TrFH+b*?%l#pY!2LkI>^K zJl$o_dgFXIA5yIAj<{uY{I>PM{f(U6(FcU5O?o@QYNdAi2Xl$3`IU`DJzK5rRQ$^4 zy=J<(-0SfJ!}84hN9n9D-z17h@vvIjPfWSnA>=WwBVfkqs1S*t>z%{zX5X5yhCzGo zwL6EMg|pQDP5Qd|>ieJ5a-9{{-l(}~{Q1V#c@rn~Sg91LaBb+iZgS)I_14#X>kGCz z=yUJqK7UT9EP|`2Y0=dm7duzq{=Px{!OjB#-}LUhFNc&J6I- z_?vQYR#KP8jp)9D_{G12ch9Z4@;4_}ony7z9I<5^zF+@z@9q>ACT_J@yR0>jM9%ax zx7dd>X|Dd-e0S-=kf_x)5=GxPKdxD}_@ysL@+$9T4Vz;hM0wa6Z&=WoBwUwv^WGZS z_H98AIQEG=(|M@&Uba6eapOS=m-bU;%fvN`ig%uUrF`?z-WMwpo~Uupm~<}AUEF&1 zt5$#4gh*bY?Q=LICE70c7o2wd#l>k;i&}++@qe%cAD-Y0WkKPGFwY*<5@%LKuT{Hq{qfy%*7W$x(Z?Uk%e{TK?4UyT@3J5Fgluea$wdYHq2)Kd;+r?y_rs1*|qo_^)Yw;LNx6+i$a0 zSd}?G=`V}W?|4`)tg_1cR!69#K~dn$9nysvTAt5K75*@{drX{C|NZY=zqj!(*{U{( zutv>1P;fue;X!kjhQs+w>aACpe+qX5?pd?Dv8D9IBxn00=l^zG3h#((6$>p~9dk|P z&k=8i&IE?Uqn%-Y--^eEY_sP-n0h-tjPGaF5u0#tE1&0bj`C}jH~(dtrO~VGFLilG z(Y5KHRrowtoW6W^o8gYrR`+90sm;B`Z^Sa&L+wvST&#(V=8U%J%}UqWw`(K@au}IU z+5cW^y}C1dlV{4qZTYXSSNEFlpVqT%-u9x*ML97R$MXKpnS9ItTdh@jlSIY0S*5IR z_iTLUw8cJrclfV0rt7bDQYD`>U{6V_z$wtwX&G#Oknb&_;XO?|s_SrLC&aZDyy={2tYx-1; z+w0$2hkGk7W8QMs#dubO&V_lsM>FMb-C$ih<-E!KUC$2(a2L5`9!XsmeSX*HZ2xub zAIcp0wjVUTI@77&)#dmDX6YHF6Mi=PJhV@9xwiW7xqt7oLKM>MQ(rIFjop4pU$wyZ z?^NY85?lYWe6?KD`Rnt?-Gv82jZTG6&Ui8JWZ<-uY`V_JPo8w0|7}lGn7oW!wUD4} zs?s+7BfPEGy0ux?2Kv8UtStXSvoYZRsm^5#GEp0kO0vv|N$9vTZ_<&LIh^OrCL}Jf ze7iWc_{{g>4I6K6oiTmas-nO}ypglpT=fowPAIoZWfwhs$m?ML+b`UP6E^Re?km?3z!T884nRaqyV4 z?55w3S7qL3=GEMLb2@19$*ru;cU^tF-|BwlyxMj5c$gw@wNU&`#u~ZnQUx*#?pmFU zm2|l&Q&O4isQTq`Q%A7v+NrsQtD@PC?K$!Ar3FvMng!k~#BEVO!D`u>jeDja_r}df7)^es8{O9qxWIlJ9TH=1_1^Q{uGTarxeZ0Z0w)e@g*hkB6-iwe^YB4zf^MAU9O}^2c zQ%ma=PRcAd3tH~Wa{Sfn`%KO2LIW;oXR2r??bvs5q1P$X29b;BraqgX{ZPv&XYSjc zUA;eFPj(4vaQ~{4ESVb$>jXmzG^87C z+wE7VAMJS@uN?i@S5|%6SI*Od1r>jN^=8NE>K|8@Ez-Rf+pUphrY?PBo5P3l6{&6I zf0r)kefYlatZCxEu1CB}?uJUP*<5rl=eBe0T#*kZdN~_A`#ShOUt2L@!Pd2I?`*Gs zbPc*~u!repK%`~=|6gxT36zAhl-&8BIfae)SoMT%=bB@_ciN{5Ugf{>ns0w~v%a%} z6F=Yfn&(U*HL|zKbSh*fI5|Mir|3hcv*~9mr zMV6O;{P?z1ojq^)%F@!MA*r|L{Qb@P##476wY>Y_|Bm(BmSd|^ zwd~SW`Zp?nHq25nU)15Y@YU51;&Uc-=jF5(J(ScI`){>M{3~~2nBSEAEAoc&W)5NU z%{wcj|B87ghQz;Zx%_m}rzGC)meQ9ut$wlyoo$_ZanYN=cY7DkF*f0ke0}VKQOb`y zKlkmqvG?3h)oHilv`U{;QGlsr~NOjuzTt@M@Qp&Q5a{K)T(D&y4fB*Q+A(zx8?8`&)DC$EI2;? zubk{(#p6A%reglC)|K}Ic5=kowK_9YGR&`*EtunVj?Jb?=3=11qkrAz4tJI->|8lb zO7ioU&olBa-SE35_dC0b>&)Y}8;r9U_XW=XpIdq0T=7lWvq#g6f825Y_|Rrn>vQ8Y zt63cN4U_u|o(H~U3Uv`Z`^;kR$t`{du1)f3Dtakkeal+yh)mhbRqGz~yuWXnd?d5t zTes%?zZG1bshn;aQI4JmHMU(jXdxt{Y~`S@cro*=v6;Aa`D?D!1RVqA9L2N2Gp;|M zeAZOo>Pd!p&T9<=yUPx@G`IVj`Fl)C-(&DenspU#fD>rPll+EBlrU-JB$~ z!(DM{*dx{OHuD3!ESDRuin3oAeR}GpmA_50f|}MX|Cv&$a^!#Tk`oL?1{`mUqW{aW zS!`M38{YBz=%2?LmZmb6p3Z4iQd;vl zK859(X4LL=0&nuf{{$~);W$5a^Om)$>*rN*zsC8 zD&u_)!#m{)X=9OZvR$(^JXPMbwO+ndykX~!`o8B@-rmJlVoA|+r>L0wdkD{Yp_Epy z{59&@rv);1|1MmA>gu=Yfu1j)7Rp^Lxq0pRg!Q4-8hX{$<~=2McvRW1HTKn7dOZ0w zU+uILW4fuvO+JouJ_hUtj>{9pi?__)rBdqIGe`3{Z|BmRcdULs{IqH-&*l|3lNO3B z*S}(D!W{K^!Y(t#qlxcwf;Rlw;&H)s<$ZB2n-dbQ3)7prGEVxke%60-{GQqEX1-f` z{vkiNT0YhJ?$+|FTk_ofJBpSIa&PDRpVqk{e%^Ze6y=5@^^Am=9ej~yLTOU=>pwSi zT-E7F+2%2U{m#){^&&?jjHLATMIG98r&?v#>Iv7wxC9q**KvJQ>3)^VFYi*LlDlFd z%Mr%s>VA)tx(ar!4BaGa9T8V@$6!K9NKRtd^LsM!-xRLhjS;Hb!}9BCS?m3adqd>& zZyHNItod;3o>tiYV~pD;FE7+N9ihd1H)Uh(>L;BijhJ3fdi8mA*NR;M8}=+TVmnhS zmC)nY!Fp|rV-PFPaf_sb=_{8=-w?I-zQ4mWj(7XA!_Ufv!oI$W4g59h+il%zHR+45 z99XK;zrU)v+-2Tj<9Vy@b|08-t`$A+s=%ME-{+lpactvB$;)qrdn~pW#-{9i#2E5s zf$|x~p1quhq@HAUiT_Sda*i|-n)pw>VbQlttutN|c-OI3P7V;Q4Y_*e;--1W7i`+o zaC1&z_dIQ%)j!MUtS<}F+3@nj#qX2N_r$T)hCLD4QF8qLLDtU2wr`qx_ml*zu~7;U zmJDoM@mhTiv%;64!>w|0Pv1yy z-uC_FN24{$R&uKDDpy4LW-KiF`+2p{v%stORM(_=pLck(@7+0;w^H4z$ zrdl;>xz|1(|C1!zE44U`i`Ou2M`feJUy-^=H`j)A{&I=gc#)+wc#qAehC7>|RNt4& znV=P4Cg2i!d+W&?^5x0q&qJKG4v7C%lsv2ITiEjRPVz?Pgv~OiEw(nTZqCrm=GVEs zN%Oz;J?;Cs%sI0UuHSV~>04jfjx84!PGnSPTgIt=`n->DOLnB3MRn%Ix!3=>Y`vLz zUU6xbfzh?&y@LD|%USL}Qs0&C<#}Gq>y8zh9YbvFGduo(863t=)~Ai)T_k3)<}>Rz zt~HTez+A20wf!ewe14Wj@RgbJtGRb_e9pSZ5j1zphU)X*cXyv{Q`*|Ml}GeV^SeaO zhROVQ-_K5J)Zz+T{{LQ!SjE{j{8#i>Rxp0J%d~x-r_&@}o4tScowPh6wXF5!*&mv< zd>TuIv~(k$Wh!YX*t4AJZry8Z8#v|065Fjef;S)E&LVk^mwlV^ep9)}i=^E-UGsCc ze7*0IvVHdH$fA2+mPguqe8^qIbyA@0&Te@>SLFT*efjO2aM^mX$``vcr|g|_NcB$VHq&IQlnMKr=kLfo@!3B6YnJ}yD|>Z= z^Y2d*pS(O%>NoR6`5(Lw_m}_MQ5h9-{>iP>t`%3SpZ#!I5?jb-F<-9EZ`zTgh0_g# z`grD9-*%PgS}|2(MXF|2vnPZ1(y;1VKYcAHylH1vVcY*lPefnWu2tJ~L)cbPy$1zO z(f^y&o*jJKEqM2cbdSuz`^>2=6M~oU&-x(GH%T@5iRJ7&B38+1o?n00WEkvTUSGO=S=w>H_g4m_5Fc$i$3HY zUT>8aF>OOx18eRBgR0U{jzz1sn;YM}XQpg<>@TC~ks>?A557(A2Xtl}Te-B_H~C^w z{L{yq!gfc7zqaVEpEsqW;dT9$ni(tK^BXg5zo>uIr=a;1@4an-jF)bN@~`KL^?v&J z(xGK4U-aj&{hOzE<%`hwV67PQEvr1Phj|<6ES)E&leu^E{7sFK?(Ns3TM|-Rc>}~1c~f(GU4Y5p2T1*C~XnXbVjPK*KomW z9h;L9FHb#m@|Zq-lWg=1xB9<*8C(}sw{kT+=DR)r)B9^n>ev=id@gxPqLS5xjk_0n#$}(8E}FfRjpbkAic3Yd z3zzI_U|Z4o(1TM{vHPkkx6i^?T90oP^}0DoK0L>z_)>Lpm{#blCvD3rmlhuQ|DW0H z_xoR0E~HGJZMgg6Lc!Bk-1k0nJY%1&>BeIa+x6ddgZUq~|2#9jk{kagiWV(Q{os}w zoVy@9@U@j-z?WOMrq0P`e>quYexLkY4cQf|cDL@1soh$$B>mK_UwxbVZmLzCo?1G? z@y=Rd`MuJ%X z^A96pr7j=qd9Juc({p9=JB{wDzT2)pT2s`Qzmk3MIybHK!$dg-{m=| z^m)GP%Y%@keE;T&thf+sP;*au*S+r5g$C_G(s40IO_a7uRd8!Ak<|8%n6T_Y`{lRk zB3q|#ew~%OQta!|?;AHio>Tqd+#2PEze;7?4iUY_lusRr@XM|;kdJUU^!>)^dyeLF zem+vD*O%m(=f1)5cc^vM#;@-mems%vP%`Ozu2F=b?oU(m_yjrjy-ClSIdU6x4*k3> zpteneXVvdDGYT@DQWXR3_TN&`N`JiNo<{ZSjfr(1Kc0-=A^mzzz3=TyT7MtBT-pBh zmX=*}=)*ddmFs7yw0iy3d9!Zm+?Fq|Bp#l-{wQBbHtp%1-KEz8RfNTlV z>x+L9l`Oir>vF(3rqxmM-va$O3J*P6&c}VdoxNtoiu$!BubkBGiLI?oH<_+6HGr-D zyVIIe8y2xm2*0Ssee3AcGXE1x0jbG-03XPGMTF| zEzVc}l*lXTna%qv|G!0H01 z&2s^lN`;nZ)sa&YsPA&rx%lFD?e>)?fZKlgT2^nYPsw!Yr9awq@wUFTm|zKzekaQt+J#M$i4 z{tMHXK7H&w>%@JSu~qxV618djBQI{8nDBj>uRWvO?X<_+qMt;zT&_r;Z5J)PDWd4t z%BaOw)!JE`WwJsRDC9-1arBrG{aQd%Ymu~!TZse1bXlhjq1m%~Vh->s1@BS_lbO&9tokF1DlI``_K`KtS$mdy?G`}<|#h2_mk}i0y zzh}*NYmG-o!dU+wx_vYLh1AOr2@y#`LR-wXT2ES^V|#FYT4oMc?wX9f=hL%-YgZH; z<(>X^@#ops7wQ`y4Zr{Ft=yyAlD;->E4W1F&6@C_jP*L#r?m@O>e$r6Fv7aGw++v?Ba+NnEyxUp!-{Rh;ol|oT z>B#Q$JpbXJ#4KmqIkh#46V@7@7INLa=2o%j{s7_q+|ti#7JPoE8b1Hnshg8SSDoB5 z+iHp~o6c#G{Z*e^m#p1iwIbB@`Tg1TFWF`o_3o6FPhZ$-|C3cLr<>J9KHpf9Fe!bT8(+EC z#9evo{SHq2%qaK9PqFmclcqiIW~nA})%*KSUpTAzOXJlY@-wrT{hvSNn%_IE<>rxt zR|R!X)~z|fB=YLoBNM5f1(_RP7nyHtF|ZC@SERVNrfoIDDu+ewX_d$OBq9aQWyV(f z`5j#F?xD|X=9QX)d>L*oWvl&;UHfo(rCgl$cFE&@<~$pkjGL!RWmvIVI5ki9NU}Ga zx_4vrja^lBXFdg;%?rC~v-P))h2q`=6W6_EdG^Fxbm?o=w~l8&>WMu5cX_&~gYO#$ zhVyrYE-w9CrhaP93kSo)>EW7DJ2)P`pJ6)J@bC;N{rw&6|BN2%6(#>aQ>STnL2T74 zbLpOZ0}G?=ORu|apJn0DlzuCMZC8F)+*6xPhs2oPyw$E=7TdUc3HP5VU*r8QzTV^c zefx*sT@|ePSK^O~K8 zFLO_9$I6+6Ts(f!h zUew(lyLs0n;Zm;o>s-5QP5CsgPB~Wdevkgz&gWJV{w42ewgBDdCUJ+Y0o z>vY%;GwZ6x8Jpq~<*&yrp7s3O?00=nENi%m{JbCDS3CPjqH%8f&3C?rZ~Y3woIh>k ztUee0;IO%Q?)^`*Cs%I^RbFS7pr&0W|KhO6?8Eo=iwCn=MxQ_N_?v3y5zCFIyoG=6 zG~QJq|G@A^+utRT*Ego@$x>iCGH1`9T0QevfdaX}OO^A!99}uGOv>`k`}S8|i~3fb z_*T!bG4dCiQk&oJpDMRb%gnj+W?kHw@*<9T$~Q|3Q$@|xQdpkN?<}4!v#t1B!nDXG zcQu)VwOH=1QkyILt>uV0bId$#L#43WugX?_aVn9IQ2V#+19QyO`k6Y%J*L!4yjKvv zV^VUysQ9@$qqiTAjIGM?hbPScC+E*S@q4oP^0K2vp;Jy@Dq+05;NF&i<8oU*f4a`M zf8NDEeCO)8HveuiGV(}SP;n)PeaYcBnI@OnzL`!wIAxdqecgX;eW^Pq%vtntGUq#y zIrH8L>TJJParJ*^dr5BEIX1bt{jE7Qe=Q!*TTz%KC^Os1_Ezr%4S&bL<*e_$vQ9ov z57m9>xO~0wtf`AH8zqQ8nDlGn4jn%k(J4D^Q{FuB|Fb#ejLOocmrKH2pM~Z1_WCYL zZ(&SH>z#7fw#4$}>*zIQd*b)*di6g;CT`KZf_o}6^jwbKV)d9EFT>iU|LtN#eInb( z|6N_@PXG9vcf8?>Qu zzpwkZY(F%k$3H!CUdrh=C)*Fb{wyfQbo|i#;PhX!rmR`J?Pu+_XFcVpu_fY*{ z9S`0~yo;YrKR#1T!RUE+k@6YdmNinV`4%0Tc<`|f4^vQ|--pH%L7j(}&3HPIb*6~* z(mtIzx1zu1tSZtrP{01{jO*+}ekvY$){C~SO|IWuS6@-zaJ8*GW8LA^wc*c{D!h;ImcBK+7?}?EzOp`+~#A{9UU1O^0+`KsPDsd3B?y*FIt>)-<-8VxMg>F zG4roa8}H9;^L)FJLEuF|Xrn(@#nqikFMg+fL@zk_c`M(InmNy!wHM4w z<<_|!)&F6=(L|fKoZC*NJWvnkYLl)Kjeg?rjOWMoHTLf%W_uRPRY^rVKgp|pe@gsq z(_K>*jw2OKsUhzg6t0T!)^43WTRUgDnATQH6SIno+xFh8UiT{0NxYC%`X}o-hAYpk zxA~p89$%8TMQ*~Y|L-Dp$7_m)H?QwpyXMoTw3kA6dzM!D{C}19IEL+<)?J5(Um~6N znat|8SiPX!=Ctx1b5^T^j8?y|Z%UC;k+7>_*}Y>kOV+gh8Lhs@e|X94%(i!Q&AP%^ z^XI^ffcxelJI*{l&Tc+eZti^lWwNWiM4eV&FL&zyY<)dEB~@u-kogn8JC_dS#@5|A zDEehB@1AX(Oigwnoqu$eb-bGM-&`qryS!!FG{$>hZZ1tqWhpbhS5(m*eJe}zLiLBW zKjM~b*Pi4ku^{kD>Jqt3&WUYv?lwg_h6P{A|JJlEyYW&;@5?`d<@!fIv)`%iS>F8V zkNy0{{(swLBd@4T?=;ctvfA?Sr^5G8i+gMQy=Hyi>R~Y5vnFcFwz7atJ51vo82Eoa zyd$ypjwomQ-ihy7KNhb}>)ONK8y4xb;8}sr3~lQZhpnya+Iv0sB^AiM5h^%;Y|C-4 zb!w@3|ISOqJTz%8f_G{78T9++m*JaXwGEbev`u+Z; z?&F1dTrb{Eaz3)d_Q6tN*Y?k0l6UTO=LdZ%KRWsJ1Ce71FAiRmJY3*kyPbDc*Up8( z8S#m(TD*1+-!AX@e17HHq(^6-n|rDmck@l!Gxf~W*D9yi-tSM7oG<@bD1U9Rv-O<0 zJIx<#3ShB{vfOxZZLi_%2XD`Cjo;p`)!&X@dbPFf>ff868&`&D3w@+xBzrd&4`Y7B4>_JE`eZ zrDFAdD~I(y`ir)nRd5zQq`tKEbD6ou$}JZp^eWF>@~Guaw^W=kuPZr^T~K_zvcTnC zo^=9jvFvS30`?aJv;%+qdeV9({`Bln)e0*7q)*c=i8Zd?4}F%l_Qsa)-ZYnO0DUY_KK!Ku>s*wxQVJmXG0Umx}I zf{}B$R7REF!YRL=E&LlH>t*%KfaiGL*QWv38pN*KNc!%rd9q`&)SmVB(@f&xHBI8? zlutZ&eO0jxYuf%*JAFb5`aik_uW#kKqb4`~|uN|RWSGDOljl2Nn30k zcP)JDXkWf5CGRB9S+QfR<;M>9XTLid@o3S}dp3)nzn`?+-}hO5eXWk=gpj9`dnR;B zb#HUn_TlR<>B;~2PP%_`bE~*_grCiQ{-37&)ouGP-23SjC#~{Bvw5ei;mXBIYP-!EBUzJA@QfG_^9r`LUC)YCguy!vnB>2h(ec-E6&ub#1@507)UqhF1%FneB~MWyJPGVY#Vk;{3n8uM-1_HXkc zX~`PvFY7*OB$>S8XJ)f4_`Xy;huM2Se_ZtUuUl{P6>7I^ms(UA)AvsL@}q2)8Fk0` zWt~FneIg$}NS^=ck=hDH$yZ8WuBg;z=c#yXNdF@eoRXq<(R5OzjC9knyzf&_T=9Rt zp*k+|+Uh0Zv%YPupCZ0Ob=ES*^~^Pejuq@XFWBi#?9cGMrcfWswI~1Aa?zhg-WGe` z`53pIPV`u@`bv)DEkJ5`cg-u`S#~*A7UbvLe zS5L4oj$L$B*QN_azq4noRuD;({Ubl)Nu+pp`>ibJm}GAARs0*5N|qn}*Kf8?r8NKh zo?CsV!Xnq&q^r)TJ*<>8>(qOj+v*eNFze*L&g%bgXveosTgk)Wq8IL`bTQWQ&z$5M z?wl2PAj()!t&>pO#HNRzC~-r94gr>!hFHJnLBoy&)to8OzUsIyph2y^7`uH&?!Mo4;3EH zRWHprI$LPn8Uux*YcGp*pN2FDg?=;eU3wr$aw=o^`L~Pjc-Ixa;ac3nFyWEA&m*1? zsqHs&-|SfKJx^n5i3;zkZRflt8n5b@rkwvhsmnX&k>4(rOWzH()!y2yP-zydFG+lM z_REK-bG1%*&d|KsEE2z*dzbmsqmr{sW@nrJGm4PZD&V{D^t5tTzzxaA>36^WspisO z#VxkssMjBkgZ#;C3m-_msy!ptxvuNs-ZMQLwuzn&zwcs_db;HoAq8zMoP2dTZZyYsV$FGs?n$J^Xs&b4U2?C1MPRf}d3W{k7cEPgL-} zZpsw@<43~JT6t@Qz22qlaP{44&kJ62C$%-WpIE*_c2miVH~-E(tUP*Lb8S~*e1$IC z@(kt~GgE?O>Ml5XvC6)g%i%rDy8z^DaJ8*2H8H?Q!n# zr`;yIBCY=1TX)jkG-*%LI~#N6cBhM5W`;gE;`l?^`)Bdh$JY$rD#@^@+@%b8Ze(__Lm6=X=C$mhRZ)@^4Sd?p@DJKWx=950IYyVin`x znmXx64-P2mxUD=M;hOYiP5YymRht{<#;IJ@wV(DvcK700YhNfR$7b9qo$Fz9=#z>Lk zC^cN}q}Pz}s?_fKav@RY=kp6qt{qu>-|>^*%aEtl`xY$n4SXEX>k;*>Ilk-9W)`h1 z-R5m|7o5CaluBMP>Ad~Z)?i}8GN+)gWl@S5oq>uhadGX9S_@Y!<1~AAP3Uf@sn8wM z)ot3M`?qmus^hXbYNtjS{yu?abACOqw)ObH|F#Prd;?Y6&${4>%K!jjV7jBT)4C0-=9gd=O4;5 z7XLM?)N-YgC@0rTS@lkSp~G#h9XErxCu?pzb0qy~18W#Ut4LGcpq`K=f11tw_Y`UEgsMP@w|uL4W|AR=6a3cbE-eD%vkhQGJ#>{ zrP6~YdhL(XJQOBRy7Azq`K#y7R}UnY&SMh0=6kICf!%_p4JpS%_n&E+YbxXz6g%Pl zenp}7!=k2B)}JuiWAHrr`0H1pN#=?__>D-LYzul{v1vDw_@ zv)ys-=HfSU6ZPfaxI3_Hd?-3~?TYfMqZ$eG=D**inYicK;j3DKQN2;~lB8K(n2!FF zwefaI>ahM>@%ZuuL$ipjA0kCn#NE`+t_Vt;U1(#>{2_Di%tgj*5#GzA%;nFR7`?PH z*s5xAC#JnuFKzXVzMbCTC#UJpzs=q8=xF^XymG<6U+!2r;ouXk z>xbL#cRGC#c+|h3Ily|#>Xb`a^=uWMhvFmMyuGve|79 z?^61``iz$+*2dfukSu;%U^e;8|92WU{BCrlQ)$EZ zLmyZ#JZ_u2H?+Y%$>pEi;s7t1>jB1#^beefWOv-ye!XhZ5$Ao8 zKXcFgKbIfG+{p6uB!>XNWCM$!SZu8qesc4gA0l#`qj99RKI)v&aUW8r$Tb_}enh`3 z-n!!7?WOK_Hq1Yscl7qMsgokK9vewKp6xlwU81YYi_t3J`AwM%JJ0WB;s3w%>*pgP zS1cO8hIiDs-n-Hv_CkTt`0aZ~#rh)o>w6c^eY8q)2=cDhZ9^fLL?WH*l|G;7U?pPQo$D{a;ML~5m1ygReg zd66hr%2)0Am8mJEX_sOdT^Qc|T9VDiw|Hq!coLA2LV>((j1-4q@SHxT%eE4gA>O-pR`K78cspX~9#13EZ*z{3O zSlqJeV&t#hiY)Duuh%(z&6QldYCG>+t`qq`I+?Eg+`UVqXeZ0!Sq9yK)1tN2x5&SAR{Ym`XmLUCv3+|UZ1y|9^}*le2PZmA-_^mL zzVPSGnbNoCUs3n6)S7qUw!{_4-Rcn z4WIo&H=6si$mbdSseCDGQ}_LuDqd~+QevyVw<^<%8!V4Ds{1X8DXo*fW?bFe-h5%Q z)x77M9_*d=giAv6;CK1wZC3s@dhg0KzOg)dS#vqh?^^$!pV!VV_Beg{u>X0_8yyAT z_|JY|DP4D8H|mr^zUcS2fmZqdU6ky5Yi<^0ALoqdz533=CwaB?xAmISkGgpt(n*_^ z@p^?d@BW{XqQZ7vkxG-uycvgZy{1*3y`@crtjc?sU% z%mqUke}uj{%I@-7_~nl8{}&od-FW%==S1s+Opdedw(uEmtk1k@z}KAW##1n@a@(Sp zRT?MTgSJ~;n(wu$zTU^TQLH3wmTmgPrF*;V#1vd^A7Wuy;mzq}?PJKq)vEvbW4H3_ zW%rVAYJ1&1IfH%QtP_qu=Bb8ubsrqeZN17y`{u;-1c_=mJg@a78RU6yZO0b*}h})th*2Re|pRG z(<%7klsi@--sk%3wN2PBn5YHJ{_pqWDf^X#kDl*Dp1dixv3#*IthG@}@wkfP+S8e# z{Zl;_`fKkusbE?AfP2&K|4j!rvxgfp{E&!A%kZ3)o2#|sVpCJcUM-0mf&b30IVX2A z!lPRAgxXQpi6{Ra6KpavY7w1W>F=1p9m=pk#N}$A*38B%hL4`VTNlP{t+?vp=TWgi zPwhGjD~tTr?Ouu&ip*=>j3pL-ue7+dxvieb`JRT)-Um_>y}nM4o3$pm&t%?O-$&w7 z;;(ZjPHKpfF@KfVzHOb_g}{PTrvFclsm$MbBU>e-^jGIyr`D#-Ju{@v&6vY#|D{jT zzW;--m$=D-MVsR7aya!H4mc<5S@YGtCSw`n&RcUBb|^Ib2tPIZ<)Y%#Vym|%Eo|Jn zE%~p9gU)Q_bhX9a=@*UJ=BHd(^l01Uv@*sYx-Ev=zE`mQnt4UHc2>*$#~dxQuE^wH z5zUz6@tL=OdxhE6$GjH`uFtu$>KqU)oUcOpf(PJ!o7S#oU9l}8)xI$qf7u$sOqxc|fc`Nn;`F^ksc zez+h|#du!)q{@wa^ZvKhQ{UI_Okd6FV6*qEUU^l^+sIsX@tIFH{MuNzq&Hhl$SYuX zeN$0grfNsouVj%ol|oTjHPdgbw7FqZ7CkefGqd_t+$LG3+s8{CGp@NTF1#or>9F{d z;iK@|imeqZw0B?F!zw*t*4<}&wg10LVV)0&v4Fp=Z;-Ibm!Hth?Q@TSq8nD z_}KeHxcUP*TMbSAZYJJSd~@w$KfJr)$TU?uWyjUBRnPLL+?(*P^_`~0RgG_JZX7sP zDw*@x)MjIi>b;0t%lD=far9T5y27@6_mxE~Mtt1Q|E3s~iF~}ga5ZD?nRs)lRUb}F zO!%pCGhr`d#kMfF>n}Dm99{1hC&`+SZ+JXu)70?ZXpLKrm#=WXn#S6v_g8lDQI*n3 z;ddYY_>nc~Qt7Q^(dl<`=1v#CWb#Axh2S?UZ$Vu_{+XgNPd4AXcXitwo<(cJJ3R%b zycJ$_`L)207=yLD#cI=L)vE*u`I@h|DWBzSDqelTSMWf{i9JS4N>8Soyq$XV#J;jQ z^Q|AulH{CO(f9jmpv{RwzxQjFcdc1wwA%gXCxyieD^EYu+488LL$~bz$MZhFKQ+6i zmA#%?=_mB){-I_On|T_m&HQ}?F0ZO?d|z?Qcf<7^2NIH|^BDP9Ml6Uh=-VsG)T|w( zwY9-DRzX0b?(tpcpT!LJT%Tk=sJ)(gPfst`Kl@^Df1TZQX6+=Yq6I z@Hcv9$FE!3yVSY&T8r)7)64ep!Zw4x_pgLiPK!Flo=7z2V3oZdQF!zl=Xw?XTTi!{ zvbUtif7HlYw^FMXInNFUYWVTWRmvbocPH-xo0-=P5R>F3slr%%ln%{Gp(zZuG(AoK;UG8Xj&D^zSvT? zyAkh=Dy`ohWIb}}KBtF(@8e^|am;=S%3GG6H!EXUcR*(cFW($9hMSwNG+&O9IH7!v zN&fup#XW11Q~Ekj{FoqW7thizIO))-mDkczkN>{X+VL)>clE;WE*A@HFJ(Lo*gUbz zZ}EdW!q1jiEH#yujW(PUdW6g6$E=*~>l4G>S*~+kcq1FNH#EK}hUex9(P!2dECmC; zuCobhpI+a;dHEt^%V~RApREnIESV(Y_+wG$f%224n1H}${VIrG$aWt+W<&JSwW zwzJeOd|uTeGMArgU+-a^RhK^P+NT_+)v0CEuJ*2!FQ98R)5@0VorNpCyw6)cS#xN{ z!IP1<{=aPy-CW$f_{EQich8EnCCn{^E@W!?|VS(HEZ{0bcfBt*8+5F6w zdoh)P%)9qLsN>;l7Ce5!knf9m$}_J}=F~R-TPyaS&a8ha?{ea0!wa51Pthqadp8&K z{`Hx(SZIx3b*ND5voE1~bM&g_oqoi*_qJ@tt^cu=Rm|Vc9{n-@R&sQuXW0IwviE1+ zT6khj?y6H-3ydd4Hu|S|3B3NbV1+v4^6MGuw>BK)St7LLp@E>nkDqB;Nrx3)^8MOe zWixj}l11>NiY0y48_PZ&TiSEymc{lsgZikt_s1KoE3AJltXa>N>EOO$i`>V3EP89- zw%-nsGl=@XQXoiywVka*_~6W9lbBnvGaGkjCLXliVl1N|eE8bT8}?tWZL012oRIdl zd9rcjU(K%}nfr{r^D|$#DA~{X;KK0pSAyo@+p2jS?f>)l#4Td0_&tTO*ib^cLFw~~ zUyP||C6!F}u+B6yIPJ0M-?_85-qkT2Jkqc~o=N|j;~BY)@iu~jSN}{btmfH~VGw-c z%D)7$;{CNs2I`Y-6Q#1;BXawvyvSLmy{FZz%jSyxgd(4lyWevxS-{^gk5$m{$~vE= zi&(rCExz4cqGw#w_eS#v;}_G~*neer^?jEWSMi@0($EN=+ppVQ*1hni&Bew7=fbAq z1s@8ZJl0=l^m)d6rHNmYul(ta_;X^~am|WtpU*RWP?7(((nMwZk(M2Hx|`PS-X&1I z%rENlvk;Lw#huEY+6<1bHY;e&3_f`~cT2Lt%9BTzI9YaBhMMlJt=bz}a*@@--}B3Z zUrWn=6+W_`w4ARZtUu?HagwFk0lo)IrX2ZyUFE}vdu4wly<<{KogSvSO>?{)w(c`W zN^FFQxS9gfL$6)4N}C%xrS-_9;S|61^TJ` z@+LHi-X%eUrsBkw$C&BjYix9_?f7O-u8+4tbnZ}Hnnq6~^0hEMBvIv#QKwwiq9=_$20 z)p03IB8nRi{4~p18YlQj-%IM{8akQ3w8LKHl{B(m4;uxXR0c6I4R#=EN-0 zNHjn7MPk1Bw8P;cM>}6nXl|RaxYhh-LXf%z`;))DPhV)Yc*(wAvq|Fovh{)uZyEOY zyf(FrZC_$ut+U@>Cq?Cr`3j!tKC3@8uU^PfWu$AcyQM}!K1qFRrex>M z5U0@zlk6f4XD(JPZ|US$>^8&9JG@wnpYlY4^p8tPBj38uNR+emB-E zXv^@9EPbVahi#g%?G_mwb+KeQ@2^iU{9hk1liRkWym{ss?~GlHffr}azdTiMo$Y#` z;Aht~v@HdkcUi75b=e_cA@1v!V`kP~%^Q%UV18-E&hwK3-b_7x$0&7CzyD?~v!|!7 z1={)X=v0`!J-uc8gJ{m1#92k$3uvr+E-#@`wGt@hG=o`#8& z=V*F7WOPZ)H4m$tGk<%DbNQ^?e;s~HYb#!U6->Q%_f}Eoiywyi?K7^=|Ecra{;$pZ z#7-{d#|@KP&$MsYZ?<;QY;Uo(Yl@jyWL-2e=L-C-xbSY1`}3(k+TY$S`Bt+3`<}qL z#kI57tl7GTN9NzLr3o>!e%2Qku9_U+RFN8Id}J*nqtD~K-LGbO%s-}>B*SJW^ZUKG z;Dqz`mowZGN>@H_7m8qf=lQ4i2uJNd-shWVyREssAuPU9w~!@jv0R4FNw2&$Qu+Vq zKL302!aBwmMf#JidNj*EU)uX7@R-m6owZHUbF)2cV;LpQ?o9B6F zRq^~g67RV_qi4r0mYsQm{O4J^=Df;IOb%b}IDPuP%BkB;4~G=*KAybk(Cx&9Jq)um zFI?kl;FSE|I3w(#ufL0<`+mvRta?$efW=9&M{SgDPf!cxk`IiVfAJ`nXZ+;SUqw!) z>c^OV|9$6Xl^T7Wuj=^=X$|q#H4JKBo#IYzEWavZY%5(RWXfdO#J1p-ReVXKTKPVX zy7NsLhIVclbG=;7^8F0^eT{L4b8bF|e#3{O*Z3RuG4>svyI}2nqt8P` z(hW;P+*FP{eY!^6szU$~qP3yz9bKYLPr?i|AGiE$>Yro_C9+xQ$my8P5IEjj7 z?NVGP$H(_C>GcI}wJWpdy;j%q{=_KfA_Huyz+6UX3+c%lMe=aHF$Wdx+$@LX6}nx z;Gs3`s#v4QLapGplAC@XE6#0bQQgj~F;!IA;C@|U#)J()k~gk&S1vs+;`_zul-fGI zw}q?b-M!c9U=&(vvfAHn=S{b;H5IG%uKP{j_VQA?fk;Le^Q#5R53ick@h*Ag8n5WD16h;gXa_qf7Mi6Re%5R?3qZtolR`hgoO6&zq!Hmr`oqeQ)4e} zcaYTbdfI3l`Bb&$plyrIjPtCw?UeQ`EH%Fynqz1;X?1IL3E-t51~E zd6igewc!TeZzqlutc(E%9a9!u=rvK&+LtbKqH)Q)fOX9uwrcErc+$LNzp9}L6Z<1c z4%sQQ_l221zFf#X>0iblovH<1rPEnWCfG13UTrm;6%o5TPkwoa$xEh%e05J)x!jjt zl(u?Ra(Yh*V}aw2=6eVK8`cK42Wafs89q0DrI@W3zclyBGodSExg?a?D}#aZL!mp>Darf#Ef ze)m-g!)&(SxrN7;Uvq7G=rCO%n7t|d_{H^q{IeY8&Q@t=H}Owhb!fSdV*c|hGV2fB zZ2!(`ZgP8;m21Q-trf3z?|ka*Q}4Fe-LiLmEdSD|yXXEa^;)pe!fKbu;?9da3R@O7 zSv(hZ%+tDcWy!sZ?@Xh2u{mfJMOTh)U_h);~Gw{zgvAt6^B_yHH ziEGQ5X?^_z%vwG1J4ORNp_D@8a9!XVOv|r!C&{eD)tH z;LSY z?eX))M8Ir?W`O}{-CU9vG1?>SDbIs)SK|v z-&s|{qN_o~TRrM?ossaeE>msgw>_uN6(>E8?wRpvv=d&ue<5Y{`ucb z&Ak>at^U1f{)3YK!Vh}pI!~fxgLC}nG=A4T!<#YZ`!n$mdq3Zvkr>{(;icG&kCs0K zpT-ODKNNXq6?QnH?1YVEP+MoI_*sjX*MAdrqQyJ=ly}wi6wNxZxZtk9?9EBH{;Vn% zcI}z#cv<)S-;{o_ePyCoPwrFd{h=|fr{v?ApC;ud=N3l4xw)-nxpEtehLYX6N>$zJ z&u{q?cP$Nb`RmNcdG7NJfneKf$EPPKO{#aRI5JPMt3C5{ILGeOjYWOh2hv1!p6_w# zJ~e4o`J1d;t)D*Zwz+dTEol0zd%G6s?9s3HK5_l>!{FNG*=)LpCon(qI3vaUtw}C$ z2J4@xMswtxUCfxXl@1k7Gn#!!izP(n)k#^qIJSi6YrZQB6nm=vj1$(HAvi6|D712d zyT&0Fn|)?dGbLvyy|hvYT*Y%jVX~O>smyoB?=BRZ6nwS1?Nr2%l&QW3Nq^4luNT?1 z`J1%A_@kFgqUCaJWm;Aof5}{N)$^#OMDpQ-a>uH_iWyfL2ObOBuP^#WTY-5(YFZuSg+i4zC!#rLpyrNl*_=rcY4u>Emy{o2?m zf8V(!w5$F1c(`KD6O%{N&$4vZHwgsSo{(B)p=1>MJ!dXgiMU10Ios90=5A)#QF>=X z;KOB>z1cGkEx+>Kd4q>WipW>Szt!JrB>uJj`C%mVL4oJjyeku0d@6H-Z=L0t-Fv~H z=kVEOQ-gyvwK&*4YyaCc#$9ne@nL!J=?#-a8y?qwd=#f*TX~Vk_ygl#n@6)YAI)Zn zbNDD&QswfxI4hfF=}d-Dw~Jq2ZRAP5*wgW+`F-rFsd)wbs=KR}+;p2){OG9aO05nB zFPE=#wXgB6KYm4J?fw&f1xv(3H=W6y@n!z?3Az#A^F+S4UrNjpejDBUyNf9-^TV4a z7u7$HC-eW}646lpo0j|UkjuWtSz!x>ZAvzuy!PkZ%jodjfU3n)HR2W+$vl7Q9Osp# z9HsrrV4{pwzu;xlAHm(C$?F=p<`pefvpN%=d*NMljDs4R?W}E*aWjrHOqkK2Ei zPB^$RIBEXQxR|f!Htqf&vB8zO;D@R*L%^R5^YelF3pTu1ymRB^&9(m31<5l{B={`a z*87NY*QU>G8{S9+uF$&mnqi-Y_7cPGMZ0CA_H||d-Th^Hhf=-4_Xn$OTQ;h-RMcf1 zT6d-E#39jFZ2=liPPurtN*~|y2G13*rf>^b z-Z(gQE92p*jt0KI9!mu_EP1AVdd6`H&rON>pC(C*noYg)v7%DoiL;1k$g2vT+m|2J zXXsz}DYijQe5(7^Cx@QKU*RiX7*TXwrRl{vv1?bW&4mQ^Dn1FFe==51(Rp`U**?Z~ z_X@x32!Gj@BA)SDKlrZG-4)`8*fyT~Z^K_IyXDZdopW+IEx%7?vOja}^DFmdW}>Vo zp2lC0OEZ;gX4>)mVxZ@`lU6H>9&=o-at)awcegtDVE!z{8+YAXd_}VO<8N-P6w*P zlZ5^5ozz)Vu{XwIn-bsLn{EBMi9i2bJ@fB@S=iyv>VnUgx?JRvk3M?BSMW)*pdp9Q z>NiE3j?FG;?Vg**_f>Jy?O%}#*6rv};duDg*Wl0neF5)nTo{cnu86jYk=NBdH*wo* zkKMcO{xn=A@rHBm;UBG=6`LN%oq18;F@IA;XhY22w+}b%3pmsx@-{X1X8aNE(5^c7 zvw2xQN+#hpkDt6uE0}hndc(E;nk$l556|Baxa8mBDXQga2gQH$JI3a|cJSEZI+c;% zQMLU1=boGfdT3<+@LwB2z@4Lxi4?k>Hc~HJXOkv6A|3BkG zzbrhVQR%PoC4W)oP2I5fSLW$0|N8CGyEctbJ;nPUO*jr8Qqym|H}CWJe|pch+$ncd zjJdR6)*R_7`xm=<3Rsc~7*vn$++}dYCPzsisn6v0k*iPh3U1tbp20lz>yF0S2?MlDLPtsPn z>PGOFomeS$;@ljEHJr-jn`Cp+i`%Z9ZQpMDNjvIM9`oA7=knRd^Zplnv7Ej`ytQ21F@qWAr?h@9 zbeme;_hX>*V&PHBZb&K)8{fo1QrvPTrOYh~PTeb~osHP`1v-z1@_q|^qeWWTqt1Rfy4|cU(Axv_cMM9ST%{Kca zF5A(kr_Ii+<9oZ-=lbG2`JG*vJ8Vv`s8^n{a^{3>FP^`d^zV$UdYe2;WWUXbXrT4cgt`=NqyNZp2Z__)$jsI^HZrdEL@a+E*6{UTt#U*{x ziqkUA8<}&*p4Fcpqjlcl%XRDQ6?6P1OqRUgd*+ULp^u}^88_o22~DY1cX$ zNMfU<);Ey4CT)@4`_p7WLbUnvRhR2cRWE%qby=+T zKGfZsSL1`v@jGS@ocs4Gn`N$fr&yPPzjuL+t?#vM zaT|hutiAW_-OKP!}UKSeF1TT54`Z|WYVz4P-uUi&j7 z1ymSnClt82O`mvs@(SrU7oP{+ef>|0FMgtmy&|8iTK(Y}hWGBVG4tP(d9`l#yJrzM z1%-p(c~)IgxU6mHbM2Sb%7!mVb>%!OR=LD&*u(e5?x)~)r|(u)cQ1qgS%{$GcLMLvv%AbdRs8KXp<2)PH?>+rJ<8Tq)o9 z{0RG+hi<)b-6lS*>|giBezuHk-!^B%+|$!N7}jlBq+GnEaPN%uk9XeNGdUzxyz<|R z!z<(~`-Mvm6>WKE+atO~`mpu!o-X-=+_5aosgFKgm*YP0Sg~c%lx`F2-RC58%b%@^ zIkU?l>3UH_@Dv{RJ5H|+#YDEhTQ*fr%l7!5Syc!9)j3YQh~F~p?(>c*J{Js2Bm_Fs zU-WTRBxKu8jElQ(xbf@929EV7&6l%m6JEzK`S6bAT|u9PTgA3ST$kq&UOMl#wS)j; z&}wC#ozu6>DzZuMzx&75w#e+SXnt0G%T>#?kGqtl)D{GYuHAX)@r?d`GO-KuC8x&S zohbU|a;1F{|M_UkEmL?r{!Bc0zoE=#Bhwz%`}gNB^=*)GDCYm27qdoL+U-JlzI;Eo zT29zMRqxgIUk}YWKZWB{l~kK>^<={}H=mT1Ke3xM>z1tg%{1AJE%_hAV>fRJkS+_F z;Se`NsqpaY-n@x^Ut5l~s9*2Bx1?FIP{#DFy4FEMA$4cB-%C>8rrlJp?n-+)opUS0 zsjS-~$;YMMtbe7PdE>KLylVfn{XE+jv;W=`dGf}) z{vF(NEgE9Ib}e2QDVRI&@6*OZUH{BQZuZ-6(p|4==Q%m)@t1aYZAXEW7OjW%JE}y# zy?Jl(*KJPDvX4nQpIrPBcSNL0-b+X;%{}X&b8l9^Ui$u;DIafp=^cJ0wkOZd-@z?# zm+S+b(8h&Vf953C)!8lo{``Av|Dm|$FW&UsdHJ^bj52%GjHVUr<-eS}YG(M^-nOha zoaA}K?s1}z;(SZKh5X_nG4FGh@as1<*T@-OaBOGXaq3<3{K8(Z32(n1JoGwq*1cyR zS?|vB*`Yc^#%*oLH%9e@hW)9&-)x$kq8jh*xHMzG<~-|H;y)FZL zsYPe!cW|n2FPqI?ck)Bs;?RQ+HgIV?G~c)Pd3LPPSA$@27Mn{Fn~LslNtva@Zj-8f zdqK38x2FA1sZdtUj}2EnUFD}~de8VM6tZu_?M<_tAF;IkS#l~v?jx7l*1e`5b(;9j zFK~IScGPU*4cSGPIDb6R4mNCdV)c)^TJEvK{MNjmO1@w3irxDE{7;}%nuyfBX&GNj z_FY~jJ-7bv*L~kQCQZ!Fdif*eO7bovvBa&;-@T@D`Q3dy<=*REUHAXB29%xXazADM z@PXSwu1luXM(gt*NPem9m-u`3reE89Q8v@}j^0O{T@$uHQV?Vfytb>7BSw~}*_N%+! z9W(7iN?&`gZ7|-@ek*@|&ZLP|Z@UUpmfGy=-I5v1WdHt%`Q>1@lnKV0b6hlT{P(+< zt^SAe>WyWwZ<1!!PrmD_CbMGkpRE0Nrrxhje!u;L%EH61zA&e5o3u0Sa$srz>$E){ z2Ri*8sDuZscpAU$-KnbIg5F834eRzl>Q(h-oL?-cdSd_TnI^xvU)YQPdS$isK9_U( z%}tw2?q@bv%x+-}QJ7p!NPMg4<*706-tHS>s zvBwL=%iK5jR)!o&R!uqQXBvH_^M<&13rCg`*KDb-h<=_9Rae^-`HB;z7k^yzaoP4b zG4znJZH3chXZjmnFS66*r;I<(sc`{$@|0NSEg6wPWd<=Q5 zx#xI5+?j~FEo)`MWt~?>y@+9u+xzab0?fBZl zU7McHQ;Jd-v%D1Z#HrLV<%_f5HSLcP)vIQBePIdO^FdWF;QQmEO$T?Vo@DHFf0}Z5 zLmOk&8t*sy4}Kndo|)8T-Nai{vh9jYHH$~f;erj5&%HQ*;hZV=p#Y`T+j{18uuXHz zlrZgf@9(#hJvZ&?I>YPk-{w4%O*vw$ zX}QgH@6inX^-rG49G&tbX!0%lH_>%Y+R_a1D~et?UQzor#q9#ilOJ_+%Z(4KmI&^x z5xRTq#lMD9f4P&3r=(`HtWK!7s=0?JAh}bA_u^Rr;k%WG1g{-g?D;C>)LVgDzb~J6 z)HGTqA{MDTar5)?vJ)cvmu%?zt)$btfUU^)WN%0L-dTtHWdC#@y<^qPwWQkNSsllT zZYDm1cX^VHN0kNU&bh6y_srLW+Ao#1yR2ELThMcc_0H1dtXZqfcKr)oypFSE>$A3` zoWAWdCOoc)JYwPU;_87o_br-l8$DkNvm?0#(P&iD&6qV?$utg*D0?A7*_o>uBm^pp5wz) z*6tf(D$Oc~?sfBL9ahS`vhn#!dtukiKWrD?%w+8HUyTISTCo+CbO%?e8R$DXJG-(&xN)9>HUX(+So5Kt-XJbKtl1pF zeLe8^jDMo`_h$O;5ILGL%eh(9aA!}_%hx3;U4cSn#qW2fB`n# z&D&~!X83c)><&wPQ}aoZaYm`7YS^utf2=R^Ry^|ej=1r|hlRH?Haa+MR><#Xy$3&u zeOdYO@&AtF)$#U$mpA*#otkNTen;9j!$9RT_W!jqcjmr5@aNij-Gyre)(d{`d-hAx zXOYa|-MkSR5ep^vKc9EkZi05N#c#p&J||DV?0e`Iy79fj_2vryr5?#w4&0jD7W3zZ z>#|F##yN{)15zG%X5L-T;r5|BIp`nX5BublDb-#vWmDbtO&%{P?l{VtH`U;2$fE1~ za#Lz=KYu6~B685zS^S~H&sj-J!|g0r_!rbC?_860-1y3}4{Pt1urc&HwDoFw+Khj*qNFzdrToPj-LEF2-}YKeQi< zy@`AJ(tn~?%!X5!PL+Edw_q+|pHZiLr?DYl=R>+UOD4C#hW`ly&nKDqZ2vuX4R>$5 z&;2mlE2Vr+8YvM|e2Ywcxs0ZFpKx%On_SsqGDlX$`{$zR(-I4(T@YWIcya%O^v(N{ zfBp*nB9gv$v0+%N`p1Z;pCh!7i>$noWvEswy7*q#vYF~h-s-VUKjrc~V?}#EdKqW@ z>b}bGCQi#kcy{a|&fJJ3wXcflNfIg(mtIt`kgO8@eRbO_-gDgRO9J~2W?9bEZJ*=M zwfl2YtiaLS_46Z(pPdy@ViEZ2ykzE~;O;B~_Q~^7vK}WoTk72GKL7k^d)-?>&855h z7S+h=*jdNUJX1D3>+Vt?@wDvSLQ}aGpK}mrbavQt=|oS!rRU463SP!0xMn8L{2Oqi z;m!l;Ow9u!pQHH7R<%a-i7cL6ozY`+Gtr}vX}74>50hy!AH_C3Z9Vm;U+BXNr>?TX zj0CQmw>DCSj_B)d_X(+; zEXK6+<_V*@2~YiNb$OpnHWqVEdhqhO+P5H?2)$c!ylbW#2l5|wyIh#4+VQY2bMJ-s z56?O9P5;VoHsRpr=ZEa4G9KNp)E7H%^sc$}ThZM*2 z`EhKXWc2ZMQ4F`WtZvcGncH1y@sf?v=R+rqgFH{8?G?^@2@}cG#1m z8BY&aAKNqk-n#D*f?Ym!_QnY%=)UKdY-rH~Iu70&gEx0-1!vVp28basS@I=qKIOUny#~r_K z#(Vzy$Jb%Ysn>GM@|jMwaFDiV%9&ZpI}3D0RwSN3aw6q_{gT9!a&JEW4w&QmV)lC9 zFA2{Yetdts=%~f*^vd;4JCz@W9$EMC(ayvDZ+fQr?Pou7Ip{>HebR;3>-O@9MpV00 zSngC1)u z(+u~h@-I`K%ba&7u>AOyx?BBA>LOy+Rw&8sb&0&Q;sDF!)}H4s4@5V8-gV`}eTF&d zng6?Pnz}9QKjEvt@lYDWGzR12dlxs_$gH|=?$w~+l)5)7_T*ck+d;EuyqTTqt|iR5 z_VJ#KUtJSBn&14KQ&udJ&*r>p{k+O4(f>OYC$(4xBpf}~b3wnGad-RKTS^-zc}Q#3 z{Mf!{t^VTmZTXc>Tg=v6iTc*oeDjJynZD?z&z2`Qp1+)YzaS%c)8p^Qr<60?(~wML z@VoG3IginPzJSW|V5W9~W8J(9Wz7t)r>Qr{-)%{F@Pf@HEMAQF+!67AcUD~6<;vLP zcV6@6+X)4tx{o()ntc7Ytfkb=`LFm@m-64-wOl1*v61ih(-pS24{d&={dN08gKzP+ zYWF5Z&un;I_4m-chwH0yBrWcS%=;eV;vLWaXlYc$KJ`w;{&dAPDib1=L-~|h_q^Yo z_FVd>vg1Yry=$=+^SB;Q2Mcqu}m@Y){!$ zO?xV$muJ|eXso&Q^6lEidRCfIvs7OMOt)^bKlp`RHT}r%Wz|9t@A--TRyuQC=h)%T zv%<1w+_{|jZY5iZVSro9EGGT^rjLSm#J=bn}Rs^ZxJ&HjAZV;chmflME$tbA5juIDWW~&-{JFH2cG8Y`gVTRxQ}a zcAkBqIU7T7$HZiT`)pnn+S@a~KFvvEU|}|4pVbhbGyRG2;->#+({b4A2IhS54xXMl6`Etg-J->zPjzPXQXZ(epLQ! zN~Md5EnCO6^%L8Df8TiWWZ|VFcP}TT&tj<2kSIS~{c)DU)XIPVLjV0`let?Mmebkq z``&)vaSO4Uc~+4>ESGNE!PG7u^Z2ZCrSdV8dE1>It&0D@d+nEJY^(1zah+VX)idFc zYS?U5=irII`uVm69oXnOsquDAy0RF9s^?3$Xx(*P1rxsBYx(fucf5zE_^CW@7dst&-c1tNbS)`pwzc`7wQ7sr4*Qwsi~M+E3?s*#FP+#~S66rpJqT;x4(h zEELSx9g|tRn#a}F!HM_iUzMu|inmNzroAOec&^jICA)%Gw*?>FxXnT9lxcW2`6tJ=5r#uy!TXcA>__0+h=C!rw_b~16%^yvj_ z&OU9_QPKQXcHjjI4l@#E&7Y^6yT~gw7RbGv$dk5BL7|?v;=Jqgm`(pXn7k4{ zT9(BJy;QVaGU3}IQ}3|oDfd97d31i$Z*`fGC1 z&x%w`5PR!+{cl8NjiJ<@1+GpZJC|vtbhEYvTrO}mFk3%&hJ?$h&{tDE8P@H8`jlb! z{guy{Qchmo+Tv(B3-L z-Y2Oi^bd(Mm88XTCjRi5c&GEpL)pYXXN$rc6u#BukXBhQzSH6 zw(a>ZE3>+-u2J*&?sVLJb-*`ee@3X#=5+Bo^K(akJemIMvGxJ|?umL;PH#_r%D&bk zqc{KW8IF(oyd0NT8eO=c^f6sRr1rN(@ui#E^PSCw9)F$8eLk|UQ&!V(%hTsSW_)ok zPxv$Yz0Pc&@)<>o?~58-x#0M(X`aENC&xEuTlDJHEOcfoYc8_7(BQORqW5gd+U+mw zpPaOoc|2*IOSYiKF&{;);FG?4Pq5uERho3hZvH9m1&tFEc;^RLZaZ$~StohMyC6jK zz@&(|LYqI=tetf~Bt7840p80~XKPx`bk27=o-ElK9&?^=hupKD>~A&;Zn(8~wrs9N z@Z|J|>^bo(%jchDxUKk9WcusG!UM~0O&&XwE&6Gr!Ly%x68@`t61VyFw-ck~iX)OCMAD8@JXk{5tEB_aZ*aZ=X}U;_QBT zjXTSy{MEJ6HWQfJuk+T{h@=Y0UssYycU--H^>!Pn%JmPH^e$;|+aWQfN%ZQJw}F0f zJbkR*GZq{Tdl+8vd1}z&Xi-$$>yo3pLTAl+B(-=po5<_uF4{3} z%cecsS@(`%g?_wT?&A<^BdzcY`v2MUE={^q<2${OdCMQ!8C#?TTuh#DxX&xzTDfVl z)1s}*OEeFLZ1vvtEm>3alpK$w3{&QW3;b;=8@By_BK4DR&dhcr{**TgHtyy2f4dna z%|9sJwfmuZbjJG~w=1&Na^&v*Rj~74z@bUMiY>TnuDtFk2z1aU4>Dj((46&A}U%wuBaP-6K>0Q=K&;8$H zZNtKI-EYZihn4vp%lw7SLZ!^#2Pvq$b=#6C?`d*E>+x&dXWKgDa=r8xOvMN;=f2oDwZ1=^UphX!g#G*V zrfFK!E3fm!Hpu;sW_<2;>fOhQ);Bkt-hb}nZifr|+%!~0bt6=MB?L>Jxqrzg@uBBM zzDS-p-Yx2vy!So0b?YtfohuycPQ(|_`6d0!;i7f@x%7L5ukR}>ItNQ_H4>7HP~P-@ z_c1jMlk)Y^^{xrltOePQj}9N`UOy#w*B0NmEc+#tX5GsuNv*QcT^siJmR3Q!z=yxA z(Jo!fm8LDbbTDLMwTe(~#{Mri+HWsQlc@dsw#8=NUENLYhRUy_o_?@i+Vtbk%}HW+ z4_x_j;`!A_I#br~$vP-!ky2EVwRHK{FQ>1_3Re6PVs#A9d*lCTVUg;C3dyu>Q9**K z#~0}_AF;VB%WM;{*5j*>`{#{nY^{f7J$WM5Uh}wl-^lM<*rA8Nc()nvczAb)$276% znufW87CGg+c4s803R4?7ED@JT-9zvgD zn;dPctmk`8TfU!1`-t9#%|YuJGNw38f%q5k{Ut}{O0^PFTQPV+7|Vk9dEt9 z`xiuH{dvD^Z^KuO5A#j`AB%h~CitRI%kaX|ok2#;ok|XIz3pGGy*~CXM*4(Y&ehI) z6?T)dzUvq>Nxtk1sZZXw_4|zn7G)D}+Z7`S;{xHXV3u_Ha*o%%y){ z-aS9$a!;|_)c%Ly4oMF2psk&oS9_k_b=>-g(-sGouhY~Lg?7Cyuvj0Ip)8kpXy1cK z|A>3V!fMeGJD#jOrO~SFy=uFf;rr72>_(?gefsIS^W!8Z6_&sj_RfhJtxTQwMApPU zJK?*2&s@gTkK07=6}T-^pZcT8}O z*ZnK>@*AAG9e?s?9eMJpSmn3it;bWtXKUIRX>UFvyyNilo&9f1M0fnR?GgETOiChr zf6+YKjY_rc7sbbd&lI#53cFfgwdnTtUE|x`BG*61HC9cj zAxvSS=e-B%DSqFWK~dU+8m@4`MIx8?C+5AfFcgg~MUZyJ&%4VeUm= z6>mJ3KAoEPDl>ks`bwQiQoPPaFOGdFU$Z97Q+4CaCp!d>cq=ZF{<)-)d*#oiXO`c1 z-;j8?HtgnxkP^wJ1Ld27KKm=iTQ>PDwBr9|!#4AeLDTIXW4X;g zPX~9-D82UMt7Bo5)KN8#dd5W&pEt%Ot@3%|q9>c{wUOWZ)b$U~de<;dJZrMkcggLE zt|DG+FU^h?%3XS=qfn#SHu=l9;5qrK&9n%-fKCQu#@aNgNS;}iSAG%eS%Q8tx znqlRQ3lpQZ@zq4loL^JnSot%g%BU~8;rnLG#V=RRH9h;`WSmvXgoLeM6Zwu6w7!dG;Pd+SR}R z&wrETe^6Ij^_?lv{b!z&!nQ861f+Q)@vmX$5;J?8T%G_tw-&(tq#B?CsC_>m9>nm%7+Kd&;uUvHMyx9+=s4Ua02& zDs9U9F7M2tGco0xWrHfWUY;1WK%m8Zm(|0s0>O2=y?*~sQu=xQS^Rn5BaVJW=gOay z&iw3{aoi~9+SJw^FLnrWFVK;(Xy3eLg_Z|%<_0N-70fr=7d8LUTq&5ETed*x+HdzQ z1up}ZoRW9ah}uzOc65GZ$d9zQturoJhkf{Uai8rg&tSf@{0*1Oz0{XBUu*tTm9MH; zzWKlvpM&mSncElNt5swYwa?pQ$#h?G|MxX+nll}5Ni2NH^vY@F`+t|0iA+{pH0gzd zN2?o~aC=%Z$Dd9I*BAEl&;N6*m;Uxe{yR@y!e)cruKA%$*NGJUKNsuvm5q*lir}3V$&3p(Z?1pyYwhaT zOB%0vxm|Zp+VFF(tcm>Lz|DcD4z^0{t!ud^@n*7XzmZ;Boc{IxN!EK+ESb8ib!4Y{ zv7FfdyC;3==DoW2m$3ZVu={G>+58pnevpb#r>A8p6)k=(^Llz( zv&54nrrkF)+sl-vd)x4{iAR1_xOnJPSf0YEs%=3FmTk(K)oq(LGtXaje(STwo8RBI zBrx)9X^X$<>~q5R=;Vg7%mYWQojs2pRGTo*+HIlIzZYx%9+aKTa*21(0^P3cvp##% z6{m4axI8NTdL#1XRMWulhvCv*>f3ka@~+gs$1cD5jgpr5+nKFL*%npp52#K|RXx2X7O^P4`l^ffM<6y4-%m#ApIWwH^_R@Wo>hl`RljQuy}P4% zQobagNN8LAOy;e2zfL4%MVuE|yE%G!itDXX*Bu`P@{3N}s%6dIrebtKYNL+BMb?1t zMJpDS+P0-!dhllYv~ro=t@o48m-zAq?($1tvyXw(#e>iG|Jm}dvo_a1Oe;CQGV;bE zSqpagPutm#{S>_aVUC>h#>2+fZ(Vc@^K`v%yed=B?yx|Ri=J=Vb%sjQ)W<4czZp4v zKU|v^pA+UWtIwq1@rRi6{7pBL7OC$On_O=aeeHI|2fa(ywV7*zlI+UXet!OMgLmTv zv&oI+Z~J{i+E%-(TV1u8e12_xS5eVlAK&w9rp@0yx#y?&*Q@QzD%A}jg5qgGtFVH$SD=CZC`#-tMxJX4!g za+;r5vfIA4)!(>&RbGaNjy4*Nt{7SO)`@F1d?y}9o0fkQT+fHh{k7btnEGiuPL!oKWy@#r5 zGv2lR`JlG8Gw}}N)YFqED7J_6zet?o)h=K3MnTux-h_{5=XcqU=N=tc@M{A9@r(y6 zm`u!G%r9o-6#uKbP*%VE=W{o^ncx4c$?nrX)@oQ-Wj0|m_mnfc0cIvC;eHZBQCKt`B0C$x02qj@Nl=A&9-JWt5>++d@GortnxMLrcZCp2G_1`dFET+ z!|u#ok=f^!?KEF)yOey}(;a5!VxNWIycCf8wEf7@=7*1?%;yQ)uX=5(rPLg9ap{Dv ztBJo@&-hIHFEID4)D+g28UI*zdk7sAJ#Am}z~k*4U(IHdzaJGIpRiw$Ao^RhS?erDH;tPg+nJz-AO;*h#U@r6F$#i!pp#%%U0UT;Ic*L43`_G*g+uC$5hcE9aR zd>m=kE9!A|#*u1=ZC~QL!fbm#SUpQ?R#;=cIB}`b6up1j7ux^&AoNsa(M9oHK6!c0 zDPMhe-@o?h=VlIOm46=7lzuLmYq&!H@5&@=JGZLNz=)3;Z;w}R{i$tzukP@}kExN) zLL0@m))+eX)?CfH*{M-Aqpsq_4nw2cVr;52@|L)_D?N@*3gbKxyY84qk;^5eWA`1C=~M{f)F{Z>iyq$P5Sm+b6l3@EmY#>TJ*-HO4UzUwA}BD=B#xsFsnubUQBvhA_qReeyyx9L}zvDbie^K+} z_Uie3EtxW&o)t4HvrKFgxj(-%<1tVw$?Q;=We*hw32 zlh92Qy3zu3ip3}X*Lv#enJln!n#t)*xp2;zC8COIj1{7hdw%CBWSjas^psxem?(bg z-1I%K_gpiWZ5sD+ioeS#z4}-0j;U=k*z`o^C`*{6gDn54%g;hAEtFm#i4Z>a{`;y^ z5ssgq8jAYYe_qZaAQ+L!^mWanA1^ACV|{pE%9mcX2qXbt5&`G^XH@eT#1>+du$(XN=g2){86F!#Iig4+t>cf zJf>MY-C@CNja6Yb{XrH#tu&)&SbbJ_DD=!GYkD8gOjc2yqnlNBrLa!=VtrgF{q?** zFFXv^zYNhk=*YQs=7LXqs#W*wfB8L{#bveqCIP0Yw+$}7ZTaoe6&U5Ob?@gqCuNQP z+1{d=ucMw%6p`)~FXv)D>*#OJA*bHSzhGsf!bQiI@6YBb*0d@~-qhJu@LjtxzA@LkXWp3w(anm5cuJs=6d~dDeY~_mb^vPQR~9Ko#=OYS{l-k`u$X;S@E&Z zHA$;YKJ;l`5K>>Tr8#uhLB&g)KLoe_HC^31OYTBQ$A8zn2dOK!#fGRvhn*>V&U;PF zHr+1jVdukQb;GU`+Zl^8+0BEFJa=SlOg-GKDu4PTND%@W3PKAL;Q=?#ooL*ZijDP)fZXwa|LUc&jIPL_6q41 zLZ1)mEr^AAHvK|J4X{aW8Ho7UA?9X5Ge{!WoRaG&F^`B}a5wa4~Y%qeP;uU7N=ow4%%@2g)9 zL~BN03~OH_qu=Qof0KLJl>Dlv$r3k0Ozbpno|F_UI6rS6$F0XFZKj{e{}{XO_Jz}N zN-OHv;y9L=m(Amn|HyIY>4Q}_ZRXE9BPaL%8L33jGL|YUYQZCy}8U)D|U-` z|8walH%d=`|JSQK`_Dd0C(rizj{CEYO9#eXT&}-FTFv>>nPa6sG70Z@9PVv=6)kwP zk}JntDqZ|fhOMt|jLOsF%l{l)Jc;w<%+9VK{2P_hB;VyKG2JU*3ze!gGI3+sK7G%! zQ_KH;2-3Lzyze}lxA$eOM(x9tkh(Uy9o?di}k+l zsdMw0B;J2?=QrV-Y-?>SKfaA<%PiRXa%WN7rTn|cq~x5N1Qo7I^3R&vy57on%CF_$ zc5W~2$}2ZH%#$?5`Cr2^b18d{gvje>U))MOeQz7D`kdo+-~UYitrxme`Igttrt313 zC+>_9G`+U(PNn?ydopt)V{PUh%KE;eE3EBy?A7%vr>*;$!R5M~kx%OD2L=X)38@kC zsR3NfpZ?e?ZSP(Yr!oKQ^y~@oo6I|P!dNv~>(ewcwODQ+WiS+#>UQ{B8u*UaZAV?G z(3+oytI8G|XBZvP;Vh6{hHC1+GcobPL2UY+Apr`|FO(HYdn5w)Ulk{H}}gyYp1R|4;z^R z?(wD_y^*Z&MUltM<*?Eh&OcwP4i?{ zO>%B=SnDybO8PH5_06NB8|MGy$@;LFRdKCsY}nHOc5`3PkxVmYx7!dL)Zu!t{o~Gy zOvlTZL=_i`eslOZ+285o@wpd&d%0J)$jd&QT(l|D?UoEX+ww`%LSE?dJAT&XpHj9Z zaM$B93Ql@IcoVV2>4?o?V|X_ z{-r>NrU1L6>c$ySJTv1~^fs+>{2Ll|G5h_bB~g<6ORoJr@jEW9bfVH> zuDiykxAO8VCJ*tyZ}T4PJoe(#l&Hrhxd{O&%P(I!e7QZ#mFLBtvKE&+7pLs`^QDS$ z=|!D}mrTsdl(yVde#6I<>?*+T`!)5t=k(svW6AHV`?!8zUmTsXAmsCV z5A+c&3yGbzKKo$nnyZ^xiWTG3j@F)Boz@!tG5y((vz=SDK1l`i`o+Dunv!?8k$Hzj zgv^E~eepA2N4{B7C-mTbFXOjFTbcYDFZWvbamG(nW1f@Ov;1VO4twM7oo4fAy;9&w z+%@@F{&6oC#(+<(VYjvBKGwTuUQwtTF0?LZnT>7gKk1;AdxY3p)&;+N<~Z%8&c{@N zgEOB_6#sYf|82f5`J;zQZ@imc_J~Pf^8Sg+QucDY-f9cZvTxjw>$<%DZqCI6)6;T4 zB<}nf?o$2k!vf)V8K(Ce3ZGJH<@#AIzn1i6`#>*V^x)IEi+}7yKXwwmT+nrbFO{`)y{gLobWB1#Ko-++q zm@H4SDbJgnXT5b=zF^Yv845>^S2-)6=r)SKoZpwC^u%bks>a>NVQI$ro(tvI8$_+zb-dlA>N=xJ<7)Y1H$Pt4E!ZGsuEJG+xnT-l;wDd@Aniiu z-m67PTz7Z5s0cq7v<%Tt-;w4Q%RaO=LMfkvsmkFr*1jDaf)c)oY!O=gz>N z3tc~*t4{v2o89TbV|n@6`|WG*ax5!XpOdln{VdtXna`%#CrC{4&%0F=QazUI*--TQg00!v1allbqMpRx-X>B|i`Zf5(MbsI7@@7nl#<$XxbJ+SYy*z*Zu zy*_EP?H=b(@HCyXC1Ii6%lBegf%@7#*0K{kSnYF7MSokHwlKZ+{?wa)XVu^Bi-e|5 z_;-F;?80Lgx2tkxOSq@N`!lauCc*}dH_x|P z{O`W-$Sd!nSo!7E3#0lue#pMd4c+9?wQ~2oNm@HM8L+f$aC!2K_2cpHw|6kBZqI$O zO538_@6yAJBgK6u3*ujC`3V+#|L-(W*;Rhw&>BONxemJ@H;XKBH7dTc!&NY1hrMH3 zr~cFW8lT@^Pnnl*e4P>dLxG|H=_>}oIh;Nb?za@VmwoukU=$Ut!lGB0>9Vu9nFVN;9UYHDn!apY)OQ%h!UoV`unc z4xSKwdueXdzZL&u#7-YL{V8LLk*I2^cdeW<>s-0ZA`vH;TH-HGov-?7ZfeocgG{-%Dh4Hgb>lLU?0dwY^o4=zmU)%|n2*PF|f@j}Oo>7AR~ zI!f+}tbX9Np!)c){?Zib!}Izd-t-XkxvcV~;W>*+XX)zn#YdhO`9J=5_*#C|{K~TA zMaCz*_Bod5ZV%XXI28$VlO!Fbwav*Pw^duD&8;0TPJi5So=bR}bc%EFGK+azr(NkQocYl@ zGIU|@Rs91 zRCjUiSZ{W;Qhk=>xhA2li~J9y9R7A!FM91c(Ynms*yER-cQ8DauyOSNrrgK7CGYS1 z&|ePMKFo?;66$ZX|GfSA&)FH*ueDCS8tn(HGE_&@`VR_)rzw4R8r#5xyxIPKVz3(@7y|aSp{oB_=61Gar{Z_H@ zSHN|nIkT@XPW&y%a8%<7-?K#r*;`WV+g6^hV050~RdxN_xwWjz{fa}al$8G%%_CQ za}O1I=%a6=&D|qaE)T&E$2HW>`I%fp4mu9%B{M%{zS9?rWZfkG9e4 z{L^||9jZr@Ia2M^);K`IF~N+I#-kEG<>{=-W#* zujQKtx-Bx=D`0YB#k=IKOed9vost=Z7Cl>i;!3{``z1a&NfbwDW0v0{Gr!>2`tr?p6kmy{X{owM&gEJwz0Ra=@xx2 zTI%&}`-Z^zt0uBlWv#j~zhUE+cYYH^)|;;MIXiPt?wU(wX*X?un|}Vung4sfUHYSX z<$8S+&L<1C=FSaXQOUHL|L*b6$$O@>i=Od&HeJ^|>ta>p^XXq(iuS2rv@cXR@%%v6 zgpEr|19_gLo4;uI_xgInR@Da{YT=b^IU@GxppW>@o8wt zOxPe*a$n*^X{PwkEeUu2uZq~j_Hi?Z<%NpCjeo*U@4s>3_a27|`#W|Q-#N@uJ@V7> z{+0hV|GuobwRBa0tlQ?ejNdb^ubg4G@ZOAzzYW)YH=MfIX#H~E{X$&^ldq-r2bBG& z&~{6FJ?mO`c85{XRx#5zFOS8FMVxN6V_@9)xbD$z{=nC(lTKy!ZLnj=Tl?$krVYCa zB+8F3pwX3P~%I41(vNP|zeL`E2CsDN1^E2magX@)N zD^=J|e?FtWZKL`XzLII(>>=zrFH{Y+)i%#PYBKNh=^EP|_v^*C2kLZRtL#b+b*$X6Yu3-4q?j_V9XP4_P-RY!_*ro5#hXdqkP={>iWiI zwV_qjs(;;7B9_(kT%T^0|KjPM+~9yuFOI3r_ub03N$$fn#eZoITVlGRCd|C~c+tEs z@5OEu$BReK_3Tco=q)VrGuZXw*yP!cf(;xwYURsc>}50F{yE8AY?k!f*Wub3b{siw z;RhO@*qjpbmbMaPKF_amG3m#efQ@MgIHb;w`01J@lJd zm#2GrR|hHH{rb}2+QkT^jfKw^o<90};#OwU*J*RS|E*`<@Q!nz-V@ye8c!SSIiy%XImamPzmO zT{8bApXK(l;=DRZGp7#L#tY1o^6-7HiM60mcbs+bv=r=cSi3y z7CCqNzJf9p5&chGmX9>G?}azs^}1EMRiD}IY`sx!nbE?n)f?7}++?Ylcyp~qkkRIO zCl4ihoH}34GEFf=%uhjF!kr|d&heZ|q_r2<`dKwacHr9YM zxNB$aMDL9;9DAm2KKkdLze$0W)Sem3o7d~E7M(Ai`h8>Xj%(((gd6tVYQK2uc-aHP zHOp0ZPn15(e=K&l$E@E9yDBseEd2UKrKwZDy-u)}A;Y8QMx>rck#J;@=T~+iE1s45 zSMKasDd~RNrYSh{qVGOSk6RNr*!-z3y0|F^!oN859ey2pnDqATlsjjZd_HVWm6^n3{Ddz8ykmzZU? zeSuGE&e2fL9bLMCT#hR;9X39kZ+M%(e70iE9G3?R?CYwBm_1*sb-x&*}XR>{sx-9?k!!JP^ zUiuZy?;0Nlt6TAT-70ZXtWJ6mDtaUNsjPdP=*m0mUPnbc2A_~q&fv~`oW&P-G2cJ* z>ZI)F#j5pZqyF4BXw1`!Wn!B*DMiZLmvdXhE60?MS39SOr5eV4Fg_ML|6R+PW!!x^ z2h;qXzHiXVI8*nw&`8=|yv%UYuCUIdVXq=X6J&1fh|`|EM5|(E?5&(%bx$LjSb}5A zRQ5k;(oJprlWli}>9*g*UuDGspC_MKeY!|jKTctpMMsYs)1MD7r_PN!R=VxGV0qgI z+ZFSUJzufN(Y(|%vwwlMN94UjP08K=Up1ca6c_#Lvd%-yH}t3@Pka6RPs`5mS?<06 z()h#LLX#$&i!WHE9WB>LzUBJyg@b3}XD4Pbn1^~oU!Ge z6vbH+p4HrZuxe|P@5%g_*=6EWc0c{KuCPVtUDnG^civNqmk+Jkm65F9bw%-qylVR{ z568dTQ1( z*%W88t!+5ckuAZn?A0vqa5+nb*n~XctBX%O47jfQs%7=e$W69QzMMxl&M9&?E{V%B z&DV54@pi#v%gFPmx_XxV6xRF5#lCr$ud>94Ni9=6muuCSPI(^xHkonPQ}e}Ie1(2} zPfKokT6C;<%*<1{U}7KFw3(e*&m0el37IEui+8NT?|s&`pg{k~`P`YQ8BTT|4QANg*}66`C}tgIWc z;R{Dfz`fGTNAjjMpHA9;(zx-#^3&1DC#K5IjpA(BBluFf0=+wsv_nq`sPi%BEhilV*VMe;#t)W%3nLZ zF5SqGI>UFhCG*IveWlh4Y{z?NP2U>3c&)xc>@J>__b%8*@MZiAJHxsDnK-A*)_uai zBAwVD`{&v%xF#^O>*>6U*K}9Jp1ikZyW7llySbOIc^8-Ud4Bq5wL4v(ukGGsfBl0s zyYgd)jI~Uir#nj*-dbx?xL&DkE5k;;yUJe|a>z#>nVo;>zz%`NYRhFeOCB&W>#Ve6 zojT{?LElf>IsM+eQ8kM0Et!U!GLJbqd7u7s`tgOdXTrIyb9XKIxbFD+naN>oRaQQ) z{Cn&Ea?BKc!W;KGYLouSUE5|(v#*TwEZlZ)>9U!}Kc^h6N}sqy_KC%;YJ;yc*Tm{? z(Y>8dArH8zVUQ}h-a&bPP-GB9zUb9ZyU(EWY>9FzpT=#=t9|x9P)!Djq zTV-IR^vj7`pU-kzo&7)l)q|-nIjhbWt+87qZZkzK)qm7h`s1B%Y3ZuSxlASIXXaEqaB+aew-<0tUkW5|KNAt z!l=vJIVbjnJiBM#8!b1*<@9sIV~>{AyS1)k|GbJZKkL|~&7sc&_}N&v4>2dsOXCY)PEi1i9xw%7YajSs%YFQ2KXK+x*?XG?!1}ao+Fy>hEiD-3eU3 zSdOfS|0n8^(ZF@1QY73O{qSJPB|SG!2i_NH&$QpIw8*ej z;^bV>XUmi${^xmM*`|86h^r0t&sytqCyN9!3C2Vzem3vi!{+#-t?%2)+3#Gk;*M-d z4?8So&w4E`zGE-jxjCDB4)6TW)+6v=#l2!%D+|-PzF9|;9vI7So*}}`@pMMX!C6xy z-d#7mTJ`nKN9X@n*3aGiTwl`Ucf0qV*EjE5?=1UvuzsS3)RC5BH!izAQqgW|Tzqf$ z2G;7|Q$6kPYgKJKy_h9$+g#pF4`!Fle-fmpET8AobvsH~^J8b1O^m-Co0|Uf)cAcu zT1s0t@op8qDrUpEpgLlaoa|Dq%QY53C7dhV8J>c^9r)-#BULC{cE# zvvqNh&I6NjS4=f<{ex-GBnTb65jTm4Sg1^l@7@xn>xMp_lUUn$ib{Y?-&iaOB z#wjNby4*Op^U+e9R(2Q1iDlD+!}R?M7G`&Eev-FRVS3`G>31ETGs;zP@V}jZ$Aa(l z%2;vHjW4y&>t2WnY-(A(L{%!rZl1Q4u5js}*cc<*i3=ioHRWbX-TZb_BJ%X|@V4Ww zAD!ibMNb`kB=cua(XsXkH@cQ|8XTDwH-mA;?bYwDdzIZ&=Cw#)_ik_9tLtWOS}Xsq z-|l+mSj73)ci;A(nrC^oY9Z@f{*<$7`4%p*4_{Q=nwGO-b^FcA_9F+Hn6G&;Wh}}# z{BSFmlr(Qe^gP%7ib;;ERj+whUCDaPw}}1v(+xRFNjw`EXSue&E1a7X|1^H#v>#q8 z>)5iUiyrJy34bt=MRvWKS;X6%n5;KamUF&L-g$cW-1STgFAL7tnbY4meck&-Qd!Y% z5B6#NoE*wpxm_rjS!BnbuWO^U)XFom0uKgH_^6#~Q?-|iVZTu|&%dcB1h-cyM#xEFSM^I>Ug z|GPd4;qCMGPYsXTDflwHd9v=74pDg?c`5!Ez2ZEnua*U7t1IxaUOsYIb5ldukweeE zd~W#eR~%XSezwKDsa9J)_*!^IB(-cl71^tH-S+1H6AMb(wRbF?yUR%H*vI!5wn!&1 zc+9K)ut?uTz5n_X)f?FmXy-fKIQ^ z);w|{@3B|izH5SUa4Zg5@``@-_11t;kSx&Wo2rQ45L)F z3PeB5w0%9>LVmXFLDQ^Pw?%lQBT`qpt7QEA_Vr|q#VfzElv%%vJ|-Cm__3AF4!^T5 zEhofjmhsgB#m~34}Rq`Zz5{~^?j^X&ZuwBo7kgdchj`$Rs38_M+^fxch0-D zaQ|}aHy^Kj6JZf_nzhuS>ENr5sOt|d#@_ktx!Jzz%oGV$g+0|<8MbUW(ZSp>E3wr7 z&ywj=au=^DGu$FJ>9!ny;=@;WzwtBbEnyFiPUJZ)r!BH^(P~kT2qy_w_53^DcWYgP zEpyICrfiEnz!q`ADng1?*F^Mr_>1=+zMuUTvQ=Mk{%huP*UW8?CH4wEJ2!VzZ$!l_ zI}1)e4z5+ndq1XaEYQ&?wYhiF7!yX z@3r#bBYu95%A8$9uO07S{8;_wp9K;ORYjaSUmT@xe3HA7ebnkm#cuse8L}$nPbM|q zcx69N z2;ca9_00k6C(pZQoLjbe`SukIU)SI6?u)53TasqB@lXGZBjIQc6)2EM*jkyyRx5dbQuOUDKs2D z8qKnAYVwuqo(h-ti%+^3CVKS2@yM{-pfRS-O`dUwxsp ztlWL-|F+mQ{_+VjLj7U4q!--dP`w}e?T5>WrwjJpy5zq)c&CC$T&u8{I)54yZu0L?mr{PcX%2hsn}-T21`Iwcy<0A5JnUO<<&dAg ze)*=`>21{^os;Kj+%YYZ&W-7>+V^AEXU+4I&c|%$)R|J-WpK`V&+NHf>YQ_ScU)@Z z==v}#sM}!X>SK>Z_q}ny)1frw{rB`^FSooov0+mcciB7Hcgd$0$De0?leceeW_m|N z+NJ8pHIn;hJm+%dTl1CW%Uh|k8J}ln&$+^Ja;|Vic>C=96ib$wua8K)5q8`tlC;w$ z>Xf^^)gz(G;|C92Zx5CJp}I5e$)_htJv&TOmvoxEE9;q}Q^Fj&zwGGLnu&)MhtQ(k!_TKmqKNv2OWzEHg6^jl0PPdlvMe9`-beLAlb+uYX7xSO#kVAD5#)^`&= zSQVd(&dh%%B9j>IBbm5<(Zmq{g42nWChDAL8QvW$3cAf^8=_{n_w2f_k0*$JD0m&< zKIMA*_s!~lXOUn#^wd%sMe;cAV+QpNrNv?4Q5s?JX`-m3_A7f1h;Ed(Xz( z-TCm`hKD;=zkl;B(c!2}?z72PGn_76G$~ofmNRwfhmUIuQXXubntVzp`MHDikFfSm@-s2vhDKRJz;p(YyYl@B2HNkoJnUW=k(Ioep;|A%M)dz%)yMse z|1)4Ot3!a_Zk;!V7J)v$zfsx+kt|hK%TbbRjIexvNC!A8n{7Y`l*16p~*aL4L zY1(J_M6r2A?a9S&@9au?sPN$#zl|RM7A^HxyACMjzK)$SJ?>(SqGzDwRR+P1|26Rn zT5>x#vs(Q=wln`HtFoJ^dHQ^5?{&YviL(E>aq1S=&kyVVP3>D8;{AxXbd3-5loe(V zwtaL9QhUAUz5VV`kBc^OANme=ORVsec5?6Ce`&=k-jzR>7k;$2ned0HSVk&2Z-c6w zUXkebPO%Bmv~HgUe<_Z8lMwj8fjJf~k>D8S{L z*gY-Z@BpW0amd*)ONC3_ht(vxcz<8yyU@RZecg#y^BHb1E$J$AURbZOogwh$%B_*d z?H@6$G_P4GxvTAJ*ve(Sm4**?y>fW6_D0PTrTz-%VuygrRg(K39y6~qk+9b7FZzD# zw6%6XiN!&WD$zxsZDMoM30)~`)3wogdh;+PaR z+t9N>Xvu98^uzNJ~d zZTI8X-}om~RX%#+V{^f}Y(?Yyrk+BpsYhAfef3inS@~6=^#0?V8O0B-GyUYda9$uG z$tZ8#?}Woei%vEX4g$Pv7(WCX_Z&3LC@rB zd;8ZKO8OC-_||T3ZC&>4{I!4g-*J4j`LO!(aaW!EJ1g$=X-A4%Z+iaNEJW$}#QSck zY?l5CGh3c&`wKmNqbPO3iji5eH|wR_;pPpi|4$7`{i66;vN~~XTb-o%y>Nf$g{iCz z3pMTC-oGu}ynD^`z*!qD!~dP_Tg>rP{nn)B+biZi`KI|3x~&l9&E+^W0a<(t3> zf@@s2wVastehc3r{SCDbKk#w#PCoN~&ceRcf4O4p?yQ}s9Ukp_nk&NS^piast=3K0 z5d2`Dz^iI8N%f?O6aOq0NxHxhueC5)&Vu2%g>1^sV2M*7N*C{4y=jj8Ocsv5O?iF5cRxS>88z3{=bkwPnpf%Rr7iS6df9d1ZsCNE zna}6w$}VCtdGNyK=M;`W+0LIPHCIiZzipE_zj=*ryZ!EFH}z*TCi*KJ>)|ad?kv-O zdA)S5)6+oh+N8$Z`m8z6nU|{Xab3kJHgSi~x@EpQ@8^Ax>_5qA9Kf_I_Rrt@hVQOl z;r}z+)@-q&J$*Vp*2ectn^Rq3c5$2R`r zr@v;mx|T3*s6QI!$p10-f$o)flW)@tV%~h;o4riw`r6-z7u)COe^>IVi=XTNs@Yj2 z^Vwqk^|#e6lMjX@a6e+${C}0uyF-iyLG>|m2k$c9RQ{N~wkhVG`-^uD4_0yqz0u!u z=G9xpuiuv)3tRpqg;_QJ%C?)n-czT1I54fcPwVvtN$VG#vllUayKp++$KpcrHTz4R zj!j;Qnu2k&)J?-@9F7-wwE6?PEZ^a$d(=*aJX>b+diBcl)t5C-&1_S5OPQBz6=(0@ zFU0lXh*i{b&!4}0+m@CupZB+Bw&1&IrCZE>etr;acd6{}zOMV!X{-MJFd2<_(Lm8I zDem1TN}Ehfm~K0H_SyEYoMZ30Z#lE!r>dtjENecS+8U+*00;JOSX8^E3xAAwB0x4mA~F-`~Gf!Ecd*G zbtg>t?A`>}q`U0dJ^yCl{K=8a0v5T7@y_#@URM>a^|}f`LuZ-Ls(H1h&8kcPtDU~2*CBH9ha=bNz5C+o9^}m1r?UJ1C&gfo zYnM+2Z7s6SdogRR%8t^#Ju`B%ZGZf;H}g?V_5Ko^~&)!dEH8;vv#W<*$X>a;2 zRHJ9+XDze-_b1s~%YGYelY0AG!S2oW>5jizZ{(lK^gTc6dUTX=%eRcf*CaZb?ajB$ zZ}=`DzH9x2ouT*I!}DFlbYFhg-^%^2{+5J#RlTKww=h@Tjr#RGAD6SRZ{&M$Ack!f zpTorx8*Y#5AJ1&|j4k-+TCtp)>C(p=<_pCelLX(a*moxWV9^o|yZF^F4@h0n+OPUb zUHdDGP1GgFXC?14CBt^}X;;)gy?xZ-tEPZP7_)u2H)mZgG0*kj zj6x5SKU-EzzRYwbc1?D{sSIahxuxs5jg6A6GZz)uO<1w5l`H*_L0&1l--BZ}?d+07 z55+%u@XIPO;)l6k*|Dh^&3`V*OpLw!ok?1di}7m9(TI&UkBgtL{(NBl#mgF9&)i#* z4nB5QeY$!bx4QUtkHVLiwfHzDeo#KyKWpc)nVriHdb6c%n8vh-XMxz4GKI$cw%cEK zn;cK+K4SU!Q(E8m?Wga#toab%(!pNQob!8f+@iCQY2PJHnUxnbPV$QVl>7IPHFsYwU6$$nO5F%!eTym{`j{Nx2C-kkirkCCkjObq)^vBj;w!=q4CUC+HP z$x}~x>#qV0>Cg|;9zJGzE^3}O?a|e%FI&0x@!R=v6y)Y@Z~N|Z-A?`E|MwSk?@!MD z8>k)Ty!pt)4+0w>nTVWx(iBtYe`p6EPjRTr+m2mb=btj4*N(j382Gk-f9={cPd-*% zQ;FQT;mqphYa7&;%Q7;GGRAXrJBvrxt?qZa$Q4|d;aSsax-mWQ{Ojen6E3MOmMT`5 zZoK_D=Ys9?R{g({{-xrkq?wT9r!Dv1adk5PJHBOavP;r+zRg$v?O9xT>elk7DSu^I z>YA$N&T@X>8k6|=#w}r9-aThsT=QzV)1PH@ET55D?6J>a|Ke#YE^V0nzcu#5J`QGv zWpeRKo0SE>z0nh%+Y%sqX!!;C8lx{qUS3Lmx2mskvTNn#_NMypY(_V?afo;)R5+Ro z)UA)W$Z<+dBErX&bD;{?iZ)4AneHUrn|wxM8ZGHldn3G)*FHac#KY#*330Cj3&g)B zPm=6@cE+TB!;e7bE$RDxHBXe*&pH`jv%j@0W^Jz0N$EegGRu1t&;RU*7Q6g?Q>+-v zvfCw*9}lapeponJz}83QFTd|mr}rnB)7ql0uk@MovTj-Azd*)70sV6GzA1dqG~W6A zn|Jm1y+V#Zms8fAni-?^_*7PhMEHVvom%sBBorFiV&5*>Q2OlL-kC+K=H8WLs!hmH zQsQ68W%Q^-uKr`&tqFyD70-TK_9|n>kB6na}5;)Aw&mU7VRm&McbM zE3f1EaJhfI&R&tNJ5?s~81P5bp2)wxb-%Vxyuc-%9d(Z3HHz0)s#}H4azAHM>b~$> z$Nf`%>=`TT51fdwo+2peF1yE_L3qwbnXL=9x`maqf7ae*JGr0tSM3?E}?Vk{*E)-B<@^3xmKrj8tcj_uJ!(_KKw3Sx_sIt!;S?r z3T^-0Wn|YDF*Z&!&}wCvIblxYgSQ7CC0H#uw8MSsx{dA5!3sxiC@H7T{817%b3L;b zPeF2XT1nf^syW5&%Xe>MIVlsq>HD$dBeqlRmMW&b-n9H;PS?#I6N_pE<=6hkua=4* ze04%OPxz(trEHPa?|J6Mo)uZJr~B*=r|o~=+?D?EZNs9Bqa1UMDp^hJm!Dei+QoD{ zM4dGb`Wg|4cr7K>tZv^wNqdNy~1%n7v$o z{SF6NZ&UbjKskQ>Ti0*loYR-LoQ*m>cY1+BB+t&=U5ww3XRlU%WBxzm`unEeABA~0 zMosxV>-?9*i;wkYbqPJ1)YX)^eYwkzZ|&AgJKgTaeX>4PYgKzdS7Pp)zmp#&VwNCNR%EzZlRwbXAcl*&4E~mD-@aiZd?%dT1_qP8Ot>akbbD@KKt-_Hj zhMdQ;OX^g!Ue9aNJyQK9*m#H7Hx~1Y*RS2|3_9H)p8o25V$zix0rSmwOul8Z%tpuh zC=>7MsF`&NPL-t^>WlIekJLmf=B+iKK6&co#eS^y%$s)`9r)S$;MJV!>}^}?rQoY+_%|DbJ zTFSHR+=_npuIm7+o+e7nJwiPiwp8ic{ z^BaaELJ#hJu=Q*8pU4_5e5CVurANGa>(@|@E0I+`7R*bZ`EF(nsTFHc&Fg;J9N2v2 zw>;N$*LQ9`XTK*JbrofazFc(f#5Cs|%Lb1p*LPa%n7-hLBX@68d$haqQ}PncyP9D|s_>&hgU^tCpBwc`o_3%b&TBC*F9AS!mSiwi$XWFEF>W zJNI_}|Bx;}ojvE!@7S*OmCxJ+XWi$P`|iE&v-3^flLdZKlH$*w%l=%hf3@)c2j}ed__kf{;a(>6@=h<$+9xx&Z4xSx`>{5L zOLN=l!+~q|J`q)C;%qbZIhR)mFJ6MD8wcf;c!?mz2l z0w*f0KO?}x+EHfWx%axnXSp?B4&Of7rN3nFt&Yw=5mnb@19YdyC2Th^&zXJrJEyq8 z-ld@rcRo1Ir<}Vy_g#m^@fi(niVLjYzxfu#Zz*@@WUEDX+Rf#bUlt!a`KI^nYMI3O zlg!yWHQaZZy6Qjk94~W zrU*aw?yZiFXqa=c@9&x&k9t*w8mC=TH)N4il;)XY!gkGB$!giDe}5M4I`wGgp&3)s9Yn*Bh_+V$iXmY!by>rQEpT7GL)BDs;eCBna?>vP}TbM z34K?wgNl!row1u~vC7p!K50s`^8>GCo!2!5F0YRe`j;ZpzKpTxFKffCZ}IHHw@SZ# zxv~3V@==~ubt&^dl|PSPS8t$qvD3!vi?%%9LAe!&I1`r4I4#v%Sn^pY^2NjAO>5q} zJ~vi=X%KznP)?fL4ws2KYtGs({Tvs!ljZ-r%cTJUUy7ucf6~sX-oJQ}(WS2opM8G6 zE>32_(s$e9Sww4HfB(8wytuiG_r$DE&irY{&p9f0rt%rPZ1n1wk-oq+i+&1axmCyG#6xChi%LopW8LhPFQ<_%-)_eFLIYO zIzC$JT*>w9Ud+DYvSP-21z~oLm)z`fOA}77mfrY(cJkg%!HneClL_II#TQJ}s>z)= zH{xad-Xl#nO~oAfE6*SGVZZh9`0<@zZ&~Xzr=D@&bNk&w4X2j7J9o##yl>rmba8H$ z#mCu(yVqD(rY$#_B57Fo{0_JB*6W_FJi20gp9y?kTI7^)^N7ofQvcT`M}J*9aqPU< z#qD~6lk6)QMQ<!wP+|Ew zcT@h9+RurXkA6QSVe&R`WmV4+6H7(ct23+qtPA331TC1l!~6!(zcYYGQ%37>x}Et#Jl zSd_Z|>!Zg;3a2kv6}w0*jGD=G=!@4ugMZ(Ye%{;VYW~87N!e=lhm~S48vielnNxSO zWc~aPXN~;VN33z-+FZWP^}Viv;@y*xHTknPNC=0g)f>$D?egr3?BQFpS1g~@e^n%1 zpspg;B>TXFM{6YKTv1fjQ@^%biKRPKL*O* z_Or{8oKt4`=-B4SlfTa{)1E5)TFjuvOy<=gVRx>N3*X26bd_JO>bL*Ls*}$X&MQo{ zzrB@X@{hY>lWq!yN{V=HKDW=f{9)CWU*$3j=gEm?cJ0q#>#CVQkzsWzc#oE3%zIr}NV%x1(Q&$<(N?v_!a0%Zf zW5EEmYPa^^Jn|}aJReME#OQtVSGsaFTf|H8plNQ3ebjf}%v&l4PHv5L4eX8BDC+&W zW0lSFdBs6f3}xAfS_goZICAT^qS6{O;x@o!KpS)SS&H0pi|380`+Gn4n zC02auafW{L-%ZSk+m<^lXyQ1KWmfLp)wu5W<-5`%%V+4ZPLH3q&f(c^QNdoJI3|(4 z+%I>mLglx-*Z$2gg)!rM`ZDH*vd0;*jOVW&k)Iv^xbeRZ!|pi`R?2<1Vc8>I7v#5O z=A?BAEq52H{M7Pk;5f>|Z+H6RscGdO8kG7~Ha4hgKuRYRrGR)MUolm(y5| zaMx=T?Y-RoSvAmDrDbtvaASjROIYzORT+z>WqWV8s~dy;ebK&UzG02zrtKBXPnKVm zPHUOUXz?YJYcfNsg-`C=gp&vUaFxxw^e$TZaYX~Ceyp(Y3t5))0)k6U3MsqZkXpYa z_rm3bDb8PRXC3!Y3r)Y3EOtMqtTbrF`6ETbGb^uOySD4}C1(G^CC3j3Ka}})XuHRw zT=Qu+IYRia&F8L?=Q#B%=d?S^1cqQODV2RG4E&F{gg$JkPhu*T`^0iJlK1|-rVWWo z67HHD3lA@B5Vtq{KD^6jjtN?Z&Yr#SzW9pU?Fyin!7@$Ow;Zj>%P)e-fX zY401+f=#wrGZo+ZPW|!G)aB>TwDx%xN3_^`4K`bBdt746BmMX8;y~x-$@%w`ZT;me zruBcHGTUEZ-LvXG+0&s0Eba4-x>zmNTf%tan~nLJP0Kd_^?EB(U3X3MLPWVosV7!~VOw=d;p*sOm)o`Lt{K1Sb1tapmF z)heG!?|WtZ>);Yc)sy|-DsPGYJ?QNzEw%H(0lwotnXhA%l$>&0i*ly4{7{>=^0w=S zbtm@SWAnFiZMvIyBag}0fV=B|$#1Q;+>@HR&0PW#+ryXc=!zEKyz=YM1sJsgZXkPV|C3%-%)~`zp*_V8+m7J3%zBnkK zFX$KT>rooH_Qc{(CpNMNUvu&g%KZ2B*PEvH(+u8w@7nX*R#=tW%rfz;&8|JO$@fE> z`%4y{*@~j$QyPZNqD`@%_Pi;&*w5>B zCTRbKhrI{w7BQD?d-l~}zWlzz8C)M4f7NyzT&op(b$NqZu)L?y|BJT%4#8nu?k2u7 zXKFj`*>AgN!M`j1)1S7;Eqd^{wR?5$yzrP@!JoPgiYzCy4nE5DkNe#7pfIdDQS7bX zCPk?*vz5V%Rd-p1Zf-ag8EWq8D85em$lQiKU+N45vbJu$=)IvPj6wbukHNn)9ljG( zSBjim&~lR@a>YO8?3!;9-ySmDnCjunytz{R{4s0mm&})Uo5`*B3^EXvKjk?6o+h`G zxks2%rJ>&T?R7H_cjXC5?7r(J@X5VX;Gq5YtRH9QcIQoLd0OwuV#(;Hed4}T)dOMK zhXU3eL?h|{mULV)octJ(QwutM|!i{Sq+E_J$lj4sp z)#C^}q%z04UaCP-a*^JYx3zCQBzPWAx~Xx+A#|1NhhL9pNZr27WXknZTG{uB`QqF& zIvszMk9>G`-6Gm$F*je)1j~a(Ybx_^UF8Z?_q2TXux|5X+tkxX?j8PW-f#Nv1^>zv zhyDqRPpSFd&i%7_9nTmw5%?E_bGpsH!|lv znk4nf|9_LfKi{=d?DOj1e}DhvmLlWY%L$C1FaNbYfBdtXgzbdwGy83B=_Z`5+HK04 z+0YUwFQ)swV&T_k9}>OK9G}TJ>9A0N6N|aH&9{V8@w1jRNp$$GoHKP=)uc15*}}@{ zy7u9w+aq!ve=l1s>cPgPpmkEGZHHm>_1Ks5+J$H3WhGW@yKz@la`SZmttko-k^K{! z8TV}U$$NEWNnx<@qVH9eq2_vZC7urzIC~d(+^v|!c&Ewj&L=UE_;nqBj~$Yd@62tCZ%^oYAS(N+$d2!5_Z~$DrG*j!OFl79Sl;!QIXC@y zc-r-gD+T`?s?^w~o>s2jBX}iZa$EHZ?x}ZYthr^fy3^70M4kM}_}#i^vR0q+^>eYDbMdv{}->;H9g&%KQ4pW}CZ!Gimpb5nV5zf9oSyX|ea z-S_89xl)<3TdOpV8H*)Y&db&K_0T@O+=AEd!Lqskqfc`7+&(p@e1-9f(t<#pTNeZ0 z?|FAiq_oe@WecaLTExY_zXdfsU#~5E?{Vhpb(h5}-bXy~;YwQ`{F3qhg@a}+r#MxE zez>ch+0>p?-Y-*nLqFp3A3;9j*f5K}^680@wGBJ>wrn|K_+b67?bZ&(H(&0*^3@}; zKKFy^-7|&X77Iz}%)IlE<41RY;+zR9)ph4OeVWXD^qk0pk3U~UPZ3?Yq9fz6Zr2+o z6aIf%N7M}@w&fgN!aTiTb9vQimHijA3qx0*Xjyaa;XUS)=l>jDaqj*{tpv^$mdjgC z%Kg3|y0 weT=uZp7=In@5PIn7fcO*`>#ofuixq(T4^NhpM31 Date: Tue, 14 Jul 2026 11:34:46 +0700 Subject: [PATCH 02/37] fix: fix README.md --- nix-monitor/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nix-monitor/README.md b/nix-monitor/README.md index c251f59..95f9bde 100644 --- a/nix-monitor/README.md +++ b/nix-monitor/README.md @@ -2,6 +2,4 @@ ![thumbnail](thumbnail.webp) -*Nix Monitor* checks Nixpkgs update by comparing local nix hash and remote nixpkgs's hash. It also can run update and clean command. - -No AI is used here but this is my first time writing Luau and plugin in general, so expect some bug. PRs are welcomed! +**Nix Monitor** checks Nixpkgs update by comparing local nix hash and remote Nixpkgs's hash. It also can run update and clean command. From d44c193a3d859650c8b04faaee59b24d21bf641c Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 11:49:18 +0700 Subject: [PATCH 03/37] add license and icon --- nix-monitor/plugin.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 4e34514..aded5ce 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -2,10 +2,12 @@ id = "avivbintangaringga/nix-monitor" name = "Nix Monitor" version = "1.0.0" min_noctalia = "5.0.0" +icon = "package" author = "avivbintangaringga" description = "Nixpkgs update monitor" tags = [ "nix", "utility" ] dependencies = [ "nixos-version", "git", "pkill" ] +license = "MIT" [[widget]] id = "Nix Monitor" From 079ffc0012f460aebcf83906c3bb205622c6c4ce Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 11:52:22 +0700 Subject: [PATCH 04/37] fix: change boolean to bool --- nix-monitor/plugin.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index aded5ce..65e31fb 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -15,25 +15,25 @@ entry = "nix_monitor.luau" [[widget.setting]] key = "show_text" -type = "boolean" +type = "bool" label_key = "setting.widget.show_text.label" default = true [[widget.setting]] key = "colorize_text" -type = "boolean" +type = "bool" label_key = "setting.widget.colorize_text.label" default = false [[widget.setting]] key = "show_glyph" -type = "boolean" +type = "bool" label_key = "setting.widget.show_glyph.label" default = true [[widget.setting]] key = "colorize_glyph" -type = "boolean" +type = "bool" label_key = "setting.widget.colorize_glyph.label" default = true @@ -95,14 +95,14 @@ min = 10 [[setting]] key = "show_checking_notification" -type = "boolean" +type = "bool" label_key = "setting.checking_notification.label" description_key = "setting.checking_notification.description" default = false [[setting]] key = "show_update_notification" -type = "boolean" +type = "bool" label_key = "setting.show_update_notification.label" description_key = "setting.show_update_notification.description" default = true @@ -147,7 +147,7 @@ default = "nh clean all" [[setting]] key = "close_on_enter" -type = "boolean" +type = "bool" label_key = "setting.close_on_enter.label" description_key = "setting.close_on_enter.description" default = true From e1ba3e21a809e9f91022ae066cd92b99d33d16fe Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 12:01:22 +0700 Subject: [PATCH 05/37] fix: change setting.widget to only setting --- nix-monitor/plugin.toml | 24 ++++++++++++------------ nix-monitor/translations/en.json | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 65e31fb..094b8ad 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -16,73 +16,73 @@ entry = "nix_monitor.luau" [[widget.setting]] key = "show_text" type = "bool" -label_key = "setting.widget.show_text.label" +label_key = "setting.show_text.label" default = true [[widget.setting]] key = "colorize_text" type = "bool" -label_key = "setting.widget.colorize_text.label" +label_key = "setting.colorize_text.label" default = false [[widget.setting]] key = "show_glyph" type = "bool" -label_key = "setting.widget.show_glyph.label" +label_key = "setting.show_glyph.label" default = true [[widget.setting]] key = "colorize_glyph" type = "bool" -label_key = "setting.widget.colorize_glyph.label" +label_key = "setting.colorize_glyph.label" default = true [[widget.setting]] key = "up_to_date_glyph" type = "glyph" -label_key = "setting.widget.up_to_date_glyph.label" +label_key = "setting.up_to_date_glyph.label" default = "rosette-discount-check" [[widget.setting]] key = "up_to_date_color" type = "color" -label_key = "setting.widget.up_to_date_color.label" +label_key = "setting.up_to_date_color.label" default = "#57ff57" [[widget.setting]] key = "checking_glyph" type = "glyph" -label_key = "setting.widget.checking_glyph.label" +label_key = "setting.checking_glyph.label" default = "loader-3" [[widget.setting]] key = "checking_color" type = "color" -label_key = "setting.widget.checking_color.label" +label_key = "setting.checking_color.label" default = "#ffeb57" [[widget.setting]] key = "update_available_glyph" type = "glyph" -label_key = "setting.widget.update_available_glyph.label" +label_key = "setting.update_available_glyph.label" default = "cloud-download" [[widget.setting]] key = "update_available_color" type = "color" -label_key = "setting.widget.update_available_color.label" +label_key = "setting.update_available_color.label" default = "#ff5757" [[widget.setting]] key = "unknown_glyph" type = "glyph" -label_key = "setting.widget.unknown_glyph.label" +label_key = "setting.unknown_glyph.label" default = "cloud-question" [[widget.setting]] key = "unknown_color" type = "color" -label_key = "setting.widget.unknown_color.label" +label_key = "setting.unknown_color.label" default = "on_surface" [[setting]] diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 4f91e91..c1ff7b9 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -17,18 +17,18 @@ "panel.remote": "Remote", "panel.last_checked": "Last checked", "terminal.press_enter_to_exit": "Press enter to exit...", - "setting.widget.show_text.label": "Show text", - "setting.widget.colorize_text.label": "Colorize text", - "setting.widget.show_glyph.label": "Show glyph", - "setting.widget.colorize_glyph.label": "Colorize glyph", - "setting.widget.up_to_date_glyph.label": "Up to date glyph", - "setting.widget.up_to_date_color.label": "Up to date color", - "setting.widget.checking_glyph.label": "Checking glyph", - "setting.widget.checking_color.label": "Checking color", - "setting.widget.update_available_glyph.label": "Update available glyph", - "setting.widget.update_available_color.label": "Update available color", - "setting.widget.unknown_glyph.label": "Unknown status glyph", - "setting.widget.unknown_color.label": "Unknown status color", + "setting.show_text.label": "Show text", + "setting.colorize_text.label": "Colorize text", + "setting.show_glyph.label": "Show glyph", + "setting.colorize_glyph.label": "Colorize glyph", + "setting.up_to_date_glyph.label": "Up to date glyph", + "setting.up_to_date_color.label": "Up to date color", + "setting.checking_glyph.label": "Checking glyph", + "setting.checking_color.label": "Checking color", + "setting.update_available_glyph.label": "Update available glyph", + "setting.update_available_color.label": "Update available color", + "setting.unknown_glyph.label": "Unknown status glyph", + "setting.unknown_color.label": "Unknown status color", "setting.check_interval.label": "Update check interval", "setting.check_interval.description": "How often to check for updates (in minutes)", "setting.checking_notification.label": "Show checking update notification", From 446575005a230630112a068d530c46a18a9ed70f Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 12:03:00 +0700 Subject: [PATCH 06/37] Revert "fix: change setting.widget to only setting" This reverts commit e1ba3e21a809e9f91022ae066cd92b99d33d16fe. --- nix-monitor/plugin.toml | 24 ++++++++++++------------ nix-monitor/translations/en.json | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 094b8ad..65e31fb 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -16,73 +16,73 @@ entry = "nix_monitor.luau" [[widget.setting]] key = "show_text" type = "bool" -label_key = "setting.show_text.label" +label_key = "setting.widget.show_text.label" default = true [[widget.setting]] key = "colorize_text" type = "bool" -label_key = "setting.colorize_text.label" +label_key = "setting.widget.colorize_text.label" default = false [[widget.setting]] key = "show_glyph" type = "bool" -label_key = "setting.show_glyph.label" +label_key = "setting.widget.show_glyph.label" default = true [[widget.setting]] key = "colorize_glyph" type = "bool" -label_key = "setting.colorize_glyph.label" +label_key = "setting.widget.colorize_glyph.label" default = true [[widget.setting]] key = "up_to_date_glyph" type = "glyph" -label_key = "setting.up_to_date_glyph.label" +label_key = "setting.widget.up_to_date_glyph.label" default = "rosette-discount-check" [[widget.setting]] key = "up_to_date_color" type = "color" -label_key = "setting.up_to_date_color.label" +label_key = "setting.widget.up_to_date_color.label" default = "#57ff57" [[widget.setting]] key = "checking_glyph" type = "glyph" -label_key = "setting.checking_glyph.label" +label_key = "setting.widget.checking_glyph.label" default = "loader-3" [[widget.setting]] key = "checking_color" type = "color" -label_key = "setting.checking_color.label" +label_key = "setting.widget.checking_color.label" default = "#ffeb57" [[widget.setting]] key = "update_available_glyph" type = "glyph" -label_key = "setting.update_available_glyph.label" +label_key = "setting.widget.update_available_glyph.label" default = "cloud-download" [[widget.setting]] key = "update_available_color" type = "color" -label_key = "setting.update_available_color.label" +label_key = "setting.widget.update_available_color.label" default = "#ff5757" [[widget.setting]] key = "unknown_glyph" type = "glyph" -label_key = "setting.unknown_glyph.label" +label_key = "setting.widget.unknown_glyph.label" default = "cloud-question" [[widget.setting]] key = "unknown_color" type = "color" -label_key = "setting.unknown_color.label" +label_key = "setting.widget.unknown_color.label" default = "on_surface" [[setting]] diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index c1ff7b9..4f91e91 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -17,18 +17,18 @@ "panel.remote": "Remote", "panel.last_checked": "Last checked", "terminal.press_enter_to_exit": "Press enter to exit...", - "setting.show_text.label": "Show text", - "setting.colorize_text.label": "Colorize text", - "setting.show_glyph.label": "Show glyph", - "setting.colorize_glyph.label": "Colorize glyph", - "setting.up_to_date_glyph.label": "Up to date glyph", - "setting.up_to_date_color.label": "Up to date color", - "setting.checking_glyph.label": "Checking glyph", - "setting.checking_color.label": "Checking color", - "setting.update_available_glyph.label": "Update available glyph", - "setting.update_available_color.label": "Update available color", - "setting.unknown_glyph.label": "Unknown status glyph", - "setting.unknown_color.label": "Unknown status color", + "setting.widget.show_text.label": "Show text", + "setting.widget.colorize_text.label": "Colorize text", + "setting.widget.show_glyph.label": "Show glyph", + "setting.widget.colorize_glyph.label": "Colorize glyph", + "setting.widget.up_to_date_glyph.label": "Up to date glyph", + "setting.widget.up_to_date_color.label": "Up to date color", + "setting.widget.checking_glyph.label": "Checking glyph", + "setting.widget.checking_color.label": "Checking color", + "setting.widget.update_available_glyph.label": "Update available glyph", + "setting.widget.update_available_color.label": "Update available color", + "setting.widget.unknown_glyph.label": "Unknown status glyph", + "setting.widget.unknown_color.label": "Unknown status color", "setting.check_interval.label": "Update check interval", "setting.check_interval.description": "How often to check for updates (in minutes)", "setting.checking_notification.label": "Show checking update notification", From 1d03a7af4b5cacb3d644fdd1f0f53628d4c9c893 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 12:17:20 +0700 Subject: [PATCH 07/37] fix: change branch options to use label_key instead --- nix-monitor/plugin.toml | 30 +++++++++++++++--------------- nix-monitor/translations/en.json | 17 ++++++++++++++++- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 65e31fb..4e9e255 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -113,21 +113,21 @@ type = "select" label_key = "setting.branch.label" description_key = "setting.branch.description" options = [ - { value = "master", label = "Master" }, - { value = "nixos-unstable", label = "NixOS Unstable" }, - { value = "nixos-unstable-small", label = "NixOS Unstable Small" }, - { value = "nixos-25.11", label = "NixOS 25.11" }, - { value = "nixos-25.05", label = "NixOS 25.05" }, - { value = "nixos-24.11", label = "NixOS 24.11" }, - { value = "nixos-24.05", label = "NixOS 24.05" }, - { value = "nixos-23.11", label = "NixOS 23.11" }, - { value = "nixos-23.05", label = "NixOS 23.05" }, - { value = "nixos-25.11-small", label = "NixOS 25.11 Small" }, - { value = "nixos-25.05-small", label = "NixOS 25.05 Small" }, - { value = "nixos-24.11-small", label = "NixOS 24.11 Small" }, - { value = "nixos-24.05-small", label = "NixOS 24.05 Small" }, - { value = "nixos-23.11-small", label = "NixOS 23.11 Small" }, - { value = "nixos-23.05-small", label = "NixOS 23.05 Small" }, + { value = "master", label_key = "setting.option.branch.master" }, + { value = "nixos-unstable", label_key = "setting.option.branch.nixos_unstable" }, + { value = "nixos-unstable-small", label_key = "setting.option.branch.nixos_unstable_small" }, + { value = "nixos-25.11", label_key = "setting.option.branch.nixos_25_11" }, + { value = "nixos-25.05", label_key = "setting.option.branch.nixos_25_05" }, + { value = "nixos-24.11", label_key = "setting.option.branch.nixos_24_11" }, + { value = "nixos-24.05", label_key = "setting.option.branch.nixos_24_05" }, + { value = "nixos-23.11", label_key = "setting.option.branch.nixos_23_11" }, + { value = "nixos-23.05", label_key = "setting.option.branch.nixos_23_05" }, + { value = "nixos-25.11-small", label_key = "setting.option.branch.nixos_25_11_small" }, + { value = "nixos-25.05-small", label_key = "setting.option.branch.nixos_25_05_small" }, + { value = "nixos-24.11-small", label_key = "setting.option.branch.nixos_24_11_small" }, + { value = "nixos-24.05-small", label_key = "setting.option.branch.nixos_24_05_small" }, + { value = "nixos-23.11-small", label_key = "setting.option.branch.nixos_23_11_small" }, + { value = "nixos-23.05-small", label_key = "setting.option.branch.nixos_23_05_small" }, ] default = "nixos-unstable" diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 4f91e91..0c7ef0d 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -42,5 +42,20 @@ "setting.clean_command.label": "Clean command", "setting.clean_command.description": "Command to run when clicking Clean button", "setting.close_on_enter.label": "Close on press Enter", - "setting.close_on_enter.description": "Add 'Press enter to exit' on the terminal window" + "setting.close_on_enter.description": "Add 'Press enter to exit' on the terminal window", + "setting.option.branch.master": "Master", + "setting.option.branch.nixos_unstable": "NixOS Unstable", + "setting.option.branch.nixos_unstable_small": "NixOS Unstable Small", + "setting.option.branch.nixos_25_11": "NixOS 25.11", + "setting.option.branch.nixos_25_05": "NixOS 25.05", + "setting.option.branch.nixos_24_11": "NixOS 24.11", + "setting.option.branch.nixos_24_05": "NixOS 24.05", + "setting.option.branch.nixos_23_11": "NixOS 23.11", + "setting.option.branch.nixos_23_05": "NixOS 23.05", + "setting.option.branch.nixos_25_11_small": "NixOS 25.11 Small", + "setting.option.branch.nixos_25_05_small": "NixOS 25.05 Small", + "setting.option.branch.nixos_24_11_small": "NixOS 24.11 Small", + "setting.option.branch.nixos_24_05_small": "NixOS 24.05 Small", + "setting.option.branch.nixos_23_11_small": "NixOS 23.11 Small", + "setting.option.branch.nixos_23_05_small": "NixOS 23.05 Small" } From f350c4977d7f20e14a906f7b92aca20963cfa34c Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 14:10:29 +0700 Subject: [PATCH 08/37] feat(nix-monitor): add some more commands --- nix-monitor/nix_monitor_service.luau | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index a12fc66..0cc2f40 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -22,9 +22,16 @@ end local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") +local completedCommands = 0 + local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" -local completedCommands = 0 +local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l" +local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" +local hmGenerationsCmd = "home-manager generations | wc -l" +local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{print $5}'" +local nixStoreSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` +local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '{print $2, $3}'" setState("lastCheckTime", 0) setState("lastCheckTimeStr", "n/a") From a3e663990fc982f462dd8343b2323efaf4ed1cc0 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 15:26:15 +0700 Subject: [PATCH 09/37] feat(nix-monitor): add system stats --- nix-monitor/nix_monitor_service.luau | 45 ++++++++++++++++++- nix-monitor/panel.luau | 64 +++++++++++++++++++++++++++- nix-monitor/plugin.toml | 10 ++++- nix-monitor/translations/en.json | 5 +++ 4 files changed, 121 insertions(+), 3 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 0cc2f40..62a6464 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -22,6 +22,7 @@ end local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") +local systemStatsCheckInterval = cfg("system_stats_check_interval") local completedCommands = 0 local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" @@ -30,7 +31,7 @@ local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{print $5}'" -local nixStoreSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` +local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '{print $2, $3}'" setState("lastCheckTime", 0) @@ -39,11 +40,23 @@ setState("localHash", "n/a") setState("remoteHash", "n/a") setState("isRunning", false) setState("isUpdateAvailable", false) +setState("lastSystemStatsCheckTime", 0) +setState("hasHomeManager", noctalia.commandExists("home-manager")) +setState("nixosGenerations", "•••") +setState("nixosCurrentGen", "•••") +setState("hmGenerations", "•••") +setState("hmCurrentGen", "•••") +setState("storeSize", "•••") +setState("closureSize", "•••") function update() if (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then checkUpdate() end + + if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then + checkSystemStats() + end end function checkUpdate() @@ -116,3 +129,33 @@ watchState("command", function(command) completedCommands = 0 end end) + +function checkSystemStats() + setState("lastSystemStatsCheckTime", os.time()) + + noctalia.runAsync(nixosGenerationsCmd, function(result) + setState("nixosGenerations", result.stdout) + end) + + noctalia.runAsync(nixosCurrentGenCmd, function(result) + setState("nixosCurrentGen", result.stdout) + end) + + if getState("hasHomeManager") then + noctalia.runAsync(hmGenerationsCmd, function(result) + setState("hmGenerations", result.stdout) + end) + + noctalia.runAsync(hmCurrentGenCmd, function(result) + setState("hmCurrentGen", result.stdout) + end) + end + + noctalia.runStream(storeSizeCmd, function(line) + setState("storeSize", line) + end) + + noctalia.runStream(closureSizeCmd, function(line) + setState("closureSize", line) + end) +end diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau index 2704d31..521382e 100644 --- a/nix-monitor/panel.luau +++ b/nix-monitor/panel.luau @@ -48,6 +48,27 @@ local function labelBox(subtext, text, glyph) }) end +function statLabel(text, glyph: string?) + local items = {} + if glyph ~= nil then + table.insert(items, ui.glyph({ + name = glyph, + size = 20 + })) + end + + table.insert(items, ui.label({ + text = text, + fontSize = 12, + fontWeight = "semibold" + })) + + return ui.row({ + gap = 8, + align = "center" + }, items) +end + local function render() local firstBtn = btnCheck @@ -80,10 +101,24 @@ local function render() end local lastCheckTimeStr = getState("lastCheckTimeStr") + local generationItems = { + statLabel(`SYS: {getState("nixosGenerations")}`, "device-desktop"), + statLabel(`{tr("panel.current")}: {getState("nixosCurrentGen")}`, "device-desktop-check") + } + + if getState("hasHomeManager") then + table.insert(generationItems, + statLabel(`HM: {getState("hmGenerations")}`, "home") + ) + + table.insert(generationItems, + statLabel(`{tr("panel.current")}: {getState("hmCurrentGen")}`, "home-check") + ) + end panel.render( ui.column({ - gap = 8 + gap = 8, }, { ui.row({ justify = "space_between", @@ -117,6 +152,33 @@ local function render() orientation = "horizontal", spacing = 4 }), + ui.row({ + fill = "surface/0.7", + align = "center", + justify = "space_between", + flexGrow = 1, + paddingV = 4, + paddingH = 8, + radius = 8, + }, generationItems), + ui.row({ + fill = "surface/0.7", + align = "center", + justify = "center", + flexGrow = 1, + paddingV = 4, + paddingH = 8, + radius = 8, + }, { + statLabel(`{tr("panel.store_size")}: {getState("storeSize")}`, "database"), + ui.spacer({width = 16}), + statLabel(`{tr("panel.closure_size")}: {getState("closureSize")}`, "server"), + }), + ui.separator({ + thickness = 2, + orientation = "horizontal", + spacing = 4 + }), ui.label({ text = `{tr("panel.last_checked")}: {lastCheckTimeStr}` }), diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 4e9e255..f3dc82c 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -93,6 +93,14 @@ description_key = "setting.check_interval.description" default = 60 min = 10 +[[setting]] +key = "system_stats_check_interval" +type = "int" +label_key = "setting.system_stats_check_interval.label" +description_key = "setting.system_stats_check_interval.description" +default = 10 +min = 5 + [[setting]] key = "show_checking_notification" type = "bool" @@ -159,7 +167,7 @@ placement = "attached" position = "auto" open_near_click = true width = 420 -height = 290 +height = 370 [[service]] id = "service" diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 0c7ef0d..10a6668 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -16,6 +16,9 @@ "panel.local": "Local", "panel.remote": "Remote", "panel.last_checked": "Last checked", + "panel.current": "Current", + "panel.store_size": "Store size", + "panel.closure_size": "Closure size", "terminal.press_enter_to_exit": "Press enter to exit...", "setting.widget.show_text.label": "Show text", "setting.widget.colorize_text.label": "Colorize text", @@ -31,6 +34,8 @@ "setting.widget.unknown_color.label": "Unknown status color", "setting.check_interval.label": "Update check interval", "setting.check_interval.description": "How often to check for updates (in minutes)", + "setting.system_stats_check_interval.label": "System stats check interval", + "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", "setting.checking_notification.label": "Show checking update notification", "setting.checking_notification.description": "Wether to show a notification whenever checking is in progress", "setting.show_update_notification.label": "Show update notification", From 31bcce36858dbee5f40d074d48d4156922002c68 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 15:35:27 +0700 Subject: [PATCH 10/37] fix(nix-monitor): change date format --- nix-monitor/nix_monitor_service.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 62a6464..618f552 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -65,7 +65,7 @@ function checkUpdate() end setState("lastCheckTime", os.time()) - noctalia.runAsync("date", function(date) setState("lastCheckTimeStr", date.stdout) end) + noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastCheckTimeStr", date.stdout) end) if cfg("show_checking_notification") then noctalia.notify(tr("notification.checking_update")) From 6a892bebca2f9069ee7cfed004d6c2309d5fe719 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 15:48:31 +0700 Subject: [PATCH 11/37] fix(nix-monitor): change thumbnail --- nix-monitor/thumbnail.webp | Bin 51640 -> 53904 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/nix-monitor/thumbnail.webp b/nix-monitor/thumbnail.webp index a3137bd0aa0003e4807a073df328302213d2dc28..12b26c2f974e43a6c9dae3cd31125c332936914b 100644 GIT binary patch literal 53904 zcmWIYbaU&t#J~{l>J$(bV4+ZRiGjf&lzA?r)&XW2COb~1Mu$ch1_ps?(^mdCdiq=T zrP*g6JwBNes*;?0+r) zb^ce~!}!(l@9lT~yI%d{x9NZ8|IweEAEbYdf4Bdu{o%T|HMjmB{D1f#|GoV0`@hWp zTz}>NoS)49=Kh`i&wZQ!zx=fO@9%%C|Ngu6zvI83|M_oK|J(l0{`>vC@d5QW?Qi{m z{y*?P|Nrf$(tphV5kFIY|NjK}Uw<8J8EmEhoc~|{L;mpn+wsfg4S)0gIR1D0-|))w z)AvUFXZ*MO&-(lCXUfIa<-hm-wEE8fXYx6AoBwhDnf@*RUHsSjbG3p0jX!#S*Zz}# z^8f7GcXe)mSnAaOr2mTl&VQ{Qq~b*FvU2;2Nl*Si`0xHk|JDC9|JVP|{BQbC`*;1n z`Y-lL`Gv;X(LbAOk7KJDfpRwQezv#d2Kl|VM|K-2gPmsS^zxluJzxIFPKl%UtSN!kzpY`ALKl#7pzyE)1 z|EvD+U(SEVe-8iN{_Xsy`7icwumAPG{Cn~n`)}3%*>`S#?f+Z<+{E0uC%v`T7X~Gr z5@r0!uU>yFzIshd4Kt6O=Dm5FSL`-yyL?^cc<=(@2Vej1__I%;SW;#4TK?x;lcwaV zx*OQ|_@A7%s9SZ5teafW^IP)Sa}=N6jC0uZKx5PH(r-V#_kO)Ap8t{I=I0~KK2~ov zyRN&nuYWjY*33n7qupFyofV8(zis02pFMZVrS^Z^kRH>bx;E_Q;n@=|oc~=mZHo@i z#dmA^68U|Ve0V|{tdB|tH+LSK`nt3?anFN)47X1F3h`B){oq{wwO=`(@Ao@8>dgy1 z!eIH3UG(`P2`N6IpIg3_eoAz^utLqG?o-++g`>(}7}q|rj&OE5dtUgH+wPgW`zD@S zTjBrex9`{eX)LNS>zsE8OqIHCU>@6PHYH?Nrr}QIP?!HZv%iGZ8~NVf_T}j*)t{D| zPdG2xynL@k;~u|DTH)EJtmbO@Y;cME!DMQ9pZUPKw8@&x1}*}uhP}J&RxSPip-1ze zSEUn6$~VJ(nL72nU1kS#JE!e%U6bq1+x|~JOO5$h2iLRnT1!-ZGk$DK==>~mRrlxp zhf$2GCFl4VZ4_Rm^W6Wv?RV^L6QP0^g1aUZMDjYwJ9W0F+A*H*3bs?884*y$z*~1g z)WYDg#bNg5}))bIFq%YWKVaSwhgeYty)@#S|@%J%YH*!Sw@m#gbPGtHNF z)znCQUVl&Z;Lr7p=5tgO-xod;Qct+>;PvFvm-8jIE}b#;=ZUvlo5X@x-&ngSTssyS)BiYCs_Zy_!8ZM7qOg+L^@$qhc~j=7&d-s` z`DB?|pniwt=}Y^+UN1MfYt4_<$ZPYcTikSR*^q{Zl9S@PCQ-mA!S_g?IT64VmfJ^Zd4DRI+4zk|?;-=GDp8>(8F} z_3k6D(7=`X)lm*E2WDw!n1|?2JteZ|$K<_J!o?~%!tQgNm|a{o@z|Rmsq6eVPk-_x zqB*m9A77I2u8B9YlLV5gGhN8<^zb;RYn%es2{k?{}e>mRnJ8NX3&DPj8 z^+?y+?ShXIGD>&-Jox9`&z^&IOIUfH$1HT+f5#-)-@o{xmJR2um)7N>E9I*8bjRI! z#(Me0D+#BWyzk_%=xE0Bs?AunMnHb~xmlVSuXywvd)tKBE3Zu}DPKNuk;%b`UgvirWdw90*< z*xs{;oDVSymX|MaT4b2kRoBBg<@N%@Y~}S&(wegG?a?Urj8a{&TIt>KTR(;V?@C#) zT2b(`oYS|%UksmHD7M%6mxWeq-zpT_bRb^nn%9Zh&;LGJ@a>n-$2aRm`-7Iw$W7^R z+vxDNYl?sF1gV~jO}^JRoj!X0<;Lii2D1aJ)_eXxI^*$`lUHu{iJH%~6gm6iPD!Ba z;sa}?vpu&T3)x>&$@8Q1R{8Go_UQb$c7~+$(aW;D!EUGixJAy2 z?`>*4e4@VbfurG)*?CiH3%+L-M=!{`&!*-XS#x)%;l=19KbF*G@%v3%d~3(f9t}yU z9L+j;@fU0k0s6TN+;<-(Y%G1Q(wlD{E%lyn#oTu)ZL9yU-F>_8MCi&OQ=W{f2$NrO ziMOXrYd<6-dYje%sD9yt<{}9O%j(_njS~+iuD>}c{Op$_yEx4cD$5-XNz6TZ@Yln6 zJpZjXFYTx=j_|ov8M=rgVx{*yo~KFoYc<_NrY~^%ps> zX0{$@&uE)4H*`}*Q$-EPHh>;7A8SN3yuL_Tczc%}Bt!Q;zfY?{^`iA@l>TWf8- zD{}SGsUO=+pO(pR;@xlG`_ZY0{QwKK_ykU9}m%>zw@>It&-Z z7RkKuIM+TcjkEQIeG+(+7{++Ye{!7h`W!D|G)6ym%A`uko zLCyb?_MZ>2P^y2`bN!X(fzAAJASkgO*+nLW4roB1LeZzT6m#0_oJ7sHw!}qeAWsgh_6G=H2a(>3U`IG)hSWh!s z!+zZDwf(t^kJ`>pD3&ZNwr#n5HbdD$eX;i+rxd<~<=!Vwq?hLXbIaT}ODX0`h>m~g z&4UiokEY3#l!p30T(9)<6>spTd384rujA)5>DI6QJin^>Hy^il&&lnv5@m%;y^d$8 z^D|x)Um8ET`ebg1;U%`7IWy*$Y`Ny^)si6Izftlw?`=Q#DbM$ITGUoH8LxOT`Scv$ zU2|-L{?GiY8eOsd)S{>I3xjnSSv&rnt&r_&E3GV4?3@1Kz~Z_MD=Sj!r(B8-Ec~|F zSGm`Gcl)_ZNy}GFv=7Q!Qm|3%m-ES2C+b!$RP5Rv>KanFkEK1~k#Z5^L+;yaHMlA& zd=qDScYVE~&cE%xm&{hRL%KYH4-?`dHi|EL{YBSxYrkaLyBtT=sqtA zpWmHjzV3M1`P1_g&s%#_H~UBBNwg_`-1S>AZ5z|(8&3ayzo@-yJ%9Jxw4JUW9)2>e zc8YiNSUdC4ADM---@OUYP4oyfStcHwQo4%$_xn`~__sS5r-!|tQhvixr7p-kI_2_* z1i|&Oe!+|zH~T+%bd%Y7v(l>bk7NI8ba{2&y!ZMe@9GbXD_wDt+)Kf7KO$i{Z@w5`O)0|S;;}zV zbW^NynZ}!Wori7Y#S$9+{Oet3Ju%inJEz9eJ?ea&u=u-@$Is5{bqY<~FkxF+?&(eJ z>g~+YtGFg)thm(usW5bU=l&Yshx67g`4x52Xzs&|kCXoXiM!Bid*^#m;k{3cH9x-x z%dfHf>6w(Wq#>%vZMc8~_-Htoo7tI!o_z`&c{Z^LQ6JD-%Wq14*X5?EF&(n49 z>T~Xrh{B5t_srAuS2L5Z-}qGKcdJgTrN<(P^VzASAS0X#bDI>jR=cL&$5C(jhM zJ{xrvhEH36Zqe)WSt}-ex~Ba+D9fBvU3vKd#=`Y->tcN^9FFH@1&8-&CMSoT6Iv6s z@0i7w9_~gkqr)TpSuKoYFfXT~N^mgX= zG;f!R5ZNDB?r1nB+}pK!<377*EBZ=Iq(6yY&b`B3>|kL3GcW#>_SVU6$vm?@RJ96! zxb@u2`lbPUSL$KuUmmln7rLCdCdBb=#k%WDbjJoS{k}c+-nXYmoEHC*xOPXN)%A@lWrYkbUCX|e zxo)4fME_LbfcW357V-(rUp(tsV8d+LW>10EB%E3+=*)bd!TdYl_l~smQJo_Y^X3f zrnGCdv(C9KRV$vSnaj=%XKm!hd3<8LROd(+#x^@BUpwR^9-`HSkCf6X`8c%#`N!9Z6N8MdFY1tZe4+hH2>T(sxzF}~e^J@-e3`Gq-Zkutd=6Qq z>q_!7?Pd3F{atM~d-+onleoBmSC?~~Zfe~QOgz6tQi}bay_595IsKXQUH?v=x32va z?+@9!B`NOpVZR&N_PVSt;oa%!6P1uEI9cI=Gso7DU@Oq(Una6DL zcAtZOA#P>18BZ;Edq8*!8$ufxPapkH_e{ge4OYsWr({mJ_+~7HQ`OM4XKXSz`tZG|% zGU89JgYtLZkWF*0>nv7_zp?nWZbXhlk3UoHEGMMse;c=s;NoM@VTAkSM%)QR{A>+H}i)(_@VwB7xve@OX=i5oF`nXW*U9U95 zyzLzGq{@8YXizD-yADO$q9X<4piK~rsGTSD#d$QRkf{wE^{AB)bTe+d* z-N%=?F5+q@;y><|@s(P)$YOQi;rtR&RndxzN!e=zrERa@IpA6lvvy~!*p^AAiLpUq z_OJNe4xVk@60!LWcgU@9hf8mM2OpkYdMhGq&3!E$g%{_42Kh9x@JE^cZ7!(n6gDmPj&t{8?~f z(lfuq8>hZs)F5N8B{YF`jWCD%hkwOWqu(qR_1&r#iUz58{+j0+C>Prjta_kQdzn3?UF zaG)`I!s$k34dqyyIMD^?YEn`=3ZMNJelN}Z;EUUu&L<4)zODx(wQm&L^H1syy75Po zXQGgMA7{W!t@jl|y`M4)E1)F>&lmK3Jfbrcvm;e2QZ11u;R@ zOY8sCYc3BqV%~CVhIqZ^$5YeyQ00ua#?n>Oj;kD&JpXp5o3a zne+P1MH8iIeF~ZZ`~N6S-`SKezv#vM%`1xHOwJ0Vyl1GGJ;`prkdv3}+_odvPrvbF zk@8?of1y+P?*GrX{hm+fzh9ClcuPJ-Y}HTBcc=J2+)Cco;Cgvo!m@1{PxU57Gs#bg zm}PwLfUeeSj%jl~EwQTpX=1qBGiu|{^=*p`l}vI=wJx2=i|u^4Pve;zQ>3R_yNq$Q z;FlM@N{T0Zt_Nm4bWWSdlX3CKsp9Mm^&+GiWRl(A;-xBgv^B}M(3Iy{Xm zt9Gr7cvn7$;dj6Le(C3_(H=u+}@NW&VAQ=Mtv7_I_QquJx;8 zY3jv??^fnctZ?3Tk^hq%Pb$~%rO$6y|M8q1a*q4KrNh(rod~wz`0_F(tj060t8aOo z;fJ8(QCD-P@0!;+^Wz-e=RXZUMqHD+V0dG`zsXPcrMoZRt*<=3zJ&MN^yt2>^ZUEM zbzOJc)?k0R;oPiuDd)fCr3qh`kKc84jYUP}iHJS21&h@p)V*8tr&z7KX)v|=M9JsP zsWR_W@1}3=oqMls@54Kq>kcw8Ru@THl*(RK3u)`M>sh2E9>cyOFYkM|@OM*A#q-%B zLGIEr?VYP+wtVYu@Yp8P@NU|xy{}VF-w_UYJ7-U!|At*FMOoKO`1SqCFL9;~TC*!! z&(}Qqak$lvWp3E6t4BqqzU@5o>>B6ZE#IZLx?AqPpu}ml?0nbrzQt{BTzv=roY-FD z{ostnW$BwL3)-v`ck1uwU79v$8^4-t*y5#rT&k&NYHwmLpP3PS{f$`z(~K8NF|Whj z{_Xx+S$=a-=q{hS-8%QfSWc{;Td|k<`!nw;50&3|&k%{ryXlqAdnMy~{+ftqEBtlK zysodzeI`)o$Me^=`X$%wo@2i?a;M~G$8+SgTL^LQ)+_I{Y+ut?##=S1p(he#>zF3BaR+!mc(#~noNOFwT6v*6Uf3>&qg`4F~I|{@wi5*OI5^=%=SDz5jmB7kb)g%f9K< z??kVP1u5~`F*|*FOSj($O7P_4zPV0g!pY;yoRVGh6W{CzUuVwgU6z`=g}H^PV#70$ zFI$th-s4whXjpigUvJJj7xA1oXOA~r>Hi+Xa+}9yX5`OB3P1BsehK9Mw~J?ngL!Dn zTJ_y=J4>F=RptqtUm_ymz3T1k1G7r!7kPcS&N;{FbZ16}VdXg$PWx3)Gcz%A@A>{;1AC`kILb`mw%%Qlv7sy`SfjW zX3M?j`zyj8N;F&j{}sI2b;_ho?W-d%=kMe^Y?37TEamOQ)$=Ns<=)}uJGB0S&3FIr zmS064tZ>*{xV?GVl3JISnrZ8p-ik(DkUXeceq2RE!(&^ri`%mqFE2khzSgLiX`-$} zjOP;L%~1jk%r2G3nHP8LTi82CLO@R?OG;4ku}XPhPy$J4!jimmd4bw`vHYAGy#rY1dH&lGK#^5o}w(l%_??UJ}Liv&i^a-FR`zss-}G2T!DKG&m>k}yelwW z-8N5~HBUj%cJj8K4T_t8TuP2#^pi`+iJ8rFmPX>lP);88lXqI&pZsK>v--LG)pemq z4}Oll_m(Fj>G;w6Rx_G-Z=~)k^!m@CE)}!=$X8jG!$u~;sS|5TQ;x|^XwrLqRkOwD z^}Ct9=gx3NTzHz)pi#$S@R_aeR`#j2^49Yv`E55+bpNe%-*Ihf(=GKlbwVi4YI25as^4Kf~?@yD;@g95pzw z`;%ZGm!V|F>)R^ojm33h&663nhgDqsxkd8F*MF=j`#PRCx}N+VsJh(6(fQS)#EY-_ zXB9GZ6}DvWRIYp}bUa}5kB9!o%GN?BcW};0TGIN+B&k5ci(hlgbwX>IYM4>NvRcV+208QAoKD|e_j28TCI)kjPSLj2;fZla3R~~)_ty<#e?(igY-T%9|+xc0XC$!V3B%f+qs z-{fJKvhq2{)(|$kb#H9ve%5;KraL*iY^AVIRDfLL^RR8_lcLg@;ByOv`M;c^;@0o{_<^ZGp>|flnVR5{KBVp zuKg^AImK$JA#Ps}7Z)a7O1XS{hKEUkevN8lM$Lid?kQW!q;zu5mu#CG`^B$%Ytp~^ zZo!>Xp9_7cC|=JX=<#$#Lut%=mOl*ZYtx)GvL{rW+#nxuhRr=j;;X&Di*u%Lwp=`L z;-H25`{lLO{yV(3HZA&g)uj>>9IOuaskUf&SavskdHm%;dLq|1%>%Q!Z<*em(O*#0IzeA~h|>(?AH?ypjsEw23Z8c$HHJ>#A8|DCOl zICF)175u-lucbti*MTWV`Z7bI#@C}$eH7TXM_#YwnRcw^n!0M_-MWc>-mx<`JI!%X zI-8~D7M47H%aO$u+bm;lEWY`-{_3;(yw>8t&%3_Azi&@FZFIHSYP#ti&&K!0JC81v3<*EF`iW!}|K_5Q(t>hn zj|S`i$DT7z)0nvQugLjd3CiVfSifAHDe-H5<9zqMj5i)0(7XPl>*8^rHJ=1uf8t}B zwYJ6SZHKvRlv&Y*GZ)<49-K?sdCzX`$zP)0evXeO+P}E>{X>qpkM^F|e=i?*eVoa5 z*Fv%}dDrEK6^}LKzqx-tTDoG_E+^+LtFqa9%Gw=fetq!PE%qpLh!Y?4!)x(5#m2{E zlb&0!^sFv89TZo|@3^8fPNh85z=rf;lU>1eNAn)~FzV|Dh$2VR$*6qfz_yW+O+ z8P1zs=YRY$JI&Dj@(t(GcK>g^Du16``E0y(^O|UPuB&UGovJjvBh?^ae>|LxZOP%K z&pa7*OM~S4U6&b!t(9B#Tllq&Kcz5=Xwzb90>m0AI5WJLN z%{Hz0VsT1Lb?;x>SK;C(_a{%`pS-2vyVl)Rn#M6V(`phFrb|q|u;j$^BWrS&#>#Hu z+qi-GRmluCi9Z{@utr=pdYu?9>0Oz+Zi~j{&TPSXx1Tj@p1nG4Pghjbi-n&z&slWi zZR-Awy@!rjZ}qzJbC%`7$;xdlKOva@eA_bdU2&NM}52Ai$9CQroVUk#l~=Z zTAJAW>wU-maF%ZAvrbvIMR`;F+14Zx*Ugm&x7@XAzvFQ2h41&r8*Z(c{gLhTyTr%V zb!~IJlCC{G%e1v5bJqMho0cC9I9syZChnzo*zwQFT*r%+p3fGK*n6q$*RA?P$F7#A zdRuv9zlpVY+x|{eIbhSGvwc21pB719ce=3r_?G<>>s`&#&b_QDU;cWH%J0uc4fiK} zxjpxPSL4zHHFa+nGWJ1~hK75gua=cQ_1*q`+WPK*Ej@j9 zaaS7_Z?tIZjO&@cBXxbJ?+$?^jh+(ACxt&F-#&88R;Vi8yuWyQz|yCCF8^_v_)7M{ zisj{AJ0^QhY^pB(Iju@`N4w*jkmUQ{-(IbpJVP`6`P9ISnG4))BAc5py)ikY{HyH- z({Z6KSA)C!pId7i71(-T{oYc)UTNMAse;t)vFjqgd~ay;5C~e3XZ^YFPPqNut*Q*C zw!X>SDJA{#o7W4AaB0WabWZC!Vry|u7pN>`?Z?0LBclGGj5}`!p zOAg8UP2RyDF0}^fu?5S%(_g+gqhY(o#+}{{v)B&nr@P8!G*r8E=u`5+5V%R zUr{FX+d?MWW2x8GZk}7#uBjLKU;RVNYJU+nQ?Zj9vi6F;ZaE`UsltQ(xs~J=kT{%4H@an!CMWni=D4#q)Yr0R`M5UaVYRCl(cF`gcBxSm?Skt|@-< z@#jyMhUG0UG4-`R700adu&gGcYli*h6V5Hcrwh0@DF>?ipFN?c_~ZjGhra8I*mJwC zwfs=~*R5%PrZP2BD?8*@NWM|~skB#neH&$dZ|yj5_S=)*-NlVl9Je)|4`)BP z=|uRxVAH_Ry+2c4t}V*t*Us;$uDcri^+W0>W~C{2qRcj^?84HdnsZZpt}JLY z*>stcvX9-YaX8#QR0pZ$48r zr|T=il=-pa%!FTON_j=>v^e`-J-L-Uw=k(HAIxh z7qisX_847GI1-lN-m^1X=~8E-dCKIcxiecGe?63_xo~bDhc?@3=QH~`&pe1bXMZnd z!{UjnK0lZ^!QEZ?S)AhndC%^5TOY@6ojuDgw&#$YR}sV6#G`h9)&4COG_YskIGCWM z62J8Q`OMbkB{};)J~|V;qI*Bz5x#{%IYD;+x!JvRD}$D-i|^efu_xeQMBT>%^~Fue z@@3X;3VSS0#VBP@HgrGMD;>IcW-z08=Q07_FW;{9?Av?l)7g!UW$)Lus(7!nNj$&p znlVdA$Udj=qk@Ok$|hz;IbBi;yyvv3_kmqL!AP`4AXaPKX!}d%KhzgodXr0 za@UBt_OxEw`#G{{Td2{&fGFk{@o#sFG*(;Z9~Jv~pj+UNwSS?U?~}i0{r2Xn&q`zc z{cVz==(+;kg^7iln>bPrf4uN-ccIW+nNWfGon=MeC8T%jPVQXAmfW7GoamV_o5z2y z$@?3QrXe-|?`Y2m7F011(z!aRQ{3lY*wz348dR7~R-C%hJ>gMpUF)NR+OPiBnU&|r zFJly&HrGV__fppY;YF+GzRGWX_VyG{>+Kf#&+Dg@znji+RjTmO_Z{J;B2iyNUGJYw zX;pFizN6*uwVH()HVgHHua%lEoMx|hYyE`AvOh}#qjxauy>+*Td7ICvMT^3$wSOLQ zY5!AqZTSbbBZdz%muubJsPlf);^(b%F6i5}e(ZRvcRg0S_>S)LN8W*?R&dSK5-TwqDdK_lRV!rK4=W`(tBY1HO%3YklNY)sYlzbPu$EcSfE|RV<)ox zDx-SB*Y{s)=Wh)Ryr{9sCd+CXi+4GjrtG}JH0D65*TQFaO!_(Z!n&La%ic72Z+%S~XXEcmjyXxPz z4cBJd@&ECVE0_FtPvV9D>z26k#m5DnROx;>-T2g7MQutX=kFKa%(>RReVoE{Ki~Cu zw25=m$vN39b3epecmI%Ai^Sijc zQ)a1)+l8dVO{SlCGX7nuUbrv!wq8eGd+#Rgi+&<4&wlN@5cU7IC(q&RdycM`9|tFk zc+5;XbLzFr)x~=R_Aq}e+@+}YDDe!x#H=gR;y#_wt`>Y%D#)}kP0aM?z8_rcd)u4V zeVWH=+*AB@;hNQ<5=`rA%fz{&ZzzcdbjV#(FGqIWORF=xV-aEUlSJzq29%( z-fDGf^2!u3y7a4`t?;?X^U`~##B=WlE_$}lW|ypb;g-gIdg+=OD%uwNq)dWK?`Uj~ zxu=~P=Jk1Xkki3?r=vF8Tm4&?P_@mo`jOR=wka8#+p{yS`INQTvT#R~`IlvtUNybW zxPOXE>Z~NssR^F7L6%OTccU?q1 zR_@&39{$B8q^R9~4)dFzk|hjZ7BQc7Y-#U4UVqF|c*TnC8B?x5>HWli|9;WOJ@wk3 z4(c6lejoT}kHv`s%V+M=>so)gX*F(EJ)9#K{Yt8Rhs^Vh;+p&KW^HZ0`|$L($JJM> zLh>zhzIv$z_BA}VRQeal*)4GR^pbscoIx(ZQ@EPr%o+F^PVBRvwm0q6ncr%c6&HO- z%02xj^@_XA4>O|!p^{09x*d|{?5{8IR6E+lYRNnGFh_f9lf}=S-mUdZBDC7}9prm; zp=Q;bM~6=IPraGksT9(Cz+z3!9KnJsZvtKKW^i>s?u$|I4v=@=J@4G2u8w2(nxxhx zd~c6BJb~MpE3D$z+^~wBBlYu__B~$ax+60$2}Z2{v)T0Oo%WaZhaLwoMy@tm zox_nV@_OdYo?2sW`>#i$)hAy)9GWWmBYu0!(~Pb+;l{^rDXm@g?ZADTa2KCxiB}fC z+%i#5!T!pMpG9&K7aSck<(Jlc`^vMm{)fS_WioI6XHAT9cK-O`Qn@^DYvPyN6TJS} zmsC$?a&DPB-&VXQ{-2(KoBzR?MUQtVE$Ggze*AZNS7B?5Q|M!-ch7Ct8l)w>kPm)d zKE3$FEavBbOiinP+R12bealg>#WqPyCEZ-;(xOI{tW|QQXN!5CdFwQF*I3_*l$}Ne7X{p!R?XL8kjX$vF>winzD@!`s z=kmRue#ppHF<<6ZL*KM%N}bl?3UfX4wVxj2xS+d|^^L*l7^$xpmR>pQ8Ph%e^WF*T zRwl1wb+)>oTqtQ*JN3)9xml*yd8K?gGa5D<`+D2xx3C{5<_b3Ap8IajgegZVxD&0H zJU!pw_Hm9|k@~x3>szLnRTs^Ds`D}2JpIe{t1si(N~(`OX}q~DN^a#6W#O`B#e92H zA+}ZeQinDLRiBzU=jX+Pv!o*Xw%epNO|dz>a$UjaLn~CY#2LJPdI&Z2@W+a_*}c3W zbL7|DKaU%J*GxO_*11)QGu++6wSUW(0enL>DeTYMb*FdY+*^=89D#% zZRcwzZ_6n(oRi)3_*qc=T*>?2AJ(X-7Ie;jI92G|uVY7SYeU~2tJf2Z^S> z5Gp!)Kx?~3fggM1pXJlimK`X$6lMO}$yDh1!SI)y`<-SpbgyPOx~0GL)XA^rie{Y_ z=cd1CpJv;iZ@aP3jpyv54{O>M?_yjZQl9eYqeHC1qkfNvBE|>T+C1Rp+0`Ag>)hYj z>-{#r5iMVFjak~Yac3w~?N*t*>%OWFE}qrajCK6sQC6`0RmVJ`FO$DjuDzmlibJVQ z@>#uOGiPnFNe|n!Hm;rxCG{(rrY!r_ysbp=${uC+JHEMmoAz~HD$;40dpxyXv}Y}E z*2)~=l+WQm*5n6liL(qYP&Z-T`daYx`Web!j2^TppVTv~xK-?BVf1L1?*8W!r@xFU zf4M1R{*tR_K8gxhUYNZ?-dFtB$1HnplNZYld|wuSaNaNZ2swra#&b5_^mB~U(Kzj6 zz44jk%kAImv)#WQt(~y-ewv8^Pl4%Pqa)*FwXtE(xfqJ^EdO>nDLa}TWJo-^=iMqfB&;SsxoWOPBY~^Zn=jBf7ZNk`#nYKO4+y6nF(%YQ&QSf zwub3E6n*6KCE%Z?wM4CwRG^-X6kp+T+iE?YM*EGN)%#yW7`TMScz+RzWoo}v`AKgL z=iyG}cM*@a#%#Ored5h^tV=%$CY+e6Eb%aH?*C)Ab)x>C+WbAi>hHGv%d8e3UN!vm zo}9dug>&+TU%t=NZ^SNFd*5oesHrV}QAT;CFnfn@*xLu@<~*0`L_3~WXg-}pAuGNMpSHi8oA5g zuOP$nz;=_@W(QyObDg{;!n<{&E{mV(rlYsa*vda`E0zy@H)-Qxjs-CoMgop6&I|Jlr za{u~sM(_{2Esy4$U8e*O`b^q1A^*0&xBAX7My6e`9OSOpz3YSrOYSHoUdk#jSDavgd&_`T2e8G!A7g zzMI=R^UE%gAIlyF2PE0*6-Kd!a{RcnIM%{B{VEfSRE5Z^Roia=-MNj~Zj#Zvs0Y_~ zPrtRt`GSt$rcaBk(yPMm+DW7cUWhaJRlZP!*Dm&@s2|H&5#v6-zA0Qwe_l{&n=$=a z;T7G`@}qj2?bt=tH*Ia(+kR1lu0}ydZqeDUY(O(IP*!zoHpGT zq4Re>HJ$h`aQ}o=@n^y(1A8QDC}vS#e!Wi|ePAzXX$i&V4rRoo9MYGh^?&i%H&o>W@mBBg9rL zJXgirF@1CFLE)1!m&NK&X0(Z4OzB*$rTAUfC9849;%`%V9u~+Nar(^*%YCx3fAhlA z2RV{TPM4_6Y)q(LIWf4sBJIcbi2<)yI@!P8@a&iM(zU(M-X7a7CU5X;nrES9zn;1A z{9193G;8UmwD<+lHJp#L&s#l;K2dsLcGY@0nf$O9z4As0hRdQ}JXN{S+#7efW25tn z--q^d?EQbgYa%%gq2rx`>RrZAfa*i!cBmZp3*oDi*4h-f$DYfpcg;5AmI*$XeB{ReH33?k@@}gSuFP8ZGIHuv zhZzeWJlSS@`^vJ_-dl@19cQL=?zPj}vq_Mr)jClq+&#O+_oeL`-s>fI^F6mOJFoLt zy)wE(1SAj$Gl#^}4y|?E7*!+l9&FGK*2Wb;+`P+GFXWO@bFba#*ek8}+w8HGk z%lbVcL5qVtU+COAJ4?7{|MCY5^Cvwy_;TsQB{pXh<}5F{GpAF(V#WhTb??bjxa888 zCr(|GsI{5Rc;nKhDUs73i61V>Iuh3;e<@Y)r%5y;Q^uONU+pZf39_2ksU*iH8 z$99Lc3T$4o{Z)|DotHBMr&!f+Y?5c3Tlu>AeTeqI`02-t&zyU5dZFKwy{*yFtp@(5 zSl9ZeFADj%O8sg7``!%`KOfNf$LbdZKBT3JoveS-Fd>df{hHy!sw-#ChW3A({&9BMF)KM1 zzW$v)_v?Qwy|n!783QSs!embl3zvy~Y_e;joad$`ADw&LFyhwT~)HS2Mv+7*k?fs#*bgYlhS0o+Ood(|GHOhTX%rj{BMWV zj1!U{=G|EO{IxXm=9dZVRx{O&SuBq$b6z{RA=Yu~OC4htuAnCMGGG7b&y35e4VRv} zb27x(qu;0y>jJuTDA~b*M%-CKTcU%3kBQ|g5Fl&$C6uYNz3&?smBA|*cH0sl{igHawl6|1;yzZDqONh_>8WAtOS=ZeMb)n*y5 zPx?uCu)X2o*{W=t>{d2s0juAeL-O0oW?CzJzB#uy+@&MG^|UHRLI(^MAiJ5uMD z_9!!Q-7g*$t_LfuB|loO4LI4h;Z?#6-y*&GYkuz*|HwXfsQbT)%G`{! zH8=GzS#4)-zG-`*wtW4Ttq0}*KDS=H{J)}pw$NXOS#9a3+x_bhu{zWc=1llOxC?6#L$^4v)`6XIH}c&+ht(Zh?Y*jB~`M>ehQvoddedL(}T zKFeFh3$E>#4sE%GG(|^mno=OMMJh3n{WMdmpEeV?O`1kb0sepHnC-k9m*3+;304 zPin@oLb58}?8;dTEaH0I4mZEsAD$Zgf8$dTMGOD?U*aFXkeYL%=kd81#*@C!JA0aT zEkE{bV(vq(Wi>vP2j3f|9G#@Or=s`d z;jG--tgB^?U7ULEP}}j=G*xl06eo*h^(3YCs9h_P>!iMWcWy~8K3aU&IP7-L)sVGD zwy$_*f7Q~Ov;1#lbYgM!-GlaL9%(BbjPJgda4S3^%WZGh^8Zny?Wf%qsvNd1-&pwM z{T`RSo7nn2ZnZ3PUZ7oe=GxJ>Ii_3YtxIDTubQKEN310CoA9>_PurI|SU!)hoc(a~ z;d$MfA7!3Q{2%t3n|a3B?Bx>+YI!Ey581r=!4v(c={$blIr&V&4#~MRxr;e_CEj~{ z;F)glkLQ_rg}zHQ3R+&PdmotX&wg*hv*s!hS4Zj7t{N7fOY+^g)5n_Bgqw zBl?{C%hKj46(1AHk?L@~&{Xm_VC`mQJT6I&Q6Qxv-MGa^br5%KUCU z(n?>X7JTP9Y|2-8=XKb^c-0HPp7QOT`go5kccMdg{ln`LntP_~mz;J#@6Fy0+t8U) zWrXj4I@_mL{oh+UQrOG+xFnlMyxddHsb&XxLQfWIHQ8QOn0=Wm<)QDgEqA&r9F6B& zXmey6&;@JEiWtd_lUA^L+;_Ffg(D8W~wpl>d8&%?+ib3$dp?r(BhTZ zo#WzRuS5*`-dW%NT7F%8McEA#u~?r6&qb1NzxvR^rKF%{dEn>|-s@WqMFm~hd-pD?W-PcQrTvoiIyLKjd{{;gTc!a`&ia z9~YML)A=7TZ?auP&)WBbj8`Lzw;ghrWGTkO&wrpwF&DfI6}`nXI2ZnXCdyk~ zxWeK81lCJddpy$Sdu1LCNnneRd3Pj~@A`qP&uap?UcLx-OIlm_q9C)((PugT%{-7Y+D7x%0QmDf2ex@^cvspxO`?C>`4VQcD^utH z6Sx||CVsU&jIYgp){UlF+s-^wlW$B^>WN=CZL+0mYMKb+uipAi-~AHTswXX5%XKk7 zr>NF0y|=4``Q$Ol`Asjm%H$n>9KOA;C!$6mCFl6KAIb~-R79FDnO(6)ajR-=1-ZNal??s zqwbgZw1`@{q+|D@&E)SgHhMq1`cC@n)TitI3RT3`<}6pgaUw42P$KX3Cqgr4yc4zv zNm2b%v$={dq9bwc|G3cfW9KCtw)soNi(Wq^w<*Z8cimeK=hv}9W}ocYdJ_z+{Z~G7 z^yk}G?h}1^zj#)pl;EZQ>RE4=d_HQB_Fg??-R>n5zZNdLzV7|a_YpU|-<*u%_$#xy zu2o1ZHvHx4eR1h5rk~@b@0I0b{Zd;rJ2BFsQTcn0WRT{c|16#Ms;V=&N_5y`pNbcL zx!bz%^^42byLN4OKfyoazxo~z)|2Zt&Pro>P}>(D3v8=ieWFWFpE>T>UBHR=IlJNne9&rPoeytNbc9 z|GH{BXVp6~ZL1B_m@jRdu`%U|s)@^tC68<7)~=UeUi<1wU$8;P?>8U%)hn`=!tD~|9L6p@v+e0^ffCdEuY7p z7JUDaRK@K{krgdY;=;MBZs%~=DlCh5`fq8Ear5jKdwLvp3RpbkmkSOr3^~ADCUJ(d z@cSmW(?v30ophF4={=pCes}4oS^hIlcNOH;I(-R3YUf|6&bioC>?gca#yEHH+dH{pueV5iK3(NLby}ssIfiYY*2J!q*7D0a@geT# z)_dHZytT$_894lU_UwJJgPm=r%?2jklC5pKwNK>enj}>BGRCDi3UP})X_kpTRQ#wl zFH(y+z|=12!21bIvd(QYp8V_XJg%j5udzy)P1F0Ep{r-XF@By!;j7Gr<4>Gwx~i~R z=F>C%M`n?i4(?nTG>O^glmA4~-koCqzowX;3RxPw)>2Ya@pq_|M22zVe}(T6QAKWc zI?SpLDV!Xe{cZ)bMynoQc*@One#2F}_seaTFWlZ0Y0&$K=lS-AEk>(UH6Gsfm4EHJ zU6`kBmiu;Hqoh~{O{YTPH)~i6-jr@}=WSqHAHp2B$J|p&<3c-=+GLL3&+QHMQWhGT ztkAVvs#G_ByU#k|WSw39f?u2(y?B_v^g(;nB9vg?{(`WPFg?(aLZAXqCoblw%2U#Z=ucl5WK95ma&UXj$y@uTmR zyIlnHi|F+J84CpGsxYnapk?5pZ0zG)_c!d_)=21G>zx7 zk!`@|w+`XzZ)GeF<{LfGs?2z?)%@&%6a2i@3#Fv~wk&>?sKxwgO5)2YUmT_R-&Gs$ ze-XQ;;MH8EtW6r%p1a2FH`qFr*cO}|qA;dGa4t5=6@UiGt3 zq)~D4pB=uzF?J?pl5xXa!q^mraa`L$$1DQm(+>czDyx8T^^R;;&zc1 zA=88z0ugV|*1qnDPuwHaV*6dST(rKUe)jYQyMzUUY&jM!HM?&&AuTnB?Z#f?Us=l% zk6*kPP*Ap=<>>p>s#}lsMVLP}IQ8iE#OkIU_e(9!Q?Bev+Wf+Te}C^IRYHsJgWA&OVbf@mli! zPic+LPy55Rbx5tTxHjAA_BEzGlT@WTHr!}mDQ&-z^ImAzoBFvCIV);~uQWym@jB() zFxbGXaZ|D6+kEHtC2#9;Vm`CX`J(wd?UI7jWsM0|a&tX6zRldemM37^l#~nGBQ`Gj z6VZ8jk&!?^*pw5W4R}s&<+aFYo!-m!e^IvFytR`%^SK|oUE-+aZm`IYQ$6vuPGiOz zU8X}%R(X`qG4wDyCbFUN61UBwH$8guZ#f?3J;=Z9)vXC{Uf()+H8q5Jd11V|ho-~p zUB#POOJn(ktxBf7a+yEf&S!Q-*@m2??vpDyzq>EvNP77Cud$Ws-@}(WkDPdDQNz7= z=9b!%n`fNAza~emhxf&dgxq;-7Hj^@YS|hedh*rZY!R3Fg8N@FYh{W1CU$=TCob{Nq_U@C(`z}v+y&v%6k+FS)3QzH0-5%r4==X~gF0ne@$@%~B zhTtOUh1@5Cl)tvRZ}Q*Bb8|^gUSw%!^xC(bmX}ZWee7AN#(ObEBuw+ry~a>o`7?nn zoC`L+k!;Kj=%^6nK5&hBkqN6v=8Zqre5ZBe3tIk9U+3xgO>)_#A18RfZ#R?oid7QR zv}!Jk)d~u`eMY|TPv*j@d5YT=oi45Ur`$Eeb$PK~``ZJZLJk@T63Eh22oJB8R?X+3XeE_9f;Zi2gy+Kx>}R%iT~{jnmX zF*s>zA_K>YC4RvdSw7d!lVbk(Cah%X2AL4W>rGd)oXxp+liZIDYEg(@;U6TWxC(YPv4wbAJn12F2|65E5D@poqFIo z*~sG|m2zKZ8)|uk&Q`t5*>O|QcGvHJKVEvx$XtBA&U;ghtk%VEn}XWP&$Mdy#^^1Z zma$1aS<-9Q=RaH9SM3u?G-0iY`Xcjoj>ke1rT9%uhgU9_hRO5eXPS=c+$j6T zont7{T2kD0C9&sOM0v%u;GQ=c9#5>amh3+A>Hi|${IbqczM~UXTg+y<_N_DH~$qOuo*~BZ^3h_! zE9);X9p2LSqHbN&rO-~1gKVChv2tw(GWVZ7wK(zP$5ZEA{T38-c*V`HZ75)P_fpV1 z)lYYK&_{!3;&mIjHP4*AU0N_ROGTZ3M=hU1xX-#B)2g-p#xcn&u1Z#$ksQCtPyb%r zy}8@|TsqfV(m$$6^$aC5&@0ZI~GEdQZBj>(z!SXLW*-tLm=9eGwHJQGS`)%Kg?!=1CvOkM| z$$ZxM8dLl&E~(|EnEJ=Gvi4o8k5_K+JMf|;ujS6s^Ep0OF9&YFC-}B!-`l$R92<`2%M|>E<63q7J=|xzuUQg$*M~H$^K@1EdR+TNkP%vMr-~9 zw-?4+_!Ui0y!BG?Z$M6P(EC7sjwOPu%jYf$>T%QN)#?0XzI@fipW2IM3j*sOx0-fH zZ}9B1`__AvP1oItxp$$>x@FcI6Rxkje)H?8b?4U|mCW6LmHGCv+v=%-2{WR0=LmmK z>t4i^q`vLRid&A!OJ?&-4P`oGapj;L-*lCK&I^p6AMY>JQD^*fV&l@aHcutj>^NC3 z_FgdQsi?|}Kf>PE=apJ<)#h;Oe|d1$=Z&bqbf#O1EGl;LWh>7FtdWgosIZATx;ws> z$y8f#b)s_2-)D}qe-%qd+qBiW_b)2nD0Y$M66=Fw7AH(1gSobfHl?3BxcAR5(@fjz z$>uZl&+ROIxXehuHMj8nr)=|w{uhrI?we5ls za7^OJ+0<+?|F>828!oTB<2Ac|7(139mA@&&f>Xt=fKsEx zrp7Qa&PPsuPhE09cz=$cd0_dU7k&Qc%S3qO-%SwV6l8h$&~55Ftjn|@eF@9t*m%LM4t^4&$>0?Z?-yFUF!1_7yA>v zZtVX46+OFUHT3%1GN%>Z> zSLXMlS*#1S_%zg(CkD=T{(qP|W688D--J%oYfYDmc(6EjX8wm&TMD9d|NlO>%rw$X@R&x+V?(9xd0AQE!CS91 zEIhgUX5fZ*vS-$x5o=a2?zwn$yXEoOm$dr3V>}?yov;7({{$Yb?^CS{HY_&ap7G|3K9j*$t6K}-#Vyd$oSvG;efs|!uGPK$Wuf)2 zVyk}?KjV45zf$Kxn_s!UKTQ5n(!v?pUU-xU;eo-%=5JVsJCh3TgE%jGuf)w$xbn6{rYa=;;0vwxu*Df zY~@<`LEP)P^|gf5DYwdQAFiok(|l!r>c*E-0S>(Tj!b%~bj?D)+~k=3-Y(CREgSYN z)W2yMIHP`@oX>lceR{nsHOPu8A*n(lzG-#%~fbEziEm z2|uIzc4zJpuwHa~d!n{toVxDs1=F+EZohPS)u-)sB1#?^|KFZC-T1=z;NNd-UV^=H z@2=fV%KJHm%}4UYl@}lX^LJ!TzrKy9bm2k~?PrI5cWu6Z<+I1s{gp}r?_OPglX0@4_5*`;QjRAxUM||OK`{N# zj}ZC()nSf0Z$HO5?Elwp^!A&zbI8KNB@3T{3LG% zzq0+A-{$)0Agi0%+J_D6zhBt-RP68hje$!p&lYqPKiQ?e)kwFnbhAT3wDY^TtK0LY zB*|MA)@=T6z5mPlHSJ<6gPJDssPL6MYH@xgVjsOp>d?;VH?@8|(fP@^SE%Dv8`s8` zBO=PPRF&YDHyOZ`uUi;C4>JK}yphFj?I zOWms74;vp?Ugz~Z6Bej+*Jjt>s%P7J*SBB4y>OCba-55h^SbCHw)gy|j~B8dO~ zqM7yCO^<7hr~a{gvTu@|e?K-ObZJAHyN|=3tEVL{t?paAvuNq|I zH*y|+x_0t>#={$WcSV^g?lINg7LcX?>#(QsCb^ks4@cN_32@EYn7!lg;oyT!A-`N* zZ+mio3ZC{y?r(_nty|e5^JV|s+Rd%=zd+?p&<~YH@xIT8E!H!vx}JULgAl81uG9*r zprd+e#}vhwUP}Jmon3do%tuAA{!I9R|1M0Khm}vXEQ_0Ykn?h~;V%Dc+b%_%b_wd^ z$Yxt!^=iYiJ<@+)a(=vRpVkoSZ?%A@ud24{TGe0azmIEl4;=KVOQ`;% zr1$lKfmnC!_M@7scN>;8dCazpyqop>TVliOLo>{-aWCNxJ2!N zxahIYtHPPLIkMj$TX|B5{bLKW?9Z(e1w$`ycAEUY!&tDL-L0Vf;jJYrlub>Nzs&Oe za5X7FkkN@n-K9Q%l5$UQIBT=-Gtr5kSj+ljUlwUiJ0)?|EARXEL+)!zx9o2>aXjrB zD4%NiY1xO&nOeOaMVlA|CqL<#z#-B4IGJr7`^2|@&VLszkQbP;;+MbDp~IS2m&Eeb z&U(Fhg1_S@dxCh8|C?XcuiXV1m^XWxZh{(tJp7q+IbK&M+T=O5RNxe|4=BG8aGd7j*f zE4%u4o&0o7^T*Q{^85{=pS1-ZE=ypbNbL0NiZ}^!Hs@p%D ze9hz6yw3k#duQI*`)p3T=bK5cLQ}+bGtOD8TQ(%paT7k4i3 zEf~G;-u#%dIQ_V%N}a*W%&QR$`cqFVo%Eo?_kq^Oj4a2$df&5+?wG&dw{O9hF9}+X zlmEL+SMY9Z!q%}v$KU~f$mveCwI+YEU+-;o4>NpnGVo3|i^jUDCb`>z;eH>N&pPz&k*Up= z{2$`e=Nnv%R7srHAaH-)@s6OIu}6;XUi@@*pCHdS?hM}2^`G4zcx_=mkn*|V{tac$ z&ZELA(?1^wO`0rsa23b;6S~v?C6~#k%vf`NL$8It00 zk~x!u;}*GkN$X#6_YjF~JIQ=R?vx9$kC)K_k1fZ|<`mjQI;)bVr4{NJ3-aGB@-PQfNvQzeIn`&Z`!0sIv z&h4Bsp&(3iOUJ(O??3$4gl)@nH+$C|#k}*PR!f|0_x*2`1vi#%`|nyG;UF+ECDog4 zW4qS>Bt`x!7xs3Ud(ZPxV(~q1n!hml<)u3%Gn&>;KYmZ3^t;RQl(Ry1tXG#G_^iq5 zQTQe#l-bfIV;WoWs~G4qw{5 zMSWAusbyjsPNI7crq28GHL>1n#*gibw`|?a^Xov)@~vD|O04w-x0yrPlpCG$5C0WD zUSYb{W!bH(d$g1uXR4_E)yX9e2OtR6WZk_vf?|EJYsE4j*dWYMqq4;@V=*cQ^Mp zths2ARPgm@@``4Eg|+vC40(8u$Juz>{Cg1ns%ojWN!0&jnLT%ETuV(&OQl!+t(;eB z>wi2xO>%y^(5;XSDG63fIjomG|5I`J4wG%czC?G&oe#UM|G9fSv!7VAr7KNtmH+fe z_jBDJEu*bZ2>aD!S;+t4oDlRNe^>Vt+02Uz7}7P{E;FxgJMge1YO4NH4efgke8mcD z>kU;_|6g=3Of+)(mo-bjUQyotlA-R~uZ>G8Ue|rAyH|dP_43)0#Gk8#Mfhh5+54~D zoV!uEQs{Z2=rZFA4n3w7w#lubWglt;rX6^Z{$xqmwZO*ib*dXDd&XtojH~{axXsU0 zvaNKSh_cxm0?x;mNT#oC|=U&T)S z;w=?=l&uozs54Wt{oFc@7q^{*gsmBaE|)&}=^PT%%(-UblB=l)I}X-K$t7M`6x4dQ zJCA2+)&5>h11?eZl?UEt{Q5h)!u3R@Ytl{A~nb!HO&*I-H%xOC9w)p-3uvtzrZQ*NHykMA|cX^gp zmZ~(jUdEH}ktaWQm-PL!+;DvJrn7ru-NhRe+`IixyB^+VfBd$vfK!@*WM=yV(_1gz z>dfOF7+(73`OQt+&PDsm%H#HbRy^d4TQqelPs;kwsgL3p9^L-R zcfEO7lc!dUjr+X6lia>l&sW@b?$QKp@vCavYlGMJ9{w|9!tP#?`O=H`9(;FXiM{|w zRr8fV7pu=n@_RO&dA{^#^rElNGoL8VO`CP<<9uI5KRXr0m)iw;&9?SOOIp}YIr`Fh z-`DgTdK{iVKR2c&t)4oosObKw{0moq$J8&dxxk#*W;mrWW4+S*i>65>*!s`e z5>+2NXHLwUwO{-Hh-EIB&2%G^H$wcmzChoem&@W8FPYD>Gn9`@QT0LU4}FconNy}t zSbIIFlR0|-w3W6GxA_?y=zI9*R&c?IvwD--XE}YWpU+b9~irLK2 z7pWiLuHSdj>GQGVRKE8oIvCe$?6&LE`IX9c%VydGgTlS*S`Rl#?)@v4SonI_Jui&-7-}gKrJ2Q$iRUh3nk)OA0`Zm2a!Exy+yG5ToczpPIxw>_o z%gbM_O%`32RVn`qi%k3~v?cGHW}cRFe9Eq!X%VX~^rd}Nd|u$RZL0c#4>D7)8cL;Z z|8Yk8l)q!ZmyDc8TU49gaTy8SIP)`oy3bLoxAiJZuWN?tEC?+rma_TE;3@edUh0fI zPye;})|CN%SGkR9JJk;4b||+qfBIi6DPh62`pRD8fAL(*4gTqmd5*F?-xy@;8|tz{ zCVrJtp3N@%T}FYC2}XO_^f~UCe*e2z`QS}<1<86RXK|Ut$8l@@QuFN0{BM#-rBS7Md`)9?MFHN zZq%K25jlNkw*Akrm~Sgh9ZwlAe>uVL$Kk}qDeQd{_DQZxYBBn8Fr@B`|4k+xhKmmK zN*=%dzo_tCEQ4a9s9c|in~%o&vsb_OPvmXn`Oq>maBp?&lR3xqiVt+{;johT%!p6_ zFntTx3gu-j5s&O#gWN7D%>QKhfkAZQgh~bRDei{nc8Uew%>0p?@q4)htN4yJKSEA_ zt<#W*3|H2;VZB#bbYEz)+RPuKHg|5Z#1*b7c;%sN!ug$nKegumgYEhzPndT)C*E1U z*pMvr8C{HYVd{!S~2w4ZjBe6bNPJx`~x#)O$j)3&3A=H=0(+`Ynqywv)eDk zUs4YBK2^G~)T-DsVfAdE8$54aCaXRQIpgRfoe#!V{}8-K5;?iNb#LJ$C{$v^L`Zl$>V>7uQIde#i2dE<{Lkz`Y+n!+Fr3@^_g?- zc5%nQZIjmjF} z>NiDc-nTBSSG}g}d4CDB%u_Mv%nRg-}eyPMG{^7SHi%iR=K4xRtKW}sPWcZ{AS><+lH(x8>Gx~}iZk?9}TSaSULx%1GnWvfscsc|p5C%x&UBqsX*wZERecxFGwDr-R+|P^vbsIG)bXu+=ll6z zyQeJETO-8$EnfHau`{LDR(=inT{R(4s&nUC*}P=7)XQ3WT18opUe7%#pY}s2_t?jM zv)m^?n&H$G(OAMDr=-3!OZH?}JNuOahg}n0eIgHQS)aN3bK2CmEah)@t-mEYGlio< zwye2?v-E#niyEU+#Pc^tEhkO`nCya_t&3a zmuP3!e9WqE$;(T+Ed0t9+nUbl&EX3S?^t-|es1wnyJZDT2YYM}@htiIbnDZokIu^^ zvTAnBZB)D3zSz0>tp(p#hSx27>Ygk}dR$~V>4($ue^OHlm|LtXe!dfk<9EF05vg)* z#g$jFYc(&MeqFj_^_-T)t3SWw%f8Wk@Y)0M>9hX{XwUW)fBm^BGW&!4B-3fq3$xo> zn$l-`ZC%L9xTb1~tk~%c^8+d=?1l$7^6twkHi~Fqe0WKG%Zb*Sb&=2J*S;24tiH_r zjKQ?x!*97s|5B8HGKjkMZ#^IuF~L?hbi$OiTWjR{y}5IwOQctRUs^fY^6qW1X;b24 ziq~&ZOwjJ-YDbkABL?NJxf0Keb}I0 zTA3;znYG!&=ce@8wb8dS&g&j%xR`qIjbH)8+Uhh$&5ZVYGeb|MRNh{`<-9EGoPq<3 z_xf(;tiM~q&^j;p=Kl7E3WL3_BC)!L7Y~Nii@Xf=t5ch%q{bA;2%T|%D z=`<>s_auEwve}Q-ElTdz!TZ>!>1`0j<*)l$H!j=QmGoz+{i!XxkPyw%p&ThWovr8Hapcf)2M$0sY5 zju<3z_^q2Nwyu5mONmQCY_s|81C~`CzT+#?vo*rXC>qIFMZ=K=O)5o-tG43`1PaZ%*rRX zFnvCm$D1!OUvq4EpCv(pN(Wcz&?R;MvoYtEMIAn&aD)^`` z*3>`F7b>UC9lc$JNv>y3=f%!nznG3$|Fiq9IDx(GF3aXsZc`@ueW*-dBfzG6GCpak z#vfyYRT77`I{)OE=(FELJU7qiaPb_IzW*m(zpj&aGvR$*d%*wj?c?)(+wW#3WNe=6 ze_xI#>eTlu?nmm{R@rO2+J%+eNVVtQHN{#>S(v^3pc->fiem0W#w%Y=|B_nuRrtcC zx9v;xvTV#A`ahW-ex{D?_S1$VD*ICEqNEmY56%mI{nfnUyvfd#Pm#XmucL!ZKE*ny z_-@*F>10KkzTH6;#%DgCAIQ&F+Qhj~QeF7TAKfn1Z`c0TSL=nTgxwP7`Ca~O*PlYp zIo;w7FBGmGeq@ocGu&)<@h-tBBD;e1!uMqTuAKA2j(hfT38620U+yxv)9@~Nk#VtR z_Jh-m%X^cKR&_+IPnelpc5#E%T%AkJX)gnWUp`tCw*426_Tu!k|IdBwjh!!^_B}BD zi)`SE;9KP(kvBw+mG4>HBEME^cAN$Wjqen^R9W9m*8!Jh_9Z_|~MTIXYK9oi^ovI$OW!tbE}_ zo@s?~(c1gnS~}#+FP!-Ny-!C*-OPGh>ZQMj6Fs#4MCYBp!&1g&AI#AGdt=UNDJD+o z&MEtN?v`t=Yt7<15aRT9L%kH+#>ISUdu2;scot<(t(S5(UV1{u?5b_=o>?Bp9x%9H z=}x|!C%DWnDAnY^%!i!Tcgt<=X+F-=((91_zp=?cM|N#PUFqR9ogUX^)^qQk+P;qU z)`{J{U)&lSCf2tGJ<50yacf(viGPsuggKvjZgke1zRDn`!@*x*%o5u3tzy!>(!{5dl3pDb9Wa$*bL_Ltf>mgp$ARVAyvYvGuxExY}f-OK$` z!Y_2~l;Yp5f6@Gs|7)e2f9jPjr+$rJbKSW=Ju|Iovb)*6&9}Wyr>J>fX!|DR9wL-+ zUrytF#kE_L+6s!8H7tBxzOm~2?!CV1;QREt_!f;{zuw$$RamUKSEVW>w(5qshwUzt z!XzObh3)6}Z_@8#*X6i2uSHeL+AnFf`^9$eLz{VSE|F*z-M4+x6@`_ZhfNjyBozOx z*t~67eRYa*_w+es0XkK}+P)>>J^TwB+l-56G#Lb(_{TM&{oto24?q9Nt_|t)D~#s8 zpOO*Yea>OYb-SOT77=QbQkXWD^oaI-_L2V6YZ*~{tNX5~z3U$C&#WSE4!yDR{t^A_ z>d*eKhd$NcnefYL<&>3CCogG8XsXRV@@#|RRCl1W@U9!wMXT$VP4tuV=c?&-9*tGFLZ>fA`VU-tI@w$f7~{_GDIS@@-T z{5UUN`rpO=Nl)|jb3d9`)j1<;))#cl*R^ok8B@9OXc+Ge8?DCTQ|tL|oYZ1p zPhyA;-y6Thg^lZ8fcivXT3SY%bC82?Qe37jGp{Og=CQl zjNA*|^E@?!4RTZ*UKld)NyhbxI*YV#TgfTxSg>T(I+YLQOz;2eg%x;51Z36w)GV=A z^;-T^KVS0jv(jDvc-v#77Jckr$-GD^%jb!7^pTyvOB{b*Ok5?bv+(Qovsr&;FdTJ` zneystn1SyH2?w{s8*bj}K2z9O-`T0Hv@q+I{m%c3gFd$J`MoyqB+ue|uElDX4=nlJ zay*(f_3Swzug+%=;zjOdYZ~2Ld{AXd$qonc(k&B04rhE_%2@XJ)j3lYjpx52)n~4L z;UucR;n?vE-)GBC#dooNo@!VynPFo0gZ*CrIZrH=`WJ4s>~~j4=>nuOX?tRqT1}>4Ed0i)jr>1an<{gPOPn3o1goe^WeO|I?k=E!mJOpYIl9&Gu`vihbf{h zuBkxw%*sU;a|ihE0g_0KSyaRYOb2DEylFRcGE2G30405XCpWE{vw5;b z+)cYa*r8%Fy==PCvCj~ERi^An{n+?cOo0F4Ch4*XAMGwlauhZ=B}lK|U(%rQm+9-( z|9e8*O}=rSx-F7-$f5Z{-}leVG2A^|_kM2X(X=@7#Gn6^+HaAa7gi<29Q$?bs`^8& zeBtSPuLPP4Y2DcsB);V{yM5}Rtv%nj%w2MFPv~#Glj}M*>t2z(ctF_cS&5_foy72R zo!KFL2i3nt=M`>EOf2?0{&<$6x|de%vFM8%{l3&K{y()oC7HQ>#)|*(KlEPL82k(j z{r_dQUgY9ulUXG#6zVGsN+SwgjQS6KVwKHbYj*d>)~i}!6}d&TCcaTVDf&$P#KPP~ z{PX^3E&6g(>iJ?@|1VtmLPAHk^81GrbJg_j&v;X}>4f8!%NO2uyWd!Fw|KI(QPKWj zt62wn=bKnAvhvG5-`isFfp12m%U50t89Sx7scY-_c@q}z6Q2D|qkc}v^E3BfAFua& z<&j{|QLCiOVEixXn@ZaLo>@DerR`%;tNs6sYgcI7{XDBb?{7TvT+mYK`D*s0&;37_ zHI+)wP~qO4Tn^=j{$-kl^=?tX{wLuJF#p zp6Qaw=Z!?z4>(Sr(35fT-h`sh_m_DmDO_-!c=*RtBbg)mA8k|@ztWxQ)OqD~r`Tow zZ5Og^tv=;!_m3BtHvmoJx_F0* zYPWsed;14d3*XIY%`Z>B12f7WW)8$Y8ml2CRwU1TsXC+;IXyBuc_T#8&nMc-{^R~(@muN<}=>%&Hu8R zChKzU=DsmWz~Nf|gV(YhBEEN$Ze97|IW5+|=eCr@9hPGWFCAw*oh(%M<5hzK-~3?4 z1-{b-p55(wod3Uq>9=arl$mWz#ozb-(oBE#EvdfwmPx#~&uRU7tyg}|zOGvMe!0}sz2(>Zzg2J8aIMRW>AvTs+#P8<|3ClV|K5Y^ua|P! z%aDX3Bj>eZc~uXq!fyFbn`XW7%uY%3G_9o>$E9A*(|YzZ;e6lWGd}_%Q(V{nlale|rQRZ~(Q{W$h~YskTb{LpsywV6>*`z=Qg_S7e+o=DJq!BJ;dP zC^PqDXSRn)y9>-N1f_TL-~KvJaMD9N-;Q3Cey{_iZG}*t_AB%o1 zKH_4OSQ^7dQdy1?>;y{RwGuRNOA{!Hm( z>2uC#v5M|cM!B0iEo!T}0xnKv&D0Cpui?2+(m%X$X=zyc_sjbx%75pNJgc9X%*E+@ z_}m_GwYvLLPMzXD6&2~RYo*cqlHzk4-^@~HoYFLN z;rj236P`=;PL?j(xcT6p%|^u^*oEAip{|GbwDeDM-QO~S_ksQ&lRYI*#-$Y-@D1ZBJqq@c($vFTWqMmN_OI&o@>XR+X%gj%u6ckO!1^Y7my8)`N$n|A)+ru1_gxCO6US*)4z)>E*Z zL$z+fSz}LI*3v@NQz{Qvir+ux-*sx;=UrE4xxLEZxSV+Bi_Ve+c|jS~<@s(AiO>S#!v)%|jE;W3wchdFqbzYmJ{syVKsS5}wYvEb2`rYoEk zcc$gKw$!Kv2+VOzmb>)dxuI>7{kNV^MfbFg_xk-gw5-~lbDfz0d&<>$WyiQCtzzTt zVaQ$l!rhp~*Zbll_P48=VqCX79lieQ?Ptn9h2)sJz zI$z(%&CXCu^!KzY?5$o8Z<;@ipVkt<@t5mSz?qqXyLdhr>$7N-&)k^4J~=1!1KSf; z6_$meH`_dQSog=Mh~1MvFuCS{aaM=&Jg4vln-*NyGlOqyM&?S_r_EEZ6{>b_YLA^^ z(!AROY7btiFpc{Cs;f-4sdS%q9rpqo_FExEnMf3jr>)u7@Z@+5h$}+Qi`FzzsqeH=KZT7pCX!TzA zk}vZ-6v=T=4415Vmx$yzLW65g@yb2cD=p#Q6shK{f?G~Orrsihh8 zPv_M#Po;aWt6uYGtl*i?IepfKwPkYiKF(e-? zuP-UR{f?%)+_I08Q#Aiu9Bk0Y(>%1I*Jt5^W=oqin_V(@XV|orT;eh3opCoxfTBU}G z!Onorf>ZOBTAxT>n}6B)uzSF|yEmszU25B{ziR)I(;4D2yC19g{_A-2O>#^B)Vb1! zL#{seYY+LWw#z(ucB;bU0KIQ2pDMG%6?YpUE$z(Z|;;y zs*@*2O8d`RCUQ4TF?`j<#*jME4f~G>9ADwk{OH=ee}A)=ZTFq>qPn=3<*!d|rvz_# zyU=5^?xl+2T-+-HHk?owxFE1(3)6wqbLQXmJFeBsyJ+IcqdGljUGLAR%x^n+Y5A|; z%ce|UqW}DCjMv+ysb6|z1D=6DQHM8dcQB3b<0h@AD=X3_vKx_Y0~q9`9+{X!KV3hl}ulJk}^xb^_9`! z*71aAk?VFbUELIJzFk85QT<8T8+mNek69k9T6s|>>hao{rEW z^Hrb5Xc_n_ZhkME7@BcQZT+pXSBzcG^A|hXOf+MPytevu@a?6a*}@AsFZw4oM7rHP z_nHj9QsDYC?-eS-E;U)J71p0&*wL)E zpd>8#L-@CsL36yn&Stz)%jcQG;}E*MuXMKdi}~$q*Tphze7f(=#*-pvBJ%gG4ft{N zvd3eY6MN$1R`VRIW;_`4eaHD=-c3t(#coLvWc{47DlXd8{#y4Mraqg7kSwmQMdC(> zw)xG;ob7#+{%s;gCfyv{|)iTPLmv1fA zTL1sv%V(8mKSzbS^{!m_D$m<$Qe0w+gHrL#hmYb@V+?;0mdD_2KFgGd*}_*$=IC+zB5NZnqtYf7yHT?QPHe zv&p-I)EhVI#%2q0v@Mx<*Fz-ATwh9DH9B=?kWE}w{I@*Sjn6cFH$R?!?nGi#;T@ST z%#URLZSCNBGHXw~LjUFsD?@ISosjrb9`1Ypkp0@74}QdDJF@@p6>EI2u2)qS%)PW- zy7J7{OAGGk9F}!E*0JoKeQNTBTQ2)Pyq%Y2bYJ|6mT>#)_^8j7CQbZb%30$rmM@xV zrlzgC<*1ox&g*SylIrJP3$9tjlJfCVr2iCNI~~cd)B6HnF4-}SjW6m;pv{FcY9K#kU^E^0lipBNu+WoQ8?cIMZt8NEAxz1Y3 z5xVfjuC1K$f&W^Kzb;Ro)BBirv(x@1GwyzI$y<2yv-Qlv_o2?qGI}eo^!<$WJoM5$ z>4AM-`qsCOuiF$v7R{gV$|v^Yyx)I*t}u7hy_hsBn=AhxbKkj`PmN`b+y4|+Jzgy} zX`_yE^^SGV8_jqQAKz1>qI&01bX9+2*STG5H|ZR)e0Wn}_am|0Rk?ePG4yd^~*7?MH5{qQb>}`=Y6aDvo*u%b4ukpj1+2`f|FWwYuw`^z8XWq~n ze}*vQH*x=)tC!C=IxNt2Ml>ho{f^B%ynXwHKMS_q_K9vhdGe)EcaG3Lm+)f~wQO=F zSGq}D%r~rf-F0lukux<1bsXjd9;h=*xcxA54)2*S7cczUncBQ)+F5CVSF?}gww$l9 zOU!I|bL;RVCflnQ--&kxlvXIGa;_~!4J`hDUY1Ci9_thtA|c6?vT zAJE*|UA+9My>K>9Na+#lD`l2bHO>jyTu|veV|e4qljw`By*uT>zNY=%$~bd&*8BSW)E{XHXO%OoFMiLSnvld&l@MhKiik2o@HlTe|6g}O)r_l zJ40q1&)zTJm~b&cQ?_U6{vY}?O}lx&{>e{S>h`?Ml}&}yM(XOPkd8xhKQHaDf7)Yz zuxh5<*SUIbr{%k|O6NuI(6tlvSzzAd)BMTqWw81n?B${2k9&CBF7?O0sJ?WEdtJ_= z)$2H|KVQ?oar@Kd<&$nj|NOe(cj}B~l3!EvTOJ6>8ojZyF`sbGKql(Tl3#y+-HFtD z_GHS9qw4HiSwCfcHJww;jdaN&yk;VFez zXM9kRnpO1tz&b7FG^srrOV_%bxR;fXDaFp=RG@Lk#I2|5;-6^$>365RTJ}lSutEG< zm%*&x)n1P@mj1I;6Sy=*a;AIU3EgFrDkp6@ct5}WTIgX`b;fGVPTBh@?-rKRx|W&!p7V-@o`CK2(}q$h+=BSw*^}pDW9jH=7o1^PBl8^~>p>>l_N7%Z5v= zT_VHFIQ^iJKx25C`;7OOyc4xn)#SfRa{CnKId|PUaS3^W%-ihDJKHWC^|$RywHEW< z^YYfC*i(Ogs4bcJzj2?cpk?#rye$%U(pw!CoVYNzcFL`gDTQ4|%@E?G_KY zc5unIefWB8%`@XK6U(Y*EUWPkIgozl%od;D-)>agy}HzT-emQ}k^}SCep(RyMDl8; z&;NThUKQO%zY{B}_OE}=CvtybtKlU5Nsi`U!~Y(dcqZFs%{;X*C4&h^x%9WbPkDQ3 ziM`65Wf3BA5XvS2*3SwPt8l^+x_ZG-20AoE!R54baBF( z?#Bl=ZkRN)^McZag<2KiH`yEt1SMWf*jO-EJcYqCGA(;|Q{C^m+-~vZbHdwPACr5POZW2% z%~_|HXqdnCtBPb#%ZmT!BOY9H(iG5Nmu#!C?Eru1h3P9xJG)&q%6m&SX3rM9@<#Xb zv4YNihWG^ybwc;@CEiq4p8YaUMDgvRg}b8NKCYctRw&zR!=j1-$ceTM7S$g19tT$9@2Kw z&HY}GoWIFT?`mT4$G@Q!`={0`bupK%z5c=c%m$M~Gg?)r@!ob;xWCzGk^<{~woGrC zyA8f)p3U2#Uo~TqRc^UuROrN+>I;$av6t%P~D;%g$eC3I-^l$r6K`T8*P&E#t)H^aOx zi8zI(tug5ExuRJZDS!9lF3Z%l%^%*DO5mg*u=0zTb*o9C)oaH^|uSi;JaZU)Iug!NhH|cg?=~YwrCjl}(eHFDTBdm^|e{ zA@ep@bI1gqq`vfg*DHJ4PIEjRzdGnrn_zk4nz>bNs8p1)QVoqDGucBoPRX4#ql>n8eig#T`yeo2() zd-9g8R(tGQ8Q-mAta@U*(VzYC%M+bPJ@4>57dUKSTc@^R`^R4PixRy?iXXpk$-Pq` zAit;iSZruQ`pVcM>kq%Jw9Sq^{$Y3TwC2pt`4^1L*MzQ>%x+n$ALM$z<)PzB`{o-* zTCGlKG#~uO>*lM^ztr4Y zB=!WPf7`G;{Dh*mY-+YE!(Ww(_y=carJh-HIbfz}pNYM)N1QOjlc#q(*z=uL%p`37 zvHdZdl&KUH#e4Lc*rC@4oc7#nez(EsikUB$pfuBce>YV&J%&uj^ovDVA#E*BdL}!% z>IDXN7(Dr~;DzP!2mEYnRJ7;z+9KX+czI;?S7>q$-V903Ty8W=c+?j&zN6I z{`gVkv~#qrkN7^06bX(5wz3B&|A{8g`^GuZ?D9Ins+O-;8@P7s*&Z&i$~@U|;PDyd z^PwevnUl(scHK|QRM%X!HhX2p|4xr%Y37@5TdM4vP-LHU_w=h0{{t5uPT#YoukzN$ zw`cU%+wonf@r_~ou|$LY@9xiUtd3q|%YSiy}7x6Vaj_ww@{Ohtq@dqd4+4JwctzN6M zYFeFjX}kEnYdJ4k|C#MR#x|>nW|xJzE-sKI&Z<^>@EAbC6*VTb(g4^P}Lb;{r*`><`OsYNAEnM93Hvs&Y$O1 zsBmL`oANH*ppi4N24!dnbSAVUpQN*q~z%Vr;o?@w!BHP z`uX^4*Z<=}3DuhU+E?8B)mDB^IMI0{;N|wv;^_HTuPxXek(2zc)5o;Dy*?;;_gzzG z(I)Q)^#V8i65pj?n#lLeE%ur3(|o$4oz$-x6BJt-;T_n#s2)Y_ndeYG_*6 zd&#$RlC?@6yzX7Gx6kv8(DcXun8aroZ!+BYO=Bh3M(&aT!II{tYvns?>>nzfNsrNu zlrQKwH$S!O{em<3EB-Hh?=9+Q`)bR}vkijwVNFFw|0_G6*Ee)c)<`a#Ch7E6?5cA2 z?c5+HA>Fzb7YhUFGbjJwJ-q(9@^W{(4R739M7Qww>p4_E&nXv3YfWO9Xwf6~akc22 zunS2!-;O!8_@^srzx``o^=9+(*nHF0pF1zwORGM+mY9EaPovlF`U{%-RIMjWnD2b# z^Uq}0NC(qLpO+Oewb)@3;wTqKE=rXgp;&a%F73Hp6=bOpL6EmK=(CuM~?npFH!= zo@MSGO^iQ|Pmq~d8K>}|c16O=v|Eg75jx)$|H*R-Sd}@7tVvDh=<563@nNH$&F57y z-==@blj7RAt~hVvzqs&!bz-~r?qTEco+6a`VU5_k|c1dy0Cpipxp8 zfB0+by%Wmurc!&q6(6*>4!NiB!Tr9ln=*6Xren5UG6_n2&D)=N7u@$udwkB9KWdrC z+nTNoD_tEblFjAnQ`qir(p?$g7m%#DxMhKc%j@2sn$ILtq+hjX$^BhgpJgH>u+a9$ zo<;9ZIlP>1*ROlFN9qJ)edWs2srRlP{lvCv_M^^SD{Ze%RLpL4z4NBkb-!}{ME7U6 z>%EvJ&OT{!?gLM>PtxQmPRrDSlnfH=SoozQ9By7NN&E0>=B27hIt(@zlBaba*0nC4 z&c5#*=Th65_vVSWuj2EJs+qLa$FEta>^gV&!W6AH1$E&Q=NnuOIi0`h-Ptpj#7%zf z<5On&{&L&1Jy)XR+2^LXZTwK}!kcLOb-{t%v02PUYkD<5*k+}lklR^&Cd9eLtwK3F zK|okeeaD*{Ex`?)1t&BUUT1%`y14vZ9~<+R%eCSUgM5yi_;~W)iJO8u#opYF2nu4J z{XOr%>h>B_+XRbmjna|D2Od}S%{_Z9y64H{4|BY=_i}G}rQY#T(aA+>?@58Vr-j0; znMx0&-Vu&DCo)y^mdWEdPBlgO)RdXu*FFob_u0}mq0DUZi&KnWGv%F{Ok5=@<~g@9 z?a3<>3$tZE)6ui>%#l+}{W%FNtgoEoB8-=|H6BX#zx3}DyZ%0_Gh&JV1+ATbDQy3G zATaf@{4<8V9+4%xm$&U<>hbz_U#}wV`T{B4#-{1quI5##OB?qutMSZC3ppZJyk_~e z+s{7kHY#~MXXy{GII+J6cg>1QHSSnj7*@OZr{2fVS{6&&-7)UET@yIfSya52o4;S1 z+^K)&rp@fsH|_zOf+FvH?zo^i`Re|4`wp40XsymreNiav(b50u_}fX3_}>&X_aC3= zp{3i^b?9yPzS6ld-xl39R6Hj4VTp5cW5c7%@0YddX>9%HvnY7|8*jJo9IUfvasJxs zy(f%MX6*-dp(oX@u9~lkJSRom zWtS_sd#p|*@^OAiYoO`By@|(miF16L)cQcoYg4q?HNQ`qnzhS$%hw3x)H$cTmVU#; zv0rEUDy6V@XO#bX&NesS#Fil#!rU4qa_DT;LFvT}d)gl9thVB~KYwPU+>BG&>q{r} zv|f4`ZyYzZ=%|?I3$`Oqn7;hJc=h4kkgxyqE8Od^Xgxo&`@lBW%E#hiO2!-ZJ(}|( zc7|wRO5LiwNxzre_OBD-6k#aK=fAe7v{L0DV@b!9Xtl!|{U&WZwy18&-R+BR8r_+& z>B<^orX61Qr>#5thxLAVjkgc4ugToJCm99S2fe&@?cHW@S1f;*b4#@O4Hm(==}y;W z?B13}Ub%Mnp`EtasqzI$a&qq$axma z)93E}eC-osfAose9yj@JRO)=Yryr4W!YcaC1nE_mFMm_|w_bMFX&dMJd){;|4Jq;a zI47(8=9HW5e|y+3ns4S<_B^J=anG~mWqNwyVv%ag-UWLW^&bunlsutTGC^%w)#9cd zdvw=ql@gr&rqdx{!EYUw@aI*IlQ(MLS=_CxEL&|Rd8Z}fX~U(K%*7LmI+xvd-02?h z<(bB*R-VoyM{Sc{+XtHLj{iR^K>w_D@hkT2wJ#jXtLDd)6zrSvC?-oz)%N0FA+}XA zqGwJBG1z|3z0E9Tn7hmJ)Q0Ea%SNZ9HrFOf#eF3A2=~ z`kH?FUS93dFLJH)qG_kyw>NiHd^?>Ox&zzD${mP06_zv3IlIHE-Eo{ikBv z!$V6-pO-F`Skhj6fMLbGslNTodQN>7`|JMizns;d1D$7P_Vm6e;ESC3-NiXYM*Y{` zY!7wy*JpRuo-Z@?|FBWKnt`?V`KBi>YdD4Sq*U#BZ%%d!%h;FgI<;YHV^aC`=fQoc z8!z8feo<%^`O)&!yj5xoJ16l3R=No!Rg`Qp$h1suJ#cNa$V7h6?|RFe`S&e&b*P6k z!7`xTN`%eBeJ9(c`tC1B3S94f65V|{M`^0eqR+<{ymE<%PoBagQN)_%QF1r_0qehw zysLfgzhXb}`p=;Q3_JHs@ZPJ@lEAxl*NOMng(Lk7-z>TL;f_Jv&J7AWsS8d_PRX3O z{oF%muaFL!V9$2)k`mzIt-3d;5}y$5&tAkG}Ij^Fqd^4Z=I7 z+JD?EuA+YBgX&vdw_|7L3q4yoJ%G(R|IWr*#ZZ0uH4f)93N81&+F0ss z``p&;kPT5QYyE$H$Eq+7JKhIcn;Jc@Ur&!oIL!NSTYZ4d>+kz6diEq)DhY)28?1U( zQ5f)SR+J3W75??U%ib2v_O`ffzbB(xB*j2*d*}7^9R^X!Cu0+jKNLM5ZZLJnin!;~ zCEX<#3rwo9w5u$wsLJa(U@m>@+RON`x~sA6%1bX-eUX@woKk<|60i4Oy;ROAvqM(Q z=1tAKY$UN)P5RXIcZ$=tK4Z4Mq5C`5pYzq1%=WkJi@1`fy6kc7hmDJF3pjq|Iv$|??O*1nr@tkh zG?vb1h&$}Vy<@}ea}y+;{O{=rAL)CcKB-%=Gw$FkJ24c{rt6gtg2o=?cGVheRhyi(!3%UI!oKx3xEv8!H?8eh4Gj=Uxj6K3HVRU(B^{&do-0W-5k6qB6 zeU3+D)|Ppn&iY7Sw6Cz~71vs8DtJkK|NqmL3XcU@`t#4_aNeD<;=r^s7xr&jWfs!4 zkNFw*dYgHy8>ic>{l%?k^)6#e-IL4nOx~>$c8}pzzyLxGKmf zL5OiZZ-zp|GqtJF0squ9et3BEdB0nIqRDdJ^pvOlCpU5Q&U@9o^uekR{T{ljDi23W z8tzppiRoLo>#$1`$HH?psbjPcWHewyCk1jn`r&@YR!Y`nC zhZ!r!)!He6moM8Vgsk3q^zk;PyGd3`=f6&GKfONd`Xa#-6~Bzv_4Ug=imci!`j|U6 zJ9A=Iy4Lf?&?MK2qowC2m3Yo$c;{o9Se-9fu)6BHb+f>^Go6cnc4}lUwX(~76@SOY zmqGgwSLP-=g_zHaIdpUbenzgoDeb8F!rcD;(kE}GPi6A(vhsOwXuIf#W&4W#ozv>| zCNe%@;QY_$o9a2|rOu9nKO!FQ>_6vG|BC6jDkt;O+-u3VoKx7sw#7s{iptkLdiXL! za?%11juVOV&m1bg@X2ICedpOtw<~i~j(_g?I_0hD+43Uw%5O8)+xt8S)Nu`u66ftQ zsNmhMTE67th9?HS8>i~cw&sjjAkOl^w4w4;UCPHvu`3le1u6>PdEysVP#ct>Swx~!P`CHF7*W=r! zsRxy2+hxuX-nSwusx@d|;@>AfSDtSFqx)01)g+yLZyE2#XYRdoew}!*zn9_B)ekGr zD)*-R$P%n*@HoEyvr25I@Dq#e-qDZvhO4jNT7BrA{rt*_UWB-?qA`q4CbZR{8*EBeesh^ zTC3g?AD86UQ`)?(zB{Xt*Zt4JovTkz5t_R5*TZX56Fmdmr(T@2$vaSO(VnQ_G#;M^ zYzy6Z0y3ncP1^-E-*0`_lQuyyyN9V%+~Sb`wfDhGnB)K3`nDgraJc#!?;&r~B6GWV z^$BgSq&sCD+?26BSvB=75#=D*(lZ?$X>|Vv6+_FIFujJvo zmrR~WA8MI3cbC+&R2D^szsY=#d)Gf`ngtIlmWbm~$06yxuTr-cIlQ*_z&AP9EG3_A%Pc{#|6hv1yy8 z|G!;UtNz_S)O3_7zMR>4Bcm$| zGu*FVxi>YmbWX;>AA6#MsyNpAD|bi9+T4q)+UeYXy;G#4_knk3&K-L;fsKjN7j$+V z6#aE|jcW3&3iEUauLPe9X4kwt)EEm_#U?CaIxvyP(_r}%$KNX|PQ57lu&_=+@YjaJ zPJ!vK&L^lE)h5<$nIiN?WR+^*vtWk!z$v211!1Ar#dR`vy`0H5t&_F?huK_4v6eqv zp0#fB-;>M2zNPIHz5L?j{C6{+-aO5w8dx6nS$OyIB+eWuX5R%4d*AbLHTH_n{gKF~ zlKkNq&y`mx`WpnM?h>Ya_)EXlwDp1d zM%yAS!M4G+&zzduG%KWSVa%2EXbw$n&GJ)+ z8;$l_9a8sO8JC>5pnLtnObZwOZ(_F?{|E1WZnu4tx^sa~@5&C(9!tHG6Zn6fJ$fNK z-S~-|w&4~2S9cGd`OUp=?V(?H7TMqO`zvO?^w9sj>Bs6gf6jSTC=vfk`IU&Z(7%6s z?uZ3DOEaBg{CsrNkMN_pfmbh{lsRR0YX2qkCAQp>1@HGU+)}gKf1{`9=JdYT`*ug` z?NK{&K}DNMcx#>P_PXxxm&#d`WFAOgy_H(IU+LDfF4>f27JJm)E(ew+6<#(zWHR@h z^S|K-)6cAxc+at zuw1(%OJrNq&f83`I!|u|CN1We^LzU`-J+>i{vVP*a&hZT{+iFSo1?iVIA2)sKc=zT zuD^oE(?bof)4ec4ATFy<1DgC*E-3JF%l{tDcqd?3rEjfAcoI6gZsx zVD^$unM!_@JCkGFf9;b0@?~?%x0Me+?{r!fw?%h;^tCVlyI%iT%^_lL?;LaRPw?Ec zlE>y&m2WFFoftRY?~h5UPJv;f6N~i0*)GQH4Nq1uraG)h5G{Z1?wVs{e2Zn_ro@1m z*W;#5(-bgNn3~dLxT)^b%qNq+`+okN=y&XR((HmN&fS5@#rG`Y4BdV#Kfcj(wyDz6 z^r*v5IXBYP_N;jOWGm0iJ@ZA)=4bv`SLMGXbIH38j;pJbw#amARWH!s`(GzDkta=3 z%V1Z{tHuV-)SC`f;hnqF|9^Tczw+1CXxV)i8+N)()V+Q@sY>GMx+<<+ZhgjfvCG*R zZKs-@68od%pfWM-d(T_CmZvhf}}Z<*Co^iP~K^<=M*Ag4EJkMWL-V$#&c}KjrH(Cg<0xUi4Vz z#$;}(QY-PPrS@09>9iN-O-aj?LbY~Bs68&?cs=Wl$bh3hb;+cBsKiB`dJ1dCG_V3TSmiZd48LHW<3^Y2V%d_8dme=iz zjtt$OQS>Thv!k24f`Hd-P+vCoSS!Ie);^lpX=wJUo9#<%bamnf~~+y_v-SrYv<$U%`acO_4VpX z#@SE4_AqZc_GdOz)GyyveQT8O*4o$~l!@85Gppjsaku{$E|t6gWS^O#TA)9d_fM{V zMSkhtww`%suS*G6O<9r|ExXEqd!G!imAX%A`}8uKDh-Bfo9E9vV$3;JWt?_Cj5mM9>`2j{K1)hhbE|c&sD#bc zh5NpKV6+X`QT1A=BuuG@ud%i=esY3_zpw*~bM0z-nO5}~J(KOT)o?7m+7bo83i1rjdOYV~rfJ-94hGKubO*SmB`_4u=E*I+F+EH`=;l_B0 zXEpyCmjB#q*1q80lZ3B!Pn-|>ww?HE_t&t@XWKl*t^REaooi-a$tra)I`;jD>8HDE zByW2a`ZO8Noh%Zt-y>q%qdnVqd2aaka#oqW_qY3p0%X4(KC7bNU%z^b6W1m>;y#DR%uW3;QuWnzTn(LPt`cl5aH8^)o*NRPU^6YXGr>hs9I>Cpbi z5>ERkxV0X9d~$Zc%o5WnTd&(ZZvJ>RMr9#u_~ov?wnI!)P|ya!%OiUfu& zeB8GDP_xeqpFPhKk23RE@Gam_Ft{C(_``DA9Zfxbr-ITQj9;6xE0lM%zM1frNq5qs z2MN*9tWJtuwY}o<=X|E;xwpoPWb}|2|OvnG?3VW5mPeg9?bbY?{Acfyq zW&RTVmeQ;{E?XyfO9{^{%Qimcp%MM={nd#KwLuZBQ}RyUo8Yu1Uh~9(Y~ywz%lb-} zH<64Hf4>_xh%TOaD%R$H5C7%QaXnu@$*;+h`;*vO>{Kp2FdYqq? z(&r~d2d;ea|IJmI&9|Ek*S5DG^Uv(udQfKVqR5X`Isu(!g`I0`1p5PGR;^+*dfKwo z{oEma$-knX0vmbuZrzy^xNhA_qpNC$Vn7_b3p5yme;yVnrdbLEZT2A-7|H{ zQN|N*LsqP{y|-X>b=a-w%}4c9c&8>TO|@p3pfR7h`R6R&D)C*`lKlxqWin+9PP*=~ zX;O?^_M|g-fBolvlXeKwBT{4ow{7w9hbdVRTo_hNwM8) zx$pCbN0XP%keifyXKMMDJwk>)Ce!TK-oD~9>p=;rzuMfBvd~jgpxYGO5;%LdVX*a`yIwZAM$mYiP z3jg8Qx%DD5cTL7hvA56O-E8&L?9a|!G+najKZhyrv>HjBL)Ta=}-nPpi5)*X*j`|Fx1aTO1BBhaOG1wQkb8 zZPpwQW0s$Js>k;06t!b}7nWx2V`SZ{^_1bqnetZwJ9t0TF#XkjEzbY>=v3|*%$NS` z`)*S+m0y*2%6_97?~pj{ZQBy>vm_}_meg^-9&f*K?HtF%V+Tt#MLA}%U5Ki9alE@f zFShy8yQlm$N3YE}a@iBYH=>z>PZH>g@SR z?2K0PZ+0Ebs*~%vnexZug8t>8xOFN^xr*5JzZV5R+pu+?n|bmbd#MZZ z$C;h9jKA0{9VTzS_Q=el30@PcOFnD(|6j&+^YC?L+v5_hI=3gE>vI)aWht?Te^2jq zKc#d<&Ai*)4=S#iU-WF;>1%aCukYym#{CRWcYAT25V;p~eR+zF85>< ztP=EjTDIdRXXEKP(M4hz2Tz47PAunQ(0=8kmwBpmnfdjn8+Y}m6>>K&E#O$-v+kMa z&fJ<)MM^89M0y__{CWIGNqexYv-@kuPgPXn3fkWX_ zS6jJN-;@tLyi()W-GKFH7__24hyOpa*-~CEP;W=FcX(`UZR~1^=p}C4o1z@pAK#We z@yNln-u2$A(u~Zazg<%#{H~tM3w$^~QQ_%=lZO840S_|ne%<3I$G&vpi~hIfeT&{T zo@)(rYVYfCtG8O(_eApEA?dlQ{uKBZ?y}z#1EHMAfRPWIGI60)nULd+rU3TZL zJD1CvFE6&@@BXqjA-;KgvceBd)m(Q!Q)av6E919Za}^i$GK!DM{j(-gVQoOWrpt_# zwG7W~)AGamSFHZhZKuU%82GJ)XR2l1F%_XxjwVl@_08k?c5Tsg#i-RE*Q#%sxa7vy ztKYsHwGCkiv)Oci`mdhCe+w;-ta$<7^SIAH$hx3i8VipLzTJ^&f#l=}QmkPU&TP z{hOVwX0!h<-5(lS3b&sCqhYfkZdN*BLO=t$bR$7;gc!wrX%d5(T} zwimwaohhCplG?f}VfOWXyYGj-K2&JxW$&A^W{Nm_Rz%(QzMB8buXaaGIq_?f<3EF$ zl1KSd-u?|+H>H~+fARJc2Bvz;zbB^qZ4G^HbnV;SzxJ(M^8`HhU$(I+vYF$f{)%U+ zdZgnahnE+n8HFv{gC~FAtr%4O`)1Ad%wKM%Jx}aTOu3sGzkkBXuBq*-YtFHK&~cuq zIpv+(&X$%Ju6vWFuqDP>*FRq&+qvG%WJS}P)n>PxJALfemRU=S{*ZbuxJbPyd(Z9u zh4=W*Z?|-+yU+abDs$#F#z$dm7wl*KG1cd~oA%A5rBk;o{Jm7)a@niWXsyR9zf?Z| zouZ<0a{;f%mx8ld6?Zk3geU$wc7bc+*6q7EyVyTUE<1VU$nHJ`+q?*kTv@X)<>uob z&BQj=-+R+4eVyk{2*dh&Z5tMq+bY{Q&X}@urt{j|k6xa;-P`0Q?hY%C;HmJRsh~Jb z``RKWCYc#a3pboz9=_*@>Fh~%%^qHTi@D{i`j_75-Sb(k@YBSJ!jaGVv#hT#<<^;b zq3xN!D0|J?Vgb3DJ5J#f;y$b{XY@Y1@WFY(v*&jf-4uUyp`XY9kJvrd?{gNMVtV1t zF@34%>D|tjQ|?U7m$l(~QJ*-;gyY+a-Mlj4U0!d6=bcY6w6#BRX89C8hpu%&0k2A( z-uJsU8mh*|_rA^ydhwBuzwcL?AEVU;w*x{e!X6b``YyF_d~3IK_wo%*=T_<7l^2sK zw?My9W|N)y)tp1yf6bP3OuyNARzT?ZB#Q(YUHu0ar!*$p$M0ij@q3e|(dCya{B4i< zPd?^-rz+$_6kM+gc}K1bdv@>I^@Z}Sr61e3Rb>d+aV6be^7F+Zo_{ItWd3VwUA|z! zogy!^a)HO|#)`@IJxBN#$NgTRGyk|)=;QjlCw*6T?fLiRqwDNz%nZE04qarjiw@h? z|AKd$+>+ZhQd<{f^DPnFyf9wrV8Z;>`*WK7=IXy!Gvn*>Qz+QUx~a?CO_7n=>-X8u zMumbZ9;Qjtxu)!7-cqTY{`KA7pDZh;8(Yj5mkM3ZsIchmv>WSxyL7f(@pfDKW8#(V zV!dXO?vfJgc)s1=eE;%K3)PkOMVB4!)M#%qj#$_q#rglB^fuv`2#1`YS#PHFOioXm zFXOVnP>ls4PITmeKtFramDHe)AwrMIIWNTH9KiJ{qbVC*HV$rv!!k% z+nFEvxI*Bp@|;iarZRlkXHb;xD!aCZO?2FUa9!(5|Id#fAAE4q=0=&SqbKu;8A{6cl%^=&{Wzst zjz4+ror$L!r359FPrrD?))!>&)pc>tlB=qj+uFqvYuLr^-#<6qW`2P_`&pJl59E6u zap!-{xV@reuFgimri&#C=jyqVZ<^V;67^q> zFXTIyF1+QZ=I<2AxodB+tbzW{y(@WR?rZJNnxLe)^3l2jJVkn!{!A`jSIM;DrSAR8 zHi>iJYW9AuSbT6c%VH+(rqU}9->=`$WqEJ9p40&zO_N`xi#R@>Tlq3?-TKSzpV=n2 zDJrhncV2zzUEZ~KCk5rKJlx{<>5}6@%PNN7k5skq2hQOA^g&L9Z_x^YhLz{U_Qa(Y zsw+v%=GVN-#!>!a^-=--)mJ$}rKCEFzD@W%>qFaBoi_y?y!_rX7XDG*7yrdqha9H<+8b9l5f07<)b~t#skeSF^f#!}a);;@s)>u75UdUc!6F`&_(-;ga{^)6d;ZY4g?@+aXVibxd4|@%YVU zU#54nwARS(JIrxLcxv`evGgbJUAxqTCw}+4qu`pPaP`%{$;%hn83j1Su}7W|yzH=i z^Ab0g&-RCxdvzSiUw!iRwxuTm7DbCJTw^>@`SBw$Rjt^>WFe6?3Ld5Dx>MPf9%`C= z^5?fdo?pLw6JEARYUiE=gUy{r(S@Jq#@2rB;`KPn^Pq**Jn__yxnAs_Pyd{?GHkxo zWe3T|QjQlrT2onsFV2>3I?cYVrcL~A&a~4r3d>Vs#B!8pEmXXB=b6mE%b)M3p8d^} z)_t|`$e9<`XV#?c-TL#vVYbF@(aL4g%fEV9Ro>Rw>FuUH;g_#i+mo%bo095KQk>_nnm>J*S532c#pem-u>cCsZq!*xerd; z{$3ZqB(;w7w%FFzl_Kwr@97Ax<4y`%VST}FHv4IgCjQ1Y>444KnD$D}@{((b-{gBx z^Y@wHM-sH=Z$0k*YMRk8UKFAo3b_j zs-w5OUwLYQyv3`PYwea8-1j}GS;~F4p5=0D>hT;|1XK8oO+yc^77?-m%p9;^y9_vwC){${T7tB zGrYg1EL*^+Vio$uU}A0NL{IIMj!B+cAwM~;9p3H{$}ahHmF-%qztOpi4h!sHm7lP^ z^&_LET&x9m*KONfoBIxb=XtyNbn~`0hhz3kuO2O*=oGZl-0yU@+b^SzTl!L!6|*xu zH>q5k{CD5ZnSt?bafjKw9j?fSO_sjv83X|?j@1UQ<+ucEn_0TJ$x3> zEEE$F5a8bRlfh`q+j$2>pM^B>buFBI=aAW#$?}>v9+vLZU1h!8+;PL6UE)lW1=hx$ ze9-rBVYjQ*$;=I^Ocz%jUQlKV%2H3naWzf!dWbtR0|F!l!R>m+Hf=A!c@KwzPa|{9M@KB{1V7- zJbQ71bfc90#nic6>(;Fi(hp{u+#MtP=larqHCaa%&5Q~27x=tR6J4gz#WdyMkyN+m zX7}z!hrN^kxMz~Vsh3sTwAYF1v2XF)*%JD~d%o&_S$6Ta4+N&4?eGh|)>8S#t!ajT zd8Ebzm!v$0jck7V?|<=+`gpOSKXuzai_g8wc{hGyP?zDqK3VZHZ^Vh;+s)N)l-`l4 zPV-&HdThs<13%>~jAOQ6;(Eo)=g{ED7VxD(=R{0nn~3{9fhl({OHRvvZDy1Zyz=GU zV{PVlUb(nFVOg~4Lsie}7o|;$GtDLcCmrjw)9(7oyr@mSJAS?124#7Nc@sP)Td&u+ z!^XlGl~mSz`S$Dc5j^KPykg~N`-{Gt^=VhQ)e|S*zD+;McSf4*Re0}YJx5k^y{Plb z+cj&x#d58x7jR|$bxD2SuJ}ibc5%MF{^4rbjG1$cxW8+KZJV3(kY(YKscWRza>R4( z)t|6jVm#`WeqjC^>j(FC9y~bN^wPp@hi(gp8(9f7Y-RDApseEjDEadw&7OAah#9AH zRTaZ6)EjezSycCYUHs?mrb!1HKFdB~v7PH#)lpol=J`V5$;bUK*2K+Ix$-Cec*yi? z3fa>Syl0*7d~fcnHH~Sk3+h)W_?rIccRfDkaKvhp1CI`$ubjK#+sTZ5<>x%IrpMZM z)lIdKZ{8TEY}t52#DBJ2xBji3bIyU6dy{0AczQTo5;ZkOOm(;`0S>8+C9Se6_ z<|;*fj}_mgz+7QhRK>pU-O^L6TeNMo-e@{K+v0xE*TtiIK zx@!eaoSoSwf1AOfsQK;jfU1H&Zz5;ZWf&dSKA#&fSAu&>^*=7FpO+U~e`{9|zp-k8 zVe9|dNnA!5+B5R*EuFlA$EKmr;L#DY-JP8m*xX&uJFz7DIV`*0qp+f*-GwblmXS-t zgRB1f%S8T_{$k%GTbc%}EHV*>cXu&O_>lbl^Ats~+kv;bGZrj$NgNT20S+r@L|Hd#QY2nH^q#SinghF-<&2- z^m+1ZzFp6UF4m$4^JHho^uESEq3{5s`J0_SF5yr8>1aQC*P<2(QT{`%PCg1-st z)?c$G9${6RCpl|}-`|*x7f(#Jw6|~DZ8G0IS|Ch5%qIBD`Q404+?x+0u z%6bO3O?%AJ<+-1>sNPhcE7M#s$u`{oW#RkQb^A@1JPe&Mf5W!VUh9v>)U+CG>b-r9 z)#0mHuEbZb9=Q!O*bo0POMdZs-}83|Jmw3}>;K}tPvcd=e*dLRybsg_&l=Bv@bZ$n z(y9rY_l25Wcs?zvPh#0+Mx~Shzs8?SVji!J&(dBI{A|vC73*ZoQy1DeAbgpRWG?|5Gd0f6dDj`OI^x`4)4?8E?jR)BE~%nWw+YTy2p& z`k*{%x5{VsZPFSUJ1@O;^LZF{-;7nJ%DT16sB}$le=NhY`l=TKMw7buUSvzQtA}lP zWO^&&t`d7-G3=7N$m;F)%Vua}~8~TXCA_Yu4*iQxChCXFr9xt^UXeSBCR8wIc-+|+6A#rU!}Em z)*3I#Z8)PnU&dP`Ncf|lYV9HED-Zn-vKgF}^j^F|txx{4;NfQy_hjy$|H&Mxbmx!E zgraSe*vjO#7}qN)$e+>LwEfqLS9)@6?^6!_wYzScy*}i;?=L~qtfr7xw-UJYQZ6@Y zYT66^IJIJF;765Q1uxrzm3&G&*X|LpjsCdOa;cue{s$UsBwM@>nD5uQ7(Ssq%l-ce z84bQTF0BvyZ3Tk;enoxQr+wR?XZecG3oj=reGcVxZ}8q&apa8lSBX!brQ*a5ujJk= zO|1GVR9GAz{E0pIP@d~AVHeE;UcJH#oGKIDDrbFbc=OvLv5LK_;P9UcHsKvVt9Eqo zt$8r{_*L&uUzY7SI{AWOlw3$?X3)2{Tc7`HsogW*bc&ji))^@$5vix!lwQy6pEsW^ zdDkuH=-n05m$YlH&-p5!t}U^>x}Cf3-(V1KS@X_!|Kwk~amtUT3s>j-zP?K%?Rwvj*Xy4DQ&YOsH;=*S5AXaND;5+) zU3Hc5(cYYtT_to<_xbxh@vl2hbvEDmbxEVawd|$SqS{b~$3M9K7vJVhi@oBsA#CmI zt{B1jUtilEyKHP)G3l~8chvSs^QVpirZE|;@hZGEwVrW1vb0n31V1oWy*@O<-QD8Q zo9@>2Z$R4c}!leI9x%I>R63#QBZmI&+{H)g>@QdDz*!MkW;uYBi3^D-%p^RQn zOeMEYP&y*EN8;XP&G6Fc*Gm?eax8xGB8ut$l+P-sV;H40pR?6p(DNt=U7>v9#fQV1 z3mZ<=@*d$`Cc*e2JI#gtuE|3w-CmJxhf+=*vIy_I^rlj%=azhq&7E%y+?wH^7BqRX zvoKvhn;eicb@k$pO+FmG-2Se4Z&p0MI?vDK;-BhHQ-(Y9mj_SYh(E#Z1{!{ltS$ z(l*aYS7V!)T(?kDAf~hSndnBD1AokAzRzLaFiH7Da@{t@ zKWVDh7rHn19H?`1k=4`Ev-sBO=q{VMhpTDQArVo>*M7NL-(H*%>UlUd{;PfVTk#Ke zU#IW*k?{P?-t{N8-1x{hdzn|jl+7n+CSEl@^X&Kg!(a0nysilK#9xDRJ8BKJ)G49cR~HY2i}1(Kc`2jG8tX z(^=PD_IUoC9&OFE%4qIA9%JT{~&pw~%@!8^-1#fA?{6EvfVp^C3vJAfnJ~wuH zILBRmdywg$(D|I=UbCA#wlVr^nM^$z@G9tFZTH5nVn^P|>n>>*Ts7|=TWIElJkPi3QX@^5wZ?FslxI0y?g!CW&0kS71`q&Gxu#%nz*#%+KC&a zYSx%PN#NA@k#%ml*6H#j3* z;+k$%@k-8GwBW{stHITC^rSEU?i4x{agX)%;XTu}E5APt`N4I(s9}=<*YDgNzqT3X z-Z}iNfp?YPhUjjuudxELSGBGQ%xb?<=fd;4QK@(Oj3?QJwQKFe3qmd*Y?&tc@@D?V zmmcb^Z#Yd2KDRVfFc@df>JmHsBihS>iD&hW)#WJy4!s+gWjcF1gTvKMI`S(_(^EZt zxFqn=m-u^X_a+t{pHWrzGIGm}sHuO9R;4ytDJ=RRqyD_{;eiDv=>^GOSjw{W9j;DD z7WTTgXztAvhsOCW?@!G<+!QLQk+yHgwtU_VtEvJ2~&MP#_x$|Nn!WS?6DVZ8`t@AG_{`hc^uNNhrKt zv+gykQ|5K$#5T!;3{_K4O(@&(FkO7r>Rz4l@+{DWp#w}*w^qP5sp*e zI$y7oNM3gA#+Y5#umXm z&9J&U;ZRZBkq`VEbNM&>c*GfeWT-Ra3Y@YdzhsuymxZ&gE=l%$cXG$_43W%4^RBNQgh?a6`g+)rppvWelNcklGb`nddr*%FHD#> zhn-y?=nz(QfkNd|@qhRkyrwGJ@LFxhc3H99ofF)#>Bo3{MK+N0mB z&)?j4LV5a6ng3a~TC@J7vF*6u`#f|E~FS=9l(U zdEtHQfA?RVKka|Z{O51HU;Y35|H^;q|M7q1 z_u9XUfA;@r{i6T2pSb@@|7Kq&{?9+n|NZ|D`@j5dsdxDI```Cl#sAj->;LxuQ(fHu zE&sRtzxeO^zx;pa7v;Z>xPJg@n^7xth!~Yq7 zoc(+IZ+PYOiF@P!-Tn9akN^GtX?96<`R|oK&A;>iX?@nd<$uqAo&G!jZ~Pbe(E0;^ z0{$NOAN^_lbNh<;N&hF?C(3u%%l@1Cck`u}$Rz5nO> z&-L&2|ERxQ+wk}Q5Bp>Oo%VD7J^feyDg6cekLMrrU*5lMpRj*Z{kz}#|Ji@#JNa*^ zKmB*n52k;{e~$m2{*C|B{^#{O|9|~o{Y~}n{vYc<|Nr>^&*Jay-~4~lfA7Di|6l)oevg0R{H^leYtQ_Tw!i(as4ITvzAuxe zm!!+=`|-(Y9(Rx9*BhIwxTJRK&ZuFxNtrI@`zLRKM_x9^NtM0puN1BhSlG;NtE&+` zY5G~c2dYOpwz~X0$#J*({+kExe*X76ZS<=+0M>A`V^0}syUT|2%r?d=||XFF%)i0=*!cJSSu0;a@1?o2_np>wW0Ku(yXZ?Cvt| zc3iktfTQP8;kx#6i3R6_|DQkOYo}i#esz6k`yAE@R~YYTF!kyS%jL(u-)<9f^rrq7 z``*ox`*z(w!gqE`-A+bR6E$YVy{u`K-pPskC)$0qIrFFVbMU?8Hjf@i%xN-oJN@s| z&krSAZy(gN(yrH!%|Ac6@{p6|@RD$NwvB*%G+oR-9MpJf0j<-or8Fb)Q?rw9*5MW>1Jc z)jmgN`M_itON zeyeNxU%kcer~bH-`G03>h2-7`sV~az2}%6yio9}VT4jRL;^U74Z+~i;@$|sd)Yq$$ z1zQ=6UWm=V;9lR5=X@+LyxmQxWY^o1Rx*m;C;0i#OL%N0C$!gka_+g{g-^4%R6R3A z?m4jin>01pBU)mAO!IfgRZlxSy22;DE4Mod_27v4O_aqV*m z`_4ti>!(H>oiQs_dVR9dgda2G8Us|;u`fP!a_;HGUx$;^uB86>-y}Bc^U}l%x7E+z zocJe}SI+#YRsOMCEsNK#_oyq?3@tshYNp(e!Q!8)EWU^)jTmO5W#XLW$ zaMR~oO(|V5r?1{W+N{AM?doxRL$zD>zsd7AuwBl7^PcTIuf?vL`K_<^q7n`TrFH+b*?%l#pY!2LkI>^K zJl$o_dgFXIA5yIAj<{uY{I>PM{f(U6(FcU5O?o@QYNdAi2Xl$3`IU`DJzK5rRQ$^4 zy=J<(-0SfJ!}84hN9n9D-z17h@vvIjPfWSnA>=WwBVfkqs1S*t>z%{zX5X5yhCzGo zwL6EMg|pQDP5Qd|>ieJ5a-9{{-l(}~{Q1V#c@rn~Sg91LaBb+iZgS)I_14#X>kGCz z=yUJqK7UT9EP|`2Y0=dm7duzq{=Px{!OjB#-}LUhFNc&J6I- z_?vQYR#KP8jp)9D_{G12ch9Z4@;4_}ony7z9I<5^zF+@z@9q>ACT_J@yR0>jM9%ax zx7dd>X|Dd-e0S-=kf_x)5=GxPKdxD}_@ysL@+$9T4Vz;hM0wa6Z&=WoBwUwv^WGZS z_H98AIQEG=(|M@&Uba6eapOS=m-bU;%fvN`ig%uUrF`?z-WMwpo~Uupm~<}AUEF&1 zt5$#4gh*bY?Q=LICE70c7o2wd#l>k;i&}++@qe%cAD-Y0WkKPGFwY*<5@%LKuT{Hq{qfy%*7W$x(Z?Uk%e{TK?4UyT@3J5Fgluea$wdYHq2)Kd;+r?y_rs1*|qo_^)Yw;LNx6+i$a0 zSd}?G=`V}W?|4`)tg_1cR!69#K~dn$9nysvTAt5K75*@{drX{C|NZY=zqj!(*{U{( zutv>1P;fue;X!kjhQs+w>aACpe+qX5?pd?Dv8D9IBxn00=l^zG3h#((6$>p~9dk|P z&k=8i&IE?Uqn%-Y--^eEY_sP-n0h-tjPGaF5u0#tE1&0bj`C}jH~(dtrO~VGFLilG z(Y5KHRrowtoW6W^o8gYrR`+90sm;B`Z^Sa&L+wvST&#(V=8U%J%}UqWw`(K@au}IU z+5cW^y}C1dlV{4qZTYXSSNEFlpVqT%-u9x*ML97R$MXKpnS9ItTdh@jlSIY0S*5IR z_iTLUw8cJrclfV0rt7bDQYD`>U{6V_z$wtwX&G#Oknb&_;XO?|s_SrLC&aZDyy={2tYx-1; z+w0$2hkGk7W8QMs#dubO&V_lsM>FMb-C$ih<-E!KUC$2(a2L5`9!XsmeSX*HZ2xub zAIcp0wjVUTI@77&)#dmDX6YHF6Mi=PJhV@9xwiW7xqt7oLKM>MQ(rIFjop4pU$wyZ z?^NY85?lYWe6?KD`Rnt?-Gv82jZTG6&Ui8JWZ<-uY`V_JPo8w0|7}lGn7oW!wUD4} zs?s+7BfPEGy0ux?2Kv8UtStXSvoYZRsm^5#GEp0kO0vv|N$9vTZ_<&LIh^OrCL}Jf ze7iWc_{{g>4I6K6oiTmas-nO}ypglpT=fowPAIoZWfwhs$m?ML+b`UP6E^Re?km?3z!T884nRaqyV4 z?55w3S7qL3=GEMLb2@19$*ru;cU^tF-|BwlyxMj5c$gw@wNU&`#u~ZnQUx*#?pmFU zm2|l&Q&O4isQTq`Q%A7v+NrsQtD@PC?K$!Ar3FvMng!k~#BEVO!D`u>jeDja_r}df7)^es8{O9qxWIlJ9TH=1_1^Q{uGTarxeZ0Z0w)e@g*hkB6-iwe^YB4zf^MAU9O}^2c zQ%ma=PRcAd3tH~Wa{Sfn`%KO2LIW;oXR2r??bvs5q1P$X29b;BraqgX{ZPv&XYSjc zUA;eFPj(4vaQ~{4ESVb$>jXmzG^87C z+wE7VAMJS@uN?i@S5|%6SI*Od1r>jN^=8NE>K|8@Ez-Rf+pUphrY?PBo5P3l6{&6I zf0r)kefYlatZCxEu1CB}?uJUP*<5rl=eBe0T#*kZdN~_A`#ShOUt2L@!Pd2I?`*Gs zbPc*~u!repK%`~=|6gxT36zAhl-&8BIfae)SoMT%=bB@_ciN{5Ugf{>ns0w~v%a%} z6F=Yfn&(U*HL|zKbSh*fI5|Mir|3hcv*~9mr zMV6O;{P?z1ojq^)%F@!MA*r|L{Qb@P##476wY>Y_|Bm(BmSd|^ zwd~SW`Zp?nHq25nU)15Y@YU51;&Uc-=jF5(J(ScI`){>M{3~~2nBSEAEAoc&W)5NU z%{wcj|B87ghQz;Zx%_m}rzGC)meQ9ut$wlyoo$_ZanYN=cY7DkF*f0ke0}VKQOb`y zKlkmqvG?3h)oHilv`U{;QGlsr~NOjuzTt@M@Qp&Q5a{K)T(D&y4fB*Q+A(zx8?8`&)DC$EI2;? zubk{(#p6A%reglC)|K}Ic5=kowK_9YGR&`*EtunVj?Jb?=3=11qkrAz4tJI->|8lb zO7ioU&olBa-SE35_dC0b>&)Y}8;r9U_XW=XpIdq0T=7lWvq#g6f825Y_|Rrn>vQ8Y zt63cN4U_u|o(H~U3Uv`Z`^;kR$t`{du1)f3Dtakkeal+yh)mhbRqGz~yuWXnd?d5t zTes%?zZG1bshn;aQI4JmHMU(jXdxt{Y~`S@cro*=v6;Aa`D?D!1RVqA9L2N2Gp;|M zeAZOo>Pd!p&T9<=yUPx@G`IVj`Fl)C-(&DenspU#fD>rPll+EBlrU-JB$~ z!(DM{*dx{OHuD3!ESDRuin3oAeR}GpmA_50f|}MX|Cv&$a^!#Tk`oL?1{`mUqW{aW zS!`M38{YBz=%2?LmZmb6p3Z4iQd;vl zK859(X4LL=0&nuf{{$~);W$5a^Om)$>*rN*zsC8 zD&u_)!#m{)X=9OZvR$(^JXPMbwO+ndykX~!`o8B@-rmJlVoA|+r>L0wdkD{Yp_Epy z{59&@rv);1|1MmA>gu=Yfu1j)7Rp^Lxq0pRg!Q4-8hX{$<~=2McvRW1HTKn7dOZ0w zU+uILW4fuvO+JouJ_hUtj>{9pi?__)rBdqIGe`3{Z|BmRcdULs{IqH-&*l|3lNO3B z*S}(D!W{K^!Y(t#qlxcwf;Rlw;&H)s<$ZB2n-dbQ3)7prGEVxke%60-{GQqEX1-f` z{vkiNT0YhJ?$+|FTk_ofJBpSIa&PDRpVqk{e%^Ze6y=5@^^Am=9ej~yLTOU=>pwSi zT-E7F+2%2U{m#){^&&?jjHLATMIG98r&?v#>Iv7wxC9q**KvJQ>3)^VFYi*LlDlFd z%Mr%s>VA)tx(ar!4BaGa9T8V@$6!K9NKRtd^LsM!-xRLhjS;Hb!}9BCS?m3adqd>& zZyHNItod;3o>tiYV~pD;FE7+N9ihd1H)Uh(>L;BijhJ3fdi8mA*NR;M8}=+TVmnhS zmC)nY!Fp|rV-PFPaf_sb=_{8=-w?I-zQ4mWj(7XA!_Ufv!oI$W4g59h+il%zHR+45 z99XK;zrU)v+-2Tj<9Vy@b|08-t`$A+s=%ME-{+lpactvB$;)qrdn~pW#-{9i#2E5s zf$|x~p1quhq@HAUiT_Sda*i|-n)pw>VbQlttutN|c-OI3P7V;Q4Y_*e;--1W7i`+o zaC1&z_dIQ%)j!MUtS<}F+3@nj#qX2N_r$T)hCLD4QF8qLLDtU2wr`qx_ml*zu~7;U zmJDoM@mhTiv%;64!>w|0Pv1yy z-uC_FN24{$R&uKDDpy4LW-KiF`+2p{v%stORM(_=pLck(@7+0;w^H4z$ zrdl;>xz|1(|C1!zE44U`i`Ou2M`feJUy-^=H`j)A{&I=gc#)+wc#qAehC7>|RNt4& znV=P4Cg2i!d+W&?^5x0q&qJKG4v7C%lsv2ITiEjRPVz?Pgv~OiEw(nTZqCrm=GVEs zN%Oz;J?;Cs%sI0UuHSV~>04jfjx84!PGnSPTgIt=`n->DOLnB3MRn%Ix!3=>Y`vLz zUU6xbfzh?&y@LD|%USL}Qs0&C<#}Gq>y8zh9YbvFGduo(863t=)~Ai)T_k3)<}>Rz zt~HTez+A20wf!ewe14Wj@RgbJtGRb_e9pSZ5j1zphU)X*cXyv{Q`*|Ml}GeV^SeaO zhROVQ-_K5J)Zz+T{{LQ!SjE{j{8#i>Rxp0J%d~x-r_&@}o4tScowPh6wXF5!*&mv< zd>TuIv~(k$Wh!YX*t4AJZry8Z8#v|065Fjef;S)E&LVk^mwlV^ep9)}i=^E-UGsCc ze7*0IvVHdH$fA2+mPguqe8^qIbyA@0&Te@>SLFT*efjO2aM^mX$``vcr|g|_NcB$VHq&IQlnMKr=kLfo@!3B6YnJ}yD|>Z= z^Y2d*pS(O%>NoR6`5(Lw_m}_MQ5h9-{>iP>t`%3SpZ#!I5?jb-F<-9EZ`zTgh0_g# z`grD9-*%PgS}|2(MXF|2vnPZ1(y;1VKYcAHylH1vVcY*lPefnWu2tJ~L)cbPy$1zO z(f^y&o*jJKEqM2cbdSuz`^>2=6M~oU&-x(GH%T@5iRJ7&B38+1o?n00WEkvTUSGO=S=w>H_g4m_5Fc$i$3HY zUT>8aF>OOx18eRBgR0U{jzz1sn;YM}XQpg<>@TC~ks>?A557(A2Xtl}Te-B_H~C^w z{L{yq!gfc7zqaVEpEsqW;dT9$ni(tK^BXg5zo>uIr=a;1@4an-jF)bN@~`KL^?v&J z(xGK4U-aj&{hOzE<%`hwV67PQEvr1Phj|<6ES)E&leu^E{7sFK?(Ns3TM|-Rc>}~1c~f(GU4Y5p2T1*C~XnXbVjPK*KomW z9h;L9FHb#m@|Zq-lWg=1xB9<*8C(}sw{kT+=DR)r)B9^n>ev=id@gxPqLS5xjk_0n#$}(8E}FfRjpbkAic3Yd z3zzI_U|Z4o(1TM{vHPkkx6i^?T90oP^}0DoK0L>z_)>Lpm{#blCvD3rmlhuQ|DW0H z_xoR0E~HGJZMgg6Lc!Bk-1k0nJY%1&>BeIa+x6ddgZUq~|2#9jk{kagiWV(Q{os}w zoVy@9@U@j-z?WOMrq0P`e>quYexLkY4cQf|cDL@1soh$$B>mK_UwxbVZmLzCo?1G? z@y=Rd`MuJ%X z^A96pr7j=qd9Juc({p9=JB{wDzT2)pT2s`Qzmk3MIybHK!$dg-{m=| z^m)GP%Y%@keE;T&thf+sP;*au*S+r5g$C_G(s40IO_a7uRd8!Ak<|8%n6T_Y`{lRk zB3q|#ew~%OQta!|?;AHio>Tqd+#2PEze;7?4iUY_lusRr@XM|;kdJUU^!>)^dyeLF zem+vD*O%m(=f1)5cc^vM#;@-mems%vP%`Ozu2F=b?oU(m_yjrjy-ClSIdU6x4*k3> zpteneXVvdDGYT@DQWXR3_TN&`N`JiNo<{ZSjfr(1Kc0-=A^mzzz3=TyT7MtBT-pBh zmX=*}=)*ddmFs7yw0iy3d9!Zm+?Fq|Bp#l-{wQBbHtp%1-KEz8RfNTlV z>x+L9l`Oir>vF(3rqxmM-va$O3J*P6&c}VdoxNtoiu$!BubkBGiLI?oH<_+6HGr-D zyVIIe8y2xm2*0Ssee3AcGXE1x0jbG-03XPGMTF| zEzVc}l*lXTna%qv|G!0H01 z&2s^lN`;nZ)sa&YsPA&rx%lFD?e>)?fZKlgT2^nYPsw!Yr9awq@wUFTm|zKzekaQt+J#M$i4 z{tMHXK7H&w>%@JSu~qxV618djBQI{8nDBj>uRWvO?X<_+qMt;zT&_r;Z5J)PDWd4t z%BaOw)!JE`WwJsRDC9-1arBrG{aQd%Ymu~!TZse1bXlhjq1m%~Vh->s1@BS_lbO&9tokF1DlI``_K`KtS$mdy?G`}<|#h2_mk}i0y zzh}*NYmG-o!dU+wx_vYLh1AOr2@y#`LR-wXT2ES^V|#FYT4oMc?wX9f=hL%-YgZH; z<(>X^@#ops7wQ`y4Zr{Ft=yyAlD;->E4W1F&6@C_jP*L#r?m@O>e$r6Fv7aGw++v?Ba+NnEyxUp!-{Rh;ol|oT z>B#Q$JpbXJ#4KmqIkh#46V@7@7INLa=2o%j{s7_q+|ti#7JPoE8b1Hnshg8SSDoB5 z+iHp~o6c#G{Z*e^m#p1iwIbB@`Tg1TFWF`o_3o6FPhZ$-|C3cLr<>J9KHpf9Fe!bT8(+EC z#9evo{SHq2%qaK9PqFmclcqiIW~nA})%*KSUpTAzOXJlY@-wrT{hvSNn%_IE<>rxt zR|R!X)~z|fB=YLoBNM5f1(_RP7nyHtF|ZC@SERVNrfoIDDu+ewX_d$OBq9aQWyV(f z`5j#F?xD|X=9QX)d>L*oWvl&;UHfo(rCgl$cFE&@<~$pkjGL!RWmvIVI5ki9NU}Ga zx_4vrja^lBXFdg;%?rC~v-P))h2q`=6W6_EdG^Fxbm?o=w~l8&>WMu5cX_&~gYO#$ zhVyrYE-w9CrhaP93kSo)>EW7DJ2)P`pJ6)J@bC;N{rw&6|BN2%6(#>aQ>STnL2T74 zbLpOZ0}G?=ORu|apJn0DlzuCMZC8F)+*6xPhs2oPyw$E=7TdUc3HP5VU*r8QzTV^c zefx*sT@|ePSK^O~K8 zFLO_9$I6+6Ts(f!h zUew(lyLs0n;Zm;o>s-5QP5CsgPB~Wdevkgz&gWJV{w42ewgBDdCUJ+Y0o z>vY%;GwZ6x8Jpq~<*&yrp7s3O?00=nENi%m{JbCDS3CPjqH%8f&3C?rZ~Y3woIh>k ztUee0;IO%Q?)^`*Cs%I^RbFS7pr&0W|KhO6?8Eo=iwCn=MxQ_N_?v3y5zCFIyoG=6 zG~QJq|G@A^+utRT*Ego@$x>iCGH1`9T0QevfdaX}OO^A!99}uGOv>`k`}S8|i~3fb z_*T!bG4dCiQk&oJpDMRb%gnj+W?kHw@*<9T$~Q|3Q$@|xQdpkN?<}4!v#t1B!nDXG zcQu)VwOH=1QkyILt>uV0bId$#L#43WugX?_aVn9IQ2V#+19QyO`k6Y%J*L!4yjKvv zV^VUysQ9@$qqiTAjIGM?hbPScC+E*S@q4oP^0K2vp;Jy@Dq+05;NF&i<8oU*f4a`M zf8NDEeCO)8HveuiGV(}SP;n)PeaYcBnI@OnzL`!wIAxdqecgX;eW^Pq%vtntGUq#y zIrH8L>TJJParJ*^dr5BEIX1bt{jE7Qe=Q!*TTz%KC^Os1_Ezr%4S&bL<*e_$vQ9ov z57m9>xO~0wtf`AH8zqQ8nDlGn4jn%k(J4D^Q{FuB|Fb#ejLOocmrKH2pM~Z1_WCYL zZ(&SH>z#7fw#4$}>*zIQd*b)*di6g;CT`KZf_o}6^jwbKV)d9EFT>iU|LtN#eInb( z|6N_@PXG9vcf8?>Qu zzpwkZY(F%k$3H!CUdrh=C)*Fb{wyfQbo|i#;PhX!rmR`J?Pu+_XFcVpu_fY*{ z9S`0~yo;YrKR#1T!RUE+k@6YdmNinV`4%0Tc<`|f4^vQ|--pH%L7j(}&3HPIb*6~* z(mtIzx1zu1tSZtrP{01{jO*+}ekvY$){C~SO|IWuS6@-zaJ8*GW8LA^wc*c{D!h;ImcBK+7?}?EzOp`+~#A{9UU1O^0+`KsPDsd3B?y*FIt>)-<-8VxMg>F zG4roa8}H9;^L)FJLEuF|Xrn(@#nqikFMg+fL@zk_c`M(InmNy!wHM4w z<<_|!)&F6=(L|fKoZC*NJWvnkYLl)Kjeg?rjOWMoHTLf%W_uRPRY^rVKgp|pe@gsq z(_K>*jw2OKsUhzg6t0T!)^43WTRUgDnATQH6SIno+xFh8UiT{0NxYC%`X}o-hAYpk zxA~p89$%8TMQ*~Y|L-Dp$7_m)H?QwpyXMoTw3kA6dzM!D{C}19IEL+<)?J5(Um~6N znat|8SiPX!=Ctx1b5^T^j8?y|Z%UC;k+7>_*}Y>kOV+gh8Lhs@e|X94%(i!Q&AP%^ z^XI^ffcxelJI*{l&Tc+eZti^lWwNWiM4eV&FL&zyY<)dEB~@u-kogn8JC_dS#@5|A zDEehB@1AX(Oigwnoqu$eb-bGM-&`qryS!!FG{$>hZZ1tqWhpbhS5(m*eJe}zLiLBW zKjM~b*Pi4ku^{kD>Jqt3&WUYv?lwg_h6P{A|JJlEyYW&;@5?`d<@!fIv)`%iS>F8V zkNy0{{(swLBd@4T?=;ctvfA?Sr^5G8i+gMQy=Hyi>R~Y5vnFcFwz7atJ51vo82Eoa zyd$ypjwomQ-ihy7KNhb}>)ONK8y4xb;8}sr3~lQZhpnya+Iv0sB^AiM5h^%;Y|C-4 zb!w@3|ISOqJTz%8f_G{78T9++m*JaXwGEbev`u+Z; z?&F1dTrb{Eaz3)d_Q6tN*Y?k0l6UTO=LdZ%KRWsJ1Ce71FAiRmJY3*kyPbDc*Up8( z8S#m(TD*1+-!AX@e17HHq(^6-n|rDmck@l!Gxf~W*D9yi-tSM7oG<@bD1U9Rv-O<0 zJIx<#3ShB{vfOxZZLi_%2XD`Cjo;p`)!&X@dbPFf>ff868&`&D3w@+xBzrd&4`Y7B4>_JE`eZ zrDFAdD~I(y`ir)nRd5zQq`tKEbD6ou$}JZp^eWF>@~Guaw^W=kuPZr^T~K_zvcTnC zo^=9jvFvS30`?aJv;%+qdeV9({`Bln)e0*7q)*c=i8Zd?4}F%l_Qsa)-ZYnO0DUY_KK!Ku>s*wxQVJmXG0Umx}I zf{}B$R7REF!YRL=E&LlH>t*%KfaiGL*QWv38pN*KNc!%rd9q`&)SmVB(@f&xHBI8? zlutZ&eO0jxYuf%*JAFb5`aik_uW#kKqb4`~|uN|RWSGDOljl2Nn30k zcP)JDXkWf5CGRB9S+QfR<;M>9XTLid@o3S}dp3)nzn`?+-}hO5eXWk=gpj9`dnR;B zb#HUn_TlR<>B;~2PP%_`bE~*_grCiQ{-37&)ouGP-23SjC#~{Bvw5ei;mXBIYP-!EBUzJA@QfG_^9r`LUC)YCguy!vnB>2h(ec-E6&ub#1@507)UqhF1%FneB~MWyJPGVY#Vk;{3n8uM-1_HXkc zX~`PvFY7*OB$>S8XJ)f4_`Xy;huM2Se_ZtUuUl{P6>7I^ms(UA)AvsL@}q2)8Fk0` zWt~FneIg$}NS^=ck=hDH$yZ8WuBg;z=c#yXNdF@eoRXq<(R5OzjC9knyzf&_T=9Rt zp*k+|+Uh0Zv%YPupCZ0Ob=ES*^~^Pejuq@XFWBi#?9cGMrcfWswI~1Aa?zhg-WGe` z`53pIPV`u@`bv)DEkJ5`cg-u`S#~*A7UbvLe zS5L4oj$L$B*QN_azq4noRuD;({Ubl)Nu+pp`>ibJm}GAARs0*5N|qn}*Kf8?r8NKh zo?CsV!Xnq&q^r)TJ*<>8>(qOj+v*eNFze*L&g%bgXveosTgk)Wq8IL`bTQWQ&z$5M z?wl2PAj()!t&>pO#HNRzC~-r94gr>!hFHJnLBoy&)to8OzUsIyph2y^7`uH&?!Mo4;3EH zRWHprI$LPn8Uux*YcGp*pN2FDg?=;eU3wr$aw=o^`L~Pjc-Ixa;ac3nFyWEA&m*1? zsqHs&-|SfKJx^n5i3;zkZRflt8n5b@rkwvhsmnX&k>4(rOWzH()!y2yP-zydFG+lM z_REK-bG1%*&d|KsEE2z*dzbmsqmr{sW@nrJGm4PZD&V{D^t5tTzzxaA>36^WspisO z#VxkssMjBkgZ#;C3m-_msy!ptxvuNs-ZMQLwuzn&zwcs_db;HoAq8zMoP2dTZZyYsV$FGs?n$J^Xs&b4U2?C1MPRf}d3W{k7cEPgL-} zZpsw@<43~JT6t@Qz22qlaP{44&kJ62C$%-WpIE*_c2miVH~-E(tUP*Lb8S~*e1$IC z@(kt~GgE?O>Ml5XvC6)g%i%rDy8z^DaJ8*2H8H?Q!n# zr`;yIBCY=1TX)jkG-*%LI~#N6cBhM5W`;gE;`l?^`)Bdh$JY$rD#@^@+@%b8Ze(__Lm6=X=C$mhRZ)@^4Sd?p@DJKWx=950IYyVin`x znmXx64-P2mxUD=M;hOYiP5YymRht{<#;IJ@wV(DvcK700YhNfR$7b9qo$Fz9=#z>Lk zC^cN}q}Pz}s?_fKav@RY=kp6qt{qu>-|>^*%aEtl`xY$n4SXEX>k;*>Ilk-9W)`h1 z-R5m|7o5CaluBMP>Ad~Z)?i}8GN+)gWl@S5oq>uhadGX9S_@Y!<1~AAP3Uf@sn8wM z)ot3M`?qmus^hXbYNtjS{yu?abACOqw)ObH|F#Prd;?Y6&${4>%K!jjV7jBT)4C0-=9gd=O4;5 z7XLM?)N-YgC@0rTS@lkSp~G#h9XErxCu?pzb0qy~18W#Ut4LGcpq`K=f11tw_Y`UEgsMP@w|uL4W|AR=6a3cbE-eD%vkhQGJ#>{ zrP6~YdhL(XJQOBRy7Azq`K#y7R}UnY&SMh0=6kICf!%_p4JpS%_n&E+YbxXz6g%Pl zenp}7!=k2B)}JuiWAHrr`0H1pN#=?__>D-LYzul{v1vDw_@ zv)ys-=HfSU6ZPfaxI3_Hd?-3~?TYfMqZ$eG=D**inYicK;j3DKQN2;~lB8K(n2!FF zwefaI>ahM>@%ZuuL$ipjA0kCn#NE`+t_Vt;U1(#>{2_Di%tgj*5#GzA%;nFR7`?PH z*s5xAC#JnuFKzXVzMbCTC#UJpzs=q8=xF^XymG<6U+!2r;ouXk z>xbL#cRGC#c+|h3Ily|#>Xb`a^=uWMhvFmMyuGve|79 z?^61``iz$+*2dfukSu;%U^e;8|92WU{BCrlQ)$EZ zLmyZ#JZ_u2H?+Y%$>pEi;s7t1>jB1#^beefWOv-ye!XhZ5$Ao8 zKXcFgKbIfG+{p6uB!>XNWCM$!SZu8qesc4gA0l#`qj99RKI)v&aUW8r$Tb_}enh`3 z-n!!7?WOK_Hq1Yscl7qMsgokK9vewKp6xlwU81YYi_t3J`AwM%JJ0WB;s3w%>*pgP zS1cO8hIiDs-n-Hv_CkTt`0aZ~#rh)o>w6c^eY8q)2=cDhZ9^fLL?WH*l|G;7U?pPQo$D{a;ML~5m1ygReg zd66hr%2)0Am8mJEX_sOdT^Qc|T9VDiw|Hq!coLA2LV>((j1-4q@SHxT%eE4gA>O-pR`K78cspX~9#13EZ*z{3O zSlqJeV&t#hiY)Duuh%(z&6QldYCG>+t`qq`I+?Eg+`UVqXeZ0!Sq9yK)1tN2x5&SAR{Ym`XmLUCv3+|UZ1y|9^}*le2PZmA-_^mL zzVPSGnbNoCUs3n6)S7qUw!{_4-Rcn z4WIo&H=6si$mbdSseCDGQ}_LuDqd~+QevyVw<^<%8!V4Ds{1X8DXo*fW?bFe-h5%Q z)x77M9_*d=giAv6;CK1wZC3s@dhg0KzOg)dS#vqh?^^$!pV!VV_Beg{u>X0_8yyAT z_|JY|DP4D8H|mr^zUcS2fmZqdU6ky5Yi<^0ALoqdz533=CwaB?xAmISkGgpt(n*_^ z@p^?d@BW{XqQZ7vkxG-uycvgZy{1*3y`@crtjc?sU% z%mqUke}uj{%I@-7_~nl8{}&od-FW%==S1s+Opdedw(uEmtk1k@z}KAW##1n@a@(Sp zRT?MTgSJ~;n(wu$zTU^TQLH3wmTmgPrF*;V#1vd^A7Wuy;mzq}?PJKq)vEvbW4H3_ zW%rVAYJ1&1IfH%QtP_qu=Bb8ubsrqeZN17y`{u;-1c_=mJg@a78RU6yZO0b*}h})th*2Re|pRG z(<%7klsi@--sk%3wN2PBn5YHJ{_pqWDf^X#kDl*Dp1dixv3#*IthG@}@wkfP+S8e# z{Zl;_`fKkusbE?AfP2&K|4j!rvxgfp{E&!A%kZ3)o2#|sVpCJcUM-0mf&b30IVX2A z!lPRAgxXQpi6{Ra6KpavY7w1W>F=1p9m=pk#N}$A*38B%hL4`VTNlP{t+?vp=TWgi zPwhGjD~tTr?Ouu&ip*=>j3pL-ue7+dxvieb`JRT)-Um_>y}nM4o3$pm&t%?O-$&w7 z;;(ZjPHKpfF@KfVzHOb_g}{PTrvFclsm$MbBU>e-^jGIyr`D#-Ju{@v&6vY#|D{jT zzW;--m$=D-MVsR7aya!H4mc<5S@YGtCSw`n&RcUBb|^Ib2tPIZ<)Y%#Vym|%Eo|Jn zE%~p9gU)Q_bhX9a=@*UJ=BHd(^l01Uv@*sYx-Ev=zE`mQnt4UHc2>*$#~dxQuE^wH z5zUz6@tL=OdxhE6$GjH`uFtu$>KqU)oUcOpf(PJ!o7S#oU9l}8)xI$qf7u$sOqxc|fc`Nn;`F^ksc zez+h|#du!)q{@wa^ZvKhQ{UI_Okd6FV6*qEUU^l^+sIsX@tIFH{MuNzq&Hhl$SYuX zeN$0grfNsouVj%ol|oTjHPdgbw7FqZ7CkefGqd_t+$LG3+s8{CGp@NTF1#or>9F{d z;iK@|imeqZw0B?F!zw*t*4<}&wg10LVV)0&v4Fp=Z;-Ibm!Hth?Q@TSq8nD z_}KeHxcUP*TMbSAZYJJSd~@w$KfJr)$TU?uWyjUBRnPLL+?(*P^_`~0RgG_JZX7sP zDw*@x)MjIi>b;0t%lD=far9T5y27@6_mxE~Mtt1Q|E3s~iF~}ga5ZD?nRs)lRUb}F zO!%pCGhr`d#kMfF>n}Dm99{1hC&`+SZ+JXu)70?ZXpLKrm#=WXn#S6v_g8lDQI*n3 z;ddYY_>nc~Qt7Q^(dl<`=1v#CWb#Axh2S?UZ$Vu_{+XgNPd4AXcXitwo<(cJJ3R%b zycJ$_`L)207=yLD#cI=L)vE*u`I@h|DWBzSDqelTSMWf{i9JS4N>8Soyq$XV#J;jQ z^Q|AulH{CO(f9jmpv{RwzxQjFcdc1wwA%gXCxyieD^EYu+488LL$~bz$MZhFKQ+6i zmA#%?=_mB){-I_On|T_m&HQ}?F0ZO?d|z?Qcf<7^2NIH|^BDP9Ml6Uh=-VsG)T|w( zwY9-DRzX0b?(tpcpT!LJT%Tk=sJ)(gPfst`Kl@^Df1TZQX6+=Yq6I z@Hcv9$FE!3yVSY&T8r)7)64ep!Zw4x_pgLiPK!Flo=7z2V3oZdQF!zl=Xw?XTTi!{ zvbUtif7HlYw^FMXInNFUYWVTWRmvbocPH-xo0-=P5R>F3slr%%ln%{Gp(zZuG(AoK;UG8Xj&D^zSvT? zyAkh=Dy`ohWIb}}KBtF(@8e^|am;=S%3GG6H!EXUcR*(cFW($9hMSwNG+&O9IH7!v zN&fup#XW11Q~Ekj{FoqW7thizIO))-mDkczkN>{X+VL)>clE;WE*A@HFJ(Lo*gUbz zZ}EdW!q1jiEH#yujW(PUdW6g6$E=*~>l4G>S*~+kcq1FNH#EK}hUex9(P!2dECmC; zuCobhpI+a;dHEt^%V~RApREnIESV(Y_+wG$f%224n1H}${VIrG$aWt+W<&JSwW zwzJeOd|uTeGMArgU+-a^RhK^P+NT_+)v0CEuJ*2!FQ98R)5@0VorNpCyw6)cS#xN{ z!IP1<{=aPy-CW$f_{EQich8EnCCn{^E@W!?|VS(HEZ{0bcfBt*8+5F6w zdoh)P%)9qLsN>;l7Ce5!knf9m$}_J}=F~R-TPyaS&a8ha?{ea0!wa51Pthqadp8&K z{`Hx(SZIx3b*ND5voE1~bM&g_oqoi*_qJ@tt^cu=Rm|Vc9{n-@R&sQuXW0IwviE1+ zT6khj?y6H-3ydd4Hu|S|3B3NbV1+v4^6MGuw>BK)St7LLp@E>nkDqB;Nrx3)^8MOe zWixj}l11>NiY0y48_PZ&TiSEymc{lsgZikt_s1KoE3AJltXa>N>EOO$i`>V3EP89- zw%-nsGl=@XQXoiywVka*_~6W9lbBnvGaGkjCLXliVl1N|eE8bT8}?tWZL012oRIdl zd9rcjU(K%}nfr{r^D|$#DA~{X;KK0pSAyo@+p2jS?f>)l#4Td0_&tTO*ib^cLFw~~ zUyP||C6!F}u+B6yIPJ0M-?_85-qkT2Jkqc~o=N|j;~BY)@iu~jSN}{btmfH~VGw-c z%D)7$;{CNs2I`Y-6Q#1;BXawvyvSLmy{FZz%jSyxgd(4lyWevxS-{^gk5$m{$~vE= zi&(rCExz4cqGw#w_eS#v;}_G~*neer^?jEWSMi@0($EN=+ppVQ*1hni&Bew7=fbAq z1s@8ZJl0=l^m)d6rHNmYul(ta_;X^~am|WtpU*RWP?7(((nMwZk(M2Hx|`PS-X&1I z%rENlvk;Lw#huEY+6<1bHY;e&3_f`~cT2Lt%9BTzI9YaBhMMlJt=bz}a*@@--}B3Z zUrWn=6+W_`w4ARZtUu?HagwFk0lo)IrX2ZyUFE}vdu4wly<<{KogSvSO>?{)w(c`W zN^FFQxS9gfL$6)4N}C%xrS-_9;S|61^TJ` z@+LHi-X%eUrsBkw$C&BjYix9_?f7O-u8+4tbnZ}Hnnq6~^0hEMBvIv#QKwwiq9=_$20 z)p03IB8nRi{4~p18YlQj-%IM{8akQ3w8LKHl{B(m4;uxXR0c6I4R#=EN-0 zNHjn7MPk1Bw8P;cM>}6nXl|RaxYhh-LXf%z`;))DPhV)Yc*(wAvq|Fovh{)uZyEOY zyf(FrZC_$ut+U@>Cq?Cr`3j!tKC3@8uU^PfWu$AcyQM}!K1qFRrex>M z5U0@zlk6f4XD(JPZ|US$>^8&9JG@wnpYlY4^p8tPBj38uNR+emB-E zXv^@9EPbVahi#g%?G_mwb+KeQ@2^iU{9hk1liRkWym{ss?~GlHffr}azdTiMo$Y#` z;Aht~v@HdkcUi75b=e_cA@1v!V`kP~%^Q%UV18-E&hwK3-b_7x$0&7CzyD?~v!|!7 z1={)X=v0`!J-uc8gJ{m1#92k$3uvr+E-#@`wGt@hG=o`#8& z=V*F7WOPZ)H4m$tGk<%DbNQ^?e;s~HYb#!U6->Q%_f}Eoiywyi?K7^=|Ecra{;$pZ z#7-{d#|@KP&$MsYZ?<;QY;Uo(Yl@jyWL-2e=L-C-xbSY1`}3(k+TY$S`Bt+3`<}qL z#kI57tl7GTN9NzLr3o>!e%2Qku9_U+RFN8Id}J*nqtD~K-LGbO%s-}>B*SJW^ZUKG z;Dqz`mowZGN>@H_7m8qf=lQ4i2uJNd-shWVyREssAuPU9w~!@jv0R4FNw2&$Qu+Vq zKL302!aBwmMf#JidNj*EU)uX7@R-m6owZHUbF)2cV;LpQ?o9B6F zRq^~g67RV_qi4r0mYsQm{O4J^=Df;IOb%b}IDPuP%BkB;4~G=*KAybk(Cx&9Jq)um zFI?kl;FSE|I3w(#ufL0<`+mvRta?$efW=9&M{SgDPf!cxk`IiVfAJ`nXZ+;SUqw!) z>c^OV|9$6Xl^T7Wuj=^=X$|q#H4JKBo#IYzEWavZY%5(RWXfdO#J1p-ReVXKTKPVX zy7NsLhIVclbG=;7^8F0^eT{L4b8bF|e#3{O*Z3RuG4>svyI}2nqt8P` z(hW;P+*FP{eY!^6szU$~qP3yz9bKYLPr?i|AGiE$>Yro_C9+xQ$my8P5IEjj7 z?NVGP$H(_C>GcI}wJWpdy;j%q{=_KfA_Huyz+6UX3+c%lMe=aHF$Wdx+$@LX6}nx z;Gs3`s#v4QLapGplAC@XE6#0bQQgj~F;!IA;C@|U#)J()k~gk&S1vs+;`_zul-fGI zw}q?b-M!c9U=&(vvfAHn=S{b;H5IG%uKP{j_VQA?fk;Le^Q#5R53ick@h*Ag8n5WD16h;gXa_qf7Mi6Re%5R?3qZtolR`hgoO6&zq!Hmr`oqeQ)4e} zcaYTbdfI3l`Bb&$plyrIjPtCw?UeQ`EH%Fynqz1;X?1IL3E-t51~E zd6igewc!TeZzqlutc(E%9a9!u=rvK&+LtbKqH)Q)fOX9uwrcErc+$LNzp9}L6Z<1c z4%sQQ_l221zFf#X>0iblovH<1rPEnWCfG13UTrm;6%o5TPkwoa$xEh%e05J)x!jjt zl(u?Ra(Yh*V}aw2=6eVK8`cK42Wafs89q0DrI@W3zclyBGodSExg?a?D}#aZL!mp>Darf#Ef ze)m-g!)&(SxrN7;Uvq7G=rCO%n7t|d_{H^q{IeY8&Q@t=H}Owhb!fSdV*c|hGV2fB zZ2!(`ZgP8;m21Q-trf3z?|ka*Q}4Fe-LiLmEdSD|yXXEa^;)pe!fKbu;?9da3R@O7 zSv(hZ%+tDcWy!sZ?@Xh2u{mfJMOTh)U_h);~Gw{zgvAt6^B_yHH ziEGQ5X?^_z%vwG1J4ORNp_D@8a9!XVOv|r!C&{eD)tH z;LSY z?eX))M8Ir?W`O}{-CU9vG1?>SDbIs)SK|v z-&s|{qN_o~TRrM?ossaeE>msgw>_uN6(>E8?wRpvv=d&ue<5Y{`ucb z&Ak>at^U1f{)3YK!Vh}pI!~fxgLC}nG=A4T!<#YZ`!n$mdq3Zvkr>{(;icG&kCs0K zpT-ODKNNXq6?QnH?1YVEP+MoI_*sjX*MAdrqQyJ=ly}wi6wNxZxZtk9?9EBH{;Vn% zcI}z#cv<)S-;{o_ePyCoPwrFd{h=|fr{v?ApC;ud=N3l4xw)-nxpEtehLYX6N>$zJ z&u{q?cP$Nb`RmNcdG7NJfneKf$EPPKO{#aRI5JPMt3C5{ILGeOjYWOh2hv1!p6_w# zJ~e4o`J1d;t)D*Zwz+dTEol0zd%G6s?9s3HK5_l>!{FNG*=)LpCon(qI3vaUtw}C$ z2J4@xMswtxUCfxXl@1k7Gn#!!izP(n)k#^qIJSi6YrZQB6nm=vj1$(HAvi6|D712d zyT&0Fn|)?dGbLvyy|hvYT*Y%jVX~O>smyoB?=BRZ6nwS1?Nr2%l&QW3Nq^4luNT?1 z`J1%A_@kFgqUCaJWm;Aof5}{N)$^#OMDpQ-a>uH_iWyfL2ObOBuP^#WTY-5(YFZuSg+i4zC!#rLpyrNl*_=rcY4u>Emy{o2?m zf8V(!w5$F1c(`KD6O%{N&$4vZHwgsSo{(B)p=1>MJ!dXgiMU10Ios90=5A)#QF>=X z;KOB>z1cGkEx+>Kd4q>WipW>Szt!JrB>uJj`C%mVL4oJjyeku0d@6H-Z=L0t-Fv~H z=kVEOQ-gyvwK&*4YyaCc#$9ne@nL!J=?#-a8y?qwd=#f*TX~Vk_ygl#n@6)YAI)Zn zbNDD&QswfxI4hfF=}d-Dw~Jq2ZRAP5*wgW+`F-rFsd)wbs=KR}+;p2){OG9aO05nB zFPE=#wXgB6KYm4J?fw&f1xv(3H=W6y@n!z?3Az#A^F+S4UrNjpejDBUyNf9-^TV4a z7u7$HC-eW}646lpo0j|UkjuWtSz!x>ZAvzuy!PkZ%jodjfU3n)HR2W+$vl7Q9Osp# z9HsrrV4{pwzu;xlAHm(C$?F=p<`pefvpN%=d*NMljDs4R?W}E*aWjrHOqkK2Ei zPB^$RIBEXQxR|f!Htqf&vB8zO;D@R*L%^R5^YelF3pTu1ymRB^&9(m31<5l{B={`a z*87NY*QU>G8{S9+uF$&mnqi-Y_7cPGMZ0CA_H||d-Th^Hhf=-4_Xn$OTQ;h-RMcf1 zT6d-E#39jFZ2=liPPurtN*~|y2G13*rf>^b z-Z(gQE92p*jt0KI9!mu_EP1AVdd6`H&rON>pC(C*noYg)v7%DoiL;1k$g2vT+m|2J zXXsz}DYijQe5(7^Cx@QKU*RiX7*TXwrRl{vv1?bW&4mQ^Dn1FFe==51(Rp`U**?Z~ z_X@x32!Gj@BA)SDKlrZG-4)`8*fyT~Z^K_IyXDZdopW+IEx%7?vOja}^DFmdW}>Vo zp2lC0OEZ;gX4>)mVxZ@`lU6H>9&=o-at)awcegtDVE!z{8+YAXd_}VO<8N-P6w*P zlZ5^5ozz)Vu{XwIn-bsLn{EBMi9i2bJ@fB@S=iyv>VnUgx?JRvk3M?BSMW)*pdp9Q z>NiE3j?FG;?Vg**_f>Jy?O%}#*6rv};duDg*Wl0neF5)nTo{cnu86jYk=NBdH*wo* zkKMcO{xn=A@rHBm;UBG=6`LN%oq18;F@IA;XhY22w+}b%3pmsx@-{X1X8aNE(5^c7 zvw2xQN+#hpkDt6uE0}hndc(E;nk$l556|Baxa8mBDXQga2gQH$JI3a|cJSEZI+c;% zQMLU1=boGfdT3<+@LwB2z@4Lxi4?k>Hc~HJXOkv6A|3BkG zzbrhVQR%PoC4W)oP2I5fSLW$0|N8CGyEctbJ;nPUO*jr8Qqym|H}CWJe|pch+$ncd zjJdR6)*R_7`xm=<3Rsc~7*vn$++}dYCPzsisn6v0k*iPh3U1tbp20lz>yF0S2?MlDLPtsPn z>PGOFomeS$;@ljEHJr-jn`Cp+i`%Z9ZQpMDNjvIM9`oA7=knRd^Zplnv7Ej`ytQ21F@qWAr?h@9 zbeme;_hX>*V&PHBZb&K)8{fo1QrvPTrOYh~PTeb~osHP`1v-z1@_q|^qeWWTqt1Rfy4|cU(Axv_cMM9ST%{Kca zF5A(kr_Ii+<9oZ-=lbG2`JG*vJ8Vv`s8^n{a^{3>FP^`d^zV$UdYe2;WWUXbXrT4cgt`=NqyNZp2Z__)$jsI^HZrdEL@a+E*6{UTt#U*{x ziqkUA8<}&*p4Fcpqjlcl%XRDQ6?6P1OqRUgd*+ULp^u}^88_o22~DY1cX$ zNMfU<);Ey4CT)@4`_p7WLbUnvRhR2cRWE%qby=+T zKGfZsSL1`v@jGS@ocs4Gn`N$fr&yPPzjuL+t?#vM zaT|hutiAW_-OKP!}UKSeF1TT54`Z|WYVz4P-uUi&j7 z1ymSnClt82O`mvs@(SrU7oP{+ef>|0FMgtmy&|8iTK(Y}hWGBVG4tP(d9`l#yJrzM z1%-p(c~)IgxU6mHbM2Sb%7!mVb>%!OR=LD&*u(e5?x)~)r|(u)cQ1qgS%{$GcLMLvv%AbdRs8KXp<2)PH?>+rJ<8Tq)o9 z{0RG+hi<)b-6lS*>|giBezuHk-!^B%+|$!N7}jlBq+GnEaPN%uk9XeNGdUzxyz<|R z!z<(~`-Mvm6>WKE+atO~`mpu!o-X-=+_5aosgFKgm*YP0Sg~c%lx`F2-RC58%b%@^ zIkU?l>3UH_@Dv{RJ5H|+#YDEhTQ*fr%l7!5Syc!9)j3YQh~F~p?(>c*J{Js2Bm_Fs zU-WTRBxKu8jElQ(xbf@929EV7&6l%m6JEzK`S6bAT|u9PTgA3ST$kq&UOMl#wS)j; z&}wC#ozu6>DzZuMzx&75w#e+SXnt0G%T>#?kGqtl)D{GYuHAX)@r?d`GO-KuC8x&S zohbU|a;1F{|M_UkEmL?r{!Bc0zoE=#Bhwz%`}gNB^=*)GDCYm27qdoL+U-JlzI;Eo zT29zMRqxgIUk}YWKZWB{l~kK>^<={}H=mT1Ke3xM>z1tg%{1AJE%_hAV>fRJkS+_F z;Se`NsqpaY-n@x^Ut5l~s9*2Bx1?FIP{#DFy4FEMA$4cB-%C>8rrlJp?n-+)opUS0 zsjS-~$;YMMtbe7PdE>KLylVfn{XE+jv;W=`dGf}) z{vF(NEgE9Ib}e2QDVRI&@6*OZUH{BQZuZ-6(p|4==Q%m)@t1aYZAXEW7OjW%JE}y# zy?Jl(*KJPDvX4nQpIrPBcSNL0-b+X;%{}X&b8l9^Ui$u;DIafp=^cJ0wkOZd-@z?# zm+S+b(8h&Vf953C)!8lo{``Av|Dm|$FW&UsdHJ^bj52%GjHVUr<-eS}YG(M^-nOha zoaA}K?s1}z;(SZKh5X_nG4FGh@as1<*T@-OaBOGXaq3<3{K8(Z32(n1JoGwq*1cyR zS?|vB*`Yc^#%*oLH%9e@hW)9&-)x$kq8jh*xHMzG<~-|H;y)FZL zsYPe!cW|n2FPqI?ck)Bs;?RQ+HgIV?G~c)Pd3LPPSA$@27Mn{Fn~LslNtva@Zj-8f zdqK38x2FA1sZdtUj}2EnUFD}~de8VM6tZu_?M<_tAF;IkS#l~v?jx7l*1e`5b(;9j zFK~IScGPU*4cSGPIDb6R4mNCdV)c)^TJEvK{MNjmO1@w3irxDE{7;}%nuyfBX&GNj z_FY~jJ-7bv*L~kQCQZ!Fdif*eO7bovvBa&;-@T@D`Q3dy<=*REUHAXB29%xXazADM z@PXSwu1luXM(gt*NPem9m-u`3reE89Q8v@}j^0O{T@$uHQV?Vfytb>7BSw~}*_N%+! z9W(7iN?&`gZ7|-@ek*@|&ZLP|Z@UUpmfGy=-I5v1WdHt%`Q>1@lnKV0b6hlT{P(+< zt^SAe>WyWwZ<1!!PrmD_CbMGkpRE0Nrrxhje!u;L%EH61zA&e5o3u0Sa$srz>$E){ z2Ri*8sDuZscpAU$-KnbIg5F834eRzl>Q(h-oL?-cdSd_TnI^xvU)YQPdS$isK9_U( z%}tw2?q@bv%x+-}QJ7p!NPMg4<*706-tHS>s zvBwL=%iK5jR)!o&R!uqQXBvH_^M<&13rCg`*KDb-h<=_9Rae^-`HB;z7k^yzaoP4b zG4znJZH3chXZjmnFS66*r;I<(sc`{$@|0NSEg6wPWd<=Q5 zx#xI5+?j~FEo)`MWt~?>y@+9u+xzab0?fBZl zU7McHQ;Jd-v%D1Z#HrLV<%_f5HSLcP)vIQBePIdO^FdWF;QQmEO$T?Vo@DHFf0}Z5 zLmOk&8t*sy4}Kndo|)8T-Nai{vh9jYHH$~f;erj5&%HQ*;hZV=p#Y`T+j{18uuXHz zlrZgf@9(#hJvZ&?I>YPk-{w4%O*vw$ zX}QgH@6inX^-rG49G&tbX!0%lH_>%Y+R_a1D~et?UQzor#q9#ilOJ_+%Z(4KmI&^x z5xRTq#lMD9f4P&3r=(`HtWK!7s=0?JAh}bA_u^Rr;k%WG1g{-g?D;C>)LVgDzb~J6 z)HGTqA{MDTar5)?vJ)cvmu%?zt)$btfUU^)WN%0L-dTtHWdC#@y<^qPwWQkNSsllT zZYDm1cX^VHN0kNU&bh6y_srLW+Ao#1yR2ELThMcc_0H1dtXZqfcKr)oypFSE>$A3` zoWAWdCOoc)JYwPU;_87o_br-l8$DkNvm?0#(P&iD&6qV?$utg*D0?A7*_o>uBm^pp5wz) z*6tf(D$Oc~?sfBL9ahS`vhn#!dtukiKWrD?%w+8HUyTISTCo+CbO%?e8R$DXJG-(&xN)9>HUX(+So5Kt-XJbKtl1pF zeLe8^jDMo`_h$O;5ILGL%eh(9aA!}_%hx3;U4cSn#qW2fB`n# z&D&~!X83c)><&wPQ}aoZaYm`7YS^utf2=R^Ry^|ej=1r|hlRH?Haa+MR><#Xy$3&u zeOdYO@&AtF)$#U$mpA*#otkNTen;9j!$9RT_W!jqcjmr5@aNij-Gyre)(d{`d-hAx zXOYa|-MkSR5ep^vKc9EkZi05N#c#p&J||DV?0e`Iy79fj_2vryr5?#w4&0jD7W3zZ z>#|F##yN{)15zG%X5L-T;r5|BIp`nX5BublDb-#vWmDbtO&%{P?l{VtH`U;2$fE1~ za#Lz=KYu6~B685zS^S~H&sj-J!|g0r_!rbC?_860-1y3}4{Pt1urc&HwDoFw+Khj*qNFzdrToPj-LEF2-}YKeQi< zy@`AJ(tn~?%!X5!PL+Edw_q+|pHZiLr?DYl=R>+UOD4C#hW`ly&nKDqZ2vuX4R>$5 z&;2mlE2Vr+8YvM|e2Ywcxs0ZFpKx%On_SsqGDlX$`{$zR(-I4(T@YWIcya%O^v(N{ zfBp*nB9gv$v0+%N`p1Z;pCh!7i>$noWvEswy7*q#vYF~h-s-VUKjrc~V?}#EdKqW@ z>b}bGCQi#kcy{a|&fJJ3wXcflNfIg(mtIt`kgO8@eRbO_-gDgRO9J~2W?9bEZJ*=M zwfl2YtiaLS_46Z(pPdy@ViEZ2ykzE~;O;B~_Q~^7vK}WoTk72GKL7k^d)-?>&855h z7S+h=*jdNUJX1D3>+Vt?@wDvSLQ}aGpK}mrbavQt=|oS!rRU463SP!0xMn8L{2Oqi z;m!l;Ow9u!pQHH7R<%a-i7cL6ozY`+Gtr}vX}74>50hy!AH_C3Z9Vm;U+BXNr>?TX zj0CQmw>DCSj_B)d_X(+; zEXK6+<_V*@2~YiNb$OpnHWqVEdhqhO+P5H?2)$c!ylbW#2l5|wyIh#4+VQY2bMJ-s z56?O9P5;VoHsRpr=ZEa4G9KNp)E7H%^sc$}ThZM*2 z`EhKXWc2ZMQ4F`WtZvcGncH1y@sf?v=R+rqgFH{8?G?^@2@}cG#1m z8BY&aAKNqk-n#D*f?Ym!_QnY%=)UKdY-rH~Iu70&gEx0-1!vVp28basS@I=qKIOUny#~r_K z#(Vzy$Jb%Ysn>GM@|jMwaFDiV%9&ZpI}3D0RwSN3aw6q_{gT9!a&JEW4w&QmV)lC9 zFA2{Yetdts=%~f*^vd;4JCz@W9$EMC(ayvDZ+fQr?Pou7Ip{>HebR;3>-O@9MpV00 zSngC1)u z(+u~h@-I`K%ba&7u>AOyx?BBA>LOy+Rw&8sb&0&Q;sDF!)}H4s4@5V8-gV`}eTF&d zng6?Pnz}9QKjEvt@lYDWGzR12dlxs_$gH|=?$w~+l)5)7_T*ck+d;EuyqTTqt|iR5 z_VJ#KUtJSBn&14KQ&udJ&*r>p{k+O4(f>OYC$(4xBpf}~b3wnGad-RKTS^-zc}Q#3 z{Mf!{t^VTmZTXc>Tg=v6iTc*oeDjJynZD?z&z2`Qp1+)YzaS%c)8p^Qr<60?(~wML z@VoG3IginPzJSW|V5W9~W8J(9Wz7t)r>Qr{-)%{F@Pf@HEMAQF+!67AcUD~6<;vLP zcV6@6+X)4tx{o()ntc7Ytfkb=`LFm@m-64-wOl1*v61ih(-pS24{d&={dN08gKzP+ zYWF5Z&un;I_4m-chwH0yBrWcS%=;eV;vLWaXlYc$KJ`w;{&dAPDib1=L-~|h_q^Yo z_FVd>vg1Yry=$=+^SB;Q2Mcqu}m@Y){!$ zO?xV$muJ|eXso&Q^6lEidRCfIvs7OMOt)^bKlp`RHT}r%Wz|9t@A--TRyuQC=h)%T zv%<1w+_{|jZY5iZVSro9EGGT^rjLSm#J=bn}Rs^ZxJ&HjAZV;chmflME$tbA5juIDWW~&-{JFH2cG8Y`gVTRxQ}a zcAkBqIU7T7$HZiT`)pnn+S@a~KFvvEU|}|4pVbhbGyRG2;->#+({b4A2IhS54xXMl6`Etg-J->zPjzPXQXZ(epLQ! zN~Md5EnCO6^%L8Df8TiWWZ|VFcP}TT&tj<2kSIS~{c)DU)XIPVLjV0`let?Mmebkq z``&)vaSO4Uc~+4>ESGNE!PG7u^Z2ZCrSdV8dE1>It&0D@d+nEJY^(1zah+VX)idFc zYS?U5=irII`uVm69oXnOsquDAy0RF9s^?3$Xx(*P1rxsBYx(fucf5zE_^CW@7dst&-c1tNbS)`pwzc`7wQ7sr4*Qwsi~M+E3?s*#FP+#~S66rpJqT;x4(h zEELSx9g|tRn#a}F!HM_iUzMu|inmNzroAOec&^jICA)%Gw*?>FxXnT9lxcW2`6tJ=5r#uy!TXcA>__0+h=C!rw_b~16%^yvj_ z&OU9_QPKQXcHjjI4l@#E&7Y^6yT~gw7RbGv$dk5BL7|?v;=Jqgm`(pXn7k4{ zT9(BJy;QVaGU3}IQ}3|oDfd97d31i$Z*`fGC1 z&x%w`5PR!+{cl8NjiJ<@1+GpZJC|vtbhEYvTrO}mFk3%&hJ?$h&{tDE8P@H8`jlb! z{guy{Qchmo+Tv(B3-L z-Y2Oi^bd(Mm88XTCjRi5c&GEpL)pYXXN$rc6u#BukXBhQzSH6 zw(a>ZE3>+-u2J*&?sVLJb-*`ee@3X#=5+Bo^K(akJemIMvGxJ|?umL;PH#_r%D&bk zqc{KW8IF(oyd0NT8eO=c^f6sRr1rN(@ui#E^PSCw9)F$8eLk|UQ&!V(%hTsSW_)ok zPxv$Yz0Pc&@)<>o?~58-x#0M(X`aENC&xEuTlDJHEOcfoYc8_7(BQORqW5gd+U+mw zpPaOoc|2*IOSYiKF&{;);FG?4Pq5uERho3hZvH9m1&tFEc;^RLZaZ$~StohMyC6jK zz@&(|LYqI=tetf~Bt7840p80~XKPx`bk27=o-ElK9&?^=hupKD>~A&;Zn(8~wrs9N z@Z|J|>^bo(%jchDxUKk9WcusG!UM~0O&&XwE&6Gr!Ly%x68@`t61VyFw-ck~iX)OCMAD8@JXk{5tEB_aZ*aZ=X}U;_QBT zjXTSy{MEJ6HWQfJuk+T{h@=Y0UssYycU--H^>!Pn%JmPH^e$;|+aWQfN%ZQJw}F0f zJbkR*GZq{Tdl+8vd1}z&Xi-$$>yo3pLTAl+B(-=po5<_uF4{3} z%cecsS@(`%g?_wT?&A<^BdzcY`v2MUE={^q<2${OdCMQ!8C#?TTuh#DxX&xzTDfVl z)1s}*OEeFLZ1vvtEm>3alpK$w3{&QW3;b;=8@By_BK4DR&dhcr{**TgHtyy2f4dna z%|9sJwfmuZbjJG~w=1&Na^&v*Rj~74z@bUMiY>TnuDtFk2z1aU4>Dj((46&A}U%wuBaP-6K>0Q=K&;8$H zZNtKI-EYZihn4vp%lw7SLZ!^#2Pvq$b=#6C?`d*E>+x&dXWKgDa=r8xOvMN;=f2oDwZ1=^UphX!g#G*V zrfFK!E3fm!Hpu;sW_<2;>fOhQ);Bkt-hb}nZifr|+%!~0bt6=MB?L>Jxqrzg@uBBM zzDS-p-Yx2vy!So0b?YtfohuycPQ(|_`6d0!;i7f@x%7L5ukR}>ItNQ_H4>7HP~P-@ z_c1jMlk)Y^^{xrltOePQj}9N`UOy#w*B0NmEc+#tX5GsuNv*QcT^siJmR3Q!z=yxA z(Jo!fm8LDbbTDLMwTe(~#{Mri+HWsQlc@dsw#8=NUENLYhRUy_o_?@i+Vtbk%}HW+ z4_x_j;`!A_I#br~$vP-!ky2EVwRHK{FQ>1_3Re6PVs#A9d*lCTVUg;C3dyu>Q9**K z#~0}_AF;VB%WM;{*5j*>`{#{nY^{f7J$WM5Uh}wl-^lM<*rA8Nc()nvczAb)$276% znufW87CGg+c4s803R4?7ED@JT-9zvgD zn;dPctmk`8TfU!1`-t9#%|YuJGNw38f%q5k{Ut}{O0^PFTQPV+7|Vk9dEt9 z`xiuH{dvD^Z^KuO5A#j`AB%h~CitRI%kaX|ok2#;ok|XIz3pGGy*~CXM*4(Y&ehI) z6?T)dzUvq>Nxtk1sZZXw_4|zn7G)D}+Z7`S;{xHXV3u_Ha*o%%y){ z-aS9$a!;|_)c%Ly4oMF2psk&oS9_k_b=>-g(-sGouhY~Lg?7Cyuvj0Ip)8kpXy1cK z|A>3V!fMeGJD#jOrO~SFy=uFf;rr72>_(?gefsIS^W!8Z6_&sj_RfhJtxTQwMApPU zJK?*2&s@gTkK07=6}T-^pZcT8}O z*ZnK>@*AAG9e?s?9eMJpSmn3it;bWtXKUIRX>UFvyyNilo&9f1M0fnR?GgETOiChr zf6+YKjY_rc7sbbd&lI#53cFfgwdnTtUE|x`BG*61HC9cj zAxvSS=e-B%DSqFWK~dU+8m@4`MIx8?C+5AfFcgg~MUZyJ&%4VeUm= z6>mJ3KAoEPDl>ks`bwQiQoPPaFOGdFU$Z97Q+4CaCp!d>cq=ZF{<)-)d*#oiXO`c1 z-;j8?HtgnxkP^wJ1Ld27KKm=iTQ>PDwBr9|!#4AeLDTIXW4X;g zPX~9-D82UMt7Bo5)KN8#dd5W&pEt%Ot@3%|q9>c{wUOWZ)b$U~de<;dJZrMkcggLE zt|DG+FU^h?%3XS=qfn#SHu=l9;5qrK&9n%-fKCQu#@aNgNS;}iSAG%eS%Q8tx znqlRQ3lpQZ@zq4loL^JnSot%g%BU~8;rnLG#V=RRH9h;`WSmvXgoLeM6Zwu6w7!dG;Pd+SR}R z&wrETe^6Ij^_?lv{b!z&!nQ861f+Q)@vmX$5;J?8T%G_tw-&(tq#B?CsC_>m9>nm%7+Kd&;uUvHMyx9+=s4Ua02& zDs9U9F7M2tGco0xWrHfWUY;1WK%m8Zm(|0s0>O2=y?*~sQu=xQS^Rn5BaVJW=gOay z&iw3{aoi~9+SJw^FLnrWFVK;(Xy3eLg_Z|%<_0N-70fr=7d8LUTq&5ETed*x+HdzQ z1up}ZoRW9ah}uzOc65GZ$d9zQturoJhkf{Uai8rg&tSf@{0*1Oz0{XBUu*tTm9MH; zzWKlvpM&mSncElNt5swYwa?pQ$#h?G|MxX+nll}5Ni2NH^vY@F`+t|0iA+{pH0gzd zN2?o~aC=%Z$Dd9I*BAEl&;N6*m;Uxe{yR@y!e)cruKA%$*NGJUKNsuvm5q*lir}3V$&3p(Z?1pyYwhaT zOB%0vxm|Zp+VFF(tcm>Lz|DcD4z^0{t!ud^@n*7XzmZ;Boc{IxN!EK+ESb8ib!4Y{ zv7FfdyC;3==DoW2m$3ZVu={G>+58pnevpb#r>A8p6)k=(^Llz( zv&54nrrkF)+sl-vd)x4{iAR1_xOnJPSf0YEs%=3FmTk(K)oq(LGtXaje(STwo8RBI zBrx)9X^X$<>~q5R=;Vg7%mYWQojs2pRGTo*+HIlIzZYx%9+aKTa*21(0^P3cvp##% z6{m4axI8NTdL#1XRMWulhvCv*>f3ka@~+gs$1cD5jgpr5+nKFL*%npp52#K|RXx2X7O^P4`l^ffM<6y4-%m#ApIWwH^_R@Wo>hl`RljQuy}P4% zQobagNN8LAOy;e2zfL4%MVuE|yE%G!itDXX*Bu`P@{3N}s%6dIrebtKYNL+BMb?1t zMJpDS+P0-!dhllYv~ro=t@o48m-zAq?($1tvyXw(#e>iG|Jm}dvo_a1Oe;CQGV;bE zSqpagPutm#{S>_aVUC>h#>2+fZ(Vc@^K`v%yed=B?yx|Ri=J=Vb%sjQ)W<4czZp4v zKU|v^pA+UWtIwq1@rRi6{7pBL7OC$On_O=aeeHI|2fa(ywV7*zlI+UXet!OMgLmTv zv&oI+Z~J{i+E%-(TV1u8e12_xS5eVlAK&w9rp@0yx#y?&*Q@QzD%A}jg5qgGtFVH$SD=CZC`#-tMxJX4!g za+;r5vfIA4)!(>&RbGaNjy4*Nt{7SO)`@F1d?y}9o0fkQT+fHh{k7btnEGiuPL!oKWy@#r5 zGv2lR`JlG8Gw}}N)YFqED7J_6zet?o)h=K3MnTux-h_{5=XcqU=N=tc@M{A9@r(y6 zm`u!G%r9o-6#uKbP*%VE=W{o^ncx4c$?nrX)@oQ-Wj0|m_mnfc0cIvC;eHZBQCKt`B0C$x02qj@Nl=A&9-JWt5>++d@GortnxMLrcZCp2G_1`dFET+ z!|u#ok=f^!?KEF)yOey}(;a5!VxNWIycCf8wEf7@=7*1?%;yQ)uX=5(rPLg9ap{Dv ztBJo@&-hIHFEID4)D+g28UI*zdk7sAJ#Am}z~k*4U(IHdzaJGIpRiw$Ao^RhS?erDH;tPg+nJz-AO;*h#U@r6F$#i!pp#%%U0UT;Ic*L43`_G*g+uC$5hcE9aR zd>m=kE9!A|#*u1=ZC~QL!fbm#SUpQ?R#;=cIB}`b6up1j7ux^&AoNsa(M9oHK6!c0 zDPMhe-@o?h=VlIOm46=7lzuLmYq&!H@5&@=JGZLNz=)3;Z;w}R{i$tzukP@}kExN) zLL0@m))+eX)?CfH*{M-Aqpsq_4nw2cVr;52@|L)_D?N@*3gbKxyY84qk;^5eWA`1C=~M{f)F{Z>iyq$P5Sm+b6l3@EmY#>TJ*-HO4UzUwA}BD=B#xsFsnubUQBvhA_qReeyyx9L}zvDbie^K+} z_Uie3EtxW&o)t4HvrKFgxj(-%<1tVw$?Q;=We*hw32 zlh92Qy3zu3ip3}X*Lv#enJln!n#t)*xp2;zC8COIj1{7hdw%CBWSjas^psxem?(bg z-1I%K_gpiWZ5sD+ioeS#z4}-0j;U=k*z`o^C`*{6gDn54%g;hAEtFm#i4Z>a{`;y^ z5ssgq8jAYYe_qZaAQ+L!^mWanA1^ACV|{pE%9mcX2qXbt5&`G^XH@eT#1>+du$(XN=g2){86F!#Iig4+t>cf zJf>MY-C@CNja6Yb{XrH#tu&)&SbbJ_DD=!GYkD8gOjc2yqnlNBrLa!=VtrgF{q?** zFFXv^zYNhk=*YQs=7LXqs#W*wfB8L{#bveqCIP0Yw+$}7ZTaoe6&U5Ob?@gqCuNQP z+1{d=ucMw%6p`)~FXv)D>*#OJA*bHSzhGsf!bQiI@6YBb*0d@~-qhJu@LjtxzA@LkXWp3w(anm5cuJs=6d~dDeY~_mb^vPQR~9Ko#=OYS{l-k`u$X;S@E&Z zHA$;YKJ;l`5K>>Tr8#uhLB&g)KLoe_HC^31OYTBQ$A8zn2dOK!#fGRvhn*>V&U;PF zHr+1jVdukQb;GU`+Zl^8+0BEFJa=SlOg-GKDu4PTND%@W3PKAL;Q=?#ooL*ZijDP)fZXwa|LUc&jIPL_6q41 zLZ1)mEr^AAHvK|J4X{aW8Ho7UA?9X5Ge{!WoRaG&F^`B}a5wa4~Y%qeP;uU7N=ow4%%@2g)9 zL~BN03~OH_qu=Qof0KLJl>Dlv$r3k0Ozbpno|F_UI6rS6$F0XFZKj{e{}{XO_Jz}N zN-OHv;y9L=m(Amn|HyIY>4Q}_ZRXE9BPaL%8L33jGL|YUYQZCy}8U)D|U-` z|8walH%d=`|JSQK`_Dd0C(rizj{CEYO9#eXT&}-FTFv>>nPa6sG70Z@9PVv=6)kwP zk}JntDqZ|fhOMt|jLOsF%l{l)Jc;w<%+9VK{2P_hB;VyKG2JU*3ze!gGI3+sK7G%! zQ_KH;2-3Lzyze}lxA$eOM(x9tkh(Uy9o?di}k+l zsdMw0B;J2?=QrV-Y-?>SKfaA<%PiRXa%WN7rTn|cq~x5N1Qo7I^3R&vy57on%CF_$ zc5W~2$}2ZH%#$?5`Cr2^b18d{gvje>U))MOeQz7D`kdo+-~UYitrxme`Igttrt313 zC+>_9G`+U(PNn?ydopt)V{PUh%KE;eE3EBy?A7%vr>*;$!R5M~kx%OD2L=X)38@kC zsR3NfpZ?e?ZSP(Yr!oKQ^y~@oo6I|P!dNv~>(ewcwODQ+WiS+#>UQ{B8u*UaZAV?G z(3+oytI8G|XBZvP;Vh6{hHC1+GcobPL2UY+Apr`|FO(HYdn5w)Ulk{H}}gyYp1R|4;z^R z?(wD_y^*Z&MUltM<*?Eh&OcwP4i?{ zO>%B=SnDybO8PH5_06NB8|MGy$@;LFRdKCsY}nHOc5`3PkxVmYx7!dL)Zu!t{o~Gy zOvlTZL=_i`eslOZ+285o@wpd&d%0J)$jd&QT(l|D?UoEX+ww`%LSE?dJAT&XpHj9Z zaM$B93Ql@IcoVV2>4?o?V|X_ z{-r>NrU1L6>c$ySJTv1~^fs+>{2Ll|G5h_bB~g<6ORoJr@jEW9bfVH> zuDiykxAO8VCJ*tyZ}T4PJoe(#l&Hrhxd{O&%P(I!e7QZ#mFLBtvKE&+7pLs`^QDS$ z=|!D}mrTsdl(yVde#6I<>?*+T`!)5t=k(svW6AHV`?!8zUmTsXAmsCV z5A+c&3yGbzKKo$nnyZ^xiWTG3j@F)Boz@!tG5y((vz=SDK1l`i`o+Dunv!?8k$Hzj zgv^E~eepA2N4{B7C-mTbFXOjFTbcYDFZWvbamG(nW1f@Ov;1VO4twM7oo4fAy;9&w z+%@@F{&6oC#(+<(VYjvBKGwTuUQwtTF0?LZnT>7gKk1;AdxY3p)&;+N<~Z%8&c{@N zgEOB_6#sYf|82f5`J;zQZ@imc_J~Pf^8Sg+QucDY-f9cZvTxjw>$<%DZqCI6)6;T4 zB<}nf?o$2k!vf)V8K(Ce3ZGJH<@#AIzn1i6`#>*V^x)IEi+}7yKXwwmT+nrbFO{`)y{gLobWB1#Ko-++q zm@H4SDbJgnXT5b=zF^Yv845>^S2-)6=r)SKoZpwC^u%bks>a>NVQI$ro(tvI8$_+zb-dlA>N=xJ<7)Y1H$Pt4E!ZGsuEJG+xnT-l;wDd@Aniiu z-m67PTz7Z5s0cq7v<%Tt-;w4Q%RaO=LMfkvsmkFr*1jDaf)c)oY!O=gz>N z3tc~*t4{v2o89TbV|n@6`|WG*ax5!XpOdln{VdtXna`%#CrC{4&%0F=QazUI*--TQg00!v1allbqMpRx-X>B|i`Zf5(MbsI7@@7nl#<$XxbJ+SYy*z*Zu zy*_EP?H=b(@HCyXC1Ii6%lBegf%@7#*0K{kSnYF7MSokHwlKZ+{?wa)XVu^Bi-e|5 z_;-F;?80Lgx2tkxOSq@N`!lauCc*}dH_x|P z{O`W-$Sd!nSo!7E3#0lue#pMd4c+9?wQ~2oNm@HM8L+f$aC!2K_2cpHw|6kBZqI$O zO538_@6yAJBgK6u3*ujC`3V+#|L-(W*;Rhw&>BONxemJ@H;XKBH7dTc!&NY1hrMH3 zr~cFW8lT@^Pnnl*e4P>dLxG|H=_>}oIh;Nb?za@VmwoukU=$Ut!lGB0>9Vu9nFVN;9UYHDn!apY)OQ%h!UoV`unc z4xSKwdueXdzZL&u#7-YL{V8LLk*I2^cdeW<>s-0ZA`vH;TH-HGov-?7ZfeocgG{-%Dh4Hgb>lLU?0dwY^o4=zmU)%|n2*PF|f@j}Oo>7AR~ zI!f+}tbX9Np!)c){?Zib!}Izd-t-XkxvcV~;W>*+XX)zn#YdhO`9J=5_*#C|{K~TA zMaCz*_Bod5ZV%XXI28$VlO!Fbwav*Pw^duD&8;0TPJi5So=bR}bc%EFGK+azr(NkQocYl@ zGIU|@Rs91 zRCjUiSZ{W;Qhk=>xhA2li~J9y9R7A!FM91c(Ynms*yER-cQ8DauyOSNrrgK7CGYS1 z&|ePMKFo?;66$ZX|GfSA&)FH*ueDCS8tn(HGE_&@`VR_)rzw4R8r#5xyxIPKVz3(@7y|aSp{oB_=61Gar{Z_H@ zSHN|nIkT@XPW&y%a8%<7-?K#r*;`WV+g6^hV050~RdxN_xwWjz{fa}al$8G%%_CQ za}O1I=%a6=&D|qaE)T&E$2HW>`I%fp4mu9%B{M%{zS9?rWZfkG9e4 z{L^||9jZr@Ia2M^);K`IF~N+I#-kEG<>{=-W#* zujQKtx-Bx=D`0YB#k=IKOed9vost=Z7Cl>i;!3{``z1a&NfbwDW0v0{Gr!>2`tr?p6kmy{X{owM&gEJwz0Ra=@xx2 zTI%&}`-Z^zt0uBlWv#j~zhUE+cYYH^)|;;MIXiPt?wU(wX*X?un|}Vung4sfUHYSX z<$8S+&L<1C=FSaXQOUHL|L*b6$$O@>i=Od&HeJ^|>ta>p^XXq(iuS2rv@cXR@%%v6 zgpEr|19_gLo4;uI_xgInR@Da{YT=b^IU@GxppW>@o8wt zOxPe*a$n*^X{PwkEeUu2uZq~j_Hi?Z<%NpCjeo*U@4s>3_a27|`#W|Q-#N@uJ@V7> z{+0hV|GuobwRBa0tlQ?ejNdb^ubg4G@ZOAzzYW)YH=MfIX#H~E{X$&^ldq-r2bBG& z&~{6FJ?mO`c85{XRx#5zFOS8FMVxN6V_@9)xbD$z{=nC(lTKy!ZLnj=Tl?$krVYCa zB+8F3pwX3P~%I41(vNP|zeL`E2CsDN1^E2magX@)N zD^=J|e?FtWZKL`XzLII(>>=zrFH{Y+)i%#PYBKNh=^EP|_v^*C2kLZRtL#b+b*$X6Yu3-4q?j_V9XP4_P-RY!_*ro5#hXdqkP={>iWiI zwV_qjs(;;7B9_(kT%T^0|KjPM+~9yuFOI3r_ub03N$$fn#eZoITVlGRCd|C~c+tEs z@5OEu$BReK_3Tco=q)VrGuZXw*yP!cf(;xwYURsc>}50F{yE8AY?k!f*Wub3b{siw z;RhO@*qjpbmbMaPKF_amG3m#efQ@MgIHb;w`01J@lJd zm#2GrR|hHH{rb}2+QkT^jfKw^o<90};#OwU*J*RS|E*`<@Q!nz-V@ye8c!SSIiy%XImamPzmO zT{8bApXK(l;=DRZGp7#L#tY1o^6-7HiM60mcbs+bv=r=cSi3y z7CCqNzJf9p5&chGmX9>G?}azs^}1EMRiD}IY`sx!nbE?n)f?7}++?Ylcyp~qkkRIO zCl4ihoH}34GEFf=%uhjF!kr|d&heZ|q_r2<`dKwacHr9YM zxNB$aMDL9;9DAm2KKkdLze$0W)Sem3o7d~E7M(Ai`h8>Xj%(((gd6tVYQK2uc-aHP zHOp0ZPn15(e=K&l$E@E9yDBseEd2UKrKwZDy-u)}A;Y8QMx>rck#J;@=T~+iE1s45 zSMKasDd~RNrYSh{qVGOSk6RNr*!-z3y0|F^!oN859ey2pnDqATlsjjZd_HVWm6^n3{Ddz8ykmzZU? zeSuGE&e2fL9bLMCT#hR;9X39kZ+M%(e70iE9G3?R?CYwBm_1*sb-x&*}XR>{sx-9?k!!JP^ zUiuZy?;0Nlt6TAT-70ZXtWJ6mDtaUNsjPdP=*m0mUPnbc2A_~q&fv~`oW&P-G2cJ* z>ZI)F#j5pZqyF4BXw1`!Wn!B*DMiZLmvdXhE60?MS39SOr5eV4Fg_ML|6R+PW!!x^ z2h;qXzHiXVI8*nw&`8=|yv%UYuCUIdVXq=X6J&1fh|`|EM5|(E?5&(%bx$LjSb}5A zRQ5k;(oJprlWli}>9*g*UuDGspC_MKeY!|jKTctpMMsYs)1MD7r_PN!R=VxGV0qgI z+ZFSUJzufN(Y(|%vwwlMN94UjP08K=Up1ca6c_#Lvd%-yH}t3@Pka6RPs`5mS?<06 z()h#LLX#$&i!WHE9WB>LzUBJyg@b3}XD4Pbn1^~oU!Ge z6vbH+p4HrZuxe|P@5%g_*=6EWc0c{KuCPVtUDnG^civNqmk+Jkm65F9bw%-qylVR{ z568dTQ1( z*%W88t!+5ckuAZn?A0vqa5+nb*n~XctBX%O47jfQs%7=e$W69QzMMxl&M9&?E{V%B z&DV54@pi#v%gFPmx_XxV6xRF5#lCr$ud>94Ni9=6muuCSPI(^xHkonPQ}e}Ie1(2} zPfKokT6C;<%*<1{U}7KFw3(e*&m0el37IEui+8NT?|s&`pg{k~`P`YQ8BTT|4QANg*}66`C}tgIWc z;R{Dfz`fGTNAjjMpHA9;(zx-#^3&1DC#K5IjpA(BBluFf0=+wsv_nq`sPi%BEhilV*VMe;#t)W%3nLZ zF5SqGI>UFhCG*IveWlh4Y{z?NP2U>3c&)xc>@J>__b%8*@MZiAJHxsDnK-A*)_uai zBAwVD`{&v%xF#^O>*>6U*K}9Jp1ikZyW7llySbOIc^8-Ud4Bq5wL4v(ukGGsfBl0s zyYgd)jI~Uir#nj*-dbx?xL&DkE5k;;yUJe|a>z#>nVo;>zz%`NYRhFeOCB&W>#Ve6 zojT{?LElf>IsM+eQ8kM0Et!U!GLJbqd7u7s`tgOdXTrIyb9XKIxbFD+naN>oRaQQ) z{Cn&Ea?BKc!W;KGYLouSUE5|(v#*TwEZlZ)>9U!}Kc^h6N}sqy_KC%;YJ;yc*Tm{? z(Y>8dArH8zVUQ}h-a&bPP-GB9zUb9ZyU(EWY>9FzpT=#=t9|x9P)!Djq zTV-IR^vj7`pU-kzo&7)l)q|-nIjhbWt+87qZZkzK)qm7h`s1B%Y3ZuSxlASIXXaEqaB+aew-<0tUkW5|KNAt z!l=vJIVbjnJiBM#8!b1*<@9sIV~>{AyS1)k|GbJZKkL|~&7sc&_}N&v4>2dsOXCY)PEi1i9xw%7YajSs%YFQ2KXK+x*?XG?!1}ao+Fy>hEiD-3eU3 zSdOfS|0n8^(ZF@1QY73O{qSJPB|SG!2i_NH&$QpIw8*ej z;^bV>XUmi${^xmM*`|86h^r0t&sytqCyN9!3C2Vzem3vi!{+#-t?%2)+3#Gk;*M-d z4?8So&w4E`zGE-jxjCDB4)6TW)+6v=#l2!%D+|-PzF9|;9vI7So*}}`@pMMX!C6xy z-d#7mTJ`nKN9X@n*3aGiTwl`Ucf0qV*EjE5?=1UvuzsS3)RC5BH!izAQqgW|Tzqf$ z2G;7|Q$6kPYgKJKy_h9$+g#pF4`!Fle-fmpET8AobvsH~^J8b1O^m-Co0|Uf)cAcu zT1s0t@op8qDrUpEpgLlaoa|Dq%QY53C7dhV8J>c^9r)-#BULC{cE# zvvqNh&I6NjS4=f<{ex-GBnTb65jTm4Sg1^l@7@xn>xMp_lUUn$ib{Y?-&iaOB z#wjNby4*Op^U+e9R(2Q1iDlD+!}R?M7G`&Eev-FRVS3`G>31ETGs;zP@V}jZ$Aa(l z%2;vHjW4y&>t2WnY-(A(L{%!rZl1Q4u5js}*cc<*i3=ioHRWbX-TZb_BJ%X|@V4Ww zAD!ibMNb`kB=cua(XsXkH@cQ|8XTDwH-mA;?bYwDdzIZ&=Cw#)_ik_9tLtWOS}Xsq z-|l+mSj73)ci;A(nrC^oY9Z@f{*<$7`4%p*4_{Q=nwGO-b^FcA_9F+Hn6G&;Wh}}# z{BSFmlr(Qe^gP%7ib;;ERj+whUCDaPw}}1v(+xRFNjw`EXSue&E1a7X|1^H#v>#q8 z>)5iUiyrJy34bt=MRvWKS;X6%n5;KamUF&L-g$cW-1STgFAL7tnbY4meck&-Qd!Y% z5B6#NoE*wpxm_rjS!BnbuWO^U)XFom0uKgH_^6#~Q?-|iVZTu|&%dcB1h-cyM#xEFSM^I>Ug z|GPd4;qCMGPYsXTDflwHd9v=74pDg?c`5!Ez2ZEnua*U7t1IxaUOsYIb5ldukweeE zd~W#eR~%XSezwKDsa9J)_*!^IB(-cl71^tH-S+1H6AMb(wRbF?yUR%H*vI!5wn!&1 zc+9K)ut?uTz5n_X)f?FmXy-fKIQ^ z);w|{@3B|izH5SUa4Zg5@``@-_11t;kSx&Wo2rQ45L)F z3PeB5w0%9>LVmXFLDQ^Pw?%lQBT`qpt7QEA_Vr|q#VfzElv%%vJ|-Cm__3AF4!^T5 zEhofjmhsgB#m~34}Rq`Zz5{~^?j^X&ZuwBo7kgdchj`$Rs38_M+^fxch0-D zaQ|}aHy^Kj6JZf_nzhuS>ENr5sOt|d#@_ktx!Jzz%oGV$g+0|<8MbUW(ZSp>E3wr7 z&ywj=au=^DGu$FJ>9!ny;=@;WzwtBbEnyFiPUJZ)r!BH^(P~kT2qy_w_53^DcWYgP zEpyICrfiEnz!q`ADng1?*F^Mr_>1=+zMuUTvQ=Mk{%huP*UW8?CH4wEJ2!VzZ$!l_ zI}1)e4z5+ndq1XaEYQ&?wYhiF7!yX z@3r#bBYu95%A8$9uO07S{8;_wp9K;ORYjaSUmT@xe3HA7ebnkm#cuse8L}$nPbM|q zcx69N z2;ca9_00k6C(pZQoLjbe`SukIU)SI6?u)53TasqB@lXGZBjIQc6)2EM*jkyyRx5dbQuOUDKs2D z8qKnAYVwuqo(h-ti%+^3CVKS2@yM{-pfRS-O`dUwxsp ztlWL-|F+mQ{_+VjLj7U4q!--dP`w}e?T5>WrwjJpy5zq)c&CC$T&u8{I)54yZu0L?mr{PcX%2hsn}-T21`Iwcy<0A5JnUO<<&dAg ze)*=`>21{^os;Kj+%YYZ&W-7>+V^AEXU+4I&c|%$)R|J-WpK`V&+NHf>YQ_ScU)@Z z==v}#sM}!X>SK>Z_q}ny)1frw{rB`^FSooov0+mcciB7Hcgd$0$De0?leceeW_m|N z+NJ8pHIn;hJm+%dTl1CW%Uh|k8J}ln&$+^Ja;|Vic>C=96ib$wua8K)5q8`tlC;w$ z>Xf^^)gz(G;|C92Zx5CJp}I5e$)_htJv&TOmvoxEE9;q}Q^Fj&zwGGLnu&)MhtQ(k!_TKmqKNv2OWzEHg6^jl0PPdlvMe9`-beLAlb+uYX7xSO#kVAD5#)^`&= zSQVd(&dh%%B9j>IBbm5<(Zmq{g42nWChDAL8QvW$3cAf^8=_{n_w2f_k0*$JD0m&< zKIMA*_s!~lXOUn#^wd%sMe;cAV+QpNrNv?4Q5s?JX`-m3_A7f1h;Ed(Xz( z-TCm`hKD;=zkl;B(c!2}?z72PGn_76G$~ofmNRwfhmUIuQXXubntVzp`MHDikFfSm@-s2vhDKRJz;p(YyYl@B2HNkoJnUW=k(Ioep;|A%M)dz%)yMse z|1)4Ot3!a_Zk;!V7J)v$zfsx+kt|hK%TbbRjIexvNC!A8n{7Y`l*16p~*aL4L zY1(J_M6r2A?a9S&@9au?sPN$#zl|RM7A^HxyACMjzK)$SJ?>(SqGzDwRR+P1|26Rn zT5>x#vs(Q=wln`HtFoJ^dHQ^5?{&YviL(E>aq1S=&kyVVP3>D8;{AxXbd3-5loe(V zwtaL9QhUAUz5VV`kBc^OANme=ORVsec5?6Ce`&=k-jzR>7k;$2ned0HSVk&2Z-c6w zUXkebPO%Bmv~HgUe<_Z8lMwj8fjJf~k>D8S{L z*gY-Z@BpW0amd*)ONC3_ht(vxcz<8yyU@RZecg#y^BHb1E$J$AURbZOogwh$%B_*d z?H@6$G_P4GxvTAJ*ve(Sm4**?y>fW6_D0PTrTz-%VuygrRg(K39y6~qk+9b7FZzD# zw6%6XiN!&WD$zxsZDMoM30)~`)3wogdh;+PaR z+t9N>Xvu98^uzNJ~d zZTI8X-}om~RX%#+V{^f}Y(?Yyrk+BpsYhAfef3inS@~6=^#0?V8O0B-GyUYda9$uG z$tZ8#?}Woei%vEX4g$Pv7(WCX_Z&3LC@rB zd;8ZKO8OC-_||T3ZC&>4{I!4g-*J4j`LO!(aaW!EJ1g$=X-A4%Z+iaNEJW$}#QSck zY?l5CGh3c&`wKmNqbPO3iji5eH|wR_;pPpi|4$7`{i66;vN~~XTb-o%y>Nf$g{iCz z3pMTC-oGu}ynD^`z*!qD!~dP_Tg>rP{nn)B+biZi`KI|3x~&l9&E+^W0a<(t3> zf@@s2wVastehc3r{SCDbKk#w#PCoN~&ceRcf4O4p?yQ}s9Ukp_nk&NS^piast=3K0 z5d2`Dz^iI8N%f?O6aOq0NxHxhueC5)&Vu2%g>1^sV2M*7N*C{4y=jj8Ocsv5O?iF5cRxS>88z3{=bkwPnpf%Rr7iS6df9d1ZsCNE zna}6w$}VCtdGNyK=M;`W+0LIPHCIiZzipE_zj=*ryZ!EFH}z*TCi*KJ>)|ad?kv-O zdA)S5)6+oh+N8$Z`m8z6nU|{Xab3kJHgSi~x@EpQ@8^Ax>_5qA9Kf_I_Rrt@hVQOl z;r}z+)@-q&J$*Vp*2ectn^Rq3c5$2R`r zr@v;mx|T3*s6QI!$p10-f$o)flW)@tV%~h;o4riw`r6-z7u)COe^>IVi=XTNs@Yj2 z^Vwqk^|#e6lMjX@a6e+${C}0uyF-iyLG>|m2k$c9RQ{N~wkhVG`-^uD4_0yqz0u!u z=G9xpuiuv)3tRpqg;_QJ%C?)n-czT1I54fcPwVvtN$VG#vllUayKp++$KpcrHTz4R zj!j;Qnu2k&)J?-@9F7-wwE6?PEZ^a$d(=*aJX>b+diBcl)t5C-&1_S5OPQBz6=(0@ zFU0lXh*i{b&!4}0+m@CupZB+Bw&1&IrCZE>etr;acd6{}zOMV!X{-MJFd2<_(Lm8I zDem1TN}Ehfm~K0H_SyEYoMZ30Z#lE!r>dtjENecS+8U+*00;JOSX8^E3xAAwB0x4mA~F-`~Gf!Ecd*G zbtg>t?A`>}q`U0dJ^yCl{K=8a0v5T7@y_#@URM>a^|}f`LuZ-Ls(H1h&8kcPtDU~2*CBH9ha=bNz5C+o9^}m1r?UJ1C&gfo zYnM+2Z7s6SdogRR%8t^#Ju`B%ZGZf;H}g?V_5Ko^~&)!dEH8;vv#W<*$X>a;2 zRHJ9+XDze-_b1s~%YGYelY0AG!S2oW>5jizZ{(lK^gTc6dUTX=%eRcf*CaZb?ajB$ zZ}=`DzH9x2ouT*I!}DFlbYFhg-^%^2{+5J#RlTKww=h@Tjr#RGAD6SRZ{&M$Ack!f zpTorx8*Y#5AJ1&|j4k-+TCtp)>C(p=<_pCelLX(a*moxWV9^o|yZF^F4@h0n+OPUb zUHdDGP1GgFXC?14CBt^}X;;)gy?xZ-tEPZP7_)u2H)mZgG0*kj zj6x5SKU-EzzRYwbc1?D{sSIahxuxs5jg6A6GZz)uO<1w5l`H*_L0&1l--BZ}?d+07 z55+%u@XIPO;)l6k*|Dh^&3`V*OpLw!ok?1di}7m9(TI&UkBgtL{(NBl#mgF9&)i#* z4nB5QeY$!bx4QUtkHVLiwfHzDeo#KyKWpc)nVriHdb6c%n8vh-XMxz4GKI$cw%cEK zn;cK+K4SU!Q(E8m?Wga#toab%(!pNQob!8f+@iCQY2PJHnUxnbPV$QVl>7IPHFsYwU6$$nO5F%!eTym{`j{Nx2C-kkirkCCkjObq)^vBj;w!=q4CUC+HP z$x}~x>#qV0>Cg|;9zJGzE^3}O?a|e%FI&0x@!R=v6y)Y@Z~N|Z-A?`E|MwSk?@!MD z8>k)Ty!pt)4+0w>nTVWx(iBtYe`p6EPjRTr+m2mb=btj4*N(j382Gk-f9={cPd-*% zQ;FQT;mqphYa7&;%Q7;GGRAXrJBvrxt?qZa$Q4|d;aSsax-mWQ{Ojen6E3MOmMT`5 zZoK_D=Ys9?R{g({{-xrkq?wT9r!Dv1adk5PJHBOavP;r+zRg$v?O9xT>elk7DSu^I z>YA$N&T@X>8k6|=#w}r9-aThsT=QzV)1PH@ET55D?6J>a|Ke#YE^V0nzcu#5J`QGv zWpeRKo0SE>z0nh%+Y%sqX!!;C8lx{qUS3Lmx2mskvTNn#_NMypY(_V?afo;)R5+Ro z)UA)W$Z<+dBErX&bD;{?iZ)4AneHUrn|wxM8ZGHldn3G)*FHac#KY#*330Cj3&g)B zPm=6@cE+TB!;e7bE$RDxHBXe*&pH`jv%j@0W^Jz0N$EegGRu1t&;RU*7Q6g?Q>+-v zvfCw*9}lapeponJz}83QFTd|mr}rnB)7ql0uk@MovTj-Azd*)70sV6GzA1dqG~W6A zn|Jm1y+V#Zms8fAni-?^_*7PhMEHVvom%sBBorFiV&5*>Q2OlL-kC+K=H8WLs!hmH zQsQ68W%Q^-uKr`&tqFyD70-TK_9|n>kB6na}5;)Aw&mU7VRm&McbM zE3f1EaJhfI&R&tNJ5?s~81P5bp2)wxb-%Vxyuc-%9d(Z3HHz0)s#}H4azAHM>b~$> z$Nf`%>=`TT51fdwo+2peF1yE_L3qwbnXL=9x`maqf7ae*JGr0tSM3?E}?Vk{*E)-B<@^3xmKrj8tcj_uJ!(_KKw3Sx_sIt!;S?r z3T^-0Wn|YDF*Z&!&}wCvIblxYgSQ7CC0H#uw8MSsx{dA5!3sxiC@H7T{817%b3L;b zPeF2XT1nf^syW5&%Xe>MIVlsq>HD$dBeqlRmMW&b-n9H;PS?#I6N_pE<=6hkua=4* ze04%OPxz(trEHPa?|J6Mo)uZJr~B*=r|o~=+?D?EZNs9Bqa1UMDp^hJm!Dei+QoD{ zM4dGb`Wg|4cr7K>tZv^wNqdNy~1%n7v$o z{SF6NZ&UbjKskQ>Ti0*loYR-LoQ*m>cY1+BB+t&=U5ww3XRlU%WBxzm`unEeABA~0 zMosxV>-?9*i;wkYbqPJ1)YX)^eYwkzZ|&AgJKgTaeX>4PYgKzdS7Pp)zmp#&VwNCNR%EzZlRwbXAcl*&4E~mD-@aiZd?%dT1_qP8Ot>akbbD@KKt-_Hj zhMdQ;OX^g!Ue9aNJyQK9*m#H7Hx~1Y*RS2|3_9H)p8o25V$zix0rSmwOul8Z%tpuh zC=>7MsF`&NPL-t^>WlIekJLmf=B+iKK6&co#eS^y%$s)`9r)S$;MJV!>}^}?rQoY+_%|DbJ zTFSHR+=_npuIm7+o+e7nJwiPiwp8ic{ z^BaaELJ#hJu=Q*8pU4_5e5CVurANGa>(@|@E0I+`7R*bZ`EF(nsTFHc&Fg;J9N2v2 zw>;N$*LQ9`XTK*JbrofazFc(f#5Cs|%Lb1p*LPa%n7-hLBX@68d$haqQ}PncyP9D|s_>&hgU^tCpBwc`o_3%b&TBC*F9AS!mSiwi$XWFEF>W zJNI_}|Bx;}ojvE!@7S*OmCxJ+XWi$P`|iE&v-3^flLdZKlH$*w%l=%hf3@)c2j}ed__kf{;a(>6@=h<$+9xx&Z4xSx`>{5L zOLN=l!+~q|J`q)C;%qbZIhR)mFJ6MD8wcf;c!?mz2l z0w*f0KO?}x+EHfWx%axnXSp?B4&Of7rN3nFt&Yw=5mnb@19YdyC2Th^&zXJrJEyq8 z-ld@rcRo1Ir<}Vy_g#m^@fi(niVLjYzxfu#Zz*@@WUEDX+Rf#bUlt!a`KI^nYMI3O zlg!yWHQaZZy6Qjk94~W zrU*aw?yZiFXqa=c@9&x&k9t*w8mC=TH)N4il;)XY!gkGB$!giDe}5M4I`wGgp&3)s9Yn*Bh_+V$iXmY!by>rQEpT7GL)BDs;eCBna?>vP}TbM z34K?wgNl!row1u~vC7p!K50s`^8>GCo!2!5F0YRe`j;ZpzKpTxFKffCZ}IHHw@SZ# zxv~3V@==~ubt&^dl|PSPS8t$qvD3!vi?%%9LAe!&I1`r4I4#v%Sn^pY^2NjAO>5q} zJ~vi=X%KznP)?fL4ws2KYtGs({Tvs!ljZ-r%cTJUUy7ucf6~sX-oJQ}(WS2opM8G6 zE>32_(s$e9Sww4HfB(8wytuiG_r$DE&irY{&p9f0rt%rPZ1n1wk-oq+i+&1axmCyG#6xChi%LopW8LhPFQ<_%-)_eFLIYO zIzC$JT*>w9Ud+DYvSP-21z~oLm)z`fOA}77mfrY(cJkg%!HneClL_II#TQJ}s>z)= zH{xad-Xl#nO~oAfE6*SGVZZh9`0<@zZ&~Xzr=D@&bNk&w4X2j7J9o##yl>rmba8H$ z#mCu(yVqD(rY$#_B57Fo{0_JB*6W_FJi20gp9y?kTI7^)^N7ofQvcT`M}J*9aqPU< z#qD~6lk6)QMQ<!wP+|Ew zcT@h9+RurXkA6QSVe&R`WmV4+6H7(ct23+qtPA331TC1l!~6!(zcYYGQ%37>x}Et#Jl zSd_Z|>!Zg;3a2kv6}w0*jGD=G=!@4ugMZ(Ye%{;VYW~87N!e=lhm~S48vielnNxSO zWc~aPXN~;VN33z-+FZWP^}Viv;@y*xHTknPNC=0g)f>$D?egr3?BQFpS1g~@e^n%1 zpspg;B>TXFM{6YKTv1fjQ@^%biKRPKL*O* z_Or{8oKt4`=-B4SlfTa{)1E5)TFjuvOy<=gVRx>N3*X26bd_JO>bL*Ls*}$X&MQo{ zzrB@X@{hY>lWq!yN{V=HKDW=f{9)CWU*$3j=gEm?cJ0q#>#CVQkzsWzc#oE3%zIr}NV%x1(Q&$<(N?v_!a0%Zf zW5EEmYPa^^Jn|}aJReME#OQtVSGsaFTf|H8plNQ3ebjf}%v&l4PHv5L4eX8BDC+&W zW0lSFdBs6f3}xAfS_goZICAT^qS6{O;x@o!KpS)SS&H0pi|380`+Gn4n zC02auafW{L-%ZSk+m<^lXyQ1KWmfLp)wu5W<-5`%%V+4ZPLH3q&f(c^QNdoJI3|(4 z+%I>mLglx-*Z$2gg)!rM`ZDH*vd0;*jOVW&k)Iv^xbeRZ!|pi`R?2<1Vc8>I7v#5O z=A?BAEq52H{M7Pk;5f>|Z+H6RscGdO8kG7~Ha4hgKuRYRrGR)MUolm(y5| zaMx=T?Y-RoSvAmDrDbtvaASjROIYzORT+z>WqWV8s~dy;ebK&UzG02zrtKBXPnKVm zPHUOUXz?YJYcfNsg-`C=gp&vUaFxxw^e$TZaYX~Ceyp(Y3t5))0)k6U3MsqZkXpYa z_rm3bDb8PRXC3!Y3r)Y3EOtMqtTbrF`6ETbGb^uOySD4}C1(G^CC3j3Ka}})XuHRw zT=Qu+IYRia&F8L?=Q#B%=d?S^1cqQODV2RG4E&F{gg$JkPhu*T`^0iJlK1|-rVWWo z67HHD3lA@B5Vtq{KD^6jjtN?Z&Yr#SzW9pU?Fyin!7@$Ow;Zj>%P)e-fX zY401+f=#wrGZo+ZPW|!G)aB>TwDx%xN3_^`4K`bBdt746BmMX8;y~x-$@%w`ZT;me zruBcHGTUEZ-LvXG+0&s0Eba4-x>zmNTf%tan~nLJP0Kd_^?EB(U3X3MLPWVosV7!~VOw=d;p*sOm)o`Lt{K1Sb1tapmF z)heG!?|WtZ>);Yc)sy|-DsPGYJ?QNzEw%H(0lwotnXhA%l$>&0i*ly4{7{>=^0w=S zbtm@SWAnFiZMvIyBag}0fV=B|$#1Q;+>@HR&0PW#+ryXc=!zEKyz=YM1sJsgZXkPV|C3%-%)~`zp*_V8+m7J3%zBnkK zFX$KT>rooH_Qc{(CpNMNUvu&g%KZ2B*PEvH(+u8w@7nX*R#=tW%rfz;&8|JO$@fE> z`%4y{*@~j$QyPZNqD`@%_Pi;&*w5>B zCTRbKhrI{w7BQD?d-l~}zWlzz8C)M4f7NyzT&op(b$NqZu)L?y|BJT%4#8nu?k2u7 zXKFj`*>AgN!M`j1)1S7;Eqd^{wR?5$yzrP@!JoPgiYzCy4nE5DkNe#7pfIdDQS7bX zCPk?*vz5V%Rd-p1Zf-ag8EWq8D85em$lQiKU+N45vbJu$=)IvPj6wbukHNn)9ljG( zSBjim&~lR@a>YO8?3!;9-ySmDnCjunytz{R{4s0mm&})Uo5`*B3^EXvKjk?6o+h`G zxks2%rJ>&T?R7H_cjXC5?7r(J@X5VX;Gq5YtRH9QcIQoLd0OwuV#(;Hed4}T)dOMK zhXU3eL?h|{mULV)octJ(QwutM|!i{Sq+E_J$lj4sp z)#C^}q%z04UaCP-a*^JYx3zCQBzPWAx~Xx+A#|1NhhL9pNZr27WXknZTG{uB`QqF& zIvszMk9>G`-6Gm$F*je)1j~a(Ybx_^UF8Z?_q2TXux|5X+tkxX?j8PW-f#Nv1^>zv zhyDqRPpSFd&i%7_9nTmw5%?E_bGpsH!|lv znk4nf|9_LfKi{=d?DOj1e}DhvmLlWY%L$C1FaNbYfBdtXgzbdwGy83B=_Z`5+HK04 z+0YUwFQ)swV&T_k9}>OK9G}TJ>9A0N6N|aH&9{V8@w1jRNp$$GoHKP=)uc15*}}@{ zy7u9w+aq!ve=l1s>cPgPpmkEGZHHm>_1Ks5+J$H3WhGW@yKz@la`SZmttko-k^K{! z8TV}U$$NEWNnx<@qVH9eq2_vZC7urzIC~d(+^v|!c&Ewj&L=UE_;nqBj~$Yd@62tCZ%^oYAS(N+$d2!5_Z~$DrG*j!OFl79Sl;!QIXC@y zc-r-gD+T`?s?^w~o>s2jBX}iZa$EHZ?x}ZYthr^fy3^70M4kM}_}#i^vR0q+^>eYDbMdv{}->;H9g&%KQ4pW}CZ!Gimpb5nV5zf9oSyX|ea z-S_89xl)<3TdOpV8H*)Y&db&K_0T@O+=AEd!Lqskqfc`7+&(p@e1-9f(t<#pTNeZ0 z?|FAiq_oe@WecaLTExY_zXdfsU#~5E?{Vhpb(h5}-bXy~;YwQ`{F3qhg@a}+r#MxE zez>ch+0>p?-Y-*nLqFp3A3;9j*f5K}^680@wGBJ>wrn|K_+b67?bZ&(H(&0*^3@}; zKKFy^-7|&X77Iz}%)IlE<41RY;+zR9)ph4OeVWXD^qk0pk3U~UPZ3?Yq9fz6Zr2+o z6aIf%N7M}@w&fgN!aTiTb9vQimHijA3qx0*Xjyaa;XUS)=l>jDaqj*{tpv^$mdjgC z%Kg3|y0 weT=uZp7=In@5PIn7fcO*`>#ofuixq(T4^NhpM31 Date: Tue, 14 Jul 2026 16:06:11 +0700 Subject: [PATCH 12/37] fix(nix-monitor): add delay on startup --- nix-monitor/nix_monitor_service.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 618f552..0945d5b 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -26,7 +26,7 @@ local systemStatsCheckInterval = cfg("system_stats_check_interval") local completedCommands = 0 local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" -local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" +local remoteHashCmd = "sleep 5 && git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l" local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" From 465cbb24564e3363782628a779ec6003186ffc63 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 16:32:59 +0700 Subject: [PATCH 13/37] fix(nix-monitor): cancel running check if it took more than threshold --- nix-monitor/nix_monitor_service.luau | 28 +++++++++++++++++++++------- nix-monitor/plugin.toml | 9 +++++++++ nix-monitor/translations/en.json | 2 ++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 0945d5b..a8e8f62 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -22,8 +22,10 @@ end local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") +local checkDurationThreshold = cfg("check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") local completedCommands = 0 +local isInit = true local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" local remoteHashCmd = "sleep 5 && git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" @@ -34,7 +36,8 @@ local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{pri local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '{print $2, $3}'" -setState("lastCheckTime", 0) +setState("lastRunTime", os.time()) +setState("lastCheckTime", os.time()) setState("lastCheckTimeStr", "n/a") setState("localHash", "n/a") setState("remoteHash", "n/a") @@ -50,10 +53,15 @@ setState("storeSize", "•••") setState("closureSize", "•••") function update() - if (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then + if isInit or (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then + isInit = false checkUpdate() end + if getState("isRunning") and (os.time() - getState("lastRunTime")) >= 60 * checkDurationThreshold then + cancelCheck() + end + if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then checkSystemStats() end @@ -64,8 +72,7 @@ function checkUpdate() return end - setState("lastCheckTime", os.time()) - noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastCheckTimeStr", date.stdout) end) + setState("lastRunTime", os.time()) if cfg("show_checking_notification") then noctalia.notify(tr("notification.checking_update")) @@ -115,18 +122,25 @@ function onHashCheckCompleted() noctalia.notify(tr("notification.update_check_completed")) end + setState("lastCheckTime", os.time()) + noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastCheckTimeStr", date.stdout) end) + setState("isRunning", false) end +function cancelCheck() + noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) + setState("isRunning", false) + completedCommands = 0 +end + watchState("command", function(command) if command == "check" then checkUpdate() end if command == "cancel" then - noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) - setState("isRunning", false) - completedCommands = 0 + cancelCheck() end end) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index f3dc82c..de463ae 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -93,6 +93,15 @@ description_key = "setting.check_interval.description" default = 60 min = 10 +[[setting]] +key = "check_duration_threshold" +type = "int" +label_key = "setting.check_duration_threshold.label" +description_key = "setting.check_duration_threshold.description" +default = 5 +min = 1 +max = 30 + [[setting]] key = "system_stats_check_interval" type = "int" diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 10a6668..eb9c456 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -34,6 +34,8 @@ "setting.widget.unknown_color.label": "Unknown status color", "setting.check_interval.label": "Update check interval", "setting.check_interval.description": "How often to check for updates (in minutes)", + "setting.check_duration_threshold.label": "Update check duration threshold", + "setting.check_duration_threshold.description": "Cancel check if it took too long (in minutes)", "setting.system_stats_check_interval.label": "System stats check interval", "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", "setting.checking_notification.label": "Show checking update notification", From 46e6b4b25e52ea2f056e8aadac787ca12a17add9 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 21:03:49 +0700 Subject: [PATCH 14/37] fix(nix-monitor): change to file-based approach The previous implementation has a bug when terminating noctalia's runStream function. Somehow, it doesn't want to spawn again after sometimes. This commit change the implementation to use a temporary file and read the command's output from there --- nix-monitor/nix_monitor_service.luau | 124 +++++++++++++++++++-------- 1 file changed, 87 insertions(+), 37 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index a8e8f62..9862748 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -1,4 +1,4 @@ -noctalia.setUpdateInterval(100) +noctalia.setUpdateInterval(1000) function tr(key) return noctalia.tr(key) @@ -24,17 +24,21 @@ local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") local checkDurationThreshold = cfg("check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") -local completedCommands = 0 local isInit = true +local stateDir = "/tmp/nix-monitor" +local localHashFile = stateDir .. "/localHash" +local remoteHashFile = stateDir .. "/remoteHash" +local storeSizeFile = stateDir .. "/storeSize" +local closureSizeFile = stateDir .. "/closureSize" -local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" -local remoteHashCmd = "sleep 5 && git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" +local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7 > " .. localHashFile .. " &" +local remoteHashCmd = "sleep 5 && git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7 > " .. remoteHashFile .. " &" local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l" local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{print $5}'" -local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}'` -local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '{print $2, $3}'" +local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}' > {storeSizeFile} &` +local closureSizeCmd = `nix path-info --closure-size --human-readable /run/current-system | awk '\{print $2, $3\}' > {closureSizeFile} &` setState("lastRunTime", os.time()) setState("lastCheckTime", os.time()) @@ -43,6 +47,7 @@ setState("localHash", "n/a") setState("remoteHash", "n/a") setState("isRunning", false) setState("isUpdateAvailable", false) +setState("lastGenerationsCheckTime", 0) setState("lastSystemStatsCheckTime", 0) setState("hasHomeManager", noctalia.commandExists("home-manager")) setState("nixosGenerations", "•••") @@ -52,16 +57,35 @@ setState("hmCurrentGen", "•••") setState("storeSize", "•••") setState("closureSize", "•••") +noctalia.mkdirAll(stateDir) +noctalia.writeFile(localHashFile, "") +noctalia.writeFile(remoteHashFile, "") + function update() if isInit or (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then isInit = false + cancelCheck() checkUpdate() end + if getState("isRunning") then + if isCheckUpdateSuccessfully() then + onHashCheckCompleted() + end + end + + if getState("isSystemStatsCheckRunning") then + checkSystemStatsFile() + end + if getState("isRunning") and (os.time() - getState("lastRunTime")) >= 60 * checkDurationThreshold then cancelCheck() end + if (os.time() - getState("lastGenerationsCheckTime")) >= 20 then + checkGenerations() + end + if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then checkSystemStats() end @@ -80,37 +104,36 @@ function checkUpdate() setState("isRunning", true) - completedCommands = 0 + noctalia.writeFile(localHashFile, "") + noctalia.writeFile(remoteHashFile, "") - noctalia.runAsync(localHashCmd, getLocalHash) - noctalia.runStream(remoteHashCmd, getRemoteHash) + noctalia.runAsync(localHashCmd) + noctalia.runAsync(remoteHashCmd) end -function getLocalHash(result) - if getState("isRunning") ~= true then - return +function isCheckUpdateSuccessfully() + local localHash = noctalia.string.trim(noctalia.readFile(localHashFile)) + local remoteHash = noctalia.string.trim(noctalia.readFile(remoteHashFile)) + + if typeof(localHash) == "string" and localHash ~= "" then + setState("localHash", localHash) end - setState("localHash", result.stdout) - completedCommands += 1 - onHashCheckCompleted() -end - -function getRemoteHash(line) - if getState("isRunning") ~= true then - return + if typeof(remoteHash) == "string" and remoteHash ~= "" then + setState("remoteHash", remoteHash) end - setState("remoteHash", line) - completedCommands += 1 - onHashCheckCompleted() + local success = typeof(localHash) == "string" and localHash ~= "" and + typeof(remoteHash) == "string" and remoteHash ~= "" + + if success then + onHashCheckCompleted() + end + + return success end function onHashCheckCompleted() - if completedCommands < 2 then - return - end - if getState("localHash") ~= getState("remoteHash") then setState("isUpdateAvailable", true) if cfg("show_update_notification") then @@ -129,9 +152,8 @@ function onHashCheckCompleted() end function cancelCheck() - noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) setState("isRunning", false) - completedCommands = 0 + noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) end watchState("command", function(command) @@ -144,8 +166,8 @@ watchState("command", function(command) end end) -function checkSystemStats() - setState("lastSystemStatsCheckTime", os.time()) +function checkGenerations() + setState("lastGenerationsCheckTime", os.time()) noctalia.runAsync(nixosGenerationsCmd, function(result) setState("nixosGenerations", result.stdout) @@ -164,12 +186,40 @@ function checkSystemStats() setState("hmCurrentGen", result.stdout) end) end +end - noctalia.runStream(storeSizeCmd, function(line) - setState("storeSize", line) - end) +function checkSystemStats() + if getState("isSystemStatsCheckRunning") then + return + end - noctalia.runStream(closureSizeCmd, function(line) - setState("closureSize", line) - end) + setState("isSystemStatsCheckRunning", true) + setState("lastSystemStatsCheckTime", os.time()) + + noctalia.runAsync(storeSizeCmd) + noctalia.runAsync(closureSizeCmd) +end + +function checkSystemStatsFile() + local storeSize = noctalia.string.trim(noctalia.readFile(storeSizeFile)) + local closureSize = noctalia.string.trim(noctalia.readFile(closureSizeFile)) + + if typeof(storeSize) == "string" and storeSize ~= "" then + setState("storeSize", storeSize) + end + + if typeof(closureSize) == "string" and closureSize ~= "" then + setState("closureSize", closureSize) + end + + local success = typeof(storeSize) == "string" and storeSize ~= "" and + typeof(closureSize) == "string" and closureSize ~= "" + + if success then + setState("isSystemStatsCheckRunning", false) + end +end + +function onExit(signal) + cancelCheck() end From b6b3791e3f3a0520383d0ca105fa524a2ca497d8 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 21:28:45 +0700 Subject: [PATCH 15/37] fix(nix-monitor): make the delay only on startup --- nix-monitor/nix_monitor_service.luau | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 9862748..11be4b4 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -32,7 +32,7 @@ local storeSizeFile = stateDir .. "/storeSize" local closureSizeFile = stateDir .. "/closureSize" local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7 > " .. localHashFile .. " &" -local remoteHashCmd = "sleep 5 && git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7 > " .. remoteHashFile .. " &" +local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7 > " .. remoteHashFile .. " &" local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l" local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" @@ -63,7 +63,6 @@ noctalia.writeFile(remoteHashFile, "") function update() if isInit or (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then - isInit = false cancelCheck() checkUpdate() end @@ -96,6 +95,13 @@ function checkUpdate() return end + local remoteCmd = remoteHashCmd + + if isInit then + remoteCmd = "sleep 10 && " .. remoteCmd + isInit = false + end + setState("lastRunTime", os.time()) if cfg("show_checking_notification") then @@ -108,7 +114,7 @@ function checkUpdate() noctalia.writeFile(remoteHashFile, "") noctalia.runAsync(localHashCmd) - noctalia.runAsync(remoteHashCmd) + noctalia.runAsync(remoteCmd) end function isCheckUpdateSuccessfully() From 64bf76749761401d73b80711a641a1a1cca75a6a Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Tue, 14 Jul 2026 21:32:49 +0700 Subject: [PATCH 16/37] fix(nix-monitor): change default clean command --- nix-monitor/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index de463ae..054e863 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -160,7 +160,7 @@ key = "clean_command" type = "string" label_key = "setting.clean_command.label" description_key = "setting.clean_command.description" -default = "nh clean all" +default = "nix-collect-garbage -d" [[setting]] key = "close_on_enter" From ba68ee667716cd395621a43733db34beac6b10e5 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 01:34:11 +0700 Subject: [PATCH 17/37] refactor(nix-monitor): rewrite most of the service code to make it a little bit more readable --- nix-monitor/nix_monitor.luau | 3 +- nix-monitor/nix_monitor_service.luau | 220 +++++++++++++++------------ nix-monitor/panel.luau | 19 ++- 3 files changed, 135 insertions(+), 107 deletions(-) diff --git a/nix-monitor/nix_monitor.luau b/nix-monitor/nix_monitor.luau index b65d110..20d972a 100644 --- a/nix-monitor/nix_monitor.luau +++ b/nix-monitor/nix_monitor.luau @@ -33,8 +33,9 @@ function displayWidget(glyph: string, text: string, color: string?) end end +-- Hooks function update() - if getState("isRunning") then + if getState("isRemoteCheckRunning") then displayWidget(barCfg("checking_glyph"), tr("bar.checking"), barCfg("checking_color")) else if getState("isUpdateAvailable") then diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 11be4b4..9f25111 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -1,5 +1,6 @@ -noctalia.setUpdateInterval(1000) +noctalia.setUpdateInterval(5000) +-- Helper functions function tr(key) return noctalia.tr(key) end @@ -20,32 +21,34 @@ function watchState(key, cb) noctalia.state.watch(key, cb) end +-- Vars local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") local checkDurationThreshold = cfg("check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") -local isInit = true local stateDir = "/tmp/nix-monitor" -local localHashFile = stateDir .. "/localHash" local remoteHashFile = stateDir .. "/remoteHash" local storeSizeFile = stateDir .. "/storeSize" local closureSizeFile = stateDir .. "/closureSize" +local showUpdateNotification = true -local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7 > " .. localHashFile .. " &" -local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7 > " .. remoteHashFile .. " &" +local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" +local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" local nixosGenerationsCmd = "nixos-rebuild list-generations | tail -n +2 | wc -l" local nixosCurrentGenCmd = "nixos-rebuild list-generations | grep True | awk '{print $1}'" local hmGenerationsCmd = "home-manager generations | wc -l" local hmCurrentGenCmd = "home-manager generations | grep '(current)' | awk '{print $5}'" -local storeSizeCmd = `du -s --block-size=1GiB /nix/store | awk '\{print $1 " GiB"\}' > {storeSizeFile} &` -local closureSizeCmd = `nix path-info --closure-size --human-readable /run/current-system | awk '\{print $2, $3\}' > {closureSizeFile} &` +local storeSizeCmd = "du -s --block-size=1GiB /nix/store | awk '\{print $1 \" GiB\"\}'" +local closureSizeCmd = "nix path-info --closure-size --human-readable /run/current-system | awk '\{print $2, $3\}'" -setState("lastRunTime", os.time()) -setState("lastCheckTime", os.time()) -setState("lastCheckTimeStr", "n/a") +-- State inits +setState("lastLocalCheckTime", os.time()) +setState("lastRemoteCheckRunTime", os.time()) +setState("lastRemoteCheckTime", os.time()) +setState("lastRemoteCheckTimeStr", "n/a") setState("localHash", "n/a") setState("remoteHash", "n/a") -setState("isRunning", false) +setState("isRemoteCheckRunning", false) setState("isUpdateAvailable", false) setState("lastGenerationsCheckTime", 0) setState("lastSystemStatsCheckTime", 0) @@ -58,120 +61,61 @@ setState("storeSize", "•••") setState("closureSize", "•••") noctalia.mkdirAll(stateDir) -noctalia.writeFile(localHashFile, "") noctalia.writeFile(remoteHashFile, "") -function update() - if isInit or (os.time() - getState("lastCheckTime")) >= 60 * updateCheckInterval then - cancelCheck() - checkUpdate() - end - - if getState("isRunning") then - if isCheckUpdateSuccessfully() then - onHashCheckCompleted() +-- Local check +function checkLocalHash() + noctalia.runAsync(localHashCmd, function(res) + if res.exitCode == 0 then + setState("localHash", res.stdout) end - end - - if getState("isSystemStatsCheckRunning") then - checkSystemStatsFile() - end - - if getState("isRunning") and (os.time() - getState("lastRunTime")) >= 60 * checkDurationThreshold then - cancelCheck() - end - - if (os.time() - getState("lastGenerationsCheckTime")) >= 20 then - checkGenerations() - end - - if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then - checkSystemStats() - end + end) end -function checkUpdate() - if getState("isRunning") then +-- Remote check +-- +-- Currently it is writing to a file because when I use the runAsync with +-- the callback, it is timed out +function checkRemoteHash(delay: number?) + local delay = delay or 0 + + if getState("isRemoteCheckRunning") then return end - local remoteCmd = remoteHashCmd + setState("isRemoteCheckRunning", true) + setState("lastRemoteCheckRunTime", os.time()) - if isInit then - remoteCmd = "sleep 10 && " .. remoteCmd - isInit = false - end - - setState("lastRunTime", os.time()) - - if cfg("show_checking_notification") then - noctalia.notify(tr("notification.checking_update")) - end - - setState("isRunning", true) - - noctalia.writeFile(localHashFile, "") noctalia.writeFile(remoteHashFile, "") - - noctalia.runAsync(localHashCmd) - noctalia.runAsync(remoteCmd) + noctalia.runAsync(`sleep {delay} && {remoteHashCmd} > {remoteHashFile} &`) end -function isCheckUpdateSuccessfully() - local localHash = noctalia.string.trim(noctalia.readFile(localHashFile)) +-- Check if the remoteHash check command is finished by reading the file +function checkRemoteStatus() local remoteHash = noctalia.string.trim(noctalia.readFile(remoteHashFile)) - if typeof(localHash) == "string" and localHash ~= "" then - setState("localHash", localHash) - end - - if typeof(remoteHash) == "string" and remoteHash ~= "" then + if type(remoteHash) == "string" and remoteHash ~= "" then + setState("isRemoteCheckRunning", false) setState("remoteHash", remoteHash) + onRemoteHashCheckCompleted() end - - local success = typeof(localHash) == "string" and localHash ~= "" and - typeof(remoteHash) == "string" and remoteHash ~= "" - - if success then - onHashCheckCompleted() - end - - return success end -function onHashCheckCompleted() - if getState("localHash") ~= getState("remoteHash") then - setState("isUpdateAvailable", true) - if cfg("show_update_notification") then - noctalia.notify(tr("notification.update_is_available")) - end - end - +function onRemoteHashCheckCompleted() if cfg("show_checking_notification") then noctalia.notify(tr("notification.update_check_completed")) end - setState("lastCheckTime", os.time()) - noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastCheckTimeStr", date.stdout) end) - - setState("isRunning", false) + setState("lastRemoteCheckTime", os.time()) + noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastRemoteCheckTimeStr", date.stdout) end) end -function cancelCheck() - setState("isRunning", false) +function cancelRemoteCheck() + setState("isRemoteCheckRunning", false) noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) end -watchState("command", function(command) - if command == "check" then - checkUpdate() - end - - if command == "cancel" then - cancelCheck() - end -end) - +-- Generation check function checkGenerations() setState("lastGenerationsCheckTime", os.time()) @@ -194,6 +138,7 @@ function checkGenerations() end end +-- System stats check function checkSystemStats() if getState("isSystemStatsCheckRunning") then return @@ -202,8 +147,8 @@ function checkSystemStats() setState("isSystemStatsCheckRunning", true) setState("lastSystemStatsCheckTime", os.time()) - noctalia.runAsync(storeSizeCmd) - noctalia.runAsync(closureSizeCmd) + noctalia.runAsync(`{storeSizeCmd} > {storeSizeFile} &`) + noctalia.runAsync(`{closureSizeCmd} > {closureSizeFile} &`) end function checkSystemStatsFile() @@ -226,6 +171,79 @@ function checkSystemStatsFile() end end + +-- Init +checkLocalHash() +checkRemoteHash(10) + +-- Command watcher +watchState("command", function(command) + if command == "check" then + checkLocalHash() + cancelRemoteCheck() + checkRemoteHash() + checkGenerations() + checkSystemStats() + end + + if command == "cancel" then + cancelRemoteCheck() + end +end) + +-- +-- Hooks +-- + +function update() + -- Check local hash every 10 seconds + if (os.time() - getState("lastLocalCheckTime") >= 10) then + checkLocalHash() + end + + -- Remote check + if (os.time() - getState("lastRemoteCheckTime")) >= 60 * updateCheckInterval then + checkRemoteHash() + end + + if getState("isRemoteCheckRunning") then + checkRemoteStatus() + + -- Remote check timeout + if (os.time() - getState("lastRemoteCheckRunTime")) >= 60 * checkDurationThreshold then + cancelRemoteCheck() + end + end + + if getState("localHash") ~= getState("remoteHash") and + getState("localHash") ~= "n/a" and getState("remoteHash") ~= "n/a" + then + setState("isUpdateAvailable", true) + + if cfg("show_update_notification") and showUpdateNotification then + noctalia.notify(tr("notification.update_is_available")) + showUpdateNotification = false + end + else + setState("isUpdateAvailable", false) + showUpdateNotification = true + end + + -- Generations check + if (os.time() - getState("lastGenerationsCheckTime")) >= 20 then + checkGenerations() + end + + -- System stats check + if (os.time() - getState("lastSystemStatsCheckTime")) >= 60 * systemStatsCheckInterval then + checkSystemStats() + end + + if getState("isSystemStatsCheckRunning") then + checkSystemStatsFile() + end +end + function onExit(signal) - cancelCheck() + cancelRemoteCheck() end diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau index 521382e..37def09 100644 --- a/nix-monitor/panel.luau +++ b/nix-monitor/panel.luau @@ -1,3 +1,5 @@ +-- Helper functions + function tr(key) return noctalia.tr(key) end @@ -48,7 +50,7 @@ local function labelBox(subtext, text, glyph) }) end -function statLabel(text, glyph: string?) +local function statLabel(text, glyph: string?) local items = {} if glyph ~= nil then table.insert(items, ui.glyph({ @@ -72,7 +74,7 @@ end local function render() local firstBtn = btnCheck - if getState("isRunning") then + if getState("isRemoteCheckRunning") then firstBtn = ui.button({ text = tr("panel.cancel"), glyph = "cancel", @@ -100,7 +102,7 @@ local function render() end end - local lastCheckTimeStr = getState("lastCheckTimeStr") + local lastCheckTimeStr = getState("lastRemoteCheckTimeStr") local generationItems = { statLabel(`SYS: {getState("nixosGenerations")}`, "device-desktop"), statLabel(`{tr("panel.current")}: {getState("nixosCurrentGen")}`, "device-desktop-check") @@ -200,15 +202,22 @@ local function render() ) end -watchState("isRunning", render) -watchState("lastCheckTimeStr", render) +-- State watcher +watchState("isRemoteCheckRunning", render) +watchState("lastRemoteCheckTimeStr", render) watchState("localHash", render) watchState("remoteHash", render) +-- Hooks function onOpen(_ctx) render() end +function update() + render() +end + +-- Click handler function onCheckClicked() setState("command", "check") end From 24b2e7f676d8fdf0228c28feb92fcf250f01ca5b Mon Sep 17 00:00:00 2001 From: Lemmy Date: Tue, 14 Jul 2026 23:46:19 -0400 Subject: [PATCH 18/37] Update tags from 'nix' to 'nixos' in plugin.toml --- nix-monitor/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 054e863..5d35c50 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -5,7 +5,7 @@ min_noctalia = "5.0.0" icon = "package" author = "avivbintangaringga" description = "Nixpkgs update monitor" -tags = [ "nix", "utility" ] +tags = [ "nixos", "utility" ] dependencies = [ "nixos-version", "git", "pkill" ] license = "MIT" From 971d4bc0baeae0b3ecb3c826fb1dc6bb7c6520eb Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 10:08:26 +0700 Subject: [PATCH 19/37] fix(nix-monitor): fix translation --- nix-monitor/translations/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index eb9c456..869f11f 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -39,9 +39,9 @@ "setting.system_stats_check_interval.label": "System stats check interval", "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", "setting.checking_notification.label": "Show checking update notification", - "setting.checking_notification.description": "Wether to show a notification whenever checking is in progress", + "setting.checking_notification.description": "Whether to show a notification whenever checking is in progress", "setting.show_update_notification.label": "Show update notification", - "setting.show_update_notification.description": "Wether to show a notification whenever update is available", + "setting.show_update_notification.description": "Whether to show a notification whenever update is available", "setting.branch.label": "Branch", "setting.branch.description": "Which nixpkgs branch to use", "setting.update_command.label": "Update command", From e5560a3bc4e082bd7bbafd230263253af0bc6390 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 10:14:59 +0700 Subject: [PATCH 20/37] fix(nix-monitor): remove dead code --- nix-monitor/panel.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau index 37def09..d644973 100644 --- a/nix-monitor/panel.luau +++ b/nix-monitor/panel.luau @@ -72,7 +72,7 @@ local function statLabel(text, glyph: string?) end local function render() - local firstBtn = btnCheck + local firstBtn if getState("isRemoteCheckRunning") then firstBtn = ui.button({ From 01ed4efa5aede0cf9d4a2200f4101ed526f22ae2 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 10:17:03 +0700 Subject: [PATCH 21/37] fix(nix-monitor): change widget plugin id --- nix-monitor/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 5d35c50..5552d57 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -10,7 +10,7 @@ dependencies = [ "nixos-version", "git", "pkill" ] license = "MIT" [[widget]] -id = "Nix Monitor" +id = "nix-monitor" entry = "nix_monitor.luau" [[widget.setting]] From f921cc112ecf668a6a1d616a9e0e9fc27d87590a Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 10:19:16 +0700 Subject: [PATCH 22/37] fix(nix-monitor): add check time state to local check --- nix-monitor/nix_monitor_service.luau | 1 + 1 file changed, 1 insertion(+) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 9f25111..2290356 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -65,6 +65,7 @@ noctalia.writeFile(remoteHashFile, "") -- Local check function checkLocalHash() + setState("lastLocalCheckTime", os.time()) noctalia.runAsync(localHashCmd, function(res) if res.exitCode == 0 then setState("localHash", res.stdout) From 30af4b0036b71cde967dd9289bd40c1c020f03aa Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 10:22:33 +0700 Subject: [PATCH 23/37] fix(nix-monitor): initialize system stats check running state --- nix-monitor/nix_monitor_service.luau | 1 + 1 file changed, 1 insertion(+) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 2290356..a4fddcf 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -51,6 +51,7 @@ setState("remoteHash", "n/a") setState("isRemoteCheckRunning", false) setState("isUpdateAvailable", false) setState("lastGenerationsCheckTime", 0) +setState("isSystemStatsCheckRunning", false) setState("lastSystemStatsCheckTime", 0) setState("hasHomeManager", noctalia.commandExists("home-manager")) setState("nixosGenerations", "•••") From c51e39dbe4e5804601ac60ea48e2a9d0fd096058 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 11:03:34 +0700 Subject: [PATCH 24/37] fix(nix-monitor): add dependency in plugin.toml --- nix-monitor/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 5552d57..a9f42ee 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -6,7 +6,7 @@ icon = "package" author = "avivbintangaringga" description = "Nixpkgs update monitor" tags = [ "nixos", "utility" ] -dependencies = [ "nixos-version", "git", "pkill" ] +dependencies = [ "nix", "nixos-version", "nixos-rebuild", "git", "du", "cat", "awk", "grep", "tail", "wc", "pkill" ] license = "MIT" [[widget]] From 0d953ea633f9b62fd8101366f7d1bf3bf1d0559c Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 11:13:41 +0700 Subject: [PATCH 25/37] fix(nix-monitor): track pid of the running remote check --- nix-monitor/nix_monitor_service.luau | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index a4fddcf..5db55f3 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -28,6 +28,7 @@ local checkDurationThreshold = cfg("check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") local stateDir = "/tmp/nix-monitor" local remoteHashFile = stateDir .. "/remoteHash" +local remotePidFile = stateDir .. "/remoteHash.pid" local storeSizeFile = stateDir .. "/storeSize" local closureSizeFile = stateDir .. "/closureSize" local showUpdateNotification = true @@ -89,7 +90,7 @@ function checkRemoteHash(delay: number?) setState("lastRemoteCheckRunTime", os.time()) noctalia.writeFile(remoteHashFile, "") - noctalia.runAsync(`sleep {delay} && {remoteHashCmd} > {remoteHashFile} &`) + noctalia.runAsync(`sleep {delay} && {remoteHashCmd} > {remoteHashFile} & echo $! > {remotePidFile}`) end -- Check if the remoteHash check command is finished by reading the file @@ -114,7 +115,14 @@ end function cancelRemoteCheck() setState("isRemoteCheckRunning", false) - noctalia.runAsync(`kill $(ps -ef | grep "git ls-remote https://github.com/NixOS/nixpkgs" | grep -v grep | awk '\{print $2\}')`) + if noctalia.fileExists(remotePidFile) then + local pid = noctalia.string.trim(noctalia.readFile(remotePidFile)) + + if type(pid) == "string" and pid ~= "" then + noctalia.runAsync(`pkill -9 -P {pid}`) + end + noctalia.removeFile(remotePidFile) + end end -- Generation check From 74f22f2c349321995170fe2e3cf074fd7ec5f40c Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 11:37:35 +0700 Subject: [PATCH 26/37] fix(nix-monitor): add cancel system stats check --- nix-monitor/nix_monitor_service.luau | 38 ++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 5db55f3..637d7ec 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -21,6 +21,17 @@ function watchState(key, cb) noctalia.state.watch(key, cb) end +function killWithPidFile(file) + if noctalia.fileExists(file) then + local pid = noctalia.string.trim(noctalia.readFile(file)) + + if type(pid) == "string" and pid ~= "" then + noctalia.runAsync(`pkill -9 -P {pid}`) + end + noctalia.removeFile(file) + end +end + -- Vars local branch = cfg("branch") local updateCheckInterval = cfg("check_interval") @@ -28,9 +39,11 @@ local checkDurationThreshold = cfg("check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") local stateDir = "/tmp/nix-monitor" local remoteHashFile = stateDir .. "/remoteHash" -local remotePidFile = stateDir .. "/remoteHash.pid" local storeSizeFile = stateDir .. "/storeSize" local closureSizeFile = stateDir .. "/closureSize" +local remotePidFile = stateDir .. "/remoteHash.pid" +local storePidFile = stateDir .. "/storeSize.pid" +local closurePidFile = stateDir .. "/closureSize.pid" local showUpdateNotification = true local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" @@ -111,18 +124,12 @@ function onRemoteHashCheckCompleted() setState("lastRemoteCheckTime", os.time()) noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastRemoteCheckTimeStr", date.stdout) end) + noctalia.removeFile(remotePidFile) end function cancelRemoteCheck() setState("isRemoteCheckRunning", false) - if noctalia.fileExists(remotePidFile) then - local pid = noctalia.string.trim(noctalia.readFile(remotePidFile)) - - if type(pid) == "string" and pid ~= "" then - noctalia.runAsync(`pkill -9 -P {pid}`) - end - noctalia.removeFile(remotePidFile) - end + killWithPidFile(remotePidFile) end -- Generation check @@ -157,8 +164,9 @@ function checkSystemStats() setState("isSystemStatsCheckRunning", true) setState("lastSystemStatsCheckTime", os.time()) - noctalia.runAsync(`{storeSizeCmd} > {storeSizeFile} &`) - noctalia.runAsync(`{closureSizeCmd} > {closureSizeFile} &`) + -- Sleep 0 to trigger noctalia calling /bin/sh + noctalia.runAsync(`sleep 0 && {storeSizeCmd} > {storeSizeFile} & echo $! > {storePidFile}`) + noctalia.runAsync(`sleep 0 && {closureSizeCmd} > {closureSizeFile} & echo $! > {closurePidFile}`) end function checkSystemStatsFile() @@ -178,9 +186,16 @@ function checkSystemStatsFile() if success then setState("isSystemStatsCheckRunning", false) + noctalia.removeFile(storePidFile) + noctalia.removeFile(closurePidFile) end end +function cancelSystemCheck() + setState("isSystemStatsCheckRunning", false) + killWithPidFile(storePidFile) + killWithPidFile(closurePidFile) +end -- Init checkLocalHash() @@ -198,6 +213,7 @@ watchState("command", function(command) if command == "cancel" then cancelRemoteCheck() + cancelSystemCheck() end end) From 70c2ec286dba268f03c3049cd3dc6f876ef453c8 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 11:45:44 +0700 Subject: [PATCH 27/37] fix(nix-monitor): change readme --- nix-monitor/README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/nix-monitor/README.md b/nix-monitor/README.md index 95f9bde..cef9773 100644 --- a/nix-monitor/README.md +++ b/nix-monitor/README.md @@ -1,5 +1,17 @@ # Nix Monitor -![thumbnail](thumbnail.webp) +![Nix Monitor thumbnail](thumbnail.webp) -**Nix Monitor** checks Nixpkgs update by comparing local nix hash and remote Nixpkgs's hash. It also can run update and clean command. +**Nix Monitor** checks Nixpkgs update by comparing local nix hash and remote Nixpkgs's hash + +## Features + - Shows local and remote nixpkgs hash + - Shows NixOS and optionally Home Manager generations + - Shows Nix Store size and closure size + - Customizable clean and update command + + ## Requirements + - Git + - NixOS commands (`nix`, `nixos-rebuild`, `nixos-version`) + - Linux tools (`du`, `cat`, `awk`, `grep`, `tail`, `wc`, `pkill`) + - Optionally `home-manager` From ed42fc9be1d7a808d71ec53b707f67ce8beb5f01 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 11:50:27 +0700 Subject: [PATCH 28/37] fix(nix-monitor): change barWidget.getConfig to noctalia.getConfig --- nix-monitor/nix_monitor.luau | 21 ++++++++++----------- nix-monitor/panel.luau | 4 ---- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/nix-monitor/nix_monitor.luau b/nix-monitor/nix_monitor.luau index 20d972a..2d5a27e 100644 --- a/nix-monitor/nix_monitor.luau +++ b/nix-monitor/nix_monitor.luau @@ -1,10 +1,9 @@ - function tr(key) return noctalia.tr(key) end -function barCfg(key) - return barWidget.getConfig(key) +function cfg(key) + return noctalia.getConfig(key) end function getState(key) @@ -16,19 +15,19 @@ function displayWidget(glyph: string, text: string, color: string?) color = "on_surface" end - if barCfg("colorize_text") then + if cfg("colorize_text") then barWidget.setColor(color) end - if barCfg("colorize_glyph") then + if cfg("colorize_glyph") then barWidget.setGlyphColor(color) end - if barCfg("show_glyph") then + if cfg("show_glyph") then barWidget.setGlyph(glyph) end - if barCfg("show_text") then + if cfg("show_text") then barWidget.setText(text) end end @@ -36,15 +35,15 @@ end -- Hooks function update() if getState("isRemoteCheckRunning") then - displayWidget(barCfg("checking_glyph"), tr("bar.checking"), barCfg("checking_color")) + displayWidget(cfg("checking_glyph"), tr("bar.checking"), cfg("checking_color")) else if getState("isUpdateAvailable") then - displayWidget(barCfg("update_available_glyph"), tr("bar.update_available"), barCfg("update_available_color")) + displayWidget(cfg("update_available_glyph"), tr("bar.update_available"), cfg("update_available_color")) else if getState("localHash") == "n/a" or getState("remoteHash") == "n/a" then - displayWidget(barCfg("unknown_glyph"), tr("bar.unknown"), barCfg("unknown_color")) + displayWidget(cfg("unknown_glyph"), tr("bar.unknown"), cfg("unknown_color")) else - displayWidget(barCfg("up_to_date_glyph"), tr("bar.up_to_date"), barCfg("up_to_date_color")) + displayWidget(cfg("up_to_date_glyph"), tr("bar.up_to_date"), cfg("up_to_date_color")) end end end diff --git a/nix-monitor/panel.luau b/nix-monitor/panel.luau index d644973..3d82af1 100644 --- a/nix-monitor/panel.luau +++ b/nix-monitor/panel.luau @@ -4,10 +4,6 @@ function tr(key) return noctalia.tr(key) end -function barCfg(key) - return barWidget.getConfig(key) -end - function cfg(key) return noctalia.getConfig(key) end From 6805464bf7476ca8a6b412d87ebd2be3ad055436 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 12:42:23 +0700 Subject: [PATCH 29/37] fix(nix-monitor): change date command to noctalia.formatTime --- nix-monitor/nix_monitor_service.luau | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 637d7ec..da12d96 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -123,7 +123,10 @@ function onRemoteHashCheckCompleted() end setState("lastRemoteCheckTime", os.time()) - noctalia.runAsync("date '+%Y-%m-%d %H:%M'", function(date) setState("lastRemoteCheckTimeStr", date.stdout) end) + + local date = noctalia.formatTime("%Y-%m-%d %H:%M:%S") + setState("lastRemoteCheckTimeStr", date) + noctalia.removeFile(remotePidFile) end From 4d43885b85fc49d15eb3899369888fd5687394fd Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 22:50:26 +0700 Subject: [PATCH 30/37] fix(nix-monitor): trim local hash --- nix-monitor/nix_monitor_service.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index da12d96..f6d526a 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -83,7 +83,7 @@ function checkLocalHash() setState("lastLocalCheckTime", os.time()) noctalia.runAsync(localHashCmd, function(res) if res.exitCode == 0 then - setState("localHash", res.stdout) + setState("localHash", noctalia.string.trim(res.stdout)) end end) end From 5dfc59cadb72eb97e0eb7cfb7da841aa3d49cb66 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 22:50:54 +0700 Subject: [PATCH 31/37] fix(nix-monitor): cancel system check on exit --- nix-monitor/nix_monitor_service.luau | 1 + 1 file changed, 1 insertion(+) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index f6d526a..036de2b 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -275,4 +275,5 @@ end function onExit(signal) cancelRemoteCheck() + cancelSystemCheck() end From a1d9a0c4bbcb2155c6c0036a813495c0e6097a44 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 22:54:33 +0700 Subject: [PATCH 32/37] fix(nix-monitor): kill both children and parent job, just to be safe --- nix-monitor/nix_monitor_service.luau | 2 +- nix-monitor/plugin.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 036de2b..539347c 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -26,7 +26,7 @@ function killWithPidFile(file) local pid = noctalia.string.trim(noctalia.readFile(file)) if type(pid) == "string" and pid ~= "" then - noctalia.runAsync(`pkill -9 -P {pid}`) + noctalia.runAsync(`pkill -9 -P {pid} && kill -9 {pid}`) end noctalia.removeFile(file) end diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index a9f42ee..67aab9b 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -6,7 +6,7 @@ icon = "package" author = "avivbintangaringga" description = "Nixpkgs update monitor" tags = [ "nixos", "utility" ] -dependencies = [ "nix", "nixos-version", "nixos-rebuild", "git", "du", "cat", "awk", "grep", "tail", "wc", "pkill" ] +dependencies = [ "nix", "nixos-version", "nixos-rebuild", "git", "du", "cat", "awk", "grep", "tail", "wc", "kill", "pkill" ] license = "MIT" [[widget]] From 04ad49cf45d411a8928ffc5063f6a809884e1b20 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 22:56:56 +0700 Subject: [PATCH 33/37] fix(nix-monitor): add back checking update notification --- nix-monitor/nix_monitor_service.luau | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 539347c..8d2c4bf 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -102,6 +102,10 @@ function checkRemoteHash(delay: number?) setState("isRemoteCheckRunning", true) setState("lastRemoteCheckRunTime", os.time()) + if cfg("show_checking_notification") then + noctalia.notify(tr("notification.checking_update")) + end + noctalia.writeFile(remoteHashFile, "") noctalia.runAsync(`sleep {delay} && {remoteHashCmd} > {remoteHashFile} & echo $! > {remotePidFile}`) end From 48e3adf0522faa145c5535222ef4a81b00f1ff64 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 23:13:20 +0700 Subject: [PATCH 34/37] fix(nix-monitor): fix settings translation wording and variable naming --- nix-monitor/nix_monitor_service.luau | 12 ++++++------ nix-monitor/plugin.toml | 12 ++++++------ nix-monitor/translations/en.json | 8 ++++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 8d2c4bf..08520f4 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -44,7 +44,7 @@ local closureSizeFile = stateDir .. "/closureSize" local remotePidFile = stateDir .. "/remoteHash.pid" local storePidFile = stateDir .. "/storeSize.pid" local closurePidFile = stateDir .. "/closureSize.pid" -local showUpdateNotification = true +local showUpdateAvailableNotification = true local localHashCmd = "nixos-version --hash 2> /dev/null | cut -c -7" local remoteHashCmd = "git ls-remote https://github.com/NixOS/nixpkgs " .. branch .. " 2>/dev/null | cut -c 1-7" @@ -102,7 +102,7 @@ function checkRemoteHash(delay: number?) setState("isRemoteCheckRunning", true) setState("lastRemoteCheckRunTime", os.time()) - if cfg("show_checking_notification") then + if cfg("show_update_check_notification") then noctalia.notify(tr("notification.checking_update")) end @@ -122,7 +122,7 @@ function checkRemoteStatus() end function onRemoteHashCheckCompleted() - if cfg("show_checking_notification") then + if cfg("show_update_check_notification") then noctalia.notify(tr("notification.update_check_completed")) end @@ -253,13 +253,13 @@ function update() then setState("isUpdateAvailable", true) - if cfg("show_update_notification") and showUpdateNotification then + if cfg("show_update_available_notification") and showUpdateAvailableNotification then noctalia.notify(tr("notification.update_is_available")) - showUpdateNotification = false + showUpdateAvailableNotification = false end else setState("isUpdateAvailable", false) - showUpdateNotification = true + showUpdateAvailableNotification = true end -- Generations check diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 67aab9b..9732578 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -111,17 +111,17 @@ default = 10 min = 5 [[setting]] -key = "show_checking_notification" +key = "show_update_check_notification" type = "bool" -label_key = "setting.checking_notification.label" -description_key = "setting.checking_notification.description" +label_key = "setting.show_update_check_notification.label" +description_key = "setting.show_update_check_notification.description" default = false [[setting]] -key = "show_update_notification" +key = "show_update_available_notification" type = "bool" -label_key = "setting.show_update_notification.label" -description_key = "setting.show_update_notification.description" +label_key = "setting.show_update_available_notification.label" +description_key = "setting.show_update_available_notification.description" default = true [[setting]] diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index 869f11f..fb8eec8 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -38,10 +38,10 @@ "setting.check_duration_threshold.description": "Cancel check if it took too long (in minutes)", "setting.system_stats_check_interval.label": "System stats check interval", "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", - "setting.checking_notification.label": "Show checking update notification", - "setting.checking_notification.description": "Whether to show a notification whenever checking is in progress", - "setting.show_update_notification.label": "Show update notification", - "setting.show_update_notification.description": "Whether to show a notification whenever update is available", + "setting.show_update_check_notification.label": "Show update check notification", + "setting.show_update_check_notification.description": "Whether to show a notification whenever update check is in progress and completed", + "setting.show_update_available_notification.label": "Show update available notification", + "setting.show_update_available_notification.description": "Whether to show a notification whenever an update is available", "setting.branch.label": "Branch", "setting.branch.description": "Which nixpkgs branch to use", "setting.update_command.label": "Update command", From acdae44300d237314accd5e724e4ab7d15d69c8e Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 23:38:09 +0700 Subject: [PATCH 35/37] fix(nix-monitor): add system check duration threshold --- nix-monitor/nix_monitor_service.luau | 19 ++++++++++++++----- nix-monitor/plugin.toml | 21 +++++++++++++++------ nix-monitor/translations/en.json | 10 ++++++---- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/nix-monitor/nix_monitor_service.luau b/nix-monitor/nix_monitor_service.luau index 08520f4..334249d 100644 --- a/nix-monitor/nix_monitor_service.luau +++ b/nix-monitor/nix_monitor_service.luau @@ -34,9 +34,10 @@ end -- Vars local branch = cfg("branch") -local updateCheckInterval = cfg("check_interval") -local checkDurationThreshold = cfg("check_duration_threshold") +local updateCheckInterval = cfg("update_check_interval") +local updateCheckDurationThreshold = cfg("update_check_duration_threshold") local systemStatsCheckInterval = cfg("system_stats_check_interval") +local systemStatsCheckDurationThreshold = cfg("system_stats_check_duration_threshold") local stateDir = "/tmp/nix-monitor" local remoteHashFile = stateDir .. "/remoteHash" local storeSizeFile = stateDir .. "/storeSize" @@ -66,7 +67,8 @@ setState("isRemoteCheckRunning", false) setState("isUpdateAvailable", false) setState("lastGenerationsCheckTime", 0) setState("isSystemStatsCheckRunning", false) -setState("lastSystemStatsCheckTime", 0) +setState("lastSystemStatsCheckTime", os.time()) +setState("lastSystemStatsCheckRunTime", os.time()) setState("hasHomeManager", noctalia.commandExists("home-manager")) setState("nixosGenerations", "•••") setState("nixosCurrentGen", "•••") @@ -169,7 +171,7 @@ function checkSystemStats() end setState("isSystemStatsCheckRunning", true) - setState("lastSystemStatsCheckTime", os.time()) + setState("lastSystemStatsCheckRunTime", os.time()) -- Sleep 0 to trigger noctalia calling /bin/sh noctalia.runAsync(`sleep 0 && {storeSizeCmd} > {storeSizeFile} & echo $! > {storePidFile}`) @@ -193,6 +195,7 @@ function checkSystemStatsFile() if success then setState("isSystemStatsCheckRunning", false) + setState("lastSystemStatsCheckTime", os.time()) noctalia.removeFile(storePidFile) noctalia.removeFile(closurePidFile) end @@ -207,6 +210,7 @@ end -- Init checkLocalHash() checkRemoteHash(10) +checkSystemStats() -- Command watcher watchState("command", function(command) @@ -243,7 +247,7 @@ function update() checkRemoteStatus() -- Remote check timeout - if (os.time() - getState("lastRemoteCheckRunTime")) >= 60 * checkDurationThreshold then + if (os.time() - getState("lastRemoteCheckRunTime")) >= 60 * updateCheckDurationThreshold then cancelRemoteCheck() end end @@ -274,6 +278,11 @@ function update() if getState("isSystemStatsCheckRunning") then checkSystemStatsFile() + + -- System stats check timeout + if (os.time() - getState("lastSystemStatsCheckRunTime")) >= 60 * systemStatsCheckDurationThreshold then + cancelSystemCheck() + end end end diff --git a/nix-monitor/plugin.toml b/nix-monitor/plugin.toml index 9732578..4d089f1 100644 --- a/nix-monitor/plugin.toml +++ b/nix-monitor/plugin.toml @@ -86,18 +86,18 @@ label_key = "setting.widget.unknown_color.label" default = "on_surface" [[setting]] -key = "check_interval" +key = "update_check_interval" type = "int" -label_key = "setting.check_interval.label" -description_key = "setting.check_interval.description" +label_key = "setting.update_check_interval.label" +description_key = "setting.update_check_interval.description" default = 60 min = 10 [[setting]] -key = "check_duration_threshold" +key = "update_check_duration_threshold" type = "int" -label_key = "setting.check_duration_threshold.label" -description_key = "setting.check_duration_threshold.description" +label_key = "setting.update_check_duration_threshold.label" +description_key = "setting.update_check_duration_threshold.description" default = 5 min = 1 max = 30 @@ -110,6 +110,15 @@ description_key = "setting.system_stats_check_interval.description" default = 10 min = 5 +[[setting]] +key = "system_stats_check_duration_threshold" +type = "int" +label_key = "setting.system_stats_check_duration_threshold.label" +description_key = "setting.system_stats_check_duration_threshold.description" +default = 5 +min = 1 +max = 30 + [[setting]] key = "show_update_check_notification" type = "bool" diff --git a/nix-monitor/translations/en.json b/nix-monitor/translations/en.json index fb8eec8..9e2f6a7 100644 --- a/nix-monitor/translations/en.json +++ b/nix-monitor/translations/en.json @@ -32,12 +32,14 @@ "setting.widget.update_available_color.label": "Update available color", "setting.widget.unknown_glyph.label": "Unknown status glyph", "setting.widget.unknown_color.label": "Unknown status color", - "setting.check_interval.label": "Update check interval", - "setting.check_interval.description": "How often to check for updates (in minutes)", - "setting.check_duration_threshold.label": "Update check duration threshold", - "setting.check_duration_threshold.description": "Cancel check if it took too long (in minutes)", + "setting.update_check_interval.label": "Update check interval", + "setting.update_check_interval.description": "How often to check for updates (in minutes)", + "setting.update_check_duration_threshold.label": "Update check duration threshold", + "setting.update_check_duration_threshold.description": "Cancel update check if it took too long (in minutes)", "setting.system_stats_check_interval.label": "System stats check interval", "setting.system_stats_check_interval.description": "How often to check for system stats (in minutes)", + "setting.system_stats_check_duration_threshold.label": "System stats check duration threshold", + "setting.system_stats_check_duration_threshold.description": "Cancel system stats check if it took too long (in minutes)", "setting.show_update_check_notification.label": "Show update check notification", "setting.show_update_check_notification.description": "Whether to show a notification whenever update check is in progress and completed", "setting.show_update_available_notification.label": "Show update available notification", From 00ecbd7786b483ef2e5c2f3b901985785927e552 Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 23:47:04 +0700 Subject: [PATCH 36/37] fix(nix-monitor): add notes to readme --- nix-monitor/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nix-monitor/README.md b/nix-monitor/README.md index cef9773..3776e18 100644 --- a/nix-monitor/README.md +++ b/nix-monitor/README.md @@ -11,7 +11,11 @@ - Customizable clean and update command ## Requirements - - Git - - NixOS commands (`nix`, `nixos-rebuild`, `nixos-version`) - - Linux tools (`du`, `cat`, `awk`, `grep`, `tail`, `wc`, `pkill`) - - Optionally `home-manager` + - Git + - NixOS commands (`nix`, `nixos-rebuild`, `nixos-version`) + - Linux tools (`du`, `cat`, `awk`, `grep`, `tail`, `wc`, `kill`, `pkill`) + - Optionally `home-manager` + +## Notes + - You need to change the update command in the setting + - By default, clean command executes `nix-collect-garbage -d`, you can change it too! From efdc64562347d619060325b2e343e4e95a000b8f Mon Sep 17 00:00:00 2001 From: avivbintangaringga Date: Wed, 15 Jul 2026 23:48:42 +0700 Subject: [PATCH 37/37] fix(nix-monitor): change readme wording --- nix-monitor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-monitor/README.md b/nix-monitor/README.md index 3776e18..7a0db7b 100644 --- a/nix-monitor/README.md +++ b/nix-monitor/README.md @@ -17,5 +17,5 @@ - Optionally `home-manager` ## Notes - - You need to change the update command in the setting + - You need to add the update command in the setting first - By default, clean command executes `nix-collect-garbage -d`, you can change it too!