pax_global_header00006660000000000000000000000064152115716400014514gustar00rootroot0000000000000052 comment=c3b864518a20c770e1a1d36576fdb1024287b5d9 disgreet-0.1.1/000077500000000000000000000000001521157164000133215ustar00rootroot00000000000000disgreet-0.1.1/.gitignore000066400000000000000000000003521521157164000153110ustar00rootroot00000000000000/target *.deb *.buildinfo *.changes *.dsc *.tar.xz *.tar.gz debian/.debhelper/ debian/debhelper-build-stamp debian/disgreet/ debian/disgreet-dbgsym/ debian/files debian/*.substvars debian/tmp/ debian/cargo_home .cargo-checksum.json disgreet-0.1.1/Cargo.lock000066400000000000000000001416521521157164000152370ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aligned" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" dependencies = [ "as-slice", ] [[package]] name = "aligned-vec" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" dependencies = [ "equator", ] [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys 0.61.2", ] [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arg_enum_proc_macro" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "as-slice" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" dependencies = [ "stable_deref_trait", ] [[package]] name = "autocfg" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "av-scenechange" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" dependencies = [ "aligned", "anyhow", "arg_enum_proc_macro", "arrayvec", "log", "num-rational", "num-traits", "pastey", "rayon", "thiserror", "v_frame", "y4m", ] [[package]] name = "av1-grain" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", "arrayvec", "log", "nom", "num-rational", "v_frame", ] [[package]] name = "avif-serialize" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ "arrayvec", ] [[package]] name = "bit_field" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" [[package]] name = "bitstream-io" version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" dependencies = [ "no_std_io2", ] [[package]] name = "built" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder-lite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] [[package]] name = "cc" version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", "libc", "shlex", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clap" version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "compact_str" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" dependencies = [ "castaway", "cfg-if", "itoa", "rustversion", "ryu", "static_assertions", ] [[package]] name = "const-random" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] [[package]] name = "const-random-macro" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom 0.2.17", "once_cell", "tiny-keccak", ] [[package]] name = "crc32fast" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ "bitflags", "crossterm_winapi", "libc", "mio 0.8.11", "parking_lot", "signal-hook", "signal-hook-mio", "winapi", ] [[package]] name = "crossterm" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ "bitflags", "crossterm_winapi", "mio 1.2.1", "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 = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", "syn", ] [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", ] [[package]] name = "disgreet" version = "0.1.1" dependencies = [ "anyhow", "clap", "crossterm 0.27.0", "image", "log", "ratatui", "rust-ini", "serde_json", "simplelog", "thiserror", ] [[package]] name = "dlv-list" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" dependencies = [ "const-random", ] [[package]] name = "either" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "equator" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ "equator-macro", ] [[package]] name = "equator-macro" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", "windows-sys 0.61.2", ] [[package]] name = "exr" version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", "lebe", "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] [[package]] name = "fax" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" [[package]] name = "fdeflate" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", ] [[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "getrandom" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", "wasip2", ] [[package]] name = "gif" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", "weezl", ] [[package]] name = "half" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", "zerocopy", ] [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 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 = "image" version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", "gif", "image-webp", "moxcms", "num-traits", "png", "qoi", "ravif", "rayon", "rgb", "tiff", "zune-core 0.5.1", "zune-jpeg 0.5.15", ] [[package]] name = "image-webp" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ "byteorder-lite", "quick-error", ] [[package]] name = "imgref" version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "indoc" version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" dependencies = [ "rustversion", ] [[package]] name = "instability" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6778b0196eefee7df739db78758e5cf9b37412268bfa5650bfeed028aed20d9c" dependencies = [ "darling", "indoc", "proc-macro2", "quote", "syn", ] [[package]] name = "interpolate_name" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itertools" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.4", "libc", ] [[package]] name = "lebe" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ "arbitrary", "cc", ] [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "lock_api" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ "scopeguard", ] [[package]] name = "log" version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" [[package]] name = "loop9" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ "imgref", ] [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ "hashbrown 0.15.5", ] [[package]] name = "maybe-rayon" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", "rayon", ] [[package]] name = "memchr" version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", ] [[package]] name = "mio" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", "wasi", "windows-sys 0.48.0", ] [[package]] name = "mio" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", "wasi", "windows-sys 0.61.2", ] [[package]] name = "moxcms" version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" dependencies = [ "num-traits", "pxfm", ] [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "no_std_io2" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" dependencies = [ "memchr", ] [[package]] name = "nom" version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" dependencies = [ "memchr", ] [[package]] name = "noop_proc_macro" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "num-bigint" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "num-integer" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ "num-traits", ] [[package]] name = "num-rational" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_threads" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "ordered-multimap" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ "dlv-list", "hashbrown 0.14.5", ] [[package]] name = "parking_lot" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", "windows-link", ] [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pastey" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "png" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ "bitflags", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" dependencies = [ "quote", "syn", ] [[package]] name = "pxfm" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" [[package]] name = "qoi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ "bytemuck", ] [[package]] name = "quick-error" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] [[package]] name = "ratatui" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" dependencies = [ "bitflags", "cassowary", "compact_str", "crossterm 0.28.1", "instability", "itertools 0.13.0", "lru", "paste", "strum", "strum_macros", "unicode-segmentation", "unicode-truncate", "unicode-width", ] [[package]] name = "rav1e" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", "itertools 0.14.0", "libc", "libfuzzer-sys", "log", "maybe-rayon", "new_debug_unreachable", "noop_proc_macro", "num-derive", "num-traits", "paste", "profiling", "rand", "rand_chacha", "simd_helpers", "thiserror", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", "rayon", "rgb", ] [[package]] name = "rayon" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "rgb" version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" [[package]] name = "rust-ini" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", ] [[package]] name = "rustix" version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys 0.59.0", ] [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[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.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", "serde", "serde_core", "zmij", ] [[package]] name = "shlex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-mio" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio 0.8.11", "mio 1.2.1", "signal-hook", ] [[package]] name = "signal-hook-registry" version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ "errno", "libc", ] [[package]] name = "simd-adler32" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_helpers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" dependencies = [ "quote", ] [[package]] name = "simplelog" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" dependencies = [ "log", "termcolor", "time", ] [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[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.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tiff" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" dependencies = [ "fax", "flate2", "half", "quick-error", "weezl", "zune-jpeg 0.4.21", ] [[package]] name = "time" version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", "itoa", "libc", "num-conv", "num_threads", "powerfmt", "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "time-macros" version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tiny-keccak" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" dependencies = [ "crunchy", ] [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-truncate" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ "itertools 0.13.0", "unicode-segmentation", "unicode-width", ] [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "v_frame" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" dependencies = [ "aligned-vec", "num-traits", "wasm-bindgen", ] [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] [[package]] name = "weezl" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[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-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys 0.61.2", ] [[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-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm 0.48.5", "windows_aarch64_msvc 0.48.5", "windows_i686_gnu 0.48.5", "windows_i686_msvc 0.48.5", "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm 0.48.5", "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[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.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "y4m" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" [[package]] name = "zerocopy" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zune-core" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] name = "zune-core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" [[package]] name = "zune-inflate" version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] [[package]] name = "zune-jpeg" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ "zune-core 0.4.12", ] [[package]] name = "zune-jpeg" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ "zune-core 0.5.1", ] disgreet-0.1.1/Cargo.toml000066400000000000000000000005711521157164000152540ustar00rootroot00000000000000[package] name = "disgreet" version = "0.1.1" edition = "2024" [dependencies] anyhow = "1.0.95" clap = { version = "4.5.23", features = ["derive"] } crossterm = ">=0.27, < 0.30" image = "0.25.5" log = { version = "0.4.26", features = ["release_max_level_info"] } ratatui = ">= 0.28, < 0.31" rust-ini = "0.21.1" serde_json = "1.0.139" simplelog = "0.12.2" thiserror = "2.0.11" disgreet-0.1.1/LICENSE000066400000000000000000000261351521157164000143350ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. disgreet-0.1.1/README.md000066400000000000000000000041401521157164000145770ustar00rootroot00000000000000# Disgreet A sleek, keyboard-driven TUI greeter for [greetd](https://git.sr.ht/~kennylevinsen/greetd), written in Rust. Background images welcome. ![screenshot](screenshot.png) ## Usage ```bash # Show help disgreet -h # Launch with a background image (converted to terminal pixel art) disgreet -b /etc/greetd/background.png ``` > **Note:** The `_greetd` user must have read permission on the image file. Placing it under `/etc/greetd/` is recommended. ### Keyboard controls | Key | Action | | ----- | ------------------------------------------ | | Tab | Cycle focus (Session → Username → Password) | | â†� / → | Switch between desktop sessions | | Enter | Log in | | Esc | Exit *(debug builds only)* | ## Prerequisites ### Core dependency - [greetd](https://git.sr.ht/~kennylevinsen/greetd) ### Recommended for TTY Without these, the TTY is limited to 16 colors: - [cage](https://github.com/cage-kiosk/cage) — minimal Wayland compositor (kiosk mode) - [alacritty](https://github.com/alacritty/alacritty) — GPU-accelerated terminal emulator `cage -s -- alacritty -e ./target/debug/disgreet -b /path/to/image.png` ### Directories Two directories must exist and be owned by the `_greetd` user: | Path | Purpose | | ----------------------- | ------------------------ | | `/var/cache/disgreet/` | Cached background images | | `/var/log/disgreet/` | Application logs | ```bash sudo mkdir -p /var/cache/disgreet /var/log/disgreet sudo chown _greetd:_greetd /var/cache/disgreet /var/log/disgreet ``` ## Installation ### Build from source ```bash git clone https://github.com/dvorakchen/disgreet.git cd disgreet cargo build --release sudo cp target/release/disgreet /usr/local/bin/ ``` ### Configure greetd In `/etc/greetd/config.toml`, set disgreet as the default session: ```toml [terminal] vt = 1 [default_session] command = "cage -s -- alacritty -e /usr/local/bin/disgreet -b path/to/your/image.png" user = "_greetd" ``` ## License [Apache 2.0](LICENSE) disgreet-0.1.1/screenshot.png000066400000000000000000002103241521157164000162060ustar00rootroot00000000000000‰PNG  IHDR @:ÎŒ—›IDATxÚìÙ廿�ÿñ»OÏœé {íîX[”VPJ�néî�E@;ÖuuÕ]•ýÙŠ¢ôÌ03gfN×]¿áó€^ßëõºÞç:sÎßúT¶Û~I’$I’$I’$IRª”(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€ "€»µá¤R}aR¹¶ ©T_”Tn,ÎN ÿ„ÙùrÒ\·'©UH ß…Vu0©Ò³$)}O{—$…?­[J ßÓ°JÏ¢¤ô§õ/J ßÓve0©Þ¿4©Ú¿$©ÖUí_–Të_œTí�*õ 'õ,MêZ‘Ô;°,ihxUÒ‚E[% /Ù:iñ’m“Vmý¼¤w½çIW^~UÒ%]–tÔ‘ÇGq\ÒÒÕ;G­Ú1iåê�’Vlý¨mvIZ¶õNI«¶Ý9iùVÏK _�­wxYÒYg^˜tú%�xÒyIç�eÔ¹—&½âeoNÚjëç'í¶û¡IßíÀ¤Ýö:,éß?°wRø»~øiIÇþ⤳N8墤£�9#éÜó¯M:昳“Ž=ñ¤Ïúù¤ç¾ðµIŸ;ü䤋/¹.é”S.Iºð¼Ë“Âÿô’‹¯I:õ”ó’Ž>æ´¤“O¹0éÄ/H:䈳“ž³ã+’Â˕嫶OÚn‡]’vÙùåIïzû“n¹í+I7ÝrwÒ=_ùzÒíwÜŸtÝoOºå滓<è褷¼óCIoׇ“^ÿ¦÷<‹½æµïHzíëß“ô†7ý{Òëßøþ¤W¿á]Iïyï'’Þñ¶'�wÖÅI×\}}ÒË^þæ¤çíôʤíwzmÒo=<éyï<6iû·•´àNÜñIÛ¼æ3I[½îÀ¤í^¿_Ò ?pvÒê·œšô²�]�´Ýë?Ÿ´ã[OMZúêÃ’V¼òˆ¤Å/Ø?iëW”´Ë+N:äÕG&ÝuÜmIozᇒöyé~Içî~aÒy�úî¹?LúÆ©ßJºê“×$}ù˜û’n:䎤[»;éò=¯MúòÑ_KzßË÷LÚé¯Oúàû÷NzÙËÞ‘ô¾ß=éu¯{ÒK^òÖ¤w¾íãI¯zÍ{“^÷º$½á�NzÍ¢^ø’·$½ýÝ»'½á-IzÉ+ß•ôú·},鹯ß+©±üeIƒ¯:2iÁëŽKêùaIÿöÞ“’.ºòΤs.¿+é�:,霫¾‘tÝÍ$Ýr÷w“nÿÊ÷“¾xóI·Ýó½¤;¾úäs®¸-éÎ{þ#é†ÛLzÛ¾—&­zÏiIcÛ}"©ô’ý’–¾ý„¤¡7�4øú#’z^}@Òäª÷&õ¼bߤÆËöOz6`þÅ€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A¤p¥U«T’JµjR¹Ü�ª–’º™r¦w`AR_ï`R¥^I*•:I�L­RJ _·R§�T¯V’Ê¥¨Rµ”ÔS¯'uŸUÕR5©¯¿‘ÔßÛ›T«W“V,Z’tÞég&-^”T)W“:™žž¾¤J£‘Ô.—’�zÒ¾û˜tü‘G'�sÚiI§Ÿ|RÒûí›ôî·¼'iz¦“ÔjV“vØþùIC 'yèAI'}dÒçØ?餣ŽHúÜû%yðAIg|þóI'u\ÒQŸ=$é˜CMjdßÀáÁ¡¤% £V­X‘Ôhô&½ï½ïNÚg�=“{KIozãk’ÞðÊ]’ÞúÆ×%½d—ç'­^¾,iÅð@Òö«'­JZº8ª47“´ÝêI¯|ñNI;m¿MÒIGž´õŠ%Iã[F“&¶lNZµj뤅ƒCIÕr5iÇž›´ÍªÕI½ÕzÒêK’þí¥;'ÕzIƒ $•˵¤™ù¹¤ñÙÙ¤?=üפ±Í[’Úóí¤?ÿõI'žzrÒ…—^žtìçOKúÎ÷¾›ôø?OúÇ£�&íö‘�%}æSŸJÚícKÚ¿O&í³ÇîIïzËÛ’>ôž÷%m¿Ýs“ÚÍVÔ#ͤ‘‡&’ÆÇ·$ õ'ÕJ³Ií'’ÔzüGIc%-¯�% õ &Uû·Izî‹Þ‘tÏžÛ'}÷¨—&�¿êѤ¯~ö¹Iß=éÕIŸÞeSÒÊþvÒv‹kIo{Õ’¤å=³I·qPÒÞôê¤W¼òMIŸyÇÇ“Þðª×$íôÜ�“^òª'­X½$©\ŸOÚö¹Ë“^ÿ¾W$-XÔŸÔ®Í$=ÿEÛ%MÍlNzÏ‹_Ÿtú‡ŽIÚ÷%»G½ô£Ië3µJ+é;|0© –4?;“4לKÚ8º)éÏ|(ixÁ`Ò›^µKÒk^þ’¤ û“ºsͤmÛI/ÙaUÒ»výXR£;“ôooysÒ?×>•tÛþšôíÿümÒ'>ø–¤Áþù¤v¹“4>5™´vÃÆ¤±évÒw~ö÷¤»~ô—¤¿>5›ôÛ‡KÚ815>™4;>š´8SꔓêåNÒÄÈHRµRJÊ6´Ú¢å+“fgÚIµZ%éÙ€øg(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  À‘ÀåL§jw;IÝn9©’Y<<œTÏTËݤR»”T©W’:™ùV+)T®V’Z�nRµ^‹*Õ“ž³ÝI«—m•ôÁ÷~(iëU['=gëí’Úï3IçœrVÒÁ˜”½¥å#?whÒQ‡F­Üzë¤÷ùdÒšôùc�O:ã”S“ž»ÃÖIµÞž¤™f+iËÄTÒŠe+“*µjR­RNzâ±'“Æ'&’††’º™¹évRO_oÒøäxR£Þ“4Ðן´>Óê6“:ÝRR½Umô&5Û­¤Z½‘´vͺ¤žLµVKZ°`0鵙鉩¤±©™¤ð’`p¨/©Rm'Õk=Iín%ijz&©Rª%õöö'͵šIkŸY—Tîi$ÍLL%õ%-Íl»ÝÖIO=¹>ibl2iãÈæ¤N§”Ôj·“† %u:í¤é‰ñ¤½àEIåV')ÔÊŽª³³sIír9©Rª&mKZ¹zER©ÝMš››I*—»Iá�цM#I�FoÒpvƒ:>:–4955>‘ÔÈtKͤÁ��¤vÜ6iϽvOšÛº›tïÿÝ—TªT’Æ&&’J�JÔº§“öZ˜tç™Ç%Ý{ÆQIž¼wÒmŸØ&ém¹)iÓF“þxï�“–/Z•ôð=ßKzü»?MúÐßštÏaïLºísoK:vE#é¶3?‘´ééõIÏßé9I?ýÁ÷“ú†’¶Þaû¤eË–&ýõwMjÍV’&¶´’vØnç¤ÿþþ¯“²“óæ¹Éù¤±-ãIá {µZKzòÑG“žØødR§=ŸtÊ»�IÚ¼i2éî¿ßŸTªö'í²ó‹’ƧF“¦gÆ“vÚåEI[Æ7%Ýqÿ·’~øÓŸ&ýãÉuIGžIš™�JÚ2º1éÏ·��´rþ¯I;Îÿ.é“ï{YÒŸ|gÒA{¼=iYfq&› ê½½ƒI“S3Iç|ùçIßúÍŸ’~øËß$Ý÷ã_'Ýð�ß&�qã·’~äѤÉùÙ¤J§™T­u“ËTõ¤�™æÌTÒLfhᢤf§�ôlÀü‹3„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚HàN¦›é´ÚIµL¹ÜÍŠ¼èůL _·v·›Tɔڥ¤n©• ÿÒj¹’TÏ„oVßP_Ò~ŸÚ;iÿOï›ôüçî�ôéý>•´û®»&mµÕꤙÙñ¤á… ’&¦&“*ÝRRO½‘tôÁ'-_±$iñ¢Á¤žj5i23“©”ºIc›G“zû’Â?azv:©™ÙzÛÕIÕZ%©Û-'µ›Í¤f)ªRî&õõô%ÕªÕ¨èõ¨ÎÏ5“ÚYƒýIín+ªÝLêËLMO&õõö$Íeº­nÒºu’6gz�¤ÞF5iph inf.©ZéMÚ°q]R¥\J _�þ�¡¤n¹“Têv“ÂS[-j¾ÕJÊ.-Û¥n'ibbéýXRxÞèO:ò°#“Ž?ú¨¤‰±ñ¤æ|))¼kËŽ‚¥É™©¤eK–$UëÕ¤ðö¿Ý)%=g‡’?ôð¤OîµÒ[Ê•¤�,Jºïö[’ž|âѤg¾óŸIO}÷GIk~ô“¤�¿úߤ�¶Ý*©Rê$u;­¤R·™T«”’Ú­VÒ¯î~ iÓ_þ’”�dæ_÷ʤg¾ùßI/x]_RéÑŸ$½qÏ—%MÎŒ&mÙ’ô̆�I3³Í¤¿ý�¤žžzÒßy$iÉð¤׽î5I .Lê[ЛÔè‹Z�yÎŽ;$m³jë¤e[­JjôW“ZOÍ$�°ï¡Iï{Ý›“†–.JjuÚIõZOÒÄÄTÒôô|RviY�È„ç…v©›4’Ùkï}“ö;ðà¤gÞ’Ùe—$ýñMêf�ÌÂGˆÍùnR¥RKzdÃ\Òè|_ÒE¼'éÊ£?ž´pᢤZ½œ433‘Þ¶…÷€ÓãcIíÎ|Rö¨¦Û×Ó›Tnw’º­fR³9—nm­™‰¤ns.éÙ€øg(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  ÀÀ•rR7SÉtŸUíÌOñ£¤N©›Ôê´“Â7!ü*ÝJR9ÓÛh$í¸ãNIÕL'Óšo&=½~4©Ù­$͵KIϬߒÔ7¸(ióÄ\Ò\«š´~óhR§TMšœ™N*×{’&'¦’~ùÐ’μð¢¤3.>?éìK.L:õü³’N9çì¤ ®¼,é”sÏJ:õ‚s’ι袤›î¾?©··‘Tê´“ÚÙQµ9ßJ*w»IÍV'©Ö¨%Uëݤ‘Ñ‘¤ ‡’’ÚÝNÒìì|R­\N Oâã£cIáŸ0�i¶ç’¶Zµ*©¯ i¾5›ÔÛèIÙ°>©^¯%Í7g“µzÒÔÜlR½^IêvZIϬ_Ÿ^‡ÔÕ¤éÙ餱ññ¤j¹–47ßNÚî9Û'mÙ<–Ôn·’¦2ÕZ9izz2©§VMªgeŸñÆšL¥RNje²Oe­Ó-%•Zͤ'ž\“ÔÛÓ—4ßi'ÕûêI+W®HZ½bUÒû~&iÅÒ…I¿ýíï“6n‰Ú°&ihAoRO½ž431•Ô*u’ú{{’zªÕ¤ÿ{è×IÍv9é×—_ž´æÞÛ“^½jQÒ'O;*izíÚ¤½>úᤙى¤»¾s_ÒôìxR©ÚMj4jI¿üóÿKjµæ“:³³Iû�yVR­\JZ¹jiÒÌš�IåN9©ô§?&µµ¤¿<ðý¤�“cIO<øõ¤eÃk“žhý6éÂï^•ôÃü"饯xYR­¯›4ÙœK:餒6®Û”ÔêÔ“ª³�¤ÿÈÜÿ�o%mܼ>jd$©9>›´qó–¤N«š4¶v2ij~*i«E‹“V.Û:i(3²ycROoR§;Ÿ´ï>û&í¼Ó.I»ìô¢¤÷½÷ýIÿ�yè7¿NÚî¹;$Õ*å¤Ñ¹NÒÐÂIáMÊÄ\9é¨/<˜tÄU_Oºú®o$Ýò­Ÿ&�tã7’Ž»ò�¤N§• §¥Þz#i ¿ž”­…¥žL­§7©Z)'UJݤ��…IÙ³„žð1]³ÛNêtkIÏê À¿60@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(ˆt®tºI¥¬v·“Ôé¶“²Õ)gj•jR«9ŸT­”“Âw¡šýré›_î&µºí¤‡ÿòû¤É驤N»•473›tͯHºèâs’¾xýUI×隤“N;1é²Ë/Hºð’ó“.¾ä¤ó.>/é’Ë.M:ç‚s“λø‚¤üà;I³ÓÓI͹ù¤Ò\7©Óì$•Zí¨L·ÙJ*µKI�R7é©§KêdºåRRx^¸÷Áo%ýã‘&u»í¤�™Éñ™¤zµ‘UKšœMšš˜Lj6ç’º™ñÑñ¤%‹'UJ夞z-©[­&MLM&e'ÀÉf³Õî$-X0œ¾Y½½=IÝr9©¯Þ“411•4;õœí·Kš�ŸM›JËTªå¤N§•43?�ôä“�'5zªISs³IÙÕqµÛm%…_™ìk:ñ̆õIáOk—ËQ¥nTs>i.Óž›OšÏþ×zO=ª·‘´xx8iÓÆ‘¤zµšÔ70”419ž^¿íüü“æ3ƒ &͆¸N;©ÙœOš�žJúÛÃ�'mOZû“Ÿ$ýße—&õdæ§§’^wÔç’ªånÒôþ”429žT«U“öý÷�$-èéK(×’zÊÕ¤W?ÿI�J5©›ÕÛšN ÍML$•Ê�¤ð,Ó}á ’–¿æIáa0¼UÜñÓû&UF7'½pj*éŽK?Ÿ´tl6iÑ[‡“úß°,é©Ì ßöº¤‡þø—¤›ÿçÚ¤Ó¿yNÒ‹_ùФ·½ù5I×þàæ¤;~üµ¤s¿saÒãkOZ1¼ é?ù¿I½}}IK–-MÚçcK:pï}’öúønIÛl½}Ò‹vzqÒ/ùó¤ßýé7IøËï“~ý›ÿ—´|劤õ6&•ºÕ¤ùv+éÇßÿ¯¤™¹fR»SI:ò‚;“&7oNš›HªVIã£cI¥N;i󦑤ÉÌÔØDR©ÝN §»™©Ù¤¾Ì¦õë“&7oL Ÿ‡aÊ�fR©ÜNje²E®T­E=›0ÿâ Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Òx~~.i&4=•4;=53–46º!itd]ÒÔØæ¤Ñ‘õI3Ó£Q“SI¥N'©Óî&UK•¤F¦TîF=»ŸòV;©^­&u+¥¤ùæLR§5—4ך�šOššÜ”475ž4;UjO'5ç£Jݹ¤Jµ�4?=‘4;ÕiÏ$µÛóQs3I�î\ÒÜülR©ÕNzÿ»Þ•4’iÎv“Â×ÞñΤ­3›6�&u»í¤ G’žZ·.é¿~úˤÍ[&’6lؘ4>>•4=;“Tï©&MÍM%mÙ²)iͺµI«V,M^Õlu“úúz’æf瓆†$-Ìtº¥¤™Jµž´víº¤j½‘4›èHjÔëI«3áï695Ÿ´réò¤Å‹–%=çyÏMZ:¼(éÑÌ‚ÃIÍLc ')üô–*å¤ÿø¯ï%µçç’ÂOH·3ŸÔS¯'}ö“ŸNZ¾tYÒÿþïo’ž|üɤ‡úmÒ?ù{Ò[^ûÚ¤nfdó–¤ÿþÅ/“ª==I›2óÍVRµ[JêLZ¾zë¤mž»MÒ_»/iyO#©U¯$­ÛødÒGÞðú¤Þùõ¤Vfv~6éGÿõó¤r·œÔn¶“Â+‡N&¼ý/·:I¥V+©Û‰ú™g& ô÷'Õµ¤áW¿6©ñÄ3Iß÷ͤõßÿIRw~:©T)%ýã¶;’º•zÒvûï—T^�táƒW$m3¼4iÑ@_Ò­ùϤў�I—ïÒ¤§ž^ŸtÐÇMêëÔ“úû†’ŽýÈQI[ 'íRQRir>éÔ£�NzýŽ;'Íÿa,é¼+ÎOºàêË“Î8ÿ¬¤k®½"é�ûoMºÿþ›’¾õàÝI�ýý�I�üå7Iÿõãû“î¸éꤟýç·“.<缤Ç]Ÿ´ýêåI‹ÊIÍÖLÒâÖÓI³O>”4¿æ/I3›×%õ7IS“I�Z#i*Óª”“º•FÒ\©–TY´<©±xë¤;ý[ÒV;½"ipɪ¤å«·Kš�k'MNÌ%ÕêIÝN-©Ùj$=›0ÿâ Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  â¸RMª÷4’úú’†’'-[¾uÒÊ­vHZ¸xUÒ²å[%…ÂÀЂ¤J½šÔßÛ“T©Õ’fç›IÕR5©“™›kFµÛI³�¨R·œÔ¨6’Ê�¨ÞL£g(©wpQRcp0©§aR¥>˜Tm $•jõ¤f»œ4Ól%Õ½IÕZR·RMª×{“º•ž¤žFoRµ^OzËÞ�ÔèíKªõT’º¥NÒÐ`_ÒÒÅ “¶ÚjuÒ’EK“V,_–ôœm¶Izá ŸŸ440”´dñ²¤…CCIíL%3Ø¿ ixxIÒâÅK“&¦f’:­fÒ`h`aR£Ñ›´y󦤵k×%mÚ<’4;3Ÿ4=5‘´Í¶Û'edžn­VOj6g“:ÝnÒºuk’/Z’µ0©Ýé$mIúóïÿ�477Ÿ´rÕŠ¤ùùfÒ‚ÌÔøTÒšuÏ$UJå¤÷¼óýIÍLvr®žtüII‡ò¹¤çíò‚¤ñ‰é¤W¾ì%IËW.Ozïþ=iç½8iëm¶JÚéy;% õõ'½îÕ¯IZºxIÒÊm¶JêÏŒŽnIêÍ.UûÐo“~~ÕIÝf;©\î&}òí¯OúÌ{ß—>\ ¯{?ü¦·&Ýýõï%sÅIÝL³ÝJêvÚIåJ5©Ôj%UÊ¥¤Rµ’TíëKªt»IÝùù¤?úÁ¤«8 éï¿û¿¤áÅ ’JÙëÞT[­¤…»}8éŽo~+i Ñ—~�Gg¦’ŸÖî´’®½üÒ¤+.:'iÁ‚…IwÞuSÒÔ_·$½ðE»$m\;’ÔšžKzdí“IoyãÛ“†'|ý I7>ôå¤/üÏ­IõJ-©Ñm'�xøó’î¸ö}I÷?ð¥¤{ï¹"éKW½-鯬ë.þ`Òówù·¤v~YÒVÏynÒÒÕK“V­^’ô¢—½ç¾Iûzÿ¤Ïì·_Rÿ‚¤r¨TIª÷Ô’ößkߤÏì¹OÒéÇ—tôáG$�pøQIg�|jÒÙ§F�vÜII'}BÒ1G™ôÖ×½)éÃü`Ò)Ç�œtÚçOOÚk�ý“Î8åÔ¤³O=9éäc�M:õ¤’Î<ᤤ#úlÒg?½ÒÌì\R§]Nšœ˜JjÎ5“zúû“6ŽlNzôÑÇ’F7oIª7ú’:ÝRRoO#©\.%MlÙœÔ-—“z3͹VÒú ’ÆÇ&“j™™ÌP¦ÙšMŸKª”»IÝR9ixñpÒ@ß@ÒæM’ÆGG“zzêIá»0;;“´d銤z£–ÔnU’z{jIÓ³ÓIk׬IZ°x8ixxAÒÂáÅIÙ'idÓXÒ¦M›“½I==I3ÓóI¥R'é9ÛlŸô‘÷~(i``(iɲ%I[F“††’j�zR¹ZKšž˜JzúÑÇ“æfç“Öd /Hª÷ö$…ç¬%C “zzI‹—.Išœk'=òÃ&Õº•¤F¥–T«Ô“&Æ&’J¥JR­\Jêv¢®:êø¤½>üž¤ußþaÒÖïzKÒi—Ÿ—T©õ$uZí¤nµš^EWçÛI –,MZõ¦·%m÷þw$uç[I'ÝqsR£[JÚ²e4©Ý™K*µÚIóÓIá5ùçn»!éÙ}¨ÚlEmœM*W*IïýàÞI£óI·ÞöŤðaÞ­¼+és7•ô¥?ÞžtéO¾�´¥º!隟^›tÓÿÝœôê×’Î?fUÒ%g}4é² OJzÏ;_œ´Õ ŽJ�i&ýù÷$m|ú®¤Á…�¤áU%-{ÞþI�þΨ³K:á¨]“*õÞ¤+/»4ióÆÍI­ÙvRïP_Rxa6ÛœOªÕëI—ñѤ©éNR­RMª×û’æ&§“�ZRo_R%sÆAMºïª3“.<ô½I·œ¹OÒøØæ¤�ìþv¦™Ô×Ó›Ô[ïOšÝœÔÓ7�ôlÀü‹3„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚Hàn¦§ÞHÚóãû$5zëIóÓSIc£Q­r-ifz.©¯¿‘Ôí–“f3ý ’êÕJÒO~ðßIïyïû“*™jf§žŸT®u“–.[”4ßì$uZQƒ $u2ã㛓6oÙ’Ômw’ûú“Þñî·'½àyÏKz237?“´íÖ+“šs³IíL§ÕMj6ÛI=}�¤e™¥Ë–$��Ž& öõ$52Õz5)™ÔÓ_Kîv’úk�¤n©’ôã_ý"©Zª&uJݤf'ê¡¿ÿ)©T­D•£š¥NÒßúQÒ5ç�“´Í»ßž´õ»ß™´ã{Þ“´ýûÞ•´ÕÞ“4¸Ëó“Þôáw&MNÎ$=|×½IOüàÇI­ÞÁ¤¾J=)éì‹/JúÞO~�4<´0éÌSOM:â “þùèãI³óÓIÕr;©Ý)'uj}I¿øÂ5I?úí/“ª�þ¤Z¥štÉA$µ2áó�Jæg?ÿï¤ìBµSêt“ÚÝJRxUóÃ_þ1éÑû¾‘Ôé´’êSSI�÷I=�¾¤ÇüAÒ‡ž”´ã;ÞœTY0”4ßj'ÍM�&…'Àr©›473“ÞV,Þï“I߸ŝ’fçæ’>µÛaIíN)é¯xyÒ¯ÿïŸIír=é�Ïí—tã�W%µ:¥¤�¾ZÒÕ×\”ôî7>'©UšLš˜ùqÒèØýI}õo$Ío¾+irì–¤¡¾‰¤r·”Ô[«'ÍO�'�ÏL$õVëIëžy*©Z®%MLO$U+¥¤é©-IÍù™¤ÖÄÏ£¢fÍJµœ4;?—tÿý·%õôô%eg�òØäLR¸/,Z¸ ©\©$õö6’ª¥rÒls>iò™§“Æ(©Rj%Íd.¿ýÞ¤#/ŠšœIjTKI3ÓcIån3i w ©¹eMÒÌìtR»=•ôlÀü‹3„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚Hàɱ‘¤©ñMIã[6d=µiMÒÄæuQ#k’Æ7>�´å™Ç’6=óxÒÈ3O%mÙðdÒæõO$�®*iÓš'’Æ6<•õô³Ùú5YO'mZûXÒÈ3�&mZ󸳨Æu�&�<ýXÒ³ü»­},ióÓ�G­,ê™§“ægf“¦çç“Ú™Fµ”tÓ·%}ùþ’®¼îº¤Ë®½6éÆÛnMºå®»“¾þÀ7’n¹ã®¤û¾voÒ¯úUÒU×^›ôÀ׿‘ôØO$��O$ÍÌM'�ML&ͷ擦¦¦“6¬Û�415•Ôí–“*µjÒ‚ÅÃIï~×Û“ºÝRR¥ÓM*—«Is™‰©É¤Z½šToô$uKå¤%Ë—'Õz{’Ƨ§“ZÍvR»ÛIÚ21žžÖ>ýtR7S©Õ“Æ'Æ’¦¦f’²oZ§\Iš›�Oê”JIS33I¶L$=øÍ’¾pÍÕIýö7I7ßz[ÒWîýjÒ 7^—tì ‡'íµû‡’ùËCIÏ<õHÒË^°KÒš42²)if¾›ôª7¾6©Ù.%mšh&=ü÷Ç’Î8þ�¤r·’´ÛÛ?œ¸Ê•FT§›TªV¢:í¤V³“tè§>“T)—’:™r+ªÛ©'�õͯ$Í•JI�û{Iú�'µ2ßÿ@R­ZŠªt’î>á´¤O]yYR·\Jª–+I­n')tÒõ×'…´£·Þ™ôðUW$}èUoH{2©”]a„×o/És’&¦ÛI;,[‘tñ¹×& õõ$-éJZ»~6éÁ_þ.é§¿j'yÒ_’þþ×õIkžh&=üÈš¤æd#iݺñ¤ÑÑZÒÏ~ö�¤ÿøñƤÿùÅHÒÈúVÒøH#é©Çæ“þô§ñ¤_ýú™¤ÿ}hKÒþ÷Ƥ3ÏÿuÒÆ§ÿ™ôÌã�$­üïIÏ<õϤ}÷xWÒ'w{OÒþ{Fí±ë»’>ò¾·'�ü掤MÿïËI[~{OÒäˆzô§Iµé5IsoÒÔŸ¿™4ö§ï$Mÿó§I[þú¿I›‰šxü¡¤‘?ü iýoïOÚò·ÿJýݽIk~ùå¤gsà_œ  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0D:/\º2ihpqRßࢤ‹VF-]�4¸pyÔ’ÕI½ —' .Z‘´héÖIK–®NZ°d«¤Å˶I^¶:ipùª¤%+·KêY¸$©wá²g±þ…Ë“¯J ?HC‹W&-X²:iÉŠí“®Ø:iѪm“,ß*iÙÖ;F­Þ>éE/}MÒ)§œ‘tüÑÇ$õ5ÊIÕjÔV«·IÚÿÓû'íñÑ]“öÝs÷¤ýöˆÚs×�'í»×>Iùð‡’öÚc÷¤8(é oxSÒ§?µoÒ‡?ò¡¤�_¸sRfÁà¤zµ•iôÖ’ú2 .LZ�Ô×HZ´haÒÂìõ]´h8©ÑèIª–+I=}½Iã£[’ÊÝNR»ÓJêv:I[2“cICõFROo-iñðâ¤UKV&-Y¸4iû­·MjÔ+IK-IjÔêIår7iÁТ¤žz#iŲ¥IƒC}Iýõž¤ìÃÛ]Ðß›´Ç{%yøaI'lÒA™V¹“ôä3’¶ÚöyI«·}aÒå×Ü‘tÅ5·$½áíïMzä‘'’ª™ñ‰MIc›Ç’z’®»æÊ¤¯?pgÒ>¯xKÒ¿ùIR­Ú“Tª5’ºÕzR¹\MªvJIåVT¥Þ—Ôît“®¸ëî¤n¦<ØHºõG_Kºç˜3’ºåNR©SJ*—³ª•¤n·“Ôl·’:µZÒÛ�82é74éäë¯K:óªË’ª¥rR­TM:äÃLŸk&…Ï-Ã[ž;>wpÒ‚ÞFÒÌ|3©Ùl%•³·áÎÛïOÚ2;™tÎ'$uË¥¤õ3sIO<ýDÒòHúæ·ÿštùÅ;%íò¢UI˶ê&-ZÙI*õ�%UêQ+WW’>ôþ¢>´UÒ[ß´:iç—-JÚþy�¤w^�ôª[�ô’]“^þ²¥IozÝʤý?ù‚¤Å[oŸ´`éʤ%Ûî�´héVI‹WmŸ4¼r›¤ðéñMw}+éâKoHºíÎ{“V¼z¿¤áÛ;iÁK?–4ô¢'•·gÒ‚�ߟÔÿüO*oóÖ¤žÞ”4ü‚7&-{á›’®ûòW“íò/úHÒÂ]>”´Ë{�MêßùƒIÏæ À¿80@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(ˆt.·ÛIÝZ9©Z¯%53s™N©’4ßœIª”JIåZ5©Ýn%uË•¤r¦Ói'µº�¤j§œÔÍÔ3�Z-©/ó©=vO:âsG%�uÊ)I‡ppÒñG�tâ±Ç%}ö€C’N=éĤ“Ž>6é¸#ŽH:öèc’9ðÀ¤Á¡á¤Þþ�¤Z½'©Tî$íù‰Ý“ &-]¶$©¯wAR»ÝIªÖêIåR7©¯ ©?óäãO$Õk½Iáa°·§/©R®&•+•¤±ñ‰¤ÁÁ¡¤N¦š�ÛJíJÒÜìLR§ÝJš›ŸIš�žOÚ8²%i|r"izz*©S.'5jõ¤r©‘Ô?8”4Ð?˜4´p(iÙ²IK/JêÖ«I½�¾¤™ÙÙ¤ÞþFR»ÛLšÉ¾ Õj=i4^˜•K¥¤%K$Í5ç“ÂëÞ‘‘ÍIs�fR½ZIÈÔ*å¤n7êÊk®K:ý¼³’Ë öö%-_µmÒ)'œ”ôðšÍI§Ýú�¤«ïûIÒcOoNZ80�´MfAffr&inn6©95ÛŒÚû»&u�¤f·”4]�ꔣÚÝNR©RNºé‡ßHê–jI‡í¶{R¥Ú—Ôß.'}áç¿IZ¹xiR»ÔH궺IÍf+)¼Ø.•+IíV)©Sî$Õzú’Ê=�¤ÿþhÒäÂÁ¤Ò6Û$5»óI;®Ø*é‹ßøZRv7Ö*—«Ïb'ßuGR;³Ós_•4›Ùgï÷%�M·’.¼ìΤð)ÁÔøHÒ—n¾)iççü,éø#–$ugÛI�ú@R«5ž4ÐÛ—451™4²imÒ|{&i|®™tö%’N<÷ɤó/Ý�ÔîÌ$µšóIÍÙ±¤ð¦¸Þè& /JZ4ÜIz÷k&…Ç·n§“Tª–’Âù&{4Xªsó­¤­·^�T*Õ’Î?ô]IéÖÖÍjÍ'­\¾4©w ?ipxaÒÐÐ@R_o5©Ôê$µ²Ž?õò¤N«�T«÷&ÍÍv’Ææ'“–¯X�ôlÀü‹3„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚Hàv©›4?×LjejåZR½RM*gzj=IÝr9ªÛNªÔêI�n;©ÝiEeZͨÙÙ©¤V§“Ômµ“:ånÒ޻퓴j›í’–-Z�4ºyKÒ²åK“zú“,LÚ~»­“ZÍnÒÌÔLR£Þ“Ô×Czk•¤‘ 듎:ìȤ³O;'©Õi% $ÕëÕ¤j­”´`ÁPRo½žÔê´£šÍ¤©©±¤ðc9:>™ÔšŸKšžšLêëíM -[º$iv~6©·§/©Óé&õö5’ªåJÒÜ|3©T)%…_ÀáÅ ’&Æ&’þö·¿'•KݤðHjÎÌ%���%ÍÏÎ%MÎL&mÉtÚݤn§•ÔÓÛHšž™MêíëOZŸJj·[Iåj%ª[Jšk¶’f³®ÕšOZ²h8©Ýn&õdÖ<õtR§ÒH:åü³“{òñ¤ðÍ:åä3“Ž?þ¸¤‰—¿?é¸ÿ|$éæÿüERmn"izrCÒÂ=I#›7%…·Ø›7�&�ÉI•z-éà{KÒw×<’ÔÓ;˜Ô-W’*µÞ¤[¾sGR7Ó.×’JÙÆÃOý3é¡??œT©U“Â'ÛqxRøé]µ÷‡’¼öâ¤v£šô‰ËÎMj—ÊI�r%©ÙÛHšïT“6ÿñ÷IkößIOýèÇIW�~IRsj*i´ÑŸÔY¸0é°ÝÞŸT)—’:™ðîc×·¿5);¼uÿôð¯’æf›IíN'©5WJºàó'µ›­¤.¹1é ÝÇ“¶^Ü—4±e6ilb<é��þ9©±`›¤SÏY›tò…[’λº“tô©ë“N;÷ɤɉé¤r·�]©Ö2­Î\ÒôÜtR¹\JªV£æfG’~õÇé¤×¼¦šTkÔ“Ò£eµœtÃ�·%]{ýíIsÕá¤c¯¸?éàó¿’tÂ5ßN:õ‹?Oªv擲իV®6’&Ƨ“ô%�¼ï»“N9h÷¤r·’T¯õ&µZí¤j·’43=Ÿ4ß™Jjµç’&ŸY5:šôlÀü‹3„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚Hàv«“T¯V“úz{’Þ�Ù{Ͻ“>ò‘�%}rŸý’úú’*ÝJRk~.©›™ÏT2åJ)©§ ©97—TÎ,_¶URß@oÒìÔlÒÔÔLÒÀÂ…Iµj=©Q©&­_³&ióÈHRoOÒÀÐ@R£^Iš�™‹Ê¬[»!iéòåIC™jµœ´`p(é±GŸLêv*I“ãIõÌlk>©?Ó××Hjµ:IÛ=g»¤n©™TÍ„Õ-™ñ±±¤ð»P-W’šósIµL³9Ÿ42>šT«W“z{’f2Ϭۘ´tùpÒê­W'µJݤðY¿æé¤R­’Ô)u’ÂOȆuÏ$¥ÇÞZ%iÓødÒ|«•T­T’šóóI�N7in~6©Ñ¨%�lؘT.—’Ö¯[Ÿ´dÙÒ¤‰ñé¤n¹’4×î$…wF_ºó¶¤+®º,©Öé$�þåI§�|jÒWžh']òÇé¤Ù™VRø±Úæ¹Ic+vLênÿ²¤Õ‹“«š©ñé¤Ë¿pYRx®/wºI_úÝ/“š­RR·Z{+UêIŸyí»“Â{çR·ù,Öž)'mû‚m’ÊåjR)©9µ%©=Õè”’.üÄ>IåJ-é§Ÿ›^‡T+õ¤­>°kR¥ZM|ÞöI+^ýò¤­^ûФíÞþƤ³O9&錛®Nzld"©Ý·4ilr2©Tê$µ:ͤ�SÓI—îû¹¤C>¸kÒIû}6©Tk$]|êqIÿÜ4ŸÔ®Ô“ª“[’>ðŠ›“Ž¹`$é´+Ö%�tÁHÒ¥×4“Ž9á¯IO½~ï¤ÎAç%õ�pmÒy_œtÁç%U>yiR»\Kš™™K ŸüÌÏ·’-Lj¶æ’²ÛÍù¹™¤Ü�túÅk“Z³SI�VûYld㦤ð!̹§ž–T*•“Úíù¤É-Ië“Ú­nRµTNêη’*åRÒ9Gì™´tÙ¢¨ázRöðxvfv<©¯¯7©V+%Õ•¤ÖÄ|R8εËIÕF#éÙ€øg(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  À‘ÀÍÙ‰¤Ùé餱M’¾õ­û’nºù†¤{ïŽúÂUç&m^÷XÒ–‘µI“[6$��¬KjN�&M��$ÍŒE�m\›4=±1ilóº¤Gÿö›¤{î¹-éÁo#éË_ýrÒíwÞ‘tÿ׿‘tçW¾’ôýÿøQÒýßøzÒ÷Ü›ôõï|/éÎ{îOúú·¾ŸtßßJúñÏ–tß×¾–ô•{£îº;ê[ßÿϤ_ýîI_ÿÖw“¾ÿÿ™tû]_Mºç�o&]sÝ“®¼îº¤;îúrÒ�·Ý’ôà·¾™t÷W¿šô•û¾–t÷½÷%ÝpóMI]vYÒ•×\“tóí·'}ñK7%}áú“¾öõ¯'}ñ†“.»úš¤/ÞpCÒwß™tÑE—%Ýzó-I—^|qÒe—]’ôµîKºðüó’²�ÛEgžwFÒ5×]–tÂç�N:ù”ã’®½ú’¤‹.¾ ê’¨«¯¹2éæ;nNºðÂó“®ýâõIwß}gÒ%W]‘ô•ûîMºàâ ’®½áš¤SO?=é„ãO:ð O%­_ûXÒȺ'’ž^µß~{$|ØÁIÿsù¡I�ß|RÒ“_9+iìÁ+’¶|ë I¥Ÿß–4ñ_Jºòêó’Ž=áØ¤#ŽØ?iíc'�¬y4éñGþœôÔc'­yòoI¥Z5©V‰šœk&…:Ê¥jR©\NÚqÛ•IÛ,[šÔ¨t’¶þÔ¾Iá_ÚªFÕ~øÝ¤·Ÿ{vRo£'©Öh$U3 {“®ýÜ�I³+‡’:ÍVÒÃý¿¤¾ì•I/}õë’nèýZÒýùñ¤_¶·I:ðêË“¸õƤJ©•yó¢Içßs}ÒW¾~[Òa—]žÔj—“†çšI7�{jÒèú�I÷½ð�I/ÿÚÿ&�¶’fê‹£z—&�­Njïø’¤ƒ~5éCÿ8:iÅ{$}éÒƒ“®½úؤõ—ïžôô£�zòñ¤SÎþ]ÒWý#é´S~—tÒ¿M:áÔß%}⟓¶lÜ�´yãÚ¨ Ï$mYÿTÒ¦uQ‡|fפ÷~R½¯?颣>štᑟHúÂÉKÿÓ�’6ÿö+I~yKÒøîKÚü»{’>þÁ7$íú�·&°Ç{’ÆwOÒØï¿–ôÔOoJZó‹Û’¶üö«IþzÒæß-iúÏ&=ýß·'=›0ÿâ Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Òø³Ÿ=*éäSÎL:å䳓N=嬤c�=-éÈ£>Ÿtا%ísÐÑI –¬Nê[´,ipñФ¾Áá¤Þ�EI}ƒ‹“,K\¸"ih8jÙÊç$}rÏý’öÚm÷¤}öÙ;éÓ{ï“ôñ�~$éï}wÒÇ>ò‘¤?½_Ò^»}<êãIzï»Þž´÷^»&í¶ë‡’>úÁ&í»×§’Þûžw&í½ÇG“>ð¾·'}ôÃÿžôæ7¼:éÃ|wÒ'÷Ù-é]oz}Ò®ýHÒŸ=4i¯ÝöHú̧öMzÏ;Þ‘´ïÞ{'tÀ¾Iûî±{Ò‡}.éóÇ›tÄ¡‡&}æSŸJ:øÀÏ$ºÔ!YGeN>éĤ#;"éìÓÏL:áø“>wÈ¡I{ï¹GÒ¡‘tι&wüIIŸÞï³I§�|FÒ9g^˜tÕå×%�sÖ¥I'ŸrVÒ1‡�tøaG%{ü‰I‡tHÒá™Ïe�túIŸ?ñĤã�=&é°Ã¢æÛ¥¤Nµœ´r›ç%]xÙ IW~áKI§žqERÿÇOIÚêSç$õ¿ÿ褥{�ž´p·““†÷<)ié^§&-øøqIË÷:5i`×ÓνèÚ¤O=?iéV;$­Ú~§¤ÕÛ?7)üi+·AÒ«_úº¤J­šôŸøyR¥RKjuÚI¥n%©[é$…�Mþí¥/M*O7“žsð!I­R9i¾ÛNš�Hšzû¿'µº­¤á—îœÔÛ3˜Ô7<œôãÿúiÒ»_ñò¤W}hפZµœôüW½"é�¿þ6©þàI/èùaÒ!ÊIŸ?ê]I;ö®LúÚÇ'u*•¤j9ªÞ¬&u&šIºû{IßýüñI7~z¿¤rs.i`l4iÝ÷�ôû÷l—4¸°/ièwßO:qÿZÒUGÍ%�óÉÇ“ÎÞõ÷I/{i=éÍo\™tà~Û%í»×Ò¤#~^Ò]7½>i»¼8éªk¿�tÆI¯H:òÐç'�t “N;áEIç�ü⤥KV&-Y±:j銤á%«“–¯Ú6i`Éʤáå«“ú‡—&�|ì§“.8ë´¤ji&inz.é¶[¯Mºî¦Û’¶}õ>Iƒ/ø`Ôóß—4ô¼¨/ýDÒM·~5êÎû“®øÂMI»xXÒ’—îž4°ã»“¼ä£Iõ­ßš´ðEI~áû“žÍ€q`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  Pé\©×’Æ2síVÒèÄ\R¹ÖNjÏG -Lª”ÊIáË[+Õ“æZͤJ¥–TªW“j=�¤ž¾¾¤rµšÔn7“f3—_ÿ…¤v¹šÔmu’6lKšžšJªg*™¹™ù¤Ç}:ilr"ipÁ¢¤-[F“¾õ�ï&5çæ’žÙôLÒ@__ÒDöŠŒON%ÍNÏ$ÍLEuÛÕ¤©Ì’eK“¶Zµ:©Õj' ô'uË•¤­2µJ-)û¸5»åRR+3ß)%5Û­¤ð/­U{’JµJRµÖ“4>º%©5×IªV*ISI­ö\Ò¦ÑѤ¡‹’ú‡z“þø»?'u3‹—-MjTz’ê=µ¤©™é¤j­“Têt“–fj™ðøÖ¨÷$…‡ð=ݼ%iýºÑ¤ /¿2éÒ+/Iª”JI'žpjÒÑG™Tj•“.þ¿-IWým")¼­X¸ iéÊUIíNÒð²EI•r#©Ù-%-\²4©ÒèIê´ËI�j5鯝IªTËI¥n'©>_Jšo5“j¥RÒ[w~eR³ÝIzˋߔÔ,w“F:óI�ìõív[Yå¤�¶Ú&i¶Ý›ôâ�wˆÚeÛ¤¾µÏ$õÎÎ&�>³&éœ×½9iæ‰5I÷~ó›IáíØË_òâ¤W�~jRx�Q*ó³IµÉ¹¤ÿ[üϤ5ß=$é’µ¿Oêß0šôÀ}w&…_çr·”ÔʺèøÃ’{àëI/ÜפRu ésûDÒâF_Ò§¯¾$iÇ=÷HêŽÍ&m^¿)é3'Ÿ‘´ý’ý’,^˜ÔiÎ'Õk�¤J¹–ÔéÎ%MÎlN^¼(i|b]ÒLs6iêCŸK:óò’ÊõNÒ\w"iåvg$U†EeOMæÚݤðRªS©&•Ê­¤V{>©Úm%…7ìÍf;©ÕšOy2阣Ž:ú€¤ÃûLÒi'›ôòç %�~Ø®IWŸ~pR¸u2ÝZORµ^K^´ é»_ý~Ò%'~<éÆKOúÂéŸNúÊuÇ&]ýù=“n:÷3IÏæ À¿80@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(ˆt¾õÖ›“n¹ý¦¤/~ñÚ¤›¾tMÒu7\—tË�·&}ñú«’¾qßÝI¥r7©Uj&õ”ËIÕF=©Ôé&5g¦“BÍÖ|R¹VOêfjåZÒüülR·RJêoô$•+•¤R)«57ßLÚjõâ¤ë¯¿%é¼óÏLºìŠK’þüðï“Ê™F¦Ôi'õ $ öö&õÕI+W¯L*WËIÙ×´Ù™o%��O$u:í¤v§›Tn7“:©èw �HÕP¹’Ôš�KªVjIÝr)iÓ¦�Ió™Ñ-›“z=I�n3©Z¯&õõô&�nKš›�IêèOªUëI[o·:i||2i¨¿/©]n%ÍÏ6“f¦ç“š³Ý¤ðû7²q}Rv@j‡š¹Ö|ROO_Ò@æk~3é¦;®Oê´æ’>{БI‡xpRkn>錇6%ÿ_Mj•kICK—&õ '�÷ºI—½i›¤Ûßû²¤ð¼°`xaÒâÅÃIýÙqpnf>©ï¿îN:ú¨ƒ’Ö?ýhÒÄäTR©RNjöÔ’ªµJR«ÛIê©V“½=Iµn5©\®$ýøÏ¿IªUËIÕr=)<’ošIÚù­¯Ozè›?JúËw•Ô©Ô“þçú[’*�=“Ô;°4ifj"éè¯-©ÕžOzþá'•Û­¤R'ªÛl'ufæ“Ús³QÍVR·ÒIªõ5’:µJR»QM*•£:�RR5»ŸžMzÎ'?ž´ï÷Ošk·’Ê¥¨ÿùóï’®ûð®IíLZóð£I¿|ë6I/^šÔx0iÝÈÚ¤åÛ?'é¦ÊÙIGý}¯¤‘©fR­aÒèÌXR»\I:N·‘TiÎ%ýíO$�{ÙlÒ�”Ô×™Oêï«&eÇûðs·Û-'µ³Âß­Sª$õTjIÙi¡>X oÄËÝö³X·ÝJêÌÍ%ýôûw%�Æ‘Iǵ_RïÈÏ“Êk~œtòñ'Í7kI­f)i§]V$õ÷ $ÕKµ¤ÁÃI£[¦“j�zÒæÉÙ¤gsà_œ  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0D:|ÀÁIp@ÒÁ˜t衇$íý‰O&øÙâ¢_íà½÷ùtR7Ó¨ô$uKí¨V'©œ©÷õ'•+¥¤J¦ÓœOj—ÚI¯xÅ+“J�vR¥ÕIêéo$UÊ夅 ‡’:™Áá�¤¾ÌqÇ•tø¡‡'�pÜII'�ðù¤V·•T®6¢êQµR7ihÑpR­QOšÌôÔkIýý½Iín'©[î&µZóI½=�¤ñÉ©¤%‹†“šíVÒ“O>žT©U“zúI½}Õ¤R¹›ÔjÍ%õöõ$Õj•¤jµœ‘ºåRR'ûø®[·&©Õi'-Y¶4irt,ibr‘TéV’.¾úÖ¤Z¥œÕIÚk߃“>öÑ}“*ÕRR©ÔIª”JIÕr;)¼ÌkeªÝJRø‚4gÛIí¹é¨ùfÒ|·›^üÌLM$�pøžI'½oÒ“�ü>éðC>™ô¹Ïî™tÐÞM:é¨O'vÀîIg÷Ù¤gsà_œ  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  P`€‚0D:ßqû­I·gî¸#ê†/^Ÿôå/ß”týÕç']yÉYIW]qfÒØæuI[6>™4±i$irË3IÓ£’Æ7¬IšIšÛ�4?3ž4;¾%ég?þvÒ…�uéùI_¹ëËIwÞs_ÒmwÞ“ôÀ׿�ôõ¯/é§?ÿUÒí·ß‘ô�o~+éÎÌe—]uñEI—œ{jÒçO8*騬CùLÒÑÇ–tÖy§&süIÇŸttÒi§Ÿ˜tÖ™'']qÕ•I§žþù¤/|ኤϟzBÒ…œ•tÏWîLºè¢ó’Î9笤ˮ¾6鎻îJºë®/'Ýsï}I_ºõö¤n¾5鼋.L:ó쳓Î:÷œ¤ðw»þÆ“®»ö‹I_ºíö¤k®¿>é¶Û¿’ô“Ÿý2é‚K.KºüÊ«’Î8çܤ“Ï>1éÀCH:âèCŸÅ?ì ¤c�ù\Ò1G~*é’‹NNšݘ4>5žtÞyg%�tò©IÇ�vRÒ†›�O¿çœ¤Ú7.Nzú ‡&ýóòÏ&­¿ñؤµ7D�sÜ'“N9õठ7™´ßîïN¹ýĤþ§ÿ/ivf:©Õê$ &õ '5gf’/MNzäŸKš™œJzó6ÏK*UËIwýðËI¥v'ªÓMzÏëß‘ô�_þ<©R+'}èíoOºøÞ{’~öí“Öþô?’þðôÓI}CIµåƒI/Üÿ³I/úÔnIáS©N9ªœ}|»¥JR©\MêVÊI¥°Z5©Ò“ÕÛ›ÕˆêïIúé '' ì¹wÒ\©–Ô)u“Ê™ý®¿2iâ‘ï%Uë=IC•¤N©”T«U’®»÷¾¤ðÓûëí^ž4=5–´ñé§“V.J:i·¾¤ß}þ�¤êmç$m¾üؤö g'�]}bÒ!Çü=êˆ?%­ûÑ7’Ú7™4¹iCÒÄèÆ¤uë7$~ôŸ’.¸`MÒȆõI›6­K:p¯÷&m\óXÒ†µO']wÉiI·ßxQÒäèHÒĦÍI[6�$MlÙ’4=>55ž46¶)ijlKÒüÌhÔìTÒÌôdÒìèÆ¤™‰ñ¨©É¤É‰Ñ¤¹™é¤ÙÉñ¤pDÛ²9jtCRsv2jn6inj2éÙ€øg(0@A€  P`€‚0„  Àa(0@A€  P`€‚0„  Àa(0@A€  Àÿgï¿Ãä,ÿ™™­Én i”ЛHQ@, ]¥ Ò;¡‡zï½÷®*bÅ.( ¤JHß$Ûgæ÷G¾~9XÎ[ŒÏœû¾^�áÙÙ™ggËÌûJh`€ah`€ahé¼Å–Û$´ÿ!I›m²EÒ!‡NL:ðÀ¨}'LJ1jѤ1‹.�´è¢K%�µØR+$-2nɤÎÑK$­ø�5“¶ùüNIë|xäý>.iÒ‰g$�sîåI“N8;é¸OMúÂwLÚq»­“vÝé‹I_Ü~›¤OmøÑ¤�~x­¤-·Ü"iï=÷Hš°ÿ¾I“Ž:>éÔÓÏI2|‘¤öÎI­íC“Bç�uqÒ…ç^’tò)ç&]réuI§žzaÒ 'Ÿ™tÈaG&]xá¥IçœsAÒ1'%í»×AIÇO:5éÄON:ùÄÓ’?èषß!i¯}öNÚ/ë‹ÛoŸtø¡‡$uäáI'Lš”tÖ)§&MÌvð¡IÇOš”tø„“vûÒ®I‡¶_Ò„ƒöI:þ˜c’¾°ÝÖIÇstÒy真tð„£“>·ížIK,»rÒbã—KZiÕµ“.¼äÖ¤Óλ:iŸŽIêÞ`÷¤ú¦&•·Ü'iä“’:w:!©ý Ç& ÿÒiI­_86iÔ®g%Õ·:<©yÛc’Úw=-j§¨a»ž‘´È¢ã“–XjŤ<-éÒ‹¯Mº<ë¸cNKZdô˜¤öÎΤJkkRó�¶¤J©’Ô1¤3©\Ô’zªQËŒ]6©o°/©^Dýô׿OúåK/&5•›“þÓI•ÌÈ]öIÚâÒk“.þþIõö¶¤JksR©-«¹%©h®$•ÊMIE©–T*j™¾j-©ÖÔ”TojM Oo¹5*ü˜ntíIŸüÄg’v¿þʤ߾ýZR=3uîÔ¤ÕÇ(©¥¹=éÐÏl™Ô_®'55•“FgêE9éŒ/+éK]‘ÔÔ_J¶ÌºIç|gÕ¤_\{rR}­í’zWÝ<©´ÎvIåíŽJ~È…I•=ÎIêX||Ò"Ë}0iè‘×$Õö<;i¿c6Nê8ìü¤¶}ÎH2btRûÈÅ“Ê[—´È'¿˜4äcŸKj[ýI­«¬“Ô¹êÇ“ZWZ-iôV»'-väÕICö;'©c—“’?øÂ¤ .½1éäÓ¯LºáÆo$u‘4tøÈ¤öÎaImC†F Õ12iè°QImC‡' 1:iìbË$]qý=I·}å�¤;¾~Ò€ø/gh`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€‘À‹ŒžTÏ,µÜ²I=óº“ÚÛš’Z›jI»î¼wÒNL:ìÐc’¾´ÓnIî@Òþûœô±�~2iË­>—´Ô²K'm¼Ù–IK�—4gÆÜ¤·2-Í•¤b ”4Ø×ŸT*U’zú{“Šz=©=S/IãF-’T­$õF•[+IƒµjÒ¦[l“tÐ~’Î8ýœ¤&�ž4��¸9=}I#:‡%õÌ™“T¯$µZÒ�¶Ö¤é3g%uÏëKêêš›4f±qIݽ=I½½ýIµJ=©ÜTIªÖ“z2'�vjÒ…—œŸtʧ&�pêñIýƒƒI3çÍMš;wNÒˆáÃ’æuw'5µ7'�èèH*•¤ð§ÁW_›œ´ÄK&=úûg’.¹âʤo~÷I�ÿñ‘¤r½–tÖy$rÐáIÝ=¥¤+^ìMºùµZRQjNêèMjmëH*UÊI½Ù{6|TRµTOjÉôÔú’FŽžTjm�jnJª—¢Š!Ã’æ}jÿ¤·?²sÒèEF&Í™7'©¯¿'éš›¯MêííNjÎd?ûÕþjR©µ9iÂ'7Iµø˜¤[î»%©¥Ôœôì‹/&ÝüÀíI•¦¦¤ÁQË%åRRS¹’ôÙ ?™´õ¦ŸHZfÌÊI=íc“vÙbÛ¤ìCÚR*7%•KQáµ…?®Ôk¥¤¢^N ¯-¬¥¥))|• |ý­Z®$ Qýý½I[û3I½™a�#“Ö·dÒ@½”>BZÚÛ’†¶·$UJMI-µæ¤R¹%iÊôYI¥–¦¤ïm´|Ò§®y )û�«ç™Ÿµ$M}sJÒ6W<ž4Ø9,©}Õµ’F¬½nR×[S’fgZ†w$ îtRR׿û%õô&•š[“¾\ý|RO)©kp ©­µ=©RiNÑÕ3j™¤ãwÛ3éÊ“ÏL¾ý!Iý|!©ú©=’úVZ/i^½”4{n5ièâK' ’töËs’:ªI•ßÕ“ŽÝ蘤÷8"é“Ý,©¹©5©¥Ò”TìN¬ö'…?4†?qíyà±I-­•¤ðKtøøÂ€ø/gh`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€‘À½}ƒI³çÌMêéLšÝÓ›ôÊ«S’fÏéIê¬%͘:=i挮¤æö¶¤W_ŸžÔ78�4~É¥’†´·&utt& ©”’þôÌÓIÃ;’:‡¶%ÕZÒðC’Š¢œÔÛ37ª»;©¿¿/iv¦RnI*j¥¤9]ÝIO=ó\RQ-’Z›[¢Úš“Ú2½ýIsæv%õg6,©»gNRKKSR{g[RS¹”ÔÓÝ›TÔªIÓ§OM•iiª$µµ´&Õ3ý=ýI³gÎJ ßi©^$õ÷ÍKÌ”²/"á—š .:?éêë.O6¼#©^ªEe¦M�™Ô;8�Ô\©$U‹¤¯Þ{oÒ…—^”ôË_~?i°w^ÒăMZfùu“:ð°¤iÓæ&MüéóI×¼<')ÔÚÞ”Ô1rhRÛ�!IÙã¨Ú?X$ VëI3gÍJìOjimOjomK*· I¶ÈȤ––Ö¤öaC’jµÁ¤––JR¥5jñަ¤J%ª%Ó3onR¹©9i° ©T¯%U3Q·üö‘¤i¯¿™4bÄbI?ö‘¤ð™ÑÞïž4kö+IíõrR)óÉu?œ4»¯?iËOl™ôä[O'==啤ÎÖ‘I«¬´zÒÊ+®”T­IáÏHñ«\¥¤z©HZ¸×V+•“Š¢–>z¯<îØ¤ož}eÒÊk­“T´•“¦Õº’jµjRøí£T)'m»Î6IõÞþ¤7Z/é nJ**EÒ=?þQÒ_z’ú«ƒI¥J‘ô­K/KúÜ·ŸNÚvÙ¥’*ÍÍQýó’ꋌL>jDRøBnçÒã“:†w&•‹�¤j_T©Ü–ÔÓ=7©½©%©ù×$uvŽLjùù’úªµ¤JæŒMÖH:m“u’ÚÛ‡&ÿ»’fÏž“4X-' 6<){VQ)Êå¤Ú`Ro_RÏ`Ò9o K*=Þ�4ëõ·’æ½>'i`f_Òò˯�tÉ×' ÔªIµZ‘”¾¼ÙÔœÔÔTNZn™¥’šÛ:“ÞžÖ•4´sXÒ€ø/gh`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€‘ÀwÞuKÒm·ß�týu—%Ýõå›’¾ñõ/'ÝyûMIw}õ椯|íÖ¤[î¼.éú®Jºï›_I ¯íë߸#é†[oJš×ÝŸZ}õU“ÚÚZ’z{’JMÍIoeZ[›“Â2mêô¤¦¶Ö¤öö¨ÞÞî¤ÙóæDÍíJZvéñI3gNOèëNzsòÛI•–¦¤žL{k[RÇ�!IµL©TIzsê´¤SÎ83éÄ3NNºòº+“ú’F�‘T”ÊI32õLS¹”~L;† MêìŒêž;/éäNM:ö˜’N<éô¤ƒ&–´çû%mºùIW\smÒ+¯½žÔÖÚ’4v오J©žtêyg'�qîIo½=9©(Õ’Ž8츤‰OJ:|dÒ$éÄ?LMºô…î¤JgGROQOêèhKZê�_KZáÉ{“V~ö¾¤Õž iågïMZçÕ$­õâIzþ{I+?ýͤ•žº7é¼+iåßÞõû¨Uþð•¤=õµ¤ÕžûVÒG^y é�oß’ôÝ{oNºõ†‹“–?¼Þ‡“úÞHÚÞ‘tè±$UŠJR9“þÄUL UZš“æuÏIºñÞ‡’v?ê’¤…9ð_Î Ð À  РÀ  РÀ  РÀ  РÀ  �ìÞ;î–$ý¿“o|€ A€ ñm¿ûN’¤ÆÎ7;`>0@ƒ040@ƒ040@ƒ040@ƒ040@ƒ040@ƒHàî™S’ºf¾™Ô=gjÒœYo%uÍŽ ¯möŒ7“ºg¼•4{êëIóº¦&¥·mÖÔ¤yÓ§$Íz{rÒ—�™tþù§%?éð¤ÓN9*é¢KNK:íÔ‰IçžwZÒ9ç�’tËm7&=üÈ/“îð‡I?ø—Iç^xVÒ©§MJºôòó’N=íĤÓÏ9-é”S�Oúɾ–tÁ¹§']tÙùQ—_˜tîg/Än¾õÖ¤ŸþìÇI‹-2"©³½-iû­?Ÿ4uú[IßÿÞýIÇ;!鬳NH:ÿ¢³’^x鍧ŸþSÒŸž~6éµWßHzkúÔ¤—^y%iê[o%ÍxkjR¥ZOêéž“T ô$m·å瓆´¶'õVKIåÖaI§œ~RÒì©o%•Jõ¬JÒ@µ”táe%÷ýç“ùΟ’N|tjRKÑ”4wÊÔ¤ö¢”48gnRÿìÞ$OrXЧö}"iì§·Kê/ªIµ¶Ö¤JsKÒ`½’tÒÞ'MúÒ>Q;ï•tüN{$}õ¼«’Ư°fR¹R$•2õÌÇ·Û7i•�¶LjùØIËoý㤶–¦¤rS%éwž´É^?Mš2lç¤møCÒÏK­I+v–“¶ÿÆSI]íK$U*¥¤z-éÑmVMª�’ôjo)iv×ܤ¢g0iÄ"£’jÝER÷ŒÞ¤þé=I#[+I3º’ÆiK:íƒO&]¿áÏ“f½ùjÒ!OH:tïí’ºçõ%õôö&ýæ…Ç’:ç½’ÔRîKª”kIC‡v&öó§’N:îð¤)·�’´ÂϾ‘tÎsíIÕžrR÷Ô9IÃ:Ú’ê½µ¤'ÿðLÔ#Iúòä’Öêû`R10/i ¿7i°¿/©¿·'©’=f™¤¯¾9éäOHzù‰ï&Õ¦=ž´0`þË€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A¤ðq'ž›tæyW$wì)I§œ|fÒÑÇœ–4áÐc’Ž>îÔ¤ ‡��tÒ)çG�pNÒñ'�•túY$�|â¹Q§D~èñI'žr^Òù]•4鄳’N:þŒ¤sλ:éȉg&sÔÉIǵǮ»%môñ�'}*ó± 6I !—žeÒUWÞ�tÉù—'�yÖÅIçŸwIÒ¹\™tæç%�rÊ9Igœ|fÒi§ž•tèÁ'm¾ÉæIûî}@ÒöÛî’´èâK%-2rLÒK-ŸtÀ‡'�yÖåI“Ž99iüø¥’*嶤­¶ZÒ¸±£’>¸ÊêI+,·\Ò2™‘#†'�3:iìèE’Æ/>&©³sxRKû�¤Þ¹³“Î=ó˜¤ F|ðqIìXÒÎÛïž4Ð7/i—�÷Jºàó«% 7&©uäð¤+?³BÒyŸŽjíìL;~ɤR{{’'9,¨¥cѤR_OÒZ›ì•TTš’VþÀjI«¯¾FÒ‡ÖX'iõ}$i�µ?š´úšQ•R9©¹TD•›“¾xâ!IE©–TÊÌ]æÈ¤zyhRÑÞ–ô»žMjʬ»õ�I•¡-IµæZRiÊŸ“®Þ|µ¤Ï`±¤9³ßLšÞß›Ô_LÚ–´ÎŒáIOÎèIÚb³ ’º«Iá=�={NRQîKjj/%µ’ôêô©I=ERexsÒ´É&uwÏHZv©qIDZFÒ�û�L6|hÒiǬœ´ÛŠNšÖ46éÍ×ßL*g[¤-©ý¾‹’ÆtKZ¢slÒnãwH*Êõ¤¦¢”Ô<¤#©kúœ¤��¾¤¹}s“æô¾•´Ñ°/$M™65éä­ÎOjj©$•+­ImC†&­ú‘�'5é䤃Þ;éôÓÏL³ÒI­ãÖMZ˜0ÿå À  РÀ  À‹‰»÷Ž»ï½ãîƒ÷9`ÁËwÞnÇ{ï¸ûŠó/ùÛ7Yoí�Ü{ÇÝ×_zõB¹ ÷Úàýgà¿Î‡×Z»\öŒþežNð_gø°á[~f³äÈ×ß|ãG?ûÉÃ�<¼PÞï½6xÿ€øïòÚä׊¢øÄÇ7Lžüæ×ÝzãW¾qÏBy× ÷Úàýgà?ðl³\ÞbãMÏ>é´ð/ò.hæ¬Y¯¾öêrË,»Òò+ü£c6Ûè3ó[ðüþÉoí]iùî½ãîÛ®¹©(Š�¶Ûáš‹¯¸ç–/õÆÛ¯<ÿ’OýÏÆœ_Û?7rĈËϽh—/|±³£Ãc€ÿ3OÉ�¢•–_áð¾åÊë÷Ýcï¬ô�––æ÷p%¿üõ#¥Ré³›mù�˜üúäGýÕ#�þê‰?=^ç„}ößa›íG >kö¬Z­¶øb‹¯°ìòïùÚþ‘ñKŒßþóÛÞpÙ5'süë}Ìã€÷™€…`H{ûŽÛlÉÙœsÊ™ŸXÃÖ¶¶§ž}ú†[oú΃ß{×ö�|oÞ¼yk~hÍÖ––¿{ÀÓÏýù’k®¸äš+~ð“%WØÚÚºáÇ6¸ÿÁv?`ïŽùÄ­_½s°Z�Éc�ÿî'ÿ|¡Ÿ�ß?ùÇ ¯¼t¯Cö¿ñö›Ÿþó3Ç ßtãM.=÷¢sN>c«M7/—= à?Ë3OÞ£Ž!C¯¹øŠc�8úÃk®=wÞ¼Ÿüü§ÇœõdQ�óÏü‡€x�fΞõ­û¿ýÆ›o,±ø‡ì?á–«®?ò CW_eÕ…uýýòá¢(6ÿÌfÿþUõôö¾ÿçgñq‹î³ëW]péé'œ²ÆêkÌš=ûç¿xè׿û�Gÿ9`Þ£Z­vç×î:ô¸‰gœÖ£¿}¬©©yƒ�}ü´ãO¾ê‚K÷Ùu�ÅÇ-úo^ÿ÷òÃY³g­¾êj--Íÿ�–!ííÛn›óO;ûòó/ÙrÓ-ÆŒóôŸŸ¹öæë÷9ô€+o¼vÊÛoyäðŸcàßõÄÓO]xå¥ûzÀ—ïþÊ /½8nì¸-7Ýâòó/9ÿ´³WûÀÿ�kþíã¿omi]sõ5þ¯8­--§süMW\·Ë;­°ÜòoO›zÿƒ|ôá§œsÆ�ú™Ç ï0 ÇÀÀÀ}ßûî±§žpÌÉ“~úÐÏfwÍ^a¹åW\nùç:¿õÀw«ƒK-¹Ôÿg chÇ«¯Q«×~÷‡ßŸwÉ}ø­_½sÚŒé¼o À,d/¿öêÕ7_¿ïa]}ãµ/¾òÒ¿sUSÞ~ë¹çŸ×…£F.2qÂaóÛlãMŠ¢:dÈ;—ì¶ãÎÿÒ»Xˆ×ÖÓÛs÷7îÙ÷°ƒÎ½ôÂßþñq�Þ`þS~ú‹‡žxú©óJ~òÐOßuÉðaÃ>þÑõç·ÆêkEÑÞÞþÎ%^ëÃÿÒõ/Äkëîéùúwîëííõ¡àÿ0ÿ-.¹æŠíwßéô Î^ð‡~õËíwßiûÝw:츉ó/yñ•—ç_òw;âø£|óç_øëö»ï´ç„}ÿÑ;ý—® þË€„ A€„ A¤ðô™s£Þš•T-·'M~sVR_µ–ÔÓ[OúÎ?NúÙ/žô⋯&Íèš“4wNoÒô·g' .TãÆ�IêìšÔ5»;i±±‹&µ ÕÚ”40oFRçÈÑIÕÁ¨Z5©eh[Ò`µH‘ÒÜžTnª$uÍ�›ÔÛ?�TL,ÊIýý=I}ÝQÙ‡t`ÖÜ9I3fÌLêëéNÖ9<©µ­=iÑqc“šKEÒðÌ[oMMª•¤JS9©o ?i^fùå—M*—*Iózz£æv%Íx{zR©Ò”ÔÔҜԚio–4lĨ¤—^z!©cHkÔðIG|TÒˆÎI?úé÷“.¿ò¼¤;¾|MR=sËM—&]táùI—|b¥¤ë7ù@RGggÒuÏÏL,Õ“úºç&ÍžÓ•äI ªÕ¢îûÎóIüÍw’êE‘T E?ö–ËE=©R*'•ŠZR9TÔ’š«EÒŽÞ/©©VK:áök“¦My%i`æ`RSkSÒ=Ƕ'ípîYIáçB˰‘IÕz=iù>�TìMê\ùIkÝù»¤ó’šª¥¤7¦LK*ÕªIÕrsÒÇF—“^¨—’F –4P &-¹ÒÒIm­C“*-­I«-Ú™4jÄð¤Á¢”ôñ1MZbü˜¤¢Ö›ÔÖZIª×g&MŸ5#)|£i`nÒÕ•ƒ“çÍK?Ø�TÜyfÒ´kOH:cÝÓ“�¼\Ò¸btÒÜ®®¤�Á"ihǰ¤Yo½•4¤£3阇NHúj×7’†t´'=Ú÷pÒ)?<)éÌûOHªfêETu°ž´Ý6{&5WJI½}IµrsR¸ÔêÕ¤…9ð_Î Ð À  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ  РÀ "€ïøò5I·Þ~uÒÕW]�tï½w&Ý|ã5I_»çö¤×_ýsÒä_LúÎw¿žtç—oJºùö’šZš“æõö$5gjõ¤þÞž¤¡íI/¾òjÒÛ¯½�4gvWÒbË.�T®÷G5—“3õ¾�¤Z5ª'S-’ŠZ=©­©9iHÇФjQK˜×“T«Õ“ZÛZ’êýµ¤Ù3º’†´4%õ &µ mOzkÚô¤QcF'µeÞœòFÒì®®¤G~õhR-S*ÊI™RS%©(Õ“ÂÓ[ÎŒ[l\RöùWmiª$õõõ$µ·5'Í™=+i͵VOêš='©TLjj’ÔÚZOÚmç]“Î:ý¼¤¢('Õ«I墔4kæëIǵ҇í›tãW¾—ôæ¼þ¤žÙ3“úKå¤ìkCÉ“ôè·.JêÒ—´Î†[$mÿ±õ“Ц¦¤ðIq©ÜœT+êIá�ÇÍ•RÒÖGï“ô¹ãN 0»ýÜ«’š‡¶'=ý»Ÿ%ýþÛ—'ýê›W$í|Ð-IáçB­š´å¦Ë$õÕ†%ÍìêK]™—Tyíõ¤ì5˜¢sèФ¾¶©I{ ,›Ôÿ±�’Z‡MÚbò"I³»¦%}{ÍIw-Ò•ôÊ_^Hê­u' Tû“~÷òÔ¤Ž¡C“æÍ™™´ZåwI]3g%U륤]¾ÔœÔÜY$-½Ì¢Ióº“ûÅšI¯Ü|QÒ°ï]—Tzì[IG|dbÒ)k�š4{Æô¤ŽU‹¤R½”´Ü2Ë&e?_]³f'�ÿçK’N~äĤÞyÝIåz-iòÛo$Íêž–Ô×;7©Ò\N*—Z¢2¥¢–T® $UZš“š‹rRS¹–Ô— _1[˜0ÿå À  РÀ  ,ûï±÷½wÜ}Õ—¾ëò£9âÞ;î>÷”3�¢ÿƒ®¹èò{ï¸{ýuÖû¿âÖºßA÷Þq÷ÉGOò�€÷À Ð À  РÀÀûm¥åW8ñ¨ãn¾âº{nùò]7ÝqÓמrì ë®õáw6rĈØpý¥WÝsË—ï¹åË×\tùî;}éï^Û½wÜ}Û57E±Óv;\sñ÷Üòå¯Þxû•ç_ò©�o8ÿ˜/_ë½wÜ½Ôø%Üsß›®¸ök·~åŽën9î°£Z[Z¼ª Öûر‡M¼öâ+¾|ý­_¿í«w^Ëù§�µñ'>µà17^~í×nýÊž;ïvçõ·ÜuÓ'¶Òò+\qþ%_»õ+×_zõ»îExæ[eÅ•?ü¡5×ZýCÿæéÝl£Ï\~ÞÅwß|ç]7ßyÑ箹Úêï:àŠó.¾÷Ž»·Ùò³ïº|‰Eûúm_½û–;G þÎ…«¯²êéÇŸ|ǵ7ý¶¯~åÆÛ.:ó¼M>µÑ{û($§÷ïÞ9ìÒ³/¸÷Ž»Ï<áÔææfŸAðO€€÷ÕWZùÔI'­½ÆZEQ¼øòK¯N~­V«¯±Ú‡ÖYû# ¶ü2Ë^xú¹Ÿüø':†v¼þÆëSÞš²È"‹l½åçN:zÒ?ºæ ûì¿Ã6Û�>|ÖìYµZmñÅ_aÙå<`ßÝ÷úô'?ÕÛÛ;uÚÔ!ííë~d�‰¾à[où¹õ>²n{û�·Þ~ë…—^œ3gÎ Ë­0aß÷Üy׫T*ŸþÄ'_ã�J¥òñ�®ü‘ÇV*•)o¿5zÔ¨/}q—÷|Ú÷€Žž4éÈcÿ�Ó»ýç¶Ùo�}Æ/¾ÄôÓ_yõ•±cÇ}ØÄö¶ö�ùÓ,Šâ]'¼(ŠÍ6Ú¤\.ÿõ…¿Îš={þ%ë¯³Þ G·Ú*«V_xé…Ù³g/»ô2ìµßn;îü> áé}—Q#9óÄS—Zr©'žzòÔóÎðIÿ„x_}nó϶µ¶=õÌSûvàñgœ|Üi'îÄ„s.:ïOÏ<µàa‡xÈÈ‘#ÿüüs‡7qâIÇ~üѧŸ{Öì®Ùk}hÍ­6Ýüo¯¶µµuÃ�mpÿƒì~ÀÞyÈ®ìuÁe½ôêË ³Ì’KŸwɇ{äÁÇñÕ¯ß]Åš«¯1¼sØ;üé™§.¸üâ='ì{ÔÉ“&�~Ò„£¿öæëkµÚ¦o²à_Š-Šâ¶¯Ü1éô“~ùëGŠ¢¨V«‡7ñˆã�ž9kæâ‹.ÖÖÖöÞî¿oÄðáÛ~n›R©ô­û¿}ð1GL:ý¤C�9búôéÆ [ð°ïÿø‡Õjuùå–×�ZãCkEñØï~ûÎ%{ì²[KKËžüãþ‡O˜túÉŽ>ü¾û¿]*•>»ùVË.µô¿úQÈOï;Æ�{Æ §,±ø¿}üwg\pN­Vóÿœx_uvvEñÒ+//xáïŸüãÿ~ä�?nò©�–X|‰9sç^pùÅÓgΘá³yî?ùQQ~lƒ¿½Ú–ææ?>ùÄ­_½s°Z�Éc�ÿî'ÿ|ÁcþÕ/þð§'çÿ÷7ïÿöì®ÙMMMk,ð/$ßqÏWûýo|“?ô³×ßx½µ¥õãë~tÁËâ�EQ¼öúä¢(Þžöö`µZ«Õ¦Ï˜^.——¿ä{» ÿ¾Í7Þ´½­mÊÛoÝùµ»æ_2{N×ü©{ASÞ~ëåW_nnjÞ|£MÞ¹pùe–]b±Å{zzüé�æ_²Áz=jt__ßå×]õÎYýò×îšüú䦦¦Í7Þô_ý(ä§w¾ñ‹-~úñ'/:nÑGýÕy—]äs`à}õÆ›oE±áÇ6øì¦[t úw�YcµEñ‹�=§kÁËçÿÛÅ‹Ž÷wßê›÷럿맞}fÁ?vuuE1|ØÿòwO›››7ýÔÆûí¾÷áý™R©ôìsϾóo,`¥•‹¢xý�×çÌ�»àÛ>ÿÂ_‹¢XjÉ¥ÞÃG!9½ó Úqꤓƌóü_ÿrÉ5WøÄ€�XêõþÿÿÿûŽ»¿òò+/�1b¯]÷¸õš¯¿ôª“Ž:nƒõ>¶àñ#†�(ŠbÍ­yïw/ع§žUEkkëß¾‹ÁÁÁ¿¼øÂ?¿‘SÞš²à«ÕjQM•Ê;—lµÉf7]~í{ï·ùg6ýÄú~ü£ëü£ë�5º(Ц¦¦¿½;ÕZµ(Šúÿü»ÄµZµ(Цææ÷vþ}C;Šÿ¶4¯{Þ».ùÞ�~Ðßß¿ÌRK�3vþ%Zmõ¢(~ùè¯Þ9fXç°¢(ºæÎy×ÛΜ5³(Š¡C†ü«…ðôηâò+Œ1²V«-¿ìr[g=Ÿb2 AýŸþrÖuëÜîyG�<éòk¯|ø‘_¼6ùµáƯµÆZGL8l—íw|×[½ôÊË�<ú«¿í׿}ôoßEOoïÿöFV«ÿìF®ºòöØe÷ŽŽŽ_ÿæÑ³/:wïƒ÷ß~÷�¶ß}§gŸ{¶(Š¢T OEé½Þ……òq(Š¢^Ôÿ·ÇÍíž÷ü ©T*›o¼IQ«¯²ê¸1cgÍžýЯ~ù/ÝÁü£ð¯žÞZ­öõoÝûÐ/®T*ûî¶×È#|–@ ,=½=EQ”Ëï~Š1ÿ’þþ¾w]þð¯¹üú«'žtÜGüØoS*•6ÿÌfïüßÙ³gE1ùõÉ—\sÅßvÅõ×ü'îÂFŸøt¥RùÓÓO]tÕe�?ùÄ;ÿtóÈ#ßõý¹ óÿ­æ¿óÏ)ÿ½jûÑßñ©¢(žzæ©ÿõÚæE1¬£ó]o8bÄÈ¢(æuwÿGOïSÏ<}Ï}߸æ–^›üÚˆ#Ž8èPŸe�0 Á”·ß*Š¢ãoÇÂáË¢˜9kÖ?zÃÙsº.¿þªZ­6tèÐw~%ð“Ïü©(ŠUVþÀß.Êÿ9EQL›>mÁ ?¸ÒÊcF�y×öî«®¶þ:ë­÷áuÞó]xé•—‹¢Xf©¥¼pݵ><ÿ÷ì¾Ë�~þ“yÝóÆ/1~Ù¥–^탫EñÓ‡¶àÏýåù¢(–X|‰wýªæ—_¡(Š×&¿ö=½óÿ=íZ­vå ×ôöö®¶Êª;o·£O4øß2 Á¯ûXwO÷Ð!CÞç€w.Ül£Ï¬°Ü EQ<ö»ß¼sá;}i½µ?²àÛnûÙ­Ëåòœ¹sçþϯªýÁOüæ”7G�}êq'Ž5ú�#‡´·áóÛnÿÙ­ÿwaêÔ©EQ¬öÁUç�ÖEQŒ^dÔþ{î[Yà—çÞÃ]Øg÷½�:ôȉþžïƒ?þaOoï¢ãÝi»æ_ÒÙѱË;ý݃«Õgþül©TÚcçÝ9rÊÛo=ñôÿò7€þõ#ÓgLomm=ìÀƒß™±wÙ~Ç%—?X|ð'?|Nï /¿ô�o³(ŠÏoõ¹ÕWYÕçüs``!èîé¹ï»ß®Õj}òÓ·]}ã¥ç\pý¥WÏŸ÷ýÍc¿ùÃïß9rÍÕ×8öˆ£o½ú†óO;û¬O½ú¢ËwØfûz½þ½~Á+¼üº«fΜ¹Ú*«^vþÅWœwñ9'Ÿ~ù¹Ý|Õ ;á‹ãÇ�ÿOÜ…ûøNWWטÑc®<ÿÒsO9óüÓκüü‹GŽùÒË/½·+|ÿïÂì9]÷}÷[õz}‡m¶¿âüKÎ9ùŒ«.¼lôèÑ]ÿóï-¿Ë/~õË¢(V_uµ¢(žøÓ{Àw}¹¿¿ÿÃk®}ÃeWŸsòéW]péö[oWÅ÷~ðý_yù};½÷=ð�?þé‰–ææƒö= ­­Í§ü``áøæýß¾ôêËŸûËó•Jeüâã;;;^›üÚW¾v×…W]ºàa?üé�ÿø§'úûûÇ/±ÄJ+¬ÔÞÖöç矻äªË¾ö­{<ì//¾pÌ©Çÿô¡ŸÍš5k̘±+,·ÂðáÃß|ó�üƒï|ïþÿÄíŸ>sÆÉgŸö‡'þ088¸ü²Ë-¶èbùë_O;÷Ìyÿó÷’ÿUïÿ](ŠâÞï~ë¦;nyý�×Ç�»Ü2ËN�:õ¢+.éééù»?ò›GgΜYE­V{ð'?úÛ~ùدϻô‚§ÿüLKKˊ˯¸ÈÈE^~õ•n½éö»¿ò>ŸÞË®½rÆÌãÆŒ=ü€ƒ}®À?aš_ýö±λ}Êñ|êOŽ>ü]7ìû~Ðö»ï´Ãž»¼ú~§ïO?uÊ9gì~à>;ì¹Ë.ûíqÔIÇýàg?þÛÃ’�Brz‹¢¸òÆk<«óÍ™;w¿Ã'l¿ûNç_~±O4ø' À  РÀ  РÒ¸\/'Õ륤R©’Ô_I¥¢–T¯W“Â2XL¨ $…ç­¨Ö’nÿò­Iýƒ½IS3áµÕ3ƒƒýIí­MIcF�IêÉ4×KIµLQ«&M{ëí¤z¥’T*I‹ez3s{{’š[›’j½}IýݽI­í­Is»f'µzR¹­%©-lÈФ1Ù'C_OOÒ¸1#’Jõ"iæì®¤ŽÌk“_IêéîNš•in)' Ït iO*e^øëËIMM•¤ðeS¹”T­Ö“ššZ’ÊM¥¤É¯NN:éô“FŒžT¬&u´·%�Ybñ¤q‹�M;vѤK.»!éÜó¯N*UÊIÍET5~wþÍÏïJšwÏ)I×n¶fRQLª7I° æ¦Ö¤úÀ“¾{×µIÍ­­IµZ5©œ™Ó53©­µ9©¥Ò’´õÄ}“šËmIµzRO½žÔ_«&þÙ/& fª½3’š+MICZJI›|öˆ¤Á¢œô¹þ'’æuÏJš6óí¤6üxRsÇ�¤»vøpRuƒu“×Ü$©ôð}IßZrJÒðŽÖ¤YS¦$MýúmIÓ<©©¯šÔYnIê™Ó›Ô\/’Z*ƒI¯½øjÒð!­I¥–QIÍm#’JµJÒÛ³û’Θ¼OÒåS÷Oªõ÷%�zôkIãæ½•´DëI‡,sPRÓ@9©Ò5rÄð¤ŽC’–é\!é[?~0iÒ#Ç']üüEIM™¢T‰Ê dVÉ fƒV¹^$ T“ŠÒ`R(|©R+’Ê娞�ž¤éoÏJ H-ÍíI s࿜ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€D:÷tMOš3ëí¤ž¹Ó“úgMKš7gFRïœYIóº¦'õuÏLêíš‘4gÆ”¤y³ÞNšþÆKIW_qaÒ5W_”tîY§$�uîiI—_~fÒwÜ’tÝM7$Ý|ëÍI—\qYÒ]”tÉåQ7ß~CÒégœ”tÖ™Q7^QÒYç�štÊ©“’Ž8ò�¤c�?2éÜ NO:þ„‰IçžwZÒ '�tÆ©“®¾ú¢¤3Ï8)éø“ŽO:㜳“Î9ÿ¼¤s/¾0麛nLºøòK’ÞšòZÒ+/ý9éÚ¯Kºà’K“®¾þº¤ó/¼0éâË/KúÑÏ”té•W$]qÍ5QW]�tê'$M:½öÞ%éÊkÏKš=}FÒq“ŽL:ë¬3’&�t\RvÚN½ðè³¢N8%é’SŽOúé}÷'íµáŽI³æÎLš;kFÒÌ©o%u͘–4wÆÌ¤Ýwý\ÒÌk�L*ÿìþ$OrþŸuÎÉû&9Qðÿš®©w%µ4I“>·SR_æR9)¼§}ý=IŸ=èKQ‡ï‘T**Iõ¢šô“K¯Mj.ªIåR=©^*’Šr)©2𭤡#Æ&=ýfgÒÇ?½YÒö—]˜T/Õ“†4U“VøËyI£†�Lª6·'­°ñ†I—¼štÊÜ'“¿æÔ¤•ÖûDÒCŸŸÔtßI›®´|Ò_¾+és×ß–ôö]W&õ~÷«ISïº!iÚ½_NüÙw“fÝÿí¤“.™•tÊ·VM:û©m“.{þ‹IÕ)S“Þúë_“6\æIÛ®µmÒ[šôéå7MZzÕ¥“52©­¥œôæŒÉIcF KúÚk_IúIõûIáwçj½–T«.ÄJM¥¤r¥H:íg§%UëƒQ¥rR¥ÜœT*Õ“š›Ú“ŠZ=iê¬I|ü¹¤ýôI§\öÕ¤î™o&Í™ùjÒ€ø/gh`€ah``áøÚ5_~à¶ûÞéÛ7}ýŽKo>ù°IË�_ÆÉyÇÍ\÷Àm÷}b�õ� à?Á ,LS§O{õõ×^}ýµ9óæ.2bäG×^ïüÏùÈjk93ï0°0}ç‡ß=èÄÃ:ñ°]ß뼫.ìšÓ5¤½}¿/íã̼ ÀÀÊ/ÿëo=ø�¢(Æ/¶ÄòK.ë„ü§€€ÿ _?þØüÿXn©eæÿÇ'×Ýà¤C�»åÂë¾~íW¿{˽_¿ö+—�rÁf~æoßv•åV>ýÈ“¾|Ù-ß¾éë÷ÝpÏ�—Ýröѧ~lÍuÿ¥Ãî¹úÎn»oñ±‹þ£[xû%7>pÛ}ïüqͬ~ÞqgÞsõ�ß½åÞ{¯¿ëÊÓ/Ùâ“›üÝÛöÀm÷Ý}ÕEQì¶íη\xÝ·oúú7¯¿û†s¯úÌúŸzç°Ï~zóëιò[7~í¾ï¹âô‹?¼êšÿä\­ºÂ*ë~èÃþ¹làßaþƒ:‡vÎÿ��ÁÁùÿ±Ý–Û|ìÃÒ>dÊÔ)}ù…®9sV\nÅÃö9x¿/î¹à®¶âÏ:î´�¬ñá¢(^xù…W&¿Z¯ÕÖ\mÍõÖ^÷_:lò›¯E±îù»7oä°£FŽš×=oþ?±Îú§L~ÚŒi/¿öÊ¢cÆè±ímmÿèªÛçàS'žtò'xØï™øÚxƒOEQ«×žzþ™ù—<ùÌ“ç\qþN‡ì~è)�<ãØ}Ž=ðÊ[®©Õj[l¼ùÈa#ÞyÃm7ÿ|[kÛ“Ïüi×#öžxÖ¤#Î8f÷‰ûž~ÉYO<óä‚×ÿ¿=ìÅW^,Šb¥åVü»7ïck­[*•æ�ÄEQì½Óž­-­¿òñ=ŽÜoâ™Çísì�߸ÿ›¥RiëÍ>÷wÿ ëÖÖÖO~ìßþÁwwÿ�K�_º(Š?=ûTQ\i•¢(^{sr×Ü9 ^Ãs}¾(ŠeÆ/õwoÀ×ï¿÷ï^¾üÒËEñâ«/-xá¯þðXwOÏ?º/ÈV{n»õ¾;xï™X˜¦NŸöê믽úú«/¼üâïžøý-wÝvЉ‡½5ýíwØú3[Ýqé-ïuЖoñ©õ?±áG7Øð£Œ5¦(Ц¦¦w»åž;^|õ¥‘#Fî÷¥}¾zÕí·]|ÃOþ亼ëÝýo¬¾ñÖ›mmmk­ò¡¢(V\v…îîî%]|Ôð‘EQ,¾èb¿þãoŠ¢Þ1¬(Š®9]ïz3fÍ,Šbè�¡{gÿüÒ_þîyèÚQÅì®Ùïº|^÷\à?Ç ,Lßùáw:ñ°ƒN<ü°ÓŽ:õÒ³îýÁ·kµÚ;ÿ÷C+­ºÏÎ{uvt<ò›_�vñ™_:t�­öÜv«=·}ú¹ù¿!¸ôΑsºçzÊÄ‹®»ôç¿zèÕɯŽ6âÃZû˜ƒ&î±Ý. ¾»ä°—_{¹(Š­²úR‹�;zìúQ¹\ÞhýO}`Ù‡úÆ[oö ü¯ïüQ*•þÑ�íéý‡�·^¯EQ¯{Dï+0ðþù̆U*•'ž~òœk.üퟟõ?Ýv‘#ÿîñ?{ôá o¸ìàSŽÜs⾿þÝ£¥RiË¿÷»xÿùaÏ<ÿlQË-½ì§>ú‰Z­v߃ߞòö”}põµW[«øŸy¸øŸ¿û;¬sØ»®|äðEQÌëž÷/ÝÓ¹óæE1bøðw]>ôÿsÖÿ>0ðþ™?¯N›1mÁ W[ñƒcG�ýço8kN×E7\V«×:†vü“_ üwûÅï~U«Õ–\|üª+pò›¯OŸ=óÏ}nù¥—[~Ù劢xæ/žس}®(Š%ÿ®ë_iù•Š¢xåõWÿ¥{úÂË/E±ì’Ë,xáÇÖ\wþo;þ»ÖþàŸXgý�¯ýQ�à=3¦¾UÅꫬ>r؈ù—Œ]dô„=¨T*ï:rß/î¹þZë-xÉ[mW.•çÌ�3g�_£›Ö5wÎÛÓÞ3jÌrK/ûìóÏEñØ~3|ØðUWú`­^{äw¿žØÏ}xڌ魭­Gíx¹üÿ=WÚc»]–ZbÉÁêà?yð_º§÷ÿôû=½=‹�[l·mwžɰŽÎݾð¥ò&ì¶ßqsì„£ø³<þ§?ôõ÷/¹Äø¬°r{[û³ùó×\ô•oßó{î…ç‹¢˜5{Öž}rþ%/¼üBQ¯Lþ_þaç‡~óË3/;ç©??ÝÚÒ²òò+�9ê¥W_ºæ¶ënºç¶÷pgï¾ÿ×Ýyãä7&/:fÜòK/÷Ö´·Ï½ò‚îžà?Ç ,;NØu«=·ýæ¾óÏ{õÍɧ\ræ.‡íùù}¾°ã„]O¸ðÔ^{éø NÙjÏmoþÚíïöÝŸ~ÿä‹ÏØó¨ý¶?`çÏïó…]Ûóè³�ø·¿z×µ…‡ÝóÀ½[í¹í—ßë�KN¸ð´­öÜöôËÏyב�?óÄqç�´ã„]?·÷öÛ°Ó!§L|àç?øÛ{ñì‹Ïmµç¶;²û?¿³÷ÿôûœpèÖûî°Í~;vêQ¿ú�û{àV{nû··°(ŠŽ?d«=·Ýzß<–€÷Ì Ð À  РÀ "€Û‡�J6r\R{ÇȨa££:F% >:©m舤–ö¨¶¡‹$ >j¡6&ièð‘ ³a£“ZZ‡&ÕÊMIs{’zúº“ú2sæu%õDÕJIMÍ­I�Ó†tŽJ9blÒˆ‘£“†-2&©sä"IC:G&uŽ�4¤sLRûð¨Ýv?(iŸ½K:ú¨ã“Ž<⸤'�œ4騒Ž>ü¨¤#>4éЃ&$´ÏIžwqÒyçF]|î…IïhÒqG�4ñð#“Úoÿ¤}vß+é¨#&&í¹ÛîI4!éøÏN:ñij’Î;ÿš¤³Ï½*éÖ[¿‘tÙ%7&�vè™IgÙ0é˜Ê‡’ÎY~ã¤c+«%Q_=i‹¿6%}à‰iI«zIRyûS’Æ.>>iä˜qQcO1zlÒÐEKj¯¾™äIÎÿ³N8ó¦$' þ_óƒ£M:mÛ“>õùO%}`ÝU’~ü«'í|Ô¾IžyBR×3Ï'•«õ¤Z}0©<£'i“Ã÷OªV“¾tÌ„¤�?<éô/î�tÀg¶IÚ|ч“>1ä‡Ioÿ䚤åÆ.›T T“æ>vHÒ{ìž´ê*+'µµ4%Í~aJÒG6Ú(i…ñ‹'uMžœ4gμ¤—&¿™´ßGÖIºù‚ã’^ùá½I#v›˜Ô¹ý„¤¶­vKjßrç¤ÛìµÝžI�[í’4fëÝ’Ú?¼^Òño6'�ôJ%éÒ9K$�õö¢I�X'i…¹K$ �Üž4|nsR×[ÝIÏ<ó礣~v|ÒUÏݘ´Ìðe“*åÖ¤¦L¹VMª Ö“3õj-©ˆª—“*MmI¥z-©ž�‘�þyQµzRëÐŽ¤¦¢ž´öºLúÄK:gÒ>ImÃÇ$5 �´0`þË€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A¤ð`¦^¯&…ï´ž©eÂÛV®I•L¹\$UšJI忦¤ÁjoR½TI*êå¤ý÷;4éÈC�HÚo�’vÝq§¤ý÷Þ/éÈCK:üਠû�tè¾&M:ö„¤“Ž�”tü1Ç&�zÒÉIGtDÒ‡?¸FÒ1�OZÿ£$Õ륤¢¨&UŠRÒ쳓†™T*U’æôô$…_-«ý}IƒÕZR_=ªœijkKš3{NÔÜ®¤)Ó¦%Íéš‘Ô5{^R_¦µ½=©¹­5©^ &µiOêìKjmª'5eF�–4~ñ%“šÚ[“zf&-ý«ÉIáO­•rÒô×ßH,—“Šì‡¤Zu ©hjKz}ú¬¤r¥–Tßî褢Җ~—©×¢jÕž¨Áz’'9,¨¯Ö“tùí·'-ÿáu’6ØìóI7~ýî¤r¹%©”¾êªIõ"©T«' kKªå¤R½ˆÊn[­('í8ñ ¤ÃμÃöI÷ßóí¤Îq£“–]i™¤c.<5©V”’ú«QOíµ~Ò¨ö¶¤á™æöŽ¤ÖŽ!I‹,2:©R¯&µTç&�ñ×rÒ‹~=iXÛˆ¤™³º’ÚÚZ’zæ&•+-I=ýIE½’tÊ£Ç']ûÊuIåj=ª^KêêîMª”ËIýƒI¥TôEµ¹©5©(jYáB¦N}+©>XJ*g:FŒHjmïH Ï[KKSÒÐLS[{Ò¬Lÿ`5©ÜÔ”4mÊ´¤7ßœ’ôñ 6LêêîI·èø¤]wÙ=é€}öOšxèĤ%Æ�M*JÕ¤ÁZTø¥f 0©T.’*-ÍIåj)©{^OÒÐö¶¤ÖöÖ¤ZQ$•kµ¤EF/’ÔÞÑ–T®”’ú»{’š+å¤Þž�¤ZR[kgRu –ÔÒÞšT­×’ê™Zm0©íÍ_)©¯o ©g^wRÑT$õ÷& Úš4oÞܤ¾�Þ¤Z½U®$UûêIÝ[œt颛'�Õúᤡ-I•¢žäI Zmç�’®¿ãö¤ðe“ð¶ÕKÍIƒÙOfµ¢)©­¨'•êÕ¤ÁZ‘¾³ã›%ÕKER­('…·­¾PUKÕ¤ËO:=i»ÏmŸÔßß›T-ú“Ú[Ú“¾ú�o% ižôð#¿Lj_f|RëØI•™3“F�™ÔÒTNªTZ“â¯HÑ •R=©^+%=¶ûG’;*idgkRÏŒYI}s£Î|©)éˆ_÷&µfV^e•¤ôC_«' ö & išÔTnN:÷‰3’.}ñÒ¤Ú`5©\/’ÂÖ‰™”4Ø=/©½Þ–TªIµRThý�~"é3Ÿù|Ò†ŸØ8iܸ1IÇw&�3.é3ŸúlR5S¯W’Â/у©h£¬Öú“›Ú“Z*å¤p3:ëÐÏ'-Ì€ÿr`€ah`€ah`€ah`€ah`€ah`h|÷Þq·$©±óÍ˜Ï Ð ÀÐȶß}'IÒÿ;ùÆ€„ A€„ A€„ A€„ A€„ A€ÄB€ëõjRu –T« &•jÕ¤jm ©ž)W*Iµú`R¹R$Õ‹jR9Ó?XK OÈ’‹-šÔÛ7/©¿VJÚÞ–ÔT*’æÍíNšÓÕ›4{æì¤ææJÒðŽÎ¤r©’Ô=g^RçÈáQ™‘Æ% Ò–´ÒòK% Ú‘~Ê öõ$�_|‰¤¦r%©}hGR©^K*WJIý½ýI=óæ&Uû{“FŒžTd_.û3Ã::’ê¥"©µµ9©¿»7©ZH ßi÷ÜyIåJ=)ûJSîéž“ÔÜÞ–T $ ô×’ºû’jÕJRuõqQMÍIáW¤rksRgçȤjµ–4{æÜ¤á��I•LKÛ�¤ÑÃ;’Š–�¤z5jæ¬YIÍííI§Y'éòq›'½òÒä¤E—þpÒ–Ûî•4eåí’>¹Ø§“NÜüؤ/l½[ÒÛí—tÀ^G'mÿ… I/}|¯¤§×ß#é�ë})é7Ú!)|§Zo÷¤‡Ÿy#êOMzèwO'ýâwJÚåãŸIºòÔ3’î¸ìʤ;¯¼:êò«’n¿üʬ«“î¸âª¤Û®Ìºâš¤O�X,銓ÏLš´ÎI§m¸yRû«Ó’¦ýÓ>»kÒÉo�tÛ•W$Ý~åµIõZÒ‡ÖýHR}¡*Õ’î«R=õZÒ˳ªI§Oº6©^Lúê/HªÖKI¥z=)<½¥z5)¼¶sö<8iìø¥’Ú:[“μ㖤©Å�¤jQOšöà/“v;ûø¤®½FR¹©%iؘaIåq£“6?xߤ¢VO ŸW3Ù§B)üÂ5XŠ !S^~)iïÇ^N:ÿ¥¦¤‹^íLjkšÔÜÚ’4ûíiIMÕJRK[kÒð‘#’ætÏK:þW“’Îüã)IE­•½ÒÚÔšTjª$õ ö'-2zhÒRK�OZ¬±¤ZQO 5e>ú±�'-:zTÒŠ+¬œô¹Ïï�´å–_HZb©“Ú‡t&•ËERwRø%º(ÊI•J)©^+']pÊþISßž™4¤µ-©¹½#éÿÀ Àÿ)`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ahé<Ðß�TÔ«QåRRS¹9©^.%õ¦¤RQIªfjÕ"i ¿žÔÖÚ‘¾Ó¶æ–¤RææÛnJúîý$ýàÁû“î¼ë®¤/ß}OÒ½ßùVÒ×¾yoÒwüQÒWïúzÒ×¾y_ÒOþyÒC�<šôµoÝŸôà~”tå�×%Ýxã-IW]smÒM·]Ÿtù&]|ÕÅIç_rAÒåW\™tÝ ×'}ã¾ï$Ý÷Ýï&ýðg?OúñOJúÑÏ™ôíû”ôàƒ?Lzâ©ç’¾÷ƒ'ýäç¿Hš:cNÒëS¦%ÍéHzéµ7“¾óÃ%Myãͤ^z5iÖܹIog^zý�¤sf&½ùæëIG¼kÒ9'”tÕ”ŸF½ýHÒõ³~›tꟿ•tíìß$]7û·IWÏz$éÜ™%uÝCÒÌûoIš{ß­IM?¸)é¼¹¿H:gjÖ›?J:ë�“Úæõ%½ùúI¿üísI­µhRËÇWIú}ë[I3ç–“Þüóô¤É¿ýKÒ¬§^N:´HºxñޤëW^4©˜3;©kò䤾Ù]I‹î9)©Ú;/©6Ø—4˜)7µ$•êER-SÔêI¡ð {-«ëõiI¥Z=©6ØŸÔTéHÚwŸ}’Ú†ŒL,JI×|ý«I÷=ôpÒÏü1é�/¿”ôÜ}?L*•ëQÙ áò”U.jIÿG^ _Ò9ý”«’&Ϙ–4ØÒœT®—£²Ó[*Õ“Â/\µR•éŸ3'é GšôØŸMº÷êÛ’VÿÌI=ý}I½Õž¤™?ÿUÒ6þdÒ·Î83©^iJê¯Õ“*Í-Iµ¢šTΔJ•¤ø[eözzöy:0XKzt©m’æ¼Þ•ôì_ŸOzcÆ”¤9õ·’z*=IˬµDÒso?�ÔÓ65iâÏ'$]ùÜ…I}ÝIµþþ¤ê@oÒ@_Ò¬ÙÓ“zçÎYˆ�rÿ9I?�òPÒKÍ/'UjERømøýô…¿>ŸÔ7XM𛩖’ZšÚ“V[yÕ¤a™¦r9iH¦R)%5•‹¤ê@RQL*Õ«Igž|`Ò©Ç™tÒ1&-Ì€ÿr`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ahé¼öÚŸHúÔ§6OÚlË­“6ÙôsI[l¶]Òç·þbÒ–tè!“&txÒñÇ›tÈ„ƒ“N?ù´¤IÇž�tæég'�xâII‡zhÒ»íštàþ$5qbÒþû�t衇'íºË—’öÛs·¤/lýù¤Or£¤Ïm±iÒž;Ë.;%rÀ„¤Ã�:òÈ#’Ž9æÄ¤C?>é¬ÓÏI:jâ1IÇ{tÒ–›ož´íç·HÚyû/$}n‹Í“vÜn›¤ÏoµYÒöÛl‘´ä²Ë$½>åͤõ×ûHÒ–›}&©©¨'-»ÔbI‹Ž™ÔÖRIÚyûm“Æ�Y4i¹¥—Iê24iìèE’Æ/¾xÒ°ŽÎ¤ííI}ÕzÒÔys’^/z’¾ì¢¤“6Ý3é³�+%}¾ýIço°{Ò™ëì–thÛ:IÃ6Ý#iä{'ŸØ>iÄç&$M(>”táJÛ$�²è¦I‡u¬Ÿ4qħ’Ž˜»hÒ~ƒÃ“†iKZiü¨¤?üù•¤;î¼,é­;¿™TûÎo’Vm0©ô­‡“ê?ýsÒå?þCÒé]+©õgßLªûƤi7�•4¤clRÑ:,©}ÄØ¤r­šÔŸ©/\¥rR­T$UJ¥¤!‹�Mš—ùÙ7Lj[lxÒ™;í–ô‹çŸHª7µ$åRÒÑ»ì“Ôõæô¤‡y8éÕ·¦%ýàÚ[’jõÁ¤R½šTO‹„¯J…·­\I¥JsÒ–’´îÇÖNªôW“î«~µLø¹P)¢B§íö¤rQOZ}�’>7a¯¤r_5)ü(\}õíI}}I/}ï'I›�xBÒ}—ßœôð-w'=ý�û“²oY•ôÛi)*ûÚP.jõ¬jR½Z$Ýóã{’VY~õ¤Ñíc’êójI“‹¤%Y&©gJ=éÑ7~—töC—$Õ+Iá®JsKR½RI*75'UZ[’†tt&-1~¹¤¶ß=ió>Ÿ4zè’Iƒ¥�¤Z©–Ti*%…ß(;Ú‡$µ´4E•+I³§NMût-iXGGÒ@_Rú”§ZM ¿¨~x­ ’J•¶¬è§ÁJ9ª(7%í°ë¾Iý½I s࿜ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€D:/µìRI+¬¼RÒ°!íI‹Ž_,iܘQIÃ;‡&½ðüKI¿þíãI÷?ø£¤ïýä—Iüð§I·~ùëI_½ç¾¤K¯¼&éÜó.H:áŒÓ’®¹é¦¤Þy½IÓ¦½�45óÚ /$Õ‹�¤Ysç%uÔ’^}erÒì¹s’žö餞ž¾¤zQKêíˆêîNêš=3iHsSR_OoR­VO¬•’Æ.2*iHç"I“ßœ–T*I]sæ&5··&ÍÍ®n‰q‹&ÕÁ¨Ì¼L¥©œ4%3¯»'i‘‘£’ú’šZZ’ªƒýIéiö¼¤©¯OIèHjnjJ:ì�ã’ŠZ)©;sÔ‘û%ðÐ-I£OØ;i£m¶MúëÜiIoÌŠZdüŠI­­ÍIåÒ`RÏôYI³ºº’–¿|Òœ®ž¤JffKoÒ3¥7’Þž:9iúÏ%ýì²ë’Î>󔤕—Z,©·¯;é¾E¦$ݹD‘ôÌ+JZiÅ$½ñÄSIÇw·$]|Ò�I=ÝIá´á·�zµ?©­µ5iù1c“û“z²ï»µLú\¼V�Ê Ö“J¥zÒ‹¿y,©{öܤ‘µþ¤æ¡C“~úÇÇ“ªõJRxB.½ç–¤]Ï;)é²{¾’ôÐ#?KÚxï]“šJå¤ZU”›¢*å¤ì'©¢”)ŠZT)꘣HÚoï-’îËyá ©—£ªE=)T.jIá= FZ}ã�“†·5' Õ™”=«hþôÇ?žT*W’–Úl£¤ÇïúZÒÐŽrÒèÅF&}`‹M“ÂÇ[m¡ ¿í†òð�dOÅGžT«V“»HRø¤¸¹¹5éŠß\ž4ñ‡‡%=ÓõǤæR9)”~èëÕ¤z½” ¿ n³õI}f³¤ð¼µf~ôê÷’šËmI•R)©¯ZK*Êå¤îÁzRÿ@Ô`­HjÖ‘4|èI3»f&55I;ì¸gÒ²öÚûà¤UV]#©9S¯W“ú«ýIÙã¨øà«&Õ³ï” s࿜ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€„ A€D:ÿîw¿Iºç®¯$ýà‡ßKúêWoKúÊ=w$Ýu÷mI?þñw’þðû‡’^{ùÙ¤'ÿðHÒsÏþ>éÅŸHzùå?%M}û夙³§$õõw'Íž9#iN׬¤—^økRQL6¼#©>0˜TèO*×’Ñ‘4¯»+iÜâ‹' ô÷&µ"©gÞܤ¦r%©µRŠÊ”›*I]Óg' ôö$õ ô'õÍíJš1íí¤r¦(Õ“jƒƒI=™R­š´ØbK$µjR{{kÒ[™æÖ–¤Ö¶¨zQK*ŠzRøQ–­-mIs»f&-½ìÒI]sf&ÕjI‹Ž‘4鸓“*™z¦¯nÒ Ç˜ôÜúc’†Lø\ÒôeÇ%ýf•zÒœ¾ZÒÜ�¨ñË-—Tª”£Ú*IõZÒðq‹%�:.iµæ¥“ZÚ†%U{’Jµ¤9Óg&ÝqÃ…Iõ�þ¤%‹Ö¤³:—Oj³LRÓfk&ݹñÆI‡üækI•ž�¤Qsg'�uòEIçŸwiRSK{RkSsÒ®®ŸT”KIÝ]s’ªIáWòZ¥”ôÅU>’TÔËIám;äøII3Ë-I+,µRRµ^KºáþŸ%õÌž‘ÔW¯& _dtR©>�T/ªIgß~CR©©’TË„·­T�Jßiø)S*’Âk+Õ²²{^ÛÂ}9¯^­%¥÷4,S_¨*å�¤ê@Ò`QJzá�Ÿ& Õ¤±oR­('µ”Û“>¸Ý6I‹/³tÒŽ'LL*µ¤…û)“>’JETø©VDõ$5iJš6å�¤®Ùs“ªýIg?{fÒ˳ÿ’Tª×“ÂW¥3­ÍÍIÙË–Eö0*•ËEÖÂ4}Æ´¤ð¶uvMš=¯;©µmDÒzY7i»íwIúÒÎ{'m·ÝžIím¥¤æJSR[&ûѲôÊ o& Ö‘N$-™jææ[®Iºõö+’zzæ$…óMø…+¼§§�tbRQ f-¼€ÿr`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ahéüÖ›¯&Í�73kVÒ`wR©Þ—40PM*•ËIE­”TìOªU’jIE½œTË4•+IõZ)j°š4PH*ÊEÒÐÎIM­ÍIsçÎI¬õ'•3­CÚ“*ÙGkXçȤ¢TOzí•W’^�üjÒ�!mIá®j=jÖÜ®¤É¯¾–4jôȤZ½Õ?�”}š6µ´V’ú2CÛ‡$ÍÍ„Ÿ ƒ¥ZÒsÏ<‘Tª”“fΜ�4vÌbI�Ã’ÊÙ—òðôÖ‹�¤–¶¦¤‘�C“¦¾ýfRkÛ�¤9™‘#‡'͜ݕT­Ö’^þËKIçžq^Ò)'Ÿ‘T¬&U*¥¤‰‡íuøžIã¶þHÒŠk­žÔÙÞ’”ý$UëîïI¨5%½:uzRûR‹'M\q‘¤3?²BReH%iÙe—L*Ú›“6|khÒqÍë%]ºØç’.YìóI»·}8©©Öš4tÚì¤yßùmÒæÿ"©w`FRO½7©¿\Mz}ÚŒ¤É¯MKš4鬤�?/i›Ã'$}j×Ý’3=ÝIõLøtìkx$©T¯&•kQ_þÞCI�>ýtR¹>˜4îó[$ýù¦+’î™ZOzîë?JúáC�%õµv$ ´µ' ¶u$ 4µ& ¶ IªéHªõ¤¡CG&E-©VŒ*ÕjÑk?õr))}›�Þj¹H o[XxÛ››’Ê-QsËC’æTÊI]õ"i̶[%ýö�O&]wÃIϼø—¤7ZÆ$Æ%-µé&IOý汤ð¿f]J …ï4þ&}EèîMZýð5’¶ºyû¤úg:“þ°èËIår‘T­—²êI•LøN³oµJ©”ÔÒÔ”´Ù_L:h‘I+®¸FÒ¨QÓZš*IÙ3ìê`m i‰¥—I9flRµVIjioIÊ^ÿ.¦¾5-©(—’º2}µÁ¤þl‚ì‹*šš“úº{’æÎ›�´òÊk%µ´´%µ67'Õ+夅;ÇN}ó¹¤jöªß€ø/gh`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€ah`€‘Àƒƒµ¤ZµœT,eÕ“ÂwZÊ”3ÕZ-©^4%¥JRxÛê™þ¾ZÔà@R½VKªÕФ�Þ�¤¹=ƒI•Ìœ9s“šš[’¦M��T«W“û{’jµÁ¤Þ¹s“Šz)i…¬”4nÌØ¤Ù³ç$M›1=©k^oÒãø]Ò�a�I3ºf% ôõ'•*夙³f$-:n‰¤ê`-iƬ™IE­žTijNzþ¹’6úÌ&IS§ÏJ*7·%õe²¯©ýݽ}IC‡ M,'U«õ¤Éo¼™4zôؤa#†'õõõ'µ4·'µeæÌ�›T.Õ’fÏëIªå¤ãŽ;=éø“ÎMªU’z3‡¸gÒ9g�ôÖŒ9I•rKRwO5iôÈΤGo“täø±IÓ«MI³ŠÖ¤×^#i¿±#’Z2å–Ö¤¦–rҜ޹Ióúz’ÚÚ[’ÞšòJÒˆaC’ª=I>&©«ëí¤žì§ÆÒ¨E“n¹ä¸¤¾þþ¨¾ž¤ž�þ¤Z_5©¥¹”´îf›%-¾âÊI}}I?¾þ+IõæÖ¤ZÑ”tïu·'=öÄ‹I]unÒO_›�ÔÒRIZÿ ƒ£ÊÓ“VÜe‡¤õÖ[=©©¨%�nïL*•kIÓgö'å"©^¯%C†&5µ4'U‡t&õW:’š[’zÊÍYMI×Üù“¤Ž‘c’†�›4ØÒšÔßÔœôÄó/% 1&©^)'}ã{¿J:óäÓ“f÷–’~rã�IËtv&}áì“þíÙ÷·%�þë];�Ô§s *"(†1ç4*ŠI’ƒ(¨c˜Ñ1Ot‚Œ¨(H†&C“s%)æ2Jjš'§ïŸð}ïZ}¿—UëyÖçÇ^g÷Nµ«êýÒ?•ôÒmW%]y麤‡óǤé‰É¤¿ÿû/'Õ²û›á½è^¥ˆÊtúQÅ’¥I+V$�¾`פ%K–%� $þ�=“λø›IׯOß²!kcÒ–�O'MOlÊÚ’T­IÝv;éŠK¾Ÿô�ãÿ#顟ޙtéŧ'�³öÔ¤Ë×]�tëMW'ýò�»“n¿ùª¨[¯LºzÝùI×_{AÒO~ôƒ¤›¯¿,éÎÞ�ôÃ[¯OºæªK“®ºêâ¤k.;?éÊ+/Hºõ†«’þíƒIí…é¤ð{:9öLÔÄ–¤ðP39¾9izbœT«ö“f·ü9é#ŸþϤ‘‘jRµè'ðŽ—&µ»�¤Ñæ`Òֽƞ[¼:i²ÕIºæ¤³“.üÆñI§Þ|CÒ–™ù¤FQIê�Ì%ÕÃIá»°ï—>—48PIZ28œT4Ié'©¨'­Y3štúÚó“6oÞ’´d`$ib¡�´|`$©Wí$]Ã�IÕbYÒ/õtÒð²í’>ó¯'$m˜Ü’4Ó«%Õêõ¤·¾îuIá‡wÙÐ’¤cÝ;é¿¿öŸI»m³"é¸ü\Òdk6iéࢤ<ð¸¤Ú¾û&}üˆw&½ê/Lú—/ŸtÚÚ³’ÚÝ~R¨Òë&�yåƒIŸÿçï%…·A:öËIEµšTë÷’æzͤðæüŠ•k’–¯\™´tùª¨¥+¢V®JZµÍöIŸùü¿'í¹ÏÁI|LÒÑøtÒÞø®¤ý÷}Ò‡~$êˆ'zÈQIxtÒ¾û–ôÖ¿Ü'é ƒ>˜´ÏþG'í{ÀIï;ôؤý::é½Fí½ßI‡þÁ¤7ü廓8⸤—¼êMIï=蘤#�ùXÒß|ò“Ž8æ#IÿÛ/%}è¯>—ôÑOü]Òû�ý\Ò'þ柒¶æ À³œ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”D:÷ûER»3—ÔïV’*ÕfR;Ó¯ö“:í^R¯ßIêôÚI•j?)ÔËT3•¢–4ÐJÚcϽ’öÚ}Ÿ¤8šT-ºI­¹¤ìr!-}ÐLø×*½~T¥—ôWÇ~0i—ퟓ4¹0—T):Ig]ú£¤FQKúù¯ŸNêtÇ“®½f]Òþû¼"éSŸ8*)¼€ºìÜË“NøfTx| ?½[·­û=M?½Ù£†ú•«Ö&½`›ÕIÝ~‘´lxQÒ©g|-i|a>éÉ_ý>ifj6©5<œô�£wO:óäÿJªdWP—œýoIÙ™{¥Ò¯&�6ºIŸüÛo&=ôà/“һǙ^Vµ_$½þõïNÚ¸y"idÑâ¤ZÑL ¯ëwyþnIËW¯Hª & Ž '-tªIs™Ýž\š´jÅŠ¤¹™©¤ùÙ¹¤Á�á¤G}$©Ój'-ÌÍ$µÚý¤éÙ™¤5k¶MjÏ/$íò¼]’šÍjR»³�45?•´xÑhR¿ÓOY’´hÑâ¤ðwaÑðHÒÖ€x–3”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’HàÁ�ZR·ÓOêWÚIE«Uí'uÛ I½~'ªÕmGÍgê™JµØŠE-éíoÝ3ith8iÉÒ¨�f5i�Ýßœ´ÝêÕIÛo¿]Ro¡›Ô¬Iýn/©9TMj-Ì&Õµ¤J§“4=5™ôÄc�'u2Íz‘Ôïv“f¦g“ÆÆ¶$ÍÏÍ%µjÒÔäXR;348�T­T’Šj=ijj&©Ûé%­ÊÌµæ’Æ6�'MÍ-$µf§“zóóISãsI+3Ë—.JêvÛI[¶lJêg§�æ@R?³%~,õZÒÜôLR»×Mêu[Iá�ýè’ÅI ­é¤ìð6ß/zI›zƒIã›7% $½¼ÙLú»-Kúç—m“4PHjϵ“fzIÕæ@Re°™4]©$Í.ªG5£ÎÛuû¤›v]™ô̲¨vÞ)ibb,éyç|!麻îNêöФðh¹>óøÏ$-[º(éù/xnÒY—ÜštÂÙW%=±e"i¢5—^b7êIß;㯽?)¼¬ŸBjÔ“¶î�Ž¢µ•4ß­É~ÆÓÿ[?)ü�÷‹JÒ’æPÒûö{eRx}:¶qSÒ÷O¾6éSŸýxÒ¹'ž“ô½ã¿�ôÝo¯M:“>û…C“Ææ“Jp4üô¦õ‹¤J¯Ÿ41?›Ô©5’&Z Iá)AøòžußÃIÞóǤs¯º/©^ë'�Ï·’ÖoœNê†ú�¤~¥›ô•“.OzÅëÿ"©Ûk'Ý÷ã“ %U3áïéæÍ“*ýù¤Í·$Õ•¤öB+i`¨™ÔïV’æ2ýN?ivv:©9¸(it隤ùölRÑL‰šoµ“Ö¬Ú6)»ÇÜ/²Ë¶vk6©¨ô’ÂëÓVf®µ�4;ÛJêvФ…™VÒôÌBR½V$uç[IÙͼö’%CIS™­9ð,g( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%‘À�Ì@¦Óí'-tæ’Zóí¤^¯’Ôíô“*í"©Þl$ýJR¯ÓMªÕ¤n»•T):I7Þ|YÒYgŸžtú'']xɹIgœ}jÒigž’tâIßI:팒N8é[Iß=õĤ¾ÿݤožp|Ò÷¾BÒ7¾õµ¤N9!iíEk“¾qÂ×¢¾õ�¬è)üÛWÿ-é»'Ÿ�ô­ï}3)ü¿}ã;_O:í¬““G’†“�%ÍLM'uÚ­¤öB'i°1˜´xùò¨E#I�?þTÒ@£ž4<:˜ôÛ?ü.ivn&iÃÓë“:óóIE¦ÝZH ?!•ìw·V­$Í,,$-_¾4©µÐIª5ªI ™ñ­jxp i`x(id ž´fÇÕIÍj‘´×�J:ïôS’¾ó•Kú‡×hÒ.kÖ$}éKŸLú¿üCÒWÿã‹IE­š´x`()<"•à6høÍ ¿Îáë^ò„OáõoØ=)ü]H_¸^7é�»ïLZhÏ&wð›’zÝjRøÖ¯^>’ÞÙþÊÉ×$�sù�IK'ÕêÕ¤McÓI•¢—ô?wÜ“tÿ=$ÕkͤeËG“¦&ç’V¯Yž”Cµ¤Nv÷jzf2ihh$ilr&i$³°0—ô£Á_'ÕfT¥•é÷»IÝþBR½YKj$ÕQƒÃQáŸl$U3õ¢’48ØŒHš�YHÊî¼<µySR{~.©Ûë%õ«�¤­9ð,g( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%‘À�P·•T­õ’šƒIµF5ªÈªV’*µ¨N«�TÔ*IýLø^U*Õ¨^7)”~Žºí¤~·—Tô£úýnR+³u_�¢_Ij/Ì'õ2ÿo#ÿ窕")} �nÒÖ}³jýjÒÖ=F‡ß…N§—C¾ùݯ&-,Ì%MŽ�%­\½")|ÝZ�…¤J¥—Ôn·’&2#™é©©¤g2ÏÛaû¤©‰É¤m¶Y�4<8”~,Óïi£ž4��a4›�¤¥‹G“æfg’–ŒŽ&mXÿLÒà@=ibl–ô©¿>2é›ï|QÒ¿¼æyIã3I­N%iÙonIy誤çì¼CÒ’¥£IGM¬IzÙ¢’–o¿]ÒÊmW%-_2œtùM÷$u:³YÑ F‘YhU’Z­NRxêÞ­$ýí÷Jú̱û']|Ö—’¾qÚÕIéÅ]ÑKêf/\‘Õé÷’θ掤 n¸7éÂë’tÑ ÷F]÷“¤Je0*»vÞº× ýÑ÷&µ:Icó3Iáõi¥×O �!á ’^íöjIó³Q­¹¤Áz‘4¾0›¾ “­Ù¤«n}()|ëÃúEÔU·þ4éÒîOºìÆ’.½þ¾¤V»H /y²›t•Ï|៓²#t'üž^u˃I“­nÒÇ{wRx»©_ô’¾zòeIÇŸzeÒ)çݘ´Ãö+“Â{Ö™v§›tÅ�÷$…·MÒ7+ó£»~’ô•/ÿsÒÈp3©(zI›7<�43±%i~¡�ôä’æ¦“ФÍc[’&Æ6' fzE'©Û«$-d&¦§’ºÝ")¼žn‡7Öf§ÚI�¢’”}*çg2‹F†’ƒÃt¦Zí$µÚóIÍZ/ilr*©�Y4<’´5`žå À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $Òxvri¾ÕLêö{I�>1žtÙµ&…Ï´Èô‹NR¯ÒOzðgO&-Iª•¤K®¿?êÆ’ØýåIën~ êÆû“.½!ª� �½ý~7©RD]u˽I—ÜtÒEY›g¦“ÖÝtÒ%7Ü—Ô®T’n»âô¤ï|ùø¤Ë¿sbÒßþ~R­ßK ?H+W-KªfÞ·×ë’Ž>à-I‹39b÷¤ðG<üf}æ³ÿ�´îÚ»’.»áÁ¤�^ú–¤+¯º4é׿ùEÒOî¹+醮HúÕ/œtÅ•$]|Ñ™I7߸.鯛¢{üñ¤M¶$ýùÿ”ôä�%U: IíÖlRx½ÐÍ,dZ™±©Ù¤©™…¤ÁF3i|j!i:³0ßNÚðÌ3I¿ûýï“�Ž& fÂëú©É¹¤­9ð,g( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%‘ÀŸþÜ—’Þ»ï‘I‡ñWIûïwhÒG>ò·IGö‘¤•kž—´tÅ6Q+W'-^¾2iÑâIK—¯IY²,itÅʤð¯-Y±f+¶|õ6I«VoµíŽI«· Û>iåš�’¶Ù~ç¤mwÚ-iÇç¿$é¹;¿(iç]_šô²W¿5食ølÒ§¿ð¯Iû«Ï&m·ã.I+¶Ù!iùÊm“–-]�jVm³cÒG?þ÷I_øâ'í¶óÎI£‹“^ºË󓞻öIûîõž¤×½úUI{f^ÿŠ—%ýÅn/Lzãë^�´ÓÎÛ&=wûm’^ÿš—' ÔkI«–.JÚ~»UI»íºSÒ6+—%-_6”ô²—¾ é€}÷K:ô}'wô¢Þ\Ô?”ô¡cŽKúä§ÿ6éÓŸþLÒg?ùù¤ÑCÿ1©ù¾/$ÕŒ:é�ŸMºh¿NÚ}ç×&]wø·£>ñ½¤íw|aÒòUÛ%�,^š´hiØò¤Ñ¥«’†-K:êà&}úã_ˆúXÔy{-邯ÿ]Ò™_ýBR¥VMzzÓæ¤Í“IÛ®Y‘´ÍòEIO­:霳¾�t剧%-<ùDR}z:©?µtx8éýoÜ5éo~~ÒÛ·L:æm/HjÔŠ¤næÂµç&5jõ¨P³þ±z-i VMª×:Ië®ÿIÒ¥7=�tÝ?Nºì擞»Ã²¤~­“tÅ-÷%]~ËO“ú™ðŽÙ+_¾mÒéWÞ™´î†’jÕ")téÍ?MªVЍj%©^-’j™F5ªž ´(úI•^7ªßNzÞê¥IÝÎBRø!ï¶[I×|çĤç.Hªõ‹¤¢×Mê7jIŸúÐ�I½çµI‡¼çõIÕfR§h$u{�¤‹®ûIÒ…×þ(éâ¬×íþ¶¤V¯›töiÿ�ôÈÏïJÚÿÃ’Þúö½’vßcŸ¤ý÷=<éÐÃ?�ôþ÷4éíï< éødÒaG~‘´83=5“Ôh $E-iÃæÉ¤J£HªÖ«I³­vR=ÓHšmµ’Z ݤ™Ìc6$Uïº8i¡ÓNLzà%£IŸ{肤MÅ|ÒüÌlÒ¦ß>•ôß/8<é„㿟Ô\”TÍ>åýZ5*3?;•táåç%âד¾qâ×’>vã—“6ÎN$m™KÚ¼e<©Ñ¬%ýJÒ†�cIOmšLêUI»ïsxRöD£Ë–'õªµ¤f½š´ï›^”ô«_=”^x>g§“² ÊÚáoÚ9éˆ7>?éè},©Úè'…Å�>òdR³Z$5ªµ¤ðG| ÞHjfµjR½ZKª•¤+n¹/éü=i||6©Òë&]y˃[±/üã©IíùÚ¤‰É¹¤ð[ßÈld5«IÍ�zÒ@£–~eŠz-©^­$…ÆÇ¦’*ÕZÒ“�=ž4Û.’j•ZRÑ«$5þYÒÁ:*é}zÒÇ•´ÿ±Ç$½xr}Òõß>1éªoD}õäË’.¿õ¾¤«oþqRx“9¼ÝTíW“*Õ"é”þ)鄯}>iz|,iûL#S«IõJ-)¼5±�éuФð&LµRI ¯Â;f�F-)ôäúMIýJ5©^HêwúIÓ™ìæqn¶•ÔOIíÌÈÈhRvïªÑ©ô“z½JRxójyfñ’%I³3�¤^v'wkÀ<Ë€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I¤ð;=?镯zcR+Óî,$uÚasIÝ^+©ßímÅ��¤……¹¤¢ÚO Õëͤj¥–4ØL:òˆc“ßÿФC=2é}•tÄ!L:ø Ã“>xÌÇ“þöS_L:üÐ%í÷ÞÃ’Ž<ìè¤óá¤=ß½_Ò{v�Úyç]’Æ6oHªešƒIƒÃI‹F–&í±×IGù¡¤íöФ5kV%íþö=’êÅ@ÒüüBRµZKÊHÕJ!ivv:if~.itùhR¯5Ÿ´(Ó^˜MêÕŠ¤N¿“´f›ÕI ­¤n¥—žÕlÚ<•´téâ¤ZµŸÔîV’ªÕ¨~½Húß?<š4¾isRµÒOz:sí­?IÚwŸý’†›EÒØôxÒL{!iÛž—Ôjv“6í³KÒÄ»%mzÏIWÝtMÒa‡—ôî÷œ4:´2ifj"©š Ï{ÃcHø×jý^Rø õÆ`R¿_DUªIõj%©V/¶b�z5©R $E%©›ùñã I¿äɤ�O<•ô½¾›ôè½$º÷~I÷ýøž¤WîqXÒèšç$=pý%I½êyI�¡ZÒ®ÏNÒ#^ŸÔ+*Iõj/)ü.4·nµ¨�Z=©^­%�uÍÿ$}öý{'MLM'ÕnRµ×Nzë;^�tÍîKZ¾¼™´ß»^™413—T«IáuVxB[kÖ’¾üw“ô�“OIúîi%½ïÕÛ&�,M:åk_OjŒ&U‹JÒ†ÌâÇ•tàqG'Uªõ¤ð<$<ãjEÒ¾9*éÀ�}0i4óâ]Ÿ›Ô¬×’kQCC#IÕ¢–tüýMÒ¯~}oÒüôtR¯×I*ê�¤Ë/»,éÚk/Múéƒ÷&Õ“yäIÕv%©_]Hl&õ"©Û[Hl4“Ú™ð’gÑP=iË–ñ¤ð¸^Ü�Œ.Iš›žIªe§\­ÖlR¿è%u2­N;©Qk&MMLgM&U*Õ¤Ng>©Ûé$ÕŠJR»ÓIÚš0Ïr`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J Pé¼ñé Iýj?éñš¤Å#Ë’š�á¨Á�¤J¿–TdjõfR/3˜éתQ™Z­H ÿZc`8iûí·Mª7I+–¯Nj4ªI ™é©¨¢VIzâÉ'“ú•ù¤%£CI#£‹“žYÿLÒvÛ¬LÚf›¥I«—/Kzaf8Ó¬E½êåoˆzí[’v}þNIµ^'iǶ‰ÚvuÒþ$ip¨žg·ªZQIÊÌÍÍ$µçÛI•^?©×i' 4šIc7$­ò‰¤v¦×j%�o‹šØœÔhIK†’&6O&ÍNM'…Ëð2¸¨‘´rÕª¤N»›´ÃÛ'µfOºîš “*·Ÿ›T¿çʤåEÒØÓÿ59›tÚ™'&ýì÷&}ûÔo%õ:�¤Nw>i*ó†7¾&i›wIªVkIá%OxB[©ô’Š^-©šYX˜O:ýøÏ&u»í¨¢š / ÕZR³Z$õ³ª•^Ò[vh$í²ËvIS3³Iÿù•ã“V¼ðÅIç_weÒEç_—tÏu'…_Ào|ùsI½¢‘´ÏËŸ—Ô«v’vÝi»¤GþsÒ¯ûdRx©XËÔ3Ù—¾»ej.©Q+’šõjÒÚëîNÚfåhRø±¬ÕI�Z=)ükË–­HšÛôtÒ1»¿8i¯WóêW¾6é9ÛnŸ´ë _”´bÕʤÕËW%U‹ZRª5“ºE5)~ókQ™v'ªVë'uû�¤jµž4;×JêvûI½¢š4=;“ÔÌ ÔªIC™……vÔÌtR»ÕOjd:™…VÔtæ™L½ÞLÚ´a,©×i'…‡šú@#)|yÃïB¥6˜T«G 4‡’Fš�¤j¿–453›4ßi'MMN'-Ê,ßfuÒÐࢤêÐHR§ZIzrÓ–¤'…~QKúÿàÞÚÿ¹ðPóÐõ·%ÝvÞ%I·œq~ÒÕß?3é†ó.H:þ¨#“Þ|à~Iï<樤÷üõ±I¾ò[Iïm'ú‰¿Nzë{'õ»Õ¨ÌØÆÇ’âƒChk{+½nÔV=p…÷qÿáo�IŠ´šþõ2µ¢ŸÔ«QýNRxˆÎNŽ«+V¬Jªe†›ISS3ICI½v/©Ò®$ Ô’µ"©_T¢*�¤f­ž´Ðn%ÍÍO'uæç“ff[I•ì¦CøžfÓGwvj>)<=¿ í…NR­^$ÍMÏ$½"©ÙLj͵’ÚÝjT«—Ô¯T“†jµ¤J¿µ`žå À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $Ò¸Ûé'µæ’æf’:ݤ‘�fÒ¦ÌÐèpR¥RMêeu:­¤J¯ŸÔËtÛ�¤~¥šT¯õ“jÍFT¦Ré%Õ+EÒìÔtR#³4ÓïV’¦§g“Z ý¤~¿U«'Í-Ì' '…o}³YOÎ,Ê„¯ÛÐ`5©½ÐNêW:I›6�'uZ I3ósI“ãSIµZ‘42ØHjuZIí^T½Z$µgÛIK2ÍÌ–g6&Uº­¤öôtÒÆgÆ“–Œ%-[½&)<™ïö£æg“: Q“ã“êõ¤ðC^iÔ’†õ¤ð” Q-’zÝvÒ@£‘473�´ev>idx4i§ç='i·íšô§'Ö'�MN$5ë�¤Gy4iMfbf>illsÒå—_–þÖ�$måK£L½_$-}åë’F_öª¤¢ZIêõ»I•~‘>hQí%…ïB=;ª†W•^'i¡Û�š›I ´Ÿ ¯×7|Ðð磿UmÝíõ*[±~¿HêÅw’ºý")| Õ~5©Ö¯$ýnR/¼bÏžB«ÕKúõM·&ݺö¢¤Ï8/éšSÎIºöÔs“þþ+ÿœôŽÃHÚãØ#“öýرI{¿ÿ¨¤Ï�wARQ¯%õ{�¤ðƒêmUñ™Hô�©Õ¤#>ûŤðöfü+SËŠªEöïªésè%MlÞ’T+Фz¦šŸJEúE‘ÞS ߬ðçc433ÝJj6†“&3+W.Oje«�æ@#ifv>)ûðÖ²«Š^øýËžAsxxQR8jTõ¤Ù除^·’^?ewMz½NR­ÑLªÖkIë7nJjÍÍ'5›ÃIáo}­h& 4“Â_¬ÅÃÃIE­™437›Ô¯Ô“¶æ À³œ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”D:׊~R¯WIZ4:œT¯I³s IõZ3ivv>©¨U£2•J5©›©×›Iáÿ­ÖïEeº­nR;St{IÕF5i S­ö“v}á‹’vzþ‹“™n¥•Ôîv’Z­ù¤U+—'u擦§'’FšI³SÓI�Z‘4ºxQÒ²L­^�*²ª•¤N¿“Ôë,$-i&…oV«ÓIZ¶diRÑï'uzQ�¤¹Lo!+þ.4šÕ¤e£‹’šE-i ÙLŸMúßGIêv;QýJR½9’~ÞîøÁ“F2E½HÚ°isÒÆÌäØdÒ`³ž´í6Ë“Ûi6©¨ô’}øñ¤~æå/Ù-ifj<©VHZ±ruRQé$­Z¶8©Z­'­Z±*iÅò5IK/‹Z¾&iÅêí“Öl÷ܤe«wHZÿÇ{’æ'7'Õ*Õ¤F½™TÍTŠ"j«êöæ“jõfR¥_Mª'Ý{ý�Iá1¤ÚënÅŠnçÿ~áÿ-¼™P¯D¥/H¯ŸTíW’¿Vô»ÿ÷ ýøÚk“~~ÓmI·�·.馳/JºþÌ ’n>碤‡y2é_ÏüVÒ¦-›“öýÐI|âI7ßõ£¤Zµ‘Té÷“âo};)=Œdòðàjª•^Rø áSo¬¥Çüì)„míƒR;)|AЬP'ë[\šôÎw˜tÌû?uì'’<øI‹/Oªg§øC™OúŸ’<äÃIïÞóÀ¤mV/K ŸéÈÈhÒäøTÒB¦Ré%µÛsIõÚ@Rø ­V')üž¶2í…ù¤p— ƒá Òh&U³™§^ÏÊî W+Q½îBÒÒE£IE¿’4<ÜL /<‡F“f§Æ“ªÕJÒôÜtR¿ÛI ¿ á_Ûš0Ïr`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J Pé\kÖ’3�Z%©ß�êd™…ùé¤ZQOê÷»I•J/©–étZI•j‘´Ûn/Mzü± IOnx:i,Ó¯Õ“ZsóIEÑOß<‘ô燗ôÛŸß›TôºIÝN?©×­& ÖkIáÿmfz*©^­&mÚøLR7395–´0·�T-jQµ"i*{ᆚIÿûðŸ’gúµjÒ–±ÍIýv+éñ'žLjgúÙw¦Q¯%u; IÃ#‹’†‡“æ[­¤¹…¨Í›7&…ïik~&ih°š´båÒ¤ð”`63±ù™¤?>üHÒ wÛ%i.3?3›´íêUIE¥›´dÉhÒÔälÒØÄDR§ÕN Ï‘¶]³,©è÷’ª•~ÒÜÌlR¥ßMZºtqÒÂÂ|R{n&)ü.ì¶Û‹“†††“šõ�¤ì_5‹j?);XÎ…'�½n%ibóŸ“/_‘´déʤFc ){¢ExEÙ¯ô’jÕ�¤~¥•ù׳NLšïu“£ôuKu³"•¢>…n/©Wé'u{•¨N'é�ënIºÿª“î¸ðʤ[Ï_—tÓ¹Q7œuaÒ3&“~ÿ§§“Æææ“îúŽIá)hx—`fa*éæËoI:ôo>šÔ/*I½^Túuîu¢¶êÁ!=†l݃C&ük[÷AóÁø]Èڪϴ’�¯lÝ·¾Ýï%e¿ôéð^»—´e㦤öÂLR¥ÓH:ÿìï']ÕIÛí¸KÒ>û‘tÈÇ%mÚ2ž4X¯'Õ+ý¤‰é©¤ðQ·ÝJ ÷…áÁ¡¤™™¹¤¹¹…¤…ÖlÒÜÌ|R‘iµ:Iá Qéu’榦“º•nÒ’å‹’:í…¤ÉÉñ¤N»�Ôíõ’:ÝÙ¤ÉLs°–T«Iá=®�Ç’Æ'6%Uj½¤n¯�ÔhIÝÎlR£^Mª7*I[sàYÎ P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J"€¯½êâ¤k®¼ éÒuç']sùEI×_uÓ —&ýðö듦Æ×'ÍŒoIš��š‹šÉšØ�ôÀýw'ÝyÇÕI·ÜtyÒ�×^’tÛÍW%ýê—%ýü?Múå/LºöºË’®¼úâ¤Ë.;/éâóOK:oí Ig¯=1錳¾›tÚ™Q§ŸqbÒ¹œ‘tñÅg'Ývë�I·ßvsÒ=?þQÒ÷ÝŸô‹Ÿÿ2é®ÿOÒc�ÿoÒ•W^žtÁyç$]qÙ¥Iç]pnÒu×]–tî9g&�uæ÷“N=õ„¤k®½<éÌ3NMºâŠ “®½òФð]¸üŠuI—]yqÒ™§Ÿ–tëí·'Ýs×=I?¹'ê§ÜŸôàý÷%=µþñ¤[n¾1éÚË/Kºîæ“®ºþª¤{~roÒmwþ é¦[oIºù†›’n¼õÖ¤«®º2êÚk’.»êê¤+.¿2ióÆ�I÷ß_ÒŸþô»¤gžz2éÏëŸNºìŠs“.<ÿ䤇¼+é÷¿ûiÒ3O<š´yýSI³ãcI›Ÿy2jÃcIã×'Mlz:iró3I­Ö|R¯ÓNê·:I½vÔÄ–õIS›7'ÍMŽ%µæ’Ú™»¯¸%©_T’BEQKj÷+I?ºòš¤\teÒ-\–tÓ9—lÅnü‘¿IzãöLúè'>Ÿtì‡?—tÌÿ:ê˜O%vØG“^þš·$}ø£ŸJúè'>“ô�ã>šôú·¼=镯}MÒëßðæ¤zs8éu¯}cÒ»÷Ú'é COzÝëÞ�´Çž{%½ïàÓ;ú¸¤#ßÿᤷ¾cߤc>ôɤ=÷9(é�ÃO:à�£’ö>àÀ¨ýöK:æýÇ&rðQIï?æØ¤Ý3¯}Û“Þô¶·&m·ãÎIoyç»’ÞñÎw'í½ßaI/{õ“Þñöw'½í­Q/{ùë“�®Hzõ«_›ô¶·¿+é­ozsÒÞ{î‘ôÚ×½)iÏ=öHzÏžQCCI‘YµÍs“GW$]}íõIÍæ`Òâ¥Û%�,Y‘´lÕ¶I‹—¯NZ²bEÒðÒeI+Vm“´j»ç$µjÒÒ5ÏMZ²fÛ¤m·{NRQ¯%Õ3µÌ’åk¢V­JZ´|yÒÀàpÒïÖ?•49=�tõY%]·ö’¤kÏ^—tÓÚ¨M›§’Ʀç’&gZISínÒl¿Ÿ4Ñn']øÈ“nm�&ý`aQÒí³ƒIÿ33’ô®½ß›ô¶w½=éíÿCÒÁÿNÒO›ÏIúqm»¤.Œ$Ý6õ™ÓOHºa¢µ¹’ôųOJÚ87“ôÌ–±¤§6D=üÈŸ’n¿èê¤Ï¿<éÚó/Mºþܨ›Ï]uÞåI·œIÒ.¾&éÖ /Mº}ÝI?¼äê¤Û/¾2éÎu×$Ý}éuI÷^wkR+Óët“Z­Ù¤·îPÒ¡G›tÈN:àÀ�$-Yº2iñ’Iá_]’tø‘O:àÐ&½g¯C’Ž>ò¯’=âƒIø�¤ÃŽøhÒ{˜´Ï{�NZ¼h4i~¡’ôÔ†MIc³óI£ËV'íòâ—%½ò•oLzÑË_õÒW'í¸ã “ž³ó.I+×ì�´htiÒðÈhRc`$iÑÈÒ¤¡áá¤F}$iÙÊm“š�ᤑE+“:ìCI{î}DÒû?ð©¤=ÞsDÒÁG~,iÿ�KÚ7kkÀ<Ë€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a( 0@I¤ðÍ7_’tÛm—%]ýyI·ÜvEÒÝwÝ�tÓ %ýù‘_$…íŽÛ/Kºæšs“½ýöË“~þ³&]sÍÚ¤_üꞤöüDTkã{Iß?åëI?ýé’Î;÷ä¤³ÏønÒé§};éw\Ÿtíuë’Î=ç䤵g~/*û.ÜqûIgžþ­¤óÏ;%é´ÓOH:++|AÎ=û¤¤“NþFÒYg~/)< †í‚󾟴öÌ“n¾ñ⤠Ï9)éüsNN:óôo&Ýxý…Iç�óݤ Ï?)é²ËNKúñ�nHºòŠs’Ö®ýNÒyœštâIÇ']rÑ)Igœù½¤³Î>)éW¿½?iíÙ'%]°öĤK/9-i°6—4::’Ô¨·’땤j¯•T¯t’jE/)|Ð~w>©×šMZºtqRўʚI ÏÉW-_–´|eÔʕ˓ŠÞ\R¿UéÌ'õ;3I—ÝquÒ×®>'éëWŸŸô•«ÏË:'é«×œ›ôõëÎO:þú ’¾uCÔ·¯9?é[WŸ›tÒõ%ýù×w'=pã‰I?½õ”¤ŸÝvzÖ©I'þÛ‡¢þýƒI÷ß|BÒÝ×|=éÁ›NHúù­'&ýêεI¿»+ê9;¬JúÍ]k“~~÷9IK—�$}ÿ†K’¾}ãEIß¼îü¤o\}nÒW¯Z›ôµ«Î‹ºâܤ¯\qNÒ\¹6êò³“þý²µIÿrñiIÿ¾îœ¤¹è¬¤ºð´¤/]|FÒ?^pjÒß�rÒgÏèM7®K ï#ÝtÃ%Iá›®<7ÞxAÒ·_•ôƒÛ.Mºáº ’Â×í·\’tíÕç&ÝyÇIW\vfÒ�w^™týÕk“¹ð‡·]š´5`žå À%a( 0@I€J P`€’0”„ $ À%a( 0@I€J P`€’0”„ $ À%a(‰ÿuÅ\¿_³êIEND®B`‚disgreet-0.1.1/src/000077500000000000000000000000001521157164000141105ustar00rootroot00000000000000disgreet-0.1.1/src/core.rs000066400000000000000000000061321521157164000154100ustar00rootroot00000000000000//! core.rs use std::{ env, io::{Read, Write}, os::unix::net::UnixStream, }; use log::debug; use serde_json::{Value, json}; use thiserror::Error; use crate::Session; pub(crate) fn authenticate( username: &str, password: &str, session: &Session, ) -> anyhow::Result<()> { debug!("start authentication: username: {username}, password: {password}"); let sock_path = env::var("GREETD_SOCK").map_err(|_| AuthError::EnvGreetdSock)?; let mut client = UnixStream::connect(sock_path)?; let res = login(&mut client, username, password, session); if res.is_err() { _ = send_msg( &mut client, &json!({ "type": "cancel_session" }), ); } res } fn login( client: &mut UnixStream, username: &str, password: &str, session: &Session, ) -> anyhow::Result<()> { let msg = json!({ "type": "create_session", "username": username }); send_msg(client, &msg)?; debug!("sent create_session: {:?}", msg); let resp = recv_msg(client)?; debug!("response: {:?}", resp); let msg_type = resp["type"].as_str().unwrap_or(""); if msg_type != "auth_message" { let e = resp["description"].as_str().unwrap_or("Unknow Error"); return Err(AuthError::Username(e.to_string()).into()); } let msg = json!({ "type": "post_auth_message_response", "response": password }); debug!("send post_auth_message_response: {:?}", msg); send_msg(client, &msg)?; let resp = recv_msg(client)?; debug!("response: {:?}", resp); let msg_type = resp["type"].as_str().unwrap_or(""); if msg_type != "success" { let e = resp["description"].as_str().unwrap_or("Unknow Error"); return Err(AuthError::Password(e.to_string()).into()); } debug!("auth success"); debug!("launch session: {:?}", session); // greetd å��è®®è¦�求 cmd 是字符串数组,例如 ["/usr/bin/bash", "--login"] let cmd: Vec<&str> = session.exec.split_whitespace().collect(); let msg = json!({ "type": "start_session", "cmd": cmd }); debug!("send start_session: {:?}", msg); send_msg(client, &msg)?; Ok(()) } #[derive(Debug, Error)] pub(crate) enum AuthError { #[error("cannot found environment GREETD_SOCK")] EnvGreetdSock, #[error("wrong username: {0}")] Username(String), #[error("wrong password: {0}")] Password(String), // #[error("Launch session: {0}")] // LaunchSession(String), } fn send_msg(stream: &mut UnixStream, msg: &Value) -> anyhow::Result<()> { let json_bytes = serde_json::to_vec(msg)?; let len = json_bytes.len() as u32; stream.write_all(&len.to_ne_bytes())?; stream.write_all(&json_bytes)?; Ok(()) } fn recv_msg(stream: &mut UnixStream) -> anyhow::Result { let mut len_buf = [0u8; 4]; stream.read_exact(&mut len_buf)?; let len = u32::from_ne_bytes(len_buf) as usize; let mut json_buf = vec![0u8; len]; stream.read_exact(&mut json_buf)?; let val: Value = serde_json::from_slice(&json_buf)?; Ok(val) } disgreet-0.1.1/src/lib.rs000066400000000000000000000127111521157164000152260ustar00rootroot00000000000000//! disgreet lib use std::{ fs::{self, OpenOptions}, io, path::Path, }; use crate::ui::UI; use crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, execute, terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, }; use ini::Ini; use log::{debug, warn}; use ratatui::{ Terminal, backend::{Backend, CrosstermBackend}, }; use simplelog::{CombinedLogger, WriteLogger}; use thiserror::Error; mod core; mod ui; // i18n pub(crate) const CACHE_BG_DIR: &str = "/var/cache/disgreet/"; pub(crate) const DEFAULT_LOG_PATH: &str = "/var/log/disgreet/disgreet.log"; const DESKTOP_FILE_PATH: &str = "/usr/share/wayland-sessions/"; pub(crate) const PREVIOUS_USERNAME_FILE: &str = "/var/cache/disgreet/previous_username"; pub struct Disgreet { background: String, sessions: Vec, prev_username: String, } impl Disgreet { pub fn new(background: &str) -> Self { Self { background: background.into(), sessions: vec![], prev_username: String::new(), } } fn setup(&mut self) { if let Ok(log_file) = OpenOptions::new() .create(true) .append(true) .open(DEFAULT_LOG_PATH) { let level = if cfg!(debug_assertions) { simplelog::LevelFilter::Debug } else { simplelog::LevelFilter::Info }; _ = CombinedLogger::init(vec![WriteLogger::new( level, simplelog::Config::default(), log_file, )]); } debug!("new disgreet: \n{{ background: {} }}", self.background,); debug!("setup disgreet"); if !Path::new(DESKTOP_FILE_PATH).exists() { warn!("path {} not exists", DESKTOP_FILE_PATH); } debug!("path {} exists", DESKTOP_FILE_PATH); self.prev_username = fs::read_to_string(PREVIOUS_USERNAME_FILE).unwrap_or_default(); self.sessions = find_desktop_files(Path::new(DESKTOP_FILE_PATH)); append_bash_session(&mut self.sessions); } pub fn run(mut self) -> anyhow::Result<()> { self.setup(); enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; let res = run_app( &mut terminal, &self.background, &self.sessions, &self.prev_username, ); disable_raw_mode()?; execute!( terminal.backend_mut(), LeaveAlternateScreen, DisableMouseCapture )?; terminal.show_cursor()?; if let Err(err) = res { println!("{:?}", err); } Ok(()) } } fn run_app( terminal: &mut Terminal, background: &str, sessions: &[Session], username: &str, ) -> anyhow::Result<()> { let size = terminal.size().unwrap_or_default(); let mut ui = UI::new(background, sessions, username, size); loop { terminal.draw(|f| ui.draw(f)).expect("UI draw failed"); if let Event::Key(key) = event::read()? { match key.code { KeyCode::Esc => { if cfg!(debug_assertions) { return Ok(()); } } KeyCode::Tab => ui.next_focus(), KeyCode::Enter => { if ui.handle_enter() { return Ok(()); } } _ => ui.handle_input(key.code), } } } } fn append_bash_session(sessions: &mut Vec) { if !sessions.iter().any(|s| s.name.to_lowercase() == "bash") { sessions.push(Session { name: "bash".to_string(), exec: "/usr/bin/bash".to_string(), }); } } fn find_desktop_files(path: &Path) -> Vec { let mut sessions = vec![]; if let (true, Ok(entries)) = (path.is_dir(), fs::read_dir(path)) { for entry in entries.flatten() { let file_path = entry.path(); if file_path.is_file() { if let Some(ext) = file_path.extension() { if ext == "desktop" { if let Ok(session) = parser_desktop_file(&file_path) { sessions.push(session); } } } } } } sessions } fn parser_desktop_file(path: &Path) -> anyhow::Result { let conf = Ini::load_from_file(path)?; let section = conf .section(Some("Desktop Entry".to_string())) .ok_or(DesktopFile::NotExist)?; Ok(Session { name: section.get("Name").unwrap_or_default().to_string(), // comment: section.get("Comment").unwrap_or_default().to_string(), exec: section.get("Exec").unwrap_or_default().to_string(), // session_type: section.get("Type").unwrap_or_default().to_string(), // desktop_names: section.get("DesktopNames").unwrap_or_default().to_string(), }) } #[derive(Debug, Clone)] struct Session { name: String, // comment: String, exec: String, // session_type: String, // desktop_names: String, } #[derive(Debug, Error)] enum DesktopFile { #[error("Desktop Entry section not exists")] NotExist, } disgreet-0.1.1/src/main.rs000066400000000000000000000005411521157164000154020ustar00rootroot00000000000000use clap::Parser; use disgreet::Disgreet; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { /// path of the config file #[arg(short, long, default_value = "")] background: String, } fn main() -> anyhow::Result<()> { let args = Args::parse(); Disgreet::new(&args.background).run()?; Ok(()) } disgreet-0.1.1/src/ui.rs000066400000000000000000000274601521157164000151040ustar00rootroot00000000000000//! UI use std::{fs, path::PathBuf, str::FromStr}; use crossterm::event::KeyCode; use image::{DynamicImage, GenericImageView, RgbImage}; use log::{debug, error}; use ratatui::{ buffer::Buffer, layout::{Alignment, Constraint, Direction, Layout, Position, Rect, Size}, style::{Color, Modifier, Style}, text::Span, widgets::{Block, Borders, Padding, Paragraph}, }; use crate::{CACHE_BG_DIR, PREVIOUS_USERNAME_FILE, Session, core::authenticate}; #[derive(Clone, Copy, PartialEq, Eq)] enum Focus { Session, Username, Password, } pub(crate) struct UI<'a> { render_img: Option, focus: Focus, username: String, password: String, cursor_pos: usize, message: String, sessions: &'a [Session], session_idx: usize, handling: bool, } impl<'a> UI<'a> { pub(crate) fn new( background: &str, sessions: &'a [Session], prev_username: &str, size: Size, ) -> Self { let focus = if prev_username.is_empty() { Focus::Username } else { Focus::Password }; let cursor_pos = if prev_username.is_empty() { 0 } else { prev_username.chars().count() }; let mut render_img: Option = None; match PathBuf::from_str(background) { Ok(path) => { if path.exists() && path.is_file() { let file_name = path .file_name() .unwrap_or_default() .to_string_lossy() .to_string(); if render_img.is_none() { let cache_file = format!( "{}/{}_{}x{}.bin", CACHE_BG_DIR, file_name, size.width, size.height ); debug!("check cache file: {cache_file}"); let cache_path = PathBuf::from_str(&cache_file).unwrap(); if cache_path.exists() { if let Ok(raw_bytes) = fs::read(&cache_path) { if let Some(rgb_buf) = RgbImage::from_raw( size.width as u32, size.height as u32, raw_bytes, ) { debug!("cache file exists"); render_img = Some(DynamicImage::ImageRgb8(rgb_buf)); } } } if render_img.is_none() { debug!("has no cache"); let base_img = image::ImageReader::open(path) .unwrap() .with_guessed_format() .unwrap() .decode() .unwrap(); let resized_img = base_img.resize_exact( size.width as u32, size.height as u32, image::imageops::FilterType::Nearest, ); let rgb8 = resized_img.to_rgb8(); _ = fs::write(&cache_file, rgb8.as_raw()); debug!("cache new file"); render_img = Some(resized_img); } } } } Err(_) => { debug!("base_img is none, not draw background"); } } Self { render_img, focus, username: prev_username.to_string(), password: String::new(), cursor_pos, message: String::new(), sessions, session_idx: 0, handling: false, } } fn current_session(&mut self) -> Option<&Session> { let mut sessions = self.sessions.iter(); if let Some(session) = sessions.nth(self.session_idx) { Some(session) } else { self.session_idx = 0; sessions.nth(0) } } fn go_next_session(&mut self) -> Option<&Session> { let sessions = self.sessions.iter(); let count = sessions.count(); self.session_idx = (self.session_idx + 1) % count; self.current_session() } fn go_prev_session(&mut self) -> Option<&Session> { if self.session_idx > 0 { self.session_idx -= 1; } else { self.session_idx = self.sessions.len() - 1; } self.current_session() } pub(crate) fn draw(&mut self, f: &mut ratatui::Frame) { let area = f.area(); self.draw_background(area, f.buffer_mut()); let area = centered_rect(40, 10, area); self.draw_login_box(area, f); } fn draw_login_box(&mut self, area: Rect, f: &mut ratatui::Frame) { let message = if self.handling { "auth..." } else { &self.message.clone() }; let block = Block::default() .title(message) .title_alignment(Alignment::Center) .borders(Borders::ALL) .border_style(Style::default().fg(Color::White)) .style(Style::default().bg(Color::Black)) .padding(Padding::new(2, 2, 1, 0)); // 用布局切出内部区域 let inner = block.inner(area); let rows = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Length(1), // 标题 Constraint::Length(1), // 空行 Constraint::Length(1), // username Constraint::Length(1), Constraint::Length(1), // password ]) .split(inner); let session_name = self .current_session() .map_or("".to_string(), |s| s.name.clone()); // 标题 let title_span = Span::styled( format!("< {session_name} >"), Style::default() .fg(Color::White) .add_modifier(if self.focus == Focus::Session { Modifier::UNDERLINED } else { Modifier::empty() }), ); let title = Paragraph::new(title_span).alignment(Alignment::Center); f.render_widget(title, rows[0]); // Username 行 let user_style = if self.focus == Focus::Username { Style::default().fg(Color::Cyan) // 获焦时高亮 } else { Style::default().fg(Color::Gray) }; let user_text = format!("{}: {}", "Username", self.username); f.render_widget(Paragraph::new(user_text.clone()).style(user_style), rows[2]); // cursor posinion if self.focus == Focus::Username { let x = rows[2].x + user_text.len() as u16; let y = rows[2].y; f.set_cursor_position(Position::new(x, y)); } // Password 行(类似,密ç �用 * 显示) let pass_style = if self.focus == Focus::Password { Style::default().fg(Color::Cyan) } else { Style::default().fg(Color::Gray) }; let pass_text = format!("{}: ", "Password",); if self.focus == Focus::Password { let x = rows[4].x + pass_text.len() as u16; let y = rows[4].y; f.set_cursor_position(Position::new(x, y)); } f.render_widget(Paragraph::new(pass_text).style(pass_style), rows[4]); // 最å�Žç”»è¾¹æ¡† f.render_widget(block, area); } fn draw_background(&mut self, area: Rect, buf: &mut Buffer) { if self.render_img.is_none() { return; } let render_img = self.render_img.as_ref().unwrap(); debug!("draw background start"); debug!("area height: {}", area.height); debug!("area width: {}", area.width); for y in 0..area.height { for x in 0..area.width { let pixel = render_img.get_pixel(x as u32, y as u32); let mut r = pixel[0]; let mut g = pixel[1]; let mut b = pixel[2]; if r > 230 && g > 230 && b > 230 { r = 255; g = 255; b = 255; } let bg_color = if r == 255 && g == 255 && b == 255 { Color::Indexed(15) } else { Color::Rgb(r, g, b) }; if let Some(cell) = buf.cell_mut((area.x + x, area.y + y)) { cell.set_char(' ').set_bg(bg_color); } } } debug!("draw background end"); } } impl UI<'_> { pub(crate) fn next_focus(&mut self) { self.focus = match self.focus { Focus::Session => Focus::Username, Focus::Username => Focus::Password, Focus::Password => Focus::Session, }; self.update_cursor_pos(); } pub(crate) fn update_cursor_pos(&mut self) { self.cursor_pos = match self.focus { Focus::Session => 0, Focus::Username => self.username.chars().count(), Focus::Password => self.password.len(), }; } pub(crate) fn handle_input(&mut self, key: KeyCode) { if self.handling { return; } match self.focus { Focus::Session => match key { KeyCode::Left => { self.go_prev_session(); } KeyCode::Right => { self.go_next_session(); } _ => {} }, Focus::Username => match key { KeyCode::Backspace => _ = self.username.pop(), KeyCode::Char(c) => self.username.push(c), _ => {} }, Focus::Password => match key { KeyCode::Backspace => _ = self.password.pop(), KeyCode::Char(c) => self.password.push(c), _ => {} }, } } /// Returns `true` if authentication succeeded and the session should be launched. pub(crate) fn handle_enter(&mut self) -> bool { if self.handling { return false; } self.handling = true; let username: &str = &(self.username.clone()); let password: &str = &(self.password.clone()); let session = self.current_session().unwrap(); let res = match authenticate(username, password, session) { Ok(()) => { debug!("auth success, exiting event loop to launch session"); _ = fs::write(PREVIOUS_USERNAME_FILE, username); true } Err(e) => { self.message = e.to_string(); error!("authenticate failed: {:?}", e); false } }; self.handling = false; res } } fn centered_rect(width: u16, height: u16, r: Rect) -> Rect { // 处ç�†å±�幕比组件还å°�的情况 if r.width < width || r.height < height { return r; } let popup_layout = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Length((r.height - height) / 2), Constraint::Length(height), Constraint::Min(0), ]) .split(r); Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Length((r.width - width) / 2), Constraint::Length(width), Constraint::Min(0), ]) .split(popup_layout[1])[1] }