From 969e27d580374a41b459759898e58ae004806815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E6=95=B0?= <33194175+hanshuaikang@users.noreply.github.com> Date: Sat, 28 Dec 2024 16:13:01 +0800 Subject: [PATCH] feat: release v0.1.0 (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: init dev - 优化样式实现,支持并发 - 补充文档 --- .gitignore | 2 + Cargo.lock | 1046 +++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 13 + README.md | 47 +- README_ZH.md | 46 ++ docs/imgs/img.png | Bin 0 -> 137017 bytes docs/imgs/nb.gif | Bin 0 -> 589263 bytes src/ip_data.rs | 14 + src/main.rs | 134 ++++++ src/network.rs | 154 +++++++ src/terminal.rs | 25 ++ src/ui.rs | 232 ++++++++++ 12 files changed, 1711 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README_ZH.md create mode 100644 docs/imgs/img.png create mode 100644 docs/imgs/nb.gif create mode 100644 src/ip_data.rs create mode 100644 src/main.rs create mode 100644 src/network.rs create mode 100644 src/terminal.rs create mode 100644 src/ui.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a0038a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +.idea \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fa90a13 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1046 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clap" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "compact_str" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags", + "crossterm_winapi", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "instability" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898e106451f7335950c9cc64f8ec67b5f65698679ac67ed00619aeef14e1cf75" +dependencies = [ + "darling", + "indoc", + "pretty_assertions", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ipnetwork" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +dependencies = [ + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "nping" +version = "0.1.0" +dependencies = [ + "clap", + "ctrlc", + "pnet", + "ratatui", + "tokio", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pnet" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "682396b533413cc2e009fbb48aadf93619a149d3e57defba19ff50ce0201bd0d" +dependencies = [ + "ipnetwork", + "pnet_base", + "pnet_datalink", + "pnet_packet", + "pnet_sys", + "pnet_transport", +] + +[[package]] +name = "pnet_base" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7" +dependencies = [ + "no-std-net", +] + +[[package]] +name = "pnet_datalink" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e70ec0be163102a332e1d2d5586d362ad76b01cec86f830241f2b6452a7b7" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_macros" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13325ac86ee1a80a480b0bc8e3d30c25d133616112bb16e86f712dcf8a71c863" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "pnet_macros_support" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed67a952585d509dd0003049b1fc56b982ac665c8299b124b90ea2bdb3134ab" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c96ebadfab635fcc23036ba30a7d33a80c39e8461b8bd7dc7bb186acb96560f" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "pnet_sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d4643d3d4db6b08741050c2f3afa9a892c4244c085a72fcda93c9c2c9a00f4b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pnet_transport" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f604d98bc2a6591cf719b58d3203fd882bdd6bf1db696c4ac97978e9f4776bf" +dependencies = [ + "libc", + "pnet_base", + "pnet_packet", + "pnet_sys", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ratatui" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +dependencies = [ + "bitflags", + "cassowary", + "compact_str", + "crossterm", + "indoc", + "instability", + "itertools", + "lru", + "paste", + "strum", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tokio" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools", + "unicode-segmentation", + "unicode-width 0.1.14", +] + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0e9a11a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "nping" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4.5.23", features = ["derive"] } +pnet = "0.35.0" +ctrlc = "3.2" +ratatui = "0.29.0" +tokio = { version = "1.42.0", features = ["full"] } + + diff --git a/README.md b/README.md index 13717f5..a719f7d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,45 @@ -# nping -nb ping +
+ Nping is a Ping tool developed in Rust using the ICMP protocol. It supports concurrent Ping for multiple addresses, visual chart display, real-time data updates, and other features. +
+
+
+
+ Nping 是一个基于 Rust 开发使用 ICMP 协议的 Ping 工具, 支持多地址并发 Ping, 可视化图表展示, 数据实时更新等特性 +
+
+
+
C_D*KLtKwAFj2)zeJ&A6QAF5T*blOrmh`(FG37vzJU3?p#RfLfv!rVh$*SaE|Ny zpICLWVO2M}=eF9`o8x;8R@TSfdO#N+ygapy?_5=mFp2TkGJ>c}Q6)p!l#=Q5rKox@ zHhW9V{_0~P0dhAM_cLkP*%dU$4<=3d3lyTE@u=M|UUJ7C4+XyxaJL41d-Y&j{4SIU zX<~@P?CQ&LW+ES;M>AV^L=KN3BkSqHhEoTTjS_^-8W#)uuLKrgs<)QZUm38ewa!=) z*bkFBzbNrJEQIu)sx!TGpBxQ;b({aWcNoCIK<<#?FYe^P&t=5^6iAFqto%(z!>*yT zcb2#}^^wjPv*Ds*G))K{lkka>2n=HEav_!(TeUfPw<~HRH7nXsS-s~-(T?BH{-@Ua zH+NT5)@ZES;|&IbTxde*=+FAE0kMF^x_RAR#H-CFm$Z{BNi4=ZI5lnEWJWOc4-W@c zVX|NpWQ~;&V&2fs33ROdE~vbIS-eWojuq(M!3F*CBcdAlAE0B`6b+uZgx3d&u zWYb=%-dWkF-h? pHjIQ)mXrL|=A6{Pda)`dM<2_<5K@!GR&ei5tBZ$lf z09>UcZ zn83gSUK#MzZ(oS}S@3&&K05OO!c9tqp;@XqTv@1KE<< r{H*cRyE;DN12M*B_Je&KqTt+ z)LIs}M4dSHEw742DV%7KacVZo+nNR)rzB8x#yE5|BDXYT(!ybyQUvcCOw{HaU~qSU z+s5`z0 1Npc{6 zth_8+L&Zhp79c83f)m*gowO^+-~F?%zh1Ee^FnPr@MPM$cY{0EfOLYr9BqEXM4h^w z-gm4MYMU*MX=!c$$rw$@p 8idE3tuo9K zeLXN8Gn)=^l<>&Oes?w6>V9m#|9SQCxGKMsJ~GRwvN;(B9_A }pMns;LtYjMbzL zBg3QMJ5>)=%PI#)dOi;Ed`oe{g%B^pLI;&aJfxupxJ9sp>%Ahf(=;+}e*KKLKRRky zk;*%g!)oqbZDPW?NO_ce2XKN;9EbMQM^qvs#dd>whWGWPT;DjnShGiRn|DbZI^`pU zMM|W?R7%wHWRgfUDRN0;rXyX$c*}y+w>zQNu02C6-u;B9&Z{?R5qr78>nO<#BYuZG zPd?GrMOK5d1@i~3=l3Of)A bA*S$ zQ>EgaJR(kmCn}%MMSqjcg6@jqyO$p~*R(B<7b)!Kt1 zxa2BCbfZTTIcIL{ldQ70 2SZ7OgwaTNT8sckws}~TRrvEAllm{VueM%1J92|jWG#j0sGq$&G_!RZtQY5m z)Vb9(+l+gIS@6V-jv^0cZRV;;OH^}Um9#;g-P`{h4KmzLA6KE#9-}qi%DJ)fW_JEs ztU$7a+m%iNo~OQF&*yuc4VIsC&9LgQ&ss&hRzxuvuJpavj~nY10sSYBA>VW8I(eH3 z0*Z8*b 6M33X&;DPwV)JHjJe!kcXmcL)P|(fHSTBmw*oV ze3&_b9T@6l%Dfx#nVF)e^=v=}(tAh_8~mO70lK5(NsS=z0(9v`CAL}%(QeqCQ;8s# zAsGWF@DGD1X*Z0M r~BFO{+>O1n~Fn65VR%YKUn^6<2yW-2R7eD$qc?)x*`U z8>nKrzR>r1n?fJ%FPY;_m9AIlMqA|_5F4X-6tLlNlaqXUE3~-M^wMsI1-}^0fOIk| zr%- DPy$p#$O~_tqTPS6 zgmu+(vtw}q>J07eQL3s&F-iyG)!E1x5rmq5WT;q_!o=17g28}0@9g44tp!ZT*=k$# z9mT?U&I$wg`cjr+aW}R%zSeG;Z%pi?kO6Ylt>9Kath___Mgyf7kIX!oV`x5a7i!KQ zegg$K;UwL&cRkIw1MQ%7X%dudn9ROFn@cxxMcex!8c9tU |ZJ$^Mp4~ zrE5s)9F?94WZ6#lEl936u?xfM@$gS30qp8mu4t0sKF^5vt1A_ctRCI~c7~%*fx$tG z)_jx>BtbjXdo^pf2B?}tgPxG<>unPq4rTDMz`Q^l3>R$RmWr5N{`enn^D<7DZ2ylE zElyouK*&P@G$GN&PrWC5RBJR_9`LI}gRuc}v-}oc%ZfdtyKX`I4#|*$HMyD!Uj@TT zZQSn1--1)JDqwGMcsysp*tPnvL^~WOw}Z|Z?F0%2)?_IefqtUpoRQw}Mk{&QEcm1z zEKM1!Lx?jKZB06zl!CBa@IeQvgjh O2WmR%v&DTG{DbMofo=Fas;Lz8y zWNG;R8QazSb?@#k5qQjDdC{arFRAJQZdK9gs^M(;!w`xnB}yvf7J)LvZNb9mw-BwC zO@PsFRr6-^DB-C~Ty>piAX^bszF$3=Yk19&8?NC>$vgre3lLK%e-W1Aq5Y28A-aJY z8q+O|upvJ?u9WYxczc*jd3{5)chex0(w-Tq7Db8U=!rm$scI;p5Z3c(f1npMPbmD0 zzRp=?)9>T#)Gu*SZOrA2i2!6a{0R&VPpJgm^9lNFii7p{2FB&?FJS`2G3x#hJ|AUD zt<{j*%0qtQ>L?r-SSTpygwleNaZnh?JHbgA4t;)>799hr_;;GQ +!iG3Ynz^+E zhLN_0v*yQ*x<$8Weg@dj_jsC46>roy>rAx#J%|D KNg55n&quR$^c}ZzdMA+&%z(s`*rg!T-y4yZ2O42~nKkT) zNrvD9@IJ!YJ7K&@d|l5Z@e6*qVE8C(>HK#QcpkDJ?c#=r2t_hGKVK6H0fsPU?69{D zR2Kk6{ZGIyhv`;~2AlaPm2D@;cTzv`3r978I_$HApIq46gB}$%EjX>op6e+LxD*mi z%2|O$g^iqv{>{SBlpSrZ%@<5-@mvKP=uNHZydP9?^6m%WMCL=AXQ3#CKBdQspQ 84uDsHa1VtHu>IyE)xU1J|N9$;5himZHU`&W z>uquI%L5&4Tzq`X0y?Uqnc-hnWr#K`DiDR-;UL^yFz|^t_O(|06Jt5#{{G(kU5vNp z#QUG4SoL@g@X_q3Ozs)0`{gPzXfqxX&AdO?ayC{omV=($d#$h${6>EDM2b U$}VYsru4x3wJ3l-HRnFc!S4R^yAY|f5!k@$WUv%^t36Rs>|CF z4^O*xCUC~rEZb9%sUYq5m-Sx6C`A(7wfNM>`F!%hB~=g4>Py;sK_? U7$QxvMa1a<%?yV{FnGtEm;Jq!A@9puLen?-zt51h NT=8$M7+rqsm?MYKRdM;rUah#<_yJhv!RNjXn`_uY%r2ZE#$nf94;p%KV zncr@+yHRlY$C~WG^b|IB`e_U7bkZ36)3z(pnlgm9nD$kB3S_!T9MQXB-OfE*vArQb zd p=eKs+w6@sG|S#S&cqo0#8-sEXcvi`l~FC`1|wY_6QRJQ z|7X2%FQRFa0zZ?902J!7o^Q;6LS6jZ{9=PI01nmTAKKa5hdGTlM%|qP0wKhn+BrW% z!l#3$?<}Z<;OMC79&32S_`W>`f8W}6;W>!ZC*8M_GS2GrG{QU>G(BmqnaPvIT4i?T zgpveDi_^}H&OWhOqZgv9d23W;R`u#Kjx0;hcp4=gxYV8q@H-NARnFeeaYEfrN-kTS zJKPz}WUqk;@xjOLbq_zFi6{+{ZI~r!%&)Y3FX2_u(qe-9$y|EW(cmr*G3vf2ww1!? zo{9n`)sSEJ9EwX8;q=N9vM V46wef7=G!zB$E8u25%)8=)hgmY$(y`y7d4 z<2^p1_7aM)7%3f3HrQyV3je5G<;BSIeQoI#)s|Cn@wLrCk3c_{?2UqGAr^?;BHPOv zGMfGN=u5$gLFk G-EB@HvjL{tUL4Au0wGc<@ zh;Tw%L1ps=Z#NMV8qY7$+c;(9jPg)a;5s(qbS7QL+d1isZGU1fT-s;B7t@=~J+fE~ z^_ghKGvs>Xv}t|Mzy6_LB>omty{ES~!0lwk_{4;g8m_got($-5=20 l=~7%e?hfj` h;?_?Cp>Mp6~loT%-;L zf6G{2(%Yk=b LNdmUoFod-~N z^CM% c?m@RvvXO`kDbv}#JfyLQAlRSR9fPvypGjtcZ9cN% zL0%s6-c>s2bsdaCL)#M}-i;5?oc0mPQdlcelX=h&e=gf4c%J-wmT-C;3tY(uD~gFw zPo@IF4;9^FZ5T!IanKyZ7!WyOXFHKcWx7D&SBdNK9A5zrY^PEhAO1VCe&46ZN7cw9 z-g{&%(vGDvZFY@04J>4m7*wbpbD UmyFNfo~o2Xr^ zJ8M1D;pI;74eI@9f>>M5XSEG>Yfjhlga`sISrz^8h&j&wCb9CmrNA10zDO{of!SEK z-qOhE$OVkq+V2`h&$S5b0dlE03OxwWQz|U3WmYW#R=j+;f1+Gy=k-9MgcDg5HuBut zbkhvH9|aM43wBOEoFS#~@wX$5zsEM5B#M5O3c{rYR) gk+kxxb_{+t|p- z@%LZDqsl?6JowS^!66M!@dLuz2EH8(|0MMuAr#_G_Pd_cjkb$D+fk^iX8=?yxGbP` zNB_mTSmvt%V?@DK`l4MQ?J+0@p*xs+U5(e3V(yWuV8bLr5P`R-g}zfAQBj4wDuE=a zB_aEa2>YsqIB$TIDzD-e>67L+{HpiQnIfKd8@F(j`sDNMhK=47Ltma7`5|Nr&{}~X znituq cL Z%u8q#hmQAYdDfS6b~$|@+QYh!{O&dfY%D? zrmN@hK^%`Z_ Q$tXEU_%J-_UWKRtmw9 zVnJcenw(rDYI_c(dR}iz*Y~cf$Mc`>LHb(wf5UE;laMorYVb-@9F$%^enb2w`2^)Z zg^fky%>#PdmO~xsI{cTf(g}$sv+~@@@nd>#kLQcxvV2PCo-E1ny4TmU1dG?-7p1^# z{>cvX9viM1@}Di!uA5Zt@N`YWb0lcy8p+Y-v0aE+W}>BM(kvFI@V 3UP5@VUYHT%sRjK9W8Rc_ M7O4ZS~sI-Jxk4WaD>$Fjl6|qZN}uJOAfO{S*RrUE4M+!o0m*q4Rd7&CRon zJ{O6|-FbSKQ-25Lv4Y9Lr{&kN=8OT)Cmb`mRx}D;#0eVS77qPG5Wh2tPC7^0t#|~* zU1ZcBM``>4R+|s~IpJPE6ghnc4%+=;aSnCrVk)@JN2+7th1^cEMUNn};EuMm+Ai@A zD=jV|W){!@rjAwwA*cVjD}oe{>1t1~PNOYR7riaCUPj$xWHaJ*U+isop3{d}yK?L4 z;!E>6<80A4bVx<*O$+R|2{6pd53Hf_FqU8Th3cm3NBADICJNTzUK|?*xRY+i$vmk3 zkTL_H#|XSkPOf%}x2K&3oyG^A?t!$T8wu@XG6?PX`vdf{nI#9332 FLoqD*=+vA5PZna^f!WDd!!H?JK@r4<@x zorD6=i_1YP4Hp-VTKUJbWwKDReq?N|CBBT|WV!7ZO88 G zA>;c(YN1oKGlq;U^>G}jm*tIkvIR+lfS=L*>9e^OP#Du!Zqpj3dniyHt)O8kR>ewb ziVJi5jm-&Vy-kj>dNolM&JPCnoAL^N@AP%_Vx2{ec#i{yI?^9xfS+cW7VEMDLclIf z0mrv*<{Wq^(U6H8$uDZ~57*Dv >Md<`?<{#x|Gwyiov7*txTu5l>mWUlX3 zJYLVZXcDOMISVANqs>>W^?_|`C{q?CqKk-;^B*3U&zmrs5j_qD4sqcTn-`7?wt- &dEppTeIZVujG?eRoc)Q29>== AW=r~KhKf)>-!fUz;FD7Eu*P60dwk3hrk*M()n?TC7FC3# zA$zkrn)41N{61w?bNzwDA~L$Bw=~}&;c8=efNc*xw@{pvyuCT?$=Fu>Q-6B0y9rZ; z*lDJ^Rx+S=GsFE<9%Y1fBnZl-*R-=&>>cGwhc{zg=W31W@_1YrB_Vi_MZqE(DN+a# z^aZ1$?|{3(!rzc?5V4Iyu*hoL&d{IK-HSU~$-RU($>#sUM4%0zKS|=P6aPcHt!C`; zdplu;y!Jk!NY6|+p+d2gL8?{mEjqRH7|eRD;b jkS-Gqa;&y^lW9eA`M}zn z*$Ckr89Drd22Me}(Qj{5E$8}s`hKf^AlfkIK5VE&z9PU;5Q=Ihy^#@+%Z!UYp@Sf+ z?kk41J4JsS%a5E_djP1K&IpKb5gPool=R{;CeN^N0ST9fpEMG@v5=8Bh@}8~DBs}F zrx`U07j9eNyzhP){s@A7X6-Wdsb+VjkM=9vp!r!-U`Te`6x6<$7lG!{< kA< zHs&{)T>X4DgFDB3i`;xP>WP4E=%M`;Mmd}cs9dgDTizNcAjEE)1C32XgRK6MR3l15 z%rVt?xxtgKGwYGj_Zoh@HXmrQ1r{6aNTTd}nmeD?yy~suY5nn^g!TxivvMeUj0+2X zY!f-kB(Z#s+Z)UH3n8BFe!M&V`}E~g6p~CSX1cN`7jEoCsB_Of$m_^vZTYLQ%avzT z?O!dgv7KTZMSB`E5*$`Sp$Mwbm?a>hI0d*f#e+2yTBr2;+O{JOfv}4c2X6Rj>eKf2 zH3I)Ty++&Lfw|FDSXB<#0D!d*xOx`-0rPaZ&K?U|` q@pa**lX<0;WpUz5~S z3)fX=so!&8Q8DH-v^nm^k{85U*glWB48=~wG+OyZERS>S 2 z()S0GdG)Tx1X{%kzo4ie8d&<)b8_BlvnL3jn7Ajcj2v5?BW@HNiD#V00bWIrIHOVp zFi@MzNczZyaW97blWva`6$MMS^-M=|>K*y+GLUt6$2 X8?6 z(NhuE-W@*W7vQJh>`ifRW7gJk38a&E@gkEGGN$_1Xc4)5F4e`4G615G@;c)i%0}@c z{|x`d68_$w;zJOfj($$KdN4MODI!BOw8)g#z?^b~Bu&W&M)KYE8C#eiHe=wdgc0Qo z!6Xs~E;g~N5()qt#%K!X3euZ$o+w@neDBbjwam|7FJvcTqYP9GBl^n-cV=|_5XnQG z%Py<=9o@DEhctZ4q81jTT%^Naj3k1XfjPQ$A&y2J_9uNi1;0D#PcAuWjOjw9Jjl G!uv=pUwdeOzp1b-5#bZtE`ppa^~<8RHbNKF>S|e%EJsXe*QuK*g1oVb4WEK z!HCmb6|OD}Eqk7o(fn$MO@FvwcWfn5-w!v%R?X?P7pqVi1S8>Od!!NIqj`;-saeM{ z_Phn -tlx} z9?*jhEnhWvF!ynKx+5dk(;kRHWI!05C8U~#?PD7#&RH5#`RY>H4*&Ibw c6A6?MlgWGEm zh5h?Zb)&f~l|J=yoxV9hsb-`lZ8SEX@_mh1{Y6#pKu(#{QdVvJu!7VuI{NV+*Pq0X zn&v4SBKFi3YFCdvx7Y0u8sYcX!0@>MXEb)Ap%W=u?V-^h=g7@uT}Tm_F?SQaJXg2} za}`2(X)!s_`l~vkz`sfC+fI{!7X3CYyQVp+n@SbYhrrH {cw>M*#Az zlb^Dh8d;*+P)9!q379l& zto~yX&Jl)+rD@jD%~O!!>Ej3opELGLZUnZ}5;Rcp*9B_~Gp5*aD#uNE-jvm BaD(Y5VSeaQ+Eh~f#4`kc>UsV_gksYAO;D>96g8$1JM z8D_6O3t`T~G|hR(IMSRrrp5*XlpTCs;Vmv$`j{@n1kM^O-)r$_;K!B>HL%*!j=$x_ z9`}OoH!mLor$sisB{A@%hA(x3U9}+%rbq>}t>?c7u)1y!xr?ld9y|CPUV~^f_SmcQ zqjIWpbiJT_2u8I`fIn=DLr-9s+uaQGe+(3Zp6(jEGGKNjq4ijY^M==B77^^ZT#>EW z72}e(j3gXg;y3kWp?3d=s f!<_#adJOF-SW ?mNMo$5 z!-aGExzNYersN_MjHA+^P@hIZ9p;2!rf=TcW)y{HDLf{H!qmC@sL3P76i2NQfF`ND zLtOq3&XTG}0&W){=}$h5G)l8(1PTfqrrL|c5@9W3+;;7dS&1l3**J>NR&ObN+8;`N z#ppnaek4m0$M=e;95smU2uR)$5jPh9yu*1w)Fo~f^2(A2avwkXmVhy+#k1+naki?? zA`1ZFgt<@cSG&uPAgNH`RJm5I%;8F(0sopNpE*~4IpJViw}#vY$s4YOuWssvH{DLk z!Ajd6iI4X2+pqDX_1Pq1*#e?0EGRcQgaS+Q${@JV%}}lvpncqYo05|-{09#lTpD6? zE1Jt<-=^KxSHTuN4rK+Lfai;$R{oBFColD?>0wjqmR(x!)iG$NMlPmU#xFhuZN+93 zVtO3Z?WlU6bj9JABDcsj+a=UQ6w%KlMPmXdge2RGx#KY 8Jg&H`P0%T&uI3VX@ zsK4c~0~Gm+hp;TbA>bGMV#$nrzRnZao&N`b*%?&V1D|SETSEFZNO7!Z7vC$TkG22P zWM^g-+i2!F$0~kRKY=G(j+rl*ms~BP@||{!W4;J0MbfGWb)NaeZK iH(yYU&NRS1=rGs%LnI_hdW2jO2oZ#t`j(6iR0MPaB!eO36(%x)M(#Z@u3HpNJ zBSwp#Z622jkz5AQIdbIzD_)RgSwYZvVL~ort|863L#_Te2q+LW06z@BkfwmV7qtM; zB3T-EL)ZiKmxyx1tVgcYtLVq=#73V?11Don17yP@PWA+nh6=DDv=5m6b7FIkGD$ju zm^WOz5A=;c?_Uck0MWM8x|Zl}2$HxrtE@e)@qm4DfwQ&Z*U_l>iF&XuO?AQ3fXv$P z53&VvUmThk(g^Wu!2Y5O-FyA|-ua%u0ib#r;zQK>)2UdjyVcIH)@+@r6WLgHyL)Qj zCKYS&U6_mz(_k`I6*3(o?u*A_aksuY){g80{2bL7Cyfr U!&ALH zNc069A-x(BufJ#wGhHzx?J7|IEi;hOvGYMjzjLUp|I8=~3zo;ac*dWp`He-+ itPr+` zb$@d#Z@=+5TI>!93GwMjE~fqy8eD-+t)q|#5<(IxmrFjoeGjX2lWD*SKe 1(jTd0VECIvJ*#=LdXkLPHaMa< zWgKbb>Vo-mpILFkgsmp_8$`Gr2*0i++V4S(>~7Z&bqlr@J6txFtKmef0D53SL7H=^ zTf$Ghb;QA1rfeMkU>8ouz(hPoNJv#U5<*6X!SzZLbcsOMF+@>l5=7T#h{DwW(_HhY zs0ha I;!umNXY0&tz z&+w!8QPTlWD>|)7fxc{RBjviVYjhv*nGL<9G-WH~?|g{+79#&}{;3Y3yax)AQK zwev##9sri4VbTwH ?})`fVKN2P}nY&xm*T5aj%F0{|$u(9ytk5 zNlB^IAv!wxdR9kcsg~b)ZCqa3@=f7ql6)a;O_RBd#)%$qcO#wK@}$;IzsV0Xl~reO z7vK@zHqJ6}rVzz(>6@f2z*o&|ip)B-Lj0?_ vW+I5U Ftz_L3W$m{2Xq3QwF2 ?qaBw V$E&0BY`m1%7;U zzksOjJ)cz#aRgFr231Rct`WAq;w!58C~1j)5?Mu9bH~Z5wO=*Ea-3I;He+KgxJDze z3;RKR1KvOaN`BXfBXjcU&qJ^N3dYOGX#dTuB?0u5ZT`{;^XV)W?$%mc!^rZnefv!7 z_~80!Vxh>X<4vvLZj)>QH_~(w+xJH`%v+xo_~5wElAf@qX?`Et%~J%@_z~r$OI^*~ zZ_bJq>lgJ_z{DMb- gAPXFQ1<_ zue~8op5JKkfS&MFh>9gXo8iRz-u-v*23*c2PD!6}WT_7C-WfC!{52-~&S^S<2%MIv zHSOs;(p0(dLXxeN49w4s!o8<(v7) O 0V@zUQJx6+UNU@eGtUlL4LzTtW1O!sRe;?Vg`Epw zrD}lxryKcqxfg5xXAKu2nl7`Fljm7H>aVYNJ+M@0$cbSfD7r&<%A(#3Ub4O!tsE+p zKaB2B`+ >*kmKSI+k`c_O%2cyc>5UaCC^8IU55hxK<3dgJ3*NT7>Xzl8y;oTM6)l;Z zsn|jNu-Be-O#3T m+W8#i~2HTu&4gU@}6kvn0ikwF|0K+2UZRal+`%`L=6FdhZ=2`1W z*S#l|4ILF|%CNQMKj zlQiGD`f2G@JbMCE7@5v_ZZ;6*fyBh9u4+@%Dgz3KNT!z&u?81ypFb>)9T?4-SAH`8 z<;mD2r76|^0)2bd$hA%9J^wZECEWOa jt{UrYDw!~|wmk`RGS9l<8j^H!^)E9N`aEu-*-EpNKj4@wk@<)t2TzvHn zs9?Mga4UGf8>{WH$*mxa!^P-D5dbazMJoOsM}Cy+hAQ0w?9I{${7vKr?}>3;{6z}1 zPVO&$`xPpm``ke`vw_oxC{%!(3O5{cd$Qc1T5D1x>^oD3Z`1(JGFZFob?*kiu6vrEKO5<*Q9-qfg|-4GCm zu8K>cphq= $hc2fyf)U5Q~390EJ%yUr0utdcCl&yI_Tvm*gqG1%& zri%hrx(@iA;jbj!Nbb8^(gV4r5-vh#c<$}{&|2(!b1~Xcc;I=6)a7bS5`p`F-(J?= zzA6w{#=*)cV}1fL21PXD({-Qww0C|2QpW4CH$?lRS^Yqu{`3D@WZ#(7PATJ1S&;P%l8`T) zmNK4nUTz*vH}B%&)VS=U2 MR?Igyi_A$y`L-s|-m1LLc zFp( Q3mgM+SeRs>bB>#wKf5UMG8{^M?{D4RMAN8_awdH3tW>1W5@ zOx6Zg){0|FY+dMle-eOYl4W%Fv;tG!xHCifQ*}W*&hzkHyk #P!u|x;OL}hS^qlRy8~#))h;0O 0301t%9gXs_sQM&CPue zCBFoiZ*KZNQULM yS{`ACn_o`@_D{Oh#Po~ z?Qkq`^^^4NT_oE>04-2&Jh=^VpWN!M?bHXGv(pIFb01XMZQpQ-8xziY5DPf1FmTq< z6BGy9KIbYa-S#lg0}3^+5wYes>w28FU3(+C 8o;EZ3q?z^-sfevKbF|+TR{K5Ef z-2De)^6ja=0@j|p2gMaY7?JEyjQ|=rp+yq k`1Zxr6S%RW&@q-0h9|27aN)D*mo;b@AxOilL PU*qczH>e=L6}Tu^#*G~)!-MtauPcvpW_o1n*oEmaCr zkB1Bw7T!Rry;Q9Z3-3i_3=$U?Npd*{#jtQgFYLS9y7I~|!c2gl#d&zMZ} 4J z>Z9)0bp4lFPkr}+B*fWUAU`@kF)DYAFoHq!R# E*{?j+CR+8r4VWa=yiU{geBySw5Z2H?2 zrdl(IN{HT!;+JirRl8mFUSmDK_!+{C|Nm0FKF!6lQgn=n;pAq$TF7Rr%bwZfEMZ|V zoHZ#YApXc@17!|Y^U`mJNgnqBoP3q{MUw4azv^IWH=f}ARG1aZRqcZUE?Y>?d#W)- z)c;F&`drc$hy8y$BuuZU5W<`Qk)$Q~xGiog*iOsF7W;U6q#)w;Y~%f+6!I!4Oz*S~ zHBy99rW0<=Y#hHJViU7`{D>n+Ein`jj)Z(moey)oEXOR{OGeQo#K=v}^~Z%IBsD!{ z-=L0bO|FkG1x!4mA!yQ&`PX=j&J_(ldLCV6rz6lX=EJZd-xyt@5BV&$^aLJ3lQH!$ zATe)avwvw(IFy&NI^Vsp9 a4xLBZN!3pEi}e&46bO{n|Pl`rR_oCIzTqBS*#AvlMi zyFrZ%Qy6VpW@4GHICzU4c>(jH|IXGi U+}Kj3i=J>YWn*6_?X(m z3P5Kwd56K3r-GwEC i@!Pz)*owFoz*bu$iek_mekk#ft*LCaQyO2_l(&bB4=+H#CBbVGF~OyJ zW3$h9#P8S8kj@g1^?`Q^{gY p~8um~#TziI?ngFcx)}ep3@+-xV$)z+o}pJa@*>MHyY3S>2Pnf9P*yRc{vHj#T5+ zmjKpIRD-3pw~9z2!)|sepUGS-kQ2TRB&95-++2;5!bBaCFa$;ipC5Th0jq%Rr}C@G z%0e7j)g8I*K7Kj^V(;J%f2YFH5VC^(E!IJ=zX(~v1(k27g!M{m_V+N?eY{2Em-)rm zCn3?2fhgGe`mib&xyuYDuW8lcX%_D!wn}U`Q-Vc-5Yip_;BU}I)7bKCPx>`QzwP7X z2+*=MccbrJ-HM@^Q6?r*j6UY!3QGHg7^W$3Qu28T{aS w_LasW;>hnvU=2`y)KfV2IW(h3) z>%hAoLru-OywdZbM!01$Ar9l`;n &ef-0p(W!4OtXq_6mOL98JP&hAmsYUasZ_uO1q9 z31Ew^K^y88RC|2))9AX7rs(25B+C34CZAGnb06!x75zULyBzPtEh^2P=sWzhCe+ja zqM0l`lh`0VBhcKWqo;{2CiBHBv8bqlia#z~z;&(hB9p!sod?#cr0N-sRGFM_l304I zUGGwdX{!$Q|Al_rfx=RQD0>9kKKk{`IjQ|TjDCE-t>mY(@pZ~;f)IWXK j|?LU^U_UM(w+|QKMP4kElWM768`~R7d%DOj}cjS z0C~=8QkTwRS0}UX9b|p~(1D*9nS<@ymUHVidy7W^=tz2$lq#Ktqm)^H`D8*0IX*Wy z)kejXSWn$pOegfiybm^S>#J5=2i4&EU))PxtoyGKRV{!mtRB+1SWZj%j%!V+KrEdj zOnKlSZ1;$G=KT|OyT-&kk}HCkhlqodU>3eDbdp>PtgjU3OV hSLt_}7q?^A}neE>#Ihy*_C$z8V zYuf+{;;8O3JdS|RA(=Ddf+~3;le^5f_(hI=>w?{ Y+-?0DF_4JY*Q7Xuaky^;JF#ZJ3t6F%N7*|N2a`9X|x#5;T0_ZcQX3VQ#uW z9G@3C4!NZIXZLh_GWcG_^x?93TVRN}r_J!pC*rl-|HRPG@8>GNcfGJ{29LB+hCJJ! z=qK%iYmSF>MQ?C+jx5ZMQ$(HesVaay9maH)WX#`SxnTe=Va%#BwwSWox2h>lTLF^X z4U*P}!dK@NSOc=%!Q)MfD~o#2A)W2upnb@;13tkXS!(0JD4fjaQ{mNudye1G+!^}I z%Yr+(L7sEv{A0w-x|``2Lz+3g?eo76e+UX+S6S;T49j#J?}YpRWf9N0+fTxRf%h3c z&>Z5{!^g^*yZP>jO6P@eQ%nsPjIYn*j?&i$iDa)$a8IUCWc`O=1r^vu3o94$+2Q?1 z$iXV_(tnJa^T*QMGJ2z7cj?qoc8>(AKR4PkLSGhYDG50qg}cuC(GU4`%VnN!DbTQ_ z;CZ$@=kB&*_p4N43aAbD$`*hBn?t$00KEwN`SLy!LO6Vii1 {6|ScWNpo{D z^6+K6OO32v>K4ro+E0)~&IMk+Unom4_-_CA{CzL_?0Z uAwr?t`=~h2K$OZO>%FzJ!8w~ z@9YK^9lIE5PQ@(NR`7Ye*z|j8JJfNU4d#8(c8(zF-n`+M((lR@iapl8&M46l;<}K= zFI00yfI8 7RSo)#N7%+vkXsm7$ zyWO*pXCeo4RqUV;+xFgD3``f=(J)t1vdU%rnDM=`&nGYUkjaFIvXzY7%S9)r7 zMn$l? Kg+VW$#Yw~Q1oYl=JtLpa*lIe4GD10FWUn*_ K8>fANXV?>H-=H4 z%4#jLo?(%ZS}-mcmJ7z4tuYe#yR;8p;Fxu2_z(=!be#(i`ptvZskcEFF3A63v_%E* zIbDGfZxNA&-#;1LeiT9|95-|PVjEE>+M>uxZ#@Uh8^9$XL9TI@>!+*S)}3I?sNe1< zVhZ|O#gBYuD{*rM3(B0g!E0q~s=Am_0Lwkot+vd^ur*1$bgRBs|FU%c{j)-+46B6I z5_42Y6rvvlgTxzEQag)pKUd=)f6WWHB~2` W^JBfBw|Aur zqX)hF35M-DE@adG8$_zy{+z2_9djn$LM4L4w|N#7MJ~u@#tu)OvY<`Pj~q7`j0?sW znQ(4+c{! s!-9JO5AC` 0P{ Y_EioeyZbX-Q3{1KTQDtffkR2Kg+E+Ijir#Qk7%G7!HpIvj0ypWF{ zgPJ>J?c0@_aNtTn0Lmk|$8k{_Hc7{ aB;t9N7C85`_LN;YFeIcJz0|5SAR16^^Aps(yoD}Q35aqM3 zG(>5YFSH+n;R+BJ*I#Sg@BXwi3y5LR9!p?rBzK$&-Q~L9n)uhey~}b$k7AQ?DMGIA zN$HOgJ3G9XmKz*P@1nPg>ms^L&XY9& fK5z}? zsr3JG+DOE0WHXUok>_vS{uURl!aeb`NA55Bxc9D@&&$oioQO>1Bb4oSi&spycBP%s zQe22eC*a#XOM~a~!BK*THSO6#>q3a7>r%Uwv@~5X^e!HZK^#iROsrC>Q@@c*?p_r5 z{R!i~dsU#7coi*hhUc^^$sB>iz`}>qu^zf^pZ^t%n{0P?I}!YP#-mV&jgxn8DdXLp z=?Kp*26{W&MfmpITf@kxt<&u)i7h-`%k6 sK|}V;NN&OFc}FkVm7ji?WRDN^ia#AURl>N- co%Xx+Pc@Q9Svh`oT76rCEr|jMCMf4nl4q) zqPAn)XZ$?HJg>LRIkMh4lJlU1K;ZOl+BtH5-}h}e6+uY}@hfboa<`s3L+l66qR;q6 zO*K9i3irtWnNHBwx;Y6()gCp||Catz>nCmgrGQUj8NW whVSMjQ@>L$cwF;mtZJJ|q1aNi!d}b#=qTDy!EePR^~k>q{v!+1*AX{TzxS z_5{?~j;Ed?d?&!&`MEH@=foan{H$!tg(>+5S=FqJemD}knLVIIf)NDE_W`*A>V)o@ z;ZZ^kR$rG}lN##nis*TlRF5lGi~PMa{=%#)m4X~Fi#4vaCG=EmYeV#Ua)75ceLZ3a zUT`3exV2LS%PV(o-Bk^Nbu5$QqFr|W9S6r2GXb77%217GLKe `ut#Y=Oi@kUjBPK)j^)7;CD zaN2ROAWJVdbwRrLH&E?ml3z+d!5k765%1HFE%x);FU e!M&BF;GuSH;qsyl2e#LPMU^JI>siBLO?p9s x&e$lUv3$;0w zT21njdNf#!N2c}Dm5`9D%g>WYBt sRGYeS&Y)Q$_n#hL{n?_fu2s~o0zfohZk zDAppW1NB>b)Zf!oax0IdJ5=vAXYp~-fZ+@jAD!G9)c*qZ?cj-Jm*B10=JvY=ehC?R zy4iu)N!C{QCFie3kOyNYXyM=sCXC^}{m{6DHB2qaKLn~3bGFdX$W~0ie!Tn@c2p`@ zmuvmm&n$VEe2GNyLx8Ys4xxhkvmmo!G)7Kvcd3 (n$*%zJ;T v;q2HNJ_ppVtLG)ShtcY=4h*Ufo!Y2V3-9b3)3cd$wyEq2 zW-@E!LN2Zz(z$uo$-f}qrG7HOHBcRwYjK-XPUSHA;2OcKo?X5R&7%gBN`ZJ(zO%C) zc3h>lp1HmsdG~0sKI8@k6vI#5RQd%b5#CJCp9VJaa8GtbvD?j`^erpNN2Uv5O3gbv zXwYJ#`pg>{NVUvb^65uJkPCK)N Vo6ea^bO4m;-;7H!w wWt|9^QGM zu3WTIp3WX9O(DQWpd=0pye@9W;w}^S-=Q6wq7YH%l|_VivHm+_(hOaN@^S@;F;SAx z@0e okGK3x;&+#TRMpDlO2H-1{o^(oym=KXN&_UrdXe;sImw5K6c#i6kY!zPf z^Gv^@%39KYm=;Dd!v5Q^err2d$^c(*5RGBjo#dw7Ph%{CP@ h~F4VIn8A6T($(yimb5>eq`i@A+`$x|%GITw<}F{g3uPqDyGfrqvm%-CG| zAMljSZ4M|fEc5UD5%|YX$Ba(Q0ohylERto_-!@gZ&UTpVe~P<3m~|R%E<^wO2o-|L z2weP^fm%FdZkFG>?IIIUN=ZzVL`z$zh=^EXLvj{YZ^R~rAsvUYsNP6qSY1)mn!C!7 zz>&cp5O=(ySE2LQgUPi7VRO#bpHnM;mMOVQMlE|}dDB*=W|+y2ITMQh-7t_B#0_xu zI5mF07TMj05fGi6DpqlO PGQ}`X0 zpi*2~F%dNakFk$D2_?x@!CtG y3O%mZTQzsFsFhgUH3qZ!Vo+yEVuO1pc$?EgA!^ zJY9+N%0h!>4xeA)M_8ybb#Jm#*I}fR%Pe>L`g+}O?e=75= Yx?|8iR; z<3FO$ADWX~)kbZ!cP1lds(wor5yw%K?U5uPkP;Vvy>$GSP5!r%a`;*(Wz^(JS_Dy6 zpwJRJ;+_w2it^Hq{sPjt?dDu3#KW7ORtqZyIy;m-{Yz_UaKDWcMW%2f8wwN?djB`l z7Q$)T4M%^bXjRNB@NEfyER8d5+tOldTGHTdCBe_n{PFrA`S%XTdZ){4$Y{zQcZ;*> zv!ghVtA0;taQ?vkMFOvb%l$B}=ULaCvH`Lsc-Sac)c1M8Tc!>ZX1*inpe5l-PAuD4 z&Ts|?T2bMQgwTZ1xI=jZBkT8D3qB`Ll#!F J}xBFEoROShdRKdQDHwX_3R73;gA)?a+(MId1kn=k+gmHl=vUqJ1 z9$|SUMuhpA8CND$>4t891T46%5i7G2L_r{Uq)!p`@OtD!=(s@deWYsGN|65^+!Q*Z zUGh)fCb}}zKGj{i+l|uog(#DdC{Q)5e4nZ8OsnidX5T?uq3HQW*)=y#ufrfxcNEde zQyNuTR5!e`VVraA9!~HZIF3RyNignYtGYAi$EuHt#jwNKGk(#{?qU^OJUJMj#SrUv zx#Mirol;;>s!H0EZH9ulGh5->r!Fv=bXt86Ny*H)pRV)^a+loFP;FX46GW{_}7e z56^tap!j17PhYVlTnzhQZkF)l MtW$jOv_!q`I5qD&uL$?>% >**cbukXtHif;qK=xW8Z_l zy5WZmi`8jl3(`W5*Zkj#y0McPqXYI%l)h6)_6h X*L7zv{pLzx^3eR{r* z&^x@L yoQmN# s@a%AKz#Q#H3Tozubjy`iJWCu8O)KI>D1|~T`iiAWt? 5o_BL#)U*1{ z>Y5IOQf*R^oSE*)GmMwWSMRFOCN{*OzA(ACk})+RlZxhdt1)cWL+>@uE=$s?Sur9h z&nZd=Io%Z)FFPyB =3NmFOGeDoT^*lb>5aBauv9hkF1z}6r=!Vj}~bIwWYF&8grC6 zrEjyXR0J9692;`VzqHTgD<-lvJ%^U&L(-cJdYE)55{kIYb- ziHT2-%poHU5`}`DhM}kokE#q-x>&L;db!yZY=#Z!nVq =mj lJ(d&k;?s=mvolxoYK2@U 9xK%K~1qK%pwxtXURreGh?Wphi9dz zO((2Y{Oc4^3H7k2JMXsZ&bnqrK4x2)Zy0^L{T-wZM?*fdyux+>l*<(;ExAmjex~`U zD~r51vOz}CKAQyNv-blKoecfOzXLe7UX0Q|kuw)c$rxJbBf+jNFI?(R*Xxl?b!v0o z7ct{dT$_{WwxL={e(B4n$-s{~srJ3Li+wn{kCstbshPwEs-b-BZGX2bJ8^zjkzPwl z1+h^s6gN>UmE~pD2~qqhqulv^@B *l*Z!&bjc^Tb>i`xv#}3=Uz^kyb=~p`g&-QhK9+lTD{#T;ZPu;~6ws%?$~uvnO%D zo-bn%nysi;<3_9Kx0Y)-VF~?G#2wUa+H^HI)+8LM= Y)idffDsG8hm8`T@=d5%uYsH)?r zh>GDdpY7Zt klW^`qU5)S#2F|{Xov8A3L<_X_xk{bw3Y9PI rSY z8MWIt*na;{+7!RtO8^QHrym;|buuw?QKVMt^0rFC SN(ca zkoX@w >v8f<2rF>RgPMaj(=3XzRldCB#2-ZRtn_7zfE zWiIbk=UDt*N d9rmZ$=m%15%1*}}3;xi{T}8wd%}n-_-1BW;}SA_9b@E`s~!BY(khk3W0b;^C0w z_qEyWs|fwwwtC+d1xzRswWwgWq `J_XfsDc(ThkM U7qzD%v9dbO~(1SOhDty_1)2;^z-nLo#ZS zHV5 7Vnh4i(vG_a(3SskhzN*qWde^bM( zz)y7_-O~ksgch5P3b<6d#$ slDXRz$npnj|WJxXpFpl7&6oR=zpMi&I&|c*BidDQHKWO z&RVWm+!2LIbA$%dT2&cN+7>x7%5jTV32$UBy;0>t(7G5Ld^^{eWc1A8)YMB%gfBpdjy}6=&}7X^1f%U59v0Wlp>aXJqiBqgYOT(ZXoeIbhRr5UEl9p zx6UV)A>G-%jI%TjA_D_hJ;c)P`@hcwp|Ho#qkZUZ=VASa1PB-K14h@l(TV=dfW>k_ z+x6?L+5NeB O90bZdF2i5cLmdMi7aD9e~vOSQ>$~&m9EWSPQy35#ZU)+n-g6 zlYUhASgtRnD75B&y{~oi<-5X50u|zW&lM*boSaej^V?@dHkS4LiVRvt5`4ZgCYei( zpvM%xCi>y3|y;q`hKk44yNHEi~S{+>OMVY?@j>4PEIN)IKqqPAyEd{DP zPQHunX}ye0G?LJ4W{Rt2T;^HuGHMC+>`?;ao8&s z=ht9}KGP9gFs>gt4Sf@yHa|!HCe6VUPGTTz0w Lm8-5|I z!VoF|ljZk_5^%ng(KcyK(Cht>L<|CiA}sgsJ1=ebugp`56i-M)lZXZ^o&&xYrN8ip zaXXwmIb50aQw~tKOaxdD*t@vAI~D(ZLLO8OVs#W(oDh5ece4t?QnqIjGR>xfg2gIT zidZZw;v3i{;QbvMzHc$~epJyn5NuZ3@K}Qg&3mwsR3Zsx;YpoTsYce2c=3<~nePly ztIX3c@#ZCv{R{eRMXw;-*k~P=4o~p}8=qL2E#w{@pZ@tT9Mip|OCfCFf;31 chBXwR!m&MYfb6&BF4U!ttLoQ^E=V$GR>nDv#w!V@H=W_k2{l_TNY!(_?>yd@D93 zw*+(SWz4MK@A6s3v!gl!=^m|&GoUIM>JReYv_n+atCj(_qDiQe28qP*AHlHjrF&MO zJj^YSBt%{mz;O)|Gl(!4A&Fo&{(yP!0BZZRp>BJl9PST>)iR>KH=^QXFI9MS-#hbv zg`Ws4U8YnM1>(tC42edOC{r6AJZQj$9&63qq2iD*NcLexnB>ol2v;=11lQ37b(Rhb zQ&3E|6rTEFm4tZK##Nbr8LgKi$)kZtR>~yWAsjK3+WoBSW|%Zrse6N1T+MKc2egLH zOgs#%Ntu`N2*}u@@ZlGkoTjfJGTL-^67_WFLdWOR({Xf?MTdo&)N86b3#nEoj>fM5 zo +$jy5v?9+N*daBv_vC0VJDx+hqFDV?A4!+HxP{Q}Cp zOuUbRsl5WrX45)E^m%byB~^z41@Kam0Kv4I3H>~i2N-`C{t{AdJy9PzPr~oh bAr-A*=6b_a47Jekn$Am6rdC0lm8KTmkhS^pEy{hQ(7KR$HZ3J{sL8Tg z(q`mnIlrXikueYVk1JUDv|KO&3%dAXXt6=%p67MAHzdXnO&s)w+urH@9Y!1y`uLFk z{>j9J+BdL|41WroXiHFSLb)5D1m9@ZOKRQO5Owh!^{A~U=`jpimdZ8N=D)K;ih#$( z*cF+8$AXI}m-?bup6h*N-JSUmIKqewCJ+rGv-BO|-1X!l%~OK>$*GK{2$`udQr)vf z7)0Ivo%J=9Aj;xAE+if^PCmCoKo|e~m63UO Xc^Ssjw)=SQCCbotQdJ_1{SkaaKoCC$x> glX(WV&FUQ4QueJ@V5&{kW z=~aE8R~k0Yq`=lbM^<=kt5o2Tf-F}kdzx8ma8dzpGJ
3 zJMJx>ax>_lQty;;k)fS` |7V?SqNEyVg{a;~8<)&7gM7KJ<&RvlR^w_c-XhG_j;;{XB)x zH(5snN&K15BHJE(w><(5|8_=n+-i41e5Ip_7Jeu|4S4VVsPm7L@=Rs~l`6r80VZ2^ zGUfsIHP5&~d)+6;Ob5(cf0Q*;zvKAmSxw+LT8LX}aGk|d0|0~k$z5_8cR~21jo;`? ziV vt YQdt!O~4q`+7-xsKG zz=FPq5G&qNhNs^DK8}!~z >|UQ^b ;FU6ImgHKu4_L|V>PxL+l_5B zw(SWTr*RsiF&Z_tZKp|Nqp@wiE5E(Z=j?sn`D@x)vu0)C!S#Ia>jI04wX_$jE!*a# zZU13tQ#nJDBk`Feg`OiS ~a zm;)g9P^MSJw -OnJgj=|K7=GSb756)dqPt%yZ5+ITW$%2!)F|?>8hR zPN6pl7x1V{`%smfzFl);spBR?r23N#1-!;9eq%2aHzIcV&1nqV;=|Q)`f{llFL_Zl zycGMzHp 3|G$08&01a`U1>gPac z3_Q*RfKa?vx}VC^?Wdis>5;d0ar$E1`gu-cKK_RAtO5{z>x<2PedRRay~~jwrT2|G z3Jkf%(L !z)(#+a&wbzTC~&uV~us;|4I?*7NJN zDe>LwBR+k^{i^Y39$V2l%~Ad33zeGIN)UlgcQyaU5h($7quvE+cH|zjRQA;vrbQ@G z1B>ZV-9aeT(;hhC?jFHQ_j>bZa-)YDvxD8QwbSA;Q73BiQFdlt9YpC%rF)HT%G8Vn zojHEB)uzKLiz+P5I{O7swdTK705DB1VS3^=aAnW_QK0s>p1aSwR%L))ai;E{+T(C) z-jXF(>(VxltJRON4DG0%Zmqh03A3}ap+*k(?n2V=Iob|=gj^IG+%7U1$MUI_#~ZB9 zcda#cH)Qh-p+ma_sWhM`H}FSLcMmkUPG}+Q0>4?;?V9z$1+@O89b|*OIpjBT$*JVe zU?u~Rm_6kDUE>%p4L9E#<*lu|PU&ok<-e%8xsMLD!_Q}F=VWQF%QXZM)%uwRPy}Mz zC@_9eEZb^It0`!D;x;AR$>5m9eiFoL&GPs?*OfWPrGc+7_|SKZc)L8Q_1Zc8T~1Pl zV(y-i1@~F8is5HS2fu2){p!+F4Y93w!W48O!%u4lraaD @4i4CDXaJ4EW;d%$ZpTbh0Jj01kELDZfPad^VDxP4H!C_W_J>g7c z=Kw>WeIHf)U#AC|9_6q;vg)Y?nxO_mI3p=b!JDz&XzQoN-`dJ|A0fFH8iMr^kq=5^ zjwl9iW(TVcs(I{zDgG?z3gc0q%uAxZuDsRO?|S >3YrB!iUH6lx@!ocOETAW0D_cxJ*;|-3+{hpgS$AC+j pB zrAy+|sDK(S>0@mHPD-DPuuMg!-G=_+YngRhO-V^jU5d5`Su}S**h%{i4Tt04mGyG! z@6Dq2dXT@t?Ml+Pz#`R2TmLY6Z~f8yOl>;Psd&8}@w}@E{>^R0x9CWa^ 6qI#6Y)o|9`>{BaD|8fm0N0T#;>()}MI^ImFj-n5c z`n#449l4zNIj{EdQRB#F(9qnbBhG70`9?!^=8n`ur->5QHk(ez_?O}9s;%CJxX2#+ z;M@IH%qCcKcKGxd`@ CO}noF-)@wK+AOm12Io0V57PQ=?Gn{+9C;|O zCwtS?VLOvOg%I@o4JBJ zhzUBym6F@7*8!hE+QU$x$BE4r$b8;2JQrR-o%QJ5s_`-R+_FAaTO^x~=&RsY)*^eH zE+tRkTgQ0(Y*HDC#~}k~#_U2NFJo!x=v7HoZm!ES`VB2|bWH-gPa|q{Y8~DW*FMO; z<3YQvJOViA3AkS5&D_2ZDNsb6Q=lIwN%&<&6cm0cz*D`c0oxJFky>v#K1u9T^J!LW z8Qq}O6e0SJR;;f!JzEu&XKvH^v$PF+Id5W)=rC0D%W9z_1}hSc6Z>J2^>RZwty)Q9 ziAsG*J^`)}fy=>^_>WJ@B5K7di x1TM>`;c(Pul|Ul6uYl^%)e=?bbS!+?zJ42NtR#^TSTr0c4>Wo{`Z|RqXj(P zte@{M$O`Em5)=h!=Jm_9IqIEvWZtR)e}gXoQ>_FLhjVuYGF@)gVi3HphuZ`i?P&m} z{KH_b(ZIk*kapOjLJvc->|E=ZkPr(%Rx$K8o`Q}SNc}(xn#$u^z+k{1@#AgCF5kwn z`_Y^pCXI?FD-|MOUq^T6*%yZPIv)?A?1}Y98m${?wC-mekwvG66x^+p{aRZyt#)0} z`%wy&@Xb%jjRFy^1=e#V1#^`#_?u+Ycj47K2#X;|zPR@Q=CrdU_+;zSbp-c!?8kJ; zWC<;LCge1-ygFvm$HbR>j6j0M_^k}7qr1=!b ~i#V(7(cXtj56PbCQ=ZjIQ(R;>aPnceBNOq2C|Jh SvM7k*9H0Wlb&pRj%MTCt 2JIdaFo%QY{{_>#R_Nw2}&w=yP!lP}b!wE+-{2N%Y0zSy7{j_duxA zw!UH}Z~vRNvElm3BOPr~FE;u1*~Q=NlEYD%ktTUMshzQOuF8B+OSQ)p6|Prgo`fg; z=@Mom@neJCvgxr?)CzeXhIoV8sI`q2jpXhsmruals_qjI01Bb6_~B{dOu4sbEm1D6 z0)MFplN#&64EE-wsPGKo3d6g>p{b<3t&AJRl#hh%Y1Oa6y{V+OO*cMHEle_6l*xb6 zD|FZ?--j<-LqGF;SmNYGDKae#;VI}RiPsK|U4B9whxxh`sUn6fwj%P}VSV5Y)XT&D z76ateTcg7=<5num&^;9d43PLOCW(m4Du&6Rq6(O7>)V|ltOCi3!`dDb{C7ow^K8WN z&Ah=~Hiq|kH|%937NaiCxu^4_4T!pPI$1mRcB~!<$`Xwt;+NS~8PDK(o)<0#-%7A? zSS|U%>rA2W=AhXrJcs83e)p}}M#zKAL?e2d6@y;@o3Q-M2w@U3(twMm_fg(7t{LLq zc8+h0UHEevsKIJ_ppqPn6Pr`Y%r4ysROQx^`IBqi`^)JKP!ID`Spa1!E62k<`Q%*E z#cwLt)G3$(xQLrZV=-upjjZJAUIOqk+@y-kQ4=!Z5-dThWt^gVN&aDxU3F33cpJ;t zllu7?0Q{rB ~U~Mb0}T{k3esV?g;X zubJsmW78?nqwzOyjZsy8Qd{USX}zaG!sk%Q_I?f@!`)?aqt OcFKX8@GISDwjxq%NP@g4<3N@(S)yQv)Gq zg}iRZ`_%YmzJij7F%2LZiMsEN#gpl z>Su-6oY9au^kY(T6D29)dOpv>!{*|Iu{({18 b_2NeK2Zalz5pG czFj{13Y1 zsnBw#es53f*5^OFYyO-pZXsHK6v5{|U>Oj2*iHc3BJK~)sWKTvZoW0v{+7Y#u3)NH z=iKvkqbWu*`eWePik9Sn%_qduRY1qv_D0(gqXX!4k3GT%AP{Hqk_ZHl8g&ly3ej(t zeUipvXp5wtDnNbCZ0j9JrE%D_{cg?crq%^fif2A!ag(0vV>3Jq;yD>YO>yCT<5Ywt zsD8W8`%Fg#=`=JwQE1T^$9)zV%c}ezOqUK7Aj87Qhw3{4dPMs*?QKE7JxlFIj};M( z%QuDRONCEQ5FB_VH5A!p`TPtvtUqgxd1*;0yevX-Ea;oU4{WczUR8Xb6&fD`daEx! zy5c?rGW-5+wAz(cBxa-r;@+gkw*3Xc_4KOph;MTBx?f~f_Bv)dzic|OkwMxsyQN#h zrh5%6^gD7`F6IW)e;iu-x`lLNsERp2)bP~tbcR8OjGpIywpL>)qRtHCVIQf8XhNWb z<>e03)41+UH(@lAxXm-N(XJP$dJ()RUhS^GE>g~iDGC1zCX#K)-`cZ`|9Pm_dZEgQ zb-h{LMRtPK8KL)=TTs8?r+vu$hVX?OR%?Ri5*O#YKUTrR^ZAE-Btr~MR zAR4e?%$?vDpte5TKpB>SDlNw4(r#dNCTtTw{0%OhJiPKD4oA}iG;3F2#Wo*0GN#Rg z7=eV+v4KRvU>5YlDKM))jsq a1Vd4MRj=2yvrc+nr1zdp&z_ve4@YI;;o1(awaaa8cubf|V(!|gDJ-IP3br$P z-8z9aq>6H2JXxAO>3HL|FXVdSc`o(Ex%)mSg}gQV>0t#lQ5=pz{XOymE~m>g==h*8 z3#&KP1fWTaUat!Ui#7B;#9hEA5CT5n+MsXMSkGFENSv><`yk`A0!y^Yqe%sy)xI8t zL+9$qYsp%7-&DKR4s3pk!RJz7&~B32#oiV=m@*6c{CA0l|7!^#Zf@!tLbBX)6Opyo z#_2`I)t`u#Yj8(D1y}5JFuOZ#Covc>x=rMWIvuPODrTxQI|H@)y`;$cz7J-z6+V1C z(aix_B$hoqPD@U{V5X~nb*mz%(4m!phl$9C)*HqnBcNt%cB!6bf<6 Ef8h=x8aPJ=F$)}NrBM-ibnRfcV z }lInQ)As!;vBC SBXiLmGC}3IUja5T$ z ASwTsu%v(+UT2Nr9K!RHl7VlKL#Uv|?S@-tX@A2U$dxF7cgDhPEz8(`F4 zQ5z-|x;(SzM!n*d!dXZJIMiEB(g{? 7W8J z+B#s_JX@$p{E*o!?AATM#JG`hj}tN@Zm 0RHZgy|UVL3R8u9Ux$)+P6J zBOgxzO&t^y?{P{nFF!jw$fCc>I Kk4jjIc z2C}sLxQI8lVC@-b&@$mwj4!u`<7b6FepG)r#2n<_7VahJD2l?$2xl=Flwwb`1oJ=W z@qii3jUHY<)s~L*#o7&ujenVBLDVU$D3Cbz&{#0TLQPRkxXi*b{Ai-v)ZG&uZ{Fj0 z63c 187`J)=r>TwLK@gk3c1%XHY5xs+}@x{W%e5oeKeHxw(#<&v{#l#k^7v zl*o+Wu72`)i=BDAsZeZ@nKkyWCPp#L*i}z3eCgKUCK&_wWM$jb#9JeN Kc7SkDf0#~vM6gpW >aC_Zmc;5nL z44?MA0h+gOGUTgf`3>71Yn1VD&!&U>FR1khuS{K3QrnJ}U)Pd9Bg3jAl-uvTbwmE) z5Wc0NkJ;$6h2Vvdh(!$JdAM$r=Jx){+}F8V=_k1!ty8#>V9B&m^bka}7NLo9OhC6$ zET6e6NaCd8Ew$iujcvIIp`$Avl9ikpn6~k*DV$-$=aa!w4OIIv(;X3xFP87}7_*!o z!`G@dJFkEkLJ|Z$k<*y<#$V70T_d9{NDy0uV6$4pPh2wZ)>brNxjJ?gKp@S4<1UsL z_Bm=cWMf>9@8v4t!(02^YN13F5v2+09#&o~M|Azb7?RL+y=`+1_zrZWO@h-t^c6Mb z4nEAxuG`ull_~RS$o$-`pBr+`-`E__+TYLuB5W)O&D->+*YOw0V+0OkHds1-w_u{7 zkq!zoI} L&L%a^H`ZeKktpkqLSO!Yh f9z%gdQKNx&nk zK%|GWCljS{o)s7_d5UVDaYA5k>%U>|@4xBD%H;p@h8#=f*QvK!R>x9irBr(Sd<}%8 z!P5n^d_V{zC3HPbArK8(OZ2Sz^N~sYvwvb&%IN~BkqQ|liFK$+XgsTBV?~_yhBbPk z_D{K$Nn=Nb+cf65SXxLJ bk#XjO0_heus;S~(BnCA%oq-NEE8Bmfzx_!v7bg$(*q|nIFMZf#S z4yLj>Z?NS?^i8w7n)f(@NN+A;-6Vz|OG(}TlI(j-H>>5JpZ?JBxRbo5rY{@&g;;}3 zgle-%m>K}n9sj7ED~42OQuQYCGiT!@+K-+}MNLmzP9?%AqZpf<5}A5uy8xr)u*O*B zOGsqh*Ku55qih1cqahcq500Ki@^8xcJnU|=l^=d!M;aswAmH7+imv0*R$}Z>1V~F` zY(=`rhaqH0lDYBJ8yQb=ii(JuWuP%IlLU5Ety%R01u?T*rAJaTI6r5?SuZ@bCjpo5 zuc>Tf1);>Ani=dBgw&D8pRiPc!6%k9lO`0g_rCCKsRh$Izn5M#Xui~VOjy _5s1kcpT2C+v88;7;(a3yVVtyTG>|?KXqkmRA1jp+E(uDYjywU zs3{ZNp1Z!CCW~}!D00fV%5@TxK^!{nMpS*}!Hnypqxp)_D^kc{7dg>6FapL#!~jly zRJ#1WE$|(DuUz*Mm59qC4N-km*g%djOPM;iPb9XnM$GuQcVn_?9yfib`?3C8e^74J zRTC|bv-b70lXTJy$Urju` T0>KP6yQKarH zA>byNpFV4Sj1+cZ9Ot~t=Ag2fv-Ksj?S6(X@ov66jE_hpnMy;YiPNU%zKyVMXlY?L zlSN?;)eLPnqZpGNQ4G^hvmxd>MVL%)?RAr_<5)OV-j^Ut^?ABhdx5>4w?P|>`chrN z>pkGftYZ97vtyjW)+rBzM}i-4HdX0h!12@1Z+MqrueDOla&`P~nU +NyJn#Ed wU*FsRI;+@o2Swr2DKe^yW1A))Q{|S$MzA-t zv9c-%t{n}{W$M$^*gU$w5>*glvz8|jq!$9CBzgJBd)=BGdq4%^W@<2r!s7_GWNvRC z3Ng%xBL#yCB@C`ba$LGVK>V6%3jygOW%h!&H|7*pS7$uZ%`|(Jo_+fkRnea$V*^8@ zwX!gq2-^ZIcE}7T4pi(e4Wm*DeMpJ92k#b={y5ma%V%FDfZRHQ^x-}LnuHRflP`!2 zbSKGgj{8Q{YBfAXDI#L*$GrZ)*oKWr$g5hzf%Ip2&Cps#xIt*$uKn5XjJr`Sjo#q$ z2Xg^5D#HT5z22~Pbh$kkjaIHH0Zll+xKgBT#)^kCY+`>la_kOVYynJccrdo<52`7D zA@@S0Z+Fv+;^fh)FoFaR3KIuq@zO}X(HRw4D}Sb_(+?APc$XORBnh-Wu3O@sdHD>= zPGQ5h$LSCK+`*@zrj!cTsp^uRC|nEOFDfn;c|gS7 8kyk z!5t?C!5j~S?oic8Cv>3S&SkP9Jjq}o99Rv5k8`J@ciyLU1ZAv}{T3gFkwV!}Mbl$5 z%%M2>p2#bNM2sBjG^Gh8Z-7jekHd-W!{KRRQvx#NO?Rr*^P#g6a{ zDDYtE9H`m2mW7PO&IryX- 9@Wq%Zk)fb;P80h) zq07&p@ZkVtT7v4z<3w|!V8kr3~+~2$qXPMNE#GmtJ(x7jEz!am(qs>4MeILjs58 zSBRjgq||2>2w0e0@)YII?xzkVKYfweEXJ?D2W(o78Cf|tkL^)Z@YRb9kl6Zace}I0 zB!h#He6CMET4WdsDW)*%=YAf-5tYy|@~*dARv5sYA6a1y2_)bG*z=i`Ev*dskW~Cc zkH3*kt(GR+7ase@j^`VsPJJdf7HAA@ZyirB2&|qF&6|wtDFsM`(Oi>r`HlykkzyY- z>A@FyuNlu72a3NP&{Y3UzJbEg5L=?j1n2IF6b6j9NR*8d4kNw{;q@Hh*bj~2vHg4l za|&6Nw=Go6CY@Kvw0HjYw_DdVn(@lw(<*8}2uJ7x{3pAd)5Hh42XW9zmABu5)8;Vk zQH9xQNE7?-Tn{XyKqSXYZu=!t$@!=?E;-lr8U69_vecv;P}e7hqw3;7UE<$OMUsQ0 zxkg0F^9ji@vLofi-xO(ZEcU 6^=8hY{NhzpKalSk>0e6yvNStu-x@2RR3cdgBNFg&%7wS z H(@W#aGCnGL zpe{f6SHZib6*>ait$Wlqk`n8~&1#brx>!$`vT*V5ACXGD&>>7(e=j}0I;H57Ji+vI zx0?&8$B)~2?kXur(O_TkQ|;!8CB)o6I&X~C*~}~W4o*IZjmk|#?=qyx?grrl%R(Zy zDhaE}ANNs2{gN>|%o~r3*go~q7%>}ivAX?UbY&bLr<~IA64!eBY+)at#ZZ$Xbs%bD zYN~<=cR;Nr2q^U`#6j((pts~9;(p;pFQZ0NnN>vQLP_7xQ`vu2JAEN(m>^6agxc^| zWfYmFlP!KP)#vugo2Jnt$Y3IBLZ-g0sqjL|bXC!<_ynT&)?gq|T7oDB;2@OdMi?or zR_$V%Re!mpetp4mJ6j~5x3|ULWirDiTW*)+FM1(O7#0E>O#E{08_o7D?Z+cGmlaG^ z!cfUArx!4y&c6pMQ` l zW*LdItO?TgUF+8wj>#3&FuRVw%?f76LCa>VRQU0%@_|Q>#JC^J>&s7(LlUG%oJ>C_ zsCDDn9lt7d(u )$4##u8PQ;Gr35WIMWu16FLlfax!ssf3uOYaWGMp`wmrQ>$+@-vkWVZ}XS zW&hG*KM$iuMOnTNXd;pgMwxt2t&;H$qu;@eZGX8jn^VBL $)bH-_6_4g7p`!z^4 zI|g^l4~bs8?vI~>Z~UrJE*vT~4)u)1q$UPzw)lX*TtMsTW1#1RWEBPMCpv3d8Y2>3 zDMFAoCg#BlD*qcmjGC6kmSCQK$>OG3tnUf-9 FvC_*(_8bbr8Z#vMQT{seeX6WvZ3N!hSCzzrozA(XD(4G|0{qv^@pJZH z30v3v>3;O%G=0Up0wStHmVb2j<2hf~;7`t|iJ9As%BAlp#QFF$dJKPVQ_9ZKJ5Lmu zx!t)Mf%gsX@F *il^tkQlri@&%SV1Mt!JAZvf~8S8(rY9#~ju^ zq(m&%C8`zlpo6lA#CuKrEO)C_YdjQc*of!}%=pINOA^MYQ{My`gt(Mz5rv