From ecfadce4acc441060c30d5dacafeceec08574678 Mon Sep 17 00:00:00 2001 From: Alessio Sergi Date: Mon, 8 Apr 2013 16:16:00 +0200 Subject: [PATCH] Improve packaging - Round 2 --- ChangeLog | 1882 ------------------ MANIFEST.in | 5 +- README | 448 ----- README.md | 448 ----- README.rst | 143 ++ TODO | 3 +- doc/all.png | Bin 92923 -> 0 bytes docs/glances-doc.html | 550 +++++ docs/glances-doc.rst | 427 ++++ {doc => docs/images}/client-connected.png | Bin {doc => docs/images}/client-disconnected.png | Bin {doc => docs/images}/cpu-wide.png | Bin {doc => docs/images}/cpu.png | Bin {doc => docs/images}/diskio.png | Bin {doc => docs/images}/footer.png | Bin {doc => docs/images}/fs.png | Bin {doc => docs/images}/glances-white-256.png | Bin {doc => docs/images}/header.png | Bin {doc => docs/images}/load.png | Bin {doc => docs/images}/logs.png | Bin {doc => docs/images}/mem-wide.png | Bin {doc => docs/images}/mem.png | Bin {doc => docs/images}/network.png | Bin {doc => docs/images}/percpu.png | Bin {doc => docs/images}/processlist-wide.png | Bin {doc => docs/images}/processlist.png | Bin {doc => docs/images}/screenshot-wide.png | Bin {doc => docs/images}/screenshot.png | Bin {doc => docs/images}/sensors.png | Bin {doc => docs}/init_script | 0 docs/man/glances.1 | 143 ++ docs/stylesheet.css | 109 + glances/glances.py | 20 +- i18n-gen.sh | 3 +- man/glances.1 | 155 -- setup.py | 39 +- 36 files changed, 1412 insertions(+), 2963 deletions(-) delete mode 100644 ChangeLog delete mode 100644 README delete mode 100644 README.md create mode 100644 README.rst delete mode 100644 doc/all.png create mode 100644 docs/glances-doc.html create mode 100644 docs/glances-doc.rst rename {doc => docs/images}/client-connected.png (100%) rename {doc => docs/images}/client-disconnected.png (100%) rename {doc => docs/images}/cpu-wide.png (100%) rename {doc => docs/images}/cpu.png (100%) rename {doc => docs/images}/diskio.png (100%) rename {doc => docs/images}/footer.png (100%) rename {doc => docs/images}/fs.png (100%) rename {doc => docs/images}/glances-white-256.png (100%) rename {doc => docs/images}/header.png (100%) rename {doc => docs/images}/load.png (100%) rename {doc => docs/images}/logs.png (100%) rename {doc => docs/images}/mem-wide.png (100%) rename {doc => docs/images}/mem.png (100%) rename {doc => docs/images}/network.png (100%) rename {doc => docs/images}/percpu.png (100%) rename {doc => docs/images}/processlist-wide.png (100%) rename {doc => docs/images}/processlist.png (100%) rename {doc => docs/images}/screenshot-wide.png (100%) rename {doc => docs/images}/screenshot.png (100%) rename {doc => docs/images}/sensors.png (100%) rename {doc => docs}/init_script (100%) create mode 100644 docs/man/glances.1 create mode 100644 docs/stylesheet.css delete mode 100644 man/glances.1 diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index bb9bdd50..00000000 --- a/ChangeLog +++ /dev/null @@ -1,1882 +0,0 @@ -Nicolas Hennion 2013-03-23 - - version 1.6.1 - -Merge: a0e1380 a0060f9 -Nicolas Hennion 2013-03-19 - - Merge pull request #218 from jrenner/master - - Tried to improve autoUnit - -Jon Renner 2013-03-19 - - work in improving autoUnit - -Merge: 3feb3b3 5540b0a -Nicolas Hennion 2013-03-19 - - Merge pull request #217 from jrenner/master - - Fixes #215 changed timer to only reset when an update is run, not just an attempt to update - -Jon Renner 2013-03-19 - - possible solution for issue #215 - -Nicolas Hennion 2013-03-18 - - Change refresh_time to cached_time for the server side - -Merge: a9a7a70 02bd6d2 -Nicolas Hennion 2013-03-18 - - Merge pull request #216 from jrenner/master - - implement time_since_update for disk and processes - -Jon Renner 2013-03-18 - - add time_since_update for disk and process_disk - - remove one line - -Nicolas Hennion 2013-03-17 - - Solve issue #206 / Server port in client mode - -Merge: db6bfc2 837446e -Nicolas Hennion 2013-03-15 - - Merge pull request #203 from jrenner/master - - add time_since_update to netstats (let API users calc net bytes/s) - -Jon Renner 2013-03-15 - - netstats dict now contains time_since_update - -Merge: 7aa29c5 62df236 -Nicolas Hennion 2013-03-10 - - Merge pull request #202 from jrenner/master - - fixed crash bug related to custom port with '-p' arg - -Jon Renner 2013-03-10 - - fix crash bug when specifying custom server port - -Merge: 345cd2d f0fe6af -Nicolas Hennion 2013-03-08 - - Merge pull request #199 from jrenner/master - - fix bits/bytes calculation - -Jon Renner 2013-03-07 - - fix num of bits calculation for network stats - -Nicolas Hennion 2013-03-06 - - Apply patch https://github.com/nicolargo/glances/pull/197#issuecomment-14490606 - -Merge: d94eceb 22fdb43 -Nicolas Hennion 2013-03-06 - - Merge branch 'master' of github.com:nicolargo/glances - -Merge: f7d96b5 508ad16 -Nicolas Hennion 2013-03-06 - - Merge pull request #197 from jrenner/master - - press 'u' to view cumulative network traffic - -Merge: f7d96b5 508ad16 -Nicolas Hennion 2013-03-06 - - Merge branch 'master' of https://github.com/jrenner/glances - -Jon Renner 2013-03-06 - - key "u" shows cumulative net traffic - -Merge: e867e75 94b10cc -Nicolas Hennion 2013-03-05 - - Merge pull request #196 from jrenner/master - - Sorry, I forgot to change the comment - -Jon Renner 2013-03-05 - - correct comment for keypress "t" (116) to match help screen text - -Merge: e5c7df9 3603ed9 -Nicolas Hennion 2013-03-05 - - Merge pull request #195 from jrenner/master - - Press 't' to toggle single Rx+Tx/s column under network stats - -Jon Renner 2013-03-05 - - decided on final column name: Rx+Tx/s - -Jon Renner 2013-03-05 - - needed a not in the boolean check for network_stats_totalled - -Jon Renner 2013-03-05 - - needed a not in the boolean check for network_stats_totalled - -Jon Renner 2013-03-05 - - implemented Total net traffic as single R+T/s column - -Jon Renner 2013-03-05 - - Implemented toggle for total net stats - -Jon Renner 2013-03-05 - - added Total traffic to network stats - -Merge: a1cad52 0560f63 -Nicolas Hennion 2013-02-22 - - Merge pull request #187 from asergi/master - - Improve packaging - -Alessio Sergi 2013-02-22 - - Improve packaging - -Merge: f42cea0 e5f9c92 -Nicolas Hennion 2013-02-22 - - Merge pull request #185 from asergi/master - - Fix Travis-CI issue - -Alessio Sergi 2013-02-21 - - Disable test against Travis-CI - -Alessio Sergi 2013-02-21 - - Disable test against Travis-CI - -Alessio Sergi 2013-02-21 - - Fix Travis-CI issue - -Merge: 1dfca91 8cecbe0 -Nicolas Hennion 2013-02-20 - - Merge pull request #184 from abeudin/master - - Add init script - -Adrien Beudin 2013-02-20 - - bug fix - -Adrien Beudin 2013-02-20 - - update init script - -Adrien Beudin 2013-02-20 - - add init script - -Nicolas Hennion 2013-02-19 - - Update the readme to remove Travis... - -Nicolas Hennion 2013-02-19 - - .travis.yml make me sad - -Nicolas Hennion 2013-02-19 - - Change the travis conf file to run the unitest.py script - -Nicolas Hennion 2013-02-19 - - Change the travis conf file to run the unitest.py script - -Nicolas Hennion 2013-02-19 - - Change the travis conf file to run the unitest.py script - -Nicolas Hennion 2013-02-19 - - Change the travis conf file to run the unitest.py script - -Nicolas Hennion 2013-02-18 - - Change documentation for Windows Installation - -Merge: b40f8ed 69479e6 -Nicolas Hennion 2013-02-17 - - Merge pull request #182 from asergi/master - - Improve help display - -asergi 2013-02-17 - - Improve help display - -asergi 2013-02-17 - - Update NEWS as per #179 - -asergi 2013-02-17 - - Update man page as per #181 - -Nicolas Hennion 2013-02-16 - - Update the NEWS with the latest pull #181 - -Merge: 666342c 8a58f71 -Nicolas Hennion 2013-02-16 - - Merge pull request #181 from creaktive/master - - Added command-line option to disable the curses.A_BOLD - -Stanislaw Pusep 2013-02-16 - - Added -z/--nobold option for better appearence under Solarized terminal color scheme - -Merge: 957d672 4830f41 -Nicolas Hennion 2013-02-15 - - Merge pull request #180 from asergi/master - - More dummy FS to ignore - -asergi 2013-02-15 - - Add more dummy FS to the ignore list - -Merge: cac7862 98074ed -Nicolas Hennion 2013-02-14 - - Merge pull request #179 from asergi/master - - Nice pull ! - - Thk Alessio - -Merge: de0e47d facd698 -Nicolas Hennion 2013-02-14 - - Merge pull request #178 from ZogStriP/patch-1 - - Added travis-ci build status image - -asergi 2013-02-14 - - Add per-user settings support - -Régis Hanol 2013-02-14 - - Added travis-ci build status image - -Merge: a3194f4 b2829dd -Nicolas Hennion 2013-02-07 - - Merge pull request #174 from jellonek/master - - Support processes with uids unknown to pwd lib. - -Piotr Skamruk 2013-02-07 - - Workaround for unknown users. - -Nicolas Hennion 2013-02-04 - - Repair unitest.py after commit https://github.com/asergi/glances/commit/d558e51e2a0f69928396a64c432eb6f255f15384 - -Nicolas Hennion 2013-01-31 - - On the road on the version 1.6.1 - -Nicolas Hennion 2013-01-31 - - Correct a bug on the critical limit for procecess / Take into acount the number of core in the process CPU limits - -Merge: fce5686 ad5c902 -Nicolas Hennion 2013-01-31 - - Merge pull request #171 from asergi/master - - Drop obsolete code / Huge patch ! Thk for your work Alessio !!! - -asergi 2013-01-31 - - More code cleanup - -asergi 2013-01-31 - - Drop obsolete code - -Nicolas Hennion 2013-01-26 - - Update AUTHORS - -Nicolas Hennion 2013-01-26 - - version 1.6 - -Nicolas Hennion 2013-01-22 - - Add password for the client/server mode - -Merge: 6d00de1 f7b96d3 -Nicolas Hennion 2013-01-21 - - Merge pull request #167 from asergi/master - - Fix for issues #157, #158 and #164 - -asergi 2013-01-20 - - Fixes and cleanup - -asergi 2013-01-20 - - OS X: corret an issue on memory display - -asergi 2013-01-20 - - OS X: ignore dummy process - -asergi 2013-01-20 - - Fix for issues #157, #158 and #164 - -Merge: 17cb69b 0a559e7 -Nicolas Hennion 2013-01-20 - - Merge pull request #166 from Verrus/master - - Fixxed my self found issue #165 - -Verrus 2013-01-19 - - deleted the README-FR as required file. - -Nicolas Hennion 2013-01-19 - - Change the default conf file (limits) - -Nicolas Hennion 2013-01-19 - - In client/server mode Glances grabs limits from the server side - -Nicolas Hennion 2013-01-18 - - Correct a bug with special key (issue #163) - -Nicolas Hennion 2013-01-18 - - Correct io_counters error client/server Issue #164 - -Nicolas Hennion 2013-01-16 - - Add the PsUtil version to the -v and -h tag - -Nicolas Hennion 2013-01-16 - - Catch curs_set - -Nicolas Hennion 2013-01-16 - - Add key control on Mac OS X - -Nicolas Hennion 2013-01-16 - - Add key control on Mac OS X - -Nicolas Hennion 2013-01-16 - - Include patch from Kelly Anderson: - - * The first patch was required to get glances working on python 3.3, I'm - not sure if it breaks python 2.7 implementations, but I figured it would - be good for you to take a look at it. - - * The NoSuchProcess patches should be considered one, since the second - patch fixed the problem correctly and depends on the first patch being - applied. - - * The NoSuchProcess exception is thrown from PsUtils when you try to - access a process that has "disappeared/finished". - - * The ConfigParser patch will take care of the fact that ConfigParser was - renamed configparser with Python3. - -Merge: bfbc1b7 28c893a -Nicolas Hennion 2013-01-12 - - Merge pull request #162 from asergi/master - - Change default config file path - -asergi 2013-01-12 - - Fix setup.py - -Merge: ebf8cf9 9359637 -Nicolas Hennion 2013-01-11 - - Merge pull request #160 from nicolargo/iorate - - IoRate and more... - -Nicolas Hennion 2013-01-11 - - New release for the french file translation - -Nicolas Hennion 2013-01-11 - - Add comments - -Nicolas Hennion 2013-01-11 - - Display IOWait on the PerCpu view - -Nicolas Hennion 2013-01-10 - - Correct an issue on perCPU display - -Nicolas Hennion 2013-01-10 - - Add fct to define color/alert - -Nicolas Hennion 2013-01-09 - - Add remarks on IOWait limits - -Nicolas Hennion 2013-01-09 - - Add IORate and first code for file configuration - -Merge: a81bf5c 8a643f1 -Nicolas Hennion 2012-12-30 - - Merge pull request #154 from peritus/patch-1 - - Fix typo: s/AccesDenied/AccessDenied/ - -Filip Noetzel 2012-12-30 - - Fix typo: s/AccesDenied/AccessDenied/ - - Helps with "AttributeError: 'module' object has no attribute 'AccesDenied'" - -Nicolas Hennion 2012-12-30 - - Change installation proc - -Nicolas Hennion 2012-12-29 - - Update doc - -Nicolas Hennion 2012-12-29 - - Update screenshot - -Nicolas Hennion 2012-12-29 - - Fixed UnboundLocalError / Thk to Geoff - -Nicolas Hennion 2012-12-28 - - version 1.5.2 - -Nicolas Hennion 2012-12-28 - - Double check if right is ok for process stats - -Nicolas Hennion 2012-12-26 - - Little hack for a PsUtil issue #152 - -Nicolas Hennion 2012-12-24 - - Test on DIskIO - -Nicolas Hennion 2012-12-21 - - Add color to sensors - -Nicolas Hennion 2012-12-21 - - Add a condition to test if limits exist before the process sort - -Nicolas Hennion 2012-12-21 - - Delete the unused getAll fonction from the GlancesStat class - -Nicolas Hennion 2012-12-20 - - Try to correct a bug on OpenVZ / See Issue #141 - -Nicolas Hennion 2012-12-20 - - Correct #Issue #149 - -Nicolas Hennion 2012-12-18 - - Replace cmdline per name when filter Idle process ! Fuck... Had to sleep... - -Nicolas Hennion 2012-12-18 - - Hide Idle processes on Windows too: Name System Idle Process - -Nicolas Hennion 2012-12-18 - - Add ascii encoding on network interface name - -Nicolas Hennion 2012-12-18 - - Add ascii encoding on network interface name - -Nicolas Hennion 2012-12-18 - - Filter and hide idle processes on Windows and FreeBSD - -Merge: e93d20c f474966 -Nicolas Hennion 2012-12-17 - - Merge pull request #148 from asergi/master - - Test: python3 compatibility fix - -Nicolas Hennion 2012-12-17 - - Add new RPC methods: 'getAll', 'getCore', 'getCpu', 'getDiskIO', 'getFs', 'getLoad', 'getMem', 'getMemSwap', 'getNetwork', 'getNow', 'getProcessCount', 'getProcessList', 'getSensors', 'getSystem' - -asergi 2012-12-15 - - Test: python3 fix - -Merge: 3674652 f522501 -asergi 2012-12-15 - - Merge remote-tracking branch 'upstream/master' - -Nicolas Hennion 2012-12-14 - - Space optim for processing (IO) - -Nicolas Hennion 2012-12-14 - - Update .gitignore - -Nicolas Hennion 2012-12-14 - - Solve issue on process display - -asergi 2012-12-14 - - Fix unicode formatting bug - -Nicolas Hennion 2012-12-14 - - Merge Pull #146 - -Merge: 8795724 cafa382 -Nicolas Hennion 2012-12-14 - - Merge branch 'master' of https://github.com/asergi/glances into asergi-master - - Conflicts: -glances/glances.py - -asergi 2012-12-14 - - Update README and man. Cleanup. - -asergi 2012-12-14 - - Sensors: lm_sensors is Linux-only - -asergi 2012-12-13 - - Fix unicode encoding issue - -asergi 2012-12-13 - - Sensors: display only temperature stats - -Nicolas Hennion 2012-12-13 - - replace hasattr by ... in ... - -asergi 2012-12-13 - - Complete fix issue #136 - -Nicolas Hennion 2012-12-13 - - Add control on receive stat. Correct Issue #145 - -Nicolas Hennion 2012-12-13 - - Correct the issue #136 - -Nicolas Hennion 2012-12-13 - - Try and catch to solve AccessDenied on username stat on Windows 7 - -Nicolas Hennion 2012-12-13 - - Try and catch to solve AccessDenied on nice stat on Windows 7 - -Nicolas Hennion 2012-12-13 - - Delete an unused function - -Nicolas Hennion 2012-12-12 - - Correct a bug on unitary tests - -Nicolas Hennion 2012-12-12 - - Update AUTHORS file - -Merge: c60736e 4d92032 -Nicolas Hennion 2012-12-10 - - Merge pull request #140 from nicolargo/newprocessesclass - - Newprocessesclass - -Nicolas Hennion 2012-12-10 - - Remove sandbox - -Nicolas Hennion 2012-12-10 - - Correct a bug when x size < caption len - -Nicolas Hennion 2012-12-10 - - New pocesses class for server - -Nicolas Hennion 2012-12-09 - - Add a new class to manage process list - -Nicolas Hennion 2012-12-08 - - Loged stats are displayed using reverse color / Other important stat with color - -Nicolas Hennion 2012-12-07 - - Reverse pull 139 - -Merge: 6f62773 4964abe -Nicolas Hennion 2012-12-07 - - Merge pull request #139 from philips/fix-crasher-in-memory-stats - - glances: fix crasher - -Brandon Philips 2012-12-06 - - glances: fix crasher - - you need to call the function otherwise you will try running float() on - a function later when you try displaying it - - Introduced in eda1cf5ba750ed82700b018b799db2ca31693870 - -Nicolas Hennion 2012-12-06 - - Reverte issue #138 - -Nicolas Hennion 2012-12-05 - - Correct an issue on the default.html Jinja template - -Nicolas Hennion 2012-12-05 - - Refactor CPU and LOAD stats graber - -Nicolas Hennion 2012-12-05 - - Cosmetic change - -Nicolas Hennion 2012-12-05 - - Solve an issue when screen size < 80 columns - -Nicolas Hennion 2012-12-05 - - Solve an issue when screen size < 80 columns - -Merge: 27b5653 4b984ba -Nicolas Hennion 2012-12-04 - - Merge pull request #137 from asergi/master - - Fix memory active/inactive bug on Windows - -asergi 2012-12-04 - - Mem: fix active/inactive bug on Windows - -Merge: 422f628 b8baced -Nicolas Hennion 2012-12-03 - - Merge pull request #135 from asergi/master - - Fixes and improvements - -asergi 2012-12-03 - - Some small fixes and cleanup - -asergi 2012-12-03 - - Fix alignment of numbers and strings - -asergi 2012-12-02 - - Improve top layout. Mem: add new stats. - -Merge: d04b030 007b3a3 -Nicolas Hennion 2012-11-29 - - Merge pull request #131 from philips/refactor-classes - - Refactor classes - -Brandon Philips 2012-11-29 - - glances: refactor glancesStats into three classes - - refactor glancesStats into three classes. This way glances can support a - new backend like the Cloud Monitoring Agent in a more clean manner. - -Brandon Philips 2012-11-28 - - glances: cleanup end of line whitespace - - there were a lot of lines with end of line whitespace. Clean it all up. - -Nicolas Hennion 2012-11-24 - - Change CPU Display - -Nicolas Hennion 2012-11-24 - - Color on extended CPU info - -Nicolas Hennion 2012-11-24 - - Correct bug with server in version 1.5.1 - -Nicolas Hennion 2012-11-21 - - Improve CPU stats displaying - -Merge: f487b99 5fa1f96 -Nicolas Hennion 2012-11-18 - - Merge pull request #126 from nicolargo/sensors - - Sensors module - -Nicolas Hennion 2012-11-18 - - Commit for the sensors module - -Nicolas Hennion 2012-11-17 - - First version with sensors. Not running with client/server - -Nicolas Hennion 2012-11-16 - - Replace the PsUtil version checker / Should correct an issue on VM client - -Nicolas Hennion 2012-11-13 - - Correct French traduction - -Merge: 24761a6 7968182 -Nicolas Hennion 2012-11-11 - - Merge pull request #123 from asergi/master - - Add systemd support - -asergi 2012-11-11 - - Add systemd support - -Merge: 7436794 94d016a -Nicolas Hennion 2012-11-10 - - Merge pull request #122 from david-guenault/master - - Fix html template path in glancesHtml class - -David GUENAULT 2012-11-10 - - Fix html template path in glancesHtml Class - -Nicolas Hennion 2012-11-09 - - Patch for HTML and CSV output - -Merge: 51e2b7e c101c7a -Nicolas Hennion 2012-11-09 - - Merge pull request #119 from asergi/master - - Fix python3 support - -asergi 2012-11-09 - - Fix python3 support - -Nicolas Hennion 2012-11-09 - - version 1.5.1 - -Merge: b9c6615 aa5d77b -Nicolas Hennion 2012-11-09 - - Merge pull request #118 from asergi/master - - Fix bugs for psutil < 0.6.0 - -asergi 2012-11-09 - - Fix bugs for psutil < 0.6.0 - -Nicolas Hennion 2012-11-08 - - Load international before first message... - -Nicolas Hennion 2012-11-07 - - Add screenshots - -Nicolas Hennion 2012-11-07 - - version 1.5 - -Nicolas Hennion 2012-11-07 - - Check PsUtil > 0.4.0 - -Nicolas Hennion 2012-11-07 - - Corect a bug on Windows and IO - -Nicolas Hennion 2012-11-07 - - Catch timedelta issue on Amazon EC2 server / related to issue #87 - -Nicolas Hennion 2012-11-07 - - Manage Fs name > 8 chars - -Nicolas Hennion 2012-11-07 - - Invert get_nice and nice - -Nicolas Hennion 2012-11-07 - - Re-add the main() function - -Nicolas Hennion 2012-11-06 - - Add Python 3 compatibility - -Nicolas Hennion 2012-11-06 - - Add refesh time for server side - -Nicolas Hennion 2012-11-06 - - Add a connected to / disconnected from server message - -Nicolas Hennion 2012-11-03 - - Update man page - -Nicolas Hennion 2012-11-02 - - Add control when server is down - -Nicolas Hennion 2012-11-02 - - Update documentation for the beta phase - -Nicolas Hennion 2012-11-02 - - Add shortkey to delete warning (w) or warning+critical (x) logs messages - -Merge: 921b8c5 a7e9ffe -Nicolas Hennion 2012-11-02 - - Merge pull request #108 from nicolargo/clientserver - - Clientserver - -Nicolas Hennion 2012-11-02 - - Change the process IO columns and update informations files - -Nicolas Hennion 2012-11-01 - - Add funcs to RPC instance - -Nicolas Hennion 2012-11-01 - - Glances client/server is now fully RPC/XML compliant - -Nicolas Hennion 2012-11-01 - - Correct a major issue on the get_io_counters on non user process (thx to the Alessio mail) - -Nicolas Hennion 2012-10-31 - - Corect bug on CPU % on Windows - -Nicolas Hennion 2012-10-31 - - CPU stats corrected for Windows - -Nicolas Hennion 2012-10-31 - - Force server mode for Windows OS - -Nicolas Hennion 2012-10-30 - - Add the -B argument for binding on a specific interface / optimize lib load - -Nicolas Hennion 2012-10-29 - - Add INIT and QUIT. Clean the code. Do stuff... - -Nicolas Hennion 2012-10-28 - - IO bug with client - -Nicolas Hennion 2012-10-28 - - Add first step of the Glances client/master - -Merge: 8ba41b7 769a0c4 -Nicolas Hennion 2012-10-24 - - Merge pull request #104 from 2xyo/master - - Add support of Travis CI continuous integration service - -Yohann Lepage 2012-10-24 - - Add support of Travis CI continuous integration service - -Nicolas Hennion 2012-10-23 - - Correct PATH in the Web export module - -Nicolas Hennion 2012-10-23 - - Minor doc update - -Merge: 2167d6c c9af089 -Nicolas Hennion 2012-10-23 - - Merge pull request #103 from sebastianmoreno/patch-1 - - Update i18n/es/LC_MESSAGES/glances.po - -Sebastián Moreno 2012-10-22 - - Update i18n/es/LC_MESSAGES/glances.po - - Algunas correcciones.  - -Merge: 0b04964 96d4f93 -Nicolas Hennion 2012-10-22 - - Merge branch 'master' of github.com:nicolargo/glances - -Nicolas Hennion 2012-10-22 - - Add -b (key 'b') to switch between bit/s or byte/s for network IO - -Merge: aec30cb f693e43 -Nicolas Hennion 2012-10-22 - - Merge pull request #101 from 2xyo/master - - Changelog is missing - - Add it to my own "build script" - -Yohann Lepage 2012-10-19 - - Add Changelog - -Merge: 2089543 415c830 -Nicolas Hennion 2012-10-16 - - Merge pull request #100 from mxjeff/locale-issue - - Fixed Portuguese locale name. - -kaliko 2012-10-15 - - Fixed Portuguese locale name - - On POSIX system locale follow "language[_territory]" naming scheme. - -Merge: 4542db5 c7b8651 -Nicolas Hennion 2012-10-08 - - Merge pull request #98 from mxjeff/html_issue - - Fixed broken HTML output (issue #97) - - Action (for me): make a formal validation of the HTML and CSV module - -kaliko 2012-10-08 - - Fixed broken HTML output (issue #97) - -Nicolas Hennion 2012-10-02 - - version 1.4.2.1 - -Nicolas Hennion 2012-09-25 - - Test as_dict()... - -Nicolas Hennion 2012-09-22 - - version 1.4.2 - -Nicolas Hennion 2012-09-22 - - Clean the code... - -Nicolas Hennion 2012-09-21 - - Clean the code, go back try / except - -Nicolas Hennion 2012-09-21 - - New function: Get process stats - -Nicolas Hennion 2012-09-21 - - New function: Get process stats - -Nicolas Hennion 2012-09-20 - - Cache OS information - -Merge: d445e79 4d2d357 -Nicolas Hennion 2012-09-19 - - Merge pull request #91 from rberaldo/master - - Brazilian Portuguese Translation - -Rafael Beraldo 2012-09-20 - - Files for the Brazilian Portuguese translation - -Nicolas Hennion 2012-09-19 - - Add Top process in the log - -Nicolas Hennion 2012-09-17 - - test code for IO ps - -Nicolas Hennion 2012-09-15 - - Use the news virtual_memory() and virtual_swap() fct - -Merge: f52bdf6 11c5eb7 -Nicolas Hennion 2012-09-15 - - Merge pull request #88 from dmd/patch-1 - - eliminate redundant 'per' - -Daniel M. Drucker 2012-09-14 - - eliminate redundant 'per' - - If you're measuring the rate of X, you can say Xps or X/s, but saying X/ps is redundant and wrong. - -Nicolas Hennion 2012-09-14 - - Update installation doc - -Nicolas Hennion 2012-09-12 - - pip install Glances / Better than pip install glances - -Nicolas Hennion 2012-09-10 - - After the 2to3 / Python 3 compatibility - -Merge: 2781b83 fd0b5f2 -Nicolas Hennion 2012-09-10 - - Merge branch 'master' of github.com:nicolargo/glances - -Nicolas Hennion 2012-09-10 - - After the 2to3 / Python 3 compatibility - -Nicolas Hennion 2012-09-09 - - Update README.md - -Merge: ac03b29 25cff95 -Nicolas Hennion 2012-09-09 - - Merge pull request #85 from luxflux/patch-1 - - Fix typo - -Raffael Schmid 2012-09-09 - - Fix typo - -Nicolas Hennion 2012-09-07 - - Add logo to HitHub doc 2 - -Nicolas Hennion 2012-09-07 - - Add logo to HitHub doc - -Merge: 6265763 f053798 -Nicolas Hennion 2012-09-07 - - Merge pull request #81 from dlion/master - - Italian translation added ! - Very nice works :) - - Thank ou for the contribution ! - -dlion 2012-09-07 - - Compiled file for italian translation - -dlion 2012-09-07 - - File for italian translation - -dlion 2012-09-07 - - Compiled file for italian translation - -dlion 2012-09-07 - - Italian translation file compiled - -dlion 2012-09-07 - - File for Italian Translation - -Nicolas Hennion 2012-09-06 - - version 1.4.1.1 - -Nicolas Hennion 2012-09-06 - - version 1.4.1 - -Merge: b128e05 60f2d6c -Nicolas Hennion 2012-09-06 - - Merge pull request #75 from dlion/master - - Uninstall script - -dlion 2012-09-06 - - A simple uninstall script - -Nicolas Hennion 2012-09-05 - - Add a switch -b to display network rate in byte per second - -Nicolas Hennion 2012-09-05 - - Add Process IO Read/Write information, if space is available - -Nicolas Hennion 2012-09-05 - - Add Process IO Read/Write information, if space is available - -Merge: 29e284b be3a0a3 -Nicolas Hennion 2012-09-05 - - Merge pull request #71 from xiongchiamiov/master - - Fix typos/misspellings in README - -Merge: 2f118aa 9dd6aa7 -Nicolas Hennion 2012-09-05 - - Merge pull request #70 from pigmonkey/master - - Fix README typo - -xiongchiamiov 2012-09-04 - - Fix typos/misspellings in README - - I didn't include the change made in pull #70: - https://github.com/nicolargo/glances/pull/70/files - - I also didn't make any changes to the French version, assuming that it is - already correct. - -Pig Monkey 2012-09-04 - - Fix README typo - -Merge: 9658dd3 47a8ba0 -Nicolas Hennion 2012-09-04 - - Merge pull request #66 from xorpaul/patch-1 - - fixed small spelling mistakes - -Andreas Paul 2012-09-04 - - fixed small spelling mistakes - -Andreas Paul 2012-09-04 - - fixed small spelling mistakes - -Nicolas Hennion 2012-09-04 - - Update installation documentation for OS X - -Nicolas Hennion 2012-09-04 - - Add first code for process IO / no display - -Merge: d2031d2 365a078 -Nicolas Hennion 2012-09-03 - - Merge pull request #60 from qzio/patch-1 - - link to correct flattr "thing" - -Merge: 62c1b34 5a90911 -Nicolas Hennion 2012-09-03 - - Merge pull request #58 from crcastle/patch-1 - - Add OSX install instructions - -joel hansson 2012-09-03 - - link to correct flattr "thing" - -Chris Castle 2012-09-03 - - Add OSX install instructions - - - Uses Homebrew package manager (and pip) - -Nicolas Hennion 2012-07-28 - - Add the '1' key to switch between per CPU / per core stats - -Nicolas Hennion 2012-07-26 - - Minor indentation change - -Nicolas Hennion 2012-07-26 - - Add unitest script - -Nicolas Hennion 2012-07-26 - - Update doc - -Nicolas Hennion 2012-07-26 - - Add per CPU information - -Nicolas Hennion 2012-07-11 - - Change installation procedure - -Nicolas Hennion 2012-07-11 - - Change installation procedure - -Nicolas Hennion 2012-07-09 - - Add depdencies in the documentation - -Nicolas Hennion 2012-07-09 - - Change installation procedure - -Nicolas Hennion 2012-07-07 - - Solve the issue #52 with Python 2.x - -Nicolas Hennion 2012-07-07 - - Solve the issue #52 with Python 2.x - -Nicolas Hennion 2012-07-07 - - Fix Setup.py issue - -Merge: 919b473 f620472 -Nicolas Hennion 2012-07-07 - - Merge pull request #51 from asergi/master - - Fix package build problem - -asergi 2012-07-07 - - Fix setup.py - -asergi 2012-07-07 - - Add glances dir - -asergi 2012-07-07 - - Rename src => glances - -Nicolas Hennion 2012-07-06 - - Change the setup.py - -Merge: 1e04f70 cfcf6bf -Nicolas Hennion 2012-07-06 - - version 1.4 - -Nicolas Hennion 2012-06-28 - - Change process nice for PsUtil 0.5.0 - -Nicolas Hennion 2012-06-21 - - A bunch of new features (#48) by Alessio Sergi - -asergi 2012-06-21 - - Add sort processes by MEM% (replace sort by VIRT) + other minor changes - -asergi 2012-06-20 - - Fix bare except: statements - -asergi 2012-06-19 - - Strip leading/trailing whitespaces from all files - -asergi 2012-06-19 - - Delete old backup files - -asergi 2012-06-19 - - Code style cleaning - -asergi 2012-06-16 - - Update help screen - -asergi 2012-06-16 - - Fix display of minutes in TIME+ - -asergi 2012-06-12 - - Add MEM%, NICE, STATUS and TIME+ to the processes infos - -asergi 2012-05-31 - - Put process summary on one line - -asergi 2012-05-31 - - Load: fix viewing on FreeBSD/Mac OS X - -asergi 2012-05-30 - - Mem/Swap: new layout and add percentage of usage - -asergi 2012-05-30 - - Fix formatting of log messages - -asergi 2012-05-27 - - No decimal places for values < GB - -asergi 2012-05-23 - - Improve system info. Add Arch Linux support. Fix FreeBSD system info. - -nicolargo 2012-05-02 - - Allow user to disable module from the command line - -nicolargo 2012-05-01 - - Add PID/UID to the processes informations - -nicolargo 2012-04-22 - - Add mem to CSV output and manage flush - -Merge: 20ebc26 671d647 -Nicolas Hennion 2012-04-05 - - Merge pull request #46 from asergi/experimental - - Thanks for your contrib ! - -asergi 2012-04-05 - - Fixed (another) broken multiline strings - -asergi 2012-04-05 - - Minor aesthetic fixes - -asergi 2012-04-05 - - Fixed broken multiline strings - -asergi 2012-04-04 - - Fix naming conventions issue - -asergi 2012-04-04 - - Fixed typos - -asergi 2012-04-04 - - Improved .gitignore - -nicolargo 2012-04-03 - - README - -nicolargo 2012-04-03 - - PEP8 - -nicolargo 2012-03-30 - - Bug correct on screen - -nicolargo 2012-03-30 - - Code checked with PEP8 checker - -nicolargo 2012-03-27 - - Patch on the Makefile.am (Thx to Al3Hex) - -nicolargo 2012-03-27 - - CVS - -nicolargo 2012-03-21 - - Add FS color in HTML output - -nicolargo 2012-03-21 - - Add test to solve issue #45 - -nicolargo 2012-03-17 - - Minor change - -nicolargo 2012-03-16 - - Correct for issue #37 - -nicolargo 2012-03-14 - - Add CLI option to manage HTML output - -nicolargo 2012-03-14 - - Add the MANIFEST.in - -Merge: 67fdbe9 e01737d -Nicolas Hennion 2012-03-14 - - Merge pull request #43 from laurentb/experimental - - Include package data files - -Laurent Bachelier 2012-03-14 - - Include package data files - -nicolargo 2012-03-14 - - Add additionnal file for HTML output - -nicolargo 2012-03-14 - - Update documentation: use setup.py for installation - -Merge: 86d8e0b 8721b82 -nicolargo 2012-03-14 - - Merge branch 'experimental' of github.com:nicolargo/glances into experimental - -Merge: edee020 91adde8 -Nicolas Hennion 2012-03-14 - - Merge pull request #42 from laurentb/experimental - - Much simpler, pure-python packaging + i18n - -Laurent Bachelier 2012-03-14 - - Simple building and packaging of i18n - -Laurent Bachelier 2012-03-13 - - Much simpler, pure-python packaging - -nicolargo 2012-03-13 - - Update doc for PPA - -nicolargo 2012-03-13 - - HTML Output - -nicolargo 2012-02-21 - - Ok when insert/remove external disk - -nicolargo 2012-02-21 - - Excexclude rootfs and autofs - -nicolargo 2012-02-18 - - Try before removing process - -nicolargo 2012-02-16 - - Reduce process load - -nicolargo 2012-02-14 - - Add control/msg to lib import - -nicolargo 2012-02-14 - - Solve the _() error message - -nicolargo 2012-02-13 - - Verbose the help message depending of the PsUtil version - -nicolargo 2012-02-13 - - Change the process list algorithm - -nicolargo 2012-02-12 - - Remove the unused get_io_counters calls - -nicolargo 2012-02-12 - - Ready for beta test - -nicolargo 2012-02-11 - - Change the help windows - -nicolargo 2012-02-08 - - PsUtil - Add process stat - -nicolargo 2012-02-07 - - Replace FsGrab by PsUtil - -nicolargo 2012-02-06 - - DISK IO - -nicolargo 2012-02-06 - - First version of the experimental BRANCH - PSUtil replace StatGrab for CPU, LOAD and MEM - -nicolargo 2012-01-31 - - version 1.3.7 - -nicolargo 2012-01-23 - - B&W console - -nicolargo 2012-01-22 - - Try for all the init color sequence - -nicolargo 2012-01-20 - - Flatt button in the README - -nicolargo 2012-01-19 - - Add try before curses.curs_set(0) - -nicolargo 2012-01-18 - - Update screenshot - -nicolargo 2012-01-18 - - version 1.3.6 - -nicolargo 2012-01-15 - - Change Roadmap to add the issue 26 - -Merge: 4a4e711 8ed8f53 -nicolargo 2012-01-13 - - wMerge branch 'master' of github.com:nicolargo/glances - - Conflicts: -src/glances.py - -nicolargo 2012-01-13 - - Minor update - -Merge: a29d712 0bb6563 -Nicolas Hennion 2012-01-13 - - Merge pull request #25 from jeanbob/master - - Traduction française (vérifié) et espagnole (non vérifié) - -Peter Fontaine (aka JeanBoB 2012-01-12 - - French and Spanish translation added. - -Peter Fontaine (aka JeanBoB 2012-01-06 - - i18n support added by JeanBoB. - French translation added. - -nicolargo 2012-01-05 - - Change the path to Python to env issue #20 - -nicolargo 2012-01-04 - - Upgrade ss - -nicolargo 2012-01-04 - - Update README - -nicolargo 2012-01-04 - - Update screenshot - -nicolargo 2012-01-04 - - version 1.3.5 - -nicolargo 2012-01-03 - - Add a buildout.cfg - -nicolargo 2011-12-25 - - Update screenshot - -nicolargo 2011-12-25 - - version 1.3.4 - -nicolargo 2011-12-23 - - Update screenshot for v1.3.3 - -nicolargo 2011-12-23 - - version 1.3.3 - -nicolargo 2011-12-21 - - Add Python PYPI informations - -nicolargo 2011-12-20 - - Add a french version of the README - -nicolargo 2011-12-18 - - Update the documentation - -nicolargo 2011-12-17 - - Update screenshot - -nicolargo 2011-12-17 - - version 1.3.2 - -nicolargo 2011-12-16 - - version 1.3.1 - -Merge: b6ac77b 46af718 -Nicolas Hennion 2011-12-15 - - Merge pull request #8 from rwmacleod/master - - Thx ! - -Randy MacLeod 2011-12-14 - - Fix consomption typo - -nicolargo 2011-12-14 - - No more FS limitation - -nicolargo 2011-12-13 - - Update screenshot - -nicolargo 2011-12-13 - - version 1.3 - -nicolargo 2011-12-10 - - Docs - -nicolargo 2011-12-10 - - Change the REAME for the 1.2 version - -nicolargo 2011-12-10 - - version 1.2 - -nicolargo 2011-12-06 - - Instructions to install on Ubuntu 10.04 and 10.10 - -nicolargo 2011-12-06 - - Ubuntu 10.04 note - -nicolargo 2011-12-06 - - Ubuntu < 11.04 notes - -nicolargo 2011-12-06 - - Change installation procedure - -nicolargo 2011-12-06 - - version 1.1.3 - -nicolargo 2011-12-05 - - v1.1.2 - -nicolargo 2011-12-05 - - version 1.1.1 - -nicolargo 2011-12-05 - - 1.1 screenshot - -nicolargo 2011-12-05 - - Add caption - -nicolargo 2011-12-05 - - Add setup.py - -nicolargo 2011-12-04 - - Catch CTRL-C before init screen - -nicolargo 2011-12-04 - - Catch CTRL-C before init screen - -nicolargo 2011-12-04 - - Add control before division - -nicolargo 2011-12-04 - - Fix Readme.md - -nicolargo 2011-12-04 - - Fix Readme.md - -nicolargo 2011-12-04 - - Fix screenshot in Readme.md - -nicolargo 2011-12-04 - - Add screenshot - -nicolargo 2011-12-04 - - First public release diff --git a/MANIFEST.in b/MANIFEST.in index 339ef4b4..1870a629 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,6 @@ include AUTHORS include COPYING include NEWS -include README -recursive-include doc *.png +include README.rst +recursive-include docs images/*.png man/glances.1 glances-doc.html recursive-include i18n *.mo -recursive-include man *.1 diff --git a/README b/README deleted file mode 100644 index 151274ff..00000000 --- a/README +++ /dev/null @@ -1,448 +0,0 @@ -[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/thing/484466/nicolargoglances-on-GitHub) -[![Build Status](https://travis-ci.org/nicolargo/glances.png?branch=master)](https://travis-ci.org/nicolargo/glances) - -============================= -Glances -- Eye on your system -============================= - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/glances-white-256.png) - -## Description - -Glances is a CLI curses based monitoring tool for GNU/Linux and BSD OS. - -Glances uses the PsUtil library to get information from your system. - -It is developed in Python. - -Console (80x24) screenshot: - -![screenshot](https://raw.github.com/nicolargo/glances/master/doc/screenshot.png) - -Wide terminal (> 90x24) screenshot: - -![screenshot](https://raw.github.com/nicolargo/glances/master/doc/screenshot-wide.png) - -## Installation - -Pre-requisites (information for packagers): - -* Python 2.6+ (not tested with Python 3+) -* build-essential (for installation via Pypi and setup.py) -* python-dev (for installation via Pypi) -* python-setuptools (for the installation via setup.py) -* python-psutil 0.4.1+ (replace the old libstatgrab's lib) -* python-jinja2 2.0+ (optional for HTML export) -* pysensors (Python library for sensors stats) - -### From package manager (very easy way) - -Packages exist for Debian (SID), Arch, Fedora, Redhat, FreeBSD... - -Check if the version is the latest one. - -### From PyPi (easy and cross platform way) - -PyPi is an official Python package manager. - -You first need to install PyPi on your system. For example on Debian/Ubuntu: - - $ sudo apt-get update - $ sudo apt-get install python-pip build-essential python-dev - -Then install the latest Glances version: - - $ sudo pip install Glances - -Note: if you are behind an HTTP Proxy, you should use instead: - - $ sudo pip install --proxy=user:password@url:port Glances - -### From [Homebrew](http://mxcl.github.com/homebrew/) for Mac OS X - - $ brew install brew-pip - $ export PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages - $ brew pip Glances - -If you have the following error: - - Error: Failed executing: pip install glances==1.X --install-option=--prefix=/usr/local/XXX/glances/1.X (.rb:) - -then try to run: - - $ pip install glances==1.X --install-option=--prefix=/usr/local/XXX/glances/1.X - $ brew link Glances - -### Concerning Windows operating system - -Thanks to Nicolas Bourges, a Windows installer is available: - -64 bits: https://s3.amazonaws.com/glances/glances-1.6.0-x64.exe -32 bits: https://s3.amazonaws.com/glances/glances-1.6.0-x86.exe - -If you want to install it manually, please read the following procedure. - -Windows operating system only support the Glances in server mode. So if you ran Glances on Windows, it will be automaticaly running in server mode. - -To install Glances on you system: - - * Install [Python for Windows](http://www.python.org/getit/) - * Install the [PsUtil lib](https://code.google.com/p/psutil/downloads/list) - * Download the latest [Glances version](https://raw.github.com/nicolargo/glances/master/glances/glances.py) - -I am looking for a contributor to package Glances for Windows (for exemple using [PyInstaller](http://www.pyinstaller.org/)). - -### From source - -Get the latest version (form GitHub): - - $ rm -rf /tmp/nicolargo-glances-* - $ wget -O /tmp/glances-last.tgz https://github.com/nicolargo/glances/tarball/master - -Glances use a standard GNU style installer (for a Debian like system): - - $ sudo apt-get update - $ sudo apt-get install python-setuptools build-essential python-dev - $ cd /tmp - $ tar zxvf glances-last.tgz - $ cd nicolargo-glances-* - $ sudo python setup.py install - -## From a configuration manager - -Puppet: https://github.com/rverchere/puppet-glances - -Chef: https://github.com/cookbooks/hw-chef-glances - -## Configuration - -No configuration is needed to use Glances. - -Furthermore, the release 1.6 introduces a configuration file to setup limits. - -The default configuration file is under: - - /etc/glances/glances.conf (Linux) -or - - /usr/local/etc/glances/glances.conf (*BSD and OS X) - -To override the default configuration, you can copy the `glances.conf` file to -your `$XDG_CONFIG_HOME` directory (e.g. Linux): - - mkdir -p $XDG_CONFIG_HOME/glances - cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/ - -On OS X, you should copy the configuration file to `~/Library/Application Support/glances/`. - -## Running - -### In standalone mode - -If you want to monitor your local machine, just run: - - $ glances - -### In client/server mode - -If you want to remotely monitor a machine (called server) from another one (called client). - -Run this command on the server: - - server$ glances -s - -and this one on the client: - - client$ glances -c @server - -where @server is the IP address or hostname of the server - -Glances uses a [XML/RPC](http://docs.python.org/2/library/simplexmlrpcserver.html) server and can be used by another client software. - -In server mode, you can set the bind address (-B ADDRESS) and listenning TCP port (-p PORT). - -In client mode, you can set the TCP port of the server (-p port). - -Default binding address is 0.0.0.0 (Glances will listen on all the networks interfaces) and TCP port is 61209. - -In client/server mode, limits are set by the server side. - -The version 1.6 introduces a optionnal password to access to the server (-P password). - -## User guide - -Command line options are: - - -b Display network rate in Byte per second - -B @IP|host Bind server to the given IP or host NAME - -c @IP|host Connect to a Glances server - -C file Path to the configuration file - -d Disable disk I/O module - -e Enable the sensors module (Linux-only) - -f file Set the output folder (HTML) or file (CSV) - -h Display the syntax and exit - -m Disable mount module - -n Disable network module - -o output Define additional output (available: HTML or CSV) - -p PORT Define the client or server TCP port (default: 61209) - -P password Client/server password - -r Do not list processes (significant CPU use reduction) - -s Run Glances in server mode - -t sec Set the refresh time in seconds (default: 3) - -v Display the version and exit - -y Enable the hddtemp module - -z Do not use the bold color attribute - -Importants stats are colored: - -* GREEN: stat counter is "OK" -* BLUE: stat counter is "CAREFUL" -* MAGENTA: stat counter is "WARNING" -* RED: stat counter is "CRITICAL" - -When Glances is running, you can press: - -* 'a' to set the automatic mode. The processes are sorted automatically - - IF CPU IoWait > 60% sort by process "IO read and write" - - If CPU > 70%, sort by process "CPU consumption" - - If MEM > 70%, sort by process "memory size" - -* 'b' switch between bit/s or byte/s for network IO -* 'c' sort the processes list by CPU consumption -* 'd' disable or enable the disk IO stats -* 'e' enable the sensors module (PySensors library is needed; Linux-only) -* 'f' disable or enable the file system stats -* 'h' to display a help message with the keys you can press and the limits -* 'i' sort the processes list by IO rate (need root account on some OS) -* 'l' disable or enable the logs -* 'm' sort the processes list by process MEM -* 'n' disable or enable the network interfaces stats -* 'p' sort by process name -* 's' disable or enable the sensor stats (only available with -e tag) -* 't' View network IO as combination -* 'u' View cumulative network IO -* 'w' delete finished warning logs messages -* 'x' delete finished warning and critical logs messages -* '1' switch between global CPU and per core stats -* 'q' Exit - -### Header - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/header.png) - -The header shows the host name and the operating system name, version and architecture. - -### CPU - -Short view: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/cpu.png) - -If horizontal space is available, extended CPU infomations are displayed. - -Extended view (only available if your terminal is wide enough) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/cpu-wide.png) - -If user click on the '1' key, per CPU stats is displayed: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/percpu.png) - -The CPU stats are shown as a percentage and for the configured refresh -time. The total CPU usage is displayed on the first line. - -Color code used: - -If user|kernel|nice CPU is < 50%, then status is set to "OK". - -If user|kernel|nice CPU is > 50%, then status is set to "CAREFUL". - -If user|kernel|nice CPU is > 70%, then status is set to "WARNING". - -If user|kernel|nice CPU is > 90%, then status is set to "CRITICAL". - -### Load - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/load.png) - -On the Nosheep blog, Zach defines average load: "In short it is the -average sum of the number of processes waiting in the run-queue plus the -number currently executing over 1, 5, and 15 minute time periods." - -Glances gets the number of CPU cores to adapt the alerts. With Glances, -alerts on average load are only set on 5 and 15 mins. The first line -also display the number of CPU core. - -If average load is < O.7*Core, then status is set to "OK". - -If average load is > O.7*Core, then status is set to "CAREFUL". - -If average load is > 1*Core, then status is set to "WARNING". - -If average load is > 5*Core, then status is set to "CRITICAL". - -### Memory - -Glances uses two columns: one for the RAM and another one for the SWAP. - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/mem.png) - -If space is available, Glances displays extended informations: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/mem-wide.png) - -With Glances, alerts are only set for on used swap and real memory. - -If memory is < 50%, then status is set to "OK". - -If memory is > 50%, then status is set to "CAREFUL". - -If memory is > 70%, then status is set to "WARNING". - -If memory is > 90%, then status is set to "CRITICAL". - -### Network bit rate - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/network.png) - -Glances display the network interface bit rate. The unit is adapted -dynamicaly (bits per second, Kbits per second, Mbits per second...). - -Alerts are set only if the network interface maximum speed is available. - -If bit rate is < 50%, then status is set to "OK". - -If bit rate is > 50%, then status is set to "CAREFUL". - -If bit rate is > 70%, then status is set to "WARNING". - -If bit rate is > 90%, then status is set to "CRITICAL". - -For example, on a 100 Mbps Ethernet interface, the warning status is set -if the bit rate is higher than 70 Mbps. - -### Sensors (optional; only available on Linux) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/sensors.png) - -Optionally, Glances displays the sensors informations (lm-sensors). - -A filter is processed in order to only display temperature. - -You should enable this module using the following command line: - - glances -e - -There is no alert on this information. - -### Disk I/O - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/diskio.png) - -Glances displays the disk I/O throughput. The unit is adapted dynamically -(bytes per second, Kbytes per second, Mbytes per second...). - -There is no alert on this information. - -### Filesystem - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/fs.png) - -Glances displays the total and used filesytem disk space. The unit is -adapted dynamically (bytes per second, Kbytes per second, Mbytes per -second...). - -Alerts are set for used disk space: - -If disk used is < 50%, then status is set to "OK". - -If disk used is > 50%, then status is set to "CAREFUL". - -If disk used is > 70%, then status is set to "WARNING". - -If disk used is > 90%, then status is set to "CRITICAL". - -### Processes - -Short view: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/processlist.png) - -Long view (only available if your terminal is wide enough) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/processlist-wide.png) - -Glances displays a summary and a list of processes. - -By default (or if you hit the 'a' key) the process list is automatically -sorted by CPU of memory consumption. - -The number of processes in the list is adapted to the screen size. - -* VIRT: Virtual memory size (in byte) -* REST: Amount of resident memory (in byte) -* CPU%: % of CPU used by the process -* MEM%: % of MEM used by the process -* PID: Process ID -* USER: Process user ID -* NI: Nice level of the process -* S: Process status - - R - Running - D - Sleeping (may not be interrupted) - S - Sleeping (may be interrupted) - T - Traced or stopped - Z - Zombie or "hung" process - -* TIME+: Cumulative CPU time used -* IO_R and IO_W: Per process IO read and write rate (in byte per second) -* NAME: Process name or command line - -### Logs - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/logs.png) - -A logs list is displayed in the bottom of the screen if (and only if): - -* at least one WARNING or CRITICAL alert was occured. -* space is available in the bottom of the console/terminal - -There is one line per alert with the following information: - -* start date -* end date -* alert name -* (min/avg/max) values - -### Footer - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/footer.png) - -Glances displays the current time/date and access to the embedded help screen. - -If you have ran Glances in client mode (-c), you can also see if the client is connected to the server. - -If client is connected: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/client-connected.png) - -else: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/client-disconnected.png) - -On the left, you can easely seen if you are connected to a Glances server. - -## Localisation - -Glances localization files exist for: - -* English (default langage) -* French -* Italian -* Spanish -* Portugal - -Feel free to contribute ! diff --git a/README.md b/README.md deleted file mode 100644 index 151274ff..00000000 --- a/README.md +++ /dev/null @@ -1,448 +0,0 @@ -[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/thing/484466/nicolargoglances-on-GitHub) -[![Build Status](https://travis-ci.org/nicolargo/glances.png?branch=master)](https://travis-ci.org/nicolargo/glances) - -============================= -Glances -- Eye on your system -============================= - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/glances-white-256.png) - -## Description - -Glances is a CLI curses based monitoring tool for GNU/Linux and BSD OS. - -Glances uses the PsUtil library to get information from your system. - -It is developed in Python. - -Console (80x24) screenshot: - -![screenshot](https://raw.github.com/nicolargo/glances/master/doc/screenshot.png) - -Wide terminal (> 90x24) screenshot: - -![screenshot](https://raw.github.com/nicolargo/glances/master/doc/screenshot-wide.png) - -## Installation - -Pre-requisites (information for packagers): - -* Python 2.6+ (not tested with Python 3+) -* build-essential (for installation via Pypi and setup.py) -* python-dev (for installation via Pypi) -* python-setuptools (for the installation via setup.py) -* python-psutil 0.4.1+ (replace the old libstatgrab's lib) -* python-jinja2 2.0+ (optional for HTML export) -* pysensors (Python library for sensors stats) - -### From package manager (very easy way) - -Packages exist for Debian (SID), Arch, Fedora, Redhat, FreeBSD... - -Check if the version is the latest one. - -### From PyPi (easy and cross platform way) - -PyPi is an official Python package manager. - -You first need to install PyPi on your system. For example on Debian/Ubuntu: - - $ sudo apt-get update - $ sudo apt-get install python-pip build-essential python-dev - -Then install the latest Glances version: - - $ sudo pip install Glances - -Note: if you are behind an HTTP Proxy, you should use instead: - - $ sudo pip install --proxy=user:password@url:port Glances - -### From [Homebrew](http://mxcl.github.com/homebrew/) for Mac OS X - - $ brew install brew-pip - $ export PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages - $ brew pip Glances - -If you have the following error: - - Error: Failed executing: pip install glances==1.X --install-option=--prefix=/usr/local/XXX/glances/1.X (.rb:) - -then try to run: - - $ pip install glances==1.X --install-option=--prefix=/usr/local/XXX/glances/1.X - $ brew link Glances - -### Concerning Windows operating system - -Thanks to Nicolas Bourges, a Windows installer is available: - -64 bits: https://s3.amazonaws.com/glances/glances-1.6.0-x64.exe -32 bits: https://s3.amazonaws.com/glances/glances-1.6.0-x86.exe - -If you want to install it manually, please read the following procedure. - -Windows operating system only support the Glances in server mode. So if you ran Glances on Windows, it will be automaticaly running in server mode. - -To install Glances on you system: - - * Install [Python for Windows](http://www.python.org/getit/) - * Install the [PsUtil lib](https://code.google.com/p/psutil/downloads/list) - * Download the latest [Glances version](https://raw.github.com/nicolargo/glances/master/glances/glances.py) - -I am looking for a contributor to package Glances for Windows (for exemple using [PyInstaller](http://www.pyinstaller.org/)). - -### From source - -Get the latest version (form GitHub): - - $ rm -rf /tmp/nicolargo-glances-* - $ wget -O /tmp/glances-last.tgz https://github.com/nicolargo/glances/tarball/master - -Glances use a standard GNU style installer (for a Debian like system): - - $ sudo apt-get update - $ sudo apt-get install python-setuptools build-essential python-dev - $ cd /tmp - $ tar zxvf glances-last.tgz - $ cd nicolargo-glances-* - $ sudo python setup.py install - -## From a configuration manager - -Puppet: https://github.com/rverchere/puppet-glances - -Chef: https://github.com/cookbooks/hw-chef-glances - -## Configuration - -No configuration is needed to use Glances. - -Furthermore, the release 1.6 introduces a configuration file to setup limits. - -The default configuration file is under: - - /etc/glances/glances.conf (Linux) -or - - /usr/local/etc/glances/glances.conf (*BSD and OS X) - -To override the default configuration, you can copy the `glances.conf` file to -your `$XDG_CONFIG_HOME` directory (e.g. Linux): - - mkdir -p $XDG_CONFIG_HOME/glances - cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/ - -On OS X, you should copy the configuration file to `~/Library/Application Support/glances/`. - -## Running - -### In standalone mode - -If you want to monitor your local machine, just run: - - $ glances - -### In client/server mode - -If you want to remotely monitor a machine (called server) from another one (called client). - -Run this command on the server: - - server$ glances -s - -and this one on the client: - - client$ glances -c @server - -where @server is the IP address or hostname of the server - -Glances uses a [XML/RPC](http://docs.python.org/2/library/simplexmlrpcserver.html) server and can be used by another client software. - -In server mode, you can set the bind address (-B ADDRESS) and listenning TCP port (-p PORT). - -In client mode, you can set the TCP port of the server (-p port). - -Default binding address is 0.0.0.0 (Glances will listen on all the networks interfaces) and TCP port is 61209. - -In client/server mode, limits are set by the server side. - -The version 1.6 introduces a optionnal password to access to the server (-P password). - -## User guide - -Command line options are: - - -b Display network rate in Byte per second - -B @IP|host Bind server to the given IP or host NAME - -c @IP|host Connect to a Glances server - -C file Path to the configuration file - -d Disable disk I/O module - -e Enable the sensors module (Linux-only) - -f file Set the output folder (HTML) or file (CSV) - -h Display the syntax and exit - -m Disable mount module - -n Disable network module - -o output Define additional output (available: HTML or CSV) - -p PORT Define the client or server TCP port (default: 61209) - -P password Client/server password - -r Do not list processes (significant CPU use reduction) - -s Run Glances in server mode - -t sec Set the refresh time in seconds (default: 3) - -v Display the version and exit - -y Enable the hddtemp module - -z Do not use the bold color attribute - -Importants stats are colored: - -* GREEN: stat counter is "OK" -* BLUE: stat counter is "CAREFUL" -* MAGENTA: stat counter is "WARNING" -* RED: stat counter is "CRITICAL" - -When Glances is running, you can press: - -* 'a' to set the automatic mode. The processes are sorted automatically - - IF CPU IoWait > 60% sort by process "IO read and write" - - If CPU > 70%, sort by process "CPU consumption" - - If MEM > 70%, sort by process "memory size" - -* 'b' switch between bit/s or byte/s for network IO -* 'c' sort the processes list by CPU consumption -* 'd' disable or enable the disk IO stats -* 'e' enable the sensors module (PySensors library is needed; Linux-only) -* 'f' disable or enable the file system stats -* 'h' to display a help message with the keys you can press and the limits -* 'i' sort the processes list by IO rate (need root account on some OS) -* 'l' disable or enable the logs -* 'm' sort the processes list by process MEM -* 'n' disable or enable the network interfaces stats -* 'p' sort by process name -* 's' disable or enable the sensor stats (only available with -e tag) -* 't' View network IO as combination -* 'u' View cumulative network IO -* 'w' delete finished warning logs messages -* 'x' delete finished warning and critical logs messages -* '1' switch between global CPU and per core stats -* 'q' Exit - -### Header - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/header.png) - -The header shows the host name and the operating system name, version and architecture. - -### CPU - -Short view: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/cpu.png) - -If horizontal space is available, extended CPU infomations are displayed. - -Extended view (only available if your terminal is wide enough) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/cpu-wide.png) - -If user click on the '1' key, per CPU stats is displayed: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/percpu.png) - -The CPU stats are shown as a percentage and for the configured refresh -time. The total CPU usage is displayed on the first line. - -Color code used: - -If user|kernel|nice CPU is < 50%, then status is set to "OK". - -If user|kernel|nice CPU is > 50%, then status is set to "CAREFUL". - -If user|kernel|nice CPU is > 70%, then status is set to "WARNING". - -If user|kernel|nice CPU is > 90%, then status is set to "CRITICAL". - -### Load - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/load.png) - -On the Nosheep blog, Zach defines average load: "In short it is the -average sum of the number of processes waiting in the run-queue plus the -number currently executing over 1, 5, and 15 minute time periods." - -Glances gets the number of CPU cores to adapt the alerts. With Glances, -alerts on average load are only set on 5 and 15 mins. The first line -also display the number of CPU core. - -If average load is < O.7*Core, then status is set to "OK". - -If average load is > O.7*Core, then status is set to "CAREFUL". - -If average load is > 1*Core, then status is set to "WARNING". - -If average load is > 5*Core, then status is set to "CRITICAL". - -### Memory - -Glances uses two columns: one for the RAM and another one for the SWAP. - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/mem.png) - -If space is available, Glances displays extended informations: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/mem-wide.png) - -With Glances, alerts are only set for on used swap and real memory. - -If memory is < 50%, then status is set to "OK". - -If memory is > 50%, then status is set to "CAREFUL". - -If memory is > 70%, then status is set to "WARNING". - -If memory is > 90%, then status is set to "CRITICAL". - -### Network bit rate - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/network.png) - -Glances display the network interface bit rate. The unit is adapted -dynamicaly (bits per second, Kbits per second, Mbits per second...). - -Alerts are set only if the network interface maximum speed is available. - -If bit rate is < 50%, then status is set to "OK". - -If bit rate is > 50%, then status is set to "CAREFUL". - -If bit rate is > 70%, then status is set to "WARNING". - -If bit rate is > 90%, then status is set to "CRITICAL". - -For example, on a 100 Mbps Ethernet interface, the warning status is set -if the bit rate is higher than 70 Mbps. - -### Sensors (optional; only available on Linux) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/sensors.png) - -Optionally, Glances displays the sensors informations (lm-sensors). - -A filter is processed in order to only display temperature. - -You should enable this module using the following command line: - - glances -e - -There is no alert on this information. - -### Disk I/O - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/diskio.png) - -Glances displays the disk I/O throughput. The unit is adapted dynamically -(bytes per second, Kbytes per second, Mbytes per second...). - -There is no alert on this information. - -### Filesystem - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/fs.png) - -Glances displays the total and used filesytem disk space. The unit is -adapted dynamically (bytes per second, Kbytes per second, Mbytes per -second...). - -Alerts are set for used disk space: - -If disk used is < 50%, then status is set to "OK". - -If disk used is > 50%, then status is set to "CAREFUL". - -If disk used is > 70%, then status is set to "WARNING". - -If disk used is > 90%, then status is set to "CRITICAL". - -### Processes - -Short view: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/processlist.png) - -Long view (only available if your terminal is wide enough) - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/processlist-wide.png) - -Glances displays a summary and a list of processes. - -By default (or if you hit the 'a' key) the process list is automatically -sorted by CPU of memory consumption. - -The number of processes in the list is adapted to the screen size. - -* VIRT: Virtual memory size (in byte) -* REST: Amount of resident memory (in byte) -* CPU%: % of CPU used by the process -* MEM%: % of MEM used by the process -* PID: Process ID -* USER: Process user ID -* NI: Nice level of the process -* S: Process status - - R - Running - D - Sleeping (may not be interrupted) - S - Sleeping (may be interrupted) - T - Traced or stopped - Z - Zombie or "hung" process - -* TIME+: Cumulative CPU time used -* IO_R and IO_W: Per process IO read and write rate (in byte per second) -* NAME: Process name or command line - -### Logs - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/logs.png) - -A logs list is displayed in the bottom of the screen if (and only if): - -* at least one WARNING or CRITICAL alert was occured. -* space is available in the bottom of the console/terminal - -There is one line per alert with the following information: - -* start date -* end date -* alert name -* (min/avg/max) values - -### Footer - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/footer.png) - -Glances displays the current time/date and access to the embedded help screen. - -If you have ran Glances in client mode (-c), you can also see if the client is connected to the server. - -If client is connected: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/client-connected.png) - -else: - -![screenshot](https://github.com/nicolargo/glances/raw/master/doc/client-disconnected.png) - -On the left, you can easely seen if you are connected to a Glances server. - -## Localisation - -Glances localization files exist for: - -* English (default langage) -* French -* Italian -* Spanish -* Portugal - -Feel free to contribute ! diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..e8094e33 --- /dev/null +++ b/README.rst @@ -0,0 +1,143 @@ +=============================== +Glances - An eye on your system +=============================== + +.. image:: http://api.flattr.com/button/flattr-badge-large.png + :target: https://flattr.com/thing/484466/nicolargoglances-on-GitHub +.. image:: https://travis-ci.org/nicolargo/glances.png?branch=master + :target: https://travis-ci.org/nicolargo/glances + +.. image:: docs/images/glances-white-256.png + :width: 128 + +**Glances** is a cross-platform curses-based monitoring tool written in Python. + +It uses the `psutil`_ library to get information from your system. + +.. image:: docs/images/screenshot-wide.png + +Requirements +============ + +- ``python >= 2.6`` (tested with version 2.6, 2.7, 3.2, 3.3) +- ``psutil >= 0.4.1`` (recommended version >= 0.6) +- ``jinja`` (optional for HTML output) +- ``pysensors`` (optional for HW monitoring support) +- ``hddtemp`` (optional for HDD temperature monitoring support) +- ``setuptools`` + +Installation +============ + +Actually, Glances is available for Arch Linux, Fedora / CentOS / RHEL, +Debian (Sid), Ubuntu (13.04+) and FreeBSD, so you should be able to +install it using your favorite package manager. + +Glances is on `PyPI`_. To install, simply use `pip`_: + +.. code-block:: console + + pip install Glances + +OS X +---- + +OS X users can also install Glances using `Homebrew`_ or `MacPorts`_. + +Homebrew +```````` + +.. code-block:: console + + $ brew install brew-pip + $ export PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages + $ brew pip Glances + +.. note:: If you get the following error: + + :: + + Error: Failed executing: pip install glances==X.X --install-option=--prefix=/usr/local/XXX/glances/X.X (.rb:) + + Try to run: + + .. code-block:: console + + $ pip install glances==X.X --install-option=--prefix=/usr/local/XXX/glances/X.X + $ brew link Glances + +MacPorts +```````` + +.. code-block:: console + + $ sudo port install glances + +Windows +------- + +Windows only support Glances in server mode. Glances will automatically run in server mode on it. + +Thanks to `Nicolas Bourges`, Glances can be easily installed using a Windows installer: + +- glances-1.6.0-x86.exe_ (32-bit, md5sum: 1d25902a2b1030f953a108792f4732cf) +- glances-1.6.0-x64.exe_ (64-bit, md5sum: de2c35c4bdd6a3ab2b938ea5f4c1567d) + +Otherwise, you have to follow these steps: + +- Install `Python for Windows`: http://www.python.org/getit/ +- Install the `psutil` library: https://code.google.com/p/psutil/downloads/list +- Download `Glances` from here: http://nicolargo.github.io/glances/ + +Source +------ + +To install Glances from source: + +.. code-block:: console + + $ curl -L https://github.com/nicolargo/glances/archive/vX.X.tar.gz -o glances-X.X.tar.gz + $ tar -zxvf glances-*.tar.gz + $ cd glances-* + # python setup.py install + +.. note:: On Debian/Ubuntu, you have to install first `build-essential` and `python-dev`. + +Puppet +------ + +You can install Glances using `Puppet`_: https://github.com/rverchere/puppet-glances + +Usage +===== + +Just run: + +.. code-block:: console + + $ glances [OPTIONS] + +Documentation +============= + +For complete documentation see ``glances-doc.html``. + +Author +====== + +Nicolas Hennion (@nicolargo) + +License +======= + +LGPL. See ``COPYING`` for more details. + + +.. _psutil: https://code.google.com/p/psutil/ +.. _PyPI: https://pypi.python.org/pypi +.. _pip: http://www.pip-installer.org/ +.. _Homebrew: http://mxcl.github.com/homebrew/ +.. _MacPorts: https://www.macports.org/ +.. _glances-1.6.0-x86.exe: https://s3.amazonaws.com/glances/glances-1.6.0-x86.exe +.. _glances-1.6.0-x64.exe: https://s3.amazonaws.com/glances/glances-1.6.0-x64.exe +.. _Puppet: https://puppetlabs.com/puppet/what-is-puppet/ diff --git a/TODO b/TODO index 3693bd08..0196988e 100644 --- a/TODO +++ b/TODO @@ -1,2 +1 @@ -- Need a packager/installer for Windows OS (Server mode only) -- Need translators contributions (Chines, Japon, ...) +- Need translators contributions (Chinese, Japanese, etc.) diff --git a/doc/all.png b/doc/all.png deleted file mode 100644 index fcf6d11eb89a3f5982c29b6132eb00298ecbb5a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92923 zcmZU)V{~Ofw>5l%j@9Yd={OzRNrxTVwr!(hTPL<{cWj#-p4jG_e(rtl_{R9^&)#*$ zs;Yf<)m~L|&AGzlWW*5RaNqy{0HXLWVFdsHJPrT=+lB%E{H67`L(k_0!ckCM2?hpc zZCm#5XBEXsM9oRj*2KwG-@zE5Xy)wXWb9xVFbxX;5CO!6e=51Ho@Tmwp$%a6Y@O=J zw(iY(76!#n3nFWCfy2S5QNo3WN~BOzN_>U<>5+ip@$CqF*3%3YmbBm@ORLH{ZHq7^ z>y%7>CUDD(|KV#rH@EHm#A%1SVqD6HKx<)?My0X@OEOb16fZcE1r*&oG5|n*Go=d- zL5H7@0z(|Q?QH19J?9{&%$Sq6^wT)6a!;KGjbHGWoSQyQtzCoQcRBrQxdCD9eSNKC z1AQF3{o2$;8F}Fr9IpP}Hr6YSD)AyEG0p`r<>H+8!cY2rK=#KLbIC zX~WmyBJCxD0)-d3aBzRfla$rKe|XCMbsP{JVH))Nf$V3gDD(9gC24*WZ|DTk%frM+ zqbVI)c*fu>5gaoY=8YA*SYf#)Z>yFlix?3K45Xkn5iKh%2?+@wBN-E&7;|!l{OokfP-rgP&Az8cc=;Y*NXZK4& zB0MUJ6${~e+@W-M?EUSnlY_(TkrU|)tSv`kkZMGeeBn1w3v(<{Q z7#?m$#i4{Ij_s&{Lu(HYk7Txx0W~!>qQJWPdd9&8CnHPWK=rh={weZ#ve@q`0deHs6-Rps1Dmcv_GzX8GyDPHhip)Ia4FjPC>Bnll|Tn4dJpMQS-UsIERC469qokY+tugiY7hr?fP z>?@TPuKSPu24zF;k)(c{wz!Hvekg*=J$5`F^d32hX<|T~4UNScJI5wg(85tEm3SO7 zy><(F(ioaeG{xO9x4o4sbh==N4t@N|F4HZ~2j&@VIjbBDvCId3H<|w>y&(gZm6cWC zcPGuKX zhEyqXT0R!Hef7{X>(cYr01R6GG|r+{(k(LIZGS9$s5Hlu_urlkm(GpxjPBJ{Hrl={ zWdN#<04U^h)W62`3q``b9d5UKXB>#Sf6|FXe!G%;PfrSwVG@(ma~{8^33c=STD^+;^UBQD=$o>F}!^2P#R{Xma3*qUAs`~tN%bi>_1dOtNbO3C6 z^dP_MH7AMbZL0By%=Lz7_nf_+m}J3(l*iRyhbGHr7a{WQ?7Oq35YAs#*06wCHuz|* zG~}Gt`ez`sN+*=FjRqScS5UDZ5vijM_haWKt@kNfaE2A5Nbb%O+AjiyN2Cmns(S0| zAZg9X0Sj?<+}v}2#;Ur6WwVVk^S_@j>))!Bh)t9AtFDjyoMmK%Ld7>aLg}B_TaaQF z4CSUMf@q7_9ODt%&pw={e$dj2Fm5@O=$tEDv2F+%e4Q!Zq=_Mk?9G?=`&M*Jw%*-{ zN92@-?Q>@q%j2S=`eU=JRn^p6ADs!gf2P#!HFJz|8NC zt7@hT9w+wmSej~zRr`5h%&YgP9aE7a?RC9{G%MwSEJ1j6uO4^MdilRAq@0lalri56!+ysif-HU~S zmCU+i36!8;(nJ7=Kzju~8*MS`m*GQ+$^w#NVKd7Zje2o)Pu$+TX6c?yKI@wJ+zn^b zX9*Cnk;XT~y!hr44|W^No`3r=gf#mJwG6}&N`;`iY^A+fo&9R?bC>R0w zYMD6LlPLN7yTC6L>$yBtzkoc4sVRc#R!@-67SFcZE~6TjIxN`~isv2(-<0m7N&hSj z(mU-UTY=5fb+FF)M3pv!g>-sD%V5K!_qCe;=ztVlfdRG=EV1M{I_?{&|ZhB=9lTv0~2a#z*&z+2act@-xF2cb|9BU$6M zLmtZP2EP~g*5uM}PdjS77uMv~7R@|f^D(Pj4EAS_bzquYW=-CS&jrY4vC&mR2+~ksl5D*6EiaK!t=`1oj!L1K~)sC>=}VfWF(L8zN1G zQK?3xe;$fm#f-s>L?MrKh`D6zRe|B6Tv?=HBx5ow*1dT4AO_|0{2)XO%Vu9U&Vi&* z+QAQ~NH8!x3`#&xVrv?uwCdm`5S4;e6|e^aA7I1+sKtiL9SxfYwW0}R7Mau*H1yY1 ztEWPJ3*ZPJ00@j#Ob8!oNaeU%fo+(w9a4IUQu&^+^p)ldRV^`y)YZ(9WpCt1V zKJ29w z0OEoepDg{JP*w(jf}h8v;Djoz@pt)e)L&#jOQNcp{^*5j9{?o}C4BYHvLzaG?npmuy0nYqZ~efxMW0TpS9i9@lo*GMq${lmg7p zEL6*UJl#od-O5z`fyT145Xas(z~|F--}ch24HMPs%(ytdwzM&@sZyvg+jja`!_9sk zSXjSED^XC71)$`6iV6+|2DazB&^ zP6~<099>lq)t5Fot=C+#2{FYIpmdju6?bng6AQ`YaU*N9#}LWh)M35s5CW6wAzQD>SP1slGDmXB-mv= zIjhISWv51$>aYMPWT=wkRvCCSC3W8c0Lq|B1zh~N)N(`PJF$w@OK}J;F30kZlsz_i4~2?^!sNj8V@L{9Krq}ce3KrYvFD_dJxt}d8H z_{iE?*`{8?{r7-bZOOuF44sPQUdHjTDJ_^=!$?SsnKVcc2`#9?&Q@S;bGata#H zoZ_AWj*77vHv}NRYhpKQ>g^$BtvFSh1&!jW8oJg>9Y~&!{;~^Pwal%W=|bV%rBGJ+ z!wmcrcEJCV7BBk55BmHj9dA>1CI01qke2pUeb@x~C$a<&Q9mYRT+82bwSSO$KKGPzQ6~9k zv`x5wa_|2gki+n9YQ;u`LmbHXJ(~L;o`b3Go1&9OQL@CGD;Jm(c83(?>_0Cn9IMcw z3tz$e(;dfM6q=EkEz9Ov%lG8;-8}6Z%m?3ov%)rj4#K-}9vRS5y3}&SF6o0-yA;Td z+1h=Q`B=o?l>gD|KJ#7khWIz_N!n7?84?X}#kvh6wi3~Z1q^x%BjR23n3P~~u6VVn zft;HQ1*Wmr1OlLa4-F8QG4_G%#YHG)6c#z&x%pU~3w?I2Oj}pv^cH$6Ck9(t6|k=R z_#JVl;$>u_*!Cf1!sgk%BMo*{P7f_ z?f8R|r%=S0(b6}e<+NwLWbmaZRXswgNRIrBf9OF+%knoJ!%g8SKhqxrt1ZAL%@qu<#d1L2QILbHdwSLp)VynQMt98!Xvx5lOED^UmeWU9fYOl?Boo z>QUM=93Bp<%dUno{RRj`4lEb@0|c3=4Ir)|eE>q^eIsR(!-V-o7jam^3&^-tgZ^>l zByxP(&C7#CKNaV#(Q2)fGA zw+eY%mO{(e9l?YRP2v|WCmV?jGL`_aVj&i`K9FnQG=YGw_rub2LHcei$fUNk5=%RW zc;e&0mz#d>jmH`oI8Qg6BX`vXXo{$C|Agmdw7cEEVw0mejfV`P^+Ta9u#C?W53G<-QP4 zF}GOB);)-vReM2RDIZRBQ($3Dr`bm4dYk`-{#-n@Z9@;Y;5N};-7%!Ja;4KSuWKc% z)?8+fqBwU9!IR(diu*<5P{+eX84Ns@)uAnO?Yf_`6z%6^A=U@^wxW*&zXOf;)#I{c zMT??o7#bL$uBNb6>F$pExcy<_;k-PXES8lnkjtb#3=Za_cv?baN@li1H!lRioztat z)gcgMJ4Ta)1|W)qLC3*OGgx%*R_1LXxgpsiz+*Lalxe`I(P9L7<)i-`KR==mk&%`? z|LgLUQQwW7$SzCc=$h{l8=KK>SOe%`q&=#dUt3#BI+%cx>%x$ro?aT+X4c z-CeOwZy@y%`VO!Ah`8u0fC%z*`)X>f2_Dhv#=(&^#%g?wLO>0ru14)$>`h(Td97Fk z>Eru;TTvo9+Z9@nk%ELmpFN9EFx{5|Z_g2Qm>Q+kt|*R&pFSM~oK5vkOeHZvb~MmD zW9u9hV76lzDyO#02EMARwwb2-g|V`$I~pHTE!EM7h**9gR*&%;KSsG^RL!r^u!dL& zfL})vhP-tu3M^1s5$$-NepWYsr;vz}*)apcPdRfm@Ner*oDF#Hc>sz*-y|rbYwXI@ zQMXl72j5_BndakXDazu8wka#~>pY{wABaf~gh)oU2iMFQ;qEe_c~@jkBvW0OLV_(j zjd@z@VXC5a*XzgTiXi~Nj$NGXHp^O7_E?Dv+K;lImp8%tfNsdJ2dm<_ZT#Al&BgcW zPCB}8cwpwJ_yGV`(gqI~&!T{6H~;pk*wxlGmg2uYxye{wUDr`biVFca%y&c*X_-2v zP|Yy91pvG}0uN?(1?^|yU>UAN%XH`n+fTZYBcJc7ru17-^05{s>eM&|WsS2UsxAPj zusM#|`bT+>yCS>c(qgTnW?EP+yK^)+ld^QN5 z$j{_kvs&InydnQ$GI%(auHWkQ%C!_6lQ5WN%z@w+%W2|V*-1d*=C9)UI`mlWGcG=z zfb1{V{C3K0I+fXNSNkY7cdJZbllUGNq!Y*vWp&%^hW9e;S4qldK)Fw^cy7IKvf^&4 zbBU*mh3e;EOQLE7%63j%)jf!e^>*7F4@aRc39K*G$1zNmiCVN|3ojs8Dq$|W+5`M|+M<+_~42mqFA`MBs2(jn|t|WY^eK8!Zs1`E0mVIE= zQ0Dg>ui2yc;s*w(r{H(n(Q}*{<#u|E37)(;A$$`grtppmoJ)FjEFZaISLTC|notmf9C(CCSz!pOc2nx{>iewZ z*7Mg00twUiMH;@kKgC{~PpR=Leq|{`$;d74og|nvF@ziY;?+@?n>Y^yY_aGQ0SX2` zsJw)N^7~O!OK1ofIBmrv%RiLuB&X_TzEq&MA+X08#pfwib>mX!kEGtHr#i1)_M)HbzCi%xb3a^ zPW1&8d4%rGkzVa&je7v*21v)U65PmZv+SgU(C!eyS%HkY{1ALz33RT0HNmSEqZRMQ zm;koRZHqBwYlZ5fZyMbbUjzgl#nkTPi%jy-$BSwixgkh3@qO#(4WW9|Ip|-X>C*~n z&942k9ZqBs@@P#5^cytmHA>_iraY^$BccJU>Q z&U1rKtQAbK)x5((e0Qiv`|W<zpjC5mQfJS2Y1O=rYIj?2E`x^W6(fjQ{@SNl zRaTfSkwrJ*RT%%G2?n^-Am0h{zfqdNAr6C`D`d;GmFs`(EsD<5%y{eS9PFQa{H2 zht0(Oxp)M|o+kv1B_M!^`(mwewH?00RM+QyVxhk)i;C?WRWgd04nm0lRXmuFF$PrD z9XS$66m{^DrH?JSPBC@&w2o10!FKNAVn#Peo)Cf(DiX@J5~V7Se%yZLy*cy))B+iU z4m?@`sm5;svu@QOuuc{`@aeQK-dCV>$7m+fIHxGi=1)k&u`N%@{(R-%1aS}u`i4F2 z8+Kn{YG&a8^RJZI&=p6&+}V!PhjTGDYS%Bz1vQKSLa^aU;d-#E;bg{Y6a+Mo&J*FaS^YVPd@P#&-Ajzde^T{z+Vrs@F{)&hf zVc&WJK#M{FhXi0f=5?x2w%PGw4W@!5Xg*^S(qL2i1P~&`;ncPAK~pNBTd7##OrpP7 zHRt!vYbu(+u8`pXKoruHsFfMJIill(;6TFr1K#NAVvE?qPPOE6*@eWqQ1k)ibb$U( zfPg%Ve9*=)7Q|Fiq=D)?njnkzuKO;)4@FLC8w+eO=%jHJey6sUQ*b7$FH51QbESHyBvw2zC6`#E1H7aKwG+a!D(WBUFlxpL&0nnZA{%HPxLA zx~rl8<k5&l&nI~LvrtgKbhD9*B87Y*?i4sQ0?rQ_q) zLG>jFKI1|9wt@1rj?L=m+3EUBL9{WiC0tbsj;RXZzXN#}A7v68!BzF6pOT@b_fpcV|~{qJLx+>+ibQCj3*Lxk-T^~5NQi;%s#Pj(7_BZzL% zsjueUyP$Ln?4g`&!1suWpp8&roMUerl+ueB2eFULsYXViIxzq<-{aEK(lR@LCpC^@ zAs}LZ?*-t+h9yAu`dT)%`sR#CBCz?(iRGFT5Pj#7%AfIY^C-1CBSmF2)N^ojR8Wk+ zhKJMI;H3-)uiN7A7bsyt_Pen$x@N&z_SA7ZY+d ztQ*j!`PMMwD;OCN`quHzt{*h8t}*yUk8XYW3BZ4*Hq09}a&?Q(9T?QMcsWy{x_i7F zJGZ^AYvoUnznKRvg)bjfx`eTr4H*z7~hDU95XEMHZUJmB^?B&O&8d z@!-anureSdw9yXNg)>u-Z4%l%lh9C2^)N`;?DUarb)8W$-vy?96i9=z$q%rxL=!N4 z^e4pLM>XuN=<+DT^DI2SNn$q~zT{5eITKUdpRT*@xr2SU>S~aphM5V|ux&TS#m4^K z-dCK_!_761>&!Qlk--?m;)4D{tbheu4L@3RQ4Q;nyz4%WZpJv}=!;ZeOeHLz*m0Bx zle|mlE06hRHI^mjfGv|bp&!ZY;!-u5N4;7ZBX2q=!sCsXRj}=zWq2V~N`dYb>hSnC zJ!{0x=jJuY^9m{p)KXy0t9rbD5yI{g2?5s!%N-cVKG1#Y79jL?W zVjfI-TnStnxaxzhV`6T=k-n16%+`ILTF=M`akX_uIu?Gl>OB#j)q6!I$>>))jIree zYN`*PYDBF*3-%d~-*^@Nh&PHNx9P%4&oI@)(l)uR#81#D7lsj-@okd7pQ)XM1}+Erj#oZ+Lf3imUG$4<@fQwY zd(3NPjt0CBt7~_K?b+Wm%;~&Z)4mv6JAu}PW^{NckR!dU`T6N;1D?f!*nhPEirJgi zxJ}wPL4Rt+2z3+iXAQFH2@h|BK|d&H_}(eiP4$@Qd}riLR(AE8CSzR-n$e>YAtue8 zgB$QOX{ksHWPkDk8`olU=9r-}Rm!6@w>I;pQQ<%lny|+m%jMltn&@RqxLMw3 z6zux^RFWUEODoDj{%*Ov4UV5Bw|WOEbY8lUz2S(C z&{`bL5Df2Wgrx~_Cx4FVOZn!O1v>ZDzg3)Adwo=xvg48Qb~uqS3uiMIGnIr3TOZ08 zW4H6#ycsK|3p{Yd!>w;hK#!sf(J#Kij*j5_IHAXN$@IYTbX6fqt0BwP9@H`Acwcy! zKu3#bNqvjletgMxmkgh^d|I6GO0EvhMg$N!d|V3rGBV)nyKW`c6nz?&x~D@c7vHo{ zMi|?M&IX=Gqr6CYk2~;8*{_!H$DH%t4&|TR0I3pf@h1)4C$9JwSrm{uhHJbIs-af+&!t8-syckBLY|CDgIhl*hakd(s z>aeIukbCrx7KTYh34gmTc(Xr_%kk3ONLz|GJd6C?wVp%Kh|Fv1GrxZE8-PalH6X2} zSZa6%j~l?F_ZbF7`86psA$zxWhy6R#1HkhoGgD*jcKX9Uw_SXGA0A@j+~tKX-xpC( zj?AYs)FG+!BmAz8B<6#e!(iKZxlEW+t<`${5~E!~MQT)UUI_f1CS2rnTXBKO^1wKD z71MQ@q!8rndL1kyQF;Tdik&>QvZO6eV#K`X1U9xScB7##Da=A!Z@FjsLzL-*j2=7M zm#w)pEwv~qlbx(q>(9tLwZ`J<8Yaz92;I3EMWK0mayl?fdR6^`3Rykc_cE5GP(%pLkeCmy9x?SfZnYA>paU)U zg_NN?-kTyjbddK{BO{Gz!-_(#Q#?-MCGyH?e_-J5Pz)jU&T_5cfXSL!y*PZ_r3PaY zv^#;Y3+)!%zj8dcsJ_gYO9PBtwd3ceCwVtsPLPZM&Z5;_DTRe2Nkw*HE9(tML`*=$ zYL1u#N+lya6d+|?2|bd>YVe9Bk$toN=mn|%U=NJl+KI)Bl1aH58j@ityu7c+#5I_F zC5W=mZ&i&~=&L?`GO2-{NGr2l34|B>&S1k+6Vy2C>&Gw1NHIBZ^s&liM($wj*xG8{ z_lJLo9joJYdPg9ltjwc!tw!23xhbE}oBeUD-dxJLU@-HEmL+AIBiit;joKBtGDmj% zWN;h7pPimi=XiY_JNFe=%%=FnK}hzEKrv|0=)98m>u9&nqe=Q^to_IEK0@S%rYE%= z`cVbs_>D+NzFt;21Gu6JKe)rhxR!SX*epGMdv>mLyYu5zM(^zyk5qAjz+-!fQW>B3 za|f?o&ec-2t*)o%3zH9I?2RF8HKLG)Ff|nYkVzKYUFjc*5HM2(Bv-M*`xkJ4up(fX zqgrs&Yx8^nf_EUSn^yP6vn6-`m6gzQCLXmp{4?Y~dWvu0g_B}M5>-31A_zdaTU)HR z5ANlb+S%1Y0&S(Qbe(lxWk+JIUsT@r9efgjsaLo@Eb7w)IC-+!;o2;n`+h34@T+OL zd%VTp8-1NmP{$oB=uQSolgbHYR;SA(p(#eryfXES8icwRFdrhF;IvoTw_Mrlmycl= z_RWHjnu`a}Beg}m)4S+|pDurq7J+dzUG7OEsj^xZ9m>V_()72CQ%Xe5DO$h5472K( zG$6!)xrq)XW?We_eSX{gfGKHLR2WO7~B^rw}%JWAb1h%9vD)is{I3jAoax7U6VwYGNu)lKPg+geM^ z3x@({N_4P!Sp#08ayz~1Tb<8cBvE_syRF9lR##XhBp4vn>W#aNB=DLU4i5Rc1dD(Y zXd^j=pZWL3%ekBHhOQXfqQ>8CWlq}3oeR*K5b=fV#%lMF@!OFiIE>em9|+R6D0xq?{ZyQB}~{UkiD5! zs_R`>io#!x)2I@2+gWf8aUIxu%`?RGCCwsv2x|*#-;6~%oXv7qJsR|V>U_0Bf8vxN z+Mx9#{?k33*i>Wj8jXhozu?8#&(fcbM+~x7BQ_Vuxr4N^X{z}*bVW!6lJR|`^*OT) zcL=pQaZppTYdY)6g8Fs7Rhw}}Gxx7^IquBwL)U7MJE%)COPt<4RW_ugAX}+-TI|N5 zuukp9nj;z&y_C?lolWX-W(}!%TlrPa9AUP4*L>)^2^%qu8AjfT$INKnc zazh305_lhJa%f9z8n`EJ=8T0RB1epvsv#L}B#Dc#|A4JFdy(w$?@JYTzq=lYz@*pd zfN8HIoz7t5wDmgv^m-%*>~y>qG}oza3Hxq*S21thAtxLJyG*+)=(kjMnF>%c>Q7_O zcieO)c032VS<7wqeQg(_&!gk3N(3?EAMKy#LQb|T^~mUbdu7LIVY+;uDMQZai3qQ> z2|J!eUF-|mA6dUu7`LQ}uU}t@KmBP0FbT&DV_J6KA+ByMS}7US8Yn4NMb0?jI8B-B zgbL#uGwV1V=wrkKyrl0b{9vn^h$WQam6;!{Jc^v28{2x>Gis})(7gE@a`l65$h^}d z8i(EII>etk?tLYOaFPSB%!bqXq^TMh2q~uG{?0Vn&RBjDOX!0vt;%|_JcAjM!9iF& zlp40lMQS#id@>X6*9>)QeG!#Su;xuQ;@8??3bHlwynVgAq36Ta;(yqzP8hTbn+Ia# zA#vJC{|58lUiA0m9IW|uJY7<1%WEr!1LoI1GPJbRog39sa~I(!h(_JWlq%loerups z)L-Z$gzWxv=Z$ynC3+o4nWkCLO~QaYAH{F@&)8?9&(f^#molKMrrbYxk==A@5b%ep zhLx-9n)p2e+DHCCTGWfrr#CRBZAA_ycFK=2JM!apPR9l{7wssE&f9giYe;?hPvPH( zByOE69uudE%T02top<>SzAb0^ukJ6uW(n|9SDg=|%{ET>oqh?>O};q}UW$Np&^a0r z0}UgP$uW-+KU9xMU$-u)sjtT`y79Sc=-n>Pf4@9r@p@CU9Vj226VG!}9v(MZre@Fy zxOo$W7f}Z0>_`>GbNjhR@7j-`N4g`R1^I#02uLJ^75zAq`~1wlM!|h_$E$_!h@pw( z=8a()X6@E8T3w+O{AIdwI4Txl0jH#hrvtGXWYK24LZZ>;$<5#<$>zz!8$-cS2hzu@ zaXq7M3rZAGDQTFbC1RA<%Y}eHqqW&c=?|d!%el3Vf`ia&06C{umi?t)N5?L>9{7@N zcF-d|D{||e8PhIU6@p@Ys8clK4O2l;9zRBP{4YPxKsWWCcld5kF*ok+?$YVc?QN}N zdk)q=e_C1H-qbK8Ni38)E``<<&zVeOd^P^6L#R=yLi*kK^rLe`G{OvW1DX72Q|X30 zWlTMpj8poNTdU0tiP&QLuj^N7!*PhIFj510TU}ZDYD?9R4xhWa$|yvvsVQ<4oo^Tz z7{ah0DZ@Cv*mykkrb66Qvjsf7jYlWdDjBlV-KA_mEUVtFKz+3+75>M}-0yLryY37w z-i8RNAoulLp<+i<*)d}#gL>EkI+6~gd07=ii?%j1n1Ea2Z!qLDCwCK?O{if5sUR@o zK>2MH!p~3$SkBKrQTtj(fklt6Fo8>82b|Hgfh15s0fsZv`U+qOg&+V1Y>-FKDkBI2 zfaQn>IzHEtlM}FF`wxTq!N@ZOOiRPXw}kX#Aj)50BR~kK71STBqZv$HKIQTscAp;2 zl=N7RV-EaB#Yz|0vBC=ucHS`v`cVd==pn$M5bb{MDN|Ks!>{Dkz}=RIh#*y_AL=6k zjj+fz5sJ5sdc>60`}~i)4_k0{jRNV3#h4E^ythPsE!9QKO$*cZLfmXF%|+LSRaV-y zyE@4uBAn!X5!z5RT5P=(_EV}ilLbnRb8L0T9KPlt`1+J?Gd^GOlP!~1H-5sg6GSZD z4#WCj8woD`tp?8G__EMI6}I!2nG!zQ&I&Rq9l^)SgtdE}shabfH`$B!VnQJAja>y; zgjNWR?tPWwsQ*#D?_9%&$wr{Z;J$2d#&WFVix2M|OZzpVXq*V}3Afu!NxxEQK6wP5 z-qhhkskydcyT9?~cO)m?4lU> zE85O&+d;=1?DTe`t+w?Cd9{y1k6|op`t6Mt2tv1#=Fw>b?T;69tLM@K|M60pe?3|D zH}8kXXWHKSTd9r|KfW*50~fr>1mF98xnJNGa@9tHLF}65 zetMR7uv9Q+`|W#6J0-s20yl&BG2Y)2AA;(y?U2hL9?5Ba1c5Q5;AJ317CR2xc+>GO zvlkmh6C~F5wv*z_8Jx6E+lYgEjPJt&p?Ni{W!5=!VJ&K#wbI<>;FRNJ!t$r}){^(4 zbtaRvP*J#ih7Ruyg(=j$!w{H(Hfh~Gk>IgxSiBcPBY!TM`F{Lmtd^eGfB%EPDom(e z_ct$9r7@eQahKm`Hc{MLg}>YEC2P(EAvR;H#t44NYTi__7&NKz==q(*;fUYb!S(LS z`Np;o_=5amwHn!>4lk=}E=xU(&fSbuBhk`u;^c(ka?WwxS6Y9$taUGB0eW6D@~+~lVG5&KjhGlA*GP zClcKW^8Roce6D8a87^HnBf2q33RzlRbWI`6X^O4B0}id65uQz*pzughu>-tn}gXwg7c|iLOC6WPv_kRf*Z1(NG!$LO& zzaYwx!{_yG%+BNz@(+P`N+e^SaWr z%B?NjSCRN)<~T}lDIcb_adQ^Y2OlvzN2&d`=%~pqj~_wH1yLl(Be+fF?=ZPovM^qr zkiP&(+T*UX;ykt9+IwSW%amZz^Gn$#)+-aIOOz?m%AWDaeJxvY{rUKidAj4BlH&%V z03ftHB7J(xGc&r7xF8$t6Ss8Vy0_Q^nx1U>;M2!x?`IpXayJ>PzdaV&EYEW8t~-fXmei0R`w z<(k@Ray%kZE!NpOU*@VW zgL$|}I)50zsR4JbI^|@Csh)NaD$MZk~r^7>P(Ft9xXP%P~SJ9AWPIrlDFmgCh%a4|(FVg^!31JbgIKGB zeoVQBIa>19_gg+FA_n!^qkEfyAEC__hrO1Ke9lU9rHi~6JYAA%5P5qEeDLz=YIYQl z>XQa`1tRDBP`Otp`T2dLa8PqfJlo11GUBG)#PPs5?+~}KGyMc;-&xdhnNS^(0)q!=3i`v8#^H)zCPfHkjs)Dk-3-P4~5WRoiASh}qAa03zvn zV|;r%ea-5-s?tthd#_hSu~hPrx|LZX>NX3C`cgTzsL}BL3To7CYG&Fqqjc0{{?ul| zj5QujH#g=dVyrzroPolG57^+!oW}A`hvgR>$f`EBu70#QKex7#s>+dRPO9MOu@b{*I4>v+dV?OLuz zFe3@hFT=w4J(xWFHQTE(H=Yqy^dDFD3+Qr%+i@auF-3@tt?h3iW3_)5_kSaIo9% zy+gS8xPz{K+y#xSO>HbaFTMuU~J-UQ34S1-U`?!6)7vXBp^dE6;N@IUE%P-HMm2`QShS zw2nI_X7Ne-O_uf}X|*5Zl31!FWeO=9Ao(_v(eik`m3Cs+%YcvQeI&*`e`UgB_y441 zm$`>ZEw9u}tov6!Z1L;H%KLFTTP1@TM*hrB%aCnd1uDiWwxY=pbtmrWbwNx*#A zn|h>BmCfw98z`f?fW-UQHqI^1bUIo(or$4Dzva)EKyL!IzkVqB2t_fOJuS>tP+_5Na8pr z-+W2KA@G}m=e~X`rZ7%6DIr2;O{+^D8J)g1<^q<{Vy3aWxh{gh=-KG_Zh5+`xJCyQ zOKRY@zl^zS?2F>obN!y7qHY@M_(`!I*w;2b4?a3JnGyVYT>YgqRYu<%^|+{%j%h-~ zdlw5u5K96?S-WD3(ZQ!1A>sfF4oOsJS3`4jk=SwvyscVDQXWhDsw?HeZS?04W#x#8 zyYY71FY>~#F`TTDAX7A$C4BI0R$2D(3@UaN zZ`3K*?yNm~_krVxZSYL+w#!U-6K$AuuEv?P3)h0CG_HZ&J>>S@g=47=UAAm2!yc`l z9_dgkz@!Y85fk1nx33IEc%y1W&JI>ikp~y!2bjb3bll`=*z?O{rw{!Wm0yG!Qg^To ze@W;YLVdv&Ery3r3God`-^T+Pn#z=^(z%e@zc3ce4&<_E0gJ8Oo-hoATQbU5 zh_Yt7mX8o%;%29(x1}e^lELuJ4OpNEG1X|cIw=(R4)p8N#*cuyD9C!_$Ia_#I_i0g z{f$d6@hpvV`h%SnRC0akW%Kx3SY!=3xUu@;U}x=q1DQ*sC^*ohu7^~sGx0Bn-gr+k zpUvGWGX8=FnhzO|Zp%3e%#`Ka?k-%I?1*VCF$EQ)GD(dU!il4TBWcz_scY8Y{wVKw z!Ua#1w1oH=s~$jr371`#UKaBQWBf{+hr4?#rS$lAJUcf3M|m7C1n!I5Bg+xb^=|X& zEI~KrLM=T5u-IsFSXYFon?+x2(u5WJ=Bef$aU)~>r1_lLWHc1Yf%F!ZI@=+hT~)a>1jybA9i0_^RbIj5Z#fBQ1LFF6(i zpwfab$G7+(3fOSYX>yNQxdIfEkT%5RzRT)1nP7*A07b)&qH{WZ7`)p7U;dcx7|{`A z>F8wHu#tV6r0yp{)2YdTU;SGU3)3`n8Ml%C{LFH6z4^;G6i%Fp(G(FBgvW!v%Vu#v z(W%LPS+zxDcK8?<6?mh1*$H_^rS@)luZ{Aq4B;n{aoYRGN??#y#joP7EVBh6?QP@l zPPajmFW*J@N)5W?^O_=>h$4f{*?BD%>b*43ky@liL5in&H*u?<6SvJsbgR>jD*X%z zKy*d$xT1GcK875;@5tk0@77013-Z37>}&NTq0X)#Lr2KAyB=b#tL+n|KQxYRFyBt` zS+Qf$h+(XO?WWZ<=F{JM9Jok5Qpn2EYTWk-F8$MO5y*Z{CdYHsbUg_W^Gyku?&ECO z6#%V&#`MVes^={q1D-NzK3P?{>e7gpirD?AO=c zscyW8MZ=e+to(s z$b++WI}iRQbSO-=m9`oh?~U@TL8s0*rG(vZV{T5gcN|90iU^UR?|eldq?elvdX}uS zwS6D)Ieif_b&^;3A|4Y{z2eem^aL%mUP}hQK-jV6`TB}XYiBdwY1r(hKLJ~$_$&K= zkqP}nR7%s<0Q0c@QR|-HCr7N^=@KRN_HnVMrqnuP+QTzs7+B(ftE{*CRXjBBD_y#5 zG$oFH*R&q7FfklDQncLQ$tUMRo#yo$MI?zw&OAbvgGVsY-pBBXm0EeAFAV{FiY!Y%{$JIZKE zNWF}obRHqm%6pBjSgv#eo-0_oEgnBtDL$L68oSB*C$Y$&n_3@addh$>R)=+ikvu8{ z9pJmsnew>OSQIsIqg5zfJ!&$6#m`D}34LIHMWS^j*v(X~HukRGs+M~haHrac;C$By zZ&n~kWQc}t(P6=>qijHZSo$cajDsd&Gq7Gk(``{9`%V8xjBd;8>%wVCQ*V%xb*~eQ z_ZRfNbU3vY>u=j1BRg8HsW`tFN&&>)4!%EtFpb}svZVi$jJ)CZj~EYLZXB8>u$hJH zifS>q$mda01Nj47m6w z|BWmC-vFQ4&LwpJqo5d{n4vQeZum)r^0|pEoR;Hz{{B~%IzUvFnhUDtz$mo4kZPVg zBCfR_ET+$#I$J~W&Qj;v<*o_Oxn%3jE}QL;O69x{=m-+q*6XBCdY=G9{ywy79{QQ6 z@*QWv1UEZCi0xng05{2kdbl%(_i_uVu+&B+ed1u^s)fhMy{otLFvrwFm7cSKZ6wTmn=` z!1pEM^80gmou_-?dPzZ26tvWn&s+7MKY!ZUDpQ%;68dmo>k^%pY#+|yk^Ysg7XBo}B_=~9m+Nb3IY5^=?!(J@g(<99K%{Y`hH#<+L zd|H4*-Ts_0H0d$e+xM3sb?$+m2^0vnSZ!2FeY@=IW+ZL*xXVj=wVuA~+KJJnW!8zy z#yuHi7gQH#TUSDERpYEVQT1eqFgZ3U@Zq1i>kS2OIfEv?3=nIYp#v;rc{;wYg9jN0 zGij1x!&T-nO%Ncwn#jwePWCwW%4gyKUx+5Bl)Ytm?tY_a9M8hVc}bQ#pOwjT3uEGp zRycOB2UjDL_%ni&P$?OpYi|<$4l&rtzB@Nwt+GD6WAWUT3gQ@F8qw%Jyb(!0>(-eb zkg90^e}uhdSX|MPsNG1A;1D3VLvVL@cY-^?ElA@U9D-YLcWK<+-Q9zG<1UwT=FEIE z_nvva^>6>#-OrZps<+;%#a2-eS&-PX^1g16iFq+(_h4Ev5mRTse^txq=*%5!j_p#7 zK>~;%gslYzw~@71SmfjXR48N3KReVle{mEe3FMAC&_pg4VU>`k-@SP^Vnj1NdLK@* zj@9y@q}rc2ANCJgN3M~;;50y#pI~MB&A|G!5G5V-iuON@hKlla90r%8SLwx@07!SgTIx2vQN)<{>f)loX8rrsPBKVepxt|aF;X(GF3y7pw8_HWRerNbeVtb4FuP0nIm|mG z+6=T*N6X~~UYOtXT3h}ufn)2NRnS?P$z(Nh-)Zvqf;K-8ytt;I zEp&ECc zTr@MlZ_a#aF@EJsx&i)<4zmVvTb8i|a}ypdf8YO}BN#bmt+&r;Dk zmn-Y+YsJwsBi&hcJ{kqORvp+h+4kol6Y$LKB+$lmr`o`!ntl0QQ|m?IrO1BO^k=#`LjbulyUpraQdsnmArsbw zf&aZXlug4@P7ajFw{ssGBSvP1*E8Xzmuv=mR}}nvDyY)N!Fo2($+~=SKAxvfI=|)B zue0a`s1ALB)~xw>+v}t(MV7WB{@p$KL~w}HlVQ}mxx7$GqH$@e+@=F zCfcPP_x`!PR4>Lq@ILXp(T;NVgmfq*_>E)vv%i;cmlU!Km&ls)c(>>k@$2$^I-%>Fu_cbM^-2{4I7AC(E;?@lGw9s)jO;!zN>M zQ{xw^NN6tgkDU_qwALq0sC)w+7eUc9*OQAZ?kpceRoaMpClLJWQhbDcA+x5+TcLQG z`$?w-oe1Ee|7jA-V3OnMFB}cBK3Q`{tu6sU@}Lpo*D{RUYw}3^vEm|J6O&ITJ3T7z zgB$L!Vh+v_US{_+dZk~eIiS_TjX_J1xa>)x;p`24=&hu<@=Qrf7zi$C)rNiOx3!Xp zF3KgO?e`w9F0LJd=fyR}VIvt6V4{ikW}x|o=e3!c`G#sMX&~y>*JYiPuPfzin|eSh zIQU$?-cTr~1f*iUnZ?CSnL@U|;=0}x>imDAM4u^9MGk;y6oMoG;%*Z7sk!BJSO~y& z?hH%wM=!mmx;nXV*OZb}+rjI6pttoh_*c2ZV*f#9`4UhVYv<~9Jx=lBvvSJoA$;>+ zJW^-(s2QySlt}#J1Oxzp+VpcUiK$G1+%U0>glI<;7JVZ%i@lA(#YfGecYS`|>E5~-5 z&LF6@lz)?1?lGi<~1DG>${UYmK-&6~_SRQH9 za0eW5URscHWzv`Gk^GV@UFd2i2cZ5+rIB~6KjUYbv*o>}vj5v#yPDJ)!$Gur#yQwq zccXk!DeBr;m(nnzJ%6QMQ6U7EGu6xabDhc4Zogli_bptt?s}DZ-GBFcc_MXz3=Blq zH`COX#UT5g>7Jp2y@kAZG(Ze7{8sI&)L{Gd!keBHnZs^J;%E>mz;E}HDH|k!Sj(vL z&rhaVGGT62aH+2RSND|PmCKni6MWTU_n^~}adkLmr1r&vm$#L$S%#R{#)yHkXSVsm zw!R41%EIp!Z7kQ~)O%X;1ap`YyE=`@FdOo1+ON`qvJ!g>{j97boYECH;=VA>Ui6dPg8|l&ken z(D5N5AuY^Am2yw(^0}l{QkyQ55;0)jFo8TNX0^Qf5gx~71!{bqd`C|iUVWO1I-LFD zS%FHR`Kf7J+C>S(mZ;+&J?u8DHrecfxpg;=!LfN#H8+>Ww=<=&| zhdXIXTR}&a*7EFm1Ww&W0_Ne_(3cv0i_w{^LWulLV15y^G;T8z*cQgg`Oyr8Y%+sRgH6ijdB~pJ zME`i1iy%V*8o)1hx2UM#pX)&8F#Kp_R~70;I%I*wblL5k&fl$#|h01{6|d8MzXz zX9WVFNly=Hb7lrV{m4$7jAc)imTW+J8g?%R0>$T4rUuTxY8Afmk*QiG$Pia!sknK$ zN>Dr;>a!?0gngs_P_XvGuubsw=gXY=1m+^jAs&Vr! zw5P^c+F`f((H2N6Nxm@4NKsH2407B?E$}7qpfvtr8I2AQ$+Sj+4Nm`KE@`p6^oiQk zF;y52@Jp0bhD2j%_sg!M;4>=g8OKIgR7CVYman^yf-LFZrQr84oKYMN^quWEFrAHz ziYq5{pOiR=h#V?#&3yd+&10rzvlE0`^=4jcxQaYgIiz}I;}PLLJ=s!HeOvH zqfIaW9z-FtTofMnr&c3ETQP;VP_~RRsezs!Rz8JuqWbSWNf`&#cm8@h$H_v^&xHk> zy+c*92MlXo>3;}-UTysEn*tVR&t(oe9uITNvaVVBX_n&XTAcPpqk{8s${=ZoD1DSEXF{Ov{eoTHv-1|npp`Zl|C@bq#^6(`SuXMc}j>_zSEmkSerR(2qCre z+ziK`yoB?0kgiEtiiGBMHs+NyZg9m>-S{xhSNESbRAb79lYI2{cEvX&<^d)#3P6s*M7q{IP1NIV&e=tXb(|H z=#A%L(XS{nm~NxVeeYY@AJMd^!39r8xlH`4>);4e+X4F3I$->!t2b`4X@W}XJ&bUQ zm*J0S?q@K?Nz*M6Pm`?b7k7pW^`vd6R<(dTgGhXVCLIjR?TU5Q;0i>0Au6Rt-8w>3 zeKquDj|Urr_sF+V%BC<7c+HDJD+&-}E@md0@I)?8DeId$;Fmt+Of4dW?(Gbwzd8Xv z-@R7*)XdM;I)u~2eygqAFmA(oc;_2cb#^%Ekfgxf#L10I_T^8i|2nf8TvWVzeq6=~ zP+N$EDpE~Te6d_TZ>RN4wUYf=k;(6&MsFi36+<4<`}ZdoxwH@?i0SNs)v9!Q8rkLrVR1s5ui)rWZ_dOJ6}NU>_2N+G&5;yRbYC&nh#G6<`(j)R7pIZhzD zEHBLIrsPH3ta0RALCIR8D_9htY|*{s{corNnD7DJ7R)w`9!%N?wStPo@WcuPQQd}2 zUn?Ma8OAzsj#II!Cd54mU!ua`fSetxWrDEqTVO+2PQifog?66?NC-d0EZ zL=Bx^SmEH(_fK!?dFr={bUw|Qw;GCQwlr?Aj8xWgkIBhxdR^=Vy?9`Sz^zu=b$Xi~ z*^z8PwJ?!Uaj`ibI91De;=&%+edTetX>6!S{Thcug;mj(aBIMVLuNTJ3%iEjOxgK` z7;!Z!b#JyYk|LJKllSL+Noej9@X>qJ+JEep_vtJHd^13u)b}b_-mEuNdDdnY-|)0d z_}u+oeP|2jEch6N@r?SUrw+!gKtoPry1K}`wdE|L4Ca%F!*Dtn`#XDIy9);p!flTF zBaqXX7AcUhE4Bg0^K;)4A_%a{e$M8yvZT*|<)y5CbJo>vuKz{#P;^yRbP2frG^UIM2h>E*fkJue)jdjJA!Z_9UbjxYw0GsU%~b`0`k*%8oQl2oTHPBs(4^? z#dupY!GKQ8N}Y`GXXx;`i|YgZ5rHlUwU!6VpF&b~Ft9SDTy-TG^Y8Z5)1m)6cK!&ySCfua10Zs7FPd|)FMZ3VI&xAWiGWRp(jX)dQ~UH{sW_h;nAeQVlyX~aMP`M^*ACIYSFGG zwL}O2P_g(?43$qoF#{ujA=z}}_>RKG;yk$kl-Pt1la6vk$|CAJxkW>3pwybnVNTJM>fJg*0`H)hXP73=CgFq zbw|&kQj<5eJ@16uzEBWat(bau5^^jmQjSiCP=g4Va!>Qc;2=;BlUaW=@p3cgq(hVz zXU5pi17BS8T6t4@w*z5Go}=F~C{4K*$T;k9ZN=lrA$<5y1C{pj)7egVd{!i!Mxim|h4I*u?uhtq5oKod3_?Fju~C;xE!+t4B$BGTsl!LloU6V}#Bp+C5N zExAzdU{j4GXOn#iwwrZEk-HsSy5@Zv;t2I9T$oePpP1f8z(v+MMYk9 zIxp;OcD9yMHlfN-8EsXd${qF5^?9JfouXf$Ge=% zJHv@soK1J<^6hIiK$67CLTXq3Km`D%WpMhL?JXw)F51t;drw;k|8c29+6kCe_G`Ie z76yJ;iZ~mq>#IB7tVb-W?!r|a#DEUF{ckQWV?s*AbK}Mi2bmM?VT{I^Jdhf*`)U_H z0Y(sPR)cJ>Y^c-j475pK_h^sLXDu&_U@PZ~HCb<3Aje}vdij1k2aF*f?a z{rxgqG_9@K*LLH*JVCfvXxuMs5SZ8qn zGsP8L=ox9yIlbflLvDAc%5%Eeu`m;VMm*J#mZp)L(>^Hs>36#cv5X zV)79wh8=FLL-g2kONpGR3G24WDu$?i5fRh#6fZ~-C3{)+-|e&gC@znb>@3yS_#8%8 zr^3{42dY1WI>+S1&gi2a}lY1h{ zQ>U{0)ROE&@%?JL9?^^C5I!Q6%&!%bakvS#N9uglTKZ0mL1V-`u;6cK^;;7K4^Nbs?>e!iH7%AX-%mZ#60Bac zbjS%s`}#S5dT>DkqR;7=`bS^TsXJ)1@#Wy#vBzIdqQ)OGt3yzo=ROJAblA?C^`2L} zpSUbgJ&Q)2RK%J~q%Wzn`xU?>AL3`!UTfrGB}O&%gG+uW1U!zUHt>dE-~DR1p0AW{ z|MY1Y8ycoXNf$}Ww8ZFL9Bj%NmDkJwM;>}Oq4SF^J-|6EQK28P(W z)f|;W;cnvIf(xs%j;txwM@MI$(eKTvQ6c$SyYu)*G9}w45|6oomK1aySs)>)MA5fo zYNtUas@^zq5xnHejL4q*tl!BCv}ToiLYpJNIGpn zozqbzh4QuSIYpGRFg0W-Y+RSaKafEcRWttED^WQgRl5;y ze^w65omwy0LVRsjE&~l?Pz=8TCu7gN!(g}hITQN$JhrN~bNKwQw%Wjhz0 zN9QbUYPsFpb#^fO1+Lg>Xp|}%uhFJBEQV$>6kgCkrX3h5uX>jaL9FP@Zp7)j`t4a^ zpO}@za<=;ryQcIKCNRct9_#(<@=lREKTk@-N4cHU)XZ_An^n2nUAvyH*Y#`b3aC{; z7!?}7>ZhJ>4AAQGYU=)0R@W0e{w6vG|BD!&$yQ@a4Vp!PPTQSYa&}kYKzH>jZQ3Ra zynsx0Wnyo;nJZvBbjNp_{QeTtiTuXy$Gel(k4J?;F&vF-%R@+8=~esv<>4VkLD0>9 zi5Jr^|0DkH(EAo9&~m@9MtyP@iM40W*XqGBadcu;A!@qL^>gJhBuvmY?XxQK#BCWD z#KZ93#J5o~kIG(iFI!UbuhKp}ucB{MgqX8%Q%Bf7t0aGT%&v|hJd{$gT~DI~G`)U`{UD?Oa16t($nV&M{>u&Qyr(^gnFefMP(nE#S&T6Da2Q%ht zdpl)~)OJ3;F$eqt>JuLB6tN?y=%nP@U0|oO^!%yDURXF(*x5VT3Qv?k&;qr2k?Q*X zWOHLwpKYe{q>@R;y>Ck_T^mBcKja^|BI4chS45bAZbJcl{59x5lhGu;7h947hR&8z zNv9@VhWzikH;;oxqi_!n2PvxzHb2-}Nvb9Xyn=<$h1voGyFK3Ag@t}SY$LVioG{uv z@BGc)+S2+ic=n$zz}D6l!RE@fgOmrozX`k7DB63689rS#BkGKE7f6!B*ETYq-Ixi9 zeUg&CL%Y*ds%H`bWk41O8mR5HbHXd-=&`;)TQU>flA?s$Y|?^~vuS!;Ii1x4MNGG@ zV~=CHxQuT`S!gfta3$i?j@R4V642qIvoX3R3@85RUi9wO@wZy4kROj8xTXP3XQ`8d zp?7Eadf%E${_axrEzXS3yK6kw`U-c(b0oQd4^-Vdxs!HlZ)zygwe5TE!W(B$DNegR zRs5{jsYt*6(tDR|3d4S6SFn@sGaCEq;aqDc7Ro{tXdpmfpdud?D14nGh+;YuyExSKhUd(D2=mqD5Qd*u}3VdE~tni9ru!MJ{SYY?c){ZWcgfxj}VO( zzs~^GEE`QVj5cM<`+7jM&hp07e&QA-VqvEyGjEQqORLD4_giO>feM?X%x*&fAvp)L z!(4@pK7(zS%e4k<^(`uN^guhM0ch6%M57wKxBT-}2#%Yagb@>)1^_9fMH~+SK&6?W zpHzXhrNB)=xP{QGoXUiXiZS1x8JB1zrlOBvv$V9^Y<$=BcYB{!chj7cI6H%gE%`ijHqQKhFxSYwWBW z5#_mV`)ceJ%@Ig1XV`3jL%4;^VXsFz2c;TA1jizo|=); zCMaZMr%X({wmHb5i65uh<}uMga3&z2&Pf9A?&?h{o0Hn&{s5m$0*?FReMSy-;t2*W znL!P^th@BgsLwS~;cMZacP=rIy{MG_u%p5Y%cKA@dE;Bq6)#?rm@P*Hm~-R)xRto8juXElz^f&j}_th|A%1 zPK7e_KMNroE;q)G3gp!F1D0f#PxV=M*!xnJ0516!x$A42U1Rex>Csw?l{Pf!%f*0( zfv{WrK|6fI)x7%UL|(0-vGyW(;V+w77%zVuQw}$0b9Gh+eAnfYKjy(sm5g>NwDlkc zX<=kyY1u`lKp7nh47<9NEqR|nk)$r)?L2O-G+R6rK8<25&mU8 z=d(t<(auk6Hl|;5t(}?x0YHZw)h7@$Uzo^fKIWS@xhhuYfi8a+DE~Zw-KZYBMRD$%Y%fXL(Ed=I(~;lb8Ehx~o>r|rQ%JH{blUAZ#_3HSUOJJnjNR7#Dw#>)vm=&IwFsQu zl-O9jK~IF6^f)F2uBQj{ymsjAoi!z~Nw;~!mz&Nf$7;^`mGz#J4Nu|@)TW34FFaRk zX}QYLx_Vxe)Ax1XHzumrk=tONGe~B{-eP<43t-booR_@Z^}ud^5;hI$IB_b37cxL8 ziJ|mG-TwU8C=5arOlS3+$gQQ!2sD~q7;kYhx{U7&F{VEr_@-=^6lknAZOjD?$ZnGh z2N1hM1E8}eA>bU`bRmVvoG?hpf%5c7Bni8w*wjbcZRw5xL|mOiG*rO1x?_$KcFwDb zvt;zMo1?r+;# zMSbyL@(CJJ6oU{p6qBwq26J~aG#Ti?dSL@WoUj=|J)~w8UtH2NND^XCVV)4bZwuoQ ztBTQBha;_B}x_K%ZopZ&>PW7XU1K^KnQ;_}SO)sT4#*I*MvTe+l-Xoay6 zRVMdk>S=bfhg8zd`$bsW5OD^&yG$|{oLymoRiCFU4O2OGY<`xX23 zC~A3WNUZhE=g}}X>HsM{CldmbWM#s|Xz;S8@wD~vO@UK5)~gFB#-mm5!sf|qhpwZO zUOj&pigTtqdNp67iu_{~Ey*|l5|FPp!s2AAtD09hG49G3{AjJuSL{5QzoFqR&mFjX zn$hD}fgj~4&o|J>?pISh^`P=O=Vgx0JuS(FzjO7JVVZr4f*1e^MevLGHt1t+ZlCc? zzAzJu0<<5=rVz?6$jrT%4nmkC4PQ^ajegZu?d+#9D0FJ``?jleW+R!!WSzGO4N?G? z#N7fi^Z1)*hw0HTggH<$_biW)v zcamcX004}Q^)bKN>TqW}?W`WmEUOX{7sz!p<;#^MP~(UVTMRA!{V3NglDNWs`8U|* zJMSW!WXF3=+nq|I?$T*OZ#6SX_}fGx6C4Tounb-PxL`p>$L5pUWq@9XbfnxVUx@r4 zK2N3a_s1_3!Xf}!J3{0~s_#+8HIVBqbf>d2jC^go^e)0*TjX`we!XlKb|vqn;7MH7ywlTsjTS z(vPh`c9@$wh4+UMm_H@NE+93Qc{8-SUa4qa#Sfglco#ZHt>CH)k$h}@z^X`h{aR*q z7^al?(UQS}^SXbm23)03qxSfi`uZ%hI2fiO_it!Qwq~MOQ9x}>e$D;Hm^^A;c^S9U zD%;VFObC$%%{;EMhQiNSa#{hDx<(dqBbeerW92=WyyHRp)dJ<@HHbLMbY1oXA3PM- zMHfA9b>uUzpGN~}&EI9Rajpt5!5aG3KNN<)%zuLYC-*UqM=-8d?ST;zQngYhNi`OT z%y^SMNo(9ZvW2*iwI3{*B_w{S`#ize7giw<)& z&32cbiy2|_y3t7TdU}fEb?l?R?>DfX#quj7MaWed(S}DpB0Mhw#Pabb-Ru}B0ARVL zsGT3eU_(w(#VTWz(mB;L`s<1^=lgNjHC=1qa712RHL;=Jkhkdofz{40KY4gU4Ql;vyNfGd_*_h7bl&#B#umUzqB{>>x zevf_LrOx=xjjHtDgoT&1ZZVw^5QEk51cNFgmXJiLd!WO{ z>TkMSkhSm4Co(dV5Xze)*;x5_mN`=$pOGyyhD)~TF>1}6(4;8?_h7|J<<^2PF5Qe? zJsdQ?aWpd~GBC9g3Pl3&TO1mQc_DXs%91FCgAhW+CxnG0o|OIO7g_$@-W9MorHh@2 z9h%~C3i9#ak5sSl(J4^R5A)+=o z136)tSSbu(EF6qnaD;gFBaz@O49#*-4BhoJLv#9rQg9yKae_Xj1W}*^079mp9!*z_ z!1m`OM&zJLn6=|wUZ7*h62U!!$%H=rlj+DB^Vo0|dDzrIfwg(w#VgfL0eE>`_P9No zkBURlUa9k({&UuDxOl-HW@=wO{$b-K-UP)a1y#J@DKi4kF?d&uu_!6;Irv_5Um|8m z5kaox!YF2Eu6o%G_JM};Qi(771Mps62$Rf@{aBualKkPnuMUZxlpY;xDX-#Yak$Ul zB7QfjvAoyS=icSU*sdYj<0Q~eshPRHHBD$bNv3}wbDQ2$hmN&53F6VoWxg_{SJVXF z^6}-zb|`5`0WuT_K^-(=x*wLw8ziY8~Sl+!@uPf?KNVW1ZDkE(>{Lc z>iCY2ohHU|G8ie>soBn$dsI=d)SnFmGVwQEr{|ik`;;3}VnHn7Uqnt^dc9JINf`@9 zQFB?(H%7j)*o;)wWrq}C>F@A!JHYOY;20iqbSSiLY2KuOITv=Ng``ruRwf7`#1c)- zzgVqkG3w{_Z?fC>`~S|l4aQW51Nh}*-@n&V2d(-pblqaj?2>9Pu60Skh5cIe#87KZ zFeE#`3UJP$WBKb6)?iz)%XY?>-$^Y^yzZipv4#feNA3Q)cy~d^-8c-L)lDhxZtSyD z82J#$ckU&}90VANXwumgm}^>0Ejf#gB7~4V?;MLI5r4_Z29}PE|F<02r1{OBIwb=BlB8k`DOa`pSq#dX0KxA)TFlU9^O z;7*t20TJa}oh^+VH`gL)8+uxDZI$%j(W~Q>ZW4$x*kKbDFkfonLC45w&opkr?p`Jr zh69tVC$c$|jD(K!W#)S%A^Z<MB&-z^l+hpFmYPO zy{ZYVJJ|IS&FK2LoMYvSEjTm?l3S4SRVM_m7}^UnT1p`@6r*C z!ik`5ShIMHZsPQV1G!Gb52FI!zbJ+3G0?e$k7U8vH1nB1t$1&!`JBGOK2D5V|AuG( zfr6VyhjG-5oOM|r7Gp^M2!D_AnB}G>M+PYV9f8+)Jbsf|eU7K6rLY@R@eIaP3Y}+w zzSCQCmabW(>&!gXNnY3I_4Q3xt8K$4cXmUC>|&m(=Tu_ETKY^3P;->iuW5Ft3^%0{SuGh6(GB_|UQiq_($-$( zP){8jW;x*z7Ew#N%sdmo+(biNP@qTo2PV7D;gmsK9}R%^ ziwOik`pt!4muW!8+3$`8qoQN(m5F&dB&qL)7h65M%2=VmLy`syClb-Ti~K5H<}Uj* zK;tT<7D!jTBe+2RxS&NS@?eIF9xl8>dVib?vTe6 z+Kmczo1T&d2aR~9(lSt)N&@|XuWbxI352Il7K<%R?^LL=HSWi*F5=2E6ynNo%ug`E z<_e#PkPx@kPTZ9vqnfmhojRfWPl?zXWgce**v++nWD0TK zNSl1z?a42V>^)tAJFvj>gg)<-C#`p^?`9m zVnuid<&)(u&zz?i*oA%!_*GebH!?ot-75|x=J&t(8AH}q?YeXix#fqe{+^R< z-xe|hAdh`opGw$x98XS>6i0BNn+ne)74g=``y0@dGaV1Q_IslvEPfSu*A)?&#AAPa zsPR+an;plKQXGam*2oKBv?Cxabr9odyQmvN z(VyeP>+t^%vqK%9vhyn!7ssnfHH$mYIX}Jr*GH}JdQ68{DL*(X8i>m}Q1?Xl6!XZI5Ir3OdEzXS)S5J^~G0a%X5~P)*H9DbQAs`(L7G?sq-0X0EQF^(3j~n+$f}jr29~6Z-?z>~og~#QkN!$Hr!Z z9s90ltEX#knx^&WAN(H*tC55RFdVX9QTba52H+>Mnz<1l40NuW)7T%};I8I9H2Uyo zEa%LY>MmdP&Jau1icbciL^83|QUTO#EOQVuap;y%L_XxY9^71UOeDJt8jBY8n-JDE z1e7a-^btjxJeD==I_~snY&6k4PTxNNOk>C87|CC7{STUCDeji-f!e~b!Y)fCeL5wB zdT(yganPu5c67jD!;?%W-otYn$aJUO2(;)ap-S@h91))KevTuLrS6qvW2RZf68=i6x zyXw;_&1m4Tp65TeCiN3)V;5B#|Hv&bC<2*V?>Ln#kK~44lN_^DhsEu$FVxu?iBV#H zZE>z*csE}!Fqc+=*~RBwG#T|fSLakHvWmdS8)1nbna>e(Uh$d#B2MI{)k7?l3dC7g zcHc{`D2n@m2uUnK@49d|9rYAva|KyQZ|km=4C0d+Q)g<{s4PMzob5^QECQs=ts}3< z-Qts6C8YU|^1<+&%)rxuKIX8ndPgdz9y zGZ&n3bs$1@u)6-dX{#Zw=c_q28K-k8Te-J2-|A9@@h;lD@GMxNv zvk{J{L{wHS8b$nPQ}RHQ)ZHB#DidDQ>G-2s^Lh~q-~mkc*R3Bb zV4Csfi?Kc=3Lg{ZNb7a`A8A*zt;l+wu?d;Do`N?^2E&el&gqiKEN)+`7hy zqXY6P{*{bk(BX!zM2l)LH z%utF^neCZUNN%>fwGTY4`Oag|ZQ|}w#&^F-Dx|~xNBbuCguekjXVL!O^OT1E?&nX%04Be~XTLKU;3vu?b&aDsXD~x`-duIW3?KC~J#3+{=k1xk3{J3lch8 z#B<(*#-FniXAbpNgwqxWAOOzYd1cgOu&ykEHw)UA^r<+bak);rrLnCZ4-?EajSI|m zTFsrFrlH3FYB_;}$o>z7B%9mcvp~H6en+T9?wu@g(d$deqUh`gJL&6dqhVTUa1=Ti zXq+slJvbEozZ8<*G7Y`Mnp5=esrvuvkYo?Fd2+5>zdS_}PLi3B5{0ZsOjN8i-*w+W zk79r1Sj(>?_sdfH30f4oIeIQgaH5T25fU-)t6v^!SgzUiUJR4% zRmd=SCyg*DCkYd_eFelR|E(*c-87rTcEVNMy!&@p>^mu{Pz-8UTv~|en{;B{pK_r_ z288Fj83YtYWljmbvpl4#VT9wxlsb#L;XKjK4TVqg9`ZMj4%!Q)>nO6D3&<eLg$qKa(U(uNgF2pRlRQtbHm%E}(> z%*O+m+FNb~uC-pGBV&x81{-z;Cb}%ux1hH~+BQ{&lyWDRAzY# z8)hT)n^xVn>5b$h?HBh{tDk>jT=JkIv7K>1c_yR`)y&JT=7Z}-02qAOm zu_B3AtfN0QWGm*H5h~x^NG6UbHN-Vjng?c@j909jUq#lIIr~m5f$w_D4ALQj{j1|) z?5=NIU6m5?sd2x@(m|$SX0Bfto5}gpJg<#PV{A!EHN)~&oJJqTFzQyz5&{==XFWfW z$m6JUb4&Dp7fl%R<_zAP{Oza5pp#6KXR>}I!~7cnvG-P%Y52In%;YIs8u)aop>v80 z0DQXZ#bP{D{c>~CE%_=;%rR+q!_es{uS-a@iI% z%5|=p@UhDKkdfbbz7i;@0iuwH$ah!wF|xBH{Ws0|6E)2Y7LuYe&V+B@sd0Y^^^#q2f5HI&_#6(igIr&C+Hf5Z6t<4&2$H~7DL=c=db9x~ zr1%=h5^|TMl-}3fzm5O*T-T3>6jtx2>#FvITUL(KYtb=l|E24%OeO%p-En9VZ#RB0 zQio$sOe)d5FEER-faV_BdO{!5{izJTwRu%y*_8!01ztK0S)w!M`(zygJY1M70|?2) zA*8zOwdDi@TDS`WVeuALs|brx(15OpzQt|wT_PH~CO5xm@DtyARVf}rqJzVZdV9(S>wLm{MuJ}@CX^t;Y}f*KhsL+1Yx5d>k_MM4Gs8(j{`24<5@<_!LqAOhGNf=8j5=~bzyhA=@%n98p~k_BGYKLULte*Ax82nWAEG`w=qK$n%adI>M^b?{wTu|w>!=0ou_ z?YxxN!y8;W)wn*>UI)(W%Xo`UmQm>hLqpKEFy$vI=Mf8|0;bCy%k^0s?xssu7U)4T zXp3)!l`d0UkasTvrYnfSIcRxFaQ{mpYovU8o>Yl$$=@n_tbnbr*lRJTpLj2iFsZLk zD^ZLn+L>H_jOo@NGSX=iS5cu^?6dwD<8fs=+?ZJ?2EIp1Q?Llot1TrtsU?$G&Fh)B zT?Q^{gZqz*Mw=xh8Wvyz5Gi6`LA^KGH8GDZN{w-P(IEl9{xSW+)ysM^q=|(2AF1!7*tJdZ=CnQ7tH^2) zfPOdjNL}8vKcJ%NuJYmL|ChzFa#XeKSX8^OW=?eXwSjy=CS;=+ASF!Lu?!ZuhQZ*y~gB4#AA#fOi0*HYNjkMO@_ z_h5eVp(I}ZUO$Q=9-W_pm8SO)Q!{LjSt;piyrXEhxLC}}511l?#Kh7D8JHJ=W< ztHiNkU?LGNBVYZ3jut$x ztH1@}NGrWx zaY>li!puPzaa{k~$>4~ysc%Qk#Z>Ki??3;md_&uMMc@)ie1nT|o!fWe83jZEhg)h2)qDcw+0qLka{0}6* z##7r%Y|KQ;qCh8+F`QOmL_MvI`v5YeD(9&nZPwPr%B(`xN@Q-yajjmj`ucHqsn$cc zeLji@js1vAPMWt8d#cX*kq3nNal_P=%NPPoC@K*e$XDN)8X`0JTHw5ga>)et?gV8NXP_M2h z50;w!=fY40wa=5JYioMomWA{>?=GrOK=s7qtkW-J*L3w~da~?Cyrw2U_9m8*((e+r zj&8xc%0*LSuu<>ztKh1LH{XumUS~?hk&s;I??(3=uhsj0q$?WxPb{?jHEp!bVYA^H z1;cll^HUK)#<3fDb{y4@mkwb8kJT1aQTZTM4+*)4N9B*Idn@x`CfZ5s*-}+KzhI`5 z?U=npy-$}8Z{)A&&PJcHIk}U%e=I}kU@89xEe0ROFFaL`&v1X)i2)=eO1#Ejz&t6d zM2&Yp3h6kK(6s#mRRKlvpCW2}Ca2~m?Z4k%j-KWpq5ff_9Z?#B&Sio{7~@C5x;s)7 zSYe|wvf&>Qt{m&?S*O`%RK{dvkzq~_r#f}!h}iGej5w4-W?a0b7w!YK4J;K#U7A)8 zOS<$|r+~U74{P(&*Fj)8BF8r@`|A$Za?+gFu4gTl4f8XHWJiLF_E&Kfs&uSpk$fMrh zOmKN_J>+lDq|4q#2xin6{Iq#3fV zmH=#i547RCNk-x)dVb83)gWO&Wt}}gXm;zuP}0f9xPPzNbN#bIS803u0dR27pXqAZ zLIe*1xQe?uNS9owUUVka3Kx(he`~(lc(zL`7^{nyN7!PPIRwI6 znHUM6mTDocySLC(7vEP&UKf#y8AxVH+EGsIf3j;*mgNJWOP=5B zRLTN++%h^wf4F(R`ctz6;#k@pnrj&V0DjOTf4(P3qfN2KtN+e2R?l`(ZF5^fr8E@~ zY<@l8MHq2AJwO$m37twAdS<$NCYl^n41~&pgyC@Rly<82kd-`M=WjZdsuMF@U+rJh z&4#*4$d+Qv?jm%TAFfDSC_nJ-d7^F`TwpV+&b!7U^iVVEJg;ibCT)BnJz>7aht-eT zBSGXhBZ8BqR;3=~nbP3=X_YH0l(Vs~8Y>r9Gm}Y?(;r@3=oqZ*>XO2urO4};&frcP zPxq~PTo?O^Pp9ZB)@s&Y`^1;@8-e7YwW$5?UwtO1+r5jXqn5vCa6j|yxI$32R zn77H^7DvJubN(Kt9ch^`5t^~+);7}wLSjf){vB(U(H9HE)zfdsRE*3F0U)rn?xW1J+(x&lm`P!@4}zG_lZ%UGr_pY+u&GG5a9cG zn}T+i$42euW)9SfZ`%5dL{4or=%~g((>MzA$W7nLWIxEv`}Wp09yZFLmXhS+!5<9G zs#jju>A?yO8}D9X^!8FIK&u&Gm@%Qa=pgGf>>5tit{oR4y}8azO&I9-azluA?&)cd zo)hwVJP#fhEX1Nz5v)C%=QRLPWbhhsYc2Y-jC-k&Z4G#;IxPohW<4_3s_=^lgC?Hu z>wfY09;^l)q)1|;gn&~Y;)4=|)(X$^G`&TXjAo;aOFU5jGP2M?+s@?r5+QG-UY)~6 z*d_)ds644a>)1v9?qY14Cj=h^SU*voeY-d9f{RUrke z*H3?XFme?K;UG*;45*@sQTQ%2!YkgCaC*Ug#Xk{TnJiU2-%lRfadn}HAfOq#ADj3u zkM>IQd%5c6zC4_K)ZZ(Tty$0B^?1`$A@>9L@olSTuF5AKR)0(gMHA0Nd>A&FtpLt@ z+ieT54Qcc7;$SNIH1%1o8VAXaOpINAn~Oma3D{_nEN|!^GY4rq#S%4KwBNx{K>Pg% zy$px_;wvF(P|Oo4DkK~!0Py5}ti!`wK=XH8033wLoanUU_$9Be+~KlnOuX>2r{{T# zk5wFDHUMzoqU*cgcZ5dddeuV3bQS6K^LaE2g*2TA9gF-9mg#*|3muE#JIPLNink}J6Z-$5e{F7-W+MGA!m2V>B!D6;JgoJ9!Bm&3p`-^wq%o+NkVbM1E8&59 zySZ7%4V1>|1F&y(p3fY!)-{!WFFAdM6zCGwrS*-dWzbRUoV&YA(KmXluwog@9er*q zYDx>lSYX*|aFA@{y2gAebhN^A5P@!htqeyh_K9jB8QwM>&!L2#v-1PsJH8iEZRE%0 z6XFZaYLIFp!O~IrG;)>FvqPZ!{ar;0i`U3+YfEJb1YOtNWp1!*ypnu=v+6RR7E4C> zaHI{dYgTnL{b%6G<+O!HqG-m}?PTImCD~brZR;wRk}Z14cf(AK_dfDka6;=^xsPN| zFUew)?penAgp1?CXTcb>!Q5HKJBb(>Zz4xqP}g z9Y11nHB|(y$zjr@TwQ=U=M@B#+V7U`@WVaJDfFGhnJJ0IhF5hed1%wW#I^REs+g)5 zlFI)G;x}7u=ScSbiip0lg#OibgUX@T;1~lzb>0)>dTmF|YwPW9te^d9CNof@8}-hB zZN+~qO!sujYv!6Y&3LtrCXP%XLN92e#$rZSs;8yLCF1oQTgi_clbIC;LSXDRIx0u& zJu3=b;mwcxD=7SV`|0KI88vq~%76N>v4sW3IKP)2!jKd?HZkR_# z;BslxFZ47MyDZuJL_kX6p?R{E>i!NT3Nrn9xNj&W5n-8h9O>DiksNwN&4kv1Xs0N! z=5VF2i;JX~eKzY&Hx{s zvIsZEm9OA9RKdYf%vmP^;)q49Ut!nLy*H{9F)@lq3au$>C@`Zi*T>mM06#RF_@i9v3ERYW zjpxUl?a40qph*usu@OZ$fYf&>NOl*_eSO9xma-x!01JEnvnZsEcSWkgM-<8w5uip1KxVN=0aCbOZn8Ahl{YnKq{$ug|NoLW<1T$e=y#`lcW23^1S(!D%DDvJ>RrJQoIj&9Qw%vY;45ZfVvKDCqV(6i{{MY5%*Hep`Y-6+mAI!wvUQqNfc-=BEnnrTo%;?GEwj;R^?=8bm}oLtk2Kr z!wzYAG;E5Z;<|q>QEn3$kFJcTb!XUVo$;7W8-+G;&o=5X;QvcYc z>Kl1}`QUZFK5=q3e)9WlJmnJ24>fm7l`#NymfyBW8puIBidBeB%?tyO3U=&a+aU+g zAf3)3$$tW2gm4y#t#=}_1hWiH-#qA!UeOU>7pyOT*$<1dK2~SYZoqFf`TD-uNEa=E zWj)zO@1OZMW1N1~a~P?@`BV(2Nw4a{J3ddbfLW3W1RF|%j65Dl=3`u40p?H&`mQW9 zC?=Zy4r=@>`cG47rBs&JeJgK5k&XgRSrks>0+q{r(HW1xqbb&6%((3{H4q*wL{Y2L+MMFtp|$O!K6at zXZ;B7c#{564AdV(FmULu$Py>X!Kyrhwbs3-pD2M_%Ei86T*zct0YWraaf>QrzTUGH zF6CIZd@o7JN6z1;LRL~;uCW%}#;RYQzNVAD@2KDyrxlI0VvK=Ab283wlG{=t{7}Jt zWc~oZ6k5FoL)}w8dSF9|({N3x$`B&qWczhVVdhgCjjrT-X4T~En=S7_e)o_ILH%U6 z$AiC1dlv9l^5rtq1_#9a9MoyqPII3nfwCa5XZOsC^rqHzq8K$X`v)pyql>(JByG_r zacTQAs&0?(w^#YuQ06H19xP8rT`>1#K`}D?weCxeb+{oc^5o@ZE0!iX!d2GA#MDYZ z;Vuv#%I3(na4-CsbyPdkhS{angcTEC%HDEK#g#u=;L<95U3yk|)<0@EGb+qD*&5I& z1wdWRtruQ{J7Cz%e|IGMX1(5PafU$v*lA*o0S}ObH-(;}!&QY0A{UossdP<*+@G{H z&-!WCnaX}t=uSK<{}X>R-l13(DDzAu2-s+%1J^thF5B{$c2>t3Shq1lkXk`wM=3 z&X5P(BFs}>a`F5G&UEj(-M9-p^T{+Q7KL<2bxnWfMb?qE&=bk_CgG#pLR)MX8E?5s ze3WHefKAu(Ab#Iu?+D5EUE*YmZf%B$gzFG}W511@bYTk9q_~R-nFeWhLxpC5mNzmq zDj=z=72?v?TkQkQQbTP12NYod$-?-0Xh|w#AJ}xzP0hnd4Vq0hX`>NRvs0>=9qJc8 zu&Y6)4dJbn#~&{rz?L0|#z}#4!_XiAfFR-R&oFTbK_bdC9di#^M-OxAs&!2!)4^-G z&S4_)A?M2vUln*O-O-60Z~Jyvj2sTphP_W)z-@L1eGiLdi1bAS0$$GNRTDF-E&|VW z;na5ykUcGPH`zWwoNlxIafzeyRq#722fs6e8uK4|5r&PptLrI#y6ygKKX5}%_+L+U zQ~8^@p@0NOB^kqCC#^zZJv|S#cH^B~>)#*Uzi>DoFn_a=RDYNVCBuVK$bah+ZExXV zW#eqLUu&fi6co_W$IfKBjWR&Ozq*%PSVNskQhASx2$OE%s%8-u(ClWC5t-rPQa@MB z6;5{n<@cWnx~Il?+t;=u&vK(^%>x(EjqS2m+f8SFW_CNz2s3khkwpgN=5`j5Mj-(; zci5M!lXXN_iu8?rRw<$bWSIz5f=5~>=kueYAfhMCgaH6bIZy&Vms9f=`LE{dyGu?w zDy_Q61NzRSb-nZyeE6H=--J3YkBNoDJDe8a?j6{=NS(WLqf6T}kde_qH^?EqHlLSA zbETPBpbYn&?wx+a=P0~YVEuHB0FS4|?K*XJh5h)peL9^gaaf$d<;^pz{k=jdGksZ` z)7fePu>E)bNq%rWZ1a2rU$$xX4~`Ky4GP&Z=*IfJjwLFwSOStROOoxE&UL$nWv{Lde+nw6&o3#X-9wJPKH%95(kX#sAI=3oIrp3U+2D(MPCg8ts?n>&x zuRb^U^#KfnS95klTgk!uN8D&NKBqD{?#NI8-EO;=?HHpwZ4P)uW55(B=*oyYweBDP zc6GC-RgXdi?ywP>@{RC9q+5P_7OPg*s}LVSdH<*oXH+rCj8d8xy7_)J?D6b@SC_+1 zesa)f`D|>;9)h=Qox!s79DjUQTa0W_V+2VnumhWpx&*3nRj>a_L_xJuw+WAXzk1Qq1$4I?l%^+&qNuGTl3goTDsas z=wl7iW7tNxkPTciyPVzbSA&YV&M9K}yAPslc(W%Upe9g7pdsU3q2&iib_ZSxHQ3nk z$~9m)Gt+r&x6;n)TAnrRi_+kaJWr|gp380F^eTPR^RqN%t`CdZIj7z z->-Ns1+f@op|I}757H>*CV!On^DlBma@4baCGqklGsL!D{#8mB(%Z3E>;)C@jbd(G zCu*h!57>yc#>Y<@1R%qTQ1i?XuF<4dFV#RK6QkDAq|fta=2b1K`U<>>9gMh|lBvC@ z+1Z8mPhe8<${W4c5Cs)OkwGSILz6<5R`r$+h6{<2z(H(sWp+IO3P1b&Ny8<`<2_0^ z9ahT$jO>Lv?wg~M2B}WC45pVL0!x|wHYmHxD1bzDji`ST7mM2x04Hcfy?RG1Pw@b8EO#r`UH*XqW ztF!T^Jwwc;5C8@4PS;Cg#!QvNROzu0g2{4gN@_@$xTxsJ`57pAI37injCy;0+WFgE zl}_s^zoA78POm4zW`n3kKwo@%ojsD7iY#SZxP#`RqZ6Xh+S*c^f3ADy(V$TjS(a@{ zwlET97^cxSpA7Ck|MB{xL55~M=>7KM@tnH-TpQb)GNkGvpD59Kg>7X`roqttNs7Lm zx8&_Zqc3~IHm#TP_4U`{TJvHU>FN!$DJ;DZkMHEjV7b?$rAbMVx^g^hd4s8!vQbC9 z^w$fmYxS82^#v66!YF*ZMEx1C2&0vK?}D0lqVR4<%Tx267}Ts6u+dat;ikj%;*|64 zi|ZPde8#GuD0Xqzi`%ik`3Fq1r`)$YQ6!OFeDjMzC(OC(*=DeNg+T;60>d@lkL5_M z^H;zU2Ja^Oj9zR}SwecmZbTe!wcZl)VwgsT1?_bd7h<_r8yG|!X2Tw#b{kjzO3U{N z;S~33{<=r&q!*(H(*yG!KVcu?F#C?5a}Cvxjo~?spqqCWhgy!E$*sr|FLRV^kA%!ay(p4VwSaP4K~>XLLV-Rg~MbIiqGS)6>F@_cg-HK z8`2htE@_AcO%>S><7qvH4yPHg3v596nXYd8+j?34M#H5<)emMXKUZ6t`U4G;^yMB` za~w)2_wT5~9HAge z5DJX`6G=agVI6nn)0J#c>itV_Aa`#&)Sb$NkNIz%uPyF#jjDJ_A4VN*pT@OVabDZ) zo}(z>nT;M^Kfj2Gk@Qu$-G^`~42-ExwQn>_1`fyj!gXSvvRWlb;}+W-`(OJW(R8#p z4d&Z)V&$9tHqdNvpA)qFSnDB8eD#Y)u;=YNVn`O`1W7G8-Q(=fv7!)1#zWJG z?=roz@>OYGun^ueNLRh6K~60iqx?dKBF*{tAm~%GFO1z*DvFhZQ)~6mx*r2sQMVcRrTKT~(fm=-s9JvSbNl ze%z3+18iQ^W7<(fLv3}Z?g3G5Olpbow1@kPNIFe9RPG+0GfZP|EsQr0mOq;*+u12G zbS7Qp1b_Fhb<1Vee)sx*NY*T|`@vY7r*C(D#|H8%>xU=^K#H=IbW&uoa5`A46h2w%4(P|gAh&ySVU_5XHIUSQ9CwxSI>-J%048-A zUV|9E-G9h%r^;mknAk10_OCR*5Y;?h1b%B~5t||w_%|0ocK^PiWbX|v*SJDa>YDQD z)Xa8+rMO;5pG3m*bK5Ab3{0l^@4F^Q%h>blPrEM@COfI|_r?MP0zAI-s%OjX!J8{L zhCbWa)XK!r=3J)>G8Z%v(5(9t@m$r};(N03`eI^&UP%-6%qErv2E#6zf`L@ecUfMj zu_>r%-Y2?s^7rbdsrsZbL4>^bJEB=NBpj^tWj7ROI%5cl@0?|mi}}912#md)c2mB7 zgeHf$$IMe?8}RH=Ou6M+3XLLQO)&7&36FjlBHfq`XOfem&0~haK~O;t=Vsh%qt?~> ztr+VK%sT%dWWCSBo%rrPT=xJo6t#>*#A_tcJ>VxBrcD3-{W@=Y2LID7r{u-(v_K~P znZDG#vx{^okcEb36ck8Sw@QnXH*np)(UksWeq(zg>3OLTUy)W&KwfML2TDubhS9kh zt44@O?b_q`?|%ErqgYLae7rGrGC4d!p)R${E-&@zV`;!pK|+8oq3K~6?Sc8_Nreld zZPM9!xU3BetpZw&VF;u#0FXo}ZaSLKncu|mbazD-!P|YEaeI>L|HB-TmEp$9A}f(W zoXzvx%fIMSeC}5%C%}s5wb7!Uj;2Wl39oL->cH1l8aVsDLKAPs-YatSbuewy)v1yFmsA6ZHDu|;q~ z0N*mnAVnR2y}L2Ehirg$S}x`UW4pH7v^%S&Es_;y3%-Dcap;gLm(3FofBaYOdNW-J zKV;gJlJrTM!_@Mv=}H7!Jkx-8n-wI49Uh+Zd_oxBK>%;u(2cLk--S6zQoNj(D!wf5 z8^S64s!^mEeI@S9bEtc5*ni8H$hy+UEUZdGd_ z3%v|efeex+CD8P6O6x@842wR}GR^d8IVJm^QBR8<**I-TGtJ%O+{LII{*5q7W?d2P zgh91&SDqkJ2sqkIkE{WDC=_Q|=;zk+TrRiTo38r?Z+6K8?wHVg+Jnhvb}7%v9#@pp zNNHI*hD@XFEw;(B7S(4ivTSW3F%UcAytNvV_Dp0nZerL#D) zn^j02f)S*5#5-LWtIV}ksjd~Ui<9hih(k{`*SXWHwOy$WY&=88Gn%#Ro1I$E)NbQ$ zZ@Rn6+}$TZ@=c&0?5Qa{--*>fO>b{uKWBX@*3$R1w+}K)uq&j!E|>DcA)q?g6|CsY z7ftVthe-jpcyxOsGBW^ufg6Nc$6*-D$(k&#^;7T1M<&)Ab_d)j`a4kzj~oKnVB@sH zlgIO=6WiKR{+3~S$kK|m?A);6Prse?>ZR#D`p5CpO+@~01CY~wHbVd zM6^BruIag(mVo_>t*NoTxgM*A6f`ijzP`R3g9Jemsf~oU*qE5^#cTggDcDRd3KCSu z>YTsmnE&gsmM&jgGUjb9cwaffuDUMEtctq@TkVLwjxIjnf6fUAD*nMq6oHjks%zUB zC_xt<|c^F-e;eC;roYp6JFf5FVq$eW!>CB^6sA33Xn_J+e{_lK&`&kjrp<9 zk+}8lF)Z2i3Sl2RZ{W`Y@e;7BUJnxK+K$MBP*2$G=KYQ4?FQveR0rkx6kGyqNnz$~A*XcmeZ zgi8Bb<{a!L2@T0EZ@obY8%h#XmV>RU{;kp5t8lbj?W+6<`KvDx8DyCrX8^dgVv#m9 ziUI(`Sdo@5QEgT0ml1HGvIildLN(4Jbj92~IEIKZS2UpszJ76nvv};&2J>#a?NuTM ze)i-{H6nzC=s*tX>Z1KdiGaq8{|dVhTpH%5-?bK-y^7xpO4;R&v|U(2{()|S11O{; zEq$Q+>x&hMkiO_2B5Nl$&Xkw(S5>-A3Um{7m;uY56oOfKQi@8ihz&zF@OCvav#xX# z(znWrWs2QLh^>(D4i^@S(_|^;ayk-R9*h6m&7((~=8q0Mkw0%mK|uWz=Gt)n>u=BI zvA>$&643({?0hYtv0QMJW#VGY@1LvE^@w5ss4Oq6hCSea*!CsUI-2aY+=Vx4>f4Oxxz(7kgW`&v)b9XK!K$Oq z#WG#Sm>PZ!N&a}tpSkn2KwNNSpF?z3|A)#v;OjiC{l$}1PugoVkIx>%fwda;42Ccp zYy@Wr30wX}AZjW{Ln?oHXEl#Mdy}<3NRt5L{okYTy)JB8$?^%T!W`QBGdsi$! z+oNs#0;)PcNrhToLLIqBh9UCEkl%`)rKNg+6eT2~p^lk#w4l7b8gSV+#(@H$`p#|v z(+OM%ok{%)LR{r92ZOxayv!kovf9~5Qm(Y-&DBJo9b8!=Fk~YOvJSUWt11_#*;e`# z%wig7jc{fgT~_zcXGKX6kbo@vGOlM_EVfb$&La;Jp18q-^N>DjT%ii5Z7vdzrT(|M zNQ4~+krm@@h4-|r%;m8ry6D6Y--p|QXSsB zzdvQ3BIxYAdRX8>Z=Cg7{R0H6o1+0GO8qUT4B$-$cYNYMn+n*K|^A zNP5`Cr!bKKJzx#J1W%xl$M~blJ^9u*5hgvwJ+3A$ik@Ms%7xOGotQzFx_ORmVG%}Y zDGV%SV#{i)m66)N^EDmun&6iftD>ZkA(+|s65N@bpW7Yb;iO_k)Pd%yF7JZT!3!|@ zw0RKC&Bd{H6ZfI|#>ou&tM3ZkZAltxuO=e)LQEJ~=-J)LI+5M5{}}xyZ;;GN9klD; zxel`TZiAFfpZ?Y&nDg-jX|!SzC<~c~5~vLVJVIWSXDUk7Tge_@_%;ymlv#Y8s986> z6vJk?no|VZw}X^29lzPrN0VDt)OO-YU0o3m`k9mh2TlFOC}yX?wfSj|o5RYy>GiLC zz@&5r4a|;lIs5{9}>!4nRrjoJo&pTo$*sr z@DAraWf%t>Y`NU;2yhGU!R_9Zholvp!&>o7}a!eMHAa z%wEn9cbyA^7%L16tmgMl$8|d(B!K|FXYtQn7dq!d?GoEc<6Z6cBvFs67TfWICM&u=kD1X`% z+y6nxi*LGD4+Q<`e$!s-Z)vmcR+YF&ns^UiR@8cZmQ!r|R(aLt2pg3Y%n$OU62ZcH znkQf-|I?q=Q%qG)Ehk%U$COV@rpbs-6l-AI|hb9banibw65Gg5sGWjLWs-E)LEbboD37k0FIpRcfiYfs}bJWFWIM7)z?%4V}2f|i6^j7<;EnbGEx`hzF{>^C!RId@)iRZvvAw0T@+ zbB2#HRS3|a0ft(@zH5A{_clDOhsLcp>nNru=+wJcpYm+IqtXv!RRy%nE3P|3jf6xm zbvNI_Go)QE^tRs5@qc7z!3S?%?huPGiML1MnJWLVg)rLV_x(enaB=4Ms_L|ndX0t2 zsPDp{cKK>oa*W&UXUlJ4+4GLruRy4et@5kha;bOJZ&DZb^%@K6sq$rbv1_sG0dD2G z*fKv|;w%bt!Ep}1Z`>L@X|fIF?P*&oAjN!du`MxG0KtSt^+fp*q@cM6ldzT;E5sbCN)>D7e4U;Jf4 zm3V}3{9E&PiL+Jt_gx>#ay@HrHBnT5xc2om{B>?LCMZ;&W;$DN->{X>wiRbODmy;k zNV8jnM2Lymz=ZMhZ+?&x>bxkI4S}UNDm0`M3c)arU(2gtWm|fAMjl^#SG_s1g}Erj z1}~2Ljsv(<%=nYriyE?q5D$^aNLQ=z;zP(6A?2?mrMuL&O{NP1KL_2^vwdF_0=AJk z&N}8-X7=_ii(0B`|zRL*!Fc72$DgA?k@U81u$ zEgwp<-LI!K%&|<}QWW5{UlKh0s9Q)>VkQuy1?m@SZ`wbT3>wO-=}S$n3L+k1f=Sq{#WJ51isA&hUHg+54&e2( z)^En@1gjAEfoa>eBOxY7gTcV<7mf8_iQ=}Idt9z3i?wv;du4l6D}B~ErURGq5YK%# zo(cq0s*9v zYB>G<`+b?(bD#4Q=(RQ;E%%jf8T?L%%QDODtbWzYwK}pU6+QZ+Ixz61e{gJtx*Tv!@!V&kgFJi&B&xzQPI7~Ir?NH=qw> z>>R3^_cpx~Zmf{lNalct3&HWc9rqs)zp_pRD+O zP8=05fObHYwdAEYZ*{{wpJ+RbVbkHou_gTQxILD``TcaX(6?Hz)nj{OG^xQPyK?(W zMRsp|WjRPZlp2qMkar(#u{&{O;>P)dyb`-O6o6SAJgE{phi~tt^cmc4L)sxwW9{Z8 zN~SF4yE>?Xo$)2;XRQEfRPsS{dZR1-mroap{y0l%2V^AB008UN_{cNMBj#_u`DrK1 zbF6^LX_xS%ysk?GkIzY-&PGW!qqfyIkHISrB0PEoo{yI$g+8md**}10JoX;TzQde9 zh+u<+b2c3ItwF&Ra*XKFVYU-R|g)VBVCTsSLBclB($f z|7TNHbU?}R8CzrV*7AArMmUXb6j9F{PIED+CmITdbnEdqqIi0pa7}s(`7dH9K<>qD zZR0-1j=>xUic1^4;36&*;4q5v+#Sk%AN3t*3 z>>p5>>3l&3HC2-nBmNCZMxBw|aA+{1)9a@ro2jH3q|jc6$JHLkpR9A+J2JATK;Yeh zLI{1%_RHUQq3|@M1<7koD4JgQ+@55HC^<+2i8WqQl*RhratZI7+G`QM@gtXN|S$EW6%*SP5ohnM<%btE|*jH%e$W?l~rHG-K*49iivtR=n| z%ZZZY5rSkEziMtDQnLnqtJ_fNaxbutAabO9pCUB{3G{U1a=)utE4DWnNm>X@H(RW` zy_9H?f72lFrF-&>i{7n9spO6Swz=%J`mW83pV6jLNfcis;2v|b+wLlQtno+bj}a*f zIh&v-d9~|98I0=hnd7kjCpUIp)jhN=uB)qC{MDtU$moQVBF99HYfNPxc?{)Xk+K{X znnDtdAN_B6m*5(vQj~p$S{p=&>QUI>SXClJ3-ep3?I3$;6F!(}&Z#bW6{V7=OFF@} zBTe?MO$fm}T!^2IwHtoOTD@`~4E7L7duHJ=ouxz&;dIt}%1qp1^w1EHp9lq|w2&pQ z9fg`78w`9N6o0?h?lcb6W`n|sb7oJ6{g=dzSij z^do^O2ASPKV9^y*&-R3E*>~xtb#8b^ke?&ahcfo6A)zZr3>*0 zU3FV_kE)1HZuP_kLOwCahU8z#*2f<%L3U6WD&%^3^N&e|lIFGetvWSeOgX94+8DUr z?i?0pEMjQiD+wlCu{bb8KAMV4H)4aMMvtRwi!k}*`Oj)%6c}KtmFi0xCug6Br8q^7 z=^*;}mJ^8|pyp-*sVp;3lfcL1vCeisyHMG+f2diSx65(;DZNc}xEW*iP7M&rQbeQV znuK%ZQjV>e)VdIjk(q~b(w?l;Hd&&NqH4T)rN7a3OIy6PCa&w4?3XY~nhts&?F@u~ z0nFs3MC@b#ZZJMF&4=-NEqRNV@eqavIsG(f5p;WE!UmXmcJiL9$4gHcr^zchNcPm=BDK@dO zu`*MI?!2~(!Eh^L053e0yuQCmyk;5E&R$N6eF|hbyWwVm-7H}?RCHI#%eA{dZ0_klW0>C9&1 zTf#%$b=;J+H_C^u5x-G*U7NNQ1&;6KphOw!CbLqfsyHcySzO{mZ~1t?@#mLErFZBvV1}X( zEW#9c`^Qk}!D&(wa5bIJegZzVFteQWk!$m0f3jRSpVW7PByfLJ(tx}dV8~$xgwNvt zsBTj*XlwVf>zhe;L;sbPz1JPe@5VahyPVXUQ81hw%{NkBS*2nkK7axBV;sj~TrzwM z-08IP4z5x6`+*}n9>W}5kx(JS>7O}aIMi%}4i!3IzJHK6d!N!WO;D}XpF8vi1>a5@ za3VqgWD(-}-jNa8^oaI8qb+o1N|ZS$+FsN0#*`y)@|kVYf4Fb9KnQK)QjrQ>>1 zOzBI<4oV59u%NLwt~VVxPgWsK9xFgE)uhMzC@x~8WF)L_r=Tw3sV(DZb@c=yX! z>g9UcM|%!8?SB6WoGy3sg;+N72R{j>6mb}^m6N+omi=iCN<9C5sI~Dh$Ct|@uaej_ zu)FtAY@bpdoA#xLZl1znPHM~iyQ%_0Lb}47rGIs=T`;lwduQ3MlPN*`jr}Z~?=1hkO z{NnHL>uBgQrJapt<9;j2qvDeRUJ*HA){|2NfCr=+6N9hxb~D7p|EHb+0Mt~3*zllF zj@=kbbAyAar&p=X?<-a_cc`Cz<_VW>0y$IygO<$M3@_lvl>P(nZ*ObgBtUrH@Fw)+ z;$W6we(#3W`)Pu0oi3SSJMFqt5UaO}$0;-zc8_fHg`fx#`@O>T|DAp(#ICy3dkzdA znCPHrHyTBX9@Vyvy{padh=fc?%H1E&jiZ}NZXhkYJed-W=vtKk=%qd0QZh-OA7+1C zV9>hzPKzSqq)+%k00^x2b5iBg>JCo44bN8}Kp(<`5@Y|cMzJvJ8b^@Yg#=;NIFsZC zuTzz*cwgB&=@jYm)^BTuWY~YErYIwo>-{$upu2<+l`rc>^q|lpSt(!csIILtNukMQ zV}xI8sfGS?D)V(#_jgn(cefs3S?l?@2f|0}>b9g&)p}YK+V{s19}on_$Du_qGpXzH z^GaoVCmVz@Xbl%t?vehuzAX2ZyFF#_TuOdfir{_ddB0fPl`w0faasfjAOD-2m-_9M z|H8Q=VF(~bGbZBg%G)!DW{x5bXc7(VC67G5`dNebWoh20_~w^@6RlI<>JX)TlHM~n z)`phP+a)jjPhRjONo{+@^z>qMlVzifMOT4zUzfI)&3i8%3K+o0Hu{Y(pKaFy`p+?k zGJU9!4o|F%g+f_31iQX(YD$Hd!O?XO_6eH9-4l&o6P(SJ<#sW%THFp9S|-owzzk*q z&6dj3%Xws4-Iy)RH5nqnSCVRHC3mMHYgJE1FFtI119AlR77A3d`W%*HFW83qk zZ}NFOLTjwmsV3S8uduvwqqx1Zx(xN5_DZAU0YcrA)>aTeRaqRikCf9+eW68Pz_jlH zriEx?E~BYd#5&z#)c;7XXl1(wnlA7xa2>o=db*f9voI3R{hum}=?P2;uNUm;n%5-w zVHUsR4}sO0<@dZ$ys ztAxpYGA~7JC}@aTr?Wk3-&R1jY2|gnHg^{N;lYUny(bPh3ZvoQ z{EsnI^iolX5z1Mc#v@}9&D#;CTLr_UrC*{>krHF0Q;Nzo>+29JqC)!?f3-AJGz9&E z)v)`V)cSdcWnXbEIy3^l)0sbYV{ttO@O7ioz90Ftvjuo~ z$Xg^qI?W1xt&(8=7hgsB`M0&HG>SoJvM1-9?@f^Nm2+G-vRuM9M8MAf4f_E>aG#1D z(Sn3VNdK}<$`~CCBNJbRKK=KG5{^B_q~ia~DP&KW|9cJvtqH?9M12k{N*Tg2cF@*k zG##=a9Wn#EPL{9X>@0v3YjU|1C!FRxr#=AY?#Re_k^#7{L8TAH!!eQtrf&7-n~8DJ zkCFh8HSC83^?Rs=A{Pw*bd}91cug&Js0UmAX(Q0d9OycT9TYWB|ma;8ipPTvH9hv*1-nfOHZ4gqTtS$`)TrdT25AqADEm% z7e&pO>_Mn@ZqxJs(K7OJcPOKPwgXla03lumL|37xpD_Ddh0X?O6Jan7-g$HJ5*-ts z+6@PPz5A?HRJRl})6_in-6`f~=k(2O`kZV_GU-z~)QUEKolqCVk9ZN8ch3E{cBH4j;oYlp49E2d7Y%zEGLF?Nu zx<^RR-q}Ykf=lxb9Af~SC@fWAH@(PD!C_42KJG4p4@;4@ z5nnjB)<%>q;@bOWb(bf#djfDjM)DxpAi_)Fvivg3l*NRLz3ybs7L zD^iKe%uub{-}@A=sUMS+M)Mg$0ZeP*a*lkjX_m~2n;1r7e!aMV#cXx0oG%C?tu7rD zFeVL0jQnJb2*?RKOm*BgJ5z6F6_{*V7g#ro`T0~PIBGfTYjT{Y!L(s6bEEqO93%^l zCK)5LuX=-zk_Cg>BBUc{$~XP0u>DC_Pv&GLiNA5dCWb5Ji2d-{w|ADls(f6jsHhEh zW^f(k1QSCf)UfrWhyV%-+lfD^E^N@+1fnLWe~Jh=l0b(Kd0X@-r^lwNk%k83`TpKd zfbI+A-CT~=Z_O(g5P|CzxSqd(u>?cft(x~IE5nBaIN;0+j6(^TLfbFVr~KhEy)^{$ zYt4_7j!PYFoob}EMEgEv>1i6FsD8!=IP6UEyO}*!FYzj;WL|AOJ>n!2cZJe5WrFtn z{LSD;aQE6 zO89!<&{R&IAJKJZ)%dT{%sBKE+rv+03lvx~04appg7v|bB^gNoGyrFN8j1%j)Fh1- z%MPPaWGx?s3WpX1W|la#qK{-RAft(Vt)yet<09V_kf8!gcHW}f(E^2o?Iu6FM4<-M z@D-zyh2~fVL!v@Ek2r9M1ugp)R+AW777K|9$<5$E!J*L-KdE2Qp^}27qeee`wH*F` z7<YNr?G9@_A}jkpL6bY?*F~kGcV`eeCLPj z`q0!x+LRg02LvMf4U%Rm*t5;~MLJb%7P+v-Zj9ug=$bLEv>s<@#yE{@B#gKpSp#a` z)fL0vJ+;^iO)Hv%A7t6cIkPJgTir5g3vE^NUc!eM6z8u>857@s(@M&wdew~#%ip_` zInfUk=TyNGai#rl*2br1`7e78oHq6A%D@*ZyFTknxPBf;kShG0Gl9wss#S~PMW>!j z?6$@y#_gVyh(@WliV(RJdIz2e1~mgU;0oCW-21& z$Zgz4=eLbEkAa?QtcI|9plpANSj9yIXbwOD;kK1Ju3yFYLD#2Np=bM1qZJwV6S-tl z@s|bBTJT3)TeWJH=QUmVti#&Dy11}YEwNlLmDStz;qUE%tgK(?C(bH0hsLN4M}bT0 z+#eXRpQ6_I6cF#78}t?fwa~+A$h*T#=SS?G4ydU1@kp;nYngd?rZ@zdyEI%jf_+_H z-yo5cTpjDJ9>HoY_B#y)@}!Jt7^z%mdzh2z$}lw|1KzDW;X2YV&Ea zk)zF-(wX!gQH`gqV0<6>qxJ;?fXi#1b^Lj{qi6mnX8>LHapEV}Es10YfN<4qsuWfq zOD<|$^TRq26zosU5sTZ*(S_B4hOXM)dN!xA_Tl0H^gUaJ*K$*}tEo%o-StWeJAOaI z0?JDlLOsR#{%#WKcOqhwj;3V*E=t${zDZ2)T&H1GNn3lnW@|$Vs#@{fJjDv8XpU_6!|{QuRVy0T)RlpmOu3vsD037Y;%c zHk;3|K=jfD(@gSq)@j2-|IBbgJz`$e44a7pv~xT4>n^#xT=rQmBOE!cWZ)-|?#YD+ z#MYP9d6j%KR)>E(w{s~JsFVq=+uV58&o*@RhMlv`vM&-LO6uBJ>J!jU;5OYG^cqiB zk7)aqU;Q?i?u>rTq0vCbSWQC~Nbx6kGt*X-}9CM%~d=mgW}-IC(2kADyGz zoW}G?<=T20PA)1cE=hk=TQ@!p3%=55Z~!hr)n?QiZBEuDwfe&sZ1!p^JL1`I_56K_ z{H@u6aM3WEl%+Tj8KC(de)2Cph#sSH%% z*X`c=r+vHzH5OaGMrN_N-t1j!4erNA&YgSlSgoIDK%u!`NF@z0drN|Lk9nnQI&R?D zzF}TwQ8%tW2+DXtu5+NN__71y?Wg#h>qkevUiDsV&n z)>_VTbNI`c%TJMelE>VVDVtO-)rm69nS7G^b2@5jk@PO>X)GIC6|HykED`J%)?&5 zpU$*2JRtXNvNbc#`*0vz3$t6AWek&pl0!x*bTB{^VvFh9(EtY?07aZ6$!*EeYnv~u ze6N`0N-xaiN6TxD0?si)01`HtH;?ipX_U^fTq`@BP}1SunoRNPO~O}sx;KznJ4!G? zIAQ{WJ6Rrs2bdYF*ZT%WAvTEsrlVt-1IF8Ee>vs?*YqYs< zAB`^(#g!;Ly|$gwWu#Dpw7fXXOmUpw4|BeZs9paLd1Fvf7({p{apzMnQ$90MpDzP? zC*il%nLkmp+fWqRDW%5%OZUiiIO+Yq9k!~7-w+n>?9LVHUavvzZ>wBDSZ@>FE z)8`<#pKH{^o7YZ;z_GvudqvgWC8O?hzUH!z%(Hdgw;{JXYiIk*H?)+p3GBOeZjwpqO|D$#owZD@ohbx8mDbt1 zeS8`zyWB5vC{L=J8wXmKCvC2Z!?khQj}yIIWc`Rq`a+p9OD35gJV6Dc&aE@gAr#x2 z=1^T@PO47SmQKC9-qP>SuZ8roh5@sf^>*M0g`H7PpYv_x*I`jzns(lhi7`bhxL}4< zYgLfrjN3Wc^U+jC!#HBzHpjO>?q~#z&s9qfWO{5Q8t`R)F0|?g&wUK#<{jZ~F5x@w z@TfO3SZu+|z3O1e+Yo!=05gr%oYmD56#WY!gofBJ%2x?Y9xW}T)PnB)Z#jQK4N`WtHflojSyv3hXCUma?j-SJe-k3P-p#;y1EPnnzR z>dn3(P8bi@ICI_97oOxqypK{ODSb(o#DGJYMZZ<@jgS#~g%i!d-~e2i z)TdJ5?H+3&lZ%D8g?^{i-g)(2xOC=@jf*1O={PTv-z(o1=1EI!L6ixg^6_lxcCTHt8V#ynagFDhbaG- zQ6at6RlH?R_xFJ5Wi5|7IX`G2Kn-|mWdFEVk|`6vUR@P9)D*>O<+q#5(|Ne(g72PW z8fR1TD7wtFj%Utd@ZOBCvxE%Jqwb*{g=uA~G3$$bb#J3xBkz@%P4xPWVY}S;KG?(yDX>XeA)#Ei#rkk*{_t_L z9xC`23<0O)0S-h1X9tB?s4IdMPLKt4cShY&qaZ3*-ek7dY7na)BIk>9;YIN|gNTHH z^f3ZNL>iii-1l#yJfoq6$peQx01%zyG)#p3blYEFmfu2^UFx%OOk5?}k--|%u%iN+ zFPt|W*(fV@l`1ZdmydHhpAq2unL7+EP z`48@g?jzIH(i|^3Xyl*()R%tC3t^Jus5FW7CetHZMm6X7~gM@s=a>2+*a+tBcIyvOSfNY(} zn*OyflcJ3U;3?2paq;3moX%v|ziHB8iVE;gV$u|e_5R?)I8I$nJw8%7;pu0xHn65f zHYO?xD=pyz`%)3;l3k=e`uZCf4p5!;J~>4HXcn8jx)fP{rHLrWu%JNR*@zng3pcDu zZ!i-bUS};*l#_>v8t~JdydUk)jJ_SFi$nb@bv|5K8m;9x`vCuagZ=4?t8R!F4^1vmHf(lq_Sk{zZLY8K z_Vt6JBlL|mG+XM>OVP%9`qq;__6zf&?%5+Tr-8_(rC4UV^}11Y)^CP4vs&a?1t&YX zkb&L*S>=I#ko(K>q}b@mS~KpsDs1%D4_l}8FzdiTN>3psQSV!(4m7m3hwJ+pclTcm z{JsqVA5~1_0sr?_PxdU6iguH#c1Dkq`-f+~v2f)O-6U^35DTOWm-R*QYGZ%&ftxIw zX2ubR-rUUH&j)Csz=C*Y9?a%Bd>f?SM(p|AkGg%hWia416{M` zcs3SmD(U4M6>_TOFVRh6nn?EC7T@`uQ~6roz}#Rcn^(|7D$-W>XjJR>=0{VI0FWse^3H{SaFE9fqx=IIX4W?UR;_Q${;>y? ze+mG09zW}Etf&M{M7jUOZbq&TeCYdY3e!hpV0K;W?3tIi?VAMauomGCb$1VFL={-* zU1O*MD7J0thsDjf-S$H(Ux1>pM_YC8&v-ZdGEZP=O!-9Hzbr64C(HCUrt_8n06v+!G>xDf z8a|&YuU1P{q2i`bupq9FX>9K3M+s4&(6dNElYQFz%gMl5Fd~&cm9dfr5r444{snE} zF*WQYDe5lxoOrvk;%LUEgWcBm(OKw)^+{4;INc5Jb)%~2fzglQUy7W{dgu(m_w9I( z&nvmCJk`_U&~ z^|{9iR8=8SJam7Nq}J<73No z$0JQsOP>%c?Q^qB+&BwuO_dc^ewTO_TE1r+#gb2l03+q~D4lckQVUCeYP_jx_p9af zGTsJsi6i+pzd*3HLsWLKryzHTeAko2SMwTFW+X0k&-6v%F)X^jZ(zqbu!ns(^c!)t zy|?x`_2dDcg@-|#3(RahYBHN8F$YB%`lx%ql$rpVGH zlkZfW4QAmNBzheGf-z54-PT->SJ!dG(wQ7B=iW{le~v!c!Y6Md`a(hER@#&h>mO1+ zx~Qlc1F_W75gjkjw&|m03`%o*i7bVsFqQ`@biowTT`s!|`*dCBTRi_s2MgSBRw%*r zz0;hpGW-XDF7_+K(U*|Pa;Ww)cH37vcuwFux1QzH^3OAW(a%DWEXa@1_m)7<_$p{k5u$%#`DA>Z%80+if>Ese&?U?n4XQv+LEiBT>|JJ>>fb(qo z(l2l$q1VrlEW$AGfA6%c#hJNmw;K{s!MXE(uUX!N#|77DfrvJNa z%_G`xP2@HqHWBU@*~_hyiwR&@6@o82Avct>0r#g1mA(C~(?&baQ%f5P3$D9^ zT{|8$-naYdUnb{9vtjU|p=B{4DP?(mZ?5e(*4CHQOf+6liSJh_eLw;331wNL7xCF9 z{HvMD`0{zoqX1DS(qSMaN>Ej^LNQ&mRT0^4qp;Bx!~2MBTC>YHTVnCh=mp#HX3KRR z20^@o+(zAJi$At#bmw7EU~A*c29mtJ1?SvZ<1qw)?2w^kYA&4hS+Rs4?xYDO-3?sN zb?~q5tjXIAgwz*V&*w50zxUB6kgg(p%1gxxiw=p3LyZrm%(#jS#MZx7UL8|(*NH_N zen!0%f4u45)=;oU07M{Kt(j^pzJ6&FudL#5A zvQ%|tQ{=%9M|WQ}esov9_j;y^GQ? z={f@j5-t}a9r-KVwz466Si?%8Q0UrUsW5ax>%uL$`I|dsCg9PDww7CqdM=&1t45fH z^Q{j1g_&IBH=it1VlGDKFZ6t2wx?casF>I1syW|50O75k4g2Q1o|_gPGJtTY zuz;bQpbmzX{@1z$?$1W!*OM>$9Fn%0bT(%k6~pcRpsak5q+v+4$caB2HO9lbpEwHz z$Bt8LPlt+)70Kp~n(!72hXAO#6nRhDkb%;L&Pnxdzyp-%J4}IM5rChFeu8O~(6C1sTR9Ui-$uNLD=LNBG{*I{TObjGp z<>=i;8$Dh$+hVmutai7%D_5|L>N=_R9*c&8QKGxS(CYBU?BE@z{RLt_`$H`t?i*#T zX)#;i?+N6r^MP^O1Hg{-*L*_y_E4#cXRGt$P%a#&gCjU6^9JAe)Z1A1WsiBsEI$OdKzYmyY!Lk{#4azDI46g!$B-Hc`wrj>0<4C5T^dZ{3&W_KSCLhxR7 z)}m~*X1PaVEV8GLrpu#e@&S9g#XJ+_QHxhm=oQRJU%Be*6l-`5zmv7gmB70ojU;a; zDH!*14aI}9-lj!ERa|v0s9QNxJUVrOYb#vpFXXdc&iPfNDVz5#yl;9@euPB9<7p!L z()}3gyV^PT@5aaF5x>=@0N*%ojm6tb|2==<8s}IsWCq+ZEQ;z-bwW7|JpcTFl>PXI zLS{$XqB8%Y&J+)!O{8VHgvTa91IKEc8ytGWmvltdvdR5o8Z1y1N6XLQww7=48fg2A zpJ}?9k~=%4_5GoY#|xq<&9$Hlu@SLqhv_ejr$08SIsPqF&l)n&+!H26$Jy>KTFfO#@n?~f3nNtGY1FSW4Sq@xHvDr zy*lI@b%Erl!`&?dn?K{eQNBxs#Yw-j9C9p>H77RyW-U%_lo`S-v_UI^^D`=u4W~LQ(q@i+Rs#07`;Cu{{Dy}Uz zWHVuNJuLnv7%ir{)z9YrJVLQJluHohuWGkl_95_VKE36h6%UmffnqW#EnPXl=%M?=0V< z5a6swH{?a9ud(7AWbjy$S8gZ0IpQ6Fo0{0k((vlG87y7&D7EZXg#rMm9ymQbXqXr* zyB-;6C)=|W-7ABvtPGpxJ=DKw%vtedyvbF3I+;U4BEqEm}Gj>Ru+48n_@4Xv#}}sz=>ls z-*(ZyZursSSj%KR>B~V+Bvq@oL(DHWVVH84MJEElgos5RAT1yw@Plxq^45@3m#369 ztNVnx>oF!sm>IL~T|{ET*eyL7`zotGu}_K!47xXXEELzC&}bp|M=n@vqrS0ImOgW| zFFJiiXHX-oq`iK>x`n53L8JU(xVGB#@~2Pi8wk&Vwo23TURd;`as+cCDslQ|`=JzA z;ZdQT>;P>V)3*cv2{l#-qyml2+G9K4@4m`Lc@B~{HS0AW;zm-p((9CgfTbwS#tVKx zbUPXK_T548=;vU=(!pwpka~SlLk|=E?U@N*@vaE?;xGg*dfIy}4ju%i#lh5#u(TN1 zi<(md?LbT^Zkx?zNdJ)>SjS~yNCv)-!yP*x#VUwAu_P`3{Ff41^~Rr3sF=ykQ*-3a zQKAnuK?T(Fim%O9i&E;b4urDDhYwdu9it0oll#=Ui#QA^^v7+C)mPgCx2jgWuw?kq zRUb}kr)4FZpLe8V%k0!QrNMK0pXl{DJHY&cW^Bwb1W<%NTpt7`!kD1s7g`>GPIhFw zD6unJzYWY({RiDtae$u;wvc;5WYdLp#Kv!>7KVM^z8!=<%ud8$T{HlLBp8f4x|`X- z*N-nLm<@I3E3ClA)OUK|a1>FF6V3 zAO1$*osrmdk_Lu;->GFej|T{@bgxl6c z6~nI1j`W^D-s5A$M16pWwNZ5wx(Njb~D8kCk_mbbz?e(G5u*$aP)?xu_D zJ9V~JRCRc3D+Q)DAkJYf1D~wmfnjlfw@#QjuhsB3ufAVpwZuV93`=Kv-B16HUdy(| zg`T8@>Hr|V2)EFf;k;YF==01h(b{=NpKRI_#&ec(Hw- z1eika0joKVILsbJi;^oy_tQG@7@TKQ8YPif3u43WQr)-Mkk3XK1UgY~{z& z!%tazc4tBpSwfp@n|H$)GIv)wzlXDQO3Er@o#p3OsGBOB_IOR-Gl)QcFQmvs!Sp|} zxIXqRBWum}q?t&>Y71$)rF2&A1`yInhP%y@8XN)5afFQNbs}o}0~Nn}QKF27-df$@ z=RI%MtWgw$s-E(A23#y5!hs53o+#Ai4So#{n`GOYmtr)sU-&Kod7}!4b5{;>Vd}k} z^$E-{uKT2~N(G>dn|geO?P1>jT~W^|YxqB6e`PKuL8@3`4@y+KsAeLg8i+EqIE1%G z*$Ikv4Je~ed0JZDfUffPT*RJ|ORq~O<&1e&zI(%bvuVyPLXTI^ojmX@V~Uz!d02W_ z@6p1pc}sI=#%ZR;N5n0MkoY+3`_O_jaaU z!kKF%C`hC>F~VpyQB z@emV5*weAyxK9-d#BwdJPa&r%sTg?Y@+)e@_uU#vQfF%tH#4MFVh zhLF`nc}6XxBua}UzWboNAAPpGY_9q}fZ@{1!Z)T28V8tIb^8&{=6ZX1x7PcH`Z$p} zPIq(Hs0ResRZ%{1Kc08<#auUL`{ReA1T`?ZK*HMxBWT>K-4};fLs*wXXoIA_VF%t- z|DutU`pI7h1u9dR$=Az`*GxOrjzdiW{{iy8LW zz(uBYLnM4;Q^rNGRsbJqBnC@gB}CxL_^UQJK7^cHhjO_xHb7=4m+S{H1;RDryUjBP z3=g11$~TUG=o(_(ekJj%uf=WM+c!Jx!Kv&2T z!;0I3hV-+k?k2NJ5Ha;fh($38Yj0klOwMTWJTkRkCKQR~HvZ^?{rA9$_Dj=H-nHbPCgRnhT*Qu8UaURr8#{kjvNYK~}eCw15v@+aB-~2cwcPaG}+1LOp0Aov;u6E@L&% zYirkKp{cx078DOu#L}vJ)Lq6j$~<6!fU6gMw?y2HpKv{;K<85-h_$( zv?MKIV?D9x3!njU#h$L_DXI2^j1ZZmsEvqKg!&OEz1;Rwzd}rJ-%kZ#L(g8fn}|3KMnD(sHmv!UYeCKneJ0O zw{NGmf`P(RIg(n6+Zo9cJ#F-Z_fF2Ij0bhHN-fG(`%T&xFs+5f0;bdBLy<`y-S3~G=mdAIl z6+dCIo4DNx#W(=oaNK$tl_#tHekFojyxnEzpV5pOJhyKwEVx@v78H8PnrQU|;Tyw& zXg&x*08k$u{R{kH-gZ)Br@DRWF(rJkrFHYzmeR}TVvf~f;CAB-MCv2z6o1c>A;q#l|8Lj=!y(92iqP53zr z=fw{Edwl>f?G3G54~@*}v(PC*rmTo>wq_{fh!~P%xVT5bN-gu6OO;h-HoD2<|2-A+3VER zTWaFt?TCITEzZj~Bkuo_8vea?|1B~6&p6-%vRn5z^yx3s9X|PS>9hEL`W}?`_tWHc zHf9QJ7`GkWV*JYFp);v>VMnJkMf9-BaTNrXHsow(DF)x@IrSFd9wi_we3^Er-*02y zL^yXis9Je@Noai(NKWm&$992*?m>4tXM)6`uNb9O7Pq1G9k2Izw7EX(&2I7e@rg@o zB@h)V+cfJ>1~f;SiPk}8mC_o?qL)+hIg_P*{%%i|61N*=jvs~Y>6pw|{pXD(&hc+A z{+{g1CU3Ql?J~;i1_n@#Now!NYWBvf*Hgn!>RQpIy}<~s6#CVlTxmos_jQ3^QhH(C zcPGOf(!ULL1U^&2*Pk2q?N5!YIczuPi4q5p^$l+YLwg7Zg=4Rj)ioe$$|u|0AAQV5 z37)twqIJFcFXvo3)eQ)cGUqyBxhwJF`#`w`j(xaf8xwP-C87{-a@2f2b@27!mG@T! zepVCCwd7pLLZuy+dum8a4c6jx=&ci5eF^IPxR~5=lE_-0!84iDU%nVvzizeubNR{Q ztiEF&QB(6sjK^6PC0N-)EJsoxcko?h_0W-g;sSmK>DD*}h;riIM4ryS>H6)y`YB>YDX2!-1E-Y5Q0c*Nn8nh|r zoyCjXJ$I`eYkUk&U2P%f4I}dn3p%9^Q&=92`;M%30pRT|tGWevo!2QKj!x9JC9NLN zhOqw!tge6n#+bqkuRTtkgoy1PnZZPj6;Ht$UqFN4S~Ajn9)r#i zLAd>&Iqg37(BF{TmQFJqYj~6Y|A9eK|vin3c zAHlbQX{B(N!;SbFTMF<)^H+i<;VGQBShAK zxAsJ%C-+_)JR4LMN14JSkrn&()VQ`0jLkmE;cnyyp1L(w+ChI0z~>}^)!%W{7|Z=R z#l={)7?(09{1Bnp;}#i}sgSI>miy$-GI0YWh~fy2Fg$kX%Q<|5xk=ps6CWgqE}lxyCc9 zXI+w9&b}W)=pY}ldyIVvo=8Kq5<0BzEXez(g6GZAEmO3N z1KYKT87l3u`^5hB31#8or3?8kY+a%FkB82*pdj(B1+0GTMvFq!M@Oxay{0MKIAZEH z{^_ZXC<0WnnFq>`o!hHo2aKFI`%Q0F^Mmr|u3tynosf&?9X;4|Qdr@le}+Zd?P%EM z9ky(osr&)cz+5_@1y&YWQr0o#y&ib0ie(RsZD3VRh>TEBP>xBpdTxsW*CfFI|B;@L z`fo17^fqN2QD%`B^77xCA~-k02@KEW)!A#DfQs3GblF(UdFo7(7ZdaapW=f#DZ@%Q#Bm!1|L2&jZWenw}{LF=M*;Vfwo{x;AS7Y+|@-&+Glvoe6 z>$vSi+3Y6?nK=EpB;-2FI!a=PmZXv+^38p}+p--o#o+Y~3r0mk3VG^+_#du{ zF3jv)aQy&4Em@U<6rO+aiWvINjVqc@ed3Mc$QrrvEfBx@MO>5s<@LhUoHZUn&qoN_ zT|eo}j^YCBz=`kFzbIu-s0xv1kpHBIj25fRH`S<=8&+h%-$&jtg)K&9$j0nQ6q;zzKJ=#4y|)gl;NNc$D&OEYUn z&lTa+43R74BLxKS%EWcpaG#*Bd;!6&lsQ?e2uSSg9O|^GCli5xCf&D<06C#zct}Rz znxytTEJY&y{tX21Pn5`_BoC>mt(2swm699W(VP9BS1VffSlBZWno*`L&Y{vacRL0w z3#_2bj4vCSOrKoXB~hAwQ@}F%v-GYTC0BOH_{A)QAT(cIACU3za3V~|Al)ib?XG}` z{D9+vEo|T)a0|kh&7`~7B<>27q$3;dFuQ24tbm<7QUds3$KifAUDlD>?gSLO_&0O% zF-*g6$8lWwF8bJh957dwy>VfgebL>R#Ujn!*JA}JH9i!gE!IXMdBl0;h^Bl8=|)03 zKCiI(MNS@*#=@4YL%qk~Gx#7?NG5BV5y8(O%8OFfQ;z68%vzNXoU4}oy2Z2>gogKn ziD?#oJ2I=PllHOMFi`*0$3z+-3t7P?$S<96b)tW~RHuzPw9uSc3~}#JkV}!zf0z-_zF0m#;!r;9MU7)798jDMMEwz@aYzfS&MsqVx4Z1Cb$byNloca2FOGt} zrjYlAB&Sx^8pz8H

kfdeu){yob|k@{N*X)|d}w?8mK@}at@RD0z|dz><>&%}!` zF&i}`E38o2S6#jW{fdcY*$As6^H_?=p~Iiru2RCx&?H`J726?21^BufpLLv|g9RU> zT$l_*Rq};E%|_J~SReN%Jv~X9o!$QK-g!e?oFPNXBMq2D-JNy|w^{jnkknF|i*73$ zIe+-e(%6c(pErBk-f-l;d+eR17WE{sWah(5?x?MRIPT8`PN2)^#e1}>^HEGGN@8C& zNC#Ht0E(EXoFIN_r2U7PE!8?H39znsW|-Ps9=Rw!H5?LSuI0^E)Kan`|2)|vAz*Um zPfHvhXu)EwX;2SdC$7D8&Ud_SCyZxV>Fdo&t@u9@9Iwv%iW^9zh@dlj@=4@g$+Xt^ zo(xRlBlcH6r=$^@4ozBrUEgf>qvpM8{%KXULZ?~S1W!CYFo_SQwM8lWaC#kNpmM+3>UAi=t|w(rpgt5uptLBIeAC*8^Q`{jIJ7VH1Q z2QIn(g%1b;Vs>)h>;g)!q$CcOq>aMG*{`C{xE$jZFOJop#r)GA)7W}yaPcU+_=f8) z8Hwg3Gi_u^n5&mSCpk^BT|Wkzb6;!&45-)Pg2?e=YD=rL1;iTR^~X;hY(;pU2RM4R zNIgURu|swi(IyM`K{l;#gfqf+Wi;5dit%w_WWj~yC>uQYZg}ktNWp#){hv={CS7{_jPVnZ?^rs0sbcy z%kA4b^~ViL0z`mF0mE(D)xCe@U~?(kE$>{Sy{i~FK*k{JZBuRFPMQk}$Fhfj@Ojww zuvFA1dT;nbGO07Y#ZDQL6ll`d-rKLt3avmWlw9t4G4-?8HkXNxY4Eb1xrLyD;tTG9 zNJB$lHsXf_=o+0_C^ZG{VobHhovv+8q74O&MPik^;&;~A^<*lbD`M4|=IKZsl_%)a z$d24orct4iAo`HmMuc1jWqIrL^qG{9>~3_<3;$HYSTI9Qb^G#2JIwV^tq?Xj-EV|w zLYyg}=<>{l-E7l<*+lo;d!PwlMv_k-WoW-I$~s@;{m1W`h$ULtfRnYJ?c{{pX?c8Z z(vah%EBom;7^v0IU@7UIX{g6=Nu<7y63%yjw7`-$B;2{JE3|$atlt1U3=o*#0NGyw zfPP4z6Nc z2SXPpB^TNW(0XX#X0@+EHw)g|^IgR_VA*h`p!q>VP{Nl6{4hMhKnFArU@D>&@%LX+ zNS7&)kt>LYK!5;1^%s{>v0xSr3XtjeY4(E1a4yh5L|~8{Ka0@kP_k+MVIkAa9;s1B zOT)ymBL`Jt)LMBd0uyx4#|IM>T!=WM_A&3}y=&#Yuk29&^ z4KnNI2}-M|7+ed7eeF&PrVA^H>i`wu=^CrBt zIK1pL!{0U4dzd!`^{78C!>llGd>%lV`EliPH)5M^q z&}TK%maKt48@%PKhHI_mi`0w748mn(dTMVzrYyTON7XOHf1-w7Ui6?_c5HnwkD_b% z-5nd5a?QUXRsLM}eyI_$M~pRGH=YT%eeb|x&khX_Ld}EwxX&$|e+;1c>Alnc6Z$22 zbvJbEuAT8UuIgxqcL3|_lO>knY92unSnhjh#x)}FfG1W993 zldEnt#}ZH_-fn)&4_C_!JtbL;6n~JdmN31w^7*ya%#$x~cviKTG~g=6BvGx{Qyt`r z>C#oY;5_^OZ?@|D@tib2!lKy|ygFY7<_jE|?rnNQRDsbttZJpV&QPkx&1?k93N37S z2RGEQswairIA;tWX#!o_(#t_z%LRe(lF`pD&ACX&48u>aCFMS|39G1fV!G=L7G{eY z7LS1fz8|10No8XZ>`6PUwz-CVHB)qzE{PdkS-77sJ>tth{#faV95HX3sP>0oed!(l zN~v*cco;q_oA!W`2UpptH37OK7*U%b%(M-xfNbp%%Fg9z^keTX8r>L}ySkK*{jqZ4 z$z#r(rsW}{pb;T4rh$!pFu9xH?e6YP`$fW%sq%`e)vp1RKgT1V9q)gZzV5Yb zQk24JUkm$+nY;EOB$bA*{!Hna6@X&3LPC|syD$(%q_b)HfF<6{_M_*MzB4qwV zQ3_6gL2Ud0svRF+ZEzp9iiUoiKZS!#JYHB*x3rz?%u=AkhQen;Eg^IKxj4Dj`0{`9 za3*&ZC^iG5@(&ea^YLPT;+?Oft{!Q*7R~P7y)3PQh``l1;iQs@lI>%)J;BnppvtEo z^9nJ5YH)F-FB1(HXiJE|*@i@)C#@6Y9|=M`26c5;{*=PF9Y2bYz`gF`R}$s;J9UpA z5k5Ji1@k(pQ7RpHEbK(1C0$jV!s$1Mnb^j1C-wn$89|d->?4~Xs2gi-&)uGgAr6Vw zzSwzxwt{)((YbRA+qH-#5)|FnB)=Q1cLaGf^nk^+olc8_iaP{9a zRogx!8pDBN>&ZsOnhPcn{f@FqO|dG=MGyqP05GwfTp(g4OU5dy;#^~7J_9z5A(uLM zS^7oe8ZZrPkXW*$i9{4vB#fQ$F+4vsmVG|5s?@k;_Wwv&gvmh!!3|79@PSCC{R;Z$ z+=%~(Wt=C5;b`k=^sy(ZDN5y1s<40Xa)iLN`(oQX5ai?}1@*BXS#&yq^||QgZn8$# zLR$GJcxisQT8h{Mhp;bTs0vB=HAK9XL|Lv97@bIhVFL-s)=<$G`L^EP2@;u6#F&yK zgDVV)XK2fp*gMmg7{+V44=ZNicskzx`(39u!63wq2D4K`O^9Z&2I?ra$@@5cnVd?7 zpflw@GKHvjycWu1lj-^@aJ~&E1?JU(PniJbgktkMyO8pl%1<^&HI;gq7<--VyAt`r zu@^#7F@lPFeG6aHiEGWIADl!H1XLEB>E{S{l}JfB4`zZ{Ca*;;0Jn7p7mfjUBWA8QFs+a;FaODm6lIAL|~k-|F9+ zhiJM?v2_$RZl3K%a3ehVJ^LakBy3#^#^$^?CRb4&P)W-2lS2w<3oF_|Fsk9a2t5A~ zE6=3XZ&dG_F(u#ZjWvv66qMs$ym{8TS4Wi?5vZrQog7v4kIgmPCk1dQC%IL29E>zA zMdGE(6;%r{2+F2TvaRqZ4sZv1f3TFuWj->{?qBO8E(T7nNx7Asjw@HxXA8eZg@FNp z!&&Bv*NoT4+W6}sXf4f!o<@KsaR!mvSLJr8xZcM!3?`IMb5Di#)M+#x*a{X^J5PCo zhplIEi0$lo&7ZN_tan?ek(&g{H!3)z6+q(r3zv z*Ne_Aj>s*L2u9ct?kaY8;4D!URg3TjKN240d}TfYRX=FjHaMd^3?lanJlyh|#}JUT znP!;BN4~|-*&2Q+w``@KQs9P#ZdUvcW>8QSYIJ1B*fv%CJ+TDdfQ0;}^vcS~11lH= zV4$c~lFkPy+mJxlzkf>uFs0ltb6BFC<=Q+~*^=Y|$h<_hlwGt((if(@Wbyj^Z}HwY)=R)bz&g*=e!wyA_{#Nf`H&o&i4qIsu*S|Ngy z$ba%ye6!_5AaunpdZ*WHYhfDsE54kfVlsipxOL}1f|KEO>$rEtR{&`HXtHh|2pJNo zLY4hJvZUgV9~WfpP$QMT9OH2pa8%NE!!{Sb2+b!hPHAu{Cpy>|;`3Nc z_HeW|wo|FB)wk#P8e(2$>d&upvQ|w6V*u}0A_GU_emo%^1RX~tlUBTCIWV=ogHiJa z{RXJEPR)_u06;zoQdf`r?7~l(E^813J|C#?E<;9>tCUkNyJkn=Rn&FY!%z{gq__|} zs0r3qbNfLh*PfH1WIup9Z#w`6u-S!6R5}=hm5<>4KdEBX_5Y8vw~mTyOSgCn_u%dx z++Bk^!QI{6H9>>BOK^Ah;8I9%cMBfe;ng{P&+U7=Pv7z0TciFe7$s}hUVG0uf8V$8 z)sh8cYwCZ^ug1LAC{D`BRl$l)!=`I05ZiwJbQ%59Zia2zgMQjUHRllnqtVb2;?&7| z%`msKMNq>i0SLtV79lcLGDQiyb>Y9Y&<{H!WgtmjB{z{k{^QF101an&I2|I7OuzK! z!)fsq_&;U43g>^xb_ey%!2FLzN&9;yq9kIo!O5v~HDp~<66BzT4S`_z2PtP!i~S*; zJ|pW&kgm2dJmK1@Ck`Z_wn}$GNjxv@?DlPSoK}{d8{9Y+AF5M8|l8po< zAV?4>ur~9yyJH=~cEM8LBkk`_X|(8LTPlRxa@U=)hUd&cU_0)42adI;&D+}QXbrqZ z7?kKHQ)zVC1@sbP8i%>r@n5zQ<#J$QPxc|sE+I64j^;- zIWF!}q!d6EzLXimBXLF#+B3^hGrJkBy<)@&Hiaj}`&yWG- z?YO^|_X|9Bzs5BI{>a<2+IiGfyp{>ECYgfkp^+|vm`1q{m}0v?MNiO@TpO-Gsk zK}Z)ib$&wf`$ym&=_Jmi=h6`;YonUCI!p?-k9`dpRB}U!=1vh|fd0Wwo9Oo|)k!Ug zA0vWxShPTI4jT4W(~Fd=D0(NauuVA&EK4j-%RBx$m&TwIJ8YBxi6B)PNDh;3j1$_s z<)GdL10Tzv?Om;$mq zj5t$iUrVvTUoi8UN!MFdUA?H3-p7L@SzUd-GyQ43t#1Ze#R?Wg7n*Vv?Z@UMLEkii z+R{akt9^3c-a!90U4#K1h=v_f)lQwY!?B@a7zUipIke}|FAdY_fj3%7BCO1%;=XT! zhQif4xu+6H!HA2FU4KJSaz;|^T6h#~c$oKfJPza#TFsCoRvRj_F=pYn$)UyzT z0T#|UIU zm#rRIso{Jy1F9k^p4R*MdD->2WIM_bk$oq{8rhix8|#$Yd1C0t((iCt%EBjJ>!6t6 z+Y5j(H;4j=TezyJGvS>>;PjncIS#{tMwKskLcT@D`89NI&@%OK>XK26QZ=m^K?dRg z)MyhZQ1j&{9;jo)--+Bb8zzUMqh+h#{P#aS2836LXHt=76ldt9p3K>csU)4lI9$zE z;cNb!ZV8t#-Q8&)!yh7yoT|~fqAkht(>+E5KiPbeb$zNzb~w9Z1`$I+E$nw6ht~ht zBkPONmYX!S*Lu%J05>mac%KYUW>KXYz;+;W5o*3xtNG=7t+D){cijG{Sp73=vz$82G`UutjTzFcU6N^=Cn{Hk|zePlf*~aC0;fR zwzD4JRmq84^n`t(wkcZmPTkTjI2fOxCyr&5jD_orK_dhp7Zm$3zxPw&m-P~%4MHA{5NS~KpW~@t)`mG;f6it#)cU3$L-<*Is6SE(=G{9l zwh=PT4mnpIJ?lxU|Et_~XxHVT_!(d8JeikMjZrrc!p>*ek*ATBORx3Jaz;9D%y9>~ z^@oS+$WmSxuMYk+M+lro?77gZX5oTm)TUqG=}(W2W#jxLkgARms336@uX&$%j!R9p8g-&}ByqxOl=3e0!~} z37yYcC-PD>-QjbxUov)jh>#7T4bDW?Zan}_;+7O}o-s%e>iTtMK@CLW6?MC@uWpcA z+aFd#GL%Cy5>@xmE1NMX%6x8IO$=j5#75Ki%ZB-FlUo#_>7KIQwZ<8SI*6)hY=gA_ zT6_BP3i-H*tUp#Q><%F+(gP<6BvaV?h+pMscMO!t6 zB&z!t_({3<7x*b&TD1Gr0~1dAzd?eFFHZjhB;cv23=qV>dfff;eM`=&{kA-c zM~XoxEj0N9@`CdMU8Na^OEq?IK%=EDz5>CZ_rNhy?=p*)!mHmI&rXui{V8{%axPuc z3BT{#n$p{c*4jyhWBM92ga$S?Q#?lG_1zKBj5Md)bB7u+y8(Xj=b**(`~0WolKbmK|K}jY<1A7?a`SRI*wP07M*>hbE~pB z-JTK>2TgaE>48+-;U0&Jm~`$!tay*NsjuTsr3L;Bx5D90c40TwJax_+*qhnp5XCmF zYi=+0vR$0{9D8gItSv^{fy$+pkO1K%83nWjy~^b{yZ_dpdKv|;Mo+U7epESPsta|$eZ*5@-$DThx77~CQAmIktt*Nl0eMQf3`G&x*56RCICFPv-^J8rZ4L-e zVbH57WRL5;8clWaC$Dgf2{Hq#y`EDi)4O)SId(F&F4C+{X@OL~{Z zqO<3eh|m#V?Ju^;doDB^3>&cx?&C@RLv-$@KVp6|{P*0f=-GV4A1Ax9*f7`bT{*R= z123EcFOeS|2iI+@kOoOzcvoA>pFsKKIt z*Q0%~F4ta$dqopx7wu;&wnh@d=hFIuzC`5kT zlhKxc-ZV`X;&EYUkf5Op=L^U^B|0@Jud5iFQ;~F_G%p^??x5eBUmZOFCho^7oWFa` zB3E#o_b^<(?XA`takft(EN1G6sbJhj9NGPSiamZ-*z!$dlM3U;v!M0igg{r_h(Vkj z5~B!r|L3s2a3DPV_ml<2Z;|DyuwZ~a4w>%<&MNFLlovHA_&a>~~-YuW?$E!W2$cfWUyl8TX zXc*ZB2-0vi9juo$UutfZEKwSlo)jjP{rYjZ00|1V|#sWo4;TJshoW`Ezp3S$vUy z_H8lw0&4Rre8hK9-LCS8N4_riIz{sDL~zP-)qVq9W?-GZ+9KKP`{tVdL_k-_ZGpyQ zw~<{3?DxUZ68|ih92;{)o57zJZ=7o4=}}Y_2o+y+BvlB)rPS1nVru1zQ*GE})ILH1 zoCvJzvCkz1L_0_T1DG=P>mZMXgsJi7R^TqAK<$(Fh$2m_4dPE2VUt+6?dz8rk80j{ zvOG{)Th36E*XCPIf3!6w7PyoXjec)gKqy-fHcCaY%d>3S|30J3)}ToJEUHLnyt}{4LH=6&-}eAba8SL z`!k>&+BiMi1;@rm!fr3hGFfr&_$Y~$ z9Q>5=e`>uqgqGOfAMD-nI;{7tV`$+A_ugyxOA0cfFtF8ZJol~sZ?UJlrmd8vY|Tn$ z`T6i_n6imu9&P`mb%ENCzjP;7x8aKljANp^P)%X{`P1sqkQVn++T|$}{YaCmqto_W z$|1IT1ye_@ZJ1;=zM^iFrfxt27T3Qk$8a&>+ntwh1E1KiCz2&z(@Bhd?rMiVl@nPr zCVSHHvHffSN?r^>k=lR_hiE%^Fz$B*Y9mw2N1w63ksQdr z>3_z`2U_Oq5q!?8r>KwyywC~57{aqmFFo%^`K!AU*}%gwu=i8x{=P0wgDkL-pX=lA zwIJw>LxU(f>m^6M-IX7`|C)Fj<2BXtZ#~PumAWYTYR5xrdO|6FV3+1YxsQcw)LHr8 z($0p_ULH&T^{jPKL#5~aNF}YoLw`>V)fIlZ^~ui$vELEVx0&Hs1@bC3*w3d967Zci zrtK39~A$;L0BpdW?v%>pQez!vkhI6Hju;Eef=LN&Fk14LoK}Z9as?&}6=aKQ~G6J2g6@Gch=9<+Ln?XEG>(z^-=RRi`po>O3*R z3~@cEv#sW*DdD|C)?(g(gt>~Sqz+S;)O#If>_~rVi;{fB#t3i}{&BXXIdGfS=2do9 zCvIb(%n@LQ{Rd$U9%vaM0Rpg%qDS^Q0)9BcS^`Lde^X-f)>NcCxh>2l0rh+yQzB!G zY9OBt%3zGSp)K2uX0XDIP(+pp)c6OOVH;oMnV7w)@r?l@1lBQ^T}h{Xwr0;ju4++z z`LItfYB7$8LD8qgRoyKXBo`&py!64p+ILA%y64t3*tLN!K`i<>pdr_uS%8vc)qcr6m){vmI0R^+KQyFOk;WM{WM%{db9 zpB$p+h^E<#c4OuJ#lsG8!<9K5mEPejQ?aK@r#Fb?@$bgP7i)i-rz6d(^w>k55G;mP zgN%8O87l^NWu3=>r9*Aa&Wt$&2e=bK=C`LR(cOl!`Vwr#7P2sRo5iVrG(dUL@a430 z3mAK_`9p<0SVZO|2&F3YL~U@7ZO;4;0eJZqv(Q!Iekn`YKLx6Bc=wnVZLu|}DB9QQ z5I_W#J#3u;jK}#v5)cfcUpNwx(;m0;;72I(sg|5E{-65J<=Kwtq5sRoE?<+o`{!oA ztL&HNzgU3($(aYUd=TCQP0z$H;st2_h^Wtpd3Lo_Hl)4nf=o=&ys5ud2gL|2gz~&Jsz*^~Cd~rAobryx z7Dx!JA^3Mgx!6kKCUySnThhh**FD{S`iN&RchTwgCRw>pz3oYdcGOO6XLEvtc8@+k z>9)W(r%6r1?v8Ek#1=8AbOqYqZ%pE~3t0T`;Tl9Y&&(sgDcg&kao<&boqJp(8EC?L z>reT77}^{zv&3(4W&#(D_-FX2ZJ7}5O~2aJ>LW0l|MC{=(n2X?U{U>lN0EirQ+h%F zqjs)a|4{4hBFvAY^5FDt#D@%h^P5XQR%E}1F0Cr*n(xm(4g>c|Zo(!j2hdae7l{p5bfTiThsYDU^0%K8+&e5 zG#1g7v=V5C`FEH$>Le+C&xN!5G%^=Z3KD>U_+k&F4za;HQ(SD(9g<4$G&UeJY;(h5 z>)pBikaMxVs_*PEKUkv0iibhWk6ugT8Mi*a+xF9Ld{_W8z^~`lwLJG&C|nd(jz)8}*tRmiI~l)F&UyzD%dCM$_Z#&BYvYg-4gE7&e;QHj%c;{=+H4{fj^Zhx2vct?qC!USP#Q-|0AF zdMHrzo|_d}x5=&;KgI|LasBF971GqHq6ZYJ8S!+sJ+=Mk3do`P9)Z<`f%a9%sN3px zcj^8vsDJOu(&E(TPJ~@&iR0;R+g~4^%eaX6U~Lq~fKU!k%wOe(dpa=;x;@PB`rxiI zu!&B4Q#XwAr>NYy(frpoDW*Elk6NmN?U{5MiyQ33?Q=+S3Uf_VxsG-3MkE*WLy77gCnVSeh*w z&gPy%u)1Lc=FBsSIe20J%2WY=*CGbd+QSZKhb#{|}L7 zEL^C6%l+^8O^-?~=9NgrU%p(fgVFnWDkUM}2$(!DSPHqkW@D8G35D!4+CoEEX$J(G zZd%hOGu%6U3-2};oe%{dyJ6nU-D{}ZWG~_*WPf!*7lx31lzEH@TtXnDCHeTZPeb@K zin!7z;Ucb2TamCcq&FEvGd@$G>iPA@S0~DlRpAGygf0KKpCKY{2_hd5j=O@+N+u>{eYX3V-KsW+!bPZ`v#+(npioTd|t^ z1rXzF9b>7wQTZfp&m$T>a?z%?+I+E8XL2@&BCRs3lz3;$DjI&hvrkU05&Pf(=mXGd z)RnFXcTdDkGVzeRnV$9blmt8+KbyKPJe@o%QfT10Eyu$!u@I84@M#Z`4L$hrO^HztOTKxr zt6*W279NjGVHm7;Ja(uV(7$?LFGtj33#JPURGc#m2AgQ5kf$K0Ou3EpW30FN9^N&j zDf+V9;+41gaGN zC%<~5z%vOG-T0z>r5wiH7o;=lZ976HeRJ)w7S0X*SFwR+4vLFs|C$RQHg$&_Fgb<2 z?GZHMfD{PkO$&KI;HXfWwbAj9dqF(mPl@NS>kx~nW@dWDFlZz z6cd7%#>GS_`<3;E;%iK%)Zy&L?wLi8;l*k+rxiX00H~m;-Yb+TV?4MYoE9E9gC66SuS+q(1^tq%hR7~{Z!^qcb7~$! z`QG}8WaTdq?!eCCfHlW_<}S`~8+;Iav;%$-%S_Y+towoLz`#X>(QmJ*ugzcq;d!Mm zVD8SpMhEv)uBDEPMC+S5Ob7RCYK9m&vr-O^2ECMr}?xblo&Sa`64`tX?I5$ zr=coc2o|ih?gIC-g;~k9IU6xP?)KT>eOM>QOu?UE1y?Fsh@>M$dSTgYLEz5k3R;-x zT0`@{*5g`z#7g#OdArsnthH`;qAqE?!SibYG|`l25EQVu=cag-VOBSnAuB2Y6a#3M z9QA&|<(Da_k9&I+*mKJtCi)F!A%-R&Eu}`A_wj2mmNyJV?RCGDn)xtgpu`lciw2oe zerw~6`CY_S!z-(eNVKQscwn2-OZ%9p#FV2j%CjUHiV6r{57L#AR^YjQ2QpnEx{L3( znWeN|Wi>Oik^ec^41j`J{Cx@y!#qFAYbGp7l1)|eBdk}JwaU%eExt7* z>*-V-L1A7OXr=c4VdG+M+46#^_R)TEFzD+;acNt`LbgIreru+cYLhEm0{LyzlE5Q9 zwR`%tx0DW^lguWQ&>bm2*foq(S2KOg5fU(c<_*<@6OMKTqTRtE06!#hrR9m%s&9ky z;`_tH;J5pt7_8LbMPYHSR8qy8S7xSs{DY5k^(dno<0B;%fHIQ;w`hFV&7y2xu>xV^ z+T5eJD^Fdx%9|-*kgzH_nQFGo`&mLM{O2L5xv~$p@Uu?GmiIS8lcuqEF6Y8^|9s9YKm0#^3Z>y5R2RPhXWI$kcessDt=Z8hBo7K39FMJA}r zO5p51ksk2l%AY*AEJFhmh3x8_%WVdOS~-Odg<07p~Qm(g54MC2nll^W#_I-B% zt7L8IYW+(im1p?0W_b)-+pXVRgSMZ=aQu$l;y7)%{u3`4 z_!~-^#TLf(t0~b;TfTi+sK_TAi~vK=hh>+;@Wu(7ibJ1^jD{DvX@M5#^!`E!6cWIE z(748+Vhy3-I)O(wh!NrfYEIBASO-`)Q z?>zhY@k%I)bFuvcu)eEs#RtAAIgzPr*;OA$<02*}&3pOF6+zR>N$=qS19!qyT5Op% zT_|&itz95<2<$LwUuIAFRJDeM+OEcN9E?#E=&4m0ov*^{mG76&sRn*QyPADk8@efG zAYVz2D%1#en;<(0wAizNTVc*z?580YuGvy*OBVYz`XL6B-d|UHw z<0ZJKl&U7F>9l%+)yYkZq7U_;H=;1=Ws@}w=(g-#v>8beqsC{fTGBRyv(L%Y)hGN^k<;2%Rcv1OTL z$p#Dz>`O6R=KJEyk>n^u4aWl4dqIli7V45M*cZvZ*^|@UAikHFct??ISXh1({*5DO z;CtylDvE8h@HN0F4+#=9@It-aN|SU3t_*s-hcs?}A@}lEYo3FH#zgbGzuar#lE;#d zfx}w2$#9H3+bXc`CmmOl7w105K_pXu4Wq7McUbdER#^_%!lSK_!6VYU%FC>fR|U%~ z_3g#df`PP|UGD4Xc2;{V4OyMWg>;Pq9>xJp+4wh}ru`Cu7FmXp9WkOVs;(E^&7WA4 zg%n3)+YCMLel7K7Ro8}_CD6G6O5)2OT9PS+o-fZbq4%!mNPLch0pV&n7YcBMAjd;- zXrGdD>V@%1M(?t)&Lj1%VyNYG_e*^uThEH;p&_X(MKzrUV%DDK%La@Eatit8TUV_7 zy|U?`Py^ZdT|rGfp%-YAPgkiD@u02_FKNmw76BHQv&pos^kVb9j>B0C!LBON+)S{f z=WwP4IfT-UPqj)Fn{QXzP?ELvyALhJNM~Eo2)hb)S}iB$aMzH0PA991V;#Po{`Qh% zPuNegK=aDzg^ijH<=`&nHk;+@5Fis4UX*rKZN&PVE$EhgPU>QB-NJ=fsqjHk?+v2+ zPPvRl;A*PX9i6&;-QZBXTXD+YLu&ua1-3rD>o0bvq0_egYeBvQ6S5>=;C*V(EbUP& zLj~sn>fv{VJTTfP`=UCy?ltxhB(n@-auk3{yuO3 zeml&LUGuo*e98g5ENQL$Ph=OlvPk26fKiksJSiYO;Dp%VO1(ZL_a)2oaC-BTg8@1|KaZIG!*7CcHno{W1DDbYFi%j?fhwIKA;#M7OYQo z@7IOH7n+b%nCyTjb#v)9rKO6s8(U6g_iEHt1fE9R=L39`_V!HWNy2Y6Sa!+EZaB}! zk^Ov4s;rOG!!6aDK3yYXFmi8C*9$NQzE17oqyVY;_gN06J^I`Ro@w{P3xR#v7wE2= zg9m?7M&n{uzT=VmO+u;J>p^FS*0ke7GViHkOB5)+Si%eM_YX?A3$radeF^xbuShj*ztCqNvAAEs0yVW@ib`@sO0R+N@t4Eca_#e3J$ zQjbT+B`rqNVeb2jUU6MkV`V{f*gSJE7o*d|OQQ&6f;On!93=kw8ERz&YljoC zXJj)MZ+FKrox_f#A3rqEDUvA`QX99|-g+Lc$#6iBDEl><{zgQe>dkrZm1$VEF!^Kh zIf36KbCD(ryXCyxWkLpdC@#2p!v|iRB_~i(ypY3T%edP-H;cpwr8h9T{d&OeyxgLW|U_#o(=tZz=9o9w%Cwan^Bd1;K>ny z0s1m-5YMJpM56|XviUkv^t zduHp1hbaB{Y+qrq4|(qd4V_j=aKTmNA|xzk))m-L;#}`iH6=akm6-0l2hphs+HW2S z*LPcG&>~ltlf&+jTi0$PjLD67`kYDfz~TfO>b<(g+;7t*9Z&}oH#%wMU`e+yu%>av z31h3aU;_tAvSAWYldGtMQB3qzBYLZ%TW;Vq1H@rvJNs76ZFAo5baDxeCH)_~J*a_n zwk^4pMGy76Zbkor7Cm zLQis`h<=*Oib}-XR7RYI5cEs97unmc`jL_fY@f#HwIHR?B=Fy~#Ve#PzIWc+x@ueB z)K&Sgy+XS=6~wd9UA0p&cV?qY1QM(uBC>4o8VCfsS6zWwQX62G)6-Cadf8KR9GvFu zTB(T|chs%nQx@~;WT5CAtT?D5Gr>_hpRrrJ0`duU_tVs$%D$7eWRZ&P-LI9~t$Lg; z)wx@T7t$PmWJ$lV;xXfqaQbXH(#~_{Lo=?tB3m-Rpo&Af9KK=iTK9p6J38&Bg}x2T zpaz4?X$3$yG#_hyvg&kN-b4%_qfvL;_E924<|Aa(kf|rX?7)3|Np+7cTj90rq!b~p zPi>mroyGLSO$t*NuDju6wq%n#b9hV9=MCleNQefkfkcPKUOEg0xA zW?C_tf|`Phq>2SMQ}4!`+{$ic+bz&5qf?lvS)+@f4q*8c(v0Q;pdwSXz#847`_WLa zX8dR;@stP&ulA^GuEyNp7Pn5%bSuJ*6;B^GjzmAjN5If&g9RH*Pphr?qK;CXlEzea z>}bo~iMw%IstEa@D%by8$6&T$Nq0MW#QqQw);Nd)&OP%iX4S{zYu^1Bh zTfAND)xPdezQSbrjM_PBz*vcVD+cYYk({I-6(-kZa;EiFL4`)6F`#`taD?tXNk~u# zH<#ZR`bUYy;u*TGqr@8B>UG2t_15dbtWNih`5~M81qZ8`kC#O~B~Co$SGGU>1iXW9 zS0nYu<75rPGnxr`#k>z6X+E}WDw4%e_pGG(zx<)32ZpFH%DNvZ@?#fiuJsLv^>eE; zF(t?W39a@+3D-sUS~&G8Z}M|euh%`Gn}7Z7U6FZeEUFb_A5=(K&7m0|)P-iWZz#qM zEmJzbd&;9tQ@%rn-duCtUiazn4dB2un&o%PR%nm4w)g__Wmg`L_^|n0&t}SWdaQDz zjv6itFsZNP4^VSnHP55bRI=$}*IQ1{f|RMDW|9i-E~+?^F^;&4=}Qp53J}tKG?hEf zY8)riLkE@MBzpt9x&0o6xahDUc^}&&#SGb(Olva%dK-2Qb-gza;{D-fu zbwdOUfcOWs;_jYw*X)H1KvF6WF32en-d~wNv=>KQ{<-eZt8#gWoN`3urZEPx5z2ti zzZS}7tGRSqEvOaVsLr+b(P!3I7j@ol4njuwd_56vLy#7{!2ZruxPxo!7;Y9NFv27M zv49G%C^VY5+3YLQ$ny>A=eneH9z6*pyOK}1I1!( zj044__l(ba(O$rBK>n4dqg93y76AB00PPNnJIyiEa5h}2$mL}N;XkCv0{EWGb-|MN zju>{?D9(wdtsWZ{99rVF)%&?kd?RuKKhg`!m`FbZ;6y_C(xFdC@%?=B?&gT$>L9hF zZHe=|Z-9}$SAf`;K;0F$B_6hqB!}loYAo?)Yv`_`nF3vuZiQUr6b#VFSG3$NoIt~D zNF3)~crk`mpXp#nf-@pK3OecWc>!FD#E*xD#JCaw5_e>0Qc9lv@pq=40k$Q~_+}3!R+DZu_NP_-%bJq zpIJbwgvmW2!{g3=I(l37p>iW@Pp!Y7YCOI>)iErX-%8u+Y3Ha4N{p5srtqr$BVZ?` zfXbDj$L-p_dooXNv$=jIGDKq4|3DHhq5a8=XVh1XjKb|20WrxkqQQA=TwQukz<4|2 z@Tec*V8uO4nNd&T)@?+Fp~%lWCUYU^+sla`>mW`U^NrzdFxjis(Gz?*vRlZ znK=i>m%m#i7_aAwQflFmsfBR+#61FJSe>MJU#d{uXW*ne*OEHg`Ba*y&|Zk56v zmnZ3xQ<{ZcJM?>*p!0)Y_T<0)0ByE2ZK0e9(_$lFWVy$@lPA*3Y$B^YA4CO-_*e!c z)3G}`6c7@*ovKcd?Cgz{BocfaoOIDgwvr`RIC|b67K8+ZpZ^R+pi@aVH|g}c!3CWO zf`0buBO;-<9;3Vj={g*6|G|C`paE+XCwyb$>3nbuwcbkFaGh)ab@d!2em;RbHp!%5 zne0PN+5)aCO0G|E8u!~~PZZ`SsKq}xl1+ov#g~7qHkQ`x{AI1({`2u3`Z_Pyrp3(X zJ4JmzQGkJ*ZWjSP>~aCyAzmiBW^&@{wtKl|3q~o7`?^UqokD)Mw#lOhG{oVfzvjGN zV0HyClgj8HuTnSy%yHoOp)(oavKlS70g_QH5~#$CxF2{r4#tHHy?RjlR3|FnVNtz6 zb?R0T=rq6>q2`0tb&v54^5U(za;Rc#eZ1$Z;ddwFNELhA$8%xrM7{y3rMacAs>rd; z3^b;5gKJWHb!?aADJTO=iZIOP)CzjC0UUW|#0DXCrH&^#_$Lh&Sp29WIPX_J`6|y+tTE4!YyR(CqJzmdq@}EEKXfClAdXNKS$M)I#|f#=!tf zYVp8Cw-3~I>Vg79e&(JxDT=w7$Rq#5c=(X%VLQKA-cr)l?McrV#n)y&KYdC)XqxF9 zld}ii)5ET*jpt)|JEbv4Uv^C->+^^!aI)-iRe4DG@n>qG?q<6yPzc$s{w#?Jlm6J` z^UIg*ZHuXF@)^#Ws+@~1o5?FS@u*jnD*z;{@GZ%;+U2ZGn4%<(NieJhkk$sMBiM)2 z+f}p_yT1|0GC#qp-e9BK#1Idwg2P??6mJ^LA_BXNfay>n;@3AKq%ibC(TgFWhM>@# zK^lBooY~W0hf(7ej$|YT7N-qXj+#I2b5))k#L@?-+|Lc~3mkvvzgZxULS;RmX6bX^ z-%i}5w{YWjNhU7KLVBXT{>7HNv5+@4QFPtc>g}Og(a*Yg3iqv0-YZ7??RLxM8jE1m zVtn}N_?+77TH|*4*84Yyf6)goyxM@b)VjCf3j_aKq!<%8iwzuTdLT1mf0`U(KT01@ z3N(N4Un~GG&Hd@hxeV#sdZRJ=L}7-`=Aw&SMwh_obx@Y}F%*>*a*KY+gvXC=1X7i3O= z?1_NLiBL&PZaRIBU!x8*xv&WSi87{%SOz|p*P zP#-^KG7n2h^GoBQyOo~D=cS2Q0SSg@bD79KP$BzDraeXDrVE`$)cxcths9g3B*6}L z*oUKb%UTaErm|qRVruj1b=(H7*#R(2-onH#*SD{xW8cs_#*g=RWN{PF*-{*01oZo6 z&Pl^k+zqYVj~QZfxX8uq*Qq;s^8z#xEOg`DpHgc$4H&>$Pz@^6u|9Y88yBeeyzVze zP`hn6b-y-r0*6ly-5ayF=M1ztP3#)){HqFJeT-7*)4d~f%nzW5DJIa=Atwu`Y zH%2?A4l-cb9mNR5l;q8#B&3UmZbpQ5SLCyPsZ*k<-+DdwAFfSR>%7Rb?sDB!XwsqCpx{#n)K6LM8jsi@#5C#PW%z?sZr`f1n&Zlqq~& zY1!aTCA{=n(}Tna`54vVrbcVr7H+65MjDKN{Xx6VA(MekyQ!$HPZ`!0{idHl zWA`eLlE7*noUuW!IKOwK=S}Cbrd{E$hm`=KUs<<3>ozS1xMoDha0Td3N_YEq8(ao`6RK+fqF_7{N59@aIDq`1lT2KxN9#3SPtK)(1C!SBG z->TNcN@NN9yr0x{HJu+MB4UC%H}Au0B5<~@r_No2{2pnF)?c1)0CK&z6+a6)4s&@5 zEs$H?3%(ni41d-+cv;xZcA=X`43xT^PUvOh=ZEpxxh^Y4aGzE2%t1KAnbwl{G<~{% zcvm*Kdl2(dEdSHAXMhqD0I-EBu-=_tNIf|m!D?vKDR@HchlXm-`#iIeSP)y6h%M&3 zK;~#I{L(3wBc)iF1BxPRYo_?UTlol2PrQ^|z6Fc7-Ddv;-YjBQcohBO0Y|anN$*Rt zC{fiMinxj?2$C9S@|aWn(HM7y({@u4K4(J1@a%q-oHYE}WVHUqy{eZt6Nq{-fwSHp zJI3GTbX$`OkE?9qui|BH?VK=)1}r$gA2Iu#&{PAZf@8vNH{qZH_lqpG`&l%q*Dkp0 zswmsM#!ogUAI_F88U*JX#l9oDPp!T0kG+=h_RewXZn`VhoMH+x%K7a`H7)6o)r1?> zUkmx)Ek9LUDG_(h4u^;U61Kh(_sq(=*iL+n)gYulzZrTNt=doH${rPD_E?!q#eUVZ z4cEIqXax1dlhc|DhhAL+qE4du7UKDaEuGZ z7oHu$01U6H^(h5>o*wUy;TEe8(urir9lee)2POKPgZG6+AV~boDFNHgXT{e(JA3RT zay&nOfT>HNkXXSmt?(CAkBm>LdJCjvfW$jhaya-b%%hLcn1bbfI2wSN1#s9~ttrPAMmm=rRrkBqmVbhl11REL0+{u16H zv(D>n)xpm_obYk`WIdan1Ir7^e}&I`RYP{szzyeW?4j8?>Uca>P0_F2Y4vV%fgzWJ zN>zIC2ys_NfgywQwrH7;70IfnTgdM?iKgZqrC=Y{;Zd{FS#I_9T1hljdTKhXdp+ft z%hpmQ{OJaA6|_2y#OE}bIIysEcw~K3RBZ2buqkA5^`yp>nAzHf$W8=pX-iMb!0_~N z!M8*B919yyw&6-b0Cc8@0R)@1;pNR{st#*-SJ* z!PS{nze?QxPWVi=s8ApQL$cDVHre6)BX!fbu|_vYuweM6pjwDAQP1wjhPl*XYF0ci z>z$#~t?cN-jE(V3mb^KvlYXbK>E1EwJCZPt@IEc)s)&M~Z{Cd2@n`CZ^}e+sw|Zq` z11JD1M$<2Md$U-3JaX{Q+WWqxcUC#S|6JEItxEd(#m{Ffd^K)2g{mLi4YYyM#9gzC zMeUEh|805rI%65!F5c%#RkI)0lOyXJ^GY;&G**`5?%tpAqh}KkKORoYX?^~lP)`0I zjE;M3bQ=qKdQyUlmDy^3x#?`6hrK~0&Ai20cua?T)#u|P3^fYU~MZ&m*+6Y-3s?fsV;qW&6g8ickl#4ubt!!ylL?a<;t9 zX0OB}Q)+s)nD2r#e7I*}5l5f9H#3+0hmI$70u0#ZAFWN{R1O8QK%V5jew)PYnW&!6 z8Wle1I@0d<6=5>m$IM3`)o1g@$H4GUN+P^$j--sM6j`sD1QOOJTRD?#Sa@U?Euol8>Tav+eStlS}#O(4bo z;vY)O1US2LHxj*zxwI0iPWkNvUk=6yOY&)Xq{g0_>}sG)d`>&vD+6i%#$6}{;-zM21{|p0SOCAc6l^TnDto76pak05vk4dHu7Y=VfEFsx<1|C?zyA{c-LLqIBtOVH~_vmjV73JSq) ztbGmx5-vwyK{JSI_^9?hm9n`_rxqc}JefsIBdNy2a{Dk43=r4XQdCe@D-66W3X*S& zlUfLt)C*6M`8a@@k`@GBN8f7^flsVL_g6+urHKQS+RJ=Y4oNyXoXTAsiN%@oSGbk{r{jC=58W04ZeLy zd}I5*7jUHTT5^{-RN139hRS)g^msKzEsw8V%N1&Md%DNGKFE~d7VOA>bTI9tWzK@P zP?Nbi;liUG%EED+MkKBG+L>kAO^ce){s;vv!#=3RV`g@_*s#A_tkBtZDMow3XK5W! z@>0MuhzQu9F;g`NtDI9_DLHJl5=a|iVp1cFLj5Q6z^B3xy6o@YQXX?tx1e{*e|Q_$ z%)XP}5q;TQ zGeu>qfy|>X;6RmDKbbS`?R^R~VQbc7ye4=tM&|W5>2zyJ|8Hbrh#D9i{x`Tn{C~t1 z^uJg9i-)kbiw&c)QKz!Dr3Dn(E2@)JfA=g)q6CC?@TJsXcU`_@Vb0d^-i{R~>+G`Y z5*`5nx<~U>KHfcikHB1gFsbF=_67EYsgMfVjgEojLpTND$f<~7S$Zx9#3N(854SBd z8dM4f7~6raP?yvJ50|m35TwH4BORM_(kfX}TJA4(9GmCeD(gPMDAjIPYxe%-)4Z;9@kV#TxSnMylksjdiMo7S1Qj3rafWf_}VjvqCQLOU0fL)ue1j zW4zN`yAa+!!tTmrW6>-v6_3(3izohPKM}X4Erz-`GFZKCI@^Aj5^C42Y)_0j(0l3U zO-1sydiQ%puEO(#O58Y0t-BTdxG_yfQJI`hT-&-&g_e~yL9TjxjL4{Zenb2}jR0#1 z*9BM<@RNLS@X~qYynpuunh2X=RbaUR!6@ZKHiY9~lT~&5#1!kcYxEv=DAn;TG2~G; zYfnb#BUo77#V>Ai@PI#Y1;ysf9{1A+A9Nx(6aNHd)vEhU@?i2nmikQl?3M?gIUN3 zByEXp;lSM*{^7lZ$ZAh~4d?#h7@RQQVd%Kavat?e$ROP42?S_B-7%ARDx+@%F9F^4>vK zcYW(VHzr<0r}DM)ap=kj{t+vd>vh|#wQ>Yg2Dr#vKP4p?UYP$fcP@WE@g9eqU6R>e z;+t8oB?Nod?$35=jXZW`06Fl)#DI^a_;SH(2@cyf3gs^r4^hJF7qlVWb;v+Sa>r3c-y)Xyp)Pv z*!uG`F2yD|Fp)UJ2B<&K2gr;Mtz()x(T$I-oPl=b3?OXcPtSsiWwyB&6&wrjd&jkH?h13F`bWM^fyyIoAz zn*sV#;F|xMP(0$`&xVGMphvV=DXO;4UlSxhXuFvGNptFtLk>FVM6iE-c`w7uXrb32 z9Hog?ytYMuszTgYA!sa063ZddyDBB=H%t+1~p%4=CbTKC0eysZC9{dCH|P&Eh8tV|EI0$>jky!N~8yxwloftLJzl^E^Im;Z;L#A;WN9_*kHvE?{Z&`3QVGl#-7h@cDgKK zI*zN?jHAAsSm|`lP9zY(Oq6F@jcF+avkUTI>3wR-Ce_@czretN+_y#8BA-4!Wc${k z6`y=+K(FLU_;K(h-z|V?jOf~_4|GN{)qJ6=^mr9VxBbR<qsS{pe- z0RYvr(WRC&Pm_p#-nr~f$Dy4$a82B&3k5eq&Df9gN2^PGCfDAqgI<4Xlpx6{9INeu z=TGU>#mnT&3(we)H>75>VNw+6ngY!)x>m-`pX^O!BCDa9jFcBK2csFJZQt4T*<4qO zf^>BswOO5h&fv`D1q9@TAiWjatZiPYiYm4=8H;T$K^!FI+nzRJ?B6e#T^G>X#j>hp z9S>Z+U31wRkvz3p;}mJ>uq&Pe0HlvpqUrN)4ll-Qna3T>i~z=zPh@Kc&2i2ijhhbB zgVXg)yN*Gc?z944Gg`9-UcJbEc(K37hpR<{oJat`)bhukquL{M=OgMK1iI$Kg-=`0IyXFgI>f z7$Ziczk~`@D2iVW=)x*ftK1bWI%a9B=v>X(&7}=)z@5XL)xo7kg+zp^=GRDGxh}n$o6U1ORYtuKt#3oXgEm29CHH(crWc z@onN2!GZ4m1^)MHY!7HepIJ7LQKqs}0__Isi9y+rmXipMnCjlfS{P8DNP)6PPZzFX z)YA_^yVHs0rKQo}$pBfn_ID*-3Upy(XMCmGwvP7oz8xWYe{ad=y+I^n7G z_0BCouUwwDnL&s((n1?k`irO#^y*&4r@)nv-XaC7w-bHX4oLfEi?7n};ZGutMk<82 z0R84un@DrG<8`xJUzo~5#QoKnT|Q5;WNlm3xC_^7ddVJC3W5hQnL0H%%=ub!ptDrU z(fiS%$!&3xV`2p_WHXlki;Mqr1; z@Zrk2y6$wJqTPU4(=dz-{VE@OxrL(lQvJSVAfr8%9Skj7~Vo-yX)&&l#8oW7yM4<`=^yvgl-&7 zqv|ObVPmwe^+R`Ox`aj>;Jm)9(w%@f&F4on7g(iPHbQagS&w+8Vs=ywfVt>vgG>J4 z;8N=)`gYTZK2qq^)$tO!U=S%{x|wEcnd4~}=eoT`q=GkHk?xKWTtsHZXrVdwl zH@ryMn@p5W5~TY*G2mNn=Up0JK@Q)gfuNiJv|5AGCbS8DOE(MfHhfJJDzypQ5mVP`2Ce@86QUdzITl(2J58j+!K6#=nPBk zGMvfN=sTN`q&l?TsgahXZoMlPq764{-OZTUB{L7{5IlrOd8ni zD0_Z-T2#R5<$W3<$1MIN$nu_xt7K~{$o5aH6?3?sA5BiptgxU#-pa@POpx`Xb;kM_ zev3Tg&7-KN>LPAy2jXJpvbgNzFLn_$ESJB`Gy1%tmKk;FGurqdz-ICKGJ&ejgvmo< zjb?Z4w`KfzP{4q`RmN5hqCjB+Z@jj0FAm+vf9V1lG zj+UlLHE$!8bpr^xC?W%7x?LsroWJB=J>7pZY*DfR7`x!tpA$chdihU(@O$jFZV2Vu zkxxd~8&dm=_V8mXBqcfDIWEy|P!4?%CGU9Nj-I-x(xvu49thh>8=}PwRU1fi>_4uz z-a@ktH&h{SouJEe`uPkug~L*|X1xptr4$W)K6>4(0Os2>7BpjR1mfJw6>?8p-86+x zBpyX}OSu4&q+Y)UfQu&V@aW!Za#;U7xYo!C0P)f$;6$0F1Du8aQxNPu+WJ zQV9;Jp+N0DA*s{C9Z}P>*U?(VrDnCRvAH-Orsd9X_N5JoZhS(YF5daRYPeG4T=`|7 zxBepVJ0}CN@AO5r#AWbX!VHo_8J!gyLdDq&UwDA!%e9?F#-xDfCd1_M1Yu1q+O$b9 zb9N@gjNx6S%9XbUS3^YyQ>W!Np2E}*pNYG&A!9%f00Dek>NTtJP~X{Y9f^@)ER2B@ zvIGP}iiJ!ot>mRq@<9n4tHXIk?F}8}Qu(3d=Kx zl!^eGrkBjv9p)L!WE!TiK09v*W;r)aH%|_gezG&az!m7f`7vzQTbGc;7BS5;N`!e_ z#z5g5LM5)aehRA=m=ohb>Ge2wwWZdk`}fVByc5O&jA!yY9wia(pYl$V<&ZF1dTzGZ z@)&!zNL0U?t!sS#2az~!lEu@&#my4JQHrJvtDI%m`kst$Ipx^}V{!B6LK^hnmU!b1 zl5xOH~T50Ktf>*HCdQ!~L7o->E*t|9fs_#hPS3pOqd zyawWN-M5~{%7+9pvV~@o9)FBgFgf7lan^kejxaJxzFs5jk$a5j*Vl+p@a%5V^OuDE zGOf0s3;qP6a}P5QNN-1^kUn0xIv z>)T-R$w57r_Cq{-D{ilK2&v2F?&v0Ag{}~{bPDNJaH0D7918w=67t+^U7t*q3A|1L zJ2qAnj-P^aBhLLq^2=o{^1YyT{WHh&(dU7S_IX6@9(LI-*4PMP1%bP1a#ZONC!G!{ zisM3cvd(5^ejn834fyd`b8Rw=wwIUl+&mh#dTsPzYB4=V^Z_#KOfR$9Gz+vzvo$u3 zbX1x=j*y0AvO;dhhP&Dqr@@xZ1RJgTvO0GH%D$wKXK_^)vee~TF~)*u_g3QP0hID1 z-`WbAcsnl~%obW;oS!p)ADss1REDqk`l&b~06OJXe=U7>MWsjfx4krKvrs4H2^?F zp(OWGo6zM!k-?J~B(;#gE)DLtfTY3E!*RCxxPg?0751nYj)%YUT;ta|FFNZFT$gR> z18Vyr971g6kYmWIvjEmcBh7JI+xi&*c$jjc^z0x5O(p1TgIf|O#WZsI40}HGV)Qpr z500HU@zbSc-r2Yv;Ubp41O#f(G{=Dkpc|Z_A55~5L6iaK2#8xZr_r2`|(;cT!hX8z0X4nZ^WQ49nfW%R6=4uZ4AquQ_PK+lO&_!lO!; z7&$g38``L1wyF=%)j?+u9dxwvnd~jSBNIR}U*EtD11}}$c#FAx`R4T+s^lf7eA29~8w>1sd? zwHxhkWS`0RE%4<#`vP|+Z3dHK$s+|Bu0S0Yj6$)~cW&OAvqv0HWb#?U&g+u_jQ!H% z0&j?!t#!Oo=M?5>KH_(Yn+Q8@1y)IDT;_fB_UXoxOtQ))y3xF zQcQdaD<_k<08>jZaBhlu~Zn!`)oj$LcM*9~q(NPXtgc@sdHOEw%qZ-2ff`h3-GE!q=c{ z#>2m#j8g;L{8EXP=)dG0z!c)drBbCQGkMMZf|B(Cla)z<*9SIDZ+69331MaXHUA%;`Cs!W zs5w=ZkU2|3jZlF-VQ>aVZ3khNe=KDr@UEKxoANJH2)o%k^{2035p{1d4AKk@*U>o} zMFh8%s%r|urDa~F=FV}xEsuih8mRcf??fS&b9Cz%`#g~Y5Q%{)#DMdx8F zhv%(vGC#FIy7~s4xA1)ZnhW_k8*c%?hDI+fm|j){^uK1nw4KG#m*E&B3Rfcdo7`g$ z7Q>b{(gX-UdaPlqGx;nADAZTA`(7e(-u~;btT=17mk}RCZRZasS8;o(+0P#7a7t^r zY{cE>4sY#Ihu3d!d0L%lx!Vzyj8y6uOi~D1mzXFUfIVuiQ-!;TjLh|%wiMh21G9zU z;Z1>c2$y61jxTHmg3P)u#02~=LS|NTd$-ZXRGI#~lgV4R8n1uvDbg6TryDljXbCno4d^Jl zjhF5+#Gs->;(Lnx%+xvC(=LXVygbR^V!;Ejx*y#K67Rl^j2|E5;pH9CwUPSSl{DlC z+ge^tD*C+a^tZOqR;0d(L1TsUk55W25&MoklmbVoKa$;X7O9izX+J#f;T%z(-=Zb| zoQ&-~n7C5?%k9{R^^@hehx9c*TJc_0Z#FV1lt+E6l|$ z92yH;Q#`lxVW02^!^f)?*LD`{_v{%%!A@7L+{;x{qMwg8Pg$YroJWS#hL%w6I?v%#GGNS$0#-ysj~S6y!WT#;~1Gr;1KtX zK2$ZR^@Qe5;FDOvY)7j*uSmS@=D{k;rzPFBLR}kEt>$IzI&G3$N8RSmW;1;+%AoII zR*H#Vm7=Lgow{huDfi|R=i_VbhA!~+<=frbg)x49FR~Az<99exuZ`3ybslH6#c84B+&Q7>6u)ky;c84(}KCHQukc9ZYw9od;m~<5F z_7wFE!{Bw)UHIbnHinF#>T`UJk?g4H-9nd&%Uic${yh`9bP50#d&8ug1|{uFAystW zbO=ie@PCkn*om|JbO+PS+a8r5ff|bnO7%L$N4qCIPlJgT`Q&>)LGeH}egrWI%WlDM ztw6UJ>8wt}YWp3Po(7QBJTcT744sggd@VAB)AHEYJ+06hL{Jkw1v+w*@Rc3`032H4As6l6B=U3=kmgI}Jv%7bScf$c-c_x~vT;?PhEIt#WPnU + + + + + +Glances + + + +
+

Glances

+ +

This manual describes Glances version 1.7.

+

Copyright © 2012-2013 Nicolas Hennion <nicolas@nicolargo.com>

+

April 2013

+ +
+

Introduction

+

Glances is a cross-platform curses-based monitoring tool which aims to +present a maximum of information in a minimum of space, ideally to fit +in a classical 80x24 terminal or higher to have additional information.

+

Glances can adapt dynamically the displayed information depending on the +terminal size. It can also work in a client/server mode for remote monitoring.

+

Glances is written in Python and uses the psutil library to get information from your system.

+

Console (80x24)

+images/screenshot.png +

Full view (>80x24)

+images/screenshot-wide.png +
+
+

Usage

+
+

Standalone mode

+

Simply run:

+
+$ glances
+
+
+
+

Client/Server mode

+

If you want to remotely monitor a machine, called server, from another one, called client, +just run on the server:

+
+server$ glances -s
+
+

and on the client:

+
+client$ glances -c @server
+
+

where @server is the IP address or host name of the server.

+

In server mode, you can set the bind address -B ADDRESS and listening TCP port -p PORT.

+

In client mode, you can set the TCP port of the server -p PORT.

+

Default binding address is 0.0.0.0 (Glances will listen on all the network interfaces) and TCP port is 61209.

+

In client/server mode, limits are set by the server side.

+

The version 1.6 introduces a optional password to access to the server -P password.

+
+
+
+

Command reference

+
+

Command-line options

+ +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+-bDisplay network rate in Byte per second
+-B IPBind server to the given IP or hostname
+-c IPConnect to a Glances server
+-C filePath to the configuration file (default: {/usr/local,}/etc/glances/glances.conf)
+-dDisable disk I/O module
+-eEnable the sensors module (Linux-only)
+-f fileSet the output folder (HTML) or file (CSV)
+-hDisplay the help and exit
+-mDisable mount module
+-nDisable network module
+-o outputDefine additional output (available: HTML or CSV)
+-p PORTDefine the client or server TCP port (default: 61209)
+-P passwordDefine a client/server password
+-rDo not list processes
+-sRun Glances in server mode
+-t secSet the refresh time in seconds (default: 3)
+-vDisplay the version and exit
+-yEnable the hddtemp module (needs running hddtemp daemon)
+-zDo not use the bold color attribute
+
+
+

Interactive commands

+

The following commands are supported while in Glances:

+
+
a
+

Automatic mode. The processes are sorted automatically.

+
    +
  • If CPU iowait >60%, sort processes by IO read and write
  • +
  • If CPU >70%, sort processes by CPU usage
  • +
  • If MEM >70%, sort processes by memory usage
  • +
+
+
b
+
Switch between bit/s or Byte/s for network IO
+
c
+
Sort processes by CPU%
+
d
+
Show/hide disk I/O stats
+
f
+
Show/hide file system stats
+
h
+
Show/hide the help message (with the keys you can press and the limits)
+
i
+
Sort processes by IO rate (need root account on some OS)
+
l
+
Show/hide log messages
+
m
+
Sort processes by MEM%
+
n
+
Show/hide network stats
+
p
+
Sort processes by name
+
s
+
Show/hide sensors stats (only available with -e flag; pysensors library is needed; Linux-only)
+
t
+
View network IO as combination
+
u
+
View cumulative network IO
+
w
+
Delete finished warning log messages
+
x
+
Delete finished warning and critical log messages
+
1
+
Switch between global CPU and per-CPU stats
+
q
+
Quit
+
+
+
+
+

Configuration

+

No configuration is needed to use Glances.

+

Furthermore, starting from release 1.6, it has been introduced a configuration file for setup limits.

+

By default, the configuration file is under:

+
+/etc/glances/glances.conf (Linux)
+
+

or:

+
+/usr/local/etc/glances/glances.conf (*BSD and OS X)
+
+

To override the default configuration, you can copy the glances.conf file to +your $XDG_CONFIG_HOME directory (e.g. Linux):

+
+mkdir -p $XDG_CONFIG_HOME/glances
+cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/
+
+

On OS X, you should copy the configuration file to ~/Library/Application Support/glances/.

+
+
+

Anatomy of the application

+
+

Legend

+
+
GREEN stat counter is "OK"
+
BLUE stat counter is "CAREFUL"
+
MAGENTA stat counter is "WARNING"
+
RED stat counter is "CRITICAL"
+
+
+ +
+

CPU

+

Short view:

+images/cpu.png +

If enough horizontal space is available, extended CPU informations are displayed.

+

Extended view:

+images/cpu-wide.png +

To switch to per-CPU stats, just hit the 1 key:

+images/per-cpu.png +

The CPU stats are shown as a percentage and for the configured refresh time. +The total CPU usage is displayed on the first line.

+
+
If user|system|nice CPU is <50%, then status is set to "OK"
+
If user|system|nice CPU is >50%, then status is set to "CAREFUL"
+
If user|system|nice CPU is >70%, then status is set to "WARNING"
+
If user|system|nice CPU is >90%, then status is set to "CRITICAL"
+
+
+
+

Load

+images/load.png +

On the No Sheep blog, Zachary Tirrell defines the average load [1]:

+
+"In short it is the average sum of the number of processes +waiting in the run-queue plus the number currently executing +over 1, 5, and 15 minute time periods."
+

Glances gets the number of CPU core to adapt the alerts. +Alerts on average load are only set on 5 and 15 min. +The first line also display the number of CPU core.

+
+
If average load is <0.7*core, then status is set to "OK"
+
If average load is >0.7*core, then status is set to "CAREFUL"
+
If average load is >1*core, then status is set to "WARNING"
+
If average load is >5*core, then status is set to "CRITICAL"
+
+
+
+

Memory

+

Glances uses two columns: one for the RAM and another one for the Swap.

+images/mem.png +

If enough space is available, Glances displays extended informations:

+images/mem-wide.png +

With Glances, alerts are only set for on used memory and used swap.

+
+
If memory is <50%, then status is set to "OK"
+
If memory is >50%, then status is set to "CAREFUL"
+
If memory is >70%, then status is set to "WARNING"
+
If memory is >90%, then status is set to "CRITICAL"
+
+
+
+

Network

+images/network.png +

Glances displays the network interface bit rate. The unit is adapted +dynamically (bits per second, kbits per second, Mbits per second, etc).

+

Alerts are only set if the network interface maximum speed is available.

+

For example, on a 100 Mbps ethernet interface, the warning status is set +if the bit rate is higher than 70 Mbps.

+
+
If bit rate is <50%, then status is set to "OK"
+
If bit rate is >50%, then status is set to "CAREFUL"
+
If bit rate is >70%, then status is set to "WARNING"
+
If bit rate is >90%, then status is set to "CRITICAL"
+
+
+
+

Sensors

+images/sensors.png +

Glances can displays the sensors informations trough lm-sensors (only +available on Linux).

+

A filter is processed in order to only display temperature.

+

You should enable this module using the following command line:

+
+$ glances -e
+
+

There is no alert on this information.

+
+
+

Disk I/O

+images/diskio.png +

Glances displays the disk I/O throughput. The unit is adapted dynamically.

+

There is no alert on this information.

+
+
+

File system

+images/fs.png +

Glances displays the used and total file system disk space. The unit is +adapted dynamically.

+

Alerts are set for used disk space:

+
+
If disk used is <50%, then status is set to "OK"
+
If disk used is >50%, then status is set to "CAREFUL"
+
If disk used is >70%, then status is set to "WARNING"
+
If disk used is >90%, then status is set to "CRITICAL"
+
+
+
+

Processes list

+

Compact view:

+images/processlist.png +

Full view:

+images/processlist-wide.png +

Glances displays a summary and a list of processes.

+

By default, or if you hit the a key, the processes list is automatically +sorted by CPU of memory usage.

+

The number of processes in the list is adapted to the screen size.

+
+
VIRT
+
Virtual memory size
+
RES
+
Resident memory
+
CPU%
+
% of CPU used by the process
+
MEM%
+
% of MEM used by the process
+
PID
+
Process ID
+
USER
+
User ID per process
+
NI
+
Nice level of the process
+
S
+
Process status
+
TIME+
+
Cumulative CPU time used
+
IOR/s
+
Per process IO read rate (in Byte/s)
+
IOW/s
+
Per process IO write rate (in Byte/s)
+
NAME
+
Process name or command line
+
+

Process status legend:

+
+
R
+
running
+
S
+
sleeping (may be interrupted)
+
D
+
disk sleep (may not be interrupted)
+
T
+
traced/stopped
+
Z
+
zombie
+
+
+
+

Logs

+images/logs.png +

A log messages list is displayed in the bottom of the screen if (and only if):

+
    +
  • at least one WARNING or CRITICAL alert was occurred
  • +
  • space is available in the bottom of the console/terminal
  • +
+

Each alert message displays the following information:

+
    +
  1. start date
  2. +
  3. end date
  4. +
  5. alert name
  6. +
  7. {min/avg/max} values
  8. +
+
+ +
+
+

API documentation

+

Glances uses a XML-RPC server and can be used by another client software.

+

API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To

+
+
+

Support

+

To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues

+

Feel free to contribute!

+ + + + + +
[1]http://nosheep.net/story/defining-unix-load-average/
+
+
+ + diff --git a/docs/glances-doc.rst b/docs/glances-doc.rst new file mode 100644 index 00000000..1abb548b --- /dev/null +++ b/docs/glances-doc.rst @@ -0,0 +1,427 @@ +======= +Glances +======= + +This manual describes *Glances* version 1.7. + +Copyright © 2012-2013 Nicolas Hennion + +April 2013 + +.. contents:: Table of Contents + +Introduction +============ + +Glances is a cross-platform curses-based monitoring tool which aims to +present a maximum of information in a minimum of space, ideally to fit +in a classical 80x24 terminal or higher to have additional information. + +Glances can adapt dynamically the displayed information depending on the +terminal size. It can also work in a client/server mode for remote monitoring. + +Glances is written in Python and uses the `psutil`_ library to get information from your system. + +Console (80x24) + +.. image:: images/screenshot.png + +Full view (>80x24) + +.. image:: images/screenshot-wide.png + +Usage +===== + +Standalone mode +--------------- + +Simply run: + +.. code-block:: console + + $ glances + +Client/Server mode +------------------ + +If you want to remotely monitor a machine, called ``server``, from another one, called ``client``, +just run on the server: + +.. code-block:: console + + server$ glances -s + +and on the client: + +.. code-block:: console + + client$ glances -c @server + +where ``@server`` is the IP address or host name of the server. + +In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``. + +In client mode, you can set the TCP port of the server ``-p PORT``. + +Default binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``. + +In client/server mode, limits are set by the server side. + +The version 1.6 introduces a optional password to access to the server ``-P password``. + +Command reference +================= + +Command-line options +-------------------- + +-b Display network rate in Byte per second +-B IP Bind server to the given IP or hostname +-c IP Connect to a Glances server +-C file Path to the configuration file (default: {/usr/local,}/etc/glances/glances.conf) +-d Disable disk I/O module +-e Enable the sensors module (Linux-only) +-f file Set the output folder (HTML) or file (CSV) +-h Display the help and exit +-m Disable mount module +-n Disable network module +-o output Define additional output (available: HTML or CSV) +-p PORT Define the client or server TCP port (default: 61209) +-P password Define a client/server password +-r Do not list processes +-s Run Glances in server mode +-t sec Set the refresh time in seconds (default: 3) +-v Display the version and exit +-y Enable the hddtemp module (needs running hddtemp daemon) +-z Do not use the bold color attribute + +Interactive commands +-------------------- + +The following commands are supported while in Glances: + + +``a`` + Automatic mode. The processes are sorted automatically. + + - If CPU iowait ``>60%``, sort processes by IO read and write + - If CPU ``>70%``, sort processes by CPU usage + - If MEM ``>70%``, sort processes by memory usage +``b`` + Switch between bit/s or Byte/s for network IO +``c`` + Sort processes by CPU% +``d`` + Show/hide disk I/O stats +``f`` + Show/hide file system stats +``h`` + Show/hide the help message (with the keys you can press and the limits) +``i`` + Sort processes by IO rate (need root account on some OS) +``l`` + Show/hide log messages +``m`` + Sort processes by MEM% +``n`` + Show/hide network stats +``p`` + Sort processes by name +``s`` + Show/hide sensors stats (only available with -e flag; pysensors library is needed; Linux-only) +``t`` + View network IO as combination +``u`` + View cumulative network IO +``w`` + Delete finished warning log messages +``x`` + Delete finished warning and critical log messages +``1`` + Switch between global CPU and per-CPU stats +``q`` + Quit + +Configuration +============= + +No configuration is needed to use Glances. + +Furthermore, starting from release 1.6, it has been introduced a configuration file for setup limits. + +By default, the configuration file is under: + +.. code-block:: console + + /etc/glances/glances.conf (Linux) + +or: + +.. code-block:: console + + /usr/local/etc/glances/glances.conf (*BSD and OS X) + +To override the default configuration, you can copy the ``glances.conf`` file to +your ``$XDG_CONFIG_HOME`` directory (e.g. Linux): + +.. code-block:: console + + mkdir -p $XDG_CONFIG_HOME/glances + cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/ + +On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``. + +Anatomy of the application +========================== + +Legend +------ + +| ``GREEN`` stat counter is ``"OK"`` +| ``BLUE`` stat counter is ``"CAREFUL"`` +| ``MAGENTA`` stat counter is ``"WARNING"`` +| ``RED`` stat counter is ``"CRITICAL"`` + +Header +------ + +.. image:: images/header.png + +The header shows the OS name, release version, platform architecture and the host name. +On Linux, it shows also the kernel version. + +CPU +--- + +Short view: + +.. image:: images/cpu.png + +If enough horizontal space is available, extended CPU informations are displayed. + +Extended view: + +.. image:: images/cpu-wide.png + +To switch to per-CPU stats, just hit the ``1`` key: + +.. image:: images/per-cpu.png + +The CPU stats are shown as a percentage and for the configured refresh time. +The total CPU usage is displayed on the first line. + +| If user|system|nice CPU is ``<50%``, then status is set to ``"OK"`` +| If user|system|nice CPU is ``>50%``, then status is set to ``"CAREFUL"`` +| If user|system|nice CPU is ``>70%``, then status is set to ``"WARNING"`` +| If user|system|nice CPU is ``>90%``, then status is set to ``"CRITICAL"`` + +Load +---- + +.. image:: images/load.png + +On the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_: + + "In short it is the average sum of the number of processes + waiting in the run-queue plus the number currently executing + over 1, 5, and 15 minute time periods." + +Glances gets the number of CPU core to adapt the alerts. +Alerts on average load are only set on 5 and 15 min. +The first line also display the number of CPU core. + +| If average load is ``<0.7*core``, then status is set to ``"OK"`` +| If average load is ``>0.7*core``, then status is set to ``"CAREFUL"`` +| If average load is ``>1*core``, then status is set to ``"WARNING"`` +| If average load is ``>5*core``, then status is set to ``"CRITICAL"`` + +Memory +------ + +Glances uses two columns: one for the ``RAM`` and another one for the ``Swap``. + +.. image:: images/mem.png + +If enough space is available, Glances displays extended informations: + +.. image:: images/mem-wide.png + +With Glances, alerts are only set for on used memory and used swap. + +| If memory is ``<50%``, then status is set to ``"OK"`` +| If memory is ``>50%``, then status is set to ``"CAREFUL"`` +| If memory is ``>70%``, then status is set to ``"WARNING"`` +| If memory is ``>90%``, then status is set to ``"CRITICAL"`` + +Network +------- + +.. image:: images/network.png + +Glances displays the network interface bit rate. The unit is adapted +dynamically (bits per second, kbits per second, Mbits per second, etc). + +Alerts are only set if the network interface maximum speed is available. + +For example, on a 100 Mbps ethernet interface, the warning status is set +if the bit rate is higher than 70 Mbps. + +| If bit rate is ``<50%``, then status is set to ``"OK"`` +| If bit rate is ``>50%``, then status is set to ``"CAREFUL"`` +| If bit rate is ``>70%``, then status is set to ``"WARNING"`` +| If bit rate is ``>90%``, then status is set to ``"CRITICAL"`` + +Sensors +------- + +.. image:: images/sensors.png + +Glances can displays the sensors informations trough `lm-sensors` (only +available on Linux). + +A filter is processed in order to only display temperature. + +You should enable this module using the following command line: + +.. code-block:: console + + $ glances -e + +There is no alert on this information. + +Disk I/O +-------- + +.. image:: images/diskio.png + +Glances displays the disk I/O throughput. The unit is adapted dynamically. + +There is no alert on this information. + +File system +----------- + +.. image:: images/fs.png + +Glances displays the used and total file system disk space. The unit is +adapted dynamically. + +Alerts are set for used disk space: + +| If disk used is ``<50%``, then status is set to ``"OK"`` +| If disk used is ``>50%``, then status is set to ``"CAREFUL"`` +| If disk used is ``>70%``, then status is set to ``"WARNING"`` +| If disk used is ``>90%``, then status is set to ``"CRITICAL"`` + +Processes list +-------------- + +Compact view: + +.. image:: images/processlist.png + +Full view: + +.. image:: images/processlist-wide.png + +Glances displays a summary and a list of processes. + +By default, or if you hit the ``a`` key, the processes list is automatically +sorted by CPU of memory usage. + +The number of processes in the list is adapted to the screen size. + +``VIRT`` + Virtual memory size +``RES`` + Resident memory +``CPU%`` + % of CPU used by the process +``MEM%`` + % of MEM used by the process +``PID`` + Process ID +``USER`` + User ID per process +``NI`` + Nice level of the process +``S`` + Process status +``TIME+`` + Cumulative CPU time used +``IOR/s`` + Per process IO read rate (in Byte/s) +``IOW/s`` + Per process IO write rate (in Byte/s) +``NAME`` + Process name or command line + +Process status legend: + +``R`` + running +``S`` + sleeping (may be interrupted) +``D`` + disk sleep (may not be interrupted) +``T`` + traced/stopped +``Z`` + zombie + +Logs +---- + +.. image:: images/logs.png + +A log messages list is displayed in the bottom of the screen if (and only if): + +- at least one ``WARNING`` or ``CRITICAL`` alert was occurred +- space is available in the bottom of the console/terminal + +Each alert message displays the following information: + +1. start date +2. end date +3. alert name +4. {min/avg/max} values + +Footer +------ + +.. image:: images/footer.png + +Glances displays the current date & time and access to the embedded help screen. + +If you have ran Glances in client mode ``-c``, you can also see if the client is connected to the server. + +If client is connected: + +.. image:: images/client-connected.png + +else: + +.. image:: images/client-disconnected.png + +On the left, you can easily see if you are connected to a Glances server. + +API documentation +================= + +Glances uses a `XML-RPC server`_ and can be used by another client software. + +API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To + +Support +======= + +To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues + +Feel free to contribute! + + +.. [1] http://nosheep.net/story/defining-unix-load-average/ + +.. _psutil: https://code.google.com/p/psutil/ +.. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.html diff --git a/doc/client-connected.png b/docs/images/client-connected.png similarity index 100% rename from doc/client-connected.png rename to docs/images/client-connected.png diff --git a/doc/client-disconnected.png b/docs/images/client-disconnected.png similarity index 100% rename from doc/client-disconnected.png rename to docs/images/client-disconnected.png diff --git a/doc/cpu-wide.png b/docs/images/cpu-wide.png similarity index 100% rename from doc/cpu-wide.png rename to docs/images/cpu-wide.png diff --git a/doc/cpu.png b/docs/images/cpu.png similarity index 100% rename from doc/cpu.png rename to docs/images/cpu.png diff --git a/doc/diskio.png b/docs/images/diskio.png similarity index 100% rename from doc/diskio.png rename to docs/images/diskio.png diff --git a/doc/footer.png b/docs/images/footer.png similarity index 100% rename from doc/footer.png rename to docs/images/footer.png diff --git a/doc/fs.png b/docs/images/fs.png similarity index 100% rename from doc/fs.png rename to docs/images/fs.png diff --git a/doc/glances-white-256.png b/docs/images/glances-white-256.png similarity index 100% rename from doc/glances-white-256.png rename to docs/images/glances-white-256.png diff --git a/doc/header.png b/docs/images/header.png similarity index 100% rename from doc/header.png rename to docs/images/header.png diff --git a/doc/load.png b/docs/images/load.png similarity index 100% rename from doc/load.png rename to docs/images/load.png diff --git a/doc/logs.png b/docs/images/logs.png similarity index 100% rename from doc/logs.png rename to docs/images/logs.png diff --git a/doc/mem-wide.png b/docs/images/mem-wide.png similarity index 100% rename from doc/mem-wide.png rename to docs/images/mem-wide.png diff --git a/doc/mem.png b/docs/images/mem.png similarity index 100% rename from doc/mem.png rename to docs/images/mem.png diff --git a/doc/network.png b/docs/images/network.png similarity index 100% rename from doc/network.png rename to docs/images/network.png diff --git a/doc/percpu.png b/docs/images/percpu.png similarity index 100% rename from doc/percpu.png rename to docs/images/percpu.png diff --git a/doc/processlist-wide.png b/docs/images/processlist-wide.png similarity index 100% rename from doc/processlist-wide.png rename to docs/images/processlist-wide.png diff --git a/doc/processlist.png b/docs/images/processlist.png similarity index 100% rename from doc/processlist.png rename to docs/images/processlist.png diff --git a/doc/screenshot-wide.png b/docs/images/screenshot-wide.png similarity index 100% rename from doc/screenshot-wide.png rename to docs/images/screenshot-wide.png diff --git a/doc/screenshot.png b/docs/images/screenshot.png similarity index 100% rename from doc/screenshot.png rename to docs/images/screenshot.png diff --git a/doc/sensors.png b/docs/images/sensors.png similarity index 100% rename from doc/sensors.png rename to docs/images/sensors.png diff --git a/doc/init_script b/docs/init_script similarity index 100% rename from doc/init_script rename to docs/init_script diff --git a/docs/man/glances.1 b/docs/man/glances.1 new file mode 100644 index 00000000..6850fe30 --- /dev/null +++ b/docs/man/glances.1 @@ -0,0 +1,143 @@ +.TH glances 1 "April, 2013" "version 1.7" "USER COMMANDS" +.SH NAME +glances \- A cross-platform curses-based monitoring tool +.SH SYNOPSIS +.B glances +[\-bdehmnrsvyz] [\-B bind] [\-c server] [\-C conffile] [\-f file] [\-o output] [\-p port] [\-P password] [\-t refresh] +.SH DESCRIPTION +Glances is a free (LGPL) cross-platform curses-based monitoring tool which aims to present a maximum of information +in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additionnal information. +Glances can adapt dynamically the displayed information depending on the terminal size. +It can also work in a client/server mode for remote monitoring. +.PP +This tool is written in Python and uses psutil to fetch the statistical values from key elements. +.PP +The current version grab the following stats: CPU, Load, Memory, Network rate, Disk I/O, file system, +process number and details. +.SH COMMAND-LINE OPTIONS +The command-line options are the following: +.TP +.B \-b +Display network rate in Byte per second +.TP +.B \-B @IP|host +Bind server to the given IP or hostname +.TP +.B \-c @IP|host +Connect to a Glances server +.TP +.B \-C file +Path to the configuration file (default: {/usr/local,}/etc/glances/glances.conf) +.TP +.B \-d +Disable disk I/O module +.TP +.B \-e +Enable the sensors module (Linux-only) +.TP +.B \-f file +Set the output folder (HTML) or file (CSV) +.TP +.B \-h +Display the help and exit +.TP +.B \-m +Disable mount module +.TP +.B \-n +Disable network module +.TP +.B \-o output +Define additional output (available: HTML or CSV) +.TP +.B \-p PORT +Define the client or server TCP port (default: 61209) +.TP +.B \-P password +Define a client/server password +.TP +.B \-r +Do not list processes +.TP +.B \-s +Run Glances in server mode +.TP +.B \-t sec +Set the refresh time in seconds (default: 3) +.TP +.B \-v +Display the version and exit +.TP +.B \-y +Enable the hddtemp module (requires running hddtemp daemon) +.TP +.B \-z +Do not use the bold color attribute +.SH INTERACTIVE COMMANDS +You can use the following keys while in Glances: +.TP +.B a +Automatic mode. The process list is sorted automatically +.TP +.B b +Switch between bit/s or Byte/s for network IO +.TP +.B c +Sort processes by CPU% +.TP +.B d +Show/hide disk IO stats +.TP +.B f +Show/hide file system stats +.TP +.B h +Show/hide the help message +.TP +.B i +Sort processes by IO rate +.TP +.B l +Show/hide log messages +.TP +.B m +Sort processes by MEM% +.TP +.B n +Show/hide network stats +.TP +.B p +Sort processes by name +.TP +.B s +Show/hide sensors stats (Linux-only) +.TP +.B t +View network IO as combination +.TP +.B u +View cumulative network IO +.TP +.B w +Delete finished warning log messages +.TP +.B x +Delete finished warning and critical log messages +.TP +.B 1 +Switch between global CPU and per-CPU stats +.TP +.B q +Quit +.SH EXAMPLES +.TP +Refresh information every 5 seconds: +.B glances +\-t 5 +.PP +.SH EXIT STATUS +Glances returns a zero exit status if it succeeds to print/grab information. +.PP +It returns 2 if it fails to parse its options (missing arguments, invalid value, etc). +.SH AUTHOR +Glances is written by Nicolas Hennion aka Nicolargo (contact@nicolargo.com) diff --git a/docs/stylesheet.css b/docs/stylesheet.css new file mode 100644 index 00000000..7dd4b97a --- /dev/null +++ b/docs/stylesheet.css @@ -0,0 +1,109 @@ +/* +:Author: Alessio Sergi +:Contact: al3hex at gmail dot com + +Stylesheet for use with Docutils. + +This file is the CSS for the Glances documentation. +*/ + +body { + margin-top: 1em; + margin-left: 1em; + max-width: 80em; + font-family: serif; + font-size: 16px; +} + +h1 { + font-size: 20px; +} + +h1.title { + font-size: 22px; +} + +h2, h3, p.topic-title { + font-size: 18px; +} + +.first { + /* override p.topic-title margin styles */ + margin-top: 0 ! important; +} + +a { + color: #0055df; + text-decoration: none; +} + +a:hover { + color: #339999; + text-decoration: underline; +} + +a:visited { + color: #800080; +} + +a.toc-backref { + text-decoration: none; + color: black; +} + +blockquote { + padding-left: 1ex; + border-left: 1px solid #008000; + max-width: 30em; +} + +p.topic-title { + font-weight: bold; +} + +pre.code { + margin-left: 2em; + margin-right: 2em; +} + +.console { + background-color: #eeeeee; + border: 1px solid #cccccc; + max-width: 60em; + line-height: 19px; + overflow: auto; + padding: 6px 10px; + border-radius: 3px 3px 3px 3px; +} + +span.option, tt.docutils { + white-space: nowrap; + border: 1px dotted #008000; + padding: 1px; + background-color: #eeeeee; +} + +.literal, .literal-block, .option, .var { + font-family: monospace; + font-size: 10pt; +} + +dl.docutils { + margin-left: 2em; +} + +dl.docutils dd { + margin-bottom: 0.5em; +} + +ol.simple { + margin-left: 0.5em; +} + +table.docutils { + margin-left: 2em; +} + +td.option-group { + padding-right: 1em; +} diff --git a/glances/glances.py b/glances/glances.py index 0a7439c0..d329960c 100644 --- a/glances/glances.py +++ b/glances/glances.py @@ -703,7 +703,7 @@ class glancesGrabSensors: class glancesGrabHDDTemp: """ Get hddtemp stats using a socket connection - """ + """ cache = "" address = "127.0.0.1" @@ -747,7 +747,7 @@ class glancesGrabHDDTemp: return else: # Considering the size of "|/dev/sda||0||" as the minimum - if len(data) < 14: + if len(data) < 14: if len(self.cache) == 0: data = "|hddtemp error||0||" else: @@ -889,7 +889,7 @@ class GlancesStats: """ self._init_host() - + # Init the grab error tags # for managing error during stats grab # By default, we *hope* that there is no error @@ -1418,7 +1418,7 @@ class GlancesStatsClient(GlancesStats): try: self.hddtemp = input_stats["hddtemp"] except: - self.hddtemp = [] + self.hddtemp = [] try: self.diskio = input_stats["diskio"] except: @@ -1465,7 +1465,7 @@ class glancesScreen: self.sensors_x = 0 self.sensors_y = -1 self.hddtemp_x = 0 - self.hddtemp_y = -1 + self.hddtemp_y = -1 self.diskio_x = 0 self.diskio_y = -1 self.fs_x = 0 @@ -1971,15 +1971,15 @@ class glancesScreen: hddtemp_count = self.displayHDDTemp(stats.getHDDTemp(), self.network_y + network_count + sensors_count) diskio_count = self.displayDiskIO(stats.getDiskIO(), - offset_y = self.network_y + sensors_count + + offset_y = self.network_y + sensors_count + network_count + hddtemp_count, error = stats.diskio_error_tag) fs_count = self.displayFs(stats.getFs(), self.network_y + sensors_count + - network_count + diskio_count + + network_count + diskio_count + hddtemp_count) log_count = self.displayLog(self.network_y + sensors_count + network_count + - diskio_count + fs_count + + diskio_count + fs_count + hddtemp_count) self.displayProcess(processcount, processlist, stats.getSortedBy(), log_count=log_count, core=stats.getCore()) @@ -2355,7 +2355,7 @@ class glancesScreen: return 0 if memswap['total'] == 0: # If swap is null, then do not display it - return 0 + return 0 # Swap self.term_window.addnstr(self.mem_y, @@ -3675,7 +3675,7 @@ def printSyntax(): print(_("\t-t sec\t\tSet the refresh time in seconds (default: %d)" % refresh_time)) print(_("\t-v\t\tDisplay the version and exit")) - print(_("\t-y\t\tEnable the hddtemp module (needs running hddtemp daemon)")) + print(_("\t-y\t\tEnable the hddtemp module (needs running hddtemp daemon)")) print(_("\t-z\t\tDo not use the bold color attribute")) diff --git a/i18n-gen.sh b/i18n-gen.sh index 4bdd4834..f8a90736 100644 --- a/i18n-gen.sh +++ b/i18n-gen.sh @@ -12,8 +12,7 @@ LANG_LIST='es fr it pt_BR' xgettext --language=Python --keyword=_ --output=./i18n/glances.pot ./glances/glances.py -for i in `echo $LANG_LIST` -do +for i in $LANG_LIST; do echo "Generate language pack for: $i" msgmerge --update --no-fuzzy-matching --backup=off ./i18n/$i/LC_MESSAGES/glances.po ./i18n/glances.pot msgfmt ./i18n/$i/LC_MESSAGES/glances.po --output-file ./i18n/$i/LC_MESSAGES/glances.mo diff --git a/man/glances.1 b/man/glances.1 deleted file mode 100644 index f89fc4e0..00000000 --- a/man/glances.1 +++ /dev/null @@ -1,155 +0,0 @@ -.TH glances 1 "January, 2013" "version 1.6.1" "USER COMMANDS" -.SH NAME -glances \- CLI curses based monitoring tool -.SH SYNOPSIS -.B glances -[\-bdehmnsvz] [\-C conffile] [\-t refresh] [\-B bind] [\-c server] [\-p port] [\-P password] [\-o output] [\-f file] -.SH DESCRIPTION -Glances is a free (LGPL) curses-based monitoring tool which aims to present a maximum of information -in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additionnal information. -Glances can adapt dynamicaly the displayed information depending on the terminal size. -It can also work in a client/server mode (for remote monitoring). -.PP -This tool is written in Python and uses PsUtil to fetch the statistical values from key elements. -.PP -The command line options are the following: -.PP - -b Display network rate in Byte per second -.PP - -B @IP|host Bind server to the given IP or host NAME -.PP - -c @IP|host Connect to a Glances server -.PP - -C file Path to the configuration file -.PP - -d Disable disk I/O module -.PP - -e Enable the sensors module (Linux-only) -.PP - -f file Set the output folder (HTML) or file (CSV) -.PP - -h Display the syntax and exit -.PP - -m Disable mount module -.PP - -n Disable network module -.PP - -o output Define additional output (available: HTML or CSV) -.PP - -p PORT Define the client or server TCP port (default: 61209) -.PP - -P password Client/server password -.PP - -r Do not list processes (significant CPU use reduction) -.PP - -s Run Glances in server mode -.PP - -t sec Set the refresh time in seconds (default: 3) -.PP - -v Display the version and exit -.PP - -y Enable the hddtemp module (requires running hddtemp daemon) -.PP - -z Do not use the bold color attribute -.PP -When Glances is running, you can use the following keys: -.PP - 'a' Automatic mode. The process list is sorted automatically -.PP - 'b' Switch between bit/s or Byte/s for network IO -.PP - 'c' Sort processes by CPU% -.PP - 'd' Show/hide disk IO stats -.PP - 'f' Show/hide file system stats -.PP - 'h' Show/hide the help message -.PP - 'i' Sort processes by IO rate -.PP - 'l' Show/hide log messages -.PP - 'm' Sort processes by MEM% -.PP - 'n' Show/hide network stats -.PP - 'p' Sort processes by name -.PP - 's' Show/hide sensors stats (Linux-only) -.PP - 'w' Delete finished warning logs messages -.PP - 'x' Delete finished warning and critical logs -.PP - 'q' Quit -.PP - '1' Switch between global CPU and per core stats -.PP -The current version grab the following stats: CPU, Load, Memory, Network rate, Disk IO, file system, -process number and details. -.SH OPTIONS -.TP -.TP -\-b -Display network rate in Byte per second -.TP -\-B bind -Bind server to the given IP or host NAME -.TP -\-c server -Connect to a Glances server (IP address or hostname) -.TP -\-C conffile -Use a configuration file (default: {/usr/local,}/etc/glances/glances.conf) -.TP -\-d -Disable disk I/O module -.TP -\-e -Enable the sensors module (Linux-only) -.TP -\-f file -Set the output folder (HTML) or file (CSV) -.TP -\-h -Display the syntax and exit -.TP -\-m -Disable mount module -.TP -\-n -Disable network module -.TP -\-o output -Define additional output (available: HTML or CSV) -.TP -\-p port -Define the client or server TCP port (default: 61209) -.TP -\-P password -Define the client or server password (default: no password) -.TP -\-s -Run Glances in server mode -.TP -\-t sec -Set the refresh time in seconds (default: 3) -.TP -\-v -Display the version and exit -.TP -\-z -Do not use the bold color attribute -.SH EXAMPLES -.TP -Refresh information every 5 seconds: -.B glances -\-t 5 -.PP -.SH EXIT STATUS -Glances returns a zero exit status if it succeeds to print/grab information. -.PP -It returns 2 if it fails to parse its options (missing arguments, invalid value, etc). -.SH AUTHOR -Glances is written by Nicolas Hennion aka Nicolargo (contact@nicolargo.com). diff --git a/setup.py b/setup.py index b4957586..7c0d3554 100755 --- a/setup.py +++ b/setup.py @@ -7,16 +7,14 @@ import glob from setuptools import setup data_files = [ - ('share/man/man1', ['man/glances.1']), - ('share/doc/glances', ['AUTHORS', - 'COPYING', - 'NEWS', - 'README', + ('share/doc/glances', ['AUTHORS', 'COPYING', 'NEWS', 'README.rst', + 'docs/glances-doc.html', 'glances/conf/glances.conf']), - ('share/doc/glances/doc', glob.glob('doc/*.png')), + ('share/doc/glances/images', glob.glob('docs/images/*.png')), ('share/glances/css', glob.glob('glances/data/css/*.css')), ('share/glances/html', glob.glob('glances/data/html/*.html')), ('share/glances/img', glob.glob('glances/data/img/*.png')), + ('share/man/man1', ['docs/man/glances.1']) ] if hasattr(sys, 'real_prefix') or ('bsd' or 'darwin' in sys.platform): @@ -31,22 +29,37 @@ for mo in glob.glob('i18n/*/LC_MESSAGES/*.mo'): setup( name='Glances', version='1.7a', - download_url='https://s3.amazonaws.com/glances/glances-1.7a.tar.gz', - url='https://github.com/nicolargo/glances', - description='CLI curses-based monitoring tool', + description="A cross-platform curses-based monitoring tool", + long_description=open('README.rst').read(), author='Nicolas Hennion', author_email='nicolas@nicolargo.com', + url='https://github.com/nicolargo/glances', + download_url='https://s3.amazonaws.com/glances/glances-1.7a.tar.gz', license="LGPL", keywords="cli curses monitoring system", - long_description=open('README').read(), - test_suite="glances.tests", install_requires=['psutil>=0.4.1'], - packages=['glances'], extras_require={ 'HTML': ['jinja2>=2.0'], - 'SENSORS': ['pysensors>=0.0.2'], + 'SENSORS': ['pysensors>=0.0.2'] }, + packages=['glances'], include_package_data=True, data_files=data_files, + test_suite="glances.tests", entry_points={"console_scripts": ["glances=glances.glances:main"]}, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Console :: Curses', + 'Intended Audience :: Developers', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3' + ] )