From 8eb2cc01583685b5ac1446ec4fe8969cc10b212d Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Thu, 29 Jun 2017 11:53:08 -0600 Subject: [PATCH 1/9] This is the first commit for version 2.0 of the SDK. This is a major change from version 1.0 and the application directory structure has been simplified. --- .gitattributes | 21 - .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/v2.0-branch.iml | 11 + .idea/vcs.xml | 6 + Boot1/Boot1.py | 724 + Boot1/Email.py | 98 + Boot1/LogLister.py | 51 + Boot1/install.sh | 3 + Boot1/package.ini | 12 + Boot1/start.sh | 3 + GNU_Make_README.html | 428 + .../Makefile => Makefile | 0 README.html | 488 + README.md | 164 +- Router_API_for_Applications.html | 1053 + Router_Application_Development_Guide.html | 929 + Router_Application_Development_Guide.md | 570 + SDK_version_1.0_app_refactor.html | 327 + app_template/app_template.py | 99 + app_template/cs.py | 271 + app_template/install.sh | 3 + app_template/package.ini | 11 + app_template/start.sh | 2 + app_template/stop.sh | 2 + common/ReadMe.txt | 6 + common/cs.py | 257 + common/sdk_cs_client.py | 409 + config/README.md | 41 - config/settings.ini | 31 - .../config => config}/settings.mk | 4 +- config/target.ini | 42 - cp_lib/__init__.py | 0 cp_lib/clean_ini.py | 85 - cp_lib/cp_email.py | 74 - cp_lib/cs_ping.py | 191 - cp_lib/data/__init__.py | 0 cp_lib/data/json_get_put.py | 166 - cp_lib/data/quality.py | 244 - cp_lib/load_active_wan.py | 240 - cp_lib/load_gps_config.py | 137 - cp_lib/load_settings_ini.py | 166 - cp_lib/modbus/__init__.py | 0 cp_lib/modbus/readme.md | 54 - cp_lib/readme.md | 130 - cp_lib/simple_data.py | 59 - cp_lib/status_tree_data.py | 244 - cp_lib/time_period.py | 418 - cp_lib/time_until.py | 89 - data/jsonrpc_settings/README.md | 29 - data/jsonrpc_settings/__init__.py | 26 - data/jsonrpc_settings/client.py | 107 - data/jsonrpc_settings/jsonrpc_server.py | 181 - data/jsonrpc_settings/send_json.py | 97 - data/jsonrpc_settings/settings.ini | 12 - demo/gpio_power_loss/README.md | 73 - demo/gpio_power_loss/__init__.py | 25 - demo/gpio_power_loss/power_loss.py | 396 - demo/gpio_power_loss/settings.ini | 23 - demo/gps_gate/README.md | 57 - demo/gps_gate/__init__.py | 26 - demo/gps_gate/gps_gate.py | 215 - demo/gps_gate/gps_gate_nmea.py | 733 - demo/gps_gate/gps_gate_protocol.py | 641 - demo/gps_gate/settings.ini | 55 - demo/gps_gate/test/connect.py | 232 - demo/gps_gate/test/rcv_localhost.py | 123 - demo/gps_gate/test/test_gps_gate_nmea.py | 416 - demo/gps_gate/test/test_gps_gate_protocol.py | 352 - demo/gps_replay/README.md | 30 - demo/gps_replay/__init__.py | 0 demo/gps_replay/gps_log.json | 13 - demo/gps_replay/run_replay.py | 162 - demo/gps_replay/save_replay.py | 173 - demo/gps_replay/settings.ini | 16 - demo/gps_replay/shift_offset.py | 121 - demo/hoops_counter/README.md | 28 - demo/hoops_counter/__init__.py | 25 - demo/hoops_counter/hoops_counter.py | 69 - demo/hoops_counter/settings.ini | 15 - demo/redlion_cub5/README.md | 24 - demo/redlion_cub5/__init__.py | 25 - demo/redlion_cub5/cub5.py | 56 - demo/redlion_cub5/cub5_protocol.py | 135 - .../redlion_cub5/docs/CUB5 Product Manual.pdf | Bin 1340124 -> 0 bytes demo/redlion_cub5/settings.ini | 9 - demo/test/test_redlion_cub_protocol.py | 198 - email/cs.py | 257 + email/email.py | 68 + email/install.sh | 3 + email/package.ini | 11 + email/start.sh | 2 + email/stop.sh | 2 + ftp_client/cs.py | 257 + ftp_client/ftp_client.py | 94 + ftp_client/ftplib.py | 984 + ftp_client/install.sh | 3 + ftp_client/package.ini | 11 + ftp_client/start.sh | 2 + ftp_client/stop.sh | 2 + ftp_server/asynchat.py | 336 + ftp_server/asyncore.py | 643 + ftp_server/cs.py | 257 + ftp_server/ftp_server.py | 93 + ftp_server/install.sh | 3 + ftp_server/package.ini | 11 + ftp_server/pyftpdlib/__init__.py | 73 + ftp_server/pyftpdlib/__main__.py | 100 + ftp_server/pyftpdlib/_compat.py | 43 + ftp_server/pyftpdlib/authorizers.py | 880 + ftp_server/pyftpdlib/filesystems.py | 635 + ftp_server/pyftpdlib/handlers.py | 3552 +++ ftp_server/pyftpdlib/ioloop.py | 1059 + ftp_server/pyftpdlib/log.py | 159 + ftp_server/pyftpdlib/servers.py | 537 + ftp_server/pyftpdlib/test/README | 5 + ftp_server/pyftpdlib/test/__init__.py | 394 + ftp_server/pyftpdlib/test/keycert.pem | 32 + ftp_server/pyftpdlib/test/runner.py | 35 + ftp_server/pyftpdlib/test/test_authorizers.py | 553 + ftp_server/pyftpdlib/test/test_filesystems.py | 219 + ftp_server/pyftpdlib/test/test_functional.py | 2851 +++ .../pyftpdlib/test/test_functional_ssl.py | 407 + ftp_server/pyftpdlib/test/test_ioloop.py | 551 + ftp_server/pyftpdlib/test/test_misc.py | 43 + ftp_server/pyftpdlib/test/test_servers.py | 224 + ftp_server/start.sh | 2 + ftp_server/stop.sh | 2 + gnu_apps/extensible_ui_ref_app/README.md | 154 - gnu_apps/extensible_ui_ref_app/hspt/cs.py | 72 - .../extensible_ui_ref_app/hspt/installer.py | 55 - gpio/power/__init__.py | 25 - gpio/power/power.py | 88 - gpio/power/settings.ini | 11 - gpio/serial_gpio/__init__.py | 25 - gpio/serial_gpio/serial_gpio.py | 70 - gpio/serial_gpio/settings.ini | 6 - gps/README.md | 13 - gps/gps_localhost/README.md | 23 - gps/gps_localhost/__init__.py | 26 - gps/gps_localhost/gps_localhost.py | 135 - gps/probe_gps/__init__.py | 40 - gps/probe_gps/settings.ini | 10 - gps_localhost/cs.py | 257 + gps_localhost/gps_localhost.py | 141 + {cp_lib => gps_localhost}/gps_nmea.py | 0 gps_localhost/install.sh | 3 + gps_localhost/package.ini | 11 + .../settings.ini | 0 gps_localhost/start.sh | 2 + gps_localhost/stop.sh | 2 + gps_probe/cs.py | 257 + .../probe_gps.py => gps_probe/gps_probe.py | 113 +- gps_probe/install.sh | 3 + gps_probe/package.ini | 11 + gps_probe/start.sh | 2 + gps_probe/stop.sh | 2 + hello_world/cs.py | 257 + hello_world/hello_world.py | 34 + hello_world/install.sh | 3 + hello_world/package.ini | 11 + hello_world/start.sh | 2 + hello_world/stop.sh | 2 + hspt/cs.py | 257 + .../extensible_ui_ref_app => hspt}/dynui.txt | 0 .../hspt => hspt}/index.tpl.html | 8 + .../hspt => hspt}/install.sh | 0 hspt/installer.py | 56 + .../hspt => hspt}/package.ini | 2 +- .../hspt => hspt}/resources/generic.css | 0 .../resources/netcloud-mobileimg.jpg | Bin .../hspt => hspt}/start.sh | 0 .../hspt => hspt}/stop.sh | 0 list_serial_ports/cs.py | 257 + list_serial_ports/install.sh | 3 + list_serial_ports/list_serial_ports.py | 179 + list_serial_ports/package.ini | 11 + list_serial_ports/start.sh | 2 + list_serial_ports/stop.sh | 2 + loglevel/cs.py | 257 + loglevel/install.sh | 3 + loglevel/loglevel.py | 44 + loglevel/package.ini | 11 + loglevel/start.sh | 2 + loglevel/stop.sh | 2 + make.py | 1597 +- .../modbus_poll => modbus_poll}/crc16.py | 0 modbus_poll/cs.py | 257 + modbus_poll/install.sh | 3 + modbus_poll/modbus_poll.py | 166 + modbus_poll/package.ini | 11 + {cp_lib => modbus_poll}/parse_duration.py | 0 modbus_poll/start.sh | 2 + modbus_poll/stop.sh | 2 + modbus_simple_bridge/__init__.py | 1 + modbus_simple_bridge/cp_lib/__init__.py | 1 + .../cp_lib}/app_base.py | 0 .../cp_lib}/app_name_parse.py | 0 .../cp_lib}/buffer_dump.py | 0 .../cp_lib}/cp_logging.py | 0 .../cp_lib}/cs_client.py | 0 .../cp_lib}/cs_client_remote.py | 0 modbus_simple_bridge/cp_lib/data/__init__.py | 1 + .../cp_lib}/data/data_tree.py | 0 .../cp_lib}/hw_status.py | 0 .../cp_lib}/load_firmware_info.py | 0 .../cp_lib}/load_product_info.py | 0 .../cp_lib}/load_settings_json.py | 0 .../cp_lib/modbus/__init__.py | 1 + .../cp_lib}/modbus/modbus_asc.py | 0 .../cp_lib}/modbus/modbus_rtu.py | 0 .../cp_lib}/modbus/modbus_tcp.py | 0 .../cp_lib}/modbus/transaction.py | 0 .../cp_lib}/modbus/transaction_modbus.py | 0 .../cp_lib}/parse_data.py | 0 modbus_simple_bridge/cp_lib/parse_duration.py | 285 + .../cp_lib}/probe_serial.py | 0 .../cp_lib}/split_version.py | 0 .../cp_lib}/unquote_string.py | 0 modbus_simple_bridge/go.bat | 1 + modbus_simple_bridge/install.sh | 3 + {config => modbus_simple_bridge}/main.py | 0 modbus_simple_bridge/package.ini | 12 + .../modbus_simple_bridge/README.md | 0 .../modbus_simple_bridge/__init__.py | 0 .../modbus_simple_bridge/modbus_tcp_bridge.py | 0 modbus_simple_bridge/settings.json | 42 + modbus_simple_bridge/start.sh | 2 + network/README.md | 38 - network/digit_web/README.md | 55 - network/digit_web/__init__.py | 26 - network/digit_web/favicon.ico | Bin 5694 -> 0 bytes network/digit_web/sdigit_0.jpg | Bin 28254 -> 0 bytes network/digit_web/sdigit_1.jpg | Bin 27709 -> 0 bytes network/digit_web/sdigit_2.jpg | Bin 35306 -> 0 bytes network/digit_web/sdigit_3.jpg | Bin 28214 -> 0 bytes network/digit_web/sdigit_4.jpg | Bin 27931 -> 0 bytes network/digit_web/sdigit_5.jpg | Bin 28008 -> 0 bytes network/digit_web/sdigit_6.jpg | Bin 35444 -> 0 bytes network/digit_web/sdigit_7.jpg | Bin 27419 -> 0 bytes network/digit_web/sdigit_8.jpg | Bin 28757 -> 0 bytes network/digit_web/sdigit_9.jpg | Bin 28498 -> 0 bytes network/digit_web/sdigit_blank.jpg | Bin 26717 -> 0 bytes network/digit_web/sdigit_dot.jpg | Bin 32965 -> 0 bytes network/digit_web/settings.ini | 13 - network/digit_web/web_server.py | 208 - network/send_email/__init__.py | 23 - network/send_email/send_email.py | 71 - network/send_email/settings.ini | 16 - network/send_ping/__init__.py | 24 - network/send_ping/send_ping.py | 33 - network/send_ping/settings.ini | 13 - network/simple_web/README.md | 31 - network/simple_web/__init__.py | 26 - network/simple_web/settings.ini | 14 - network/simple_web/web_server.py | 99 - network/tcp_echo/__init__.py | 26 - network/tcp_echo/settings.ini | 11 - network/tcp_echo/tcp_echo.py | 279 - ping/cs.py | 257 + ping/install.sh | 3 + ping/package.ini | 11 + ping/ping.py | 65 + ping/start.sh | 2 + ping/stop.sh | 2 + power_gpio/cs.py | 257 + power_gpio/install.sh | 3 + power_gpio/package.ini | 11 + power_gpio/power_gpio.py | 66 + power_gpio/start.sh | 2 + power_gpio/stop.sh | 2 + py33.bat | 5 - sdk_settings.ini | 5 + send_alert/cs.py | 257 + send_alert/install.sh | 3 + send_alert/package.ini | 11 + send_alert/send_alert.py | 46 + send_alert/start.sh | 2 + send_alert/stop.sh | 2 + send_to_server/cs.py | 257 + send_to_server/install.sh | 3 + send_to_server/package.ini | 11 + send_to_server/send_to_server.py | 89 + send_to_server/start.sh | 2 + send_to_server/stop.sh | 2 + serial_echo/cs.py | 257 + serial_echo/install.sh | 3 + serial_echo/package.ini | 11 + serial_echo/serial_echo.py | 138 + serial_echo/start.sh | 2 + serial_echo/stop.sh | 2 + serial_port/README.md | 31 - serial_port/list_ports/README.md | 54 - serial_port/list_ports/__init__.py | 22 - serial_port/list_ports/list_ports.py | 177 - serial_port/list_ports/settings.ini | 15 - serial_port/modbus_poll/README.md | 50 - serial_port/modbus_poll/__init__.py | 25 - serial_port/modbus_poll/modbus_poll.py | 137 - serial_port/modbus_poll/settings.ini | 17 - serial_port/modbus_simple_bridge/settings.ini | 28 - serial_port/notes.txt | 28 - serial_port/serial_echo/README.md | 29 - serial_port/serial_echo/__init__.py | 25 - serial_port/serial_echo/serial_echo.py | 120 - serial_port/serial_echo/settings.ini | 13 - simple/README.md | 32 - simple/hello_world/README.md | 26 - simple/hello_world/__init__.py | 0 simple/hello_world/main.py | 52 - simple/hello_world/settings.ini | 8 - simple/hello_world_1task/README.md | 20 - simple/hello_world_1task/__init__.py | 25 - simple/hello_world_1task/hello_world.py | 90 - simple/hello_world_1task/settings.ini | 10 - simple/hello_world_3tasks/README.md | 26 - simple/hello_world_3tasks/__init__.py | 25 - simple/hello_world_3tasks/hello_world.py | 134 - simple/hello_world_3tasks/settings.ini | 12 - simple/hello_world_app/README.md | 23 - simple/hello_world_app/__init__.py | 25 - simple/hello_world_app/hello_world.py | 21 - simple/hello_world_app/settings.ini | 10 - simple/send_alert/README.md | 21 - simple/send_alert/__init__.py | 26 - simple/send_alert/send_alert.py | 41 - simple/send_alert/settings.ini | 11 - simple_web_server/cs.py | 257 + simple_web_server/install.sh | 3 + simple_web_server/package.ini | 11 + simple_web_server/simple_web_server.py | 78 + simple_web_server/start.sh | 2 + simple_web_server/stop.sh | 2 + syslog.bat | 1 - test/__init__.py | 0 test/sdk_status_examples.txt | 397 - test/test_app_base.py | 487 - test/test_buffer_dump.py | 188 - test/test_clean_ini.py | 85 - test/test_cp_logging.py | 207 - test/test_cplib_data_tree.py | 436 - test/test_cplib_gps_nmea.py | 254 - test/test_cplib_modbus_asc.py | 229 - test/test_cplib_modbus_rtu.py | 254 - test/test_cplib_modbus_tcp.py | 225 - test/test_cplib_modbus_trans_modbus.py | 113 - test/test_cplib_parse_data.py | 243 - test/test_cplib_parse_duration.py | 307 - test/test_cplib_time_period.py | 859 - test/test_cplib_unquote_string.py | 51 - test/test_cs_client.py | 53 - test/test_load_active_wan.py | 38 - test/test_load_firmware_info.py | 142 - test/test_load_gps_config.py | 51 - test/test_load_product_info.py | 206 - test/test_load_settings.py | 341 - test/test_make.py | 292 - test/test_make_load_settings.py | 328 - test/test_module_dependency.py | 98 - test/test_probe_serial.py | 112 - test/test_split_version.py | 214 - test/test_status_tree_data.py | 61 - test/test_target.py | 125 - test/test_time_until.py | 33 - tools/RouterSDKDemo.py | 81 - tools/RouterSDKDemo.tar.gz | Bin 3622 -> 0 bytes tools/__init__.py | 0 .../bin/package_application.py | 37 +- tools/bin/pscp.exe | Bin 0 -> 525176 bytes tools/bin/pscp_license.txt | 7 + tools/{ => bin}/syslog_server.py | 0 .../bin/validate_application.py | 0 tools/convert_eol.py | 50 - tools/copy_file_nl.py | 51 - tools/curl.exe | Bin 535552 -> 0 bytes tools/curl_task.bat | 1 - tools/get-pip.py | 19154 ---------------- tools/gpio_0.bat | 1 - tools/gpio_1.bat | 1 - tools/install.bat | 1 - tools/ll.bat | 1 - tools/ls.bat | 1 - tools/make_load_settings.py | 347 - tools/make_package_ini.py | 90 - tools/module_dependency.py | 264 - tools/package_application.py | 228 - tools/pscp.exe | Bin 352256 -> 0 bytes tools/py35.bat | 5 - tools/set_ip.bat | 4 - tools/stop.bat | 6 - tools/target.py | 1021 - tools/test_convert_eol.py | 24 - 392 files changed, 26656 insertions(+), 39743 deletions(-) delete mode 100644 .gitattributes create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/v2.0-branch.iml create mode 100644 .idea/vcs.xml create mode 100644 Boot1/Boot1.py create mode 100644 Boot1/Email.py create mode 100644 Boot1/LogLister.py create mode 100644 Boot1/install.sh create mode 100644 Boot1/package.ini create mode 100644 Boot1/start.sh create mode 100644 GNU_Make_README.html rename gnu_apps/extensible_ui_ref_app/Makefile => Makefile (100%) create mode 100644 README.html create mode 100644 Router_API_for_Applications.html create mode 100644 Router_Application_Development_Guide.html create mode 100644 Router_Application_Development_Guide.md create mode 100644 SDK_version_1.0_app_refactor.html create mode 100644 app_template/app_template.py create mode 100644 app_template/cs.py create mode 100644 app_template/install.sh create mode 100644 app_template/package.ini create mode 100644 app_template/start.sh create mode 100644 app_template/stop.sh create mode 100644 common/ReadMe.txt create mode 100644 common/cs.py create mode 100644 common/sdk_cs_client.py delete mode 100644 config/README.md delete mode 100644 config/settings.ini rename {gnu_apps/extensible_ui_ref_app/config => config}/settings.mk (91%) delete mode 100644 config/target.ini delete mode 100644 cp_lib/__init__.py delete mode 100644 cp_lib/clean_ini.py delete mode 100644 cp_lib/cp_email.py delete mode 100644 cp_lib/cs_ping.py delete mode 100644 cp_lib/data/__init__.py delete mode 100644 cp_lib/data/json_get_put.py delete mode 100644 cp_lib/data/quality.py delete mode 100644 cp_lib/load_active_wan.py delete mode 100644 cp_lib/load_gps_config.py delete mode 100644 cp_lib/load_settings_ini.py delete mode 100644 cp_lib/modbus/__init__.py delete mode 100644 cp_lib/modbus/readme.md delete mode 100644 cp_lib/readme.md delete mode 100644 cp_lib/simple_data.py delete mode 100644 cp_lib/status_tree_data.py delete mode 100644 cp_lib/time_period.py delete mode 100644 cp_lib/time_until.py delete mode 100644 data/jsonrpc_settings/README.md delete mode 100644 data/jsonrpc_settings/__init__.py delete mode 100644 data/jsonrpc_settings/client.py delete mode 100644 data/jsonrpc_settings/jsonrpc_server.py delete mode 100644 data/jsonrpc_settings/send_json.py delete mode 100644 data/jsonrpc_settings/settings.ini delete mode 100644 demo/gpio_power_loss/README.md delete mode 100644 demo/gpio_power_loss/__init__.py delete mode 100644 demo/gpio_power_loss/power_loss.py delete mode 100644 demo/gpio_power_loss/settings.ini delete mode 100644 demo/gps_gate/README.md delete mode 100644 demo/gps_gate/__init__.py delete mode 100644 demo/gps_gate/gps_gate.py delete mode 100644 demo/gps_gate/gps_gate_nmea.py delete mode 100644 demo/gps_gate/gps_gate_protocol.py delete mode 100644 demo/gps_gate/settings.ini delete mode 100644 demo/gps_gate/test/connect.py delete mode 100644 demo/gps_gate/test/rcv_localhost.py delete mode 100644 demo/gps_gate/test/test_gps_gate_nmea.py delete mode 100644 demo/gps_gate/test/test_gps_gate_protocol.py delete mode 100644 demo/gps_replay/README.md delete mode 100644 demo/gps_replay/__init__.py delete mode 100644 demo/gps_replay/gps_log.json delete mode 100644 demo/gps_replay/run_replay.py delete mode 100644 demo/gps_replay/save_replay.py delete mode 100644 demo/gps_replay/settings.ini delete mode 100644 demo/gps_replay/shift_offset.py delete mode 100644 demo/hoops_counter/README.md delete mode 100644 demo/hoops_counter/__init__.py delete mode 100644 demo/hoops_counter/hoops_counter.py delete mode 100644 demo/hoops_counter/settings.ini delete mode 100644 demo/redlion_cub5/README.md delete mode 100644 demo/redlion_cub5/__init__.py delete mode 100644 demo/redlion_cub5/cub5.py delete mode 100644 demo/redlion_cub5/cub5_protocol.py delete mode 100644 demo/redlion_cub5/docs/CUB5 Product Manual.pdf delete mode 100644 demo/redlion_cub5/settings.ini delete mode 100644 demo/test/test_redlion_cub_protocol.py create mode 100644 email/cs.py create mode 100644 email/email.py create mode 100644 email/install.sh create mode 100644 email/package.ini create mode 100644 email/start.sh create mode 100644 email/stop.sh create mode 100644 ftp_client/cs.py create mode 100644 ftp_client/ftp_client.py create mode 100644 ftp_client/ftplib.py create mode 100644 ftp_client/install.sh create mode 100644 ftp_client/package.ini create mode 100644 ftp_client/start.sh create mode 100644 ftp_client/stop.sh create mode 100644 ftp_server/asynchat.py create mode 100644 ftp_server/asyncore.py create mode 100644 ftp_server/cs.py create mode 100644 ftp_server/ftp_server.py create mode 100644 ftp_server/install.sh create mode 100644 ftp_server/package.ini create mode 100644 ftp_server/pyftpdlib/__init__.py create mode 100644 ftp_server/pyftpdlib/__main__.py create mode 100644 ftp_server/pyftpdlib/_compat.py create mode 100644 ftp_server/pyftpdlib/authorizers.py create mode 100644 ftp_server/pyftpdlib/filesystems.py create mode 100644 ftp_server/pyftpdlib/handlers.py create mode 100644 ftp_server/pyftpdlib/ioloop.py create mode 100644 ftp_server/pyftpdlib/log.py create mode 100644 ftp_server/pyftpdlib/servers.py create mode 100644 ftp_server/pyftpdlib/test/README create mode 100644 ftp_server/pyftpdlib/test/__init__.py create mode 100644 ftp_server/pyftpdlib/test/keycert.pem create mode 100644 ftp_server/pyftpdlib/test/runner.py create mode 100644 ftp_server/pyftpdlib/test/test_authorizers.py create mode 100644 ftp_server/pyftpdlib/test/test_filesystems.py create mode 100644 ftp_server/pyftpdlib/test/test_functional.py create mode 100644 ftp_server/pyftpdlib/test/test_functional_ssl.py create mode 100644 ftp_server/pyftpdlib/test/test_ioloop.py create mode 100644 ftp_server/pyftpdlib/test/test_misc.py create mode 100644 ftp_server/pyftpdlib/test/test_servers.py create mode 100644 ftp_server/start.sh create mode 100644 ftp_server/stop.sh delete mode 100644 gnu_apps/extensible_ui_ref_app/README.md delete mode 100644 gnu_apps/extensible_ui_ref_app/hspt/cs.py delete mode 100644 gnu_apps/extensible_ui_ref_app/hspt/installer.py delete mode 100644 gpio/power/__init__.py delete mode 100644 gpio/power/power.py delete mode 100644 gpio/power/settings.ini delete mode 100644 gpio/serial_gpio/__init__.py delete mode 100644 gpio/serial_gpio/serial_gpio.py delete mode 100644 gpio/serial_gpio/settings.ini delete mode 100644 gps/README.md delete mode 100644 gps/gps_localhost/README.md delete mode 100644 gps/gps_localhost/__init__.py delete mode 100644 gps/gps_localhost/gps_localhost.py delete mode 100644 gps/probe_gps/__init__.py delete mode 100644 gps/probe_gps/settings.ini create mode 100644 gps_localhost/cs.py create mode 100644 gps_localhost/gps_localhost.py rename {cp_lib => gps_localhost}/gps_nmea.py (100%) create mode 100644 gps_localhost/install.sh create mode 100644 gps_localhost/package.ini rename {gps/gps_localhost => gps_localhost}/settings.ini (100%) create mode 100644 gps_localhost/start.sh create mode 100644 gps_localhost/stop.sh create mode 100644 gps_probe/cs.py rename gps/probe_gps/probe_gps.py => gps_probe/gps_probe.py (59%) create mode 100644 gps_probe/install.sh create mode 100644 gps_probe/package.ini create mode 100644 gps_probe/start.sh create mode 100644 gps_probe/stop.sh create mode 100644 hello_world/cs.py create mode 100644 hello_world/hello_world.py create mode 100644 hello_world/install.sh create mode 100644 hello_world/package.ini create mode 100644 hello_world/start.sh create mode 100644 hello_world/stop.sh create mode 100644 hspt/cs.py rename {gnu_apps/extensible_ui_ref_app => hspt}/dynui.txt (100%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/index.tpl.html (59%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/install.sh (100%) create mode 100644 hspt/installer.py rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/package.ini (90%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/resources/generic.css (100%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/resources/netcloud-mobileimg.jpg (100%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/start.sh (100%) rename {gnu_apps/extensible_ui_ref_app/hspt => hspt}/stop.sh (100%) create mode 100644 list_serial_ports/cs.py create mode 100644 list_serial_ports/install.sh create mode 100644 list_serial_ports/list_serial_ports.py create mode 100644 list_serial_ports/package.ini create mode 100644 list_serial_ports/start.sh create mode 100644 list_serial_ports/stop.sh create mode 100644 loglevel/cs.py create mode 100644 loglevel/install.sh create mode 100644 loglevel/loglevel.py create mode 100644 loglevel/package.ini create mode 100644 loglevel/start.sh create mode 100644 loglevel/stop.sh rename {serial_port/modbus_poll => modbus_poll}/crc16.py (100%) create mode 100644 modbus_poll/cs.py create mode 100644 modbus_poll/install.sh create mode 100644 modbus_poll/modbus_poll.py create mode 100644 modbus_poll/package.ini rename {cp_lib => modbus_poll}/parse_duration.py (100%) create mode 100644 modbus_poll/start.sh create mode 100644 modbus_poll/stop.sh create mode 100644 modbus_simple_bridge/__init__.py create mode 100644 modbus_simple_bridge/cp_lib/__init__.py rename {cp_lib => modbus_simple_bridge/cp_lib}/app_base.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/app_name_parse.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/buffer_dump.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/cp_logging.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/cs_client.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/cs_client_remote.py (100%) create mode 100644 modbus_simple_bridge/cp_lib/data/__init__.py rename {cp_lib => modbus_simple_bridge/cp_lib}/data/data_tree.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/hw_status.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/load_firmware_info.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/load_product_info.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/load_settings_json.py (100%) create mode 100644 modbus_simple_bridge/cp_lib/modbus/__init__.py rename {cp_lib => modbus_simple_bridge/cp_lib}/modbus/modbus_asc.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/modbus/modbus_rtu.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/modbus/modbus_tcp.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/modbus/transaction.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/modbus/transaction_modbus.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/parse_data.py (100%) create mode 100644 modbus_simple_bridge/cp_lib/parse_duration.py rename {cp_lib => modbus_simple_bridge/cp_lib}/probe_serial.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/split_version.py (100%) rename {cp_lib => modbus_simple_bridge/cp_lib}/unquote_string.py (100%) create mode 100644 modbus_simple_bridge/go.bat create mode 100644 modbus_simple_bridge/install.sh rename {config => modbus_simple_bridge}/main.py (100%) create mode 100644 modbus_simple_bridge/package.ini rename {serial_port => modbus_simple_bridge/serial_port}/modbus_simple_bridge/README.md (100%) rename {serial_port => modbus_simple_bridge/serial_port}/modbus_simple_bridge/__init__.py (100%) rename {serial_port => modbus_simple_bridge/serial_port}/modbus_simple_bridge/modbus_tcp_bridge.py (100%) create mode 100644 modbus_simple_bridge/settings.json create mode 100644 modbus_simple_bridge/start.sh delete mode 100644 network/README.md delete mode 100644 network/digit_web/README.md delete mode 100644 network/digit_web/__init__.py delete mode 100644 network/digit_web/favicon.ico delete mode 100644 network/digit_web/sdigit_0.jpg delete mode 100644 network/digit_web/sdigit_1.jpg delete mode 100644 network/digit_web/sdigit_2.jpg delete mode 100644 network/digit_web/sdigit_3.jpg delete mode 100644 network/digit_web/sdigit_4.jpg delete mode 100644 network/digit_web/sdigit_5.jpg delete mode 100644 network/digit_web/sdigit_6.jpg delete mode 100644 network/digit_web/sdigit_7.jpg delete mode 100644 network/digit_web/sdigit_8.jpg delete mode 100644 network/digit_web/sdigit_9.jpg delete mode 100644 network/digit_web/sdigit_blank.jpg delete mode 100644 network/digit_web/sdigit_dot.jpg delete mode 100644 network/digit_web/settings.ini delete mode 100644 network/digit_web/web_server.py delete mode 100644 network/send_email/__init__.py delete mode 100644 network/send_email/send_email.py delete mode 100644 network/send_email/settings.ini delete mode 100644 network/send_ping/__init__.py delete mode 100644 network/send_ping/send_ping.py delete mode 100644 network/send_ping/settings.ini delete mode 100644 network/simple_web/README.md delete mode 100644 network/simple_web/__init__.py delete mode 100644 network/simple_web/settings.ini delete mode 100644 network/simple_web/web_server.py delete mode 100644 network/tcp_echo/__init__.py delete mode 100644 network/tcp_echo/settings.ini delete mode 100644 network/tcp_echo/tcp_echo.py create mode 100644 ping/cs.py create mode 100644 ping/install.sh create mode 100644 ping/package.ini create mode 100644 ping/ping.py create mode 100644 ping/start.sh create mode 100644 ping/stop.sh create mode 100644 power_gpio/cs.py create mode 100644 power_gpio/install.sh create mode 100644 power_gpio/package.ini create mode 100644 power_gpio/power_gpio.py create mode 100644 power_gpio/start.sh create mode 100644 power_gpio/stop.sh delete mode 100644 py33.bat create mode 100644 sdk_settings.ini create mode 100644 send_alert/cs.py create mode 100644 send_alert/install.sh create mode 100644 send_alert/package.ini create mode 100644 send_alert/send_alert.py create mode 100644 send_alert/start.sh create mode 100644 send_alert/stop.sh create mode 100644 send_to_server/cs.py create mode 100644 send_to_server/install.sh create mode 100644 send_to_server/package.ini create mode 100644 send_to_server/send_to_server.py create mode 100644 send_to_server/start.sh create mode 100644 send_to_server/stop.sh create mode 100644 serial_echo/cs.py create mode 100644 serial_echo/install.sh create mode 100644 serial_echo/package.ini create mode 100644 serial_echo/serial_echo.py create mode 100644 serial_echo/start.sh create mode 100644 serial_echo/stop.sh delete mode 100644 serial_port/README.md delete mode 100644 serial_port/list_ports/README.md delete mode 100644 serial_port/list_ports/__init__.py delete mode 100644 serial_port/list_ports/list_ports.py delete mode 100644 serial_port/list_ports/settings.ini delete mode 100644 serial_port/modbus_poll/README.md delete mode 100644 serial_port/modbus_poll/__init__.py delete mode 100644 serial_port/modbus_poll/modbus_poll.py delete mode 100644 serial_port/modbus_poll/settings.ini delete mode 100644 serial_port/modbus_simple_bridge/settings.ini delete mode 100644 serial_port/notes.txt delete mode 100644 serial_port/serial_echo/README.md delete mode 100644 serial_port/serial_echo/__init__.py delete mode 100644 serial_port/serial_echo/serial_echo.py delete mode 100644 serial_port/serial_echo/settings.ini delete mode 100644 simple/README.md delete mode 100644 simple/hello_world/README.md delete mode 100644 simple/hello_world/__init__.py delete mode 100644 simple/hello_world/main.py delete mode 100644 simple/hello_world/settings.ini delete mode 100644 simple/hello_world_1task/README.md delete mode 100644 simple/hello_world_1task/__init__.py delete mode 100644 simple/hello_world_1task/hello_world.py delete mode 100644 simple/hello_world_1task/settings.ini delete mode 100644 simple/hello_world_3tasks/README.md delete mode 100644 simple/hello_world_3tasks/__init__.py delete mode 100644 simple/hello_world_3tasks/hello_world.py delete mode 100644 simple/hello_world_3tasks/settings.ini delete mode 100644 simple/hello_world_app/README.md delete mode 100644 simple/hello_world_app/__init__.py delete mode 100644 simple/hello_world_app/hello_world.py delete mode 100644 simple/hello_world_app/settings.ini delete mode 100644 simple/send_alert/README.md delete mode 100644 simple/send_alert/__init__.py delete mode 100644 simple/send_alert/send_alert.py delete mode 100644 simple/send_alert/settings.ini create mode 100644 simple_web_server/cs.py create mode 100644 simple_web_server/install.sh create mode 100644 simple_web_server/package.ini create mode 100644 simple_web_server/simple_web_server.py create mode 100644 simple_web_server/start.sh create mode 100644 simple_web_server/stop.sh delete mode 100644 syslog.bat delete mode 100644 test/__init__.py delete mode 100644 test/sdk_status_examples.txt delete mode 100644 test/test_app_base.py delete mode 100644 test/test_buffer_dump.py delete mode 100644 test/test_clean_ini.py delete mode 100644 test/test_cp_logging.py delete mode 100644 test/test_cplib_data_tree.py delete mode 100644 test/test_cplib_gps_nmea.py delete mode 100644 test/test_cplib_modbus_asc.py delete mode 100644 test/test_cplib_modbus_rtu.py delete mode 100644 test/test_cplib_modbus_tcp.py delete mode 100644 test/test_cplib_modbus_trans_modbus.py delete mode 100644 test/test_cplib_parse_data.py delete mode 100644 test/test_cplib_parse_duration.py delete mode 100644 test/test_cplib_time_period.py delete mode 100644 test/test_cplib_unquote_string.py delete mode 100644 test/test_cs_client.py delete mode 100644 test/test_load_active_wan.py delete mode 100644 test/test_load_firmware_info.py delete mode 100644 test/test_load_gps_config.py delete mode 100644 test/test_load_product_info.py delete mode 100644 test/test_load_settings.py delete mode 100644 test/test_make.py delete mode 100644 test/test_make_load_settings.py delete mode 100644 test/test_module_dependency.py delete mode 100644 test/test_probe_serial.py delete mode 100644 test/test_split_version.py delete mode 100644 test/test_status_tree_data.py delete mode 100644 test/test_target.py delete mode 100644 test/test_time_until.py delete mode 100644 tools/RouterSDKDemo.py delete mode 100644 tools/RouterSDKDemo.tar.gz delete mode 100644 tools/__init__.py rename {gnu_apps/extensible_ui_ref_app/tools => tools}/bin/package_application.py (78%) create mode 100644 tools/bin/pscp.exe create mode 100644 tools/bin/pscp_license.txt rename tools/{ => bin}/syslog_server.py (100%) rename {gnu_apps/extensible_ui_ref_app/tools => tools}/bin/validate_application.py (100%) delete mode 100644 tools/convert_eol.py delete mode 100644 tools/copy_file_nl.py delete mode 100644 tools/curl.exe delete mode 100644 tools/curl_task.bat delete mode 100644 tools/get-pip.py delete mode 100644 tools/gpio_0.bat delete mode 100644 tools/gpio_1.bat delete mode 100644 tools/install.bat delete mode 100644 tools/ll.bat delete mode 100644 tools/ls.bat delete mode 100644 tools/make_load_settings.py delete mode 100644 tools/make_package_ini.py delete mode 100644 tools/module_dependency.py delete mode 100644 tools/package_application.py delete mode 100644 tools/pscp.exe delete mode 100644 tools/py35.bat delete mode 100644 tools/set_ip.bat delete mode 100644 tools/stop.bat delete mode 100644 tools/target.py delete mode 100644 tools/test_convert_eol.py diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index ed03d58c..00000000 --- a/.gitattributes +++ /dev/null @@ -1,21 +0,0 @@ -# Auto detect text files and perform LF normalization -* text eol=lf - -# Custom for Visual Studio -*.cs diff=csharp - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain - -*.png binary -*.jpg binary -*.pdf binary -*.exe binary diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..fd0669b0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..4e86f89f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/v2.0-branch.iml b/.idea/v2.0-branch.iml new file mode 100644 index 00000000..67116063 --- /dev/null +++ b/.idea/v2.0-branch.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Boot1/Boot1.py b/Boot1/Boot1.py new file mode 100644 index 00000000..86c98023 --- /dev/null +++ b/Boot1/Boot1.py @@ -0,0 +1,724 @@ +#pylint: disable=invalid-name, missing-docstring, line-too-long, bad-continuation +""" + Router SDK Boot1 Application. + + Copyright © 2016 Cradlepoint, Inc. . All rights reserved. + + This file contains confidential information of Cradlepoint, Inc. and your + use of this file is subject to the Cradlepoint Software License Agreement + distributed with this file. Unauthorized reproduction or distribution of + this file is subject to civil and criminal penalties. + + Desc: + Determine "fastest" wireless wan connection by loading both SIMs, + running speedtest. Disable the not-fastest SIM. + +""" + +import sys +import json +import socket +import time +#import Email + +app_name = "Boot1" + +#_STDERR=False +_STDERR = True + +#tmplog = "/tmp/log.txt" +tmplog = None + + +def rawlog(fmt, *args): + if _STDERR: + msg = fmt % args + print(msg, file=sys.stderr) + + if tmplog: + with open(tmplog, "a") as outfile: + msg = fmt % args + print(time.ctime(), file=outfile) + print(msg, file=outfile) + +class Boot1Exception(Exception): + pass + +class Timeout(Boot1Exception): + pass + +class SocketLost(Boot1Exception): + pass + +class OneModem(Boot1Exception): + pass + +class ReadLine(object): + """State machine to read CR/LF style line. Input controlled from outside. """ + + # Keeping the read or recv or whatever outside the class allows me to handle + # weird conditions around sockets, serial ports, etc. + STATE_RECV_LINE = 1 + STATE_WAIT_LF = 2 + STATE_WAIT_SOL = 3 + + CR = b'\x0d' + LF = b'\x0a' + + def __init__(self, maxlen=256): + self.maxlen = maxlen + self.state = self.STATE_RECV_LINE + self.s = bytes() + self.len_s = 0 + + def recv(self, c): + return_s = None + + if self.state == self.STATE_RECV_LINE: + if c == self.CR: + # CR; could be a bare CR or a CRLF + return_s = self.s + # restart capture + self.s = bytes() + self.len_s = 0 + self.state = self.STATE_WAIT_LF + elif c == self.LF: + # bare LF (unusual) + return_s = self.s + + # restart capture + self.s = bytes() + self.len_s = 0 + else: + #rawlog("c={} s={}".format(c,self.s)) + self.s += c + self.len_s += 1 + + # protection from evil input; if we don't see a CRLF before + # maxlen, throw away our current input and start over + if self.len_s >= self.maxlen: + # throw away current input; start over + self.s = bytes() + self.len_s = 0 + + elif self.state == self.STATE_WAIT_LF: + if c == self.LF: + # saw CRLF; capture was restarted in the previous state + assert self.len_s == 0, self.len_s + else: + # raw CR! save what we've seen and start parsing again + # (note: this won't handle weird cases like CRCRCR) + self.s = c + self.len_s = 1 + + # start capturing line again + self.state = self.STATE_RECV_LINE + + else: + # WTF? + assert 0, self.state + + return return_s + +class CSClient(object): + """Wrapper for the TCP interface to the router config store.""" + + def __init__(self): + self.getline = ReadLine() + + def _read_line(self, sock): + while True: + try: + c = sock.recv(1) + except socket.timeout: + break + + if not c: + raise SocketLost("connection lost sock={}".format(sock)) + + buf = self.getline.recv(c) + if buf is not None: + s = buf.decode("utf-8") + rawlog("read_line line=%s"%s) + return s + +# logger.info("socket timeout {}".format(sock)) + return None + + def get(self, base, query='', tree=0): + """Send a get request.""" + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + + def append(self, base, value='', query=''): + """Send an append request.""" + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + + def delete(self, base, query=''): + """Send a delete request.""" + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + + def alert(self, value=''): + """Send a request to create an alert.""" + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + + def log(self, value=''): + """Send a request to create a log entry.""" + cmd = "log\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + + def paranoid_sendall(self, cmd, sock): + message_list = cmd.split("\n") + for msg in message_list: + rawlog("send >>>%s<<<",msg) + sock.sendall(bytes(msg+"\n", 'ascii')) + time.sleep(0.1) + + def safe_dispatch(self, cmd): + """Send the command and return the response.""" + resl = '' + rawlog("_dispatch %s", cmd) + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + # davep 20160706 ; disable Nagle because we're talking localhost + # and other side is using sock.readline() + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + sock.connect(('localhost', 1337)) + sock.sendall(bytes(cmd, 'ascii')) +# self.paranoid_sendall(cmd, sock) + + line = self._read_line(sock) + resl = "" + if line and line.strip() == 'status: ok': + line = self._read_line(sock) + if line and line.startswith("content-length"): + mlen = int(line.strip().split(' ')[1]) + # eat \r\n\r\n + sock.recv(1) + sock.recv(1) + sock.recv(1) + sock.recv(1) + # read message, pray that sender has accurate content-length field + while mlen > 0: + c = sock.recv(1) + if not c: + raise SocketLost("connection lost sock={}".format(sock)) + resl += c.decode('utf8') + mlen -= 1 + + rawlog("_dispatch resl=\"%s\"", resl) + return resl + + def _dispatch(self, cmd): + errmsg = None + resl = "" + try: + resl = self.safe_dispatch(cmd) + except Boot1Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + + if errmsg is not None: + rawlog(errmsg) + + return resl + +default_speedtest = { + "input": { + "options": { + "limit": { + "size":0, + "time":15 + }, + "port":None, + "host":"", + "ifc_wan":None, + "tcp":True, + "udp":False, + "send":True, + "recv":True, + "rr":False + }, + "tests":None + }, + "run":1 +} + +class SIMSpeedTest(object): + STATUS_DEVS_PATH = '/status/wan/devices' + CFG_RULES2_PATH = '/config/wan/rules2' + CTRL_WAN_DEVS_PATH = '/control/wan/devices' + MIN_UPLOAD_SPD = 1.0 # Mbps + MIN_DOWNLOAD_SPD = 10.0 + CONNECTION_STATE_TIMEOUT = 7 * 60 # 7 Min + NETPERF_TIMEOUT = 4 * 60 # 4 Min + + def __init__(self): + self.client = CSClient() + + def log(self, fmt, *args): + rawlog(fmt, *args) + msg = fmt % args + self.client.log(msg) + + def find_modems(self, verbose): + dsdm = self.client.get('/config/wan/dual_sim_disable_mask') + self.log("dsdm: %s" % dsdm) + while True: + devs = json.loads(self.client.get(self.STATUS_DEVS_PATH)) + modems_list = [x for x in devs if x.startswith("mdm-")] + self.log('modems_list: %s', modems_list) + num_modems = len(modems_list) + if not num_modems: + rawlog('No Modems found at all yet') + time.sleep(10) + continue + + if num_modems < 2: + status = devs[modems_list[0]].get('status') or None + ready = None if not status else status.get('ready') + if -1 != ready.find('unconfigured'): + rawlog('Modems not yet finished configuring') + time.sleep(10) + continue + + if verbose: + self.log("Looks like we have been run before!") + raise OneModem("Only one Modem found") + else: + break + + modems = {} + for mdm in modems_list: + err_txt = devs[mdm]['status']['error_text'] + if err_txt and -1 != err_txt.find('NOSIM'): + continue + self.log('mdm: %s', mdm) + key = devs[mdm]['info'].get('sim') + self.log('key: %s %s', key, type(key)) + modems[key] = mdm + self.log('modems dict: %s', modems) + return modems + + def find_sims(self): + modems = self.find_modems(True) + sim1 = modems.get('sim1') or None + sim2 = modems.get('sim2') or None + self.log('Sim1: %s Sim2: %s', sim1, sim2) + return (sim1, sim2) + + def find_device(self, devs, devname): + return [idx for (idx, dev) in enumerate(devs) if dev['trigger_string'].startswith(devname)] + + def enable_dev_mode(self, dev, mode, state): + devices = json.loads(self.client.get(self.CFG_RULES2_PATH)) + mdms = self.find_device(devices, dev) + if state != None: + [self.client.put(self.CFG_RULES2_PATH + '/%d' % mdm, {mode:state}) for mdm in mdms] + else: + for mdm in mdms: + key = '%s/%d/%s' % (self.CFG_RULES2_PATH,mdm,mode) + if self.client.get(key) != None: + self.client.delete(key) + + def enable_mdm_mode(self, mode, state): + self.enable_dev_mode('type|is|mdm', mode, state) + + def enable_eth_mode(self, mode, state): + self.enable_dev_mode('type|is|ethernet', mode, state) + + def set_wan_dev_disabled(self, dev, state): + s = self.client.put(self.CFG_RULES2_PATH + '/%d' % dev, {"disabled":state}) + self.log("set_wan_dev_disabled - put s=%s", s) + + def modem_state(self, sim, state): + ''' Blocking call that will wait until a given state is shown as the modem's status ''' + timeout_counter = 0 + sleep_seconds = 0 + conn_path = '%s/%s/status/connection_state' % (self.STATUS_DEVS_PATH, sim) + self.log("modem_state waiting sim=%s state=%s", sim, state) + while True: + sleep_seconds += 5 + conn_state = self.client.get(conn_path) + # TODO add checking for mdm error states + self.log('waiting for state=%s on sim=%s curr state=%s', state, sim, conn_state) + if conn_state.replace('"', '') == state: + break + if timeout_counter > self.CONNECTION_STATE_TIMEOUT: + self.log("timeout waiting on sim=%s", sim) + raise Timeout(conn_path) + time.sleep(min(sleep_seconds,45)) + timeout_counter += sleep_seconds + self.log("sim=%s connected", sim) + return True + + def connect_sim(self, sim, state): + self.client.put('%s/%s/testmode' % (self.CTRL_WAN_DEVS_PATH, sim), {"ready":state}) + + def reset_sim(self, sim, state): + self.log("Reset SIM called") + self.client.put('%s/%s' % (self.CTRL_WAN_DEVS_PATH, sim), {"reset":state}) + while True: + devs = json.loads(self.client.get(self.STATUS_DEVS_PATH)) + modems_list = [x for x in devs if x.startswith("mdm-")] + self.log('Modems_list: %s', modems_list) + if len(modems_list): + time.sleep(10) + continue + else: + break + self.log("Modem is offline") + try: + modems = self.find_modems(False) + except OneModem: + pass + self.log("Modem is back online") + + def reset_spdtest_cnt(self): + self.client.put('/state/system/netperf', {"run_count":0}) + + def iface(self, sim): + iface = self.client.get('%s/%s/info/iface' % (self.STATUS_DEVS_PATH, sim)) + return iface + + def run_speedtest(self, speedtest): + # TODO verify the put was successful + res = self.client.put("/control/netperf", speedtest) + self.log("put netperf res=%s", res) + + timeout_counter = 0 + + # wait for results + delay = speedtest['input']['options']['limit']['time'] + 2 + status = None + status_path = "/control/netperf/output/status" + while True: + self.log("waiting for netperf results...") + status = self.client.get(status_path).replace('"', '') + self.log("status=%s", status) + if status == 'complete': + break + # add timeout + if timeout_counter > self.NETPERF_TIMEOUT: + self.log("timeout waiting on netperf") + raise Timeout(status_path) + time.sleep(delay) + timeout_counter += delay + + if status != 'complete': + self.log("error: status=%s expected 'complete'", status) + return None + + # now get the result + res = self.client.get("/control/netperf/output/results_path") + self.log("results_path=%s", res) + + # TODO verify retrieved the string successfully + # strip and remove the leading/trailing quotes + results = self.client.get("%s" % res.strip()[1:-1]) or {} + #client.log("results=%s (%s)" % (results, type(results))) + return results + + def do_speedtest(self, sim): + mdm_ifc = self.iface(sim).replace('"', '') + self.log('Sim iface: %s', mdm_ifc) + default_speedtest['input']['options']['ifc_wan'] = mdm_ifc + + # run speedtest w/send & recv and attempt to parse as JSON + results = json.loads(self.run_speedtest(default_speedtest)) + + tcp_up = results.get('tcp_up') or None + tcp_down = results.get('tcp_down') or None + + if not tcp_up: + self.log('do_speedtest tcp_up results missing!') + default_speedtest['input']['options']['send'] = True + default_speedtest['input']['options']['recv'] = False + results = json.loads(self.run_speedtest(default_speedtest)) + tcp_up = results.get('tcp_up') or None + if not tcp_down: + self.log('do_speedtest tcp_down results missing!') + default_speedtest['input']['options']['send'] = False + default_speedtest['input']['options']['recv'] = True + results = json.loads(self.run_speedtest(default_speedtest)) + tcp_down = results.get('tcp_down') or None + + up = float(tcp_up.get('THROUGHPUT') or 0) if tcp_up else 0 + down = float(tcp_down.get('THROUGHPUT') or 0) if tcp_down else 0 + self.log('do_speedtest returning: %s down, %s up', down, up) + + self.reset_spdtest_cnt() + + return (up, down) + + def send_email(self, message): + rawlog("send_email:%s",message) + return + # Example of how to send email + server = "mail..com" + port = 587 + username = ".com" + password = '' + from_addr = '%s@.com' % username + to_addr = '@.com' + + email = Email.Email(server, port, username, password) + email.message('Information Message', from_addr, to_addr, message) + email.send() + + + def meets_minimums(self, up, down): + return up >= self.MIN_UPLOAD_SPD and down >= self.MIN_DOWNLOAD_SPD + + def percent_diff(self, a, b): + if a == 0 or b == 0: return 100.0 + return (abs(a-b)/min(a,b))*100.0 + + def gt_percent_diff(self, a, b, percent): + return self.percent_diff(a, b) >= percent + + def ten_prcnt_diff(self, a,b): + return self.gt_percent_diff(a, b, 10.0) + + def select_sim(self, sim1, s1_up, s1_down, sim2, s2_up, s2_down): + rawlog('select_sim') + s1 = {'slot':sim1, 'slot_name':'sim1', 'slot_num':1, 'up':s1_up, 'down':s1_down} + s2 = {'slot':sim2, 'slot_name':'sim2', 'slot_num':2, 'up':s2_up, 'down':s2_down} + + if self.meets_minimums(s1_up, s1_down): + return (s1,s2) + + if self.meets_minimums(s2_up, s2_down): + return (s2,s1) + + # Neither meet minimums, but > 10% diff on each, defer to DL speed + if self.ten_prcnt_diff(s1_up, s2_up) and self.ten_prcnt_diff(s1_down, s2_down): + return (s1,s2) if s1_down > s2_down else (s2,s1) + + # Neither meet minimums, but > 10% diff on upload, defer to UL speed + if self.ten_prcnt_diff(s1_up, s2_up) and not self.ten_prcnt_diff(s1_down, s2_down): + return (s1,s2) if s1_up > s2_up else (s2,s1) + + # Neither meet minimums, but > 10% diff on download, defer to DL speed + if not self.ten_prcnt_diff(s1_up, s2_up) and self.ten_prcnt_diff(s1_down, s2_down): + return (s1,s2) if s1_down > s2_down else (s2,s1) + + # Neither meet minimums and < 10% diff on both, defer to biggest delta + if not self.ten_prcnt_diff(s1_up, s2_up) and not self.ten_prcnt_diff(s1_down, s2_down): + d_up = self.percent_diff(s1_up, s2_up) + d_down = self.percent_diff(s1_down, s2_down) + + if d_up > d_down: + return (s1,s2) if s1_up > s2_up else (s2,s1) + else: + return (s1,s2) if s1_down > s2_down else (s2,s1) + + def log_results(self, product_name, system_id, selected_sim, rejected_sim): + rawlog("log_results") + sdiag= json.loads(self.client.get('%s/%s/diagnostics' % (self.STATUS_DEVS_PATH, selected_sim['slot']))) + rdiag= json.loads(self.client.get('%s/%s/diagnostics' % (self.STATUS_DEVS_PATH, rejected_sim['slot']))) + + msg1 = 'The results of the SIM test on product={} id={} are as follows:'.format(product_name, system_id) + msg2 = 'Selected Sim: slot={} carrier={} ICCID={} down={:.4f} up={:.4f}'.format( \ + selected_sim['slot_name'], sdiag['HOMECARRID'], sdiag['ICCID'], selected_sim['down'], selected_sim['up']) + msg3 = 'Rejected Sim: slot={} carrier={} ICCID={} down={:.4f} up={:.4f}'.format( \ + rejected_sim['slot_name'], rdiag['HOMECARRID'], rdiag['ICCID'], rejected_sim['down'], rejected_sim['up']) + + msg = msg1 + ' ' + msg2 + ', ' + msg3 + + self.log(msg1); self.log(msg2); self.log(msg3) + self.client.alert(msg) + self.send_email(msg) + + def lock_sim(self,sim): + port = self.client.get('/%s/%s/info/port' % (self.STATUS_DEVS_PATH, sim['slot'])).replace('"', '') + sim_disable_mask = '%s,%s' % (port, sim['slot_num']) + self.log("Writing dual_sim_disable_mask to: %s", sim_disable_mask) + self.client.put('/config/wan', {'dual_sim_disable_mask':sim_disable_mask}) + + def NTP_time_updated(self): + return time.time() > 1467416418 + + def ECM_resume(self): + self.log('Resuming ECM') + self.client.put('/control/ecm', {'restart': 'true'}) + timeout_count = 500 + while not 'connected' == self.client.get('/status/ecm/state').replace('"', ''): + timeout_count -= 1 + if not timeout_count: + raise Timeout('ECM not connecting') + time.sleep(2) + + def ECM_suspend(self): + self.log('Suspending ECM') + timeout_count = 500 + while not 'ready' == self.client.get('/status/ecm/sync').replace('"', ''): + timeout_count -= 1 + if not timeout_count: + raise Timeout('ECM sync ready') + time.sleep(2) + self.client.put('/control/ecm', {'stop':'stop'}) + timeout_count = 500 + while not 'stopped' == self.client.get('/status/ecm/state').replace('"', ''): + timeout_count -= 1 + if not timeout_count: + raise Timeout('ECM not stopping') + time.sleep(2) + + def ECM_config_ver(self): + return self.client.get('/config/ecm/config_version').replace('"', '') + + def ECM_updated(self): + return self.ECM_config_ver > 0 + + def ECM_connected(self): + ecm_state = self.client.get("/status/ecm/state") + #TODO Remove unmanaged test below after dev done. + return '"connected"' == ecm_state or '"unmanaged"' == ecm_state + + def min_fw_version_check(self, major, minor, patch=0): + fw_major = int(self.client.get("/status/fw_info/major_version").replace('"', '')) + fw_minor = int(self.client.get("/status/fw_info/minor_version").replace('"', '')) + fw_patch = int(self.client.get("/status/fw_info/patch_version").replace('"', '')) + self.log("Current FW Version - major: %s, minor: %s, patch: %s", + fw_major, fw_minor, fw_patch) + return fw_major >= major and fw_minor >= minor and fw_patch >= patch + + def wait_to_start(self): + while not self.NTP_time_updated(): + self.log("waiting for NTP time set now=%s", time.ctime()) + time.sleep(5) + + while not self.ECM_connected(): + self.log("waiting for ECM update now=%s", time.ctime()) + time.sleep(5) + + def run(self): + if not self.min_fw_version_check(6, 2): + self.log("Boot1 FW version check failed!") + return + else: + self.log("Boot1 FW version check passed") + + if 'running' == self.client.get('/status/sdk/Boot1').replace('"', ''): + self.log("Boot1 SIM test already running!") + return + else: + self.client.put('/status/sdk', {'Boot1':'running'}) + + self.log("Boot1 SIM test starting") + self.wait_to_start() + + product_name = self.client.get("/status/product_info/product_name") + system_id = self.client.get("/config/system/system_id") + + sim1, sim2 = self.find_sims() + + self.client.log('Sending alert to ECM.') + message = "Hello from BOOT1 SIM Speedtest product={} id={}".format(product_name, system_id) + self.client.alert('Transmitting message: %s' % message) + self.send_email(message) + + self.ECM_suspend() + + self.enable_eth_mode('loadbalance', True) + self.enable_mdm_mode('loadbalance', True) + self.connect_sim(sim1, True) + self.connect_sim(sim2, False) + + sim1_upload_speed = sim1_download_speed = 0.0 + if sim1: + try: + if self.modem_state(sim1, 'connected'): + sim1_upload_speed, sim1_download_speed = self.do_speedtest(sim1) + except Timeout: + self.log("timeout on sim=%s", sim1) + self.client.alert("netperf failed on sim1=%s" % sim1) + # continue, try sim2 + + sim2_upload_speed = sim2_download_speed = 0.0 + if sim2 and not (sim1_upload_speed >= self.MIN_UPLOAD_SPD and sim1_download_speed >= self.MIN_DOWNLOAD_SPD): + self.connect_sim(sim2, True) + self.connect_sim(sim1, False) + try: + if self.modem_state(sim2, 'connected'): + sim2_upload_speed, sim2_download_speed = self.do_speedtest(sim2) + except Timeout: + self.log("timeout on sim=%s", sim2) + self.client.alert("netperf failed on sim2=%s" % sim2) + self.connect_sim(sim1, True) + elif not sim2: + rawlog("Error with Sim2:%s", sim2) + self.log("Error with Sim2:%s", sim2) + + self.enable_mdm_mode('loadbalance', False) + self.enable_eth_mode('loadbalance', False) + + rawlog('\n\nSpeeds - Sim1: %f down, %f up Sim2: %f down, %f up' % \ + (sim1_download_speed, sim1_upload_speed, \ + sim2_download_speed, sim2_upload_speed)) + + # Check for abject failure + if sim1_download_speed == 0.0 and sim1_upload_speed == 0.0 and \ + sim2_download_speed == 0.0 and sim2_upload_speed == 0.0: + self.client.alert('Was not able to get any modem speed results. Aborting!') + self.log('Was not able to get any modem speed results. Aborting!') + self.client.put('/status/sdk', {'Boot1':'failed'}) + self.ECM_resume() + return + + # Run the selection algorithm + selected_sim, rejected_sim = self.select_sim(sim1, sim1_upload_speed, sim1_download_speed, sim2, sim2_upload_speed, sim2_download_speed) + + self.log_results(product_name, system_id, selected_sim, rejected_sim) + + self.enable_mdm_mode('loadbalance', None) + self.enable_eth_mode('loadbalance', None) + + self.lock_sim(selected_sim) + self.reset_sim(selected_sim['slot'], True) + + self.ECM_resume() + + self.client.put('/status/sdk', {'Boot1':'completed'}) + self.log("Boot1 SIM test completed") + +if __name__ == '__main__': + errmsg = None + try: + boot1 = SIMSpeedTest() + boot1.run() + except OneModem: + # non-local goto :-( + boot1.ECM_resume() + except Exception as err: + boot1.ECM_resume() + errmsg = "failed with exception={} err={}".format(type(err), str(err)) + + # not doing this inside the exception above in case we can't write to the + # filesystem; don't want to throw inside a except + if errmsg is not None: + rawlog("failed with exception={}".format(errmsg)) + try: + with open("/tmp/boot1.fatal.log","w") as outfile: + outfile.write(errmsg) + except IOError as err: + # unable to open the log file + if _STDERR: + print("failed with exception={}".format(err), file=sys.stderr) + pass + + while True: + # as of this writing (20160707) we cannot exit the SDK app without + # being restarted by the firmware SDK service. So we suspend. + time.sleep(2147483647) diff --git a/Boot1/Email.py b/Boot1/Email.py new file mode 100644 index 00000000..dfa90be5 --- /dev/null +++ b/Boot1/Email.py @@ -0,0 +1,98 @@ +""" + + Email.py -- Email from SDK App + + Copyright © 2015 Cradlepoint, Inc. . All rights reserved. + + This file contains confidential information of Cradlepoint, Inc. and your + use of this file is subject to the Cradlepoint Software License Agreement + distributed with this file. Unauthorized reproduction or distribution of + this file is subject to civil and criminal penalties. + + Desc: + +""" + +import sys +import smtplib +import socket +import time + +class Email(object): + """Email class to send emails""" + +# USER = "nrf2016cp@gmail.com" +# PASS = "Welcome2cp" +# +# SERVER = "smtp.gmail.com" +# PORT = 587 + DATE_FMT= "%a, %d %b %Y %H:%M:%S %z" + + def __init__(self, server, port, user, password): + self.server = server + self.port = port + self.user = user + self.password = password + + self.msg = '' + self.from_addr = 'test1@test.org' + self.to_addr = 'test2@test.org' + + def message(self, subject, from_addr, to_addr, body): + self.from_addr = from_addr + self.to_addr = to_addr + + template = 'Content-Type: text/plain; charset="us-ascii"\n' + template += 'MIME-Version: 1.0\nContent-Transfer-Encoding: 7bit\n' + template += 'Date: {}\n' + template += 'Subject: {}\nFrom: {}\nTo: {}\n\n{}' + + self.msg = template.format(time.strftime(self.DATE_FMT), subject, from_addr, to_addr, body) + + def _send_tls(self): + try: + host = socket.gethostname() + mail_server = smtplib.SMTP(self.server, self.port, host) + mail_server.ehlo() + mail_server.starttls() + mail_server.ehlo() + + mail_server.login(self.user, self.password) + mail_server.sendmail(self.from_addr, self.to_addr, self.msg) + + mail_server.quit() + except smtplib.SMTPException as err: + print("_send_tls failed: err=%s" % err, file=sys.stderr) + raise + + def _send(self): + try: + host = socket.gethostname() + mail_server = smtplib.SMTP(self.server, self.port, host) + mail_server.ehlo() + mail_server.sendmail(self.from_addr, self.to_addr, self.msg) + mail_server.quit() + + except smtplib.SMTPException as err: + print("_send failed: err=%s" % err, file=sys.stderr) + raise + + def send(self): + try: + self._send_tls() + except smtplib.SMTPException: + # _send_tls() will log error + pass + else: + # succes! + return + + return + + # fall back to insecure email + print("send falling back to unauthenticated SMTP", file=sys.stderr) + try: + self._send() + except smtplib.SMTPException: + # _send() will log error + pass diff --git a/Boot1/LogLister.py b/Boot1/LogLister.py new file mode 100644 index 00000000..84894aae --- /dev/null +++ b/Boot1/LogLister.py @@ -0,0 +1,51 @@ +""" + + LogLister.py -- Sample SDK App + + Copyright © 2015 Cradlepoint, Inc. . All rights reserved. + + This file contains confidential information of Cradlepoint, Inc. and your + use of this file is subject to the Cradlepoint Software License Agreement + distributed with this file. Unauthorized reproduction or distribution of + this file is subject to civil and criminal penalties. + + Desc: + +""" + +import serial +import time + + +class LogLister(object): + """Crappy class connects to MIPS/ARM CP router""" + + DEV = '/dev/ttyUSB0' + MIPS = 57600 + ARM = 115200 + + def __init__(self): + self.serial = serial.Serial() + self.serial.port = self.DEV + self.serial.baudrate = self.MIPS + self.serial.bytesize = 8 + self.serial.parity = 'N' + self.serial.stopbits = 1 + self.serial.timeout = 1 + + def dump(self, cmd): + if not self.serial.isOpen(): + self.serial.open() + + self.serial.write(cmd.encode()+b'\r\n') + time.sleep(0.5) + + out = '' + resp = self.serial.readline() + + while resp != b'': + out += resp.decode() + resp = self.serial.readline() + self.serial.close() + + return out diff --git a/Boot1/install.sh b/Boot1/install.sh new file mode 100644 index 00000000..4230e61e --- /dev/null +++ b/Boot1/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION for Boot1 on:" >> install.log +date >> install.log diff --git a/Boot1/package.ini b/Boot1/package.ini new file mode 100644 index 00000000..f6a3fba9 --- /dev/null +++ b/Boot1/package.ini @@ -0,0 +1,12 @@ +[Boot1] +uuid=cde20cbb-b146-40ef-9f60-c162a0e4c562 +vendor=Cradlepoint +notes=Router SDK Boot1 SIM Speedtest +firmware_major=6 +firmware_minor=2 +restart=true +reboot=true +auto_start=true +app_type=0 +version_major=1 +version_minor=10 diff --git a/Boot1/start.sh b/Boot1/start.sh new file mode 100644 index 00000000..676eb9a3 --- /dev/null +++ b/Boot1/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash +#echo foo > /tmp/foo.txt +cppython Boot1.py diff --git a/GNU_Make_README.html b/GNU_Make_README.html new file mode 100644 index 00000000..440a5551 --- /dev/null +++ b/GNU_Make_README.html @@ -0,0 +1,428 @@ + + + +GNU_Make_README + + + + +

Router SDK reference application and development tools.

+

Available GNU make targets:

+

default: + Build and test the router SDK reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to ECM.

+

clean: + Clean all project artifacts. If a package returns with 'nothing to be done', a clean will cause the next package to occur.

+

package: + Create the application archive tar.gz file.

+

status: + Fetch and print current SDK app status from the locally connected router.

+

install: + Secure copy the application archive to a locally connected router. The router must already be in DEV mode via the ECM.

+

start: + Start the application on the locally connected router.

+

stop: + Stop the application on the locally connected router.

+

uninstall: + Uninstall the application from the locally connected router.

+

purge: + Purge all applications from the locally connected router.

+
+

HOW-TO Steps for running the reference application on your router.

+
    +
  1. +

    Register your router with ECM.

    +
  2. +
  3. +

    Put your router into DEV mode via ECM.

    +
  4. +
  5. +

    Export the following variables in your environment:

    +
    APP_NAME - The directory that contains the app
    +APP_UUID - Each app must have its own UUID
    +DEV_CLIENT_MAC - The mac address of your router
    +DEV_CLIENT_IP  - The lan ip address of your router
    +DEV_CLIENT_PASSWORD - The router password. Only needed if the
    +default password has been changed.
    +
    + +

    Example:

    +
    $ export APP_NAME=ping
    +$ export APP_UUID=38858989-af8b-4e5d-8e2e-1cbc79acdde4
    +$ export DEV_CLIENT_MAC=44224267
    +$ export DEV_CLIENT_IP=192.168.0.1
    +
    + +
  6. +
  7. +

    Create the application package (i.e. <app_name>.tar.gz).

    +
    $ make
    +
    + +
  8. +
  9. +

    Test connectivity with your router via the 'status' target.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {},
    +    "success": true
    +}
    +
    + +
  10. +
  11. +

    Install the application in the router.

    +
    $ make install
    +scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload
    +admin@192.168.0.1's password: 
    +hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    +Received disconnect from 192.168.0.1: 11: Bye Bye
    +lost connection
    +
    + +
  12. +
  13. +

    Get application execution status from your router.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {
    +        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    +            "app": {
    +                "date": "2015-12-04T09:30:39.656151",
    +                "name": "hspt",
    +                "restart": true,
    +                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +                "vendor": "Cradlebox",
    +                "version_major": 1,
    +                "version_minor": 1
    +            },
    +            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +            "directory": hspt",
    +            "filename": "dist/tmp_znv2t",
    +            "state": "started",
    +            "summary": "Package started successfully",
    +            "type": "development",
    +            "url": "file:///var/tmp/tmpg1385l",
    +            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    +        }
    +    },
    +    "success": true
    +}
    +
    + +
  14. +
  15. +

    Uninstall the application in the router.

    +
    $ make uninstall
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X PUT http://192.168.0.1/api/control/system/sdk/action \
    +                -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +    "success": true
    +}
    +
    + +
  16. +
+
+

Published Date: 5-9-2017

+

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

+ + + + diff --git a/gnu_apps/extensible_ui_ref_app/Makefile b/Makefile similarity index 100% rename from gnu_apps/extensible_ui_ref_app/Makefile rename to Makefile diff --git a/README.html b/README.html new file mode 100644 index 00000000..b29a0cf4 --- /dev/null +++ b/README.html @@ -0,0 +1,488 @@ + + + +README + + + + +

Router SDK/App sample Design Tools.

+
+

This directory contains the Router SDK tools and sample applications. Below is a desciption of each. The Router Applications Development Guide is the best document to read first.

+

*** IMPORTANT - PLEASE READ ***

+

This is version 2.0 of the Router SDK and applications. The SDK has been simplified from the previous SDK to decrease the learning curve to allow more focus on application development. The router application infrastructure and packaging is unchanged. That is, an 'tar.gz' application package built with the previous SDK can still be installed into the router using SDK version 2.0. However, the coding of an application version 1.0 may need to be re-factored in order for continued development with SDK version 2.0. Please see document SDK_version_1.0_app_refactor.html in this directory for details.

+

Documents

+
    +
  • +README.html +
      +
    • This README file.
    • +
    +
  • +
  • +Router_Application_Development_Guide.html +
      +
    • The main document that describes application development.
    • +
    +
  • +
  • +Router_APIs_for_Applications.html +
      +
    • The router config store API in the router.
    • +
    +
  • +
  • +GNU_Make_README.html +
      +
    • The Linux GNU make instructions for the SDK.
    • +
    +
  • +
+

Sample Application Directories

+
    +
  • +app_template +
      +
    • A skeleton template for the creation of a new application.
    • +
    +
  • +
  • +Boot1 +
      +
    • On bootup, this application will select test the connection of each sim in a dual sim modem and enable the best.
    • +
    +
  • +
  • +email +
      +
    • Sends an email.
    • +
    +
  • +
  • +ftp_client +
      +
    • Creates a file and uploads it to an FTP server.
    • +
    +
  • +
  • +ftp_server +
      +
    • Creates an FTP server in the router. A USB memory device is used as the FTP directory.
    • +
    +
  • +
  • +gps_localhost +
      +
    • Assuming the Cradlepoint router is configured to forward NMEA sentences to a localhost port, open the port as a server and receive the streaming GSP data.
    • +
    +
  • +
  • +gps_probe +
      +
    • Probe the GPS hardware and log the results.
    • +
    +
  • +
  • +hello_world +
      +
    • Outputs a 'Hello World!' log every 10 seconds.
    • +
    +
  • +
  • +hspt +
      +
    • Sets up a custom Hot Spot landing page.
    • +
    +
  • +
  • +list_serial_ports +
      +
    • Lists out the serial ports in the logs.
    • +
    +
  • +
  • +loglevel +
      +
    • Changes the router log level.
    • +
    +
  • +
  • +modbus_poll +
      +
    • Poll a single range of Modbus registers from an attached serial Modbus/RTU PLC or slave device.
    • +
    +
  • +
  • +modbus_simple_bridge +
      +
    • A basic Modbus/TCP to RTU bridge.
    • +
    +
  • +
  • +ping +
      +
    • Ping an address and log the results.
    • +
    +
  • +
  • +power_gpio +
      +
    • Query the 2x2 power connector GPIO.
    • +
    +
  • +
  • +send_alert +
      +
    • Sends an alert to the ECM when the application is started and stopped.
    • +
    +
  • +
  • +send_to_server +
      +
    • Gets the '/status' from the reouter config store and send it to a test server.
    • +
    +
  • +
  • +serial_echo +
      +
    • Waits for data to enter the serial port, then echo back out.
    • +
    +
  • +
  • +simple_web_server +
      +
    • A simple web server to receive messages. Note that any 'server function' requires the router firewall to be correctly changed to allow client access to the router.
    • +
    +
  • +
+

SDK Directories

+
    +
  • +common +
      +
    • Contains the cs.py file which should be copied into an application folder. It is a wrapper for the TCP interface to the router config store.
    • +
    +
  • +
  • +config +
      +
    • Contains the settings.mk file for Linux users that want to use GNU make for application development instead of python make.py.
    • +
    +
  • +
  • +tools +
      +
    • Contains support files for the SDK. There is also a simple python syslog server that can be used during application development.
    • +
    +
  • +
+

Files

+
    +
  • +make.py +
      +
    • The main python tool used to build application packages and install, uninstall, start, stop, or purge from a locally connected router that is in DEV mode.
    • +
    +
  • +
  • +Makefile +
      +
    • The Makefile for Linux users that want to use GNU make for application development instead of python make.py.
    • +
    +
  • +
  • +sdk_settings.ini +
      +
    • This is the ini file that contains the settings used by python make.py.
    • +
    +
  • +
+ + + + diff --git a/README.md b/README.md index 2228bae9..a86086d6 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,84 @@ -# Router App/SDK sample application design tools. +# Router SDK/App sample Design Tools. +---------- +This directory contains the Router SDK tools and sample applications. Below is a desciption of each. The Router Applications Development Guide is the best document to read first. + +## *** IMPORTANT - PLEASE READ *** + +This is version 2.0 of the Router SDK and applications. The SDK has been simplified from the previous SDK to decrease the learning curve to allow more focus on application development. The router application infrastructure and packaging is unchanged. That is, an 'tar.gz' application package built with the previous SDK can still be installed into the router using SDK version 2.0. However, the coding of an application version 1.0 may need to be re-factored in order for continued development with SDK version 2.0. Please see document SDK\_version\_1.0\_app_refactor.html in this directory for details. + +## Documents + +- **README.html** + - This README file. +- **Router\_Application\_Development_Guide.html** + - The main document that describes application development. +- **Router\_APIs\_for_Applications.html** + - The router config store API in the router. +- **GNU\_Make_README.html** + - The Linux GNU make instructions for the SDK. + +## Sample Application Directories + +- **app_template** + - A skeleton template for the creation of a new application. +- **Boot1** + - On bootup, this application will select test the connection of each sim in a dual sim modem and enable the best. +- **email** + - Sends an email. +- **ftp_client** + - Creates a file and uploads it to an FTP server. +- **ftp_server** + - Creates an FTP server in the router. A USB memory device is used as the FTP directory. +- **gps_localhost** + - Assuming the Cradlepoint router is configured to forward NMEA sentences to a localhost port, open the port as a server and receive the streaming GSP data. +- **gps_probe** + - Probe the GPS hardware and log the results. +- **hello_world** + - Outputs a 'Hello World!' log every 10 seconds. +- **hspt** + - Sets up a custom Hot Spot landing page. +- **list\_serial_ports** + - Lists out the serial ports in the logs. +- **loglevel** + - Changes the router log level. +- **modbus_poll** + - Poll a single range of Modbus registers from an attached serial Modbus/RTU PLC or slave device. +- **modbus\_simple_bridge** + - A basic Modbus/TCP to RTU bridge. +- **ping** + - Ping an address and log the results. +- **power_gpio** + - Query the 2x2 power connector GPIO. +- **send_alert** + - Sends an alert to the ECM when the application is started and stopped. +- **send\_to_server** + - Gets the '/status' from the reouter config store and send it to a test server. +- **serial_echo** + - Waits for data to enter the serial port, then echo back out. +- **simple\_web_server** + - A simple web server to receive messages. Note that any 'server function' requires the router firewall to be correctly changed to allow client access to the router. + + + + +## SDK Directories + +- **common** + - Contains the cs.py file which should be copied into an application folder. It is a wrapper for the TCP interface to the router config store. +- **config** + - Contains the settings.mk file for Linux users that want to use GNU make for application development instead of python make.py. +- **tools** + - Contains support files for the SDK. There is also a simple python syslog server that can be used during application development. + +## Files + +- **make.py** + - The main python tool used to build application packages and install, uninstall, start, stop, or purge from a locally connected router that is in DEV mode. +- **Makefile** + - The Makefile for Linux users that want to use GNU make for application development instead of python make.py. +- **sdk_settings.ini** + - This is the ini file that contains the settings used by python make.py. -## File Make.py -This is the main build tool - see for how-to-use -documentation. -## Directory config -Hold various shared configuration files, plus the default main.py - -## Directory cp_lib - -Common library modules. Most are designed to work on the Cradlepoint router, -although most can run on either a router or (for testing) on a PC - -## Directory data - SAMPLES - -Code Sample related to 'data' usage and movement. -* json_settings - simple JSON server on TCP port 9901, which allows -a JSON RPC client to query the CradlepointAppBase 'settings' data - -## Directory demo - SAMPLES - -Larger code applications related to customer demos. -* gpio_power_loss - monitor the IBR11X0 2x2 power connector input to detect -power loss. Email an alert when power is lost or restored. -* hoops_counter - run both a JSON RPC server and web server. -They share a counter value (app_base.data["counter"]). -JSON RPC server assumes a remote client puts (writes) new counter values. -The web server shows as 5 large graphic digits on a page. - -## Directory gpio - SAMPLES - -Code Samples related to router input/output pins: -* power - read the 2x2 power connector gpio on the IBR11X0 -* serial_gpio - read 3 inputs on the IBR11X0's RS-232 port - -## Directory gps - SAMPLES - -Code Samples related to router GPS: -* probe_gps - query the router STATUS tree, showing if the router supports -GPS, and if any active modems show GPS data - -## Directory network - SAMPLES - -Code Samples related to common TCP/IP network tasks: -* **warning: any 'server function' requires the router firewall to be -correctly changed to allow client access to the router.** -* digit_web - display a web page of a 5-digit number, as JPG images per digit. -This demonstrates support for a simple web page with embedded objects, \ -which means the remote browser makes multiple requests. -* send_email - send a single email to GMAIL with SSL/TLS -* send_ping - use Router API control tree to send a ping. -Sadly, is fixed to 40 pings, so takes about 40 seconds! -* simple_web - display a web page with a short text message. -* tcp_echo - accept a raw client, echoing back (repeating) any text received. - -## Directory serial_port - SAMPLES - -Code Samples related to common TCP/IP network tasks: -* list_port - tests ports on IBR11X0 - firmware does NOT yet support -* serial_echo - open IBR11X0 RS-232 port, echo by bytes received -- firmware does NOT yet support properly - -## Directory simple - SAMPLES - -Code Samples related to common tasks: -* hello_world - single python file running, sending text message to Syslog. -Naming the code file 'main.py' -prevents make.py from including the default main.py and many cplib files. -* hello_world_1task - send text message to Syslog, but creates 1 sub-task -to do the sending. On a PC, a KeyboardInterrupt shows how to gracefully -stop children tasks. -* hello_world_2task - send 3 text messages to Syslog, by creating 3 sub-tasks -to do the sending. 2 sub-tasks run forever, while the third exists frequently -and is restarted. -* hello_world-app - send a text message to Syslog. uses the CradlepointAppBase. -* send_alert - send an ECM alert. - -## Directory test - -Unittest scripts - -## Directory tools - -Shared modules NEVER designed to run on the router. -Most of the tools here are used by MAKE.PY diff --git a/Router_API_for_Applications.html b/Router_API_for_Applications.html new file mode 100644 index 00000000..c5a910ec --- /dev/null +++ b/Router_API_for_Applications.html @@ -0,0 +1,1053 @@ + + + +Router_API_for_Applications + + + + +

Router API for Applications

+
+

Quick Links

+

Overview

+

Router Info

+

Router SDK and Application Info

+

Logging

+

Ping

+

GPIO

+

GPS

+

Modem

+

+

Overview

+

The router trees, also referred to as the router config store, are essentially the APIs to router query and control. One can read items to determine status or results and write to control and configure. All data is exchanged in the JSON format. The JSON format is described at http://www.json.org/. The data can be accessed via the router CLI, a python application, or using curl.

+

The router config store consist of the following trees:

+
    +
  • +control +
      +
    • Elements used for controlling functions of the router.
    • +
    +
  • +
  • +config +
      +
    • Elements used for router configuration.
    • +
    +
  • +
  • +status +
      +
    • Elements to get the status of the router.
    • +
    +
  • +
  • +state +
      +
    • Should not to be used by applications.
    • +
    +
  • +
+

This document does not describe every item in the router config store. There are sections that cover functionality and how the config store can be used for that function (i.e. Ping, GPIO, GPS, Modem, etc.). Many functional areas will span multiple tree types depending on the use case. Anything which is done via the router UI, utilizes the router trees.

+

CLI Example

+

Below is an example of how to query the router system logging information using the cat or get command and then changing the logging level to info with the set command. Note the JSON format in the output. These trees can also be traversed using linux change directory command (i.e. cd /config/system/logging). This can be very useful to see what is contained in each branch of the tree.

+
    [admin@IBR900-267: /$ cat /config/system/logging
+    {
+        "console": false,
+        "enabled": true,
+        "firewall": false,
+        "level": "debug",
+        "max_logs": 1000,
+        "modem_debug": {
+            "lvl_error": false,
+            "lvl_info": false,
+            "lvl_trace": false,
+            "lvl_warn": false
+        },
+        "remoteLogging": {
+            "enabled": false,
+            "serverAddr": "192.168.20.171",
+            "server_port": 514,
+            "system_id": false,
+            "utf8_bom": false
+        },
+        "services": []
+    }
+    [admin@IBR900-267: /$ set /config/system/logging/level "info"
+
+    [admin@IBR900-267: /$ cat /config/system/logging
+    {
+        "console": false,
+        "enabled": true,
+        "firewall": false,
+        "level": "info",
+        "max_logs": 1000,
+        "modem_debug": {
+            "lvl_error": false,
+            "lvl_info": false,
+            "lvl_trace": false,
+            "lvl_warn": false
+        },
+        "remoteLogging": {
+            "enabled": false,
+            "serverAddr": "192.168.20.171",
+            "server_port": 514,
+            "system_id": false,
+            "utf8_bom": false
+        },
+        "services": []
+    }
+
+ +

Python Example

+

All sample apps include a cs.py file which contains the CSClient class. This class is a wrapper for the TCP interface to the router trees. Below is an example of how to query the router system logging information and then change the logging level to debug using the CSClient class.

+
    # Import the CSClient file which contains the necessary functions
+    # for router config store access
+    import cs
+
+    appName = 'ref_app'
+
+    cs.CSClient().log(appName, 'action({})'.format(command))
+
+    # Read the logging level
+    ret_value = cs.CSClient().get('/config/system/logging/level')
+
+    # Output a syslog for the current logging level
+    cs.CSClient().log(appName, 'Current Logging level = {}'.format(ret_value))
+    ret_value = ''
+
+    # Set the logging level to debug when the app is stopped.
+    ret_value = cs.CSClient().put('/config/system/logging', {'level': 'debug'})
+
+    # Output a syslog for the new current logging level
+    cs.CSClient().log(appName, 'New Logging level = {}'.format(ret_value))
+
+ +

Curl Example

+

On Linux, the curl command can also be used to access items in the router trees. Use curl 'GET' to read and 'PUT' to write. Below is an example of getting the SDK status.

+

The user specific information in the curl command is:

+
    +
  • router user name: admin
  • +
  • router password: 44224267
  • +
  • +

    router IP address: 192.168.0.1

    +
        $ curl -s --digest --insecure -u admin:44224267 -H "Accept: application/json" -X GET http://192.168.0.1/api/status/system/sdk | /usr/bin/env python3 -m json.tool
    +    {
    +        "success": true,
    +        "data": {
    +            "service": "started",
    +            "mode": "devmode",
    +            "summary": "Service started"
    +        }
    +    }
    +
    +
    +    curl -s --digest --insecure -u admin:44224267 -H "Accept: application/json" -X GET http://192.168.0.1/api/config/system/logging/level | /usr/bin/env python3 -m json.tool
    +    {
    +        "success": true,
    +        "data": "debug"
    +    }
    +
    +
    +    curl -s --digest --insecure -u admin:44224267 -H "Accept: application/json" -X PUT http://192.168.0.1/api/config/system/logging/level -d data='"info"' | /usr/bin/env python3 -m json.tool
    +    {
    +        "success": true,
    +        "data": "info"
    +    }        
    +
    + +
  • +
+

+

Router Info

+

There are three different trees that provide router information. Most are self explanatory.

+

Product Info /status/product_info/:

+
    cat /status/product_info/
+    {
+        "company_name": "Cradlepoint, Inc.",
+        "company_url": "http://cradlepoint.com",
+        "copyright": "Cradlepoint, Inc. 2017",
+        "mac0": "00:30:44:22:42:67",
+        "manufacturing": {
+            "board_ID": "909507",
+            "mftr_date": "1643",
+            "serial_num": "WA164300000518"
+        },
+        "product_name": "IBR900LP6"
+    }
+
+ +

Firmware Info /status/fw_info/:

+
    cat /status/fw_info/
+    {
+        "build_date": "Wed Mar  8 18:57:21 MST 2017",
+        "build_type": "RELEASE",
+        "build_version": "cc2619b",
+        "custom_defaults": false,
+        "fw_update_available": false,
+        "major_version": 6,
+        "manufacturing_upgrade": false,
+        "minor_version": 3,
+        "patch_version": 1,
+        "upgrade_major_version": 0,
+        "upgrade_minor_version": 0,
+        "upgrade_patch_version": 0
+    }  
+
+ +

Feature Info /status/feature:

+

The feature information provides a list of feature license. The two SDK license will only exist if the features have been enabled via the ECM. The 'Router SDK' means that router apps have been enabled while the 'Router SDK - Dev Mode' means the the development mode is enabled.

+
    cat /status/feature
+    {
+        "db": [
+            [
+                "46a03bd2-91ae-11e2-a305-002564cb1fdc",
+                "Extended Enterprise License",
+                1123,
+                1064
+            ],
+            [
+                "b7b3eb09-53c5-4a5c-88d8-f9456870087c",
+                "Router SDK - Dev Mode",
+                7606,
+                7597
+            ],
+            [
+                "9568fa81-d8e0-4223-a18c-0b1784f21f2a",
+                "Router SDK",
+                7607,
+                7597
+            ]
+        ],
+        "expiring_alert": false
+    }
+
+ +

System ID /config/system/system_id:

+

This is a customizable identity that will be used in router reporting and alerting. The default value is the product name and the last three characters in the MAC address of the router. It is used as a hostname to DHCP, so it must conform to standard hostname conventions.

+
    cat /config/system/system_id
+    "IBR900-267"
+
+ +

Ethernet /status/ethernet:

+

Shows current state of the Ethernet ports and their speed.

+
    cat /status/ethernet
+    [
+        {
+            "link": "up",
+            "link_speed": "1000FD",
+            "port": 0
+        },
+        {
+            "link": "up",
+            "link_speed": "1000FD",
+            "port": 1
+        },
+        {
+            "link": "down",
+            "link_speed": "Unknown",
+            "port": 2
+        }
+    ]
+
+ +

+

SDK and Application Info

+

SDK and application information can be found in /status/system/sdk. It contains the state of the Router SDK service and any application. If there are any error with installing or starting an application, it will be contained in this tree.

+

/status/system/sdk:

+

The main items in SDK status tree are:

+
    +
  • +mode +
      +
    • +This indicates the route SDK mode which affects how apps can be installed. +
        +
      • standard - Normal router mode when apps can be installed via ECM.
      • +
      • devmode - Development mode which allows apps to be installed directly from a computer. This is set from the Tools menu of ECM.
      • +
      +
    • +
    +
  • +
  • +service +
      +
    • The state of the Router SDK service in the router.
    • +
    +
  • +
  • +summary +
      +
    • A more detailed version of the Router SDK service state.
    • +
    +
  • +
  • +apps +
      +
    • A list of any apps that are installed with details about each app. Most are items self explanatory. However, note the 'state' which indicated the current state of the app. This can be installing, started, error, etc.
    • +
    +
  • +
+

No App installed:

+
    cat /status/system/sdk
+    {
+        "mode": "devmode",
+        "service": "started",
+        "summary": "Service started"
+    }
+
+ +

After App installed:

+
    cat /status/system/sdk
+    {
+        "apps": [
+            {
+                "_id_": "616acd0c-0475-479e-a33b-f7054843c971",
+                "app": {
+                    "auto_start": true,
+                    "date": "2017-03-31T15:49:17.537335",
+                    "name": "hello_world",
+                    "reboot": true,
+                    "restart": false,
+                    "uuid": "616acd0c-0475-479e-a33b-f7054843c971",
+                    "vendor": "Cradlebpoint",
+                    "version_major": 1,
+                    "version_minor": 0
+                },
+                "state": "started",
+                "summary": "Started Application",
+                "type": "developer"
+            }
+        ],
+        "mode": "devmode",
+        "service": "started",
+        "summary": "Service started"
+    }
+
+ +

+

Logging

+

Router logging can be queried or configured via /config/system/logging. This includes setting the log level along with sending logs to a syslog server.

+
    cat /config/system/logging/
+    {
+        "console": false,
+        "enabled": true,
+        "firewall": false,
+        "level": "debug",
+        "max_logs": 1000,
+        "modem_debug": {
+            "lvl_error": false,
+            "lvl_info": false,
+            "lvl_trace": false,
+            "lvl_warn": false
+        },
+        "remoteLogging": {
+            "enabled": false,
+            "serverAddr": "192.168.0.171",
+            "server_port": 514,
+            "system_id": false,
+            "utf8_bom": true
+        },
+        "services": []
+    }
+
+ +
    +
  • +console +
      +
    • Not Used.
    • +
    +
  • +
  • +enabled +
      +
    • Not Used.
    • +
    +
  • +
  • +firewall +
      +
    • Not Used.
    • +
    +
  • +
  • +level +
      +
    • Setting the log level controls which messages are stored or filtered out. A log level of Debug will record the most information while a log level of Critical will only record the most urgent messages.
    • +
    +
  • +
  • +max_logs +
      +
    • This is the maximum number of log messages the service will store. After this limit is reached, the oldest are lost as new messages come in. However, based on the platform, the limit may be smaller.
    • +
    +
  • +
  • +modem_debug +
      +
    • Used to set the modem logging level. Not recommended for application use.
    • +
    +
  • +
  • +remoteLogging +
      +
    • +enabled +
        +
      • Set true to send log messages to the specified Syslog Server.
      • +
      +
    • +
    • +serverAddr +
        +
      • The Hostname or IP address of the Syslog Server.
      • +
      +
    • +
    • +server_port +
        +
      • The Port Number of the Syslog Server.
      • +
      +
    • +
    • +system_id +
        +
      • Set true to include the routers "System ID" at the beginning of every log message. This is often useful when a single remote syslog server is handling logs for several routers.
      • +
      +
    • +
    • +utf8_bom +
        +
      • The log message is sent using a UTF-8 encoding. By default the router will preprend the Unicode Byte Order Mark (BOM) to the syslog message in compliance with the Syslog protocol, RFC5424. Some syslog servers may not support, fully, RFC5424 and will treat the BOM as ASCII text which will appear as garbled characters in the log. If this occurs, set this option to false.
      • +
      +
    • +
    +
  • +
  • +services +
      +
    • Not recommended for application use.
    • +
    +
  • +
+

+

Ping

+

Ping can be used to test communication to another host on the network. All ping operations and results are found in the /control/ping tree.

+
    cat /control/ping
+    {
+        "result": "",
+        "start": {
+            "bind_ip": false,
+            "deadline": "Same as timeout",
+            "df": "do",
+            "family": "inet",
+            "fwmark": null,
+            "host": null,
+            "iface": null,
+            "interval": 1,
+            "num": 4,
+            "size": 56,
+            "srcaddr": null,
+            "timeout": 11
+        },
+        "status": "",
+        "stop": ""
+    }
+
+ +

Starting a Ping:

+

Write operations to control/ping/start will initiate a ping. The following will start a basic ping when written: {"host": "www.google.com", "size": 64}. An IP address can also be used.

+

NOTE: Concurrent ping operations are not supported.

+

Ping Options for control/ping/start:

+
    +
  • +iface: device UID, interface name, or Network name +
      +
    • Allows ping to be sourced from an interface
    • +
    +
  • +
  • +bind_ip: boolean +
      +
    • Causes ping to bind to an IP on the interface specified by "iface". +
    • +
    +
  • +
  • +srcaddr: IP Address +
      +
    • Causes ping to be sourced from the specified IP address.
    • +
    +
  • +
  • deadline: seconds
  • +
  • +timeout: seconds +
      +
    • If specified, ping will continue until either "num" packets are sent, or "timeout" seconds have elapsed. The two options are equivalent, and if both are specified, the lesser of the two is used
    • +
    +
  • +
  • +df: {do, want, or dont} +
      +
    • +Specify the Path MTU discovery option: +
        +
      • do: Asserts the "Don't Fragment" flag in the ICMP requests, prohibiting fragmentation
      • +
      • want: Allows local fragmentation, and will fragment the ICMP request if the ICMP request exceeds the outbound interfaces' MTU
      • +
      • dont: Do not assert the "Don't Fragment" flag, allowing fragmentation, and will fragment the ICMP Requests in response to ICMP fragmentation responses
      • +
      +
    • +
    +
  • +
  • +fwmark: null/non-null +
      +
    • If non-null, then the SO_MARK socket option is set, causing the packetssent through the socket to be marked.
    • +
    +
  • +
  • +family: {inet or inet6} +
      +
    • If inet, then ping for IPv4 is used; if inet6, then the equivalent of ping6 is used.
    • +
    +
  • +
  • +host: Hostname, or IP address +
      +
    • Specifies the destination for the ICMP requests
    • +
    +
  • +
  • +interval: seconds +
      +
    • The number of seconds to wait between each ICMP request
    • +
    +
  • +
  • +num: integer +
      +
    • The number of ICMP requests to send before exiting. If "deadline" or "timeout" is also specified, then ping will exit after "num" packets have been sent, or min(deadline, timeout") seconds have elapsed.
    • +
    +
  • +
  • +size: bytes +
      +
    • Size of the ICMP request
    • +
    +
  • +
+

Stopping a Ping:

+

Write operations to control/ping/stop will halt the ping in progress, if any. If a ping is not in progress, this is ignored.

+

Retrieving Results and Status:

+

Reading from control/ping/results will return the additional results since the last read, or the start of the ping, whichever is most recent. Reading the results will clear out the results immediately after they are read; the reader will need to concatenate the results if desired.

+

NOTE: If more than 10 results accumulate between reads, the oldest results will be truncated such that the maximum number of result lines will never exceed 10.

+

Reading from control/ping/status will return the current state of the ping in progress. Unlike the results, this will persist through multiple reads. The status can be one of 'running', 'done', 'stopped', or 'error'. If any packets were transmitted during the Ping, then when the ping stops, the result summary will be posted to control/ping/results (and cleared when read)

+

+

GPIO

+

Some of the Cradlepoint routers have GPIO connectors as well as GPIO pins built into the power connectors Below is information related to GPIO router config store tree items.

+

/config/system/gpio_actions

+

Includes configuration data for all user configurable pins - if the pin is enabled, it's direction, and what action it is currently assigned to. The available actions are:

+

if value of direction is in, available values for "current_action" are:

+
    +
  • +in_action_sensing Input Sensing: +
      +
    • In this mode the logic state (high or low) is automatically sensed by the router and is readable as the Current Value.
    • +
    +
  • +
  • +in_action_ignition Ignition Sensing: +
      +
    • (available on power connector only) In this mode the router will turn off after the input has been held low for the timeout period in seconds. The router will then reboot when the input is returned to high. If the input is held low for less than the timeout period before returning to high, no action is taken.
    • +
    +
  • +
  • +in_action_reset Router Reset: +
      +
    • (available on power connector only) In this mode an external device can reset the router by holding the input low for 10-seconds.
    • +
    +
  • +
+

if value of direction is out, available values for "current_action" are:

+
    +
  • +out_action_low Default/Open: +
      +
    • In this mode the output pin is not used and is at 0V (ground potential).
    • +
    +
  • +
  • +out_action_high or out_action_router_running Set Closed/Router Running: +
      +
    • In these modes the output pin is logic low while the router is booting and transitions to logic high when the router is fully running. If the router is reset, the output returns to low until the router has fully rebooted.
    • +
    +
  • +
  • +out_action_modem_connected Modem Connected: +
      +
    • In this mode the output pin is logic low until the modem has connected to the tower. If the connection drops, this output is set low until the connection is restored.
    • +
    +
  • +
+

The "pin" value is for internal purposes only. Please see /status/gpio_action for more information.

+

+

/status/gpio_actions

+

Used to view capabilities of the GPIOs. Here you can see what actions a pin supports, and what direction it can be set to (some pins are fixed direction and some are bidirectional). You can also get the "pretty_value" string, which outputs the current state of the GPIO in human readable form. It is updated every time this field is accessed.

+

/control/gpio

+

Used to bypass the GPIO service and set values to gpio pins manually. Not recommended

+

/status/gpio

+

Used to read the GPIO values directly from the pins.

+

/config/system/connector_gpio

+

Deprecated - DO NOT USE.

+

+

GPS

+

GNSS vs GPS

+

GNSS stands for Global Navigation Satellite Systems and GPS stand for Global Positioning System. GNSS is an umbrella term for all the satellite-based positioning systems, including GPS. GPS itself is the US satellite system and, however, GPS is used interchangeably for all satellite positioning systems. See https://en.wikipedia.org/wiki/Satellite_navigation for more details about satellite navigation.

+

The most common assumption is that all modems are capable of GPS. In order for a cellular modem to support GPS, GPS must be a function of both the modem and carrier. GPS requires the following four elements:

+
    +
  • A cellular modem that supports GPS.
  • +
  • A cellular carrier that allows the GPS functionality on that modem.
  • +
  • Sufficient GPS signal level at the modem deployment location.
  • +
  • GPS antenna (depending on the model of modem or Cradlepoint).
  • +
+

From an app access perspective, most use cases only needs to verify that GPS is enabled and get the GPS location data. This is described below.

+

config/system/gps/enabled

+

This is either true or false and indicates gps enablement.

+

config/system/gps/enable_gps_keepalive

+

When "GPS Keepalive" is enabled, the GPS service will poll the GPS hardware every 10 seconds. The GPS hardware goes into a low power state after a certain interval of inactivity. Setting this flag will prevent the GPS from going into that low power state. Coming out of a low power state takes extra time to regain the GPS lock so set this flag to keep the hardware from falling asleep. Note this flag has no effect if the GPS service itself is not enabled.

+

Get GPS location data

+

The current GPS data can be found in /status/gps/.

+

This contains two fields: fix and nmea.

+
    +
  • +fix: +
      +
    • a struct containing parsed information about the current GPS fix.
    • +
    +
  • +
  • +nmea +
      +
    • an array of National Marine Electronics Association (NMEA) strings.
    • +
    +
  • +
+

An example output is:

+
    cat /status/gps
+    {
+    'fix': {'age': 1.2596200000261888,
+             'altitude_meters': 850.8,
+             'ground_speed_knots': 0.0,
+             'heading': 323.4,
+             'latitude': {'degree': 43.0,
+                          'minute': 37.0,
+                          'second': 10.84808349609375},
+             'lock': True,
+             'longitude': {'degree': -116.0,
+                           'minute': 12.0,
+                           'second': 20.53081512451172},
+             'satellites': 9,
+             'time': 204921},
+    'nmea': ['$GPGSV,4,1,16,05,14,275,24,07,61,082,30,08,40,063,28,09,29,167,26*71\r\n',
+              '$GPGSV,4,2,16,11,18,116,27,13,17,316,27,17,02,189,23,27,12,036,24*77\r\n',
+              '$GPGSV,4,3,16,28,53,243,25,30,67,317,32,33,,,35,38,,,34*7B\r\n',
+              '$GPGSV,4,4,16,39,,,34,40,,,34,41,,,34,42,,,34*73\r\n',
+              '$GPGGA,204920.0,4337.180827,N,11612.342184,W,1,09,0.9,850.8,M,-11.0,M,,*61\r\n',
+              '$GPVTG,323.4,T,308.9,M,0.0,N,0.0,K,A*27\r\n',
+              '$GPRMC,204920.0,A,4337.180827,N,11612.342184,W,0.0,323.4,110417,14.6,E,A*27\r\n',
+              '$GPGSA,A,2,05,07,08,09,11,13,27,28,30,,,,1.2,0.9,0.8*3C\r\n']
+    }
+
+ +

+

Modem

+

The modem status and control information is part of the wan tree. This is a very critical and complicated aspect of the router functionality. Please note that there is no direct access to the modem AT commands. For now, this section will only describe how to enable and disable a modem, along with some status information, as this has been requested by several application developers. More information will be added as needed.

+

The list of modems in the system can be found here: get /status/wan/devices. While this will list all the wan devices, not all modems may be configured with a SIM card.

+
    get status/wan/devices
+    {
+        "ethernet-wan": {
+            ...
+        },
+        "mdm-feb80139": {
+            ...
+        },
+        "mdm-fee5c7f2": {
+            ...
+        }
+    }
+
+ +

To determine if a modem does not have SIM card inserted, see here: get status/wan/devices/mdm-/status/error_text. Where is the modem's unique identifier. The response will be 'null' if the card exist.

+
    get status/wan/devices/mdm-fee5c7f2/status/error_text
+    "SIM error: NOSIM"
+
+ +

Here is an example of the diagnostic information for a modem with a SIM. This contains much data about the modem including its signal quality. Note that the "DBM" field is the modems RSSI.

+
    get status/wan/devices/mdm-fee5c7f2/diagnostics/
+    {
+        "BANDDLFRQ": "2110-2155",
+        "BANDULFRQ": "1710-1755",
+        "CARRID": "Verizon Wireless",
+        "CARRIER_SWITCH_DEFAULTS": "VERIZON,ATT,SPRINT,GENERIC",
+        "CELL_ID": "2934137 (0x2cc579)",
+        "CFGAPNMASK": "8",
+        "CGSN": "356526070342666",
+        "CHIPSET": "9X30C",
+        "CUR_PLMN": "311480",
+        "DBM": "-60",
+        "DEFAPN": "3",
+        "DEFAPNTYPE": "IP",
+        "DISP_IMEI": "356526070342666",
+        "DISP_MEID": "35652607034266",
+        "EMMCOMMSTATE": "RRC Idle",
+        "EMMSTATE": "Registered",
+        "EMMSUBSTATE": "Normal Service",
+        "FW_CARRIER_LOAD": "VERIZON",
+        "GSN": "356526070342666",
+        "HM_PLMN": "311480",
+        "HOMECARRID": "Verizon",
+        "HW_VER": "1.0",
+        "ICCID": "89148000003136071391",
+        "IMSI": "311480313413488",
+        "LAST_PIN": "",
+        "LAST_PIN_VALID": "False",
+        "LTEBANDWIDTH": "10 MHz",
+        "MDL": "Internal LP6 (SIM1)",
+        "MDM_CONTROL_TYPE": "NORMAL",
+        "MDM_DRIVER_CAPABILITIES": "1547313",
+        "MDM_MODE_CAPABILITIES": "21",
+        "MDN": "+12086310191",
+        "MFG": "CradlePoint Inc.",
+        "MFG_MDL": "MC7455-CP",
+        "MODEMIMSSTATE": "Full Service",
+        "MODEMOPMODE": "Online",
+        "MODEMPSSTATE": "Attached",
+        "MODEMSYSMODE": "LTE",
+        "MODEMTEMP": "33",
+        "MSID": "2086310191",
+        "PIN_RETRIES": "3",
+        "PIN_STATUS": "READY",
+        "PRD": "Internal LP6 (SIM1)",
+        "PRI_ID": "9905117",
+        "PRI_VER": "000.005",
+        "PRLV": "15504",
+        "PUK_RETRIES": "10",
+        "RFBAND": "Band 4",
+        "ROAM": "1",
+        "RSRP": "-84",
+        "RSRQ": "-7",
+        "RXCHANNEL": "2000",
+        "SCELLACTIVE": "Not Registered",
+        "SELAPN": "3",
+        "SIM_LOCK": "FALSE",
+        "SINR": "9.2",
+        "SS": "100",
+        "SUPPORTED_TECH": "lte/3g",
+        "TXCHANNEL": "20000",
+        "VER": "SWI9X30C_02.05.07.00 r5154 CARMD-EV-FRMWR2 2015/12/04 22:23:15",
+        "VER_PKG": "02.05.07.00_VERIZON,002.008_002",
+        "VER_PREF_PKG": "02.05.07.00_VERIZON,002.008_002",
+        "VER_PRETTY": "2.5.7.0"
+    }
+
+ +

The modem can be enabled and disabled by changing the testmode/ready flag in the control tree (true to enable and false to diasable). Setting the reset flag to true will reset the modem.

+
    get control/wan/devices/mdm-fee5c7f2/testmode
+    {
+        "ready": true,
+        "reset": false
+    }
+
+ +
+

Published Date: 5-30-2017

+

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

+ + + + diff --git a/Router_Application_Development_Guide.html b/Router_Application_Development_Guide.html new file mode 100644 index 00000000..1d06355b --- /dev/null +++ b/Router_Application_Development_Guide.html @@ -0,0 +1,929 @@ + + + +Router_Application_Development_Guide + + + + +

Cradlepoint Router Application Development

+
+

Quick Links

+

Overview

+

Developer Community

+

Cradlepoint Knowledge Base

+

Router Python Environment

+

Computer Setup Instructions

+

Router Development Mode

+

Application Directory Structure

+

Application Package Anatomy

+

SDK Instructions Overview

+

Router Syslog for Debugging

+

ECM Application Deployment

+

Sample Application Walk Through

+

+

Overview

+

Cradlepoint’s Router Application Framework provides the ability to add intelligence in the router. Applications written in Python can be securely downloaded to the router via Enterprise Cloud Manager (ECM). This allows for extended router features, FOG Computing, and IoT management.

+

At a high level, the Cradlepoint Router Apps/SDK is a mechanism to package a collection of files – including executable files – in an archive, which can be transferred securely via ECM, hidden within a Cradlepoint router, and executed as an extension to normal firmware.

+

What is Supported?

+

For the scope of this document, Router Apps are limited to the non-privileged Python scripts. Supported functionality:

+
    +
  • Standard TCP/UDP/SSL socket servers function on ports higher than 1024.
  • +
  • Standard TCP/UDP/SSL socket client to other devices (or the router as 127.0.0.1/localhost).
  • +
  • Access to serial ports via PySerial module, including native and USB-serial ports.
  • +
  • Ability to PING external devices.
  • +
  • UI Extensibility (i.e. Hot Spot splash page or other UI WEB pages)
  • +
  • Access to the Router API (aka: status and control tree data).
  • +
  • USB Memory device file access (USB Memory device support varies based on router).
  • +
+

What is not Supported?

+
    +
  • Any form of natively compiled or kernel linked code.
  • +
  • Any function requiring privileged (or root) permissions.
  • +
  • Access to shared resources (for example: no ability to issue custom AT commands to cell modems).
  • +
  • Modifications of routing or security behavior.
  • +
+

Supported Routers

+

The supported set of routers is:

+
    +
  • AER – 1600/1650, 2100, 3100/3150
  • +
  • COR – IBR1100/1150, IBR900/IBR950, IBR600B/IBR650B, IBR350
  • +
  • ARC - CBA850
  • +
+

New routers products will support Python applications unless they are a special low-function, low-cost model.

+

Application Development

+

During development, an application can be directly installed into a 'DEV Mode' router. This makes it easier to debug and work through the development process. Once the application has been fully debugged and is ready for deployment, it can be installed via ECM at the group level.

+

SDK Toolset

+

Cradlepoint has a simplified SDK, written in python, which builds and creates an app package. The SDK, along with sample applications is located here.

+

For app development, the SDK is be used to install, start, stop, uninstall, and check status of the application in a locally connected development router. The application package is the same for local debugging or for uploading to the ECM for production deployment. Application development can be done on Linux, OS X, and Windows operating systems with the same SDK.

+

+

Developer Community

+

Cradlepoint has a Developer Community Portal to leverage knowledge, share, and collaborate with other developers. This forum is also actively monitored by Cradlepoint to answer questions.

+

+

Cradlepoint Knowledge Base

+

The existing Cradlepoint Knowledge Base also has many articles related to router applications and the SDK.

+

+

Router Python Environment

+

Application are written in python. However, the router only contains a subset of a typical python installation on a computer. The list of python modules in the router are listed here: Router FW 6.1.0 Modules. New python files can be added to you application but they must also adhere to this list.

+

+

Computer Setup Instructions

+

The SDK and sample apps can be downloaded from https://github.com/cradlepoint/sdk-samples. Below are the setup instruction for:

+ +

+

Linux

+
    +
  1. +

    Install python 3.5.1 from python.org.

    +
  2. +
  3. +

    Add Linux development libraries.

    +
    sudo apt-get install libffi-dev
    +sudo apt-get install libssl-dev
    +sudo apt-get install sshpass
    +
    + +
  4. +
  5. +

    Install python libraries.

    +
    sudo apt-get install python3-pip
    +pip3 install requests
    +pip3 install pyopenssl
    +pip3 install requests
    +pip3 install cryptography
    +
    + +
  6. +
  7. +

    Useful tools

    +

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=linux.

    +
  8. +
+

+

Mac OS X

+
    +
  1. +

    Install python 3.5.1 from python.org.

    +
  2. +
  3. +

    Install HomeBrew for package updates.

    +
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +
    + +
  4. +
  5. +

    Install openssl.

    +
    brew install openssl
    +
    + +
  6. +
  7. +

    Install python libraries.

    +
    pip3 install requests
    +pip3 install pyopenssl
    +pip3 install requests
    +pip3 install cryptography
    +
    + +
  8. +
  9. +

    Useful tools

    +

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=macOS.

    +
  10. +
+

+

Windows

+
    +
  1. Install python 3.5.1 from https://www.python.org/downloads/release/python-351/.
  2. +
  3. +The SDK requires some OpenSSL tools to generate digital signatures. + +
  4. +
  5. +

    Open a terminal window and use the following commands to install python libraries.

    +
    python -m pip install -U pip
    +python -m pip install -U pyserial
    +python -m pip install -U requests
    +python -m pip install -U pyopenssl
    +
    + +
  6. +
  7. +Useful tools +
      +
    1. Putty: http://www.putty.org/
    2. +
    3. PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=windows.
    4. +
    5. 7-zip: http://www.7-zip.org/
    6. +
    7. MarkdownPad: http://markdownpad.com/
    8. +
    +
  8. +
+

+

SDK/Apps Directory Structure

+

Below is the directory structure for for the SDK and sample applications. The BOLD items are modified or created by the developer. The other files are used by the SDK or are referenced by the other files.

+
    +
  • +Router_Apps (directory) +
      +
    • +app_name (directory) +
        +
      • package.ini - App initialization items.
      • +
      • app_name.py - The app python code. There can be multiple py files based on the app design.
      • +
      • cs.py - This is included with every sample app and should be in your app. It contains a CSClient class which is a wrapper for the TCP interface to the router config store (i.e. the router trees).
      • +
      • install.sh - Runs on app installation. (update with app name)
      • +
      • start.sh - Script that starts an app (i.e. cppython app_name.py start).
      • +
      • stop.sh - Script that stops an app (i.e. cppython app_name.py stop).
      • +
      +
    • +
    • +config (directory) +
        +
      • settings.mk - Build system config settings (i.e. Router MAC, IP, Username, Password, etc.).
      • +
      +
    • +
    • +common +
        +
      • cs.py - This is included with every sample app and can be copied into your app directory. It contains a CSClient class which is a wrapper for the TCP.
      • +
      +
    • +
    • +tools (directory) +
        +
      • +bin (directory) +
          +
        • package_application.py - Used by SDK.
        • +
        • validate_application.py - Used by SDK.
        • +
        • pscp.exe - An executable use on Windows by the SDK.
        • +
        +
      • +
      +
    • +
    • sdk_setting.ini - Used by the SDK and contains the settings for building the app and connecting to the local router.
    • +
    • Router_Application_Development_Guide.md
    • +
    • Router_APIs_for_Applications.md
    • +
    • Makefile_README.md
    • +
    +
  • +
+

Based on the sdk_setting.ini file, the SDK will build all files located in the app_name directory into a tar.gz package that can then been installed into the router. This installation is either directly into the router (if in DEV mode) or via ECM for grouped routers.

+

+

Application Package Anatomy

+

A router application package, which is a tar.gz archive, consists of a set of files that includes the python executable, start/stop scripts, initialization files, along with manifest and signature files. This package of files is built by the SDK base on the sdk_settings.ini. Some of these files, like the manifest and signature files, are created by the Make tool. Others are created by the application developer. Below are the example contents for a tar.gz archive created for a router application.

+
    +
  • +app_name (directory) +
      +
    • +METADATA (directory) +
        +
      • MANIFEST.json - Contains a file list along with hash signatures and other app the package initialization data.
      • +
      • SIGNATURE.DS - A signature file for the app package.
      • +
      +
    • +
    • app_name.py - The application python executable file.
    • +
    • cs.py - Another python file used by the app. There could be multiple python files depending on the application design.
    • +
    • package.ini - The package initialization data.
    • +
    • install.sh - The script run during installation.
    • +
    • start.sh - The script run when the app is started.
    • +
    • stop.sh - The script run when the app is stopped
    • +
    +
  • +
+

package.ini

+

This initialization file contains information and about the application and items that affect installation and execution. This information will stored in /status/system/sdk within the router config store for installed apps.

+

For example:

+
[hello_world]
+uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c
+vendor=Cradlepoint
+notes=Hello World Demo Application
+firmware_major=6
+firmware_minor=1
+restart=false
+reboot=true
+version_major=1
+version_minor=6
+auto_start=true
+
+ +
    +
  • +

    [hello_world]

    +

    This must contain the name of the application. In this example, hello_world is the application name.

    +
  • +
  • +

    uuid +

    +

    Every app must contain a universally unique identifier (UUID).

    +
  • +
  • +

    vendor

    +

    This is the vendor name for the app.

    +
  • +
  • +

    notes

    +

    Add notes to describe the app or anything else.

    +
  • +
  • +

    **firmware_major and firmware_minor **

    +

    This is the required router firmware version for the app. Not implemented at this time.

    +
  • +
  • +

    restart +If set to 'true', then the application will be restarted if it dies or is not running. If false, the router will not attempt to restart the application.

    +
  • +
  • +

    reboot +If set to 'true', the router will restart the application following a router reboot. Otherwise, it will not be restarted.

    +
  • +
  • +

    version_major and version_minor

    +

    This contains the app version. This must be incremented for any new production app used installed via ECM. It will not re-install the same version that already exist in the router.

    +
  • +
  • +

    auto_start

    +

    If set to 'true', the app will automatically start after installation.

    +
  • +
+

install.sh

+

This script is executed when the application is installed in the router. Typically it will just add logs for the installation.

+

For example:

+
#!/bin/bash
+echo "INSTALLATION hello_world on:" >> install.log
+date >> install.log
+
+ +

start.sh

+

This script is executed when the application is started in the router. It contains the command to start the python script and pass any arguments.

+

For example:

+
#!/bin/bash
+cppython hello_world.py start
+
+ +

stop.sh

+

This script is executed when the application is stopped in the router. It contains the command to stop the python script.

+

For example:

+
#!/bin/bash
+cppython hello_world.py stop
+
+ +

+

SDK Instructions Overview

+

The SDK includes a python make.py file which is compatible for all supported platforms. There is also a GNU Makefile which can only be used with Linux or OS X. Both perform the same actions which are noted below. However, there are minor setup differences between the two. Developers can choose the one they prefer. For usage instructions, see:

+ +

SDK actions are:

+

default (i.e. no action given): + Build and test the router reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to ECM.

+

clean: + Clean all project artifacts. Entails execution of all "-clean" make targets.

+

package: + Create the app archive tar.gz file.

+

status: + Fetch and print current app status from the locally connected router.

+

install: + Secure copy the app archive to a locally connected router. The router must already be in SDK DEV mode via registration and licensing in ECM.

+

start: + Start the app on the locally connected router.

+

stop: + Stop the app on the locally connected router.

+

uninstall: + Uninstall the app from the locally connected router.

+

purge: + Purge all apps from the locally connected router.

+

+

Python SDK Usage

+

All SDK functions are contained in the make.py python file. While this executable is the same regardless of the workstation platform, the python command is not. Use the following python command based on your platform:

+
    +
  • +

    Linux or OS X:

    +
    python3
    +
    + +
  • +
  • +

    Windows:

    +
    python
    +
    + +
  • +
+

The command structure is:

+
python(3) make.py <action>
+
+ +

The make.py usage is as follows:

+
    +
  1. +

    Update the sdk_setting.ini file based on your needs.

    +

    Example:

    +
    [sdk]
    +app_name=ping
    +dev_client_ip=192.168.0.1
    +dev_client_username=admin
    +dev_client_password=44224267
    +
    + +
  2. +
  3. +

    Update the UUID in the package.ini file located in the app directory.

    +

    Example:

    +
    [ping]
    +uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f
    +
    + +
  4. +
  5. +

    Build the application package.

    +
    python(3) make.py
    +
    + +
  6. +
  7. +

    Test connectivity with your router via the status target.

    +
    python(3) make.py status
    +{
    +    "data": {},
    +    "success": true
    +}
    +
    + +
  8. +
  9. +

    Install the application on your router.

    +
    python(3) make.py install
    +admin@192.168.0.1's password: 
    +hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    +Received disconnect from 192.168.0.1: 11: Bye Bye
    +lost connection
    +
    + +
  10. +
  11. +

    Get the application execution status from your router.

    +
    python(3) make.py status
    +{
    +    "data": {
    +        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    +            "app": {
    +                "date": "2015-12-04T09:30:39.656151",
    +                "name": "hspt",
    +                "restart": true,
    +                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +                "vendor": "Cradlebox",
    +                "version_major": 1,
    +                "version_minor": 1
    +            },
    +            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +            "directory": hspt",
    +            "filename": "dist/tmp_znv2t",
    +            "state": "started",
    +            "summary": "Package started successfully",
    +            "type": "development",
    +            "url": "file:///var/tmp/tmpg1385l",
    +            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    +        }
    +    },
    +    "success": true
    +}
    +
    + +
  12. +
  13. +

    Uninstall the application from your router.

    +
    python(3) make.py uninstall
    +{
    +    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +    "success": true
    +}
    +
    + +
  14. +
+

+

GNU Make SDK Usage

+

A GNU Makefile, for Linux or OS X, is also included with the SDK which can perform the same functions as the make.py file. The make targets are identical to the make.py actions. However, environment variable will need to be set in lieu of the sdk_setting.ini file.

+

The GNU make usage is as follows:

+
    +
  1. +

    Export the following variables in your environment.

    +
    APP_NAME - The name of your application.
    +APP_UUID - Each application must have its own UUID.
    +DEV_CLIENT_MAC - The mac address of your router.
    +DEV_CLIENT_IP  - The lan ip address of your router.
    +
    + +

    Example:

    +
    $ export APP_NAME=hello_world
    +$ export APP_UUID=616acd0c-0475-479e-a33b-f7054843c973
    +$ export DEV_CLIENT_MAC=44224267
    +$ export DEV_CLIENT_IP=192.168.20.1
    +
    + +
  2. +
  3. +

    Build the application package.

    +
    $ make
    +
    + +
  4. +
  5. +

    Test connectivity with your router via the status target.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {},
    +    "success": true
    +}
    +
    + +
  6. +
  7. +

    Build, test, and install the application on your router.

    +
    $ make install
    +scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload
    +admin@192.168.0.1's password: 
    +hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    +Received disconnect from 192.168.0.1: 11: Bye Bye
    +lost connection
    +
    + +
  8. +
  9. +

    Get application execution status from your router.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {
    +        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    +            "app": {
    +                "date": "2015-12-04T09:30:39.656151",
    +                "name": "hspt",
    +                "restart": true,
    +                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +                "vendor": "Cradlebox",
    +                "version_major": 1,
    +                "version_minor": 1
    +            },
    +            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +            "directory": hspt",
    +            "filename": "dist/tmp_znv2t",
    +            "state": "started",
    +            "summary": "Package started successfully",
    +            "type": "development",
    +            "url": "file:///var/tmp/tmpg1385l",
    +            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    +        }
    +    },
    +    "success": true
    +}
    +
    + +
  10. +
  11. +

    Uninstall the application from your router.

    +
    $ make uninstall
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X PUT http://192.168.0.1/api/control/system/sdk/action \
    +                -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +    "success": true
    +}
    +
    + +
  12. +
+

+

Router Syslog for Debugging

+

Application debugging is accomplished with the use of debug syslogs. However, the default logging level in the router is set to info so this will need to be changed to debug. It is also possible to send the router logs to a syslog server running on another device. For more information, see the Knowledge Base article 'Understanding Router Log Files'.

+

You can also view logs via CLI commands when logged into the router console. This console is available by logging into the router with Secure Shell (i.e. ssh) or by slecting the 'Device Console' from 'System > System Control > Device Options' in the router UI. The logs can be viewed or cleared with the following CLI commands:

+
log (displays logs in the terminal window)
+log -s <text> (search for logs that contain <text> and displays them)
+log -s -i <text> (search for logs that contain <text> but case insensitive)
+log clear (clears the log buffer)
+help log (display the log command options)
+
+ +

+

Router Development Mode

+

In order to install an application directly to the router without using ECM, the router must be placed in DEV mode. One would typically debug and test an application using DEV mode prior to using ECM for installation. DEV mode allows for quicker and easier testing and debugging. Instructions for setting up a router for DEV mode is in Knowledge Base article 'SDK Enable Developer Mode'.

+

+

ECM Application Deployment

+

ECM is used to securely deploy applications to routers at the group level. If an application tar.gz package is uploaded to ECM and then assigned to a router group, ECM will then securely download and install the application to the routers within the group. For security, the application files are not user accessible within ECM or routers. That is, one is not able to download the application from the router or ECM.

+

+

Sample Application Walk Through

+

Cradlepoint has provided several sample applications with the SDK which is located here. Any of these apps can be used as a starting point for your application. The application data structure is described here.

+

When using the SDK make.py file, be sure to invoke the proper python command based on your computer OS.

+
    +
  • +

    Linux or OS X:

    +
    python3
    +
    + +
  • +
  • +

    Windows:

    +
    python
    +
    + +
  • +
+

How to Run the Hello World Sample App

+
    +
  1. Download the SDK and sample apps from here.
  2. +
  3. Ensure your computer has been setup. See Computer Setup Instructions.
  4. +
  5. Connect the router to your computer. This can be done by connecting the LAN port of the router to the USB port of your computer via a USB to Ethernet adapter.
  6. +
  7. Ensure the router is in DEV Mode. See here.
  8. +
  9. Enable Debug logs in the router which is very helpful. See here
  10. +
  11. Open a terminal window.
  12. +
  13. Change directory to 'sample_apps'.
  14. +
  15. +

    Update the sdk_setting.ini file based on your needs and for the sample app you wish to run. The hello_world is a good app to test.

    +

    Example:

    +
    [sdk]
    +app_name=hello_world
    +dev_client_ip=192.168.0.1
    +dev_client_username=admin
    +dev_client_password=44224267
    +
    + +
  16. +
  17. +

    Verify router connectivity via:

    +
    $ python(3) make.py status
    +
    + +
  18. +
  19. +

    Create the application package

    +
    $ python(3) make.py 
    +
    + +
  20. +
  21. +

    Install the application package

    +
    $ python(3) make.py install
    +
    + +
  22. +
  23. +

    Check the application status to ensure it has started.

    +
    $ python(3) make.py status
    +
    + +
  24. +
  25. +

    Also check the logs in the router to ensure the application is creating 'Hello World' logs. In the router console use the 'log' command.

    +
  26. +
+
+

Published Date: 6-1-2017

+

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

+ + + + diff --git a/Router_Application_Development_Guide.md b/Router_Application_Development_Guide.md new file mode 100644 index 00000000..1e247cf0 --- /dev/null +++ b/Router_Application_Development_Guide.md @@ -0,0 +1,570 @@ +# **Cradlepoint Router Application Development** # + +---------- + +## Quick Links ## + +#### [Overview](#overview) #### +#### [Developer Community](#community) #### +#### [Cradlepoint Knowledge Base](#knowledge) #### +#### [Router Python Environment](#environment) #### +#### [Computer Setup Instructions](#setup) #### +#### [Router Development Mode](#devmode) #### +#### [Application Directory Structure](#structure) #### +#### [Application Package Anatomy](#anatomy) #### +#### [SDK Instructions Overview](#sdk) #### +#### [Router Syslog for Debugging](#syslog) #### +#### [ECM Application Deployment](#ecm) #### +#### [Sample Application Walk Through](#sample) #### + + + +## Overview ## +Cradlepoint’s Router Application Framework provides the ability to add intelligence in the router. Applications written in Python can be securely downloaded to the router via [Enterprise Cloud Manager](https://cradlepoint.com/ecm) (ECM). This allows for extended router features, FOG Computing, and IoT management. + +At a high level, the Cradlepoint Router Apps/SDK is a mechanism to package a collection of files – including executable files – in an archive, which can be transferred securely via ECM, hidden within a Cradlepoint router, and executed as an extension to normal firmware. + +### What is Supported? ### +For the scope of this document, Router Apps are limited to the non-privileged Python scripts. Supported functionality: + +- Standard TCP/UDP/SSL socket servers function on ports higher than 1024. +- Standard TCP/UDP/SSL socket client to other devices (or the router as 127.0.0.1/localhost). +- Access to serial ports via PySerial module, including native and USB-serial ports. +- Ability to PING external devices. +- UI Extensibility (i.e. Hot Spot splash page or other UI WEB pages) +- Access to the Router API (aka: status and control tree data). +- USB Memory device file access (USB Memory device support varies based on router). + +### What is not Supported? ### +- Any form of natively compiled or kernel linked code. +- Any function requiring privileged (or root) permissions. +- Access to shared resources (for example: no ability to issue custom AT commands to cell modems). +- Modifications of routing or security behavior. + +### Supported Routers ### +The supported set of routers is: + +- AER – 1600/1650, 2100, 3100/3150 +- COR – IBR1100/1150, IBR900/IBR950, IBR600B/IBR650B, IBR350 +- ARC - CBA850 + +New routers products will support Python applications unless they are a special low-function, low-cost model. + +### Application Development ### +During development, an application can be directly installed into a 'DEV Mode' router. This makes it easier to debug and work through the development process. Once the application has been fully debugged and is ready for deployment, it can be installed via ECM at the group level. + +### SDK Toolset ### +Cradlepoint has a simplified SDK, written in python, which builds and creates an app package. The SDK, along with sample applications is located [here](https://github.com/cradlepoint/sdk-samples/releases). + +For app development, the SDK is be used to install, start, stop, uninstall, and check status of the application in a locally connected development router. The application package is the same for local debugging or for uploading to the ECM for production deployment. Application development can be done on Linux, OS X, and Windows operating systems with the same SDK. + + + +## Developer Community ## +Cradlepoint has a [Developer Community Portal](https://dev.cradlepoint.com) to leverage knowledge, share, and collaborate with other developers. This forum is also actively monitored by Cradlepoint to answer questions. + + + +## Cradlepoint Knowledge Base ## +The existing [Cradlepoint Knowledge Base](http://knowledgebase.cradlepoint.com) also has many articles related to router applications and the SDK. + + + +## Router Python Environment ## +Application are written in python. However, the router only contains a subset of a typical python installation on a computer. The list of python modules in the router are listed here: [Router FW 6.1.0 Modules.](https://dev.cradlepoint.com/s/article/ka1380000000EXWAA2/sdk-fw-6-1-0-modules) New python files can be added to you application but they must also adhere to this list. + + +## Computer Setup Instructions ## +The SDK and sample apps can be downloaded from [https://github.com/cradlepoint/sdk-samples](https://github.com/cradlepoint/sdk-samples). Below are the setup instruction for: + +- [Linux](#Linux) +- [OS X](#Mac) +- [Windows](#Windows) + + +### Linux ### +1. Install python 3.5.1 from [python.org](http://www.python.org). + +2. Add Linux development libraries. + + sudo apt-get install libffi-dev + sudo apt-get install libssl-dev + sudo apt-get install sshpass + +3. Install python libraries. + + sudo apt-get install python3-pip + pip3 install requests + pip3 install pyopenssl + pip3 install requests + pip3 install cryptography + +1. Useful tools + + PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=linux](https://www.jetbrains.com/pycharm/download/#section=linux). + + + +### Mac OS X ### +1. Install python 3.5.1 from [python.org](http://www.python.org). + +3. Install HomeBrew for package updates. + + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + +6. Install openssl. + + brew install openssl + +1. Install python libraries. + + pip3 install requests + pip3 install pyopenssl + pip3 install requests + pip3 install cryptography + +1. Useful tools + + PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=macOS](https://www.jetbrains.com/pycharm/download/#section=macOS). + + + +### Windows ### +1. Install python 3.5.1 from [https://www.python.org/downloads/release/python-351/](https://www.python.org/downloads/release/python-351/). +3. The SDK requires some OpenSSL tools to generate digital signatures. + - For 64bit OS: [https://slproweb.com/download/Win64OpenSSL\\_Light-1\\_1_0f.exe](https://slproweb.com/download/Win64OpenSSL_Light-1_1_0f.exe) + - For 32bit OS: [https://slproweb.com/download/Win32OpenSSL\\_Light-1\\_1_0f.exe](https://slproweb.com/download/Win32OpenSSL_Light-1_1_0f.exe) +4. Open a terminal window and use the following commands to install python libraries. + + python -m pip install -U pip + python -m pip install -U pyserial + python -m pip install -U requests + python -m pip install -U pyopenssl +1. Useful tools + 1. Putty: [http://www.putty.org/](http://www.putty.org/) + 2. PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=windows](https://www.jetbrains.com/pycharm/download/#section=windows). + 3. 7-zip: [http://www.7-zip.org/](http://www.7-zip.org/) + 4. MarkdownPad: [http://markdownpad.com/](http://markdownpad.com/) + + + +## SDK/Apps Directory Structure ## +Below is the directory structure for for the SDK and sample applications. The **BOLD** items are modified or created by the developer. The other files are used by the SDK or are referenced by the other files. + +- Router_Apps (directory) + - app_name (directory) + - **package.ini** - App initialization items. + - **app_name.py** - The app python code. There can be multiple py files based on the app design. + - cs.py - This is included with every sample app and should be in your app. It contains a CSClient class which is a wrapper for the TCP interface to the router config store (i.e. the router trees). + - **install.sh** - Runs on app installation. (update with app name) + - **start.sh** - Script that starts an app (i.e. cppython app_name.py start). + - **stop.sh** - Script that stops an app (i.e. cppython app_name.py stop). + - config (directory) + - **settings.mk** - Build system config settings (i.e. Router MAC, IP, Username, Password, etc.). + - common + - cs.py - This is included with every sample app and can be copied into your app directory. It contains a CSClient class which is a wrapper for the TCP. + - tools (directory) + - bin (directory) + - package_application.py - Used by SDK. + - validate_application.py - Used by SDK. + - pscp.exe - An executable use on Windows by the SDK. + - **sdk_setting.ini** - Used by the SDK and contains the settings for building the app and connecting to the local router. + - Router\_Application\_Development\_Guide.md + - Router\_APIs\_for\_Applications.md + - Makefile\_README.md + +Based on the sdk\_setting.ini file, the SDK will build all files located in the *app\_name* directory into a *tar.gz* package that can then been installed into the router. This installation is either directly into the router (if in DEV mode) or via ECM for grouped routers. + + +## Application Package Anatomy ## +A router application package, which is a *tar.gz* archive, consists of a set of files that includes the python executable, start/stop scripts, initialization files, along with manifest and signature files. This package of files is built by the SDK base on the sdk_settings.ini. Some of these files, like the manifest and signature files, are created by the Make tool. Others are created by the application developer. Below are the example contents for a tar.gz archive created for a router application. + +- app_name (directory) + - METADATA (directory) + - MANIFEST.json - Contains a file list along with hash signatures and other app the package initialization data. + - SIGNATURE.DS - A signature file for the app package. + - app_name.py - The application python executable file. + - cs.py - Another python file used by the app. There could be multiple python files depending on the application design. + - package.ini - The package initialization data. + - install.sh - The script run during installation. + - start.sh - The script run when the app is started. + - stop.sh - The script run when the app is stopped + +### package.ini ### +This initialization file contains information and about the application and items that affect installation and execution. This information will stored in /status/system/sdk within the router config store for installed apps. + +For example: + + [hello_world] + uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c + vendor=Cradlepoint + notes=Hello World Demo Application + firmware_major=6 + firmware_minor=1 + restart=false + reboot=true + version_major=1 + version_minor=6 + auto_start=true + +- **[hello_world]** + + This must contain the name of the application. In this example, hello_world is the application name. + +- **uuid** + + Every app must contain a universally unique identifier (UUID). + +- **vendor** + + This is the vendor name for the app. + +- **notes** + + Add notes to describe the app or anything else. + +- **firmware\_major and firmware\_minor ** + + This is the required router firmware version for the app. ***Not implemented at this time.*** + +- **restart** + If set to 'true', then the application will be restarted if it dies or is not running. If false, the router will not attempt to restart the application. + +- **reboot** + If set to 'true', the router will restart the application following a router reboot. Otherwise, it will not be restarted. + +- **version\_major and version\_minor** + + This contains the app version. This must be incremented for any new production app used installed via ECM. It will not re-install the same version that already exist in the router. + +- **auto_start** + + If set to 'true', the app will automatically start after installation. + + +### install.sh ### +This script is executed when the application is installed in the router. Typically it will just add logs for the installation. + +For example: + + #!/bin/bash + echo "INSTALLATION hello_world on:" >> install.log + date >> install.log + +### start.sh ### +This script is executed when the application is started in the router. It contains the command to start the python script and pass any arguments. + +For example: + + #!/bin/bash + cppython hello_world.py start + +### stop.sh ### +This script is executed when the application is stopped in the router. It contains the command to stop the python script. + +For example: + + #!/bin/bash + cppython hello_world.py stop + + + +## SDK Instructions Overview ## +The SDK includes a python make.py file which is compatible for all supported platforms. There is also a GNU Makefile which can only be used with Linux or OS X. Both perform the same actions which are noted below. However, there are minor setup differences between the two. Developers can choose the one they prefer. For usage instructions, see: + +- [Python SDK Usage](#python_usage) +- [GNU Make SDK Usage](gnu_make_usage) + +### SDK actions are: ### +**default (i.e. no action given):** + Build and test the router reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to ECM. + + **clean:** + Clean all project artifacts. Entails execution of all "-clean" make targets. + + **package:** + Create the app archive tar.gz file. + + **status:** + Fetch and print current app status from the locally connected router. + + **install:** + Secure copy the app archive to a locally connected router. The router must already be in SDK DEV mode via registration and licensing in ECM. + + **start:** + Start the app on the locally connected router. + + **stop:** + Stop the app on the locally connected router. + + **uninstall:** + Uninstall the app from the locally connected router. + + **purge:** + Purge all apps from the locally connected router. + + + +### Python SDK Usage ### +All SDK functions are contained in the make.py python file. While this executable is the same regardless of the workstation platform, the python command is not. Use the following python command based on your platform: + +- Linux or OS X: + + python3 + +- Windows: + + python + +The command structure is: + + python(3) make.py + +The make.py usage is as follows: + +1. Update the sdk_setting.ini file based on your needs. + + Example: + + [sdk] + app_name=ping + dev_client_ip=192.168.0.1 + dev_client_username=admin + dev_client_password=44224267 + +1. Update the UUID in the package.ini file located in the app directory. + + Example: + + [ping] + uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f + +6. Build the application package. + + python(3) make.py + +5. Test connectivity with your router via the status target. + + python(3) make.py status + { + "data": {}, + "success": true + } + +6. Install the application on your router. + + python(3) make.py install + admin@192.168.0.1's password: + hspt.tar.gz 100% 1439 1.4KB/s 00:00 + Received disconnect from 192.168.0.1: 11: Bye Bye + lost connection + +7. Get the application execution status from your router. + + python(3) make.py status + { + "data": { + "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": { + "app": { + "date": "2015-12-04T09:30:39.656151", + "name": "hspt", + "restart": true, + "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "vendor": "Cradlebox", + "version_major": 1, + "version_minor": 1 + }, + "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "directory": hspt", + "filename": "dist/tmp_znv2t", + "state": "started", + "summary": "Package started successfully", + "type": "development", + "url": "file:///var/tmp/tmpg1385l", + "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" + } + }, + "success": true + } + +8. Uninstall the application from your router. + + python(3) make.py uninstall + { + "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "success": true + } + + + +### GNU Make SDK Usage ### +A GNU Makefile, for Linux or OS X, is also included with the SDK which can perform the same functions as the make.py file. The make targets are identical to the make.py actions. However, environment variable will need to be set in lieu of the sdk_setting.ini file. + +The GNU make usage is as follows: + +1. Export the following variables in your environment. + + APP_NAME - The name of your application. + APP_UUID - Each application must have its own UUID. + DEV_CLIENT_MAC - The mac address of your router. + DEV_CLIENT_IP - The lan ip address of your router. + + Example: + + $ export APP_NAME=hello_world + $ export APP_UUID=616acd0c-0475-479e-a33b-f7054843c973 + $ export DEV_CLIENT_MAC=44224267 + $ export DEV_CLIENT_IP=192.168.20.1 + +6. Build the application package. + + $ make + +5. Test connectivity with your router via the status target. + + $ make status + curl -s --digest --insecure -u admin:441dbbec \ + -H "Accept: application/json" \ + -X GET http://192.168.0.1/api/status/system/sdk | \ + /usr/bin/env python3 -m json.tool + { + "data": {}, + "success": true + } + +6. Build, test, and install the application on your router. + + $ make install + scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload + admin@192.168.0.1's password: + hspt.tar.gz 100% 1439 1.4KB/s 00:00 + Received disconnect from 192.168.0.1: 11: Bye Bye + lost connection + +7. Get application execution status from your router. + + $ make status + curl -s --digest --insecure -u admin:441dbbec \ + -H "Accept: application/json" \ + -X GET http://192.168.0.1/api/status/system/sdk | \ + /usr/bin/env python3 -m json.tool + { + "data": { + "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": { + "app": { + "date": "2015-12-04T09:30:39.656151", + "name": "hspt", + "restart": true, + "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "vendor": "Cradlebox", + "version_major": 1, + "version_minor": 1 + }, + "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "directory": hspt", + "filename": "dist/tmp_znv2t", + "state": "started", + "summary": "Package started successfully", + "type": "development", + "url": "file:///var/tmp/tmpg1385l", + "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" + } + }, + "success": true + } + +8. Uninstall the application from your router. + + $ make uninstall + curl -s --digest --insecure -u admin:441dbbec \ + -H "Accept: application/json" \ + -X PUT http://192.168.0.1/api/control/system/sdk/action \ + -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \ + /usr/bin/env python3 -m json.tool + { + "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", + "success": true + } + + + +## Router Syslog for Debugging ## +Application debugging is accomplished with the use of debug syslogs. However, the default logging level in the router is set to **info** so this will need to be changed to **debug**. It is also possible to send the router logs to a syslog server running on another device. For more information, see the Knowledge Base article ['Understanding Router Log Files'](http://knowledgebase.cradlepoint.com/articles/Support/fw6-Understanding-Router-Log-Files-and-Features?retURL=%2Fapex%2FknowledgeSearch%3Fc%3DAll_Products%26p%3D2%26k%3Dsyslog%26t%3D%26l%3D%26lang%3Den_US&popup=false&c=All_Products&lang=en_US). + +You can also view logs via CLI commands when logged into the router console. This console is available by logging into the router with Secure Shell (i.e. ssh) or by slecting the 'Device Console' from 'System > System Control > Device Options' in the router UI. The logs can be viewed or cleared with the following CLI commands: + + log (displays logs in the terminal window) + log -s (search for logs that contain and displays them) + log -s -i (search for logs that contain but case insensitive) + log clear (clears the log buffer) + help log (display the log command options) + + + +## Router Development Mode ## +In order to install an application directly to the router without using ECM, the router must be placed in **DEV** mode. One would typically debug and test an application using **DEV** mode prior to using ECM for installation. **DEV** mode allows for quicker and easier testing and debugging. Instructions for setting up a router for **DEV** mode is in Knowledge Base article ['SDK Enable Developer Mode'](https://dev.cradlepoint.com/s/article/ka1380000000EXqAAM/sdk-enable-development-mode). + + + +## ECM Application Deployment ## +ECM is used to securely deploy applications to routers at the group level. If an application *tar.gz* package is uploaded to ECM and then assigned to a router group, ECM will then securely download and install the application to the routers within the group. For security, the application files are not user accessible within ECM or routers. That is, one is not able to download the application from the router or ECM. + + + +## Sample Application Walk Through ## +Cradlepoint has provided several sample applications with the SDK which is located [here](https://github.com/cradlepoint/sdk-samples). Any of these apps can be used as a starting point for your application. The application data structure is described [here](#overview). + + +When using the SDK make.py file, be sure to invoke the proper python command based on your computer OS. + +- Linux or OS X: + + python3 + +- Windows: + + python + +### How to Run the Hello World Sample App ### +1. Download the SDK and sample apps from [here](https://github.com/cradlepoint/sdk-samples). +2. Ensure your computer has been setup. See [Computer Setup Instructions](#setup). +2. Connect the router to your computer. This can be done by connecting the LAN port of the router to the USB port of your computer via a USB to Ethernet adapter. +3. Ensure the router is in DEV Mode. See [here](#devmode). +4. Enable Debug logs in the router which is very helpful. See [here](http://knowledgebase.cradlepoint.com/articles/Support/fw6-Understanding-Router-Log-Files-and-Features?retURL=%2Fapex%2FknowledgeSearch%3Fc%3DAll_Products%26p%3D3%26k%3Ddebug%2Blogs%26t%3D%26l%3D%26lang%3Den_US&popup=false&c=All_Products&lang=en_US) +6. Open a terminal window. +7. Change directory to 'sample_apps'. +8. Update the sdk_setting.ini file based on your needs and for the sample app you wish to run. The hello\_world is a good app to test. + + Example: + + [sdk] + app_name=hello_world + dev_client_ip=192.168.0.1 + dev_client_username=admin + dev_client_password=44224267 + +11. Verify router connectivity via: + + $ python(3) make.py status + +12. Create the application package + + $ python(3) make.py + +13. Install the application package + + $ python(3) make.py install + +14. Check the application status to ensure it has started. + + $ python(3) make.py status + +15. Also check the logs in the router to ensure the application is creating 'Hello World' logs. In the router console use the 'log' command. + + + +---------- + +Published Date: 6-1-2017 + +This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at [suggestions@cradlepoint.com](mailto:suggestions@cradlepoint.com). \ No newline at end of file diff --git a/SDK_version_1.0_app_refactor.html b/SDK_version_1.0_app_refactor.html new file mode 100644 index 00000000..43537f4f --- /dev/null +++ b/SDK_version_1.0_app_refactor.html @@ -0,0 +1,327 @@ + + + +Convert_Apps_from_Open_Beta_SDK_to_this_SDK + + + + +

Converting Apps from the Open Beta SDK to the New SDK

+
+

Quick Links

+

Overview

+

Reuse the Open Beta SDK App Files

+

Re-factor the Open Beta SDK App Files

+

+

Overview

+

The 'Open BETA' Router SDK is being replaced with a more simplified SDK. This should decrease the SDK learning curve and allow app developers to focus more on their app functionality. Router application packages built using the Open Beta SDK or the New SDK will function in the router. The app package anatomy has not changes and both SDKs comply to this format. However, the directory code structure is different between the two SDKs. This means that the application files between the two SDK have some compatible issues. For example, the Open Beta SDK requires a setting.ini file and the New SDK requires a package.ini file.

+

This document will describe how to utilize the Open Beta SDK app files in the New SDK framework. There are two possibilities:

+
    +
  1. Reuse the Open Beta SDK App Files
  2. +
  3. Re-factor the Open Beta SDK App Files
  4. +
+

+

Reuse the Open Beta SDK App Files

+

The simplest way to utilize the Open Beta SDK application files with the New SDK framework is to:

+
    +
  1. Build the application package with the Open Beta SDK using the 'python make.py -m build <app path>' command.
  2. +
  3. Copy the uncompressed application files directory from the Open Beta SDK build directory to the New SDK applications directory.
  4. +
  5. The New SDK can now build the Open Beta SDK application package.
  6. +
+

However, working with the Open Beta SDK files with the New SDK could be a little more complicated due to their differences. For example, the settings.json file is used by the CradlepintAppBase object in app_base.py and the package.ini file is used by the FW in the router. There is also some redundant data in these files that must be kept in sync. One must keep this in mind if any of the redundant items are modified.

+

+

Re-factor the Open Beta SDK App Files

+

While reusing the python SDK app files with the GNU Make is an option, it can complicate future modification depending on the application design. It may be more beneficial to re-factor the python code. That is, remove any dependencies on any files in cp_lib. Classes and functions in cp_lib were written for convenience and SDK functionality. The New SDK has no dependencies on the cp_lib files.

+

In short, it is recommended to re-factor any existing Open Beta SDK application to be used with the New SDK. The cs.py file in the New SDK contains all the functions required to interface with the router config store (i.e. the config, status, state, and control router trees.) If your app from the Open Beta SDK uses other code from the cp_lib directory, this functionality should be ported to your app to remove the dependency.

+
+

Published Date: 5-9-2017

+

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

+ + + + diff --git a/app_template/app_template.py b/app_template/app_template.py new file mode 100644 index 00000000..831026da --- /dev/null +++ b/app_template/app_template.py @@ -0,0 +1,99 @@ +""" +A Blank app template as an example +""" +try: + import sys + import traceback + import argparse + import cs +except Exception as ex: + cs.CSClient().log("app_template.py", 'Import failure: {}'.format(ex)) + cs.CSClient().log("app_template.py", 'Traceback: {}'.format(traceback.format_exc())) + sys.exit(-1) + +APP_NAME = "app_template" + + +def start_router_app(): + try: + cs.CSClient().log(APP_NAME, 'start_router_app()') + gps_clients = [{ + "distance_interval_meters": 0, + "enabled": True, + "interval": 10, + "language": "nmea", + "name": "test server", + "nmea": { + "include_id": True, + "prepend_id": False, + "provide_gga": True, + "provide_rmc": True, + "provide_vtg": True + }, + "server": { + "lan": True, + "port": 12345, + "wan": True + }, + "stationary_distance_threshold_meters": 20, + "stationary_movement_event_threshold_seconds": 0, + "stationary_time_interval_seconds": 0, + "taip": { + "include_cr_lf_enabled": False, + "provide_al": True, + "provide_cp": True, + "provide_id": True, + "provide_ln": True, + "provide_pv": True, + "report_msg_checksum_enabled": True, + "vehicle_id_reporting_enabled": True + } + }] + response = cs.CSClient().put('/config/system/gps/connections', gps_clients) + except Exception as e: + cs.CSClient().log(APP_NAME, 'Something went wrong in start_router_app()! exception: {}'.format(e)) + raise + + return + + +def stop_router_app(): + try: + cs.CSClient().log(APP_NAME, 'stop_router_app()') + + except Exception as e: + cs.CSClient().log(APP_NAME, 'Something went wrong in stop_router_app()! exception: {}'.format(e)) + raise + + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + # Call the function to start the app. + start_router_app() + + elif command == 'stop': + # Call the function to start the app. + stop_router_app() + + except Exception as e: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + # The start.sh and stop.sh should call this script with a start or stop argument + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/app_template/cs.py b/app_template/cs.py new file mode 100644 index 00000000..c5e5ed17 --- /dev/null +++ b/app_template/cs.py @@ -0,0 +1,271 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/app_template/install.sh b/app_template/install.sh new file mode 100644 index 00000000..e15c09b5 --- /dev/null +++ b/app_template/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION app_template on:" >> install.log +date >> install.log diff --git a/app_template/package.ini b/app_template/package.ini new file mode 100644 index 00000000..8d496abb --- /dev/null +++ b/app_template/package.ini @@ -0,0 +1,11 @@ +[app_template] +uuid=1687727c-fd6c-48ff-807d-34a32faaedf8 +vendor=Cradlepoint +notes=A blank Reference Application as an example +firmware_major=6 +firmware_minor=3 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true \ No newline at end of file diff --git a/app_template/start.sh b/app_template/start.sh new file mode 100644 index 00000000..d0e850ed --- /dev/null +++ b/app_template/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython app_template.py start diff --git a/app_template/stop.sh b/app_template/stop.sh new file mode 100644 index 00000000..910d5c24 --- /dev/null +++ b/app_template/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython app_template.py stop diff --git a/common/ReadMe.txt b/common/ReadMe.txt new file mode 100644 index 00000000..42d66d4a --- /dev/null +++ b/common/ReadMe.txt @@ -0,0 +1,6 @@ +Common Directory Contents +========================= +cs.py - A wrapper for the TCP interface to the router config store. Includes +functions for log generation, get, put, delete, and append items to config store, +and a function for sending alerts to the ECM. Copy this file to your application +directory and import into your application. \ No newline at end of file diff --git a/common/cs.py b/common/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/common/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/common/sdk_cs_client.py b/common/sdk_cs_client.py new file mode 100644 index 00000000..dd94a600 --- /dev/null +++ b/common/sdk_cs_client.py @@ -0,0 +1,409 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import os +import re +import select +import socket +import threading +import logging +import logging.handlers +import signal +import sys + + +def clean_up_reg(signal, frame): + """ + When 'cppython remote_port_forward.py' gets a SIGTERM, config_store_receiver.py doesn't + clean up registrations. Even if it did, the comm module can't rely on an external service + to clean up. + """ + EventingCSClient().stop() + sys.exit(0) + +if sys.platform == 'linux2': + signal.signal(signal.SIGTERM, clean_up_reg) + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' +# logger = logging.getLogger(CSCLIENT_NAME) +# logger.setLevel(logging.INFO) +# log_enable = (os.environ.get('SYSLOG_ENABLE', 'true').lower() == 'true') +# if log_enable: +# handler = logging.handlers.SysLogHandler(address='/dev/log') +# else: +# handler = logging.FileHandler('/var/log/{}.log'.format(CSCLIENT_NAME)) +# formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s', datefmt='%b %d %H:%M:%S') +# handler.setFormatter(formatter) +# logger.addHandler(handler) + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + # @staticmethod + # def set_log_level(level): + # try: + # logger.setLevel(level) + # except ValueError: + # logger.info('Unable to set log level %s', level) + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + # logger.debug("_dispatch %s", cmd) + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + # logger.warning(errmsg) + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + # logger.debug("body decoded: %s", body) + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + # logger.debug("json decode error: %s", e) + result = body.strip() + # logger.debug("safe_receive result=\"%s\"", result) + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + # logger.warning(errmsg) + self.log(CSCLIENT_NAME, errmsg) + return result + + +class EventingCSClient(CSClient): + running = False + registry = {} + eids = 1 + + def start(self): + if sys.platform == 'linux2': + if self.running: + msg = "Eventing Config Store (%s) already running", self.pid + # logger.debug(msg) + self.log(CSCLIENT_NAME, msg) + return + self.running = True + self.pid = os.getpid() + self.f = '/var/tmp/csevent_%d.sock' % self.pid + try: + os.unlink(self.f) + except FileNotFoundError: + pass + self.event_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.event_sock.bind(self.f) + self.event_sock.listen() # backlog is optional. already set on value found in /proc + self.event_sock.setblocking(False) + self.eloop = threading.Thread(target=self._handle_events) + self.eloop.start() + else: + self.log(CSCLIENT_NAME, 'EventingCSClient.start() is only available when running in the router.') + + def stop(self): + if sys.platform == 'linux2': + if not self.running: + return + # logger.debug("Stopping %s", NAME) + for k in list(self.registry.keys()): + self.unregister(k) + self.event_sock.close() + os.unlink(self.f) + self.running = False + else: + self.log(CSCLIENT_NAME, 'EventingCSClient.stop() is only available when running in the router.') + + def _handle_events(self): + poller = select.poll() + poller.register(self.event_sock, + select.POLLIN | select.POLLERR | select.POLLHUP) # I don't unregister this in cleaning up! + while self.running: + try: + events = poller.poll(1000) + for f, ev in events: + if ev & (select.POLLERR | select.POLLHUP): + msg = "Hangup/error received. Stopping" + # logger.error(msg) + self.log(CSCLIENT_NAME, msg) + self.stop() # TODO: restart w/ cached registrations. Will no longer be an error case + + if ev & select.POLLIN: + conn, addr = self.event_sock.accept() + result = self._receive(conn) + eid = int(result['data']['id']) + try: + cb = self.registry[eid]['cb'] + args = self.registry[eid]['args'] + try: + # PUTting just a string to config store results in a json encoded string returned. + # e.g. set /config/system/logging/level "debug", result['data']['cfg'] is '"debug"' + cfg = json.loads(result['data']['cfg']) + except TypeError as e: + # Non-string path + cfg = result['data']['cfg'] + cb_return = cb(result['data']['path'], cfg, args) + if result['data']['action'] == 'get': # We've something to send back. + # config_store_receiver expects json + cb_return = json.JSONEncoder().encode(cb_return) + conn.sendall( + cb_return.encode()) # No dispatch. Config store receiver will put to config store. + except (NameError, ValueError) as e: + errmsg = "Could not find register data for eid %s", (eid) + # logger.warning(errmsg) + self.log(CSCLIENT_NAME, errmsg) + except OSError as e: + errmsg = "OSError: %s", e + # logger.warning(errmsg) + self.log(CSCLIENT_NAME, errmsg) + raise + + def register(self, action, path, callback, *args): + if sys.platform == 'linux2': + if not self.running: + raise SdkCSException("Eventing Config Store not started") + eid = self.eids + self.eids += 1 + self.registry[eid] = {'cb': callback, 'action': action, 'path': path, 'args': args} + cmd = "register\n{}\n{}\n{}\n{}\n".format(self.pid, eid, action, path) + return self._dispatch(cmd) + else: + self.log(CSCLIENT_NAME, 'Event register is only available when running in the router.') + + def unregister(self, eid): + if sys.platform == 'linux2': + if not self.running: + raise SdkCSException("Eventing Config Store not started") + e = self.registry[eid] + cmd = "unregister\n{}\n{}\n{}\n{}\n".format(self.pid, eid, e['action'], e['path']) + ret = self._dispatch(cmd) + del self.registry[eid] + return ret + else: + self.log(CSCLIENT_NAME, 'Event unregister is only available when running in the router.') diff --git a/config/README.md b/config/README.md deleted file mode 100644 index 6e32d578..00000000 --- a/config/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# directory: ./config -## Router App/SDK sample applications - -This directory holds global things shared by most Router Apps - -## File: main.py - -This Python script is the default "Router App" start up routine, which make.py -will copy -into your build archive - unless you have your own 'main.py' file in your -application project directory. - -This main.py does a variety of start-up chores, including: - -* locate your settings.json, which make.py should place in the root of your -archive. -* delay until time.time() is valid (or a max delay has pasted) -* delay until WAN connection is true (or a max delay has pasted) -* locate, import, and run your RouterApp module (start your code) -* if your code exits, then it uses an optional delay to prevent rapid -task trashing. For example, it might delay until 30 seconds past the -time your app started. - -## File: settings.ini - -Holds common shared settings, such as how logging is handled, the IP and user -credentials for your local router, and main.py startup behavior. - -This file is required by make.py - -## File: settings.json - -A temporary file used by tools - do not edit, as any edits will be lost. -If it exists, it will have been created from various other settings.ini files. - -## File: target.ini - -An optional settings file use by the tools/target.py script, which is -designed to simplify testing on a PC with more than one router or interface. -It allows you to map a name (like IBR1100 or CBA850) to select one of N -interfaces, assign IP, and so on. diff --git a/config/settings.ini b/config/settings.ini deleted file mode 100644 index a7ca9ef6..00000000 --- a/config/settings.ini +++ /dev/null @@ -1,31 +0,0 @@ -; Global settings - -[logging] -level=debug -; name = silly_toes -; log_file = trace.txt -syslog_ip=192.168.35.6 -; syslog_ip=/dev/log -; syslog_port=514 -; syslog_facility=22 -pc_syslog=false - -[router_api] -user_name=admin -interface=ENet USB-1 -local_ip=192.168.35.1 -password=441b537e - -[application] -name=make -vendor=Sample Code, Inc. -firmware=6.1 -restart=true -reboot=true -auto_start=true - -[startup] -boot_delay_max=5 min -boot_delay_for_time=True -boot_delay_for_wan=True -exit_delay=30 sec diff --git a/gnu_apps/extensible_ui_ref_app/config/settings.mk b/config/settings.mk similarity index 91% rename from gnu_apps/extensible_ui_ref_app/config/settings.mk rename to config/settings.mk index 524e5ba7..bf6fa577 100644 --- a/gnu_apps/extensible_ui_ref_app/config/settings.mk +++ b/config/settings.mk @@ -9,8 +9,8 @@ ROOT := $(shell pwd) SHELL := $(shell which bash) TOOLS := $(abspath $(ROOT)/tools) -APP_NAME ?= hspt -APP_UUID ?= 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c +APP_NAME ?= email_app +APP_UUID ?= 616acd0c-0475-479e-a33b-f7054843c971 APP_ARCHIVE := $(abspath $(APP_NAME).tar.gz) APP_DIR := $(ROOT)/$(APP_NAME) diff --git a/config/target.ini b/config/target.ini deleted file mode 100644 index c1592b25..00000000 --- a/config/target.ini +++ /dev/null @@ -1,42 +0,0 @@ -; think of these as 'flavors' to apply to the settings.ini - -[AER3100] -; user_name=admin -; interface=ENet USB-1 -local_ip=192.168.30.1 -password=franklin805 - -[AER2100] -local_ip=192.168.21.1 -password=4416ec79 - -[AER1600] -local_ip=192.168.16.1 -password=441ec8f9 - -[IBR1100] -local_ip=192.168.1.1 -password=441b1702 - -[IBR1150] -interface=Local Addin ENet -local_ip=192.168.115.1 -password=441a819c - -[CBA850] -local_ip=192.168.85.1 -password=441e0173 - -[IBR600] -; older/not ruby -local_ip=192.168.5.10 -password=4413a421 - -[IBR600B] -local_ip=192.168.60.1 -password=44167976 - -[IBR350] -interface=ENet USB-1 -local_ip=192.168.35.1 -password=441b537e diff --git a/cp_lib/__init__.py b/cp_lib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/cp_lib/clean_ini.py b/cp_lib/clean_ini.py deleted file mode 100644 index bfbb11f5..00000000 --- a/cp_lib/clean_ini.py +++ /dev/null @@ -1,85 +0,0 @@ -import os -import shutil - - -DEF_INI_EOL = "\n" -DEF_BACKUP_EXT = ".BAK" - - -def clean_ini_file(ini_name, eol=None, backup=False): - """ - Given an INI file, walk through and 'clean up' as required. The primary changes: - 1) string unnecessary white space - 2) insure all lines end in consistent end-of-line (is OS default, unless user passes in another form) - 3) force all section headers to lower case - per spec, INI files are NOT case sensitive - 4) strip off leading or trailing empty/blank lines - 5) reduce sequential blank lines to one only - 6) note: the keys and values are NOT affected (at this time) - - :param str ini_name: relative path (with directories) to the INI file - :param str eol: optional end-of-line string. default is OS default, but user can pass in another - :param bool backup: T if you want to save the original file - :return: None - """ - if os.path.exists(ini_name): - # only do if it exists - print("Cleaning INI file {}".format(ini_name)) - - # read the original file, clean up various things - lines = [] - was_blank = False - file_han = open(ini_name, "r") - for line in file_han: - # go through and clean up any lines - line = line.strip() - if not len(line): - # then is blank line, if 2 in a row skip appending! - if was_blank: - continue - else: - was_blank = True - - elif line[0] == "[": - # then is section heading, since is not case sensitive, make lower case - line = line.lower() - was_blank = False - - elif line[0] == "#": - # make Python-like comments into INI standard comments - if line[1] != " ": - line = "; " + line[1:] - else: - line = ";" + line[1:] - was_blank = False - - # else, leave as is - lines.append(line) - file_han.close() - - try: - while len(lines[0]) == 0: - # strip off leading blank lines - lines.pop(0) - - while len(lines[-1]) == 0: - # strip off leading blank lines - lines.pop(-1) - - except IndexError: - # file was too short? Ehh, is okay. - return - - # optionally back up the original (mainly used during testing) - if backup: - shutil.copyfile(ini_name, ini_name + DEF_BACKUP_EXT) - - # rewrite the INI with the new cleaned and EOL-normalized data - if eol is None: - eol = DEF_INI_EOL - - file_han = open(ini_name, "w") - for line in lines: - file_han.write(line + eol) - file_han.close() - - return diff --git a/cp_lib/cp_email.py b/cp_lib/cp_email.py deleted file mode 100644 index bde77c05..00000000 --- a/cp_lib/cp_email.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Send a single email -""" - -# Required keys -# ['smtp_tls] = T/F to use TLS, defaults to True -# ['smtp_url'] = URL, such as 'smtp.gmail.com' -# ['smtp_port'] = TCP port like 587 - be careful, as some servers have more -# than one, with the number defining the security demanded. -# ['username'] = your smtp user name (often your email acct address) -# ['password'] = your smtp acct password -# ['email_to'] = the target email address, as str or list -# ['subject'] = the email subject - -# Optional keys -# ['email_from'] = the from address - any smtp server will ignore, and force -# this to be your user/acct email address; def = ['username'] -# ['body'] = the email body; def = ['subject'] - -EMAIL_REQUIRED_KEYS = ('smtp_url', 'smtp_port', 'smtp_tls', - 'username', 'password', 'email_to', 'subject') - -EMAIL_OPTIONAL_KEYS = ('email_from', 'body', 'logger') - - -def cp_send_email(sets): - """ - - :param dict sets: the various settings - :return: - """ - import smtplib - - for key in EMAIL_REQUIRED_KEYS: - if key not in sets: - raise KeyError('cp_send_email() requires ["%s"] key' % key) - - # handle the two optional keys - if 'email_from' not in sets: - sets['email_from'] = sets['username'] - if 'body' not in sets: - sets['body'] = sets['subject'] - - email_list = sets['email_to'] - # if isinstance(email_list, str): - # # if already string, check if like '["add1@c.com","add2@d.com"] - # email_list = email_list.strip() - # if email_list[0] in ("[", "("): - # email_list = eval(email_list) - - email = smtplib.SMTP(sets['smtp_url'], sets['smtp_port']) - # TODO handle ['smtp_tls'] for optional TLS or not - email.ehlo() - email.starttls() - email.login(sets['username'], sets['password']) - - assert isinstance(email_list, list) - for send_to in email_list: - if 'logger' in sets: - sets['logger'].debug("Send email to {}".format(send_to)) - - email_body = '\r\n'.join(['TO: %s' % send_to, - 'FROM: %s' % sets['email_from'], - 'SUBJECT: %s' % sets['subject'], '', - sets['body']]) - - # try: TODO - better understand hard & soft failure modes. - email.sendmail(sets['email_from'], [send_to], email_body) - - # except: - # logging.error("Email send failed!") - - email.quit() - return 0 diff --git a/cp_lib/cs_ping.py b/cp_lib/cs_ping.py deleted file mode 100644 index 9a4d1d8d..00000000 --- a/cp_lib/cs_ping.py +++ /dev/null @@ -1,191 +0,0 @@ -""" -Issue a ping, via Router API control/ping -""" -import time -from cp_lib.app_base import CradlepointAppBase - -# for now, this does NOT work! -SUPPORT_COUNT = False - - -def cs_ping(app_base, ping_ip, ping_count=40, loop_delay=2.5): - """ - Issue a ping via Cradlepoint Router IP. ping_ip can be like - "192.168.35.6" or "www.google.com". - - return is a dictionary - - if ["status"] == "success", - - ["result'] is an array of lines (as shown below) - - ["transmitted" == 40 (from line "40 packets transmitted, ... ) - - ["received" == 40 (from line "... 40 packets received ... ) - - ["loss" == 40 (from line "... 0% packet loss) - - ["good" == 100 - ["loss"] - - if ["status"] == "error", ["result"] is likely the string explaining the - error, such as "Timed out trying to send a packet to 192.168.115.3" - - if ["status"] == "key_error", - - the cs_client response of GET "control/ping" lacked expected keys - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client, - :param str ping_ip: the IP or DNS name to ping - :param int ping_count: how many times to ping - :param float loop_delay: the delay in the GET loop - :return: - :rtype dict: - """ - - if not SUPPORT_COUNT and ping_count != 40: - app_base.logger.warning( - "PING 'count' not yet supported - forced to 40") - ping_count = 40 - - app_base.logger.info("Send a PING to {}".format(ping_ip)) - put_data = '{"host":"%s", "count": %d}' % (ping_ip, ping_count) - - # we want to PUT control/ping/start {"host": "192.168.115.6"} - result = app_base.cs_client.put("control/ping/start", put_data) - app_base.logger.info("Start Result:{}".format(result)) - - # an initial delay assume 1 second per ping_count - app_base.logger.info("Initial Delay for {} seconds".format(ping_count + 1)) - time.sleep(ping_count + 1) - - report = [] - while True: - result = app_base.cs_client.get("control/ping") - app_base.logger.info("Loop Result:{}".format(result)) - # first result should be something like: - # {'status': 'running', 'start': {'host': 'www.google.com'}, - # 'stop': '', 'result': 'PING www.google.com (216.58.193.100)'} - try: - value = result['status'] - except KeyError: - app_base.logger.error("PING has no ['status'], aborting") - return {"status": "key_error"} - - if value == "error": - # then some error occurred - return result - - if value == "": - # then the cycle is complete - break - - app_base.logger.info("PING Status:{}".format(value)) - - try: - value = result['result'] - except KeyError: - app_base.logger.error("PING has no ['result'], aborting") - return {"status": "key_error"} - - if value != "": - # then we are mid-cycle - lines = value.split('\n') - report.extend(lines) - - for line in lines: - app_base.logger.debug("{}".format(line)) - - if report[-1].startswith("round-trip"): - # then the cycle is complete - break - - # else still wait - for example, when we first start the - # ["status"] == "running" and ["result"] == "" - - # post delay if we didn't delay quite enough - app_base.logger.info("Loop for {} seconds".format(loop_delay)) - time.sleep(loop_delay) - - result = {"status": "success", "result": report} - - for line in report: - if line.find("packet loss") > 0: - # 40 packets transmitted, 40 packets received, 0% packet loss - # [0][1] [2] [3] [4] [5] [6] [7] [8] - value = line.split() - if value[2].startswith('transmit'): - result['transmitted'] = int(value[0]) - app_base.logger.debug("PING transmitted:{}".format( - result['transmitted'])) - if value[5].startswith('receive'): - result['received'] = int(value[3]) - app_base.logger.debug("PING received:{}".format( - result['received'])) - if value[6][-1] == '%': - result['loss'] = int(value[6][:-1]) - result['good'] = 100 - result['loss'] - app_base.logger.debug("PING loss:{}% good:{}%".format( - result['loss'], result['good'])) - - return result - -""" -PUT control/ping/start {"host": "192.168.115.6"}. - -Cyclically GET control/ping, watch ['status'] goes to 'running' (or 'error') -then eventually to 'done', then after repeated GET returns to '' - -I have seen ['status']: -= '' after all GETs done -= 'running' during pinging -= 'error' if -= 'sysstopped' if ?? - -If IP has no response - or Ip is unreachable: -{'start': {'host': '192.168.115.3'}, 'status': 'error', - 'result': 'Timed out trying to send a packet to 192.168.115.3'} - -The entire collection of ['result'] lines will be like (EOL = '\n') - -PING 192.168.115.6 (192.168.115.6) -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=0. time=1.080. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=1. time=0.900. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=2. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=3. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=4. time=1.020. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=5. time=0.960. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=6. time=1.000. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=7. time=1.000. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=8. time=0.980. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=9. time=1.000. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=10. time=1.040. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=11. time=0.980. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=12. time=0.960. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=13. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=14. time=1.080. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=15. time=1.000. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=16. time=1.000. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=17. time=1.040. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=18. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=19. time=0.900. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=20. time=12.440. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=21. time=0.940. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=22. time=0.900. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=23. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=24. time=1.020. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=25. time=0.940. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=26. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=27. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=28. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=29. time=0.900. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=30. time=0.940. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=31. time=0.900. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=32. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=33. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=34. time=1.020. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=35. time=0.940. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=36. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=37. time=0.940. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=38. time=0.920. ms -44 bytes from 192.168.115.6 (192.168.115.6): icmp_seq=39. time=0.900. ms ----Ping statistics--- -40 packets transmitted, 40 packets received, 0% packet loss -round-trip(ms) min/avg/max = 0.900/1.244/12.440 - -(eventually will be "") - -""" diff --git a/cp_lib/data/__init__.py b/cp_lib/data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/cp_lib/data/json_get_put.py b/cp_lib/data/json_get_put.py deleted file mode 100644 index 7ba24799..00000000 --- a/cp_lib/data/json_get_put.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -Simple JSON GET and PUT. Geared towards JSON-RPC, but assumes nitty-gritty -details of the protocol were handled externally. -""" -import json - -from cp_lib.data.data_tree import get_item_value, put_item, \ - DataTreeItemNotFound - -JSON_VERSION = "2.0" - - -def jsonrpc_check_request(source, test_params=True): - """ - Given a JSONRPC request, confirm looks valid - - :param source: the JSON RPC request - :type source: str or bytes or dict - :param boot test_params: if True, confirm [params] exists - :return: - :rtype dict: - """ - if isinstance(source, bytes): - source = source.decode('utf-8') - - if isinstance(source, str): - source = json.loads(source) - - assert isinstance(source, dict) - - if "jsonrpc" not in source: - source["error"] = { - "code": -32600, - "message": "Invalid request - [jsonrpc] key missing"} - - elif source["jsonrpc"] != JSON_VERSION: - source["error"] = { - "code": -32600, - "message": "Invalid request - [jsonrpc] != {}".format( - JSON_VERSION)} - - elif "method" not in source: - source["error"] = { - "code": -32600, - "message": "Invalid request - [method] key missing"} - - elif not isinstance(source["method"], str): - source["error"] = { - "code": -32600, - "message": "Invalid request - [method] is not str"} - - else: - if test_params and "params" not in source: - source["error"] = { - "code": -32600, - "message": "Invalid request - [params] key missing"} - - return source - - -def jsonrpc_prep_response(source, encode=True): - """ - Given a JSONRPC response, pop out unwanted keyes, plus confirm - one and only one of the [error] or [result] keys - - :param dict source: the JSON RPC request - :param bool encode: if T, then convert to str() - :return: - :rtype dict: - """ - assert isinstance(source, dict) - - pop_list = [] - for key, value in source.items(): - # remove any unknown keys - if key not in ("jsonrpc", "id", "result", "error"): - pop_list.append(key) - - for key in pop_list: - # expect to pop out [method] and [params] - # print("Pop unwanted key:{}".format(key)) - source.pop(key) - - if "jsonrpc" not in source: - # should be here, but add if missing - source["jsonrpc"] = JSON_VERSION - - if "error" in source: - # we only want error or result, not both - if "result" in source: - raise KeyError("Cannot have both [error] and [result]") - - elif "result" not in source: - raise KeyError("Must have either [error] or [result]") - - if encode: - source = json.dumps(source) - - return source - - -def jsonrpc_get(base, source): - """ - Given a dict acting as data tree, fetch the item in - JSON RPC ["params"]["path"] - - :param dict base: the data tree to search - :param dict source: the parses json rpc request - :return: - """ - - # we ignore keys "jsonrpc", "method", and "id" - - if not isinstance(source, dict): - raise TypeError("jsonrpc source must be dict()") - - if "params" not in source: - raise ValueError('jsonrpc["params"] key missing') - - if "path" not in source["params"]: - raise ValueError('jsonrpc["params"]["path"] key missing') - - try: - result = get_item_value( - base, source["params"]["path"], throw_exception=True) - source["result"] = result - - except DataTreeItemNotFound: - source["error"] = {"code": -32602, "message": "path is not found"} - - # we 'key' into the messages, but we do NOT clean up the 'call' keys - return source - - -def jsonrpc_put(base, source): - """ - Given a dict acting as data tree, fetch the item in - JSON RPC ["params"]["path"] - - :param dict base: the data tree to search - :param dict source: the parses json rpc request - :return: - """ - - # we ignore keys "jsonrpc", "method", and "id" - - if not isinstance(source, dict): - raise TypeError("jsonrpc source must be dict()") - - if "params" not in source: - raise ValueError('jsonrpc["params"] key missing') - - if "path" not in source["params"]: - raise ValueError('jsonrpc["params"]["path"] key missing') - - try: - result = put_item( - base, path=source["params"]["path"], - value=source["params"]["value"], throw_exception=True) - source["result"] = result - - except DataTreeItemNotFound: - source["error"] = {"code": -32602, "message": "path is not found"} - - # we 'key' into the messages, but we do NOT clean up the 'call' keys - return source diff --git a/cp_lib/data/quality.py b/cp_lib/data/quality.py deleted file mode 100644 index ad3c2693..00000000 --- a/cp_lib/data/quality.py +++ /dev/null @@ -1,244 +0,0 @@ -# File: quality.py -# Desc: manage the quality bits, tags, and names - -__version__ = "1.0.0" - -# History: -# -# 1.0.0: 2015-Mar Lynn -# * initial draft, new design -# -# - -""" -The data samples: -""" - -# lowest 8 bits define 'BadData' - generally hardware errors, disabled etc -# such data is probably meaningless; for example a '0' reading of a broken -# sensor doesn't mean it is zero (0) degrees outside -QUALITY_NO_SUPPORTED = 0x00000000 # no support, value is meaningless - -QUAL_DISABLE = 0x00000001 # source is disabled -QUAL_FAULT = 0x00000002 # low-level HW fault; device specific -QUAL_OFFLINE = 0x00000004 # source is unavailable, offline, etc) -QUAL_NOT_INIT = 0x00000008 # the data has never been set -QUAL_OVER_RANGE = 0x00000010 # above permitted range-of-operation -QUAL_UNDER_RANGE = 0x00000020 # below permitted range-of-operation -QUAL_RES_BD = 0x00000040 # (reserved) -QUAL_VALID = 0x00000080 # status is valid if 1 -QUAL_BAD_DATA = 0x0000007F # these are internal data alarms - -QUAL_QUAL_UNK = 0x00000100 # data is of unknown quality -QUAL_QUAL_LOW = 0x00000200 # data is of known low quality -QUAL_MANUAL = 0x00000400 # at least 1 input is in Manual mode -QUAL_CLAMP_HIGH = 0x00001000 # was forced high due to system fault -QUAL_CLAMP_LOW = 0x00002000 # was forced low due to system fault -QUAL_SOSO_DATA = 0x00003700 # internal process 'conditions' - -QUAL_DIGITAL = 0x00010000 # digital NOT in desired state -QUAL_RES_AL = 0x00020000 # (reserved) -QUAL_LO = 0x00040000 # normal/expected low alarm (warning) -QUAL_LOLO = 0x00080000 # abnormal/unexpected too-low alarm (err) -QUAL_ROC_NOR = 0x00100000 # normal/expected rate-of-change alarm -QUAL_ROC_AB = 0x00200000 # abnormal/unexpected rate-of-change alarm -QUAL_HI = 0x00400000 # normal/expected high alarm (warning) -QUAL_HIHI = 0x00800000 # abnormal/unexpected too-high alarm (err) -QUAL_DEV_NOR = 0x01000000 # normal/expected deviation alarm (warning) -QUAL_DEV_AB = 0x02000000 # abnormal/unexpected deviation alarm (err) -QUAL_ALARMS = 0x0FFF0000 # These are External Process Alarms - -QUAL_ABNORM = 0x10000000 # first sample after go to alarm -QUAL_RTNORM = 0x20000000 # first sample after a return to normal -QUAL_RES_EV = 0x40000000 # (reserved) - -QUAL_ALL_BITS = 0x7FFFFFFF # handle py 3.x when all int or long - -QUALITY_GOOD = QUAL_VALID -QUALITY_BAD = QUAL_BAD_DATA - -QUALITY_DEFAULT_ALARM_BITS = (QUAL_FAULT | QUAL_OFFLINE | - QUAL_OVER_RANGE | - QUAL_UNDER_RANGE | QUAL_ALARMS) - -QUALITY_DEFAULT_EVENT_BITS = (QUAL_MANUAL | QUAL_RTNORM | - QUAL_ABNORM) - -QUALITY_TAG_TO_BIT = { - 'dis': QUAL_DISABLE, 'flt': QUAL_FAULT, - 'ofl': QUAL_OFFLINE, - 'ovr': QUAL_OVER_RANGE, 'udr': QUAL_UNDER_RANGE, - 'N/A': QUAL_NOT_INIT, 'n/a': QUAL_NOT_INIT, - 'unq': QUAL_QUAL_UNK, 'loq': QUAL_QUAL_LOW, - 'man': QUAL_MANUAL, 'clh': QUAL_CLAMP_HIGH, - 'cll': QUAL_CLAMP_LOW, 'dig': QUAL_DIGITAL, - 'low': QUAL_LO, 'llo': QUAL_LOLO, - 'roc': QUAL_ROC_NOR, 'rab': QUAL_ROC_AB, - 'hig': QUAL_HI, 'hhi': QUAL_HIHI, - 'dev': QUAL_DEV_NOR, 'dab': QUAL_DEV_AB, - 'abn': QUAL_ABNORM, 'rtn': QUAL_RTNORM, - 'ok': QUAL_VALID -} - -QUALITY_SHORT_NAME = { - QUAL_DISABLE: 'dis', QUAL_FAULT: 'flt', - QUAL_OFFLINE: 'ofl', - QUAL_OVER_RANGE: 'ovr', QUAL_UNDER_RANGE: 'udr', - QUAL_NOT_INIT: 'N/A', - QUAL_QUAL_UNK: 'unq', QUAL_QUAL_LOW: 'loq', - QUAL_MANUAL: 'man', QUAL_CLAMP_HIGH: 'clh', - QUAL_CLAMP_LOW: 'cll', QUAL_DIGITAL: 'dig', - QUAL_LO: 'low', QUAL_LOLO: 'llo', - QUAL_ROC_NOR: 'roc', QUAL_ROC_AB: 'rab', - QUAL_HI: 'hig', QUAL_HIHI: 'hhi', - QUAL_DEV_NOR: 'dev', QUAL_DEV_AB: 'dab', - QUAL_ABNORM: 'abn', QUAL_RTNORM: 'rtn', - QUAL_VALID: 'ok', -} - -QUALITY_FULL_NAME = { - QUAL_DISABLE: 'disabled', QUAL_FAULT: 'fault', - QUAL_OFFLINE: 'offline', QUAL_NOT_INIT: 'not-initialized', - QUAL_OVER_RANGE: 'over-range', - QUAL_UNDER_RANGE: 'under-range', - QUAL_QUAL_UNK: 'unknown-quality', - QUAL_QUAL_LOW: 'low-quality', - QUAL_MANUAL: 'manual', QUAL_CLAMP_HIGH: 'clamp-high', - QUAL_CLAMP_LOW: 'clamp-low', QUAL_DIGITAL: 'digital', - QUAL_LO: 'low', QUAL_LOLO: 'low-low', - QUAL_ROC_NOR: 'rate-of-change', - QUAL_ROC_AB: 'rate-of-change-abnorm', - QUAL_HI: 'high', QUAL_HIHI: 'high-high', - QUAL_DEV_NOR: 'deviation', - QUAL_DEV_AB: 'deviation-abnormal', - QUAL_ABNORM: 'go-abnormal', - QUAL_RTNORM: 'return-to-normal', - QUAL_VALID: 'status-valid', -} - - -def one_bit_to_tag(bit: int): - """Given a single bit-mask, return the tag/mnemonic""" - if bit in QUALITY_SHORT_NAME: - return QUALITY_SHORT_NAME[bit] - raise ValueError("one_bit_to_tag({0}) - bit matches no tag".format(bit)) - - -def one_bit_to_name(bit: int): - """Given a single bit-mask, return the long name""" - if bit in QUALITY_FULL_NAME: - return QUALITY_FULL_NAME[bit] - raise ValueError("one_bit_to_name({0}) - bit matches no tag".format(bit)) - - -def all_bits_to_tag(bits: int, long_name=False): - """Cycle through all bits, returning a tag/mnemonic string""" - - if not (bits & QUAL_VALID): - raise ValueError("all_bits_to_tag(0x%X) - lacks VALID bit tag" % bits) - - if bits == QUAL_VALID: - if long_name: - return "status-valid" - else: - return "ok" - - # else at least one bit is true, so continue - tag_string = '' - n = 1 - first = True - while n & QUAL_ALL_BITS: - if (bits & n) and (n != QUAL_VALID): - # then this bit is true, so add the tag - # but skip adding 'ok' tag! - if long_name: - tag = one_bit_to_name(n) - else: - tag = one_bit_to_tag(n) - if tag is not None: - if first: - first = False - tag_string = tag - else: - tag_string += ',' + tag - # cycle through all the bits. - # On 32-bit, will go zero after 0x80000000, so while cond not true - # On 64-bit/py 3.x, will go to 0x100000000, so while cond not true - n <<= 1 - return tag_string - - -def clr_quality_tags(quality: int, tag): - """ - Use the 3-ch tags to clear some bits - - :param int quality: the bits to mask in - :param tag: the short or tag name - :type tag: str, tuple, or list - :rtype: int - """ - if not isinstance(quality, int): - raise TypeError("clr_quality_tags() quality must be int type") - - quality |= QUAL_VALID - - if isinstance(tag, str): - # if a string was passed in, clear this one bit - quality &= ~tag_to_one_bit(tag) - - else: - try: - # if a list was passed in, we cycle through the list clearing - # each tag one by one - for one_tag in tag: - quality = clr_quality_tags(quality, one_tag) - - except: # any other situation is an error - raise TypeError("clr_quality_tags({0}) - invalid tags".format(tag)) - - return quality - - -def set_quality_tags(quality, tag): - """ - Use the 3-ch tags to set some bits - - :param int quality: the bits to mask in - :param tag: the short or tag name - :type tag: str, tuple, or list - :rtype: int - """ - if not isinstance(quality, int): - raise TypeError("set_quality_tags() quality must be int type") - - quality |= QUAL_VALID - - if isinstance(tag, str): - # if a string was passed in, clear this one bit - quality |= tag_to_one_bit(tag) - - else: - try: - # if a list was passed in, we cycle through the list setting - # each tag one by one - for one_tag in tag: - quality = set_quality_tags(quality, one_tag) - - except: # any other situation is an error - raise TypeError("set_quality_tags({0}) - invalid tags".format(tag)) - - return quality - - -def tag_to_one_bit(tag): - """ - Given string short (or tag) name, return alarm mask - :param str tag: the short or tag name - :rtype: int - """ - if isinstance(tag, str): - tag = tag.lower() - if tag in QUALITY_TAG_TO_BIT: - return QUALITY_TAG_TO_BIT[tag] - - raise ValueError("tag_to_one_bit({0}) - tag not valid".format(tag)) diff --git a/cp_lib/load_active_wan.py b/cp_lib/load_active_wan.py deleted file mode 100644 index 8a5dc587..00000000 --- a/cp_lib/load_active_wan.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Load Router API "status/wan/devices/mdm-xx" -""" -from cp_lib.app_base import CradlepointAppBase, CradlepointRouterOffline - -KEY_NAME = 'name' -KEY_ACTIVE = "connected" -KEY_LIVE_GPS = 'gps' - - -class ActiveWan(object): - """ - fetch router's WAN data, allowing questions to be asked - - :param CradlepointAppBase app_base: - """ - def __init__(self, app_base): - self.app_base = app_base - self.data = None - self.refresh() - return - - def refresh(self): - self.data = fetch_active_wan(self.app_base) - return - - def get_imei(self): - """ - Scan for the first imei value. - - ['imei'] is IMEI string (or info.serial) - - :return: - """ - if self.data[KEY_ACTIVE]['imei'] not in (None, "", "unset"): - # assume 'active' if it seems valid - return self.data[KEY_ACTIVE]['imei'] - - for key, value in self.data.items(): - # else get first valid seeming one - if 'imei' in value and value['imei'] not in (None, "", "unset"): - return value['imei'] - - def supports_gps(self): - """ - Scan for the first wan claiming 'support_gps' - - ['supports_gps'] is T/F based on modem hw (or info.supports_gps) - - :return: - """ - if self.data[KEY_LIVE_GPS] not in (None, {}): - # then we have a fix - return True - - # slightly special - we might support GPS, but not yet have a fix - for key, value in self.data.items(): - # else get first valid seeming one - if value.get('supports_gps', False): - # then at least 1 claims support - return True - - # else, none claimed to support gps - return False - - def get_live_gps_data(self): - """ - return last-seen GPS data - - :return: - """ - return self.data[KEY_LIVE_GPS] - - -def fetch_active_wan(app_base, return_raw=False): - """ - Load Router API "/status/wan/devices" into settings. - - If return_raw=True, you'' receive the full dict returned via the - status API tree - - Else if return_raw=False, you receive a reduced dict. In the base level, - it will contain the same dict() as "/status/wan/devices", however - there will be 1 extra, as ["active"] which is an alias to the - modem currently serving as the uplink - - Example: - output['mdm-436abc4f'] = {"connection_state": "disconnected", ...} - output['mdm-43988388'] = {"connection_state": "connected", ...} - output['active'] = {"connection_state": "connected", ...} - - But remember that in this example, - output['mdm-43988388'] == output['active'] in every way - even - memory allocation, so changing output['mdm-43988388']['imei'] also - changes output['active']['imei'] !! - - Since the ['name'] key is added, you can see that - output['mdm-436abc4f']['name'] == 'mdm-436abc4f' - output['mdm-43988388']['name'] == 'mdm-43988388' - output['active']['name'] == 'mdm-43988388' - - :param CradlepointAppBase app_base: - :param bool return_raw: if True, return API data as-is, else REDUCE - :return dict: the merged settings - """ - import json - - assert isinstance(app_base, CradlepointAppBase) - - save_state = app_base.cs_client.show_rsp - app_base.cs_client.show_rsp = False - result = app_base.cs_client.get("/status/wan/devices") - app_base.cs_client.show_rsp = save_state - - if result is None: - raise CradlepointRouterOffline( - "Aborting - Router({}) is not accessible".format( - app_base.cs_client.router_ip)) - - if isinstance(result, str): - result = json.loads(result) - - if not return_raw: - # then 'reduce' complexity as defined in make_modem_dict() - - # the base section with have multiple modem and wired/wan sections. - # most cellular products have '2' modems, which is a fake design - # to support 2 SIM - wan_items = [] - for key, value in result.items(): - wan_items.append(key) - - # sort in-place, just to make life easier - wan_items.sort() - - output = dict() - - for modem in wan_items: - output[modem] = _make_modem_dict(modem, result[modem]) - - # the 'first' WAN we find which is 'connected' becomes - # output['active'] - if KEY_ACTIVE not in output: - if output[modem]['connection_state'].lower() == 'connected': - output[KEY_ACTIVE] = output[modem] - - # set up the GPS source - if KEY_LIVE_GPS not in output: - if output[modem].get('supports_gps', False): - # then we claim to support - if 'gps' in output[modem] and \ - len(output[modem]['gps']) > 0: - output[KEY_LIVE_GPS] = output[modem]['gps'] - - # we shouldn't change 'result' until out of the loop - if KEY_ACTIVE not in output: - output[KEY_ACTIVE] = None - if KEY_LIVE_GPS not in output: - output[KEY_LIVE_GPS] = None - result = output - - return result - - -def _make_modem_dict(modem_name, xdct): - """ - Given an API dict, plus modem name, create our simpler reduced dict. If - all goes well, it will contain: - ['imei'] is IMEI string (or info.serial) - ['supports_gps'] is T/F based on modem hw (or info.supports_gps) - ['tech'] is string like 'lte/3G' based on modem hw (or info.tech) - ['summary'] string like 'connected' or 'configure error' (status.summary) - ['connection_state'] string like 'disconnected' or 'connected' - (status.connection_state) - ['uptime'] None or float, seconds 'up' (status.uptime) - ['gps'] dict. Empty if no lock, else last data (status.gps) - ['ipinfo'] dict. Empty if no link, else cellular IP data (status.ipinfo) - - ['gps'] may be like: - {'nmea': - {'GPVTG': '$GPVTG,,T,0.0,M,0.0,N,0.0,K,A*0D\r\n', - 'GPGGA': '$GPGGA,183820.0,4500.815065,N,09320.092759,W,1,06,0.8, - 282.8,M,-33.0,M,,*6B\r\n', - 'GPRMC': '$GPRMC,183820.0,A,4500.815065,N,09320.092759,W,0.0,, - 110516,0.0,E,A*3D\r\n'}, - 'fix': - {'age': 45.68415999998978, - 'lock': True, - 'satellites': 6, - 'time': 183820, - 'longitude': {'minute': 20, 'second': 5.5644001960754395, - 'degree': -93}, - 'latitude': {'minute': 0, 'second': 48.902400970458984, - 'degree':45} - }} - - ['ipinfo'] may be like: - {'ip_address': '10.109.130.98' - 'netmask': '255.255.255.252', - 'gateway': '10.109.130.97', - 'dns': ['172.26.38.1', '172.26.38.2']} - - :param str modem_name: the official name - :param xdct: the dictionary at /status/wan/devices/modem_name - :return: - :rtype: dict - """ - result = dict() - result[KEY_NAME] = modem_name - result['path'] = "/status/wan/devices" + "/" + modem_name - - if "info" in xdct: - temp = xdct['info'] - if "serial" in temp: - if temp['serial'] in (None, "", "unset"): - result['imei'] = None - else: - result['imei'] = temp['serial'] - if "supports_gps" in temp: - result['supports_gps'] = temp['supports_gps'] - else: - result['supports_gps'] = False - if "tech" in temp: - result['tech'] = temp['tech'] - if "status" in xdct: - temp = xdct['status'] - if "summary" in temp: - result['summary'] = temp['summary'] - if "connection_state" in temp: - result['connection_state'] = temp['connection_state'] - if "uptime" in temp: - result['uptime'] = temp['uptime'] - if "gps" in temp: - result['gps'] = temp['gps'] - else: - result['gps'] = {} - if "ipinfo" in temp: - result['ipinfo'] = temp['ipinfo'] - - return result diff --git a/cp_lib/load_gps_config.py b/cp_lib/load_gps_config.py deleted file mode 100644 index 19aa36c1..00000000 --- a/cp_lib/load_gps_config.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Load Router API "config/system/gps" settings. -""" - -from cp_lib.app_base import CradlepointAppBase, CradlepointRouterOffline - - -class GpsConfig(object): - """ - fetch router's GPS config, allowing questions to be asked - - :param CradlepointAppBase app_base: - """ - def __init__(self, app_base): - self.app_base = app_base - self.data = None - self.refresh() - return - - def refresh(self): - self.data = fetch_gps_config(self.app_base) - return - - def is_enabled(self): - """ - return if GPS is enabled. We say False if data is bad! - - :return bool: T/F - """ - if self.data is None: - return False - - return self.data.get("enabled", False) - - def keepalive_is_enabled(self): - """ - return if GPS Keepalive is enabled. - - Allow KeyError if our data is bad. Technically, do not call - this if self.is_enabled() == False - - :return bool: T/F - """ - return self.data.get("enable_gps_keepalive", False) - - def get_client_info(self): - """ - return the FIRST instance of a client (we send to server) - - Allow KeyError if our data is bad. Technically, do not call - this if self.is_enabled() == False - - :return bool: T/F - :rtype: None or (str, int) - """ - if "connections" in self.data: - for client in self.data["connections"]: - # test each sender / client - # self.app_base.logger.debug("client:{}".format(client)) - if "client" in client: - # then found gps/connections[]/client - if client.get("enabled", False): - # then found gps/connections[]/enabled == True - server_ip = client["client"].get("server", None) - server_port = client["client"].get("port", None) - if server_ip is not None and server_port is not None: - return server_ip, int(server_port) - - # if still here, we don't have, so return None - return None - - -def fetch_gps_config(app_base, return_raw=True): - """ - Load Router API "config/system/gps" and answer things about it. - - $ cat config/system/gps - { - "connections": [ - { - "_id_": "00000000-cb35-39e3-bc26-fd7b4f4c4a", - "client": { - "port": 9999, - "server": "192.168.35.6", - "time_interval": { - "enabled": false, - "end_time": "5:00 PM", - "start_time": "9:00 AM" - } - }, - "distance_interval_meters": 0, - "enabled": true, - "interval": 10, - "language": "nmea", - "name": "my pc", - "stationary_distance_threshold_meters": 20, - "stationary_movement_event_threshold_seconds": 0, - "stationary_time_interval_seconds": 0 - } - ], - "debug": { - "flags": 0, - "log_nmea_to_fs": false - }, - "enable_gps_keepalive": true, - "enable_gps_led": false, - "enabled": true, - "pwd_enabled": false, - "taip_vehicle_id": "0000" - } - - :param CradlepointAppBase app_base: - :param bool return_raw: if True, return API data as-is, else REDUCE - :return dict: the merged settings - """ - import json - - assert isinstance(app_base, CradlepointAppBase) - - save_state = app_base.cs_client.show_rsp - app_base.cs_client.show_rsp = False - result = app_base.cs_client.get("config/system/gps") - app_base.cs_client.show_rsp = save_state - - if result is None: - raise CradlepointRouterOffline( - "Aborting - Router({}) is not accessible".format( - app_base.cs_client.router_ip)) - - if isinstance(result, str): - result = json.loads(result) - - if return_raw: - # for future use, and common module - pass - - return result diff --git a/cp_lib/load_settings_ini.py b/cp_lib/load_settings_ini.py deleted file mode 100644 index 6807a026..00000000 --- a/cp_lib/load_settings_ini.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -Simple Load settings, assume is JSON only. Follow this logic: -1) if settings.json exists in root directory, load it and STOP -2) else -2a) load ./config/settings -2b) load ./{project}/settings -""" -import json -import logging -import os -import sys - -from cp_lib.load_settings_json import DEF_GLOBAL_DIRECTORY, \ - DEF_SETTINGS_FILE_NAME, DEF_JSON_EXT, SECTION_NAME_LIST, \ - SECTION_APPLICATION, SECTION_LOGGING, SECTION_ROUTER_API -from make import EXIT_CODE_BAD_FORM - -DEF_INI_EXT = ".ini" -DEF_SAVE_EXT = ".save" - -# set to None to suppress adding comments to the settings.json files -ADD_JSON_COMMENT_KEY = "_comment" - - -def load_sdk_ini_as_dict(app_dir_path=None, file_name=None): - """ - Follow Router SDK Design: - 1) first load ./config/settings.ini - if it exists - 2) second load /{project}/settings.ini - if it exists, and smartly - merge into .config values - - :param str app_dir_path: the base directory of our project, like network/tcp_echo/ - :param str file_name: pass in alternative name - mainly for testing, else use DEF_FILE_NAME - :return dict: - """ - if file_name is None: - file_name = DEF_SETTINGS_FILE_NAME - - # start by loading the globals or ./config/settings.ini - ini_name = os.path.join(DEF_GLOBAL_DIRECTORY, file_name + DEF_INI_EXT) - logging.debug("Load Global Settings from {}".format(ini_name)) - _sets = load_ini_as_dict(ini_name) - - if app_dir_path is not None: - ini_name = os.path.join(app_dir_path, file_name + DEF_INI_EXT) - if os.path.exists(ini_name): - # load the app-specific settings, manually handle file - avoid potential path issues .. - logging.debug("Load App Project Settings from {}".format(ini_name)) - _sets = load_ini_as_dict(ini_name, _sets) - else: - logging.debug("There is no settings file {}".format(ini_name)) - - return _sets - - -def load_ini_as_dict(ini_name, pre_dict=None): - """ - - Locate and read a single INI - - force our expected sections headers to lower case - - if pre_dict exists, walk through and smartly 'merge' new data over old - - :param str ini_name: relative directory path to the INI file (which may NOT exist) - :param dict pre_dict: any existing settings, which we want new INI loaded data to over-write - :return dict: the prepared data as dict - """ - import configparser - - if not os.path.isfile(ini_name): - # if this INI file DOES NOT exist, return - existence is not this - # module's responsibility! - # logging.debug("INI file {} does NOT exist".format(ini_path)) - return pre_dict - - # LOAD IN THE INI FILE, using the Python library - config = configparser.ConfigParser() - # READ indirectly, as config.read() tries to open cp_lib/config/file.ini, - # not config/file.ini - file_han = open(ini_name, "r") - try: - config.read_file(file_han) - - except configparser.DuplicateOptionError as e: - logging.error(str(e)) - logging.error("Aborting MAKE") - sys.exit(EXIT_CODE_BAD_FORM) - - finally: - file_han.close() - # logging.debug(" Sections:{}".format(config.sections())) - - # convert INI/ConfigParser to Python dictionary - settings = {} - for section in config.sections(): - - section_tag = section.lower() - if section_tag not in SECTION_NAME_LIST: - # we make sure 'expected' sections are lower case, otherwise - # allow any case-mix - # example: [application] must be lower-case, but [TcpStuff] is fine - section_tag = section - - settings[section_tag] = {} - # note: 'section' is the old possibly mixed case name; section_tag - # might be lower case - for key, val in config.items(section): - settings[section_tag][key] = val - - # add OPTIONAL comments to file; set ADD_JSON_COMMENT_KEY=None to disable - if ADD_JSON_COMMENT_KEY is not None: - comments = { - SECTION_APPLICATION: "Settings for the application being built.", - SECTION_LOGGING: "Settings for the application debug/syslog/logging function.", - SECTION_ROUTER_API: "Settings to allow accessing router API in development mode." - } - for section in comments: - if section in settings: - settings[section][ADD_JSON_COMMENT_KEY] = comments[section] - - if pre_dict is None: - # no pre-existing data, then return as-is - return settings - - # else smartly merge new data into old, not 'replacing' sections - assert isinstance(pre_dict, dict) - for key, data in settings.items(): - if key in pre_dict: - # update/merge existing section (not replace) - pre_dict[key].update(data) - else: - # set / replace new sections - pre_dict[key] = data - - return pre_dict - - -def copy_config_ini_to_json(): - # copy the globals or ./config/settings.ini to ./config/settings.json - name = os.path.join(DEF_GLOBAL_DIRECTORY, DEF_SETTINGS_FILE_NAME + DEF_INI_EXT) - logging.debug("Copy Global Settings from INI to JSON ") - _sets = load_ini_as_dict(name) - - name = os.path.join(DEF_GLOBAL_DIRECTORY, DEF_SETTINGS_FILE_NAME + DEF_JSON_EXT) - save_root_settings_json(_sets, name) - return - - -def save_root_settings_json(sets, file_name=None): - """ - - :param sets: - :param file_name: - - :param dict sets: the settings as Python dict - :param str file_name: pass in alternative name - mainly for testing, else use DEF_FILE_NAME - :return: - """ - if file_name is None: - file_name = DEF_SETTINGS_FILE_NAME + DEF_JSON_EXT - - logging.info("Save settings to {}".format(file_name)) - lines = json.dumps(sets, indent=4, sort_keys=True) - file_han = open(file_name, 'wb') - for line in lines: - # cooked = line + '\n' - file_han.write(line.encode()) - file_han.close() diff --git a/cp_lib/modbus/__init__.py b/cp_lib/modbus/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/cp_lib/modbus/readme.md b/cp_lib/modbus/readme.md deleted file mode 100644 index f528a0c6..00000000 --- a/cp_lib/modbus/readme.md +++ /dev/null @@ -1,54 +0,0 @@ -# directory: ./cp_lib/modbus -## Simplistic transaction parsing for Modbis - -These files allow simple conversion between Modbus/TCP, Modbus/RTU, and Modbus/ASCII. - -This is actually pretty easy, as they all enclose the same "ADU" message. For example, the block read of 10 coils starting at the 2nd (data[1]) offset is: - -* Modbus/RTU = b'**\x01\x01\x00\x01\x00\x0A**\x44\x2A' -* Modbus/ASCII = b':**01010001000A**66\r\n' -* Modbus/TCP = b'\x00\xA5\x00\x00\x00\x06**\x01\x01\x00\x01\x00\x0A**' - -Notice that they all include the 6-byte value **01 01 00 01 00 0A**! So conversion is very mechanical. - -## File: __init__.py - -Empty - exists to define cp_lib/modbus as a module. - -## File: transaction.py ## - -Defines a class IaTransaction(), which supports splitting up a request and releated response, plus some timing and routing details. - -*Unit testing is in test/test\_cplib\_modbus\_trans\_modbus.py* - -## File: transaction\_modbus.py ## - -Subclasses IaTransaction() as ModbusTransaction(). - -You can use as follows: - -* create the ModbusTransaction() -* call obj.set\_request(data, 'mbtcp'), which causes the Modbus/TCP request to be parsed into the raw Modbus/ADU format. -* call obj.get\_request(data, 'mbrtu'), which causes the raw Modbus/ADU data to be recombined to be Modbus/RTU. - -The set\_response()/get\_response() work in the same manners, so obj.set\_response(data, 'mbrtu') would break up the RTU response, and obj.get\_response(data, 'mbtcp') would reform as Modbus/TCP, including the correct header adjustments. - -*Unit testing is in test/test\_cplib\_modbus\_trans\_modbus.py* - -## File: modbus\_asc.py ## - -The checksum, encode/decode, and end-of-message routines for Modbus/ASCII. - -*Unit testing is in test/test\_cplib\_modbus\_asc.py* - -## File: modbus\_rtu.py ## - -The checksum, encode/decode, and end-of-message routines for Modbus/RTU. Since RTU lacks any formal 'length' test, it also includes routines to estimate size based on Modbus command form. - -*Unit testing is in test/test\_cplib\_modbus\_rtu.py* - -## File: modbus\_tcp.py ## - -The checksum, encode/decode, and end-of-message routines for Modbus/TCP. - -*Unit testing is in test/test\_cplib\_modbus\_tcp.py* \ No newline at end of file diff --git a/cp_lib/readme.md b/cp_lib/readme.md deleted file mode 100644 index ee0409e8..00000000 --- a/cp_lib/readme.md +++ /dev/null @@ -1,130 +0,0 @@ -# Lynn's Sample Design - -Any sample in the system must be created from a sample template. Example templates: - -- Single Temperature Value, with Deg F as unit of measure -- An average Temperature, with an attached time period - such as the average temperature in degree F for the hour from -2:00PM to 2:59PM -- The min/max/avg Temperature, with an attached time period -- The temperatures can be define as +/- 0.5 (so like 70 F only), or like +/- 0.1 (so like 70.2 F), which allows more -accurate packing for transport as XML or JSON. - -This allows more flexible samples data, for example the template can include the ability to convert deg C to deg F. -Assuming the sample includes a reference to the template (instead of the units string), the individual instance -samples are no larger than the old DIA form - -# Files: - -## DataCore -data_core.py holds the base object, and is the tree/handle node for the object. It has no real data, but does include the child/tree structures. It includes attributes: - -- [**data\_name**]: str, is the NON-unique name for this object - example 'level' or 'outdoor', which may be used by other objects -- [**class**]: str, defines how the object can be processed -- [**index**]: int, a simple unique counting number, but the value MAY vary between runs. Technically, it is the order the objects are created during the current run-time. -- [**path**]: str, is the unique name such as 'tank01.level' -- **PATH_SEP**:str, is the symbol used within the path. Default is '.' to avoid the special meanings of a '/' or '\'. -- [**role**]: str, is a subset of 'class', allowing shared processing handlers - -Special internal values include: - -- **\_parent**: DataCore, handle of my parent instance -- **\_children\_list**: list, an unordered list of DataCore objects -- **\_children\_keyed**: dict, keyed on the data_name, so for example in the path example above, the node 'tank01' would have a child named 'level' -- **\_private**: bool, if True, then this is an internal hidden node -- **\_template**: None or DataTemplate reference, is a special shared handler used to, for example, allow a dozen data objects to 'share' data validation and/or alarm processing. - -## DataObject -data_object.py holds the next higher level of data, which are constrained to a specific list of types, including: - -- **base**: *DataObject*, with no data, but might be a parent/container for children. For example a 'tank' may have no data, as one needs to look at the 'level' or 'empty_alert' children. -- **string**: *StringObject* with a user-friendly UTF8 string value, with no other encoding or meaning. For example, a 'tank' may have a contents such as 'aviation fuel grade 2'. -- **digital**: *BooleanObject* is a True/False object with optional alarm handling. -- **analog**: *NumericObject* is a float which may include optional precision filters to force to int or X.0, etc. There is no true in, since most (all?) system input/output shall be JSON, which has a common 'numeric'. -- **gps**: *GpsObject* is a special case object, It rarely will be used by itself, but can be used to 'tag' data samples tied to a GPS locations, such as a police car's lightbar being turned True/On at a specific location and time. - -A base DataObject has the common attributes shared by ALL the other DataObjects, including these static values: - -- [**data\_name**]: *str*, is unique to the 'parent' collection of children. This may NOT the same name as the DataCore's ['data_name']. It is 'indexable', so not UTF8. -- [**display\_name**]: *UTF8*, user-defined display name, without constraints or rules. -- [**description**]: *UTF8*, user-defined descriptive string, without constraints or rules. -- [**display\_color**]: DataColor, has no value in Router, but can be used to manage font & back ground color in simple web or UI displays. The DataColor is a common HTML/CSS sRGB tuple -- [**font\_size**]: float, a simple scaling in (50%, 75%, 100%, 125%, 150%). It is NOT intended to format web pages, but to compensate for UTF8 character sets which may appear unusually small or large on a traditional English-oriented UI. -- [**data\_type**]: str, selects the type, such as digital or analog. -- [**value\_type**]: type, Python info about the data value. -- [**failsafe**]: ??, the startup or fault value - a 'safe' value when the true value is unknown. -- [**attach\_gps**]: bool, T/F, if DataSample time-series data should have GPS info attached. Default is False, so do not attach. -- [**read\_only**]: bool, T/F, if DataObject should not change in real-time. - -The following values may be dynamic: - -- [**value**]: DataSample, None or the appropriate data value. -- [**source**]: ??, defines the source of non-read\_only data. -- [**owner\_token**]: str, a user-defined 'lock' to writing of new data values. -- [**health**]: float, 0-100% for data health. - -## StringObject -See **StringAttributeHandler** in data_attribute.py. A StringObeject has no data attributes, but the [**value**] attribute will be a UTF8 user-friendly string. Many strings will be read\_only, however some might outputs from various real-time state machines such as "I/O is within expected range" or "I/O is wildly bad". - -## DigitalObject -See **BooleanAttributeHandler** in data_attribute.py. A DigitalObeject adds the following attributes. - -- [**display\_name\_true**]: *UTF8*, user-defined display 'tag' which matches [value] = True. For example, it might be 'normal', 'open', or 'snowing'. -- [**display\_name\_false**]: *UTF8*, like [display\_name\_true], but when [value] = False. For example, it might be 'too hot', 'closed', or 'sunny'. -- [**display\_color\_true**]: DataColor, how to display [value] when True. The DataColor is a common HTML/CSS sRGB tuple, and perhaps the background should be white when True, and red when False. -- [**display\_color\_false**]: DataColor, like [display\_color\_true], but when [value] is False. -- [**invert**]: bool, T/F if any 'set' of [value] should be inverted. Default is False or not-present, so no inversion. -- [**abnormal\_when**]: bool, when [value] matches this value, then based upon the application context, this data object is abnormal, in alarm, or not-as-desired. *Note that this does NOT drive alarms or alerts!* It is instead a HINT which helps a consuming-agent to understand good-verse-bad states. Default is False or not-present. -- [**auto\_reset**]: bool, defines if 'repeated' data is new or old. For example, the source defines a new *restart = True* event, when the existing value is True. If auto\_reset is False (default), then the 'repeat' is treated as a redundant or refresh, so may not propagate. If auto\_reset is True, then the 'repeat' is treated as new data and propagated. -- [**delay\_t\_f**]: numeric, seconds to delay (or debounce) a transition from True to False. For example, you might want a door-closed value = True to remain True unless the door is open longer than 10 seconds. -- [**delay\_f\_t**]: numeric, like [delay\_t\_f], but when [value] = False, delay going True. -- TBD - add time of last go-true and last go-false? - -## NumericObject -See **NumericAttributeHandler** in data_attribute.py. A NumericObject adds the following attributes. - -- [**uom**]: *UTF8*, user-defined unit-of-measure such as 'F' or 'miles'. -- TBD - add min/max/avg option? - -## GpsObject -See **GpsAttributeHandler** in data_attribute.py. A GpsObject adds the following attributes (* TBD *). I am still considering. It needs to include the GPS health, as well as lat/long, possibly speed & others. - -## DataTemplate -data_template.py holds shared objects for use with DataObjects and DataSamples. The template does 2 basic functions: - -1. supplies a shared template, such as 'uom' (unit-of-measure) as Gallons for 10 different tank.level DataObjects and related DataSamples. -2. includes a process_value() function which validates a new data value is of the correct type, within permitted ranges, and rounded to a reasonable precision. - -Each DataCore instance can contain a reference to a DataTemplate, although the values are usually copied out into the Data object. For example, if the template has a analog 'failsafe' of 999, this will be copied to the failsafe of a AnalogObject. This means changes to the Template may (TBD) need to manually updated in objects. - -Each DataSample instance also can contain a reference to a DataTemple, and is generally treated as an active helper. For example, if the template has a 'uom' of 'F', this will be fetched on-demand to create a JSON record for export or display. This means changes to the Template automatically cause changes going forward - such as changign a temperature from 'F' to 'C'. - -## DataSample -data_sample.py holds granular time-series data attached to a DataObject. For example, a DigitalObject named 'back\_door' might have a current status, which is False/'open', but it might also hold the last 10 times the door was opened or closed as a small history. These 10 values are called Data Samples, and include these attributes: - -- [**value**] required, is the data value of an appropriate type, such as True or 73.45. -- [**timestamp**] required, is the UTC time() of the data recorded. -- [**quality**] optional, is a numeric bit-mask of status, such as disabled, low-alarm, go-abnormal, and so on. If missing, it is assumed quality is valid. -- **get_uom()** optional, and fetches a UTF8 string from a template. In a JSON sample this will be ['uom']. For Digital data, this will return the appropriate 'display_name_true' or 'display_name_false'. For string or GPS data, it returns None. -- **get_gps()** optional, and fetches ... something (TBD). Returns None if GPS data is not being attached, else it maybe a JSON sub-item or CSV. Format to TBD. -- TBD - how to handle a **stats min/max/avg** value? Is it just a 3-item tuple? - -## DataColor -data_color.py holds a standard HTML/CSS color or color-pair. Generally this is assumed to be what's called CSS3 (see [http://www.w3.org/TR/css3-color/](http://www.w3.org/TR/css3-color/ "CSS Color Module Level 3")). - -It uses the PyPi WebColors module, so can be set with far greater flexibility than I expected to be used! (see [http://pypi.python.org/pypi/webcolors/](http://pypi.python.org/pypi/webcolors/ "webcolors 1.5"). - -In general, it assumes the colors are set via string values, such as 'orchid' or '#da70d6'. Internally, the values will be retained as numeric, but you can fetch the vales as HEX strings, or as CSS3 names if there is a match. Given the flexibility of the Python webcolors module, it should be fairly easy to extend it to handle other notations like RGB percentages. - -A DataColor value can be one of three things: - -- **None**, which means no-effect or as default. -- a **single value**, which is assumed the BACKGROUND value, with the fore/font color remaining as default. So for example, a data value might have background colors of 'green', 'yellow', or 'red' based on an alarm status, always assuming the font remains default such as 'black'. -- a **2-value tuple**, which is assumed (BACKGROUND, FONTCOLOR) such as ('white','navy') for Navy blue text on a white background. - -The router generally ignores a DataColor, but it will be used for any local UI or when sent for remove UI display. - -## DataSetting (TBD) -data_setting.py are special DataObjects which are intended to be saved and restored between runs. - -## DataAlarm (TBD) -data_alarm.py are special filtering processors which validate changes in DataObjects. diff --git a/cp_lib/simple_data.py b/cp_lib/simple_data.py deleted file mode 100644 index 7d187362..00000000 --- a/cp_lib/simple_data.py +++ /dev/null @@ -1,59 +0,0 @@ -import time - -import cp_lib.data.quality as qual - - -class SimpleData(object): - - def __init__(self, value=None, uom=None, now=None, quality=None): - self.value = None - self.unit = None - self.time = None - self.quality = None - - if value is not None: - self.set_value(value, uom, now, quality) - return - - def __repr__(self): - """ - make a fancy string output - :return: - """ - st = str(self.value) - - if self.unit is not None: - st += ' (' + self.unit + ')' - - if self.quality is not None and self.quality != qual.QUALITY_GOOD: - st += ' !Quality:%s' % qual.all_bits_to_tag(self.quality) - - if self.time is not None: - st += ' (%s)' % time.strftime("%Y-%m-%d %H:%M:%S", - time.localtime(self.time)) - return st - - def set_value(self, value, uom=None, now=None, quality=None): - """ - Set the value, with time and quality - - :param value: - :param str uom: - :param float now: - :param int quality: - :return: - """ - self.value = value - self.unit = uom - - if now is None: - self.time = time.time() - else: - self.time = now - - if quality is None: - self.quality = qual.QUALITY_GOOD - else: - self.quality = (qual.QUALITY_GOOD | quality) - - return diff --git a/cp_lib/status_tree_data.py b/cp_lib/status_tree_data.py deleted file mode 100644 index 5c71dcb8..00000000 --- a/cp_lib/status_tree_data.py +++ /dev/null @@ -1,244 +0,0 @@ -""" -Read/Write our data in status tree ( /status/system/sdk/apps[0] ) -""" -import json - -from cp_lib.app_base import CradlepointAppBase - - -class StatusTreeData(object): - - def __init__(self, app_base): - """ - - :param CradlepointAppBase app_base: resources: logger, settings, etc - """ - assert isinstance(app_base, CradlepointAppBase) - self.base = app_base - - # start out, we don't know our data - self.slot = None - self.uuid = None - - self.data = dict() - self.clean = False - return - - @staticmethod - def get_url_sdk(): - """Return the URL in status tree for full SDK data""" - return "status/system/sdk" - - def get_url_app_slot(self): - """Return the URL for one specific APPS within status tree""" - return "status/system/sdk/apps/{}".format(self.slot) - - def get_url_app_data(self): - """Return URL for one specific APPS['usr_data'] within status tree""" - return "status/system/sdk/apps/{}/usr_data".format(self.slot) - - def set_uuid(self, uuid): - """ - - :param uuid: the UUID to locate our apps[] slot - """ - assert isinstance(uuid, str) - - result = self.base.cs_client.get(self.get_url_sdk()) - if not isinstance(result, dict): - raise ValueError("SDK status tree not valid") - - # tree always has at least 'apps': [] (empty list) - if 'apps' not in result: - raise KeyError("SDK status tree, lacks ['apps'] data") - - if len(result['apps']) < 1: - raise ValueError("No APPS installed in SDK status tree") - - # force back to None - self.slot = None - self.uuid = None - - try_index = 0 - for app in result['apps']: - if "_id_" in app: - data = string_list_status_apps(try_index, app) - for line in data: - self.base.logger.debug("{}".format(line)) - if uuid == app["_id_"]: - self.slot = try_index - break - - try_index += 1 - - if self.slot is None: - # then NOT found! - raise ValueError("UUID is not installed on router!") - - self.base.logger.debug("Found UUID in ['apps'][{}]".format(self.slot)) - self.uuid = uuid - return - - def set_data_value(self, tag, value): - """ - Set some value into our data block - - :param str tag: - :param value: - :return: - """ - if tag in self.data: - # then already here - if self.data[tag] == value: - # no change - return False - - self.data[tag] = value - self.clean = False - return True - - def clear_data(self): - """ - Delete our data from router, start clean with nothing here - - :return: - """ - result = self.base.cs_client.delete(self.get_url_app_data()) - self.base.logger.debug("DATA={}".format(result)) - self.data = dict() - self.clean = True - return True - - def get_data(self): - """ - Set some value into our data block - - :return: - """ - result = self.base.cs_client.get(self.get_url_app_data()) - if result is None: - self.base.logger.debug("DATA is empty") - self.data = dict() - else: - self.data = result - self.base.logger.debug("DATA={}".format(result)) - return True - - def put_data(self, force=False): - """ - Set some value into our data block - - :param bool force: if T, write even if self.Clean - :return: - """ - if force or not self.clean: - # then need to write our data - if self.data is None: - # then remove ['apps'][slot] from router - raise NotImplementedError - - elif len(self.data) == 0: - # then is empty item - result = self.base.cs_client.put( - self.get_url_app_data(), "{}") - - else: - # else has some data - data = json.dumps(self.data) - result = self.base.cs_client.put( - self.get_url_app_data(), data) - - self.base.logger.debug("RSP={}".format(result)) - self.clean = True - - return True - - -def string_list_status_apps(index, one_app, all_data=False): - """ - Given STATUS return from Router, Make a list of strings to show ONE - entry in APPS array value: - { - "_id_": "ae151650-4ce9-4337-ab6b-a16f886be569", - "app": { - "date": "2016-04-15T21:58:30Z", - "name": "do_it", - "restart": false, - "uuid": "ae151650-4ce9-4337-ab6b-a16f886be569", - "vendor": "Sample Code, Inc.", - "version_major": 1, - "version_minor": 0 - }, - "state": "stopped", - "summary": "Stopped application", - "type": "developer" - } - - Results in the following lines - SDK APP[0] Name:do_it - SDK APP[0] State:stopped - SDK APP[0] Summary:Stopped application - SDK APP[0] Date:2016-04-15T21:58:30Z - SDK APP[0] Version:1.0 - SDK APP[0] UUID:ae151650-4ce9-4337-ab6b-a16f886be569 - - This does NOT enumerate through the APPS list - - :param int index: the index in ['apps'] - :param dict one_app: one entry in the array - :param bool all_data: if T, include RESTART and VENDOR, else ignore - :return list: - """ - result = [] - - app_tag = "SDK APP[%d]" % index - - if '_id_' in one_app: - result.append( - "{0} UUID:{1}".format(app_tag, one_app['_id_'])) - - if 'state' in one_app: - result.append( - "{0} State:{1}".format(app_tag, one_app['state'])) - - if 'summary' in one_app: - result.append( - "{0} Summary:{1}".format(app_tag, one_app['summary'])) - - if 'app' in one_app: - # only if the app is named - note that as of FW 6.1.2, we might have - # 'extra' entries for failed actions. So we need to support un-named - # apps. Example: trying to install 'too many' apps leaves the failure - # as 2nd entry, without name, date, etc. - if 'name' in one_app["app"]: - # only if the app is named - result.append( - "{0} Name:{1}".format(app_tag, one_app['app']['name'])) - - if 'date' in one_app["app"]: - result.append( - "{0} Date:{1}".format(app_tag, one_app['app']['date'])) - - if 'version_major' in one_app["app"]: - result.append("{0} Version:{1}.{2}".format( - app_tag, one_app['app']['version_major'], - one_app['app']['version_minor'])) - - if all_data: - # then include all data - if 'type' in one_app: - result.append( - "{0} type:{1}".format(app_tag, - one_app['type'])) - - if 'restart' in one_app["app"]: - result.append( - "{0} Restart:{1}".format(app_tag, - one_app['app']['restart'])) - - if 'vendor' in one_app["app"]: - result.append( - "{0} Vendor:{1}".format(app_tag, - one_app['app']['vendor'])) - - return result diff --git a/cp_lib/time_period.py b/cp_lib/time_period.py deleted file mode 100644 index a54a3be5..00000000 --- a/cp_lib/time_period.py +++ /dev/null @@ -1,418 +0,0 @@ - -import threading -import time - - -class TimePeriods(threading.Thread): - """ - Allow classes to obtain a callback at predictable time periods, - such as every hour - - To reduce load, the minimum 'period' default is every 5 seconds. - 1 second is perhaps overly 'heavy' - """ - - # for now, this MUST be in set (2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60) - # so one/1 is not supported - MINIMUM_PERIOD = 5 - - HANDLE_GARBAGE_COLLECTION = True - - # adds a variable skew seconds to avoid concurrence at midnight on - # first date of month, when - # callbacks for per-hour, per-day, and per-month would all fire - SKEW_MINUTE = 3 - SKEW_HOUR = 17 - SKEW_DAY = 33 - SKEW_MONTH = 47 - SKEW_YEAR = 51 - - NAME_MINUTE = 'min' - NAME_HOUR = 'hr' - NAME_DAY = 'day' - NAME_MONTH = 'mon' - NAME_YEAR = 'yr' - NAME_LIST = (NAME_MINUTE, NAME_HOUR, NAME_DAY, NAME_MONTH, NAME_YEAR) - - def __init__(self): - - # enforce our basic design rules, which allow some basic assumptions - assert isinstance(self.MINIMUM_PERIOD, int) - # we don't support 1! - assert 1 < self.MINIMUM_PERIOD <= 60 - assert is_valid_clean_period_seconds(self.MINIMUM_PERIOD) - - super().__init__(name="TimePeriods", daemon=True) - - # the event starts as False (per specs) - self.shutdown_requested = threading.Event() - - # create a semaphore lock to detect when callbacks take too long! - self._busy = threading.Lock() - self._over_run = 0 - self._good_run = 0 - - # here is our shared values - self.now = time.time() - self.now_struct = time.gmtime(self.now) - - # these will be our 'period lists' - pass in 'self' to allow - # the periods to interact - self.per_minute = self.OnePeriod(self) - self.per_hour = self.OnePeriod(self) - self.per_day = self.OnePeriod(self) - self.per_month = self.OnePeriod(self) - self.per_year = self.OnePeriod(self) - - # now that ALL exist, assign each one a period name (a 'role') - self.per_minute.set_period_name(self.NAME_MINUTE) - self.per_hour.set_period_name(self.NAME_HOUR) - self.per_day.set_period_name(self.NAME_DAY) - self.per_month.set_period_name(self.NAME_MONTH) - self.per_year.set_period_name(self.NAME_YEAR) - - # assume set externally (or run() handles) - self.logger = None - - return - - def run(self): - """ - The THREAD main run loop: - - Check the time - - update the shared struct_time - - call any callbacks - """ - - if self.logger is None: - self.logger = get_project_logger() - assert self.logger is not None - - while True: - - if self.shutdown_requested.is_set(): - # then we are to STOP running - break - - self.now = time.time() - self.now_struct = time.gmtime(self.now) - - # reschedule NEXT callback - assert isinstance(self.now_struct, time.struct_time) - next_delay = next_seconds_period(self.now_struct.tm_sec, - self.MINIMUM_PERIOD) - if next_delay < 1: - # avoid it ever being zero/0 - next_delay = 1 - - if not self._busy.acquire(False): - # then we had an over-run! - self._over_run += 1 - self.logger.warning( - "TimePeriod over-run #{0}( or {1}%)".format( - self._over_run, self._over_run / self._good_run) + - "; call backs taking too long") - - else: - self._good_run += 1 - - # do the callbacks - self.per_minute.check_callbacks(self.now_struct) - - self._busy.release() - - self.logger.debug("Sleep for %d sec" % int(next_delay)) - time.sleep(next_delay) - - return - - def add_periodic_callback(self, cb, period: str): - return - - class OnePeriod(object): - - def __init__(self, parent): - - self._parent = parent - - self.cb_list = [] - self.cb_list_skewed = [] - self.last_seen = 0 - self.do_skewed = False - - # these are fixed by a subsequent set_period_name() call - self._get_my_value = lambda x: x - self.period_name = None - self.my_sub = None - self.skew_seconds = 0 - return - - def __repr__(self): - return "Period:%03s cb:%d skewed:%d" % (str(self.period_name), - len(self.cb_list), - len(self.cb_list_skewed)) - - def get_name(self): - return self.period_name - - def set_period_name(self, name: str): - - if name not in TimePeriods.NAME_LIST: - raise ValueError( - "Period name({0}) is invalid; must be in {1}.".format( - name, TimePeriods.NAME_LIST)) - - self.period_name = name - - assert isinstance(self._parent, TimePeriods) - - if self.period_name == TimePeriods.NAME_MINUTE: - self._get_my_value = lambda x: x.tm_min - self.skew_seconds = TimePeriods.SKEW_MINUTE - self.last_seen = self._parent.now_struct.tm_min - self.my_sub = self._parent.per_hour - assert isinstance(self.my_sub, TimePeriods.OnePeriod) - - elif self.period_name == TimePeriods.NAME_HOUR: - self._get_my_value = lambda x: x.tm_hour - self.skew_seconds = TimePeriods.SKEW_HOUR - self.last_seen = self._parent.now_struct.tm_hour - self.my_sub = self._parent.per_day - assert isinstance(self.my_sub, TimePeriods.OnePeriod) - - elif self.period_name == TimePeriods.NAME_DAY: - self._get_my_value = lambda x: x.tm_mday - self.skew_seconds = TimePeriods.SKEW_DAY - self.last_seen = self._parent.now_struct.tm_mday - self.my_sub = self._parent.per_month - assert isinstance(self.my_sub, TimePeriods.OnePeriod) - - elif self.period_name == TimePeriods.NAME_MONTH: - self._get_my_value = lambda x: x.tm_mon - self.skew_seconds = TimePeriods.SKEW_MONTH - self.last_seen = self._parent.now_struct.tm_mon - self.my_sub = self._parent.per_year - assert isinstance(self.my_sub, TimePeriods.OnePeriod) - - elif self.period_name == TimePeriods.NAME_YEAR: - self._get_my_value = lambda x: x.tm_year - self.skew_seconds = TimePeriods.SKEW_YEAR - self.last_seen = self._parent.now_struct.tm_year - self.my_sub = None # YEAR has no next period - - # else: already handled up ub if name not in ... test - - return - - def add_callback(self, cb, skewed=False): - """ - - :param cb: - :param skewed: - :return: - """ - # make sure we're not adding 'twice' - remove any existing - self.remove_callback(cb) - - if skewed: - self.cb_list_skewed.append(cb) - else: - self.cb_list.append(cb) - return - - def remove_callback(self, cb): - """ - - :param cb: - :return: - """ - if cb in self.cb_list: - self.cb_list.remove(cb) - - if cb in self.cb_list_skewed: - self.cb_list_skewed.remove(cb) - return - - def period_has_changed(self, now_tuple): - """Use our 'lambda' to check is our internal last-seen - implied period change""" - return self.last_seen != self._get_my_value(now_tuple) - - def check_callbacks(self, now_tuple: time.struct_time): - """ - Handle the various per callbacks this period (if any) - """ - if self.period_has_changed(now_tuple): - # then period has changed - self.last_seen = self._get_my_value(now_tuple) - if len(self.cb_list_skewed) > 0: - self.do_skewed = True - - # do the non-skewed callbacks - self.process_callbacks(now_tuple) - - if self.my_sub is not None and \ - self.my_sub.period_has_changed(now_tuple): - # then chain to our sub - for per_year, this is still None - self.my_sub.check_callbacks(now_tuple) - - return - - def process_callbacks(self, now_tuple: time.struct_time, skewed=False): - """ - Handle the various per callbacks this period (if any) - """ - if skewed: - use_list = self.cb_list - else: - use_list = self.cb_list_skewed - - for cb in use_list: - try: - cb(now_tuple) - except: - # self.logger.error("PerMinute CB failed") - raise - return - -""" -What are CLEAN PERIODS? That are time slices which allow predictable -periodic repeats within scope of the next larger (encapsulating) time period. - -For example, doing something every 12 seconds allows 5 periods per 1 minute -(minutes being the next larger time periods encapsulating seconds. However, -doing something every 8 or 13 seconds does NOT support this. - -For example, doing something very 3 hours allows 8 periods per 1 day, -whereas doing something every 5 hours does NOT support such clean periods. -""" - -_CLEAN_PERIOD_SEC_MIN = (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60) -CLEAN_PERIOD_SECONDS = _CLEAN_PERIOD_SEC_MIN -CLEAN_PERIOD_MINUTES = _CLEAN_PERIOD_SEC_MIN -CLEAN_PERIOD_HOURS = (1, 2, 3, 4, 6, 8, 12, 24) - -_CLEAN_ROUNDUP_SEC_MIN = { - 2: (0, 2, 4, 6, 8, ), - 3: (0, 3, 6, 9, 12, ) -} - - -def is_valid_clean_period_seconds(value: int): - """ - Given a number of seconds, detect if it is in the correct set - for clean periods, such that doing - something every 'X' seconds allows predictable repeats each minute. - - Example: doing something every 12 seconds allows 5 'clean periods' - per minute, but doing something - every 13 seconds does NOT allow such 'clean periods' - - :param value: the number of seconds (zero-based, not time.time() form! - :rtype: bool - """ - return int(value) in CLEAN_PERIOD_SECONDS - - -def is_valid_clean_period_minutes(value: int): - """ - Given a number of minutes, detect if it is in the correct set - for clean periods, such that doing - something every 'X' minutes allows predictable repeats each hour. - - Example: doing something every 12 minutes allows 5 'clean periods' - per hour, but doing something - every 13 minutes does NOT allow such 'clean periods' - - :param value: the number of minutes (zero-based, not time.time() form! - :rtype: bool - """ - return int(value) in CLEAN_PERIOD_MINUTES - - -def is_valid_clean_period_hours(value: int): - """ - Given a number of hours, detect if it is in the correct set for - clean periods, such that doing - something every 'X' hours allows predictable repeats each day. - - Example: doing something every 3 hours allows 8 'clean periods' - per day, but doing something - every 5 hours does NOT allow such 'clean periods' - - :param value: the number of hours (zero-based, not time.time() form! - :rtype: bool - """ - return int(value) in CLEAN_PERIOD_HOURS - - -def next_seconds_period(source: int, period: int): - """ - Given a time as seconds, return next clean period start. For - example, if source=37 and period=15 (secs), then return 45. - - To know the delta to next period, use delay_to_next_seconds_period() - instead (so 45 - 37 = 8) - - If 60 is returned, then should be NEXT minute or hour (aka: next '0') - Also, the input does NOT have to be < 60, so input 292 returns 300, - and the caller needs to handle any side effects of this. - - :param source: the time as seconds (or minutes) - :param period: the desired clean period - :return: the nex period as sec/minutes - :rtype: int - """ - # this is same for seconds and minutes - assert period in _CLEAN_PERIOD_SEC_MIN - # assert 0 <= source <= 60 - - if period == 1: - # special case #1 - if period is 1, then value is as desired - # (no round up ever) - return source - - # we divide and allow truncation (round-down) So 17 / '5 sec' period = 3 - # (// is special integer division) - value = source // period - - # multiple means 3 * 5 = 15 - value *= period - - # if source % period != 0: - # then add in 1 more period make it 20, which is correct answer - value += period - - return value - - -def next_minutes_period(source: int, period: int): - """ - See docs for next_second_period() - function is the same - - :rtype: int - """ - return next_seconds_period(source, period) - - -def delay_to_next_seconds_period(source: int, period: int): - """ - Given a time as seconds, return HOW MANY seconds to delay to reach - start of next clean period start. - - :return: the seconds to reach start of next clean period start - :rtype: int - """ - next_period = next_seconds_period(source, period) - return next_period - source - - -def delay_to_next_minutes_period(source: int, period: int): - """ - See docs for delay_to_next_seconds_period() - function is the same - - :rtype: int - """ - # both minutes & seconds work the same - next_period = next_seconds_period(source, period) - return next_period - source diff --git a/cp_lib/time_until.py b/cp_lib/time_until.py deleted file mode 100644 index b1756b33..00000000 --- a/cp_lib/time_until.py +++ /dev/null @@ -1,89 +0,0 @@ -import time - - -VALID_NICE_SECOND_PERIODS = (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60) -VALID_NICE_MINUTE_PERIODS = (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60) -VALID_NICE_HOUR_PERIODS = (1, 2, 3, 4, 6, 8, 12, 24) - - -def seconds_until_next_hour(now=None): - """ - How many seconds until next hour - - :param now: - :return: - """ - now = _prep_time_now(now) - - # how many second until next minute - delay = 60 - now.tm_sec - - # add how many seconds until next hour - delay += (60 - now.tm_min) - - return delay - - -def seconds_until_nice_minute_period(period, now=None): - """ - How many seconds until next minute, when now.tm_sec == 0 - - :param int period: must be in set VALID_NICE_MINUTE_PERIODS - :param now: - :return int: - """ - now = _prep_time_now(now) - - return 60 - now.tm_sec - - -def seconds_until_next_minute(now=None, fudge=2): - """ - How many seconds until next minute, when now.tm_sec == 0 - - :param now: - :param int fudge: to avoid too short of delays, a fudge=2 means when tm_sec > 58, go to NEXT minute (62 seconds) - :return int: - """ - now = _prep_time_now(now) - - if fudge > 0 and (60 - now.tm_sec) <= fudge: - # then round up to next hour - return (60 - now.tm_sec) + 60 - - return 60 - now.tm_sec - - -def seconds_until_nice_second_period(period, now=None): - """ - How many seconds until next seconds period (like 15 means hh:00, hh:15, hh:30, hh:45) - - :param int period: must be in set VALID_NICE_SECOND_PERIODS - :param now: - :return int: - """ - if period not in VALID_NICE_SECOND_PERIODS: - raise ValueError("{} seconds is not valid NICE SECONDS period".format(period)) - - now = _prep_time_now(now) - - return 60 - now.tm_sec - - -def _prep_time_now(now=None): - """ - make sure now is struct_time - - :param now: optional source value - :rtype: time.struct_time - """ - if now is None: - # if none provided, get NOW - now = time.time() - - if not isinstance(now, time.struct_time): - # if now isn't float or suitable, then will throw exception - now = time.localtime(now) - - assert isinstance(now, time.struct_time) - return now diff --git a/data/jsonrpc_settings/README.md b/data/jsonrpc_settings/README.md deleted file mode 100644 index 8f41b5dc..00000000 --- a/data/jsonrpc_settings/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# directory: ./network/simple_jsonrpc -## Router App/SDK sample applications - -A most basic JSON RPC server, using the standard Python 3 SocketServer - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: jsonrpc_server.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [jsonrpc]: - -* host_port=9001, define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. -Also, avoid 8001 or 8080, as router may be using already. - -## File: images - -* The ones named "digit_1.jpg" (etc) are 550x985 - -* are 190x380 (to fit in 200x400 cell? diff --git a/data/jsonrpc_settings/__init__.py b/data/jsonrpc_settings/__init__.py deleted file mode 100644 index 38c22ddd..00000000 --- a/data/jsonrpc_settings/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from data.jsonrpc_settings.jsonrpc_server import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/data/jsonrpc_settings/client.py b/data/jsonrpc_settings/client.py deleted file mode 100644 index 822fb5bb..00000000 --- a/data/jsonrpc_settings/client.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Simple client to run against jsonrpc_server.py -""" -import json -import socket -import sys -import time - -from cp_lib.app_base import CradlepointAppBase -# import cp_lib.data.json_get_put as json_get_put - -# avoid 8080, as the router may have service on it. -DEF_HOST_PORT = 9901 -DEF_HOST_IP = "localhost" - - -def run_client(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - - tests = [ - {"path": "logging.level", "exp": "debug"}, - {"path": "router_api.user_name", "exp": "admin"}, - {"path": "application.firmware", "exp": "6.1"}, - {"path": "application.restart", "exp": "true"}, - - {"path": "router_api", "exp": "admin"}, - ] - - for test in tests: - data = {"jsonrpc": "2.0", "method": "get_setting", - "params": {"path": test["path"]}, "id": 1} - - # then convert to JSON string - data = json.dumps(data).encode() - - app_base.logger.debug("Sent:{}".format(data)) - - server_address = (DEF_HOST_IP, DEF_HOST_PORT) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - try: - # Connect to server and send data - sock.connect(server_address) - sock.sendall(data) - - # Receive data from the server and shut down - received = str(sock.recv(1024), "utf-8") - finally: - sock.close() - - received = json.dumps(received) - - app_base.logger.debug("Recv:{}".format(received)) - - time.sleep(1.0) - - return 0 - - -def do_one_get(app_base, data): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param data: the data - :type data: str or dict or bytes - :return: - """ - if isinstance(data, dict): - # then convert to JSON string - data = json.dumps(data) - - if isinstance(data, str): - # then convert to JSON string - data = data.encode('utf-8') - - app_base.logger.debug("Sent:{}".format(data)) - - server_address = (DEF_HOST_IP, DEF_HOST_PORT) - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - try: - # Connect to server and send data - sock.connect(server_address) - sock.sendall(data) - - # Receive data from the server and shut down - received = str(sock.recv(1024), "utf-8") - finally: - sock.close() - - app_base.logger.debug("Recv:{}".format(received)) - - return json.loads(received) - - -if __name__ == "__main__": - - my_app = CradlepointAppBase("data/jsonrpc_settings") - _result = run_client(my_app) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/data/jsonrpc_settings/jsonrpc_server.py b/data/jsonrpc_settings/jsonrpc_server.py deleted file mode 100644 index c1f92876..00000000 --- a/data/jsonrpc_settings/jsonrpc_server.py +++ /dev/null @@ -1,181 +0,0 @@ -""" -A basic but complete echo server -""" - -import socketserver -import threading -import time - -import cp_lib.data.json_get_put as json_get_put -from cp_lib.app_base import CradlepointAppBase - -# avoid 8080, as the router may have service on it. -DEF_HOST_PORT = 9901 -DEF_HOST_IP = "" - -# hold the CradlepointAppBase for access by the TCP handler -my_base = None - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - global my_base - - my_base = app_base - - my_server = JsonServerThread('Json', app_base) - my_server.start() - - # we need to block the main thread here, because this sample is running - # a SECOND thread for the actual server. This makes no sense in a pure - # sample-code scenario, but doing it this way does allow you to - # import & run the class JsonServerThread() from another demo app - # which requires multiple threads - such as my Counter demo which - # requires both a web server AND a JSON RPC server as 2 threads. - try: - while True: - time.sleep(15.0) - - except KeyboardInterrupt: - app_base.logger.info("Stopping Server, Key Board interrupt") - - return 0 - - -class JsonServerThread(threading.Thread): - - def __init__(self, name, app_base): - """ - prep our thread, but do not start yet - - :param str name: name for the thread - :param CradlepointAppBase app_base: prepared resources: logger, etc - """ - threading.Thread.__init__(self, name=name) - - self.app_base = app_base - self.app_base.logger.info("started INIT") - - return - - def run(self): - """ - Now thread is being asked to start running - """ - if "jsonrpc" in self.app_base.settings: - host_port = int(self.app_base.settings["jsonrpc"].get( - "host_port", DEF_HOST_PORT)) - - host_ip = self.app_base.settings["jsonrpc"].get( - "host_ip", DEF_HOST_IP) - else: - # we create, so WebServerRequestHandler can obtain - self.app_base.settings["jsonrpc"] = dict() - - host_port = DEF_HOST_PORT - self.app_base.settings["jsonrpc"]["host_port"] = host_port - - host_ip = DEF_HOST_IP - self.app_base.settings["jsonrpc"]["host_ip"] = host_ip - - # we want on all interfaces - server_address = (host_ip, host_port) - - self.app_base.logger.info("Starting Server:{}".format(server_address)) - - server = socketserver.TCPServer(server_address, MyHandler) - - # Activate the server; this will keep running until you - # interrupt the program with Ctrl-C - try: - server.serve_forever() - - except KeyboardInterrupt: - self.app_base.logger.info("Stopping Server, Key Board interrupt") - - def please_stop(self): - """ - Now thread is being asked to start running - """ - raise NotImplementedError - - -class MyHandler(socketserver.BaseRequestHandler): - """ - The RequestHandler class for our server. - - It is instantiated once per connection to the server, and must - override the handle() method to implement communication to the - client. - """ - - def handle(self): - """ - Handle a TCP packet - :return: - """ - global my_base - - # self.request is the TCP socket connected to the client - message = self.request.recv(1024).strip() - assert my_base is not None - """ :type my_base: CradlepointAppBase """ - - my_base.logger.debug( - "Client {} asked:".format(self.client_address[0])) - my_base.logger.debug(message) - - # parse & confirm appears valid - message = json_get_put.jsonrpc_check_request(message, - test_params=True) - my_base.logger.debug("checked:{}".format(message)) - # my_base.logger.debug("type:{}".format(type(message["method"]))) - - if "error" not in message: - # then so far, so good - method = message["method"].lower() - - if method == "get_setting": - my_base.logger.debug( - "GetSetting:{}".format(message["params"])) - message = json_get_put.jsonrpc_get( - my_base.settings, message) - - elif method == "get_data": - my_base.logger.debug( - "GetData:{}".format(message["params"])) - message = json_get_put.jsonrpc_get( - my_base.data, message) - - elif method == "put_data": - my_base.logger.debug( - "PutData:{}".format(message["params"])) - message = json_get_put.jsonrpc_put( - my_base.data, message) - - else: - message["error"] = { - "code": -32601, - "message": "Unknown \"method\": {}".format(method)} - - # else, if request["error"] is already true, then return error - - message = json_get_put.jsonrpc_prep_response(message, encode=True) - """ :type message: str """ - my_base.logger.debug("returning:{}".format(message)) - self.request.sendall(message.encode()) - - my_base.logger.debug("") - return - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/simple_jsonrpc") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/data/jsonrpc_settings/send_json.py b/data/jsonrpc_settings/send_json.py deleted file mode 100644 index f585a710..00000000 --- a/data/jsonrpc_settings/send_json.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Simple client to run against jsonrpc_server.py -""" -import json -import socket -import sys -import time - -from cp_lib.app_base import CradlepointAppBase -# import cp_lib.data.json_get_put as json_get_put - -# avoid 8080, as the router may have service on it. -DEF_HOST_PORT = 9901 -DEF_HOST_IP = "192.168.115.1" - - -def run_client(app_base, value): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - - data = {"jsonrpc": "2.0", "method": "put_data", - "params": {"path": "counter", "value": value}, "id": 1} - - # then convert to JSON string - data = json.dumps(data).encode() - - app_base.logger.debug("Sent:{}".format(data)) - - server_address = (DEF_HOST_IP, DEF_HOST_PORT) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - try: - # Connect to server and send data - sock.connect(server_address) - sock.sendall(data) - - # Receive data from the server and shut down - received = str(sock.recv(1024), "utf-8") - finally: - sock.close() - - received = json.dumps(received) - - app_base.logger.debug("Recv:{}".format(received)) - - time.sleep(1.0) - - return 0 - - -def do_one_get(app_base, data): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param data: the data - :type data: str or dict or bytes - :return: - """ - if isinstance(data, dict): - # then convert to JSON string - data = json.dumps(data) - - if isinstance(data, str): - # then convert to JSON string - data = data.encode('utf-8') - - app_base.logger.debug("Sent:{}".format(data)) - - server_address = (DEF_HOST_IP, DEF_HOST_PORT) - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - try: - # Connect to server and send data - sock.connect(server_address) - sock.sendall(data) - - # Receive data from the server and shut down - received = str(sock.recv(1024), "utf-8") - finally: - sock.close() - - app_base.logger.debug("Recv:{}".format(received)) - - return json.loads(received) - - -if __name__ == "__main__": - - my_app = CradlepointAppBase("data/jsonrpc_settings") - _result = run_client(my_app, sys.argv[1]) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/data/jsonrpc_settings/settings.ini b/data/jsonrpc_settings/settings.ini deleted file mode 100644 index f1195a32..00000000 --- a/data/jsonrpc_settings/settings.ini +++ /dev/null @@ -1,12 +0,0 @@ -; one app settings - -[application] -name=jsonrpc_server -description=A very simple JSON RPC server, get/put app_base settings -path = data/jsonrpc_settings -version = 1.0 -uuid=b1bf5883-24db-4518-a787-bb5dea467e4a - -[jsonrpc] -; port cannot be less than 1024 on CP router -host_port=9901 diff --git a/demo/gpio_power_loss/README.md b/demo/gpio_power_loss/README.md deleted file mode 100644 index 5d50267f..00000000 --- a/demo/gpio_power_loss/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# directory: ./demo/gpio_power_loss -## Router App/SDK sample applications - -This demo includes a thread (task) to allow it to be combined with other -demos. The demo runs on an IBR1100, reading the digital input on the 2x2 -power connector. sample application creates 3 sub-tasks (so four total). -The main application starts 3 sub-tasks, which loop, sleeping with a random -delay before printing out a logger INFO message. - -The first 2 sub-tasks will run 'forever' - or on a PC, when you do a ^C or -keyboard interrupt, the main task will abort, using an event() to stop -all three sub-tasks. - -The third task will exit after each loop, and the main task will re-run it -when it notices that it is not running. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: power_loss.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [power_loss]: - -* check_input_delay=5 sec, how often to query the router status tree. -Polling too fast will impact router performance - possibly even prevent -operation. So select a reasonable value: a few seconds for DEMO purposes, -likely '30 sec' or '1 min' for normal operations. -The routine 'parse_duration' is used, so supported time tags include -"x sec", "x min", "x hr" and so on. -* loss_delay=2 sec, after seeing the first POWER LOSS value, we delay and -recheck, confirming it is still lost before sending the alert. -The routine 'parse_duration' is used, so tags like 'sec' and 'min' are -supported. -* restore_delay=2 sec, after seeing the first POWER RESTORE value, we delay -and recheck, confirming it is still restored before sending the alert. -The routine 'parse_duration' is used, so tags like 'sec' and 'min' are -supported. -* match_on_power_loss=False, the 2x2 power connector input is read and -compared to this value. If it matches, then the condition is deemed -to be "Power Loss == True". -False and 0 are interchangeable, as are True and 1. -* led_on_power_loss=False, defines if and how the 2x2 power connector -output is handled. Set to 'null' or 'None' to disable out. -If True or False, that value to set when "Power Loss == True" -* site_name=Quick Serve Restaurant #278A, any user defined name, which is -included in the alert. - -Also in the section [power_loss], see cp_lib.cp_email.py: - -* username, password, smtp_url, smtp_port, email_to - -## Alert Forms - -The general form will be {condition}{setting: site_name} - -### Example when Power is Lost: - -* Bad News! AC Power lost at site: Quick Serve Restaurant #278A - at time: 2016-04-20 19:36:26 -0500 - -### Example when Power is Restored: - -* Good News! AC Power restored at site: Quick Serve Restaurant #278A - at time: 2016-04-20 19:54:47 -0500 - diff --git a/demo/gpio_power_loss/__init__.py b/demo/gpio_power_loss/__init__.py deleted file mode 100644 index ecdcf51a..00000000 --- a/demo/gpio_power_loss/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from demo.gpio_power_loss.power_loss import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/demo/gpio_power_loss/power_loss.py b/demo/gpio_power_loss/power_loss.py deleted file mode 100644 index b5d16f91..00000000 --- a/demo/gpio_power_loss/power_loss.py +++ /dev/null @@ -1,396 +0,0 @@ -import threading -import time - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.cp_email import cp_send_email -from cp_lib.parse_duration import TimeDuration -from cp_lib.parse_data import parse_boolean, parse_none - -power_loss_task = None - - -def run_router_app(app_base, wait_for_child=True): - """ - Start our thread - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param bool wait_for_child: T to wait in loop, F to return immediately - :return: - """ - global power_loss_task - - # confirm we are running on 1100/1150, result should be like "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info( - "Product Model is good:{}".format(result)) - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - power_loss_task = PowerLoss("power_loss", app_base) - power_loss_task.start() - - if wait_for_child: - # we block on this sub task - for testing - try: - while True: - time.sleep(300) - - except KeyboardInterrupt: - # this is only true on a test PC - won't see on router - # must trap here to prevent try/except in __init__.py from avoiding - # the graceful shutdown below. - pass - - # now we need to try & kill off our kids - if we are here - app_base.logger.info("Okay, exiting") - - stop_router_app(app_base) - - else: - # we return ASAP, assume this is 1 of many tasks run by single parent - app_base.logger.info("Exit immediately, leave sub-task run") - - return 0 - - -def stop_router_app(app_base): - """ - Stop the thread - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - global power_loss_task - - if power_loss_task is not None: - app_base.logger.info("Signal PowerLoss sub-task to stop") - - # signal sub task to halt - power_loss_task.please_stop() - - # what until it does - remember, it is sleeping, so will take some time - power_loss_task.join() - - return 0 - - -class PowerLoss(threading.Thread): - - DEF_INPUT_NAME = "status/gpio/CGPIO_CONNECTOR_INPUT" - - def __init__(self, name, app_base): - """ - prep our thread, but do not start yet - - :param str name: name for the thread - :param CradlepointAppBase app_base: prepared resources: logger, etc - """ - threading.Thread.__init__(self, name=name) - - self.app_base = app_base - self.app_base.logger.info("started INIT") - - # how long to delay between checking the GPIO - self.loop_delay = self.app_base.settings["power_loss"].get( - "check_input_delay", 15) - # support things like '1 min' or 15 - duration = TimeDuration(self.loop_delay) - self.loop_delay = float(duration.get_seconds()) - - # how long to wait, to double-check LOSS - self.loss_delay = self.app_base.settings["power_loss"].get( - "loss_delay", 1) - self.loss_delay = duration.parse_time_duration_to_seconds( - self.loss_delay) - - # how long to wait, to double-check RESTORE - self.restore_delay = self.app_base.settings["power_loss"].get( - "restore_delay", 1) - self.restore_delay = duration.parse_time_duration_to_seconds( - self.restore_delay) - - # when GPIO matches this state, then power is lost - self.state_in_alarm = self.app_base.settings["power_loss"].get( - "match_on_power_loss", False) - # support 'true', '1' etc - but finally is True/False - self.state_in_alarm = parse_boolean(self.state_in_alarm) - - # when 'power is lost', send to LED - self.led_in_alarm = self.app_base.settings["power_loss"].get( - "led_on_power_loss", None) - try: - # see if the setting is None, to disable - self.led_in_alarm = parse_none(self.led_in_alarm) - - except ValueError: - # support 'true', '1' etc - but finally is True/False - self.led_in_alarm = parse_boolean(self.led_in_alarm) - - # when GPIO matches this state, then power is lost - self.site_name = self.app_base.settings["power_loss"].get( - "site_name", "My Site") - - # create an event to manage our stopping - # (Note: on CP router, this isn't strictly true, as when the parent is - # stopped/halted, the child dies as well. However, you may want - # your sub task to clean up before it exists - self.keep_running = threading.Event() - self.keep_running.set() - - # hold the .get_power_loss_status() - self.last_state = None - - # special tweak to announce 'first poll' more smartly - self.starting_up = True - - self.email_settings = dict() - self.prep_email_settings() - - return - - def run(self): - """ - Now thread is being asked to start running - """ - - self.app_base.logger.info("Running") - - self.app_base.cs_client.show_rsp = False - - while self.keep_running.is_set(): - - # check the GPIO input status, likely is string - result = self.get_power_loss_status() - if result == self.last_state: - # then no change - pass - # self.app_base.logger.debug( - # "State has not changed, still={}".format(result)) - - elif result is None: - # handle hiccups? Try again? - pass - - else: - # else state has been changed - self.last_state = result - if self.last_state: - # changed state = True, power has been LOST - self.app_base.logger.debug( - "State changed={}, POWER LOST!".format( - self.last_state)) - - # double-check if really lost - self.app_base.logger.debug( - "Delay %d sec to double-check" % int( - self.loss_delay)) - time.sleep(self.loss_delay) - result = self.get_power_loss_status() - if result: - # then power really is lost - self.do_power_lost_event() - else: - self.last_state = result - self.app_base.logger.debug("False Alarm") - - else: - # changed state = False, power has been RESTORED - self.app_base.logger.info( - "State changed={}, POWER OKAY".format( - self.last_state)) - - # double-check if really restored - self.app_base.logger.debug( - "Delay %d sec to double-check" % int( - self.restore_delay)) - time.sleep(self.restore_delay) - result = self.get_power_loss_status() - if not result: - # then power really is restored - self.do_power_restore_event() - else: - self.last_state = result - self.app_base.logger.debug("False Alarm") - - time.sleep(self.loop_delay) - - self.app_base.logger.info("Stopping") - return 0 - - def please_stop(self): - """ - Now thread is being asked to start running - """ - self.keep_running.clear() - return - - def get_power_loss_status(self): - """ - Fetch the GPIO input state, return reading, which may not - be directly related to power status. - - :return bool: return True/False, for condition of 'power is lost' - """ - # check the GPIO input status, likely is string - result = self.app_base.cs_client.get(self.DEF_INPUT_NAME) - if result in (1, '1'): - result = True - elif result in (0, '0'): - result = False - else: - # ?? what if we hiccup & have a bad reading? - return None - - # self.app_base.logger.debug("result:{} alarm:{} is_lost:{}".format( - # result, self.state_in_alarm, self.power_is_lost(result))) - - return self.power_is_lost(result) - - def do_power_lost_event(self): - """ - Do what we need to when power is lost - :return: - """ - if self.starting_up: - # special tweak to announce 'first poll' more smartly - self.starting_up = False - message =\ - "Starting Up: AC Power OFF at site: {}".format(self.site_name) - else: - message =\ - "Bad News! AC Power lost at site: {}".format(self.site_name) - self._do_event(message, alarm=True) - - if self.led_in_alarm is not None: - # then affect LED output, since in alarm, set to led_in_alarm - self.app_base.cs_client.put( - "control/gpio", - {"CGPIO_CONNECTOR_OUTPUT": int(self.led_in_alarm)}) - return - - def do_power_restore_event(self): - """ - Do what we need to when power is restored - :return: - """ - if self.starting_up: - # special tweak to announce 'first poll' more smartly - self.starting_up = False - message =\ - "Starting Up: AC Power ON at site: {}".format(self.site_name) - else: - message =\ - "Good News! AC Power restored at site: {}".format( - self.site_name) - self._do_event(message, alarm=False) - - if self.led_in_alarm is not None: - # affect LED output, since not in alarm, set to NOT led_in_alarm - self.app_base.cs_client.put( - "control/gpio", - {"CGPIO_CONNECTOR_OUTPUT": int(not self.led_in_alarm)}) - return - - def _do_event(self, message, alarm): - """ - Wrap the logging anf email action - - :param str message: the email subject with site_name - :param bool alarm: T/F if this is bad/alarm, of good/return-to-normal - :return: - """ - self.email_settings['subject'] = message - - time_string = self.format_time_message() - self.email_settings['body'] = self.email_settings['subject'] + \ - '\n' + time_string + '\n' - - self.email_settings['logger'] = self.app_base.logger - result = cp_send_email(self.email_settings) - - if alarm: - self.app_base.logger.warning(message) - self.app_base.logger.warning(time_string) - else: - self.app_base.logger.info(message) - self.app_base.logger.info(time_string) - return - - @staticmethod - def format_time_message(now=None): - """ - Produce a string such as "2016-04-20 10:54:23 Mountain Time" - - :param now: optional time ot use - :return: - """ - if now is None: - now = time.time() - - return " at time: {}".format( - time.strftime("%Y-%m-%d %H:%M:%S %z", time.localtime(now))) - - def power_is_lost(self, value): - """ - Given current state, form the string - :param value: - :return: - """ - return bool(value == self.state_in_alarm) - - def prep_email_settings(self): - """ - - :return: - """ - # Required keys - # ['smtp_tls] = T/F to use TLS, defaults to True - # ['smtp_url'] = URL, such as 'smtp.gmail.com' - # ['smtp_port'] = TCP port like 587 - be careful, as some servers - # have more than one, with the number defining the - # security demanded. - # ['username'] = your smtp user name (often your email acct address) - # ['password'] = your smtp acct password - # ['email_to'] = the target email address, as str or list - # ['subject'] = the email subject - - # Optional keys - # ['email_from'] = the from address - any smtp server will ignore, - # and force this to be your user/acct email address; - # def = ['username'] - # ['body'] = the email body; def = ['subject'] - - # we allow KeyError is any of these are missing - self.email_settings['smtp_tls'] = True - self.email_settings['smtp_url'] = \ - self.app_base.settings['power_loss']['smtp_url'] - self.email_settings['smtp_port'] = \ - self.app_base.settings['power_loss']['smtp_port'] - self.email_settings['username'] = \ - self.app_base.settings['power_loss']['username'] - self.email_settings['password'] = \ - self.app_base.settings['power_loss']['password'] - - email_to = self.app_base.settings['power_loss']['email_to'] - self.app_base.logger.debug("email_to:typ:{} {}".format( - type(email_to), email_to)) - - if isinstance(email_to, str): - # if already string, check if like '["add1@c.com","add2@d.com"] - email_to = email_to.strip() - if email_to[0] in ("[", "("): - email_to = list(eval(email_to)) - self.app_base.logger.debug("lister:typ:{} {}".format( - type(email_to), email_to)) - else: - email_to = [email_to] - self.app_base.logger.debug("elslie:typ:{} {}".format( - type(email_to), email_to)) - - self.email_settings['email_to'] = email_to - - return - diff --git a/demo/gpio_power_loss/settings.ini b/demo/gpio_power_loss/settings.ini deleted file mode 100644 index a0edd533..00000000 --- a/demo/gpio_power_loss/settings.ini +++ /dev/null @@ -1,23 +0,0 @@ -[application] -name=power_loss -description=Thread to monitor 1100's GPIO, for loss of AC power -path=demo.gpio_power_loss -version=1.23 -uuid=ab30518a-0f0b-41ca-b60d-e933d33f7959 - -; this section and item is unique to this sample -[power_loss] -check_input_delay=5 sec -match_on_power_loss=False -loss_delay=2 sec -restore_delay=2 sec -site_name=Quick Serve Restaurant #278A -led_on_power_loss=False -username={your name}@gmail.com -password={put your password here} -smtp_url=smtp.gmail.com -smtp_port=587 -email_to={your name}@gmail.com - -[logging] -level=info diff --git a/demo/gps_gate/README.md b/demo/gps_gate/README.md deleted file mode 100644 index 933a3eef..00000000 --- a/demo/gps_gate/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# directory: ./demo/gps_gate -## Router App/SDK sample applications - -Received GPS data on 'localhost' port (as configured in CP Router GPS) -settings, then forward to GpsGate public servers. Only the TCP transport -is used (UDP and HTTP/XML is NOT coded/included - yet). - -To use this, you will need to have arranged a GpsGate server, from which -you are given the URL to use. The code relies upon the IMEI ALREADY existing -in the server - it does not device registration, etc. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: gps_gate.py - -The main files of the application. - -## File: gps_gate_nmea.py - -A custom state-machine for a NMEA stream designed for GpsGate, including the -unit-of-measure and delta-filters they handle. The cp_lib.gps_nema.py -module is also used, but mainly for the NMEA sentence cleanup & creation. - -## File: gps_gate_protocol.py - -A custom state-machine for GpsGate 'TCP' server. It maintains a state, -and returns next-requests as expected by the protocol. Note that it does NOT -do the actual data comm. This code CREATES requests, and PARSES responses, -changing its internal state & settings as appropriate. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [gps_gate]: - -* gps_gate_url=64.46.40.178, defines the URL assigned to you by the -GpsGate people. This is treated as string, so can be IP or FQDN - -* gps_gate_port=30175, is the default TCP port to use. Change if needed. - -* host_ip=192.168.1.6 - ONLY include to ignore Router API value! -Define which 'localhost' port the code waits on for incoming GPS sentences. -This must match what is configured in the CP Router - -* host_port=9999 - ONLY include to ignore Router API value! -Define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. - - -## TODO - - -* have the code fetch the IP/port info from the router config tree. This would -eliminate the need for the host_ip/host_port settings. diff --git a/demo/gps_gate/__init__.py b/demo/gps_gate/__init__.py deleted file mode 100644 index 4cec1af1..00000000 --- a/demo/gps_gate/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from demo.gps_gate.gps_gate import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/demo/gps_gate/gps_gate.py b/demo/gps_gate/gps_gate.py deleted file mode 100644 index 5b0009e5..00000000 --- a/demo/gps_gate/gps_gate.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Received GPS, assuming the router's GPS function sends new data (sentences) -to a localhost port -""" - -import socket -import time -import gc - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.load_active_wan import ActiveWan -from cp_lib.load_gps_config import GpsConfig -from cp_lib.parse_data import clean_string, parse_integer - -from demo.gps_gate.gps_gate_protocol import GpsGate - - -DEF_BUFFER_SIZE = 1024 - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - # handle the GPS_GATE protocol - gps_gate = GpsGate(app_base.logger) - - # process the SETTINGS file - section = "gps_gate" - if section not in app_base.settings: - # this is unlikely! - app_base.logger.warning( - "Aborting: No [%s] section in settings.ini".format(section)) - return -1 - - else: - # then load dynamic values - temp = app_base.settings[section] - - app_base.logger.debug( - "[{}] section = {}".format(section, temp)) - - # settings for our LISTENER for router GPS output - buffer_size = int(temp.get("buffer_size", DEF_BUFFER_SIZE)) - - # check on our localhost port (not used, but to test) - config = GpsConfig(app_base) - host_ip, host_port = config.get_client_info() - if "host_ip" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_ip") - value = clean_string(temp["host_ip"]) - app_base.logger.warning("was:{} now:{}".format(host_ip, value)) - host_ip = value - - if "host_port" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_port") - value = parse_integer(temp["host_port"]) - app_base.logger.warning("was:{} now:{}".format(host_port, value)) - host_port = value - - app_base.logger.debug("GPS source:({}:{})".format(host_ip, host_port)) - del config - - # settings defining the GpsGate interactions - if "gps_gate_url" in temp: - gps_gate.set_server_url(temp["gps_gate_url"]) - if "gps_gate_port" in temp: - gps_gate.set_server_port(temp["gps_gate_port"]) - if "gps_gate_transport" in temp: - gps_gate.set_server_transport(temp["gps_gate_transport"]) - - if "username" in temp: - gps_gate.set_username(temp["username"]) - if "password" in temp: - gps_gate.set_password(temp["password"]) - if "server_version" in temp: - gps_gate.set_server_version(temp["server_version"]) - if "client" in temp: - gps_gate.set_client_name(temp["client"]) - - if "IMEI" in temp: - gps_gate.set_imei(temp["IMEI"]) - elif "imei" in temp: - # handle upper or lower case, just because ... - gps_gate.set_imei(temp["imei"]) - - # we can pre-set the filters here, but Gpsgate may try to override - if "distance_filter" in temp: - gps_gate.nmea.set_distance_filter(temp["distance_filter"]) - if "time_filter" in temp: - gps_gate.nmea.set_time_filter(temp["time_filter"]) - if "speed_filter" in temp: - gps_gate.nmea.set_speed_filter(temp["speed_filter"]) - if "direction_filter" in temp: - gps_gate.nmea.set_direction_filter(temp["direction_filter"]) - if "direction_threshold" in temp: - gps_gate.nmea.set_direction_threshold(temp["direction_threshold"]) - - # check the cell modem/gps sources - wan_data = ActiveWan(app_base) - # app_base.logger.info("WAN data {}".format(wan_data['active'])) - - value = wan_data.get_imei() - if gps_gate.client_imei is None: - # only take 'live' value if setting.ini was NOT included - gps_gate.set_imei(value) - else: - app_base.logger.warning( - "Using settings.ini IMEI, ignoring cell modem's value") - - if not wan_data.supports_gps(): - app_base.logger.warning( - "cell modem claims no GPS - another source might exist") - - if wan_data.get_live_gps_data() in (None, {}): - app_base.logger.warning( - "cell modem has no last GPS data") - else: - app_base.logger.debug("GPS={}".format(wan_data.get_live_gps_data())) - - while True: - # define the socket resource, including the type (stream == "TCP") - address = (host_ip, host_port) - app_base.logger.info("Preparing GPS Listening on {}".format(address)) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # attempt to actually lock resource, which may fail if unavailable - # (see BIND ERROR note) - try: - sock.bind(address) - except OSError as msg: - app_base.logger.error("socket.bind() failed - {}".format(msg)) - - # technically, Python will close when 'sock' goes out of scope, - # but be disciplined and close it yourself. Python may warning - # you of unclosed resource, during runtime. - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors - # are likely permanent. - return -1 - - # only allow 1 client at a time - sock.listen(3) - - while True: - # loop forever - app_base.logger.info("Waiting on TCP socket %d" % host_port) - client, address = sock.accept() - app_base.logger.info("Accepted connection from {}".format(address)) - - # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # set non-blocking so we can do a manual timeout (use of select() - # is better ... but that's another sample) - # client.setblocking(0) - - while True: - app_base.logger.debug("Waiting to receive data") - data = client.recv(buffer_size) - # data is type() bytes, to echo we don't need to convert - # to str to format or return. - if data: - data = data.decode().split() - - # gps.start() - for line in data: - try: - pass - # result = gps.parse_sentence(line) - # if not result: - # break - - except ValueError: - app_base.logger.warning( - "Bad NMEA sentence:[{}]".format(line)) - raise - - # gps.publish() - # app_base.logger.debug( - # "See({})".format(gps.get_attributes())) - # client.send(data) - else: - break - - time.sleep(1.0) - - app_base.logger.info("Client disconnected") - client.close() - - # since this server is expected to run on a small embedded system, - # free up memory ASAP (see MEMORY note) - del client - gc.collect() - - return 0 - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("gps/gps_gate") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/demo/gps_gate/gps_gate_nmea.py b/demo/gps_gate/gps_gate_nmea.py deleted file mode 100644 index 4ae9a24e..00000000 --- a/demo/gps_gate/gps_gate_nmea.py +++ /dev/null @@ -1,733 +0,0 @@ -""" -handle NMEA sentences, in ways customized to Gpsgate expectations - -This file is used by demo.gps_gate.gps_gate_protocol.py! -""" -import time - -from cp_lib.parse_data import parse_float - - -class NmeaCollection(object): - """ - Hold the state of a connected NMEA device. - - We assume the sentences come in a cluster, and some of the sentences - contain duplicate values. - - So the paradigm is: - 1) call NmeaCollection.start() to prep the new data - 2) call NmeaCollection.parse_sentence() repeatedly - 3) call NmeaCollection.end() to 'end' the parsing of data & test filters - if end() returns True, then there has been enough of a change to - warrant uploading - 4) call NmeaCollection.publish() to formalize (confirm) we've uploaded - - """ - - # if True, then just claim an out-of-range setting, don't ignore - CLAMP_SETTINGS = True - - DISTANCE_FILTER_DEF = None - # at some point, GPS is not accurate enough to be like 1 inch! And for - # MAX, roughly 1/2 way around earth is probably silly - DISTANCE_FILTER_LIMITS = (1.0, 6000000.0, "distance") - - TIME_FILTER_DEF = "1 min" - # at most each 10 seconds (not too fast) and at least once a day - TIME_FILTER_LIMITS = (10.0, 86400.0, "time") - - SPEED_FILTER_DEF = None - # at most each 10 seconds (not too fast) and at least once a day - SPEED_FILTER_LIMITS = (1.0, 500.0, "speed") - - DIRECTION_FILTER_DEF = None - # direction/degrees limited to 0 to 360 - DIRECTION_FILTER_LIMITS = (1.0, 360.0, "direction") - - DIRECTION_THRESHOLD_DEF = None - # like distance - DIRECTION_THRESHOLD_LIMITS = (1.0, 6000000.0, "direction threshold") - - def __init__(self, _logger): - - # hold the last RMC data - self.gprmc = dict() - - # hold the last VYG data - self.gpvtg = dict() - - # hold the last GGA data - self.gpgga = dict() - - self.publish_time = None - - self.new_data = dict() - self.last_data = None - self.publish_reason = None - - self.logger = _logger - - # Distance in meters before a new update should be sent to server. - self.distance_filter = None - self.set_distance_filter(self.DISTANCE_FILTER_DEF) - - # Interval in seconds before a new position should be sent to server - self.time_filter = None - self.set_time_filter(self.TIME_FILTER_DEF) - - # Change in speed in meters per second, before a new position update - # should sent to server by client. - self.speed_filter = None - self.set_speed_filter(self.SPEED_FILTER_DEF) - - # Change of heading in degrees, before a new update should be sent. - self.direction_filter = None - self.set_direction_filter(self.DIRECTION_FILTER_DEF) - - # Distance in meters travelled before "DirectionFilter" is considered. - self.direction_threshold = None - self.set_direction_threshold(self.DIRECTION_THRESHOLD_DEF) - - return - - def set_distance_filter(self, value=None): - """ - Distance in meters before a new update should be sent to server. - - Distance must be > 0.0, and although logically it should not be - too large, I'm not sure what MAX would be. - """ - # test None, make float, test Min/Max, clamp or throw ValueError - value = self._test_value_limits(value, self.DISTANCE_FILTER_LIMITS) - - if value is None: - # then disable the distance filter - self.distance_filter = None - self.logger.debug("Disable distance_filter") - elif value != self.distance_filter: - self.distance_filter = value - self.logger.debug("Set distance_filter = {} m".format(value)) - return - - def set_time_filter(self, value): - """ - Interval in seconds before a new position should be sent to server - """ - from cp_lib.parse_duration import TimeDuration - - # handle the "null" or 0 times, as disable - value = self._test_value_as_none(value) - - if value is None: - # then disable the distance filter - if self.time_filter is not None: - self.logger.debug("Disable time_filter") - self.time_filter = None - else: - try: - duration = TimeDuration(value) - except AttributeError: - raise ValueError("Bad Time Filter Value:{}".format(value)) - - value = duration.get_seconds() - - # test Min/Max, clamp or throw ValueError - value = self._test_value_limits(value, self.TIME_FILTER_LIMITS) - if value != self.time_filter: - self.time_filter = value - self.logger.debug("Set time_filter = {} sec".format(value)) - return - - def set_speed_filter(self, value): - """ - Change in speed in meters per second, before a new position update - should sent to server. - """ - # test None, make float, test Min/Max, clamp or throw ValueError - value = self._test_value_limits(value, self.SPEED_FILTER_LIMITS) - - if value is None: - # then disable the distance filter - if self.speed_filter is not None: - self.logger.debug("Disable speed_filter") - self.speed_filter = None - elif value != self.speed_filter: - self.speed_filter = value - self.logger.debug("Set speed_filter = {} m/sec".format(value)) - return - - def set_direction_filter(self, value): - """ - Change in direction in degrees, before a new position update - should sent to server . - """ - # test None, make float, test Min/Max, clamp or throw ValueError - value = self._test_value_limits(value, self.DIRECTION_FILTER_LIMITS) - - if value is None: - # then disable the distance filter - if self.direction_filter is not None: - self.logger.debug("Disable direction_filter") - self.direction_filter = None - elif value != self.direction_filter: - self.direction_filter = value - self.logger.debug("Set direction_filter = {} deg".format(value)) - return - - def set_direction_threshold(self, value): - """ - Distance in meters travelled before "DirectionFilter" should be - considered. - """ - # test None, make float, test Min/Max, clamp or throw ValueError - value = self._test_value_limits(value, self.DIRECTION_THRESHOLD_LIMITS) - - if value is None: - # then disable the distance filter - if self.direction_threshold is not None: - self.logger.debug("Disable direction_threshold") - self.direction_threshold = None - else: - if value != self.direction_threshold: - self.direction_threshold = value - self.logger.debug( - "NMEA.set_direction_threshold = {} m".format(value)) - return - - @staticmethod - def _test_value_as_none(value): - """ - give a value, which might be float or string (etc) but in our - context of 'filters' we want to disable or set None - :param value: - :return: - """ - if value in (None, 0, 0.0): - # none of the filters are usable if '0' - return None - - if isinstance(value, bytes): - # make any string bytes - value = value.decode() - - if isinstance(value, str): - if value.lower() in ("", "0", "0.0", "none", "null"): - # none of the filters are usable if '0' - return None - - return value - - def _test_value_limits(self, value, limits): - """ - We assume 'limits' is like (min, max, name), so confirm the value in - within range. If CLAMP is true, we claim to MIN or MAX, else we - throw ValueError - - :param value: the value to test - like float - :param tuple limits: - :return: - """ - assert isinstance(limits, tuple) - assert len(limits) >= 3 - - value = self._test_value_as_none(value) - if value is None: - return None - - value = parse_float(value) - - if value < limits[0]: - # value is too low - if self.CLAMP_SETTINGS: - return limits[0] - else: - raise ValueError( - "Set {} filter={} is below MIN={}".format( - limits[2], value, limits[0])) - - if value > limits[1]: - # too high - if self.CLAMP_SETTINGS: - return limits[1] - else: - raise ValueError( - "Set {} filter={} is above MAX={}".format( - limits[2], value, limits[1])) - - # if still here, then is within range - return value - - def start(self, now=None): - """ - Start parsing a new cluster of sentences - - :param float now: force in a time-stamp, mainly for testing - :return: - """ - if now is None: - now = time.time() - - self.new_data = dict() - self.new_data['time'] = now - return - - def end(self): - """ - End parsing a cluster of sentences, so check out filters - - :return: (T/F, reason string) - :rtype: bool, str - """ - - if not self.new_data.get('valid', False): - # test if new_data is valid - for now never publish is RMC is bad - # at some point likely need to publish as 'bad' - return False, 'invalid' - - # we use self.filtered to RECORD if there are any filters, or not. - filtered = False - result = False - reason = "error" - - if self.last_data is None or self.last_data == {}: - # if no last data, a special case - self.last_data = self.new_data - return True, "first" - - # place the filter tests in roughly order of computational complexity - - if self.time_filter is not None: - # Interval in seconds before a new data should be sent to server - filtered = True - if self._test_time_filter(): - result = True - reason = "time" - - if not result and self.speed_filter is not None: - # Change in speed in meters per second - # we only test if result isn't True yet - filtered = True - if self._test_speed_filter(): - result = True - reason = "speed" - - if not result and self.distance_filter is not None: - # Distance in meters before a new update should be sent to server - # we only test if result isn't True yet - filtered = True - if self._test_distance_filter(): - result = True - reason = "distance" - - if not result and self.direction_filter is not None: - # Change of heading in degrees, before new update sent. - # we only test if result isn't True yet - filtered = True - if self._test_direction_filter(): - result = True - reason = "direction" - - # self.direction_threshold is handled within _test_direction_filter() - - if not result: - # if still here, one of two situations were true - if filtered: - # a) we have filter conditions, but NONE wanted to publish - # result is already False - reason = "filtered" - else: - # b) we have NO filter conditions, so always publish - result = True - reason = "always" - # else result == True, so assume 'reason' is valid already - - return result, reason - - def publish(self, now=None): - """ - End parsing a cluster of sentences - discard the older data and - shift the new data into its place - - :param float now: force in a time-stamp, mainly for testing - :return: - """ - # else, do not 'lose' the last valid or None - - if now is None: - now = time.time() - - if self.new_data.get("valid", False): - # only save if last was valid! - self.last_data = self.new_data - - self.publish_time = now - return True - - def report_list(self): - """ - return a list of 'details' for a report - :return: - """ - report = [] - if self.time_filter is not None: - report.append("Time Filter = %0.2f sec" % float(self.time_filter)) - if self.speed_filter is not None: - report.append( - "Speed Filter = %0.2f m/sec" % float(self.speed_filter)) - if self.distance_filter is not None: - report.append( - "Distance Filter = %0.1f m" % float(self.distance_filter)) - if self.direction_filter is not None: - report.append( - "Direction Filter = %0.1f deg" % float(self.direction_filter)) - if self.direction_threshold is not None: - report.append( - "Direction Threshold = %0.1f m" % float( - self.direction_threshold)) - - if 'raw' in self.gprmc: - report.append(self.gprmc['raw']) - if 'raw' in self.gprmc: - report.append(self.gpvtg['raw']) - if 'raw' in self.gprmc: - report.append(self.gpgga['raw']) - - if self.new_data.get('valid', False): - report.append("Newest: Lat:%f Long:%f Alt:%0.1f m" % - (self.new_data['latitude'], - self.new_data['longitude'], - self.new_data['altitude'])) - report.append( - "Newest: time:%s satellite_count:%d" % - (time.strftime("%Y-%m-%d %H:%M:%S", - time.localtime(self.new_data['time'])), - self.new_data['satellites'])) - else: - report.append("Newest Data is invalid!") - - if self.publish_time is None: - report.append("Never Published") - else: - report.append( - "Last Publish:%s (%d seconds ago)" % - (time.strftime("%Y-%m-%d %H:%M:%S", - time.localtime(self.publish_time)), - time.time() - self.publish_time)) - - return report - - def parse_sentence(self, raw_sentence): - """ - - :param str raw_sentence: - :return: - """ - from cp_lib.gps_nmea import strip_sentence, calc_checksum - - sentence, seen_csum = strip_sentence(raw_sentence) - - if seen_csum is not None: - if seen_csum != calc_checksum(sentence): - raise ValueError("Invalid NMEA checksum") - - tokens = sentence.split(',') - if len(tokens) <= 1: - raise ValueError("Bad NMEA format") - - # index = 0 - # for x in tokens: - # print("[%02d]=%s" % (index, x)) - # index += 1 - - result = False - if tokens[0] == "GPRMC": - # recommended minimum standard - result = self.parse_rmc(tokens, raw_sentence) - - elif tokens[0] == "GPVTG": - # recommended minimum standard - result = self.parse_vtg(tokens, raw_sentence) - - elif tokens[0] == "GPGGA": - # Global Positioning System Fixed Data - result = self.parse_gga(tokens, raw_sentence) - - return result - - def parse_rmc(self, tokens, raw_sentence): - """ - Recommended minimum standard - - GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2, - 020516,0.0,E,A - - :param list tokens: - :param str raw_sentence: - :return: - """ - if len(tokens) < 9: - raise ValueError("NMEA RMC is too short.") - assert tokens[0] == "GPRMC" - - self.gprmc = dict() - self.gprmc['time'] = time.time() - self.gprmc['raw'] = raw_sentence - self.gprmc['tokens'] = tokens - - if tokens[2] == 'A': - # then is valid - self.new_data['valid'] = True - else: - self.new_data['valid'] = False - return False - - # convert to full decimal - if 'latitude' not in self.new_data: - self.new_data['latitude'] = self._parse_latitude( - tokens[3], tokens[4]) - - if 'longitude' not in self.new_data: - self.new_data['longitude'] = self._parse_longitude( - tokens[5], tokens[6]) - - if 'knots' not in self.new_data: - # self.new_data['knots'] = float(tokens[7]) - # 0.514444444 × Vkn = Vm/sec - self.new_data['mps'] = float(tokens[7]) * 0.514444444 - - if 'course' not in self.new_data and len(tokens[8]): - # if null, is unknown - self.new_data['course'] = float(tokens[8]) - - return True - - def parse_vtg(self, tokens, raw_sentence): - """ - GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A - - :param list tokens: - :param str raw_sentence: - :return: - """ - if len(tokens) < 8: - raise ValueError("NMEA VTG is too short.") - - assert tokens[0] == "GPVTG" - - self.gpvtg = dict() - self.gpvtg['time'] = time.time() - self.gpvtg['raw'] = raw_sentence - self.gpvtg['tokens'] = tokens - - if 'course' not in self.new_data and len(tokens[1]): - # if null, is unknown - self.new_data['course'] = float(tokens[1]) - - if 'knots' not in self.new_data: - self.new_data['knots'] = float(tokens[5]) - # 0.514444444 × Vkn = Vm/sec - self.new_data['mps'] = self.new_data['knots'] * 0.514444444 - - return True - - def parse_gga(self, tokens, raw_sentence): - """ - Global Positioning System Fixed Data - - GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A - - :param list tokens: - :param str raw_sentence: - :return: - """ - if len(tokens) < 8: - raise ValueError("NMEA GGA is too short.") - - assert tokens[0] == "GPGGA" - - self.gpgga = dict() - self.gpgga['time'] = time.time() - self.gpgga['raw'] = raw_sentence - self.gpgga['tokens'] = tokens - - # convert to full decimal - if 'latitude' not in self.new_data: - self.new_data['latitude'] = self._parse_latitude( - tokens[2], tokens[3]) - - if 'longitude' not in self.new_data: - self.new_data['longitude'] = self._parse_longitude( - tokens[4], tokens[5]) - - # always do the number of satellites - if 'satellites' not in self.new_data: - self.new_data['satellites'] = int(tokens[7]) - - if 'altitude' not in self.new_data: - self.new_data['altitude'] = float(tokens[9]) - - return True - - @staticmethod - def _parse_latitude(latitude, north): - """ - Parse the 2 fields: latitude and N/S indicator - - GPS returns as ddmm.mmm, or 'degree & decimal minutes' - - :param str latitude: - :param str north: - :rtype: float - """ - assert latitude[4] == '.' - value = float(latitude[:2]) + float(latitude[2:]) / 60.0 - if north == 'S': - # 'N' is +, 'S' is negative - value = -value - - return value - - @staticmethod - def _parse_longitude(longitude, west): - """ - Parse the 2 fields: longitude and W/E indicator - - GPS returns as dddmm.mmm, or 'degree & decimal minutes' - - :param str longitude: - :param str west: - :return: - :rtype: float - """ - assert longitude[5] == '.' - value = float(longitude[:3]) + float(longitude[3:]) / 60.0 - if west == 'W': - # 'E' is +, 'W' is negative - value = -value - return value - - @staticmethod - def _distance_meters(lon1, lat1, lon2, lat2): - """ - Calculate the great circle distance between two points - on the earth (specified in decimal degrees) - - :param float lon1: first longitude (as decimal degrees) - :param float lat1: first latitude (as decimal degrees) - :param float lon2: second longitude (as decimal degrees) - :param float lat2: second latitude (as decimal degrees) - :return float: distance in meters - """ - from math import radians, cos, sin, sqrt, atan2 - - # convert decimal degrees to radians, use haversine formula - diff_lon = radians(lon2 - lon1) - diff_lat = radians(lat2 - lat1) - a = sin(diff_lat / 2) * sin(diff_lat / 2) + cos(radians(lat1)) \ - * cos(radians(lat2)) * sin(diff_lon / 2) * sin(diff_lon / 2) - # c = 2 * asin(sqrt(a)) - c = 2 * atan2(sqrt(a), sqrt(1 - a)) - km = 6371 * c - return km * 1000.0 - - def _test_time_filter(self): - """ - Interval in seconds before a new data should be sent to server - - :return: - """ - if 'time' in self.new_data and 'time' in self.last_data: - delta = self.new_data['time'] - self.last_data['time'] - # print("Time Filter={} sec; delta={}".format(self.time_filter, - # delta)) - if delta >= self.time_filter: - return True - - # else if either value missing, skip! - return False - - def _test_distance_filter(self): - """ - Distance in meters before a new update should be sent to server - - :return: - """ - delta = self.__get_raw_distance() - print("Distance Filter={} meters; delta={}".format( - self.distance_filter, delta)) - if delta is not None and delta >= self.distance_filter: - return True - - # else if either value missing, skip! - return False - - def __get_raw_distance(self): - """ - Warp test, confirming all required data exists - - :return: - """ - if 'longitude' in self.new_data and 'latitude' in self.new_data and \ - 'longitude' in self.last_data and \ - 'latitude' in self.last_data: - return self._distance_meters( - self.new_data['longitude'], self.new_data['latitude'], - self.last_data['longitude'], self.last_data['latitude']) - - # else if either value missing, skip! - return None - - def _test_speed_filter(self): - """ - Change in speed in meters per second - - :return: - """ - if 'mps' in self.new_data and 'mps' in self.last_data: - delta = abs(self.new_data['mps'] - self.last_data['mps']) - print("Speed Filter={} mps; delta={}".format( - self.speed_filter, delta)) - if delta >= self.speed_filter: - return True - - # else if either value missing, skip! - return False - - def _test_direction_filter(self): - """ - Change in speed in meters per second - - :return: - """ - if 'course' in self.new_data and 'course' in self.last_data: - # Change of heading in degrees, before new update sent. - - # handle left or right course change, for example turn 10 deg - # one way can be seen as 350 degrees the other way! - if self.new_data['course'] > self.last_data['course']: - delta = self.new_data['course'] - self.last_data['course'] - else: - delta = self.last_data['course'] - self.new_data['course'] - delta = min(delta, 360 - delta) - print("Direction Filter={}; delta={}".format( - self.direction_filter, delta)) - if delta < self.direction_filter: - # then won't apply, not enough change - return False - - # else MIGHT apply, check the threshold - if self.direction_threshold is not None: - # Distance in meters travelled before "DirectionFilter" - # should be considered. - delta = self.__get_raw_distance() - print("Directional Distance Threshold={}; delta={}".format( - self.distance_filter, delta)) - if delta < self.direction_threshold: - # have not travelled far enough - return False - - # had enough change, and threshold is null or satisfied - return True - - return False diff --git a/demo/gps_gate/gps_gate_protocol.py b/demo/gps_gate/gps_gate_protocol.py deleted file mode 100644 index 438ba0e2..00000000 --- a/demo/gps_gate/gps_gate_protocol.py +++ /dev/null @@ -1,641 +0,0 @@ -""" -Received GPS, assuming the router's GPS function sends new data (sentences) -to a localhost port -""" -import copy - -import cp_lib.gps_nmea as gps_nmea -from demo.gps_gate.gps_gate_nmea import NmeaCollection -from cp_lib.parse_data import clean_string, parse_integer -from cp_lib.split_version import split_version_string - - -class GpsGate(object): - - DEF_CLIENT_USERNAME = None - DEF_CLIENT_PASSWORD = None - DEF_CLIENT_IMEI = None - DEF_SERVER_MAJOR_VERSION = 1 - DEF_SERVER_MINOR_VERSION = 1 - - # update these 2 as you desire - # DEF_TRACKER_NAME = "Cradlepoint SDK" - DEF_TRACKER_NAME = "GpsGate TrackerOne" - DEF_CLIENT_NAME = "Cradlepoint" - DEF_CLIENT_VERSION = "1.0" - - OPT_USE_ONLY_TCP = False - - DEF_GPS_GATE_URL = 'online.gpsgate.com' - DEF_GPS_GATE_PORT = 30175 - DEF_GPS_GATE_TRANSPORT = 'tcp' - - # our small state-machine - STATE_OFFLINE = 'offline' - STATE_TRY_LOGIN = 'login' - STATE_HAVE_SESSION = 'session' - STATE_WAIT_SERVER_VERSION = 'wait_ver' - STATE_HAVE_SERVER_VERSION = 'have_ver' - STATE_ASK_UPDATE = 'update' - STATE_FORWARD_READY = 'ready' - STATE_FORWARDING = 'forwarding' - - def __init__(self, _logger): - self.client_username = self.DEF_CLIENT_USERNAME - self.client_password = self.DEF_CLIENT_PASSWORD - self.client_imei = self.DEF_CLIENT_IMEI - self.server_major_version = self.DEF_SERVER_MAJOR_VERSION - self.server_minor_version = self.DEF_SERVER_MINOR_VERSION - self.tracker_name = self.DEF_TRACKER_NAME - self.client_name = self.DEF_CLIENT_NAME - self.client_version = self.DEF_CLIENT_VERSION - - self.gps_gate_url = self.DEF_GPS_GATE_URL - self.gps_gate_port = self.DEF_GPS_GATE_PORT - self.gps_gate_transport = self.DEF_GPS_GATE_TRANSPORT - - self.state = self.STATE_OFFLINE - self.session = None - self.server_title = None - self.return_as_bytes = True - - self.logger = _logger - - # hold the NMEA data and filter-states to drive uploading - self.nmea = NmeaCollection(_logger) - return - - def reset(self): - """ - - :return: - """ - self.state = self.STATE_OFFLINE - self.session = None - return - - def get_next_client_2_server(self): - """ - A simple state machine, as defined in GpsGateServerProtocol200.pdf - on page 18 of 26 - - :return: - """ - self.logger.debug("get_next() entry state:{}".format(self.state)) - - if self.state == self.STATE_OFFLINE: - # then we're first starting - message = self.form_frlin() - self.state = self.STATE_TRY_LOGIN - - elif self.state == self.STATE_TRY_LOGIN: - # hmm, we shouldn't still be here, but start again - message = self.form_frlin() - self.logger.warning("stuck in LOGIN state?") - - elif self.state == self.STATE_HAVE_SESSION: - # we sent login; server replied with session - # we should send our version expectations - message = self.form_frver() - self.state = self.STATE_WAIT_SERVER_VERSION - - elif self.state == self.STATE_WAIT_SERVER_VERSION: - # hmm, we shouldn't still be here, but start again - message = self.form_frver() - self.logger.warning("stuck in WAIT SERVER VERSION state?") - - elif self.state == self.STATE_HAVE_SERVER_VERSION: - # ask the server for update rules - message = self.form_frcmd_update() - self.state = self.STATE_ASK_UPDATE - - elif self.state == self.STATE_FORWARD_READY: - # we sent our version, server replied its version - message = self.form_frwdt() - self.state = self.STATE_FORWARDING - - else: - self.logger.error("unexpected state:{}".format(self.state)) - self.state = self.STATE_OFFLINE - message = None - - self.logger.debug("get_next() exit state:{}".format(self.state)) - - if self.return_as_bytes: - message = message.encode() - - return message - - def parse_message(self, source): - """ - Feed in RESPONSES from GpsGate - - :param source: - :return: - """ - if isinstance(source, bytes): - source = source.decode() - - # source MIGHT be more than one messages! - # source = '$FRVAL,TimeFilter,60.0*42\r\n$FRVAL,SpeedFilter,2.8*' + - # '0C\r\n$FRVAL,DirectionFilter,30.0*37\r\n$FRVAL,' + - # 'DirectionThreshold,10.0*42\r\n' - tokens = source.split('\n') - - result = True - for one in tokens: - if len(one) > 0: - if not self._parse_one_message(one): - result = False - - return result - - def _parse_one_message(self, source): - """ - - :param source: - :return: - """ - # clean off the data - sentence, seen_csum = gps_nmea.strip_sentence(source) - - if seen_csum is not None: - # then we had one, check it - calc_csum = gps_nmea.calc_checksum(sentence) - if seen_csum != calc_csum: - raise ValueError( - "Bad NMEA checksum, saw:%02X expect:%02X" % - (seen_csum, calc_csum)) - - # self.logger.debug("checksum={}".format(seen_csum)) - - # break up the sentence - tokens = sentence.split(',') - - if tokens[0] == "FRVAL": - # setting a name-space value - result = self._parse_frval(tokens) - - elif tokens[0] == "FRRET": - # we have a command response - result = self._parse_frret(tokens) - - elif tokens[0] == "FRSES": - # we have a session! - result = self._parse_frses(tokens) - - elif tokens[0] == "FRVER": - # we have the server version - result = self._parse_frver(tokens) - - # elif tokens[0] == "FRERR": - # # we have a server error - # result = self._parse_frerr(tokens) - # # '$FRERR,AuthError,Wrong username or password*56\r\n' - # - else: - raise ValueError("Unknown response:{}".format(source)) - - return result - - def get_my_identifier(self): - """ - - :return: - """ - if self.client_imei is not None: - return self.client_imei - return self.client_name - - def get_frcmd_id(self, value: str): - """ - - :return: - """ - return "FRCMD," + self.get_my_identifier() + "," + value - - def get_frret_id(self, value: str): - """ - - :return: - """ - return "FRRET," + self.get_my_identifier() + "," + value - - def set_username(self, value: str): - """ - Set the user-name used with GpsGate Server. There don't seem to - be any 'rules' about what makes a valid user-name. - - Insure is string, remove extra quotes, etc. - """ - value = clean_string(value) - if self.client_username != value: - self.client_username = value - self.logger.info("GpsGate: Setting user name:{}".format(value)) - - def set_password(self, value): - """make string, remove extra quotes, etc""" - value = clean_string(value) - if self.client_password != value: - self.client_password = value - self.logger.info("GpsGate: Setting new PASSWORD:****") - - def set_imei(self, value): - """make string, remove extra quotes, etc""" - value = clean_string(value) - if self.client_imei != value: - self.client_imei = value - self.logger.info("GpsGate: Setting IMEI:{}".format(value)) - - def set_client_name(self, name: str, version=None): - """ - Set client name. if version is none, then we assume name is like - "my tool 1.4" 7 try to parse off the ending float. - - TODO At the moment, this routine assumes version is like x.y, with y - being only 1 digit. So 1.2 is okay, but 1.22 is not - """ - change = False - - name = clean_string(name) - if version is None: - # assume version is on end of name! - name = name.split(' ') - if len(name) <= 1: - # then is a single work/token - assume version 1.0 - version = 1.0 - name = name[0] - else: - if name[-1].find('.') >= 0: - version = name[-1] - name.pop(-1) - else: - version = 1.0 - name = ' '.join(name) - - if isinstance(version, int): - version = float(version) - - if isinstance(version, float): - version = str(version) - - if self.client_name != name: - self.client_name = name - change = True - - if self.client_version != version: - self.client_version = version - change = True - - if change and self.logger is not None: - self.logger.info( - "GpsGate: Setting client name:{} version:{}".format( - self.client_name, self.client_version)) - - def set_server_version(self, value): - """ - make string, remove extra quotes, etc. We assume will be like '1.1' - so we need to split into 2 ints for GpsGate protocol - """ - major, minor = split_version_string(value) - if major != self.server_major_version or \ - minor != self.server_minor_version: - self.server_major_version = major - self.server_minor_version = minor - self.logger.info( - "GpsGate: Setting server version:%d.%d" % (major, minor)) - - def set_server_url(self, value): - """save the GpsGate server URL""" - value = clean_string(value) - if self.gps_gate_url != value: - self.gps_gate_url = value - self.logger.info("GpsGate: Setting Server URL:{}".format(value)) - - def set_server_port(self, value): - """save the GpsGate server port""" - value = parse_integer(value) - if self.gps_gate_port != value: - self.gps_gate_port = value - self.logger.info("GpsGate: Setting Server port:{}".format(value)) - - def set_server_transport(self, value): - """save the GpsGate server transport - ('tcp' or 'xml')""" - value = clean_string(value).lower() - if self.gps_gate_transport != value: - if value == 'xml': - raise NotImplementedError("GpsGate XML transport - not yet") - elif value != 'tcp': - raise ValueError("GpsGate - only TCP transport supported") - self.gps_gate_transport = value - self.logger.info("GpsGate: Setting Transport:{}".format(value)) - - def form_frcmd_reset(self): - """ - $FRCMD,IMEI,_DeviceReset - - The return is wrapped with the NMEA checksum - - :return: - :rtype: str - """ - return gps_nmea.wrap_sentence(self.get_frcmd_id("_Device_Reset")) - - @staticmethod - def form_frcmd_update(): - """ - Request server's update rules - - :return: - :rtype: str - """ - return copy.copy("$FRCMD,,_getupdaterules,Inline*1E") - - def form_frcmd_imei(self, gps: dict): - """ - <-- TrackerOne to GpsGate Server GPRS or SMS - $FRCMD,IMEI,_SendMessage,,latitude,hemi,longitude,hemi,alt, - speed,heading,date,time,valid - - The return is wrapped with the NMEA checksum - - :return: - :rtype: str - """ - if not isinstance(gps, dict): - raise TypeError("Invalid GPS INFO type") - - sentence = self.get_frcmd_id("_SendMessage") - - try: - lat = float(gps[gps_nmea.NmeaStatus.LATITUDE]) - if lat < 0.0: - lat_h = 'S' - else: - lat_h = 'N' - - long = float(gps[gps_nmea.NmeaStatus.LONGITUDE]) - if long < 0.0: - long_h = 'W' - else: - long_h = 'E' - - sentence += "%f,%s,%f,%s," % (lat, lat_h, long, long_h) - - except KeyError: - raise ValueError() - - # these are optional - alt = gps.get(gps_nmea.NmeaStatus.ALTITUDE, 0.0) - speed = gps.get(gps_nmea.NmeaStatus.SPEED_KNOTS, 0.0) - heading = gps.get(gps_nmea.NmeaStatus.COURSE_TRUE, "") - raw_date = gps.get(gps_nmea.NmeaStatus.RAW_DATE, "") - raw_time = gps.get(gps_nmea.NmeaStatus.RAW_TIME, "") - sentence += "%f,%f,%s,%s,%s" % (alt, speed, heading, - raw_date, raw_time) - - sentence = gps_nmea.wrap_sentence(sentence) - return sentence - - def form_frlin(self, force_imei=True): - """ - Form the $FRLIN sentence, assuming the SELF values are valid: - * self.server_major_version - * self.server_minor_version - * self.client_name_version - - The return is wrapped with the NMEA checksum - - :return: - :rtype: str - """ - - if not force_imei and self.client_username is not None: - # we prefer the username - when set! - if not isinstance(self.client_username, str): - raise ValueError("FRLIN Error: user name is not string") - if not isinstance(self.client_password, str): - raise ValueError("FRLIN Error: password is not string") - sentence = "FRLIN,,{0},{1}".format( - self.client_username, - self._encrypt_password(self.client_password)) - else: - if not isinstance(self.client_imei, str): - raise ValueError("FRLIN Error: IMEI is not string") - sentence = "FRLIN,IMEI,{0},".format(self.client_imei) - sentence = gps_nmea.wrap_sentence(sentence) - return sentence - - def form_frret_imei(self): - """ - Form the $FRRET,IMEI response for server - - The return is wrapped with the NMEA checksum - - :return: - :rtype: str - """ - sentence = self.get_frret_id( - "_GprsSettings") + ",,{0},{1},{2}".format( - self.DEF_TRACKER_NAME, self.client_name, self.client_version) - - if self.OPT_USE_ONLY_TCP: - sentence += ",tcp" - sentence = gps_nmea.wrap_sentence(sentence) - return sentence - - def form_frver(self): - """ - Form the $FRVER sentence, assuming the SELF values are valid: - * self.server_major_version - * self.server_minor_version - * self.client_name_version - - The return is wrapped with the NMEA checksum - - :return: - :rtype: str - """ - sentence = "FRVER,{0},{1},{2} {3}".format( - self.server_major_version, self.server_minor_version, - self.client_name, self.client_version) - sentence = gps_nmea.wrap_sentence(sentence) - return sentence - - @staticmethod - def form_frwdt(): - """ - Start our NMEA forwarding - is fixed message. We return a COPY just - to prevent someone doing something wonky to 'the original', like - make lower case or affect NMEA wrapping - - :return: - :rtype: str - """ - return copy.copy('$FRWDT,NMEA*78') - - def _parse_frret(self, tokens): - """ - Parse a server response cms - - :param list tokens: - :return: - """ - if len(tokens) < 4: - raise ValueError("FRRET is too short.") - - assert tokens[0] == "FRRET" - - # we'll ignore the user name or context - - value = tokens[2].lower() - - if value == '_getupdaterules': - # then this is server's response to our update query - if self.state == self.STATE_ASK_UPDATE: - # then expected - self.state = self.STATE_FORWARD_READY - - else: # then unexpected! - self.logger.warning( - "Unexpected FRRET _getupdaterules response") - - # ignore - not sure the significance - # value = tokens[3].lower() - # if value != 'nmea': - # self.logger.warning( - # "FRRET: Unexpected server major number, saw:" + - # "{} expect:{}".format(value, self.server_major_version)) - - else: - self.logger.warning("FRRET: Unexpected cmd:{}".format(value)) - return False - - return True - - def _parse_frses(self, tokens): - """ - Parse the SESSION response from server - - :param list tokens: - :return: - """ - if len(tokens) < 2: - raise ValueError("FRSES is too short.") - - assert tokens[0] == "FRSES" - - if self.state == self.STATE_TRY_LOGIN: - # then expected - self.state = self.STATE_HAVE_SESSION - - else: # then unexpected! - if self.logger is not None: - self.logger.warning("Unexpected FRSES response") - - self.session = tokens[1] - if self.logger is not None: - self.logger.debug( - "Recording server SESSION:{}".format(self.session)) - return True - - def _parse_frval(self, tokens): - """ - Parse a value in our name-space - - FRVAL,DistanceFilter,500.0 - - :param list tokens: - :return: - """ - if len(tokens) < 3: - raise ValueError("FRVAL is too short.") - - assert tokens[0] == "FRVAL" - - name = tokens[1].lower() - - if name == "distancefilter": - self.nmea.set_distance_filter(tokens[2]) - - elif name == "timefilter": - self.nmea.set_time_filter(tokens[2]) - - elif name == "speedfilter": - self.nmea.set_speed_filter(tokens[2]) - - elif name == "directionfilter": - self.nmea.set_direction_filter(tokens[2]) - - elif name == "directionthreshold": - self.nmea.set_direction_threshold(tokens[2]) - - return True - - def _parse_frver(self, tokens): - """ - Parse the SESSION response from server - - :param list tokens: - :return: - """ - if len(tokens) < 4: - raise ValueError("FRVER is too short.") - - assert tokens[0] == "FRVER" - - if self.state == self.STATE_WAIT_SERVER_VERSION: - # then expected - self.state = self.STATE_HAVE_SERVER_VERSION - - else: # then unexpected! - self.logger.warning("Unexpected FRVER response") - - value = parse_integer(tokens[1]) - if value != self.server_major_version: - self.logger.warning( - "FRVER: Unexpected server major number, saw:" + - "{} expect:{}".format(value, self.server_major_version)) - self.server_major_version = value - - value = parse_integer(tokens[2]) - if value != self.server_minor_version: - self.logger.warning( - "FRVER: Unexpected server minor number, saw:" + - "{} expect:{}".format(value, self.server_minor_version)) - self.server_minor_version = value - - self.server_title = tokens[3] - self.logger.debug( - "Recording server TITLE:{}".format(self.server_title)) - return True - - @staticmethod - def _encrypt_password(value: str): - """ - Do the simple adjustment per spec - - Encryption sample: "coolness" -> "HHVMOLLX" - - :param value: - :return: - """ - assert isinstance(value, str) - result = "" - - for ch in value: - i = ord(ch) - if '0' <= ch <= '9': - # result += (9 - (i - '0') + '0') - result += chr(9 - (i - 48) + 48) - - elif 'a' <= ch <= 'z': - # (char)(('z' - 'a') - (c - 'a') + 'A')) - result += chr(25 - (i - 97) + 65) - - elif 'A' <= ch <= 'Z': - # (char)(('Z' - 'A') - (c - 'A') + 'a')); - result += chr(25 - (i - 65) + 97) - - # use extended slice to reverse string - return result[::-1] diff --git a/demo/gps_gate/settings.ini b/demo/gps_gate/settings.ini deleted file mode 100644 index b41e3535..00000000 --- a/demo/gps_gate/settings.ini +++ /dev/null @@ -1,55 +0,0 @@ -; one app settings - -[application] -name=gps_gate -description=Receive NMEA sentences on localhost port, send to GpsGate -path = demo/gps_gate -uuid=9246bb79-db63-4243-a872-db0cbce5dcf3 -version=1.1 - -[gps_gate] -; do NOT set these if you desire Router API in config/system/gps to be used! -; these OVER-RIDE the router api values -; host_ip=192.168.1.6 -; host_port=9992 - -; likely, all you need is the URL assigned to you, and the server matches up -; data per the imei, which is technically (I beleive) just a unique -; shared identity (or secret of sorts) -gps_gate_url=64.46.40.178 -; gps_gate_port=30175 -; gps_gate_transport=tcp - -; this code does NOT use username/password, although it does read them -; username=admin -; password={as needed} -; server_version=1.1 -; client=Cradlepoint 1.0 - -; do NOT set if you desire Router API in config/wan to be used! -; imei=353547060660845 - -; can pre-set the filters here, but Gpsgate may try to override -; setting any filter to 0, 0.0, None, or null to disable - -; Distance Filter in meters, how far to travel between uploads -; module clamps to between 1 and 6,000,000 meters (~ half way around earth) -; distance_filter=10.0 - -; Time filter in seconds, how many seconds between min upload rate -; supports tags in ('sec', 'min', 'hr', 'day'), so '5 min' is fine -; module clamps to between 10 and 86400 seconds (1/once a day) -; time_filter=1 min - -; Speed filter in m/sec, how much speed change between uploads -; module clamps to between 1 and 500 m/sec -; speed_filter=4 - -; Direction filter in degrees, how much course change between uploads -; module clamps to between 1 and 360 degrees -; direction_filter=25 - -; Direction threshold in meters, a modifier to direction/course change -; of how many meters must be travelled to consider the change meaningful -; module clamps to between 1 and 6,000,000 meters (~ half way around earth) -; direction_threshold=25 diff --git a/demo/gps_gate/test/connect.py b/demo/gps_gate/test/connect.py deleted file mode 100644 index 0b58dca3..00000000 --- a/demo/gps_gate/test/connect.py +++ /dev/null @@ -1,232 +0,0 @@ -# Test the gps.gps_gate.gps_gate_protocol module - -import socket -import time - -import demo.gps_gate.gps_gate_protocol as protocol -from cp_lib.gps_nmea import fix_time_sentence -from cp_lib.load_gps_config import GpsConfig -from cp_lib.load_active_wan import ActiveWan -from cp_lib.parse_data import clean_string, parse_integer - -# Here is a sample TRACE of this code running -# -# INFO:make:GpsGate: Setting IMEI:353547060660845 -# INFO:make:GpsGate: Setting Server URL:64.46.40.178 -# INFO:make:GpsGate: Setting user name:Admin -# INFO:make:GpsGate: Setting new PASSWORD:**** -# INFO:make:Preparing to connect on TCP socket ('64.46.40.178', 30175) -# DEBUG:make:get_next() entry state:offline -# DEBUG:make:get_next() exit state:login -# DEBUG:make:Req(b'$FRLIN,IMEI,353547060660845,*47\r\n') -# DEBUG:make:Rsp(b'$FRSES,83*76\r\n') -# DEBUG:make:Recording server SESSION:83 -# DEBUG:make:get_next() entry state:session -# DEBUG:make:get_next() exit state:wait_ver -# DEBUG:make:Req(b'$FRVER,1,1,Cradlepoint 1.0*27\r\n') -# DEBUG:make:Rsp(b'$FRVER,1,1,GpsGate Server 3.0.0.2583*3E\r\n') -# DEBUG:make:Recording server TITLE:GpsGate Server 3.0.0.2583 -# DEBUG:make:get_next() entry state:have_ver -# DEBUG:make:get_next() exit state:update -# DEBUG:make:Req(b'$FRCMD,,_getupdaterules,Inline*1E') -# DEBUG:make:Rsp(b'$FRRET,IBR350,_getupdaterules,Nmea,5*6F\r\n') -# DEBUG:make:Rsp(b'$FRVAL,DistanceFilter,500.0*67\r\n$FRVAL,TimeFilter, -# 60.0*42\r\n$FRVAL,SpeedFilter,2.8*0C\r\n$FRVAL,DirectionFilter, -# 30.0*37\r\n$FRVAL,DirectionThreshold,10.0*42\r\n') -# DEBUG:make:NMEA.set_distance_filter = 500.0 m -# DEBUG:make:NMEA.set_time_filter = 60.0 sec -# DEBUG:make:NMEA.set_speed_filter = 2.8 m/sec -# DEBUG:make:NMEA.set_direction_filter = 30.0 deg -# DEBUG:make:NMEA.set_direction_threshold = 10.0 m -# ERROR:make:No response - jump from loop! -# DEBUG:make:get_next() entry state:ready -# DEBUG:make:get_next() exit state:forwarding -# DEBUG:make:Req(b'$FRWDT,NMEA*78') -# DEBUG:make:Req(b'$GPGGA,143736.0,4334.784909,N,11612.766448,W,1,09,0.9, -# 830.6,M,-11.0,M,,*6B\r\n') - - -def run_client(): - global base_app - - obj = protocol.GpsGate(base_app.logger) - - # base_app.logger.debug("sets:{}".format(base_app.settings)) - - # set a few defaults - imei = "353547060660845" - gps_gate_url = "64.46.40.178" - gps_gate_port = 30175 - - if "gps_gate" in base_app.settings: - # then we do have a customer config - temp = base_app.settings["gps_gate"] - - # check on our localhost port (not used, but to test) - config = GpsConfig(base_app) - host_ip, host_port = config.get_client_info() - if "host_ip" in temp: - # then OVER-RIDE what the router told us - base_app.logger.warning("Settings OVER-RIDE router host_ip") - value = clean_string(temp["host_ip"]) - base_app.logger.warning("was:{} now:{}".format(host_ip, value)) - host_ip = value - - if "host_port" in temp: - # then OVER-RIDE what the router told us - base_app.logger.warning("Settings OVER-RIDE router host_port") - value = parse_integer(temp["host_port"]) - base_app.logger.warning("was:{} now:{}".format(host_port, value)) - host_port = value - - base_app.logger.debug("GPS source:({}:{})".format(host_ip, host_port)) - del config - - # check on our cellular details - config = ActiveWan(base_app) - imei = config.get_imei() - if "imei" in temp: - # then OVER-RIDE what the router told us - base_app.logger.warning("Settings OVER-RIDE router IMEI") - value = clean_string(temp["imei"]) - base_app.logger.warning("was:{} now:{}".format(imei, value)) - imei = value - del config - - if "gps_gate_url" in temp: - # load the settings.ini value - gps_gate_url = clean_string(temp["gps_gate_url"]) - - if "gps_gate_port" in temp: - # load the settings.ini value - gps_gate_port = parse_integer(temp["gps_gate_port"]) - - obj.set_imei(imei) - obj.set_server_url(gps_gate_url) - obj.set_server_port(gps_gate_port) - - # we never need these! - # obj.set_username('Admin') - # obj.set_password(':Vm78!!') - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - sock.settimeout(2.0) - address = (obj.gps_gate_url, obj.gps_gate_port) - - base_app.logger.info( - "Preparing to connect on TCP socket {}".format(address)) - - # attempt to actually lock the resource, which may fail if unavailable - # (see CONNECT ERROR note) - try: - sock.connect(address) - except OSError as msg: - base_app.logger.error("socket.connect() failed - {}".format(msg)) - - return -1 - - # first test - try our user name: - # Req = $FRLIN,, Admin,12Ne*14\r\n - # Rsp = $FRERR,AuthError,Wrong username or password*56\r\n - - # second test - try our IMEI: - # Req = $FRLIN,IMEI,353547060660845,*47\r\n - # Rsp = $FRSES,75*7F\r\n - - # expect Req = $FRLIN,IMEI,353547060660845,*47\r\n - request = obj.get_next_client_2_server() - base_app.logger.debug("Req({})".format(request)) - sock.send(request) - - # expect Rsp = $FRSES,75*7F\r\n - try: - response = sock.recv(1024) - base_app.logger.debug("Rsp({})".format(response)) - result = obj.parse_message(response) - if not result: - base_app.logger.debug("parse result({})".format(result)) - except socket.timeout: - base_app.logger.error("No response - one was expected!") - return -1 - - # expect Req = $FRVER,1,1,Cradlepoint 1.0*27\r\n - request = obj.get_next_client_2_server() - base_app.logger.debug("Req({})".format(request)) - sock.send(request) - - # expect Rsp = $FRVER,1,1,GpsGate Server 3.0.0.2583*3E\r\n - try: - response = sock.recv(1024) - base_app.logger.debug("Rsp({})".format(response)) - result = obj.parse_message(response) - if not result: - base_app.logger.debug("parse result({})".format(result)) - except socket.timeout: - base_app.logger.error("No response - one was expected!") - return -1 - - # expect Req = $FRCMD,,_getupdaterules,Inline*1E - request = obj.get_next_client_2_server() - base_app.logger.debug("Req({})".format(request)) - sock.send(request) - - # expect Rsp = $FRRET,User1,_getupdaterules,Nmea,2*07 - try: - response = sock.recv(1024) - base_app.logger.debug("Rsp({})".format(response)) - result = obj.parse_message(response) - if not result: - base_app.logger.debug("parse result({})".format(result)) - except socket.timeout: - base_app.logger.error("No response - one was expected!") - return -1 - - # now we LOOP and process the rules! - while True: - # expect Rsp = $FRVAL,DistanceFilter,500.0*67 - try: - response = sock.recv(1024) - base_app.logger.debug("Rsp({})".format(response)) - result = obj.parse_message(response) - if not result: - base_app.logger.debug("parse result({})".format(result)) - except socket.timeout: - base_app.logger.error("No response - jump from loop!") - break - - # expect Req = b"$FRWDT,NMEA*78" - request = obj.get_next_client_2_server() - base_app.logger.debug("Req({})".format(request)) - sock.send(request) - # this message has NO response! - - # our fake data, time-fixed to me NOW - request = fix_time_sentence("$GPGGA,094013.0,4334.784909,N,11612.7664" + - "48,W,1,09,0.9,830.6,M,-11.0,M,,*60") - request = request.encode() - base_app.logger.debug("Req({})".format(request)) - sock.send(request) - - # this message has NO response! - time.sleep(2.0) - - sock.close() - - return 0 - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - import tools.make_load_settings - - app_name = 'demo.gps_gate' - - # we share the settings.ini in demo/gps_gate/settings.ini - base_app = CradlepointAppBase(full_name=app_name, call_router=False) - - # force a full make/read of {app_path}/settings.ini - base_app.settings = tools.make_load_settings.load_settings( - base_app.app_path) - - run_client() diff --git a/demo/gps_gate/test/rcv_localhost.py b/demo/gps_gate/test/rcv_localhost.py deleted file mode 100644 index 03ef38bb..00000000 --- a/demo/gps_gate/test/rcv_localhost.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Received GPS, assuming the router's GPS function sends new data (sentences) -to a localhost port -""" - -import socket -import time -import gc - -from cp_lib.app_base import CradlepointAppBase -from demo.gps_gate.gps_gate_nmea import NmeaCollection - - -DEF_HOST_IP = '192.168.1.6' -DEF_HOST_PORT = 9999 -DEF_BUFFER_SIZE = 1024 - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - host_ip = DEF_HOST_IP - host_port = DEF_HOST_PORT - buffer_size = DEF_BUFFER_SIZE - - gps = NmeaCollection(app_base.logger) - gps.set_time_filter(30.0) - - while True: - # define the socket resource, including the type (stream == "TCP") - address = (host_ip, host_port) - app_base.logger.info("Preparing GPS Listening on {}".format(address)) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # attempt to actually lock resource, which may fail if unavailable - # (see BIND ERROR note) - try: - sock.bind(address) - except OSError as msg: - app_base.logger.error("socket.bind() failed - {}".format(msg)) - - # technically, Python will close when 'sock' goes out of scope, - # but be disciplined and close it yourself. Python may warning - # you of unclosed resource, during runtime. - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors - # are likely permanent. - return -1 - - # only allow 1 client at a time - sock.listen(3) - - while True: - # loop forever - app_base.logger.info("Waiting on TCP socket %d" % host_port) - client, address = sock.accept() - app_base.logger.info("Accepted connection from {}".format(address)) - - # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # set non-blocking so we can do a manual timeout (use of select() - # is better ... but that's another sample) - # client.setblocking(0) - - while True: - app_base.logger.debug("Waiting to receive data") - data = client.recv(buffer_size) - # data is type() bytes, to echo we don't need to convert - # to str to format or return. - if data: - data = data.decode().split() - - gps.start() - for line in data: - result = gps.parse_sentence(line) - if not result: - break - need_publish, reason = gps.end() - if need_publish: - app_base.logger.debug( - "Publish reason:{}".format(reason)) - report = gps.report_list() - for line in report: - app_base.logger.debug("{}".format(line)) - gps.publish() - - # else: - # app_base.logger.debug("No Publish") - - # # client.send(data) - else: - break - - time.sleep(1.0) - - app_base.logger.info("Client disconnected") - client.close() - - # since this server is expected to run on a small embedded system, - # free up memory ASAP (see MEMORY note) - del client - gc.collect() - - return 0 - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("gps/gps_gate") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/demo/gps_gate/test/test_gps_gate_nmea.py b/demo/gps_gate/test/test_gps_gate_nmea.py deleted file mode 100644 index 3b8bda9d..00000000 --- a/demo/gps_gate/test/test_gps_gate_nmea.py +++ /dev/null @@ -1,416 +0,0 @@ -# Test the gps.gps_gate.gps_gate_nmea module -import logging -import unittest - -import demo.gps_gate.gps_gate_nmea as nmea - - -class TestGpsGateNmea(unittest.TestCase): - - def test_distance_meters(self): - global base_app - - # note: had to manually confirm 'import math' works on router - - base_app.logger.info("TEST Haversine formula for distance") - base_app.logger.setLevel(logging.INFO) - - lon1 = -93.334702 - lat1 = 45.013432 - base_app.logger.info("MSP long:{} lat:{}".format(lon1, lat1)) - - lon2 = -116.20599500000003 - lat2 = 43.6194842 - base_app.logger.info("BOI long:{} lat:{}".format(lon2, lat2)) - - obj = nmea.NmeaCollection(base_app.logger) - delta = obj._distance_meters(lon1, lat1, lon2, lat2) - base_app.logger.info( - "Distance MSP to BOI = {} km".format(delta * 1000.0)) - - # delta is in meters, not KM - self.assertEqual(int(delta), 1820118) - - # this returns 1820 KM, by highway is 2347.7 KM - # by cgs network .com = 1845 KM - - return - - def test_set_distance_filter(self): - global base_app - - base_app.logger.info("TEST set_distance_filter()") - base_app.logger.setLevel(logging.INFO) - - obj = nmea.NmeaCollection(base_app.logger) - - min_limit = obj.DISTANCE_FILTER_LIMITS[0] - max_limit = obj.DISTANCE_FILTER_LIMITS[1] - base_app.logger.debug("Min:{} Max:{}".format(min_limit, max_limit)) - # distance tests, in meters - alternate - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': min_limit}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': max_limit}, - - {'inp': 'why?', 'out': ValueError}, - {'inp': b'why?', 'out': ValueError}, - {'inp': (1, 2), 'out': ValueError}, - ] - - self.assertTrue(obj.CLAMP_SETTINGS) - - if obj.DISTANCE_FILTER_DEF is None: - self.assertIsNone(obj.distance_filter) - else: - self.assertIsNotNone(obj.distance_filter) - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_distance_filter(test['inp']) - - else: - obj.set_distance_filter(test['inp']) - self.assertEqual(obj.distance_filter, test['out']) - - # repeat tests with - obj.CLAMP_SETTINGS = False - self.assertFalse(obj.CLAMP_SETTINGS) - - # distance tests, in meters - alternate - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': ValueError}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': ValueError}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': ValueError}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': ValueError}, - ] - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_distance_filter(test['inp']) - - else: - obj.set_distance_filter(test['inp']) - self.assertEqual(obj.distance_filter, test['out']) - - return - - def test_set_speed_filter(self): - global base_app - - base_app.logger.info("TEST set_speed_filter()") - base_app.logger.setLevel(logging.INFO) - - obj = nmea.NmeaCollection(base_app.logger) - - min_limit = obj.SPEED_FILTER_LIMITS[0] - max_limit = obj.SPEED_FILTER_LIMITS[1] - base_app.logger.debug("Min:{} Max:{}".format(min_limit, max_limit)) - # distance tests, in meters - alternate - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': min_limit}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': max_limit}, - - {'inp': 'why?', 'out': ValueError}, - {'inp': b'why?', 'out': ValueError}, - {'inp': (1, 2), 'out': ValueError}, - ] - - self.assertTrue(obj.CLAMP_SETTINGS) - - if obj.SPEED_FILTER_DEF is None: - self.assertIsNone(obj.speed_filter) - else: - self.assertIsNotNone(obj.speed_filter) - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_speed_filter(test['inp']) - - else: - obj.set_speed_filter(test['inp']) - self.assertEqual(obj.speed_filter, test['out']) - - return - - def test_set_direction_filter(self): - global base_app - - base_app.logger.info("TEST set_direction_filter()") - base_app.logger.setLevel(logging.INFO) - - obj = nmea.NmeaCollection(base_app.logger) - - min_limit = obj.DIRECTION_FILTER_LIMITS[0] - max_limit = obj.DIRECTION_FILTER_LIMITS[1] - base_app.logger.debug("Min:{} Max:{}".format(min_limit, max_limit)) - # distance tests, in meters - alternate - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': min_limit}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': max_limit}, - - {'inp': 'why?', 'out': ValueError}, - {'inp': b'why?', 'out': ValueError}, - {'inp': (1, 2), 'out': ValueError}, - ] - - self.assertTrue(obj.CLAMP_SETTINGS) - - if obj.DIRECTION_FILTER_DEF is None: - self.assertIsNone(obj.direction_filter) - else: - self.assertIsNotNone(obj.direction_filter) - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_direction_filter(test['inp']) - - else: - obj.set_direction_filter(test['inp']) - self.assertEqual(obj.direction_filter, test['out']) - - return - - def test_set_direction_threshold(self): - global base_app - - base_app.logger.info("TEST set_direction_threshold()") - base_app.logger.setLevel(logging.INFO) - - obj = nmea.NmeaCollection(base_app.logger) - - min_limit = obj.DIRECTION_THRESHOLD_LIMITS[0] - max_limit = obj.DIRECTION_THRESHOLD_LIMITS[1] - base_app.logger.debug("Min:{} Max:{}".format(min_limit, max_limit)) - # distance tests, in meters - alternate - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': min_limit}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': max_limit}, - - {'inp': 'why?', 'out': ValueError}, - {'inp': b'why?', 'out': ValueError}, - {'inp': (1, 2), 'out': ValueError}, - ] - - self.assertTrue(obj.CLAMP_SETTINGS) - - if obj.DIRECTION_FILTER_DEF is None: - self.assertIsNone(obj.direction_threshold) - else: - self.assertIsNotNone(obj.direction_threshold) - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_direction_threshold(test['inp']) - - else: - obj.set_direction_threshold(test['inp']) - self.assertEqual(obj.direction_threshold, test['out']) - - return - - def test_set_time_filter(self): - global base_app - - base_app.logger.info("TEST set_time_filter()") - base_app.logger.setLevel(logging.DEBUG) - - obj = nmea.NmeaCollection(base_app.logger) - - min_limit = obj.TIME_FILTER_LIMITS[0] - max_limit = obj.TIME_FILTER_LIMITS[1] - base_app.logger.debug("Min:{} Max:{}".format(min_limit, max_limit)) - tests = [ - {'inp': '', 'out': None}, - {'inp': '100', 'out': 100.0}, - {'inp': None, 'out': None}, - {'inp': '100.0', 'out': 100.0}, - {'inp': 0, 'out': None}, - {'inp': 100, 'out': 100.0}, - {'inp': '0', 'out': None}, - {'inp': 100.0, 'out': 100.0}, - {'inp': '0', 'out': None}, - - # test clamps - {'inp': min_limit, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': min_limit - 0.9, 'out': min_limit}, - {'inp': '0', 'out': None}, - {'inp': -1, 'out': min_limit}, - - {'inp': '0', 'out': None}, - {'inp': max_limit, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': max_limit + 0.9, 'out': max_limit}, - {'inp': '0', 'out': None}, - {'inp': 99999999, 'out': max_limit}, - - {'inp': 'why?', 'out': ValueError}, - {'inp': b'why?', 'out': ValueError}, - {'inp': (1, 2), 'out': ValueError}, - - # test the SPECIAL values with time-tags - {'inp': '1 sec', 'out': min_limit}, - {'inp': '5 sec', 'out': min_limit}, - {'inp': '10 sec', 'out': min_limit}, - - {'inp': '15 sec', 'out': 15.0}, - {'inp': '5 min', 'out': 300.0}, - {'inp': '5 hr', 'out': 18000.0}, - {'inp': '20 hr', 'out': 72000.0}, - {'inp': '24 hr', 'out': 86400.0}, - {'inp': '1 day', 'out': 86400.0}, - - {'inp': '25 day', 'out': max_limit}, - {'inp': '2 day', 'out': max_limit}, - ] - - self.assertTrue(obj.CLAMP_SETTINGS) - - if obj.TIME_FILTER_DEF is None: - self.assertIsNone(obj.time_filter) - else: - self.assertIsNotNone(obj.time_filter) - - for test in tests: - - base_app.logger.debug("TEST {}".format(test)) - - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_time_filter(test['inp']) - - else: - obj.set_time_filter(test['inp']) - self.assertEqual(obj.time_filter, test['out']) - - return - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - - base_app = CradlepointAppBase(call_router=False) - unittest.main() diff --git a/demo/gps_gate/test/test_gps_gate_protocol.py b/demo/gps_gate/test/test_gps_gate_protocol.py deleted file mode 100644 index a6e36ad7..00000000 --- a/demo/gps_gate/test/test_gps_gate_protocol.py +++ /dev/null @@ -1,352 +0,0 @@ -# Test the gps.gps_gate.gps_gate_protocol module - -import unittest - -import demo.gps_gate.gps_gate_protocol as protocol - - -class TestGpsGateProtocol(unittest.TestCase): - - def test_sets(self): - global base_app - - print("") # skip paste '.' on line - - base_app.logger.info("TEST set of client details") - - tests = [ - {'inp': '', 'out': ''}, - {'inp': 'User1', 'out': 'User1'}, - {'inp': ' User2 ', 'out': 'User2'}, - {'inp': '\"User3\"', 'out': 'User3'}, - {'inp': '\'User4\'', 'out': 'User4'}, - {'inp': b'', 'out': ''}, - {'inp': b'User1', 'out': 'User1'}, - {'inp': b' User2 ', 'out': 'User2'}, - {'inp': b'\"User3\"', 'out': 'User3'}, - {'inp': b'\'User4\'', 'out': 'User4'}, - {'inp': None, 'out': TypeError}, - {'inp': 10, 'out': TypeError}, - {'inp': 100.998, 'out': TypeError}, - ] - - obj = protocol.GpsGate(base_app.logger) - self.assertIsNone(obj.client_username) - self.assertIsNone(obj.client_password) - self.assertIsNone(obj.client_imei) - - for test in tests: - - if test['out'] == TypeError: - with self.assertRaises(TypeError): - obj.set_username(test['inp']) - with self.assertRaises(TypeError): - obj.set_password(test['inp']) - with self.assertRaises(TypeError): - obj.set_imei(test['inp']) - - else: - obj.set_username(test['inp']) - self.assertEqual(obj.client_username, test['out']) - obj.set_password(test['inp']) - self.assertEqual(obj.client_password, test['out']) - obj.set_imei(test['inp']) - self.assertEqual(obj.client_imei, test['out']) - - base_app.logger.info("TEST set of client name") - tests = [ - {'name_in': 'My Tools', 'ver_in': '9.3', - 'name_out': 'My Tools', 'ver_out': '9.3'}, - {'name_in': 'My Toes', 'ver_in': 7.8, - 'name_out': 'My Toes', 'ver_out': '7.8'}, - {'name_in': 'My Nose', 'ver_in': 14, - 'name_out': 'My Nose', 'ver_out': '14.0'}, - {'name_in': 'Boss', 'ver_in': 13.25, - 'name_out': 'Boss', 'ver_out': '13.25'}, - {'name_in': 'Tammy Gears 7.2', 'ver_in': None, - 'name_out': 'Tammy Gears', 'ver_out': '7.2'}, - {'name_in': 'Ziggy', 'ver_in': None, - 'name_out': 'Ziggy', 'ver_out': '1.0'}, - {'name_in': 'Tammy Gears 9 8.1', 'ver_in': None, - 'name_out': 'Tammy Gears 9', 'ver_out': '8.1'}, - {'name_in': 'Tammy Gears two 4.3', 'ver_in': None, - 'name_out': 'Tammy Gears two', 'ver_out': '4.3'}, - {'name_in': 'Tammy Gears two', 'ver_in': None, - 'name_out': 'Tammy Gears two', 'ver_out': '1.0'}, - ] - - # start with defaults - self.assertEqual(obj.client_name, obj.DEF_CLIENT_NAME) - self.assertEqual(obj.client_version, obj.DEF_CLIENT_VERSION) - - for test in tests: - obj.set_client_name(test['name_in'], test['ver_in']) - self.assertEqual(obj.client_name, test['name_out']) - self.assertEqual(obj.client_version, test['ver_out']) - - base_app.logger.info("TEST set of server URL, Port, and Transport") - tests = [ - {'in': 'gps.linse.org', 'out': 'gps.linse.org'}, - {'in': '\"web.linse.org\"', 'out': 'web.linse.org'}, - ] - - # start with defaults - self.assertEqual(obj.gps_gate_url, obj.DEF_GPS_GATE_URL) - - for test in tests: - obj.set_server_url(test['in']) - self.assertEqual(obj.gps_gate_url, test['out']) - - tests = [ - {'in': '9999', 'out': 9999}, - {'in': 8824, 'out': 8824}, - ] - - # start with defaults - self.assertEqual(obj.gps_gate_port, obj.DEF_GPS_GATE_PORT) - - for test in tests: - obj.set_server_port(test['in']) - self.assertEqual(obj.gps_gate_port, test['out']) - - tests = [ - {'in': 'tcp', 'out': 'tcp'}, - {'in': 'TCP', 'out': 'tcp'}, - {'in': 'Tcp', 'out': 'tcp'}, - {'in': 'silly', 'out': ValueError}, - {'in': 'xml', 'out': NotImplementedError}, - ] - - # start with defaults - self.assertEqual(obj.gps_gate_transport, obj.DEF_GPS_GATE_TRANSPORT) - - for test in tests: - if test['out'] == ValueError: - with self.assertRaises(ValueError): - obj.set_server_transport(test['in']) - elif test['out'] == NotImplementedError: - with self.assertRaises(NotImplementedError): - obj.set_server_transport(test['in']) - else: - obj.set_server_transport(test['in']) - self.assertEqual(obj.gps_gate_transport, test['out']) - - return - - def test_frlin(self): - global base_app - - print("") # skip paste '.' on line - base_app.logger.info("TEST FRLIN") - - obj = protocol.GpsGate(base_app.logger) - self.assertIsNone(obj.client_username) - self.assertIsNone(obj.client_password) - self.assertIsNone(obj.client_imei) - - # a simple encryption test using sample in the spec - expect = "HHVMOLLX" - result = obj._encrypt_password("coolness") - self.assertEqual(result, expect) - - with self.assertRaises(ValueError): - # since user name is None - obj.form_frlin() - - obj.set_username("cradlepoint") - with self.assertRaises(ValueError): - # since password is None - obj.form_frlin() - - obj.set_password("Billy6Boy") - result = obj.form_frlin() - expect = '$FRLIN,,cradlepoint,BLy3BOORy*2F\r\n' - self.assertEqual(result, expect) - - with self.assertRaises(ValueError): - # since imei is None - obj.form_frlin(force_imei=True) - - obj.set_imei("353547060660845") - result = obj.form_frlin() - expect = '$FRLIN,,cradlepoint,BLy3BOORy*2F\r\n' - self.assertEqual(result, expect) - - result = obj.form_frlin(force_imei=True) - expect = '$FRLIN,IMEI,353547060660845,*47\r\n' - self.assertEqual(result, expect) - - return - - def test_frret_imei(self): - global base_app - - print("") # skip paste '.' on line - base_app.logger.info("TEST FRRET IMEI") - - obj = protocol.GpsGate(base_app.logger) - self.assertEqual(obj.tracker_name, obj.DEF_TRACKER_NAME) - self.assertEqual(obj.client_name, obj.DEF_CLIENT_NAME) - self.assertEqual(obj.client_version, obj.DEF_CLIENT_VERSION) - - # a simple encryption test using sample in the spec - expect = '$FRRET,Cradlepoint,_GprsSettings,,GpsGate TrackerOne,' +\ - 'Cradlepoint,1.0*7B\r\n' - result = obj.form_frret_imei() - self.assertEqual(result, expect) - - return - - def test_frver(self): - global base_app - - print("") # skip paste '.' on line - base_app.logger.info("TEST FRVER") - - obj = protocol.GpsGate(base_app.logger) - - # a simple encryption test using sample in the spec - expect = '$FRVER,1,1,Cradlepoint 1.0*27\r\n' - result = obj.form_frver() - self.assertEqual(result, expect) - - return - - def test_parse_frval(self): - global base_app - - print("") # skip paste '.' on line - base_app.logger.info("TEST FRVAL") - - obj = protocol.GpsGate(base_app.logger) - - self.assertIsNone(obj.nmea.distance_filter) - source = "$FRVAL,DistanceFilter,500.0*67" - obj.parse_message(source) - self.assertEqual(obj.nmea.distance_filter, 500.0) - - source = "$FRVAL,DistanceFilter,200.0" - obj.parse_message(source) - self.assertEqual(obj.nmea.distance_filter, 200.0) - - source = "FRVAL,DistanceFilter,100.0" - obj.parse_message(source) - self.assertEqual(obj.nmea.distance_filter, 100.0) - - self.assertIsNone(obj.nmea.time_filter) - source = "$FRVAL,TimeFilter,60.0*42" - obj.parse_message(source) - self.assertEqual(obj.nmea.time_filter, 60.0) - - self.assertIsNone(obj.nmea.direction_filter) - source = "$FRVAL,DirectionFilter,40.0*30" - obj.parse_message(source) - self.assertEqual(obj.nmea.direction_filter, 40.0) - - self.assertIsNone(obj.nmea.direction_threshold) - source = "$FRVAL,DirectionThreshold,10.0*42" - obj.parse_message(source) - self.assertEqual(obj.nmea.direction_threshold, 10.0) - - self.assertIsNone(obj.nmea.speed_filter) - source = "$FRVAL,SpeedFilter,25.0*31" - obj.parse_message(source) - self.assertEqual(obj.nmea.speed_filter, 25.0) - - return - - def test_state_machine(self): - global base_app - - print("") # skip paste '.' on line - base_app.logger.info("TEST server state machine") - - obj = protocol.GpsGate(base_app.logger) - obj.set_imei("353547060660845") - - self.assertEqual(obj.state, obj.STATE_OFFLINE) - - expect = "$FRLIN,IMEI,353547060660845,*47\r\n" - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_TRY_LOGIN) - self.assertEqual(message, expect) - - # repeat, is okay but get warning - expect = "$FRLIN,IMEI,353547060660845,*47\r\n" - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_TRY_LOGIN) - self.assertEqual(message, expect) - - server_response = "$FRSES,1221640*4F" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_HAVE_SESSION) - self.assertTrue(result) - - # repeat, is okay but get warning - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_HAVE_SESSION) - self.assertTrue(result) - - expect = "$FRVER,1,1,Cradlepoint 1.0*27\r\n" - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_WAIT_SERVER_VERSION) - self.assertEqual(message, expect) - - # repeat, is okay but get warning - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_WAIT_SERVER_VERSION) - self.assertEqual(message, expect) - - server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION) - self.assertTrue(result) - - # repeat, is okay but get warning - server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION) - self.assertTrue(result) - - obj.set_server_version("0.3") - self.assertEqual(obj.server_major_version, 0) - self.assertEqual(obj.server_minor_version, 3) - - server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION) - self.assertTrue(result) - - expect = "$FRCMD,,_getupdaterules,Inline*1E" - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_ASK_UPDATE) - self.assertEqual(message, expect) - - server_response = "$FRRET,User1,_getupdaterules,Nmea,2*07" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_FORWARD_READY) - self.assertTrue(result) - - server_response = "$FRVAL,DistanceFilter,500.0*67" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_FORWARD_READY) - self.assertTrue(result) - - server_response = "$FRVAL,TimeFilter,60.0*42" - result = obj.parse_message(server_response) - self.assertEqual(obj.state, obj.STATE_FORWARD_READY) - self.assertTrue(result) - - expect = "$FRWDT,NMEA*78" - message = obj.get_next_client_2_server() - self.assertEqual(obj.state, obj.STATE_FORWARDING) - self.assertEqual(message, expect) - - return - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - - base_app = CradlepointAppBase(call_router=False) - unittest.main() diff --git a/demo/gps_replay/README.md b/demo/gps_replay/README.md deleted file mode 100644 index 75a3b9e1..00000000 --- a/demo/gps_replay/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# directory: ./demo/gps_replay -## Router App/SDK sample applications - -These samples are best run on a PC/notebook, for while one CAN save a file -in the router flash, there is NO way to access that file. - -## File: __init__.py - -Is empty! - -## File: gps_save_replay.py - -Run this directly! It probes your router, obtains the configured GPS-to-IP -server settings, and waits on the configured IP/port. It saves the data like -this: - -[ - {"offset":1, "data":$GPGGA,094013.0,4334.784909,N,11612.766448,W,1 (...) *60}, - {"offset":3, "data":$GPGGA,094023.0,4334.784913,N,11612.766463,W,1 (...) *61}, - {"offset":13, "data":$GPGGA,094034.0,4334.784922,N,11612.766471,W, (...) *67}, - - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [gps]: - -* host_port=9999, define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. diff --git a/demo/gps_replay/__init__.py b/demo/gps_replay/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/demo/gps_replay/gps_log.json b/demo/gps_replay/gps_log.json deleted file mode 100644 index ce364b35..00000000 --- a/demo/gps_replay/gps_log.json +++ /dev/null @@ -1,13 +0,0 @@ -[ -{"offset":1, "data":"$GPGGA,094013.0,4334.784909,N,11612.766448,W,1,09,0.9,830.6,M,-11.0,M,,*60"}, -{"offset":3, "data":"$GPGGA,094023.0,4334.784913,N,11612.766463,W,1,09,0.9,830.6,M,-11.0,M,,*61"}, -{"offset":13, "data":"$GPGGA,094034.0,4334.784922,N,11612.766471,W,1,09,0.9,830.7,M,-11.0,M,,*67"}, -{"offset":24, "data":"$GPGGA,094044.0,4334.784917,N,11612.766476,W,1,08,1.0,830.7,M,-11.0,M,,*68"}, -{"offset":34, "data":"$GPGGA,094054.0,4334.784908,N,11612.766493,W,1,07,1.0,830.7,M,-11.0,M,,*63"}, -{"offset":44, "data":"$GPGGA,094104.0,4334.784894,N,11612.766503,W,1,07,1.0,830.8,M,-11.0,M,,*64"}, -{"offset":54, "data":"$GPGGA,094114.0,4334.784886,N,11612.766524,W,1,08,1.0,830.9,M,-11.0,M,,*6D"}, -{"offset":64, "data":"$GPGGA,094124.0,4334.784888,N,11612.766525,W,1,08,0.9,830.9,M,-11.0,M,,*69"}, -{"offset":74, "data":"$GPGGA,094134.0,4334.784897,N,11612.766529,W,1,08,0.8,831.0,M,-11.0,M,,*63"}, -{"offset":84, "data":"$GPGGA,094145.0,4334.784929,N,11612.766557,W,1,09,0.7,831.1,M,-11.0,M,,*67"}, -{"offset":95, "data":"$GPGGA,094155.0,4334.784939,N,11612.766583,W,1,08,1.0,831.2,M,-11.0,M,,*6A"}, -] \ No newline at end of file diff --git a/demo/gps_replay/run_replay.py b/demo/gps_replay/run_replay.py deleted file mode 100644 index 0cd08de5..00000000 --- a/demo/gps_replay/run_replay.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -This is a standalone script, to be run on a PC. It reads a previously -created file (likely created by save_replay.py), then acts like a cradlepoint -router sending the data in a REPLAY mode. - -The replay file format is pseudo-JSON, as it will be like: -[ -{"offset":1, "data":$GPGGA,094013.0,4334.784909,N,11612.766448,W,1 (...) *60}, -{"offset":3, "data":$GPGGA,094023.0,4334.784913,N,11612.766463,W,1 (...) *61}, -{"offset":13, "data":$GPGGA,094034.0,4334.784922,N,11612.766471,W, (...) *67}, - -"offset" is the number of seconds since the start of the replay save, which -are used during replay to delay and meter out the sentences in a realistic -manner. We'll also need to 'edit' the known sentences to add new TIME and -DATE values. -""" -import os -import socket -import time - -from cp_lib.app_base import CradlepointAppBase, CradlepointRouterOffline -from cp_lib.parse_data import clean_string, parse_integer -from cp_lib.load_gps_config import GpsConfig -import cp_lib.gps_nmea as gps_nmea - -DEF_REPLAY_FILE = 'gps_log.json' - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - replay_file_name = DEF_REPLAY_FILE - - try: - # use Router API to fetch any configured data - config = GpsConfig(app_base) - host_ip, host_port = config.get_client_info() - del config - - except CradlepointRouterOffline: - host_ip = None - host_port = 0 - - section = "gps" - if section in app_base.settings: - # then load dynamic values - temp = app_base.settings[section] - - # check on our localhost port (not used, but to test) - if "host_ip" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_ip") - value = clean_string(temp["host_ip"]) - app_base.logger.warning("was:{} now:{}".format(host_ip, value)) - host_ip = value - - if "host_port" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_port") - value = parse_integer(temp["host_port"]) - app_base.logger.warning("was:{} now:{}".format(host_port, value)) - host_port = value - - if "replay_file" in temp: - replay_file_name = clean_string(temp["replay_file"]) - - app_base.logger.debug("GPS destination:({}:{})".format(host_ip, host_port)) - - if not os.path.isfile(replay_file_name): - app_base.logger.error( - "Replay file({}) not found".format(replay_file_name)) - raise FileNotFoundError - - app_base.logger.info( - "Replay file is named:{}".format(replay_file_name)) - - # define the socket resource, including the type (stream == "TCP") - address = (host_ip, host_port) - app_base.logger.info("Will connect on {}".format(address)) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - sock.connect(address) - - file_han = None - start_time = time.time() - - try: - while True: - # loop forever - if file_han is None: - # reopen the file - file_han = open(replay_file_name, "r") - start_time = time.time() - - # this - line_in = read_in_line(file_han) - if line_in is None: - app_base.logger.warning("Close Replay file") - file_han.close() - break - - else: - wait_time = start_time + line_in['offset'] - now = time.time() - if wait_time > now: - delay = wait_time - now - app_base.logger.debug("Delay %0.1f sec" % delay) - time.sleep(delay) - - nmea_out = gps_nmea.fix_time_sentence(line_in['data']).strip() - nmea_out += '\r\n' - app_base.logger.debug("out:{}".format(nmea_out)) - - sock.send(nmea_out.encode()) - - time.sleep(0.1) - - finally: - app_base.logger.info("Closing client socket") - sock.close() - - return 0 - - -def read_in_line(_file_han): - - while True: - line_in = _file_han.readline().strip() - if line_in is None or len(line_in) == 0: - break - - if line_in[0] == '{': - # then assume like {"offset":1, "data":$GPGGA,094013.0 ... }, - if line_in[-1] == ',': - line_in = line_in[:-1] - - return eval(line_in) - - # else, get next line - - return None - -if __name__ == "__main__": - import sys - from cp_lib.load_settings_ini import copy_config_ini_to_json, \ - load_sdk_ini_as_dict - - copy_config_ini_to_json() - - app_path = "demo/gps_replay" - my_app = CradlepointAppBase(app_path, call_router=False) - # force a heavy reload of INI (app base normally only finds JSON) - my_app.settings = load_sdk_ini_as_dict(app_path) - - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/demo/gps_replay/save_replay.py b/demo/gps_replay/save_replay.py deleted file mode 100644 index 1e055bff..00000000 --- a/demo/gps_replay/save_replay.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -This is a standalone script, to be run on a PC. It receives GPS data -on a localhost port & writes to a replay file. - -The format is pseudo-JSON, as it will be like: -[ -{"offset":1, "data":$GPGGA,094013.0,4334.784909,N,11612.766448,W,1 (...) *60}, -{"offset":3, "data":$GPGGA,094023.0,4334.784913,N,11612.766463,W,1 (...) *61}, -{"offset":13, "data":$GPGGA,094034.0,4334.784922,N,11612.766471,W, (...) *67}, - -Notice it starts with a '[', but like won't end with ']' - assuming you -abort the creation uncleanly. You can manually add one if you wish. - -"offset" is the number of seconds since the start of the replay save, which -are used during replay to delay and meter out the sentences in a realistic -manner. We'll also need to 'edit' the known sentences to add new TIME and -DATE values. -""" -import socket -import time -import gc - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.load_gps_config import GpsConfig -from cp_lib.parse_data import clean_string, parse_integer - -DEF_BUFFER_SIZE = 1024 -DEF_REPLAY_FILE = 'gps_log.json' - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - buffer_size = DEF_BUFFER_SIZE - replay_file_name = DEF_REPLAY_FILE - - # use Router API to fetch any configured data - config = GpsConfig(app_base) - host_ip, host_port = config.get_client_info() - del config - - section = "gps" - if section in app_base.settings: - # then load dynamic values - temp = app_base.settings[section] - - # check on our localhost port (not used, but to test) - if "host_ip" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_ip") - value = clean_string(temp["host_ip"]) - app_base.logger.warning("was:{} now:{}".format(host_ip, value)) - host_ip = value - - if "host_port" in temp: - # then OVER-RIDE what the router told us - app_base.logger.warning("Settings OVER-RIDE router host_port") - value = parse_integer(temp["host_port"]) - app_base.logger.warning("was:{} now:{}".format(host_port, value)) - host_port = value - - if "buffer_size" in temp: - buffer_size = parse_integer(temp["buffer_size"]) - - if "replay_file" in temp: - replay_file_name = clean_string(temp["replay_file"]) - - app_base.logger.debug("GPS source:({}:{})".format(host_ip, host_port)) - - # make sure our log file exists & is empty - file_han = open(replay_file_name, "w") - file_han.write("[\n") - file_han.close() - - address = (host_ip, host_port) - - while True: - # define the socket resource, including the type (stream == "TCP") - app_base.logger.info("Preparing GPS Listening on {}".format(address)) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # attempt to actually lock resource, which may fail if unavailable - # (see BIND ERROR note) - try: - sock.bind(address) - except OSError as msg: - app_base.logger.error("socket.bind() failed - {}".format(msg)) - - # technically, Python will close when 'sock' goes out of scope, - # but be disciplined and close it yourself. Python may warning - # you of unclosed resource, during runtime. - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors - # are likely permanent. - return -1 - - # only allow 1 client at a time - sock.listen(3) - - while True: - # loop forever - start_time = time.time() - - app_base.logger.info("Waiting on TCP socket %d" % host_port) - client, address = sock.accept() - app_base.logger.info("Accepted connection from {}".format(address)) - - # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # set non-blocking so we can do a manual timeout (use of select() - # is better ... but that's another sample) - # client.setblocking(0) - - while True: - app_base.logger.debug("Waiting to receive data") - data = client.recv(buffer_size) - # data is type() bytes, to echo we don't need to convert - # to str to format or return. - if data: - # assume we have multiple sentences per segment recv'd - data = data.decode().split() - - print("data:{}".format(data)) - - file_han = open(replay_file_name, "a") - offset = int(time.time() - start_time) - - for line in data: - result = '{"offset":%d, "data":"%s"},\n' % (offset, - line) - file_han.write(result) - - app_base.logger.debug("Wrote at offset:{}".format(offset)) - - else: - break - - time.sleep(1.0) - - app_base.logger.info("Client disconnected") - client.close() - - # since this server is expected to run on a small embedded system, - # free up memory ASAP (see MEMORY note) - del client - gc.collect() - - return 0 - - -if __name__ == "__main__": - import sys - from cp_lib.load_settings_ini import copy_config_ini_to_json, \ - load_sdk_ini_as_dict - - copy_config_ini_to_json() - - app_path = "demo/gps_replay" - my_app = CradlepointAppBase(app_path) - # force a heavy reload of INI (app base normally only finds JSON) - my_app.settings = load_sdk_ini_as_dict(app_path) - - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/demo/gps_replay/settings.ini b/demo/gps_replay/settings.ini deleted file mode 100644 index b863cbb1..00000000 --- a/demo/gps_replay/settings.ini +++ /dev/null @@ -1,16 +0,0 @@ -; one app settings - -[application] -name=gps_replay -description=Receive NMEA sentences on localhost port, save to file for replay -path = demo/gps_replay -version=1.1 - -[gps] -; do NOT set these if you desire Router API in config/system/gps to be used! -; these OVER-RIDE the router api values -; host_ip=192.168.1.6 -; host_port=9992 - -; the replay file name - is psuedo JSON, but coud also be called text (.txt) -replay_file=gps_replay.json diff --git a/demo/gps_replay/shift_offset.py b/demo/gps_replay/shift_offset.py deleted file mode 100644 index f49033be..00000000 --- a/demo/gps_replay/shift_offset.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -This is a standalone script, to be run on a PC. It reads a previously -created file (likely created by save_replay.py), renames and creates a -new file with the "offset" field shifted by some time. - -The goal is to prepare a file to be appended to another. -""" -import os - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.parse_data import clean_string, parse_float - -DEF_REPLAY_FILE = 'gps_log.json' - - -def run_router_app(app_base, adjust_seconds): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param float adjust_seconds: - :return: - """ - - replay_file_name = DEF_REPLAY_FILE - - section = "gps" - if section in app_base.settings: - # then load dynamic values - temp = app_base.settings[section] - - if "replay_file" in temp: - replay_file_name = clean_string(temp["replay_file"]) - - if not os.path.isfile(replay_file_name): - app_base.logger.error( - "Replay file({}) not found".format(replay_file_name)) - raise FileNotFoundError - - app_base.logger.info( - "Replay file is named:{}".format(replay_file_name)) - - backup_file_name = replay_file_name + '.bak' - app_base.logger.info( - "Backup file is named:{}".format(backup_file_name)) - - os.rename(src=replay_file_name, dst=backup_file_name) - - file_in = open(backup_file_name, "r") - file_out = open(replay_file_name, "w") - - while True: - # loop forever - - # this is a dictionary - dict_in = read_in_line(file_in) - if dict_in is None: - app_base.logger.warning("Close Replay file") - break - - else: - dict_in["offset"] += adjust_seconds - result = '{"offset":%d, "data":"%s"},\n' % (dict_in["offset"], - dict_in["data"]) - file_out.write(result) - - file_in.close() - file_out.close() - - return 0 - - -def read_in_line(_file_han): - - while True: - line_in = _file_han.readline().strip() - if line_in is None or len(line_in) == 0: - break - - if line_in[0] == '{': - # then assume like {"offset":1, "data":$GPGGA,094013.0 ... }, - if line_in[-1] == ',': - line_in = line_in[:-1] - - return eval(line_in) - - # else, get next line - - return None - -if __name__ == "__main__": - import sys - from cp_lib.load_settings_ini import copy_config_ini_to_json, \ - load_sdk_ini_as_dict - from cp_lib.parse_duration import TimeDuration - - copy_config_ini_to_json() - - app_path = "demo/gps_replay" - my_app = CradlepointAppBase(app_path, call_router=False) - # force a heavy reload of INI (app base normally only finds JSON) - my_app.settings = load_sdk_ini_as_dict(app_path) - - if len(sys.argv) == 2: - # assume is numeric seconds - shifter = parse_float(sys.argv[1]) - - elif len(sys.argv) >= 3: - # assume is tagged time, like "15 min" - period = TimeDuration(sys.argv[1] + ' ' + sys.argv[2]) - shifter = parse_float(period.get_seconds()) - - else: - my_app.logger.warning("You need to append the time in seconds") - sys.exit(-1) - - my_app.logger.info("Time shifter = {} seconds".format(shifter)) - - _result = run_router_app(my_app, shifter) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/demo/hoops_counter/README.md b/demo/hoops_counter/README.md deleted file mode 100644 index 7b739ea8..00000000 --- a/demo/hoops_counter/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# directory: ./demo/hoops_counter -## Router App/SDK sample applications - -Runs a few sub-demos. - -A web server is run as a sub-task: - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: power_loss.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [power_loss]: - -* check_input_delay=5 sec, how often to query the router status tree. -Polling too fast will impact router performance - possibly even prevent -operation. So select a reasonable value: a few seconds for DEMO purposes, -likely '30 sec' or '1 min' for normal operations. -The routine 'parse_duration' is used, so supported time tags include -"x sec", "x min", "x hr" and so on. diff --git a/demo/hoops_counter/__init__.py b/demo/hoops_counter/__init__.py deleted file mode 100644 index 86e6667a..00000000 --- a/demo/hoops_counter/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from demo.hoops_counter.hoops_counter import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/demo/hoops_counter/hoops_counter.py b/demo/hoops_counter/hoops_counter.py deleted file mode 100644 index 694f9f90..00000000 --- a/demo/hoops_counter/hoops_counter.py +++ /dev/null @@ -1,69 +0,0 @@ -import threading -import time - -import network.digit_web -import data.jsonrpc_settings -from cp_lib.app_base import CradlepointAppBase - - -def run_router_app(app_base, wait_for_child=True): - """ - Start our thread - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param bool wait_for_child: T to wait in loop, F to return immediately - :return: - """ - - # confirm we are running on 1100/1150, result should be like "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info( - "Product Model is good:{}".format(result)) - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - app_base.logger.info("STARTING the Web Server Task") - web_task = network.digit_web.run_router_app(app_base) - app_base.logger.info(" Web Server Task started") - - app_base.logger.info("STARTING the JSON Server Task") - json_task = data.jsonrpc_settings.run_router_app(app_base) - app_base.logger.info(" JSON Server Task started") - - if wait_for_child: - # we block on this sub task - for testing - try: - while True: - time.sleep(300) - - except KeyboardInterrupt: - # this is only true on a test PC - won't see on router - # must trap here to prevent try/except in __init__.py from avoiding - # the graceful shutdown below. - pass - - # now we need to try & kill off our kids - if we are here - app_base.logger.info("Okay, exiting") - - stop_router_app(app_base) - - else: - # we return ASAP, assume this is 1 of many tasks run by single parent - app_base.logger.info("Exit immediately, leave sub-task run") - - return 0 - - -def stop_router_app(app_base): - """ - Stop the thread - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - return 0 - - diff --git a/demo/hoops_counter/settings.ini b/demo/hoops_counter/settings.ini deleted file mode 100644 index 50dd86e2..00000000 --- a/demo/hoops_counter/settings.ini +++ /dev/null @@ -1,15 +0,0 @@ -[application] -name=hoops_counter -description=Thread to monitor 1100's GPIO, for loss of AC power -path=demo.hoops_counter -version=1.10 -uuid=de2968de-78d5-4ace-8345-1d93e42f7ceb - -[web_server] -; custom web page to show counter digits -host_port=9001 -start_count=2690 - -[jsonrpc] -; allow external push-in of new count -host_port=9901 diff --git a/demo/redlion_cub5/README.md b/demo/redlion_cub5/README.md deleted file mode 100644 index 5d85adc9..00000000 --- a/demo/redlion_cub5/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# directory: ./demo/redlion_cub5 -## Router App/SDK sample applications - -This demo includes ... - -## hardware Device: -The RedLion CUB5 is a small counter/meter, for panel cut outs 1.30 x 2.68 in. -This demo is specifically using it as a counter - to demo counting something -like people entering a door, motion detection, or Mike tossing a basketball -through a hoop. - -* http://files.redlion.net/filedepot_download/213/3984 -* http://www.redlion.net/products/industrial-automation/hmis-and-panel-meters/panel-meters/cub5-panel-meters - -Pin-outs: 485 with 4-wire JR11: -* Black = D+ -* Red = D- -* Green = SG -* Yellow = No Connection - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -with will be run by main.py diff --git a/demo/redlion_cub5/__init__.py b/demo/redlion_cub5/__init__.py deleted file mode 100644 index e773c1e9..00000000 --- a/demo/redlion_cub5/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from demo.redlion_cub5.cub5 import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/demo/redlion_cub5/cub5.py b/demo/redlion_cub5/cub5.py deleted file mode 100644 index 894780b7..00000000 --- a/demo/redlion_cub5/cub5.py +++ /dev/null @@ -1,56 +0,0 @@ -import threading -import time - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.cp_email import cp_send_email -from cp_lib.parse_duration import TimeDuration -from cp_lib.parse_data import parse_boolean - -power_loss_task = None - - -def run_router_app(app_base, wait_for_child=True): - """ - Start our thread - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param bool wait_for_child: T to wait in loop, F to return immediately - :return: - """ - global power_loss_task - - # confirm we are running on 1100/1150, result should be like "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info( - "Product Model is good:{}".format(result)) - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - power_loss_task = PowerLoss("power_loss", app_base) - power_loss_task.start() - - if wait_for_child: - # we block on this sub task - for testing - try: - while True: - time.sleep(300) - - except KeyboardInterrupt: - # this is only true on a test PC - won't see on router - # must trap here to prevent try/except in __init__.py from avoiding - # the graceful shutdown below. - pass - - # now we need to try & kill off our kids - if we are here - app_base.logger.info("Okay, exiting") - - stop_router_app(app_base) - - else: - # we return ASAP, assume this is 1 of many tasks run by single parent - app_base.logger.info("Exit immediately, leave sub-task run") - - return 0 diff --git a/demo/redlion_cub5/cub5_protocol.py b/demo/redlion_cub5/cub5_protocol.py deleted file mode 100644 index e9bf9e64..00000000 --- a/demo/redlion_cub5/cub5_protocol.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -The Redlion CUB5 protocol module -""" - - -class RedLionCub5(object): - - # will be like "N17" or "N5" - CMD_NODE = "N" - CMD_TRANSMIT = "T" # means read ... - - NODE_MIN = 0 - NODE_MAX = 99 - - MAP_ID = { - "CTA": "A", # counter A - "CTB": "B", # counter B - "RTE": "C", # rate - "SFA": "D", # scale factor A - "SFB": "E", # scale factor B - "SP1": "F", # setpoint 1 (reset output 1) - "SP2": "G", # setpoint 2 (reset output 2) - "CLD": "H", # counter A Count Load Value - } - - # "*" means 50msec; "$" means 2msec - TERMINATOR = "*" - - def __init__(self): - - self.node_address = 0 - # if node address = 0, can avoid sending, set this to True to override - # and send anyway - self.force_use_node_address = False - - # if set, allows normal logger output - self.logger = None - - return - - def set_node_address(self, address): - """ - Set the node address, which must be in value range 0-99 - - :param int address: the new address - :rtype str: - """ - if address is None or not isinstance(address, int): - raise ValueError("Invalid value for Node Address") - - assert self.NODE_MIN <= address <= self.NODE_MAX - self.node_address = address - return - - def format_node_address_string(self, address=None): - """ - Fetch the Node string, which might be "" - - :param int address: optional pass in, else use self.node_address - :rtype str: - """ - if address is None: - address = self.node_address - - address = int(address) - - if address == 0: - # special case, return empty, unless forced - if not self.force_use_node_address: - return "" - # else is being forced, so return as "N0" - - assert self.NODE_MIN <= address <= self.NODE_MAX - # not width is auto, so 1 digit or two - return "N%d" % address - - def format_read_value(self, mnemonic, address=None): - """ - read a value - :param str mnemonic: assume is like "CTA", "SFA" and so on - :param int address: optional pass in, else use self.node_address - :return: - """ - if address is None: - address = self.node_address - - mnemonic = mnemonic.upper() - code = self.MAP_ID[mnemonic] - # throws KeyError if bad mnemonic - return self.format_node_address_string(address) +\ - self.CMD_TRANSMIT + code + self.TERMINATOR - - def parse_response(self, response): - """ - Parse a counter response - :param response: - :rtype dict: - """ - if isinstance(response, bytes): - # Convert bytes to string - response = response.decode() - - if not isinstance(response, str): - raise TypeError("bad response type") - - result = dict() - result['raw'] = response.strip() - result["status"] = True - - # address is bytes 1-2, then #3 = - x = response[:2] - if x == " ": - result["adr"] = 0 - else: - # else assume is a number? - result["adr"] = int(x.strip()) - - # get the mnemonic - x = response[3:6].upper() - if x in self.MAP_ID: - result["id"] = x - else: - result["id"] = 'err?' - result["status"] = False - - # get the data value - # TODO - signed? - x = response[6:18] - try: - result["data"] = int(x.strip()) - except ValueError: - result["data"] = None - result["status"] = False - - return result diff --git a/demo/redlion_cub5/docs/CUB5 Product Manual.pdf b/demo/redlion_cub5/docs/CUB5 Product Manual.pdf deleted file mode 100644 index 1900612ba10f24d8f3f4f2ef2357c52931913a47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1340124 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

Z;S^KB&Hu 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

&PUhA0@7X!Pc>M8k-dJ$NlR|xhoK~M6 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

P+eiXCU`GutRM7G`s0% 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 (Rqt$QIaI!->R|}z`SP~oErS(c+Rd9?$ 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

m2%cMwpF~R6*5!V)M zCsRQ==noD#y)F%Mo#+3@6&-|5P~c9UGi}&Ja57U`_@Kku8ii2F84ZD#F-;@K6F()5 zUORiOaagV3#+T>0E9s-Ro_@NIpw7B9Q+}B#e=Pu4JQvJ_A4EI!B8Nv$QIN> zWF%T<4pkkz@~v=XL|jS3-mW8K!kaIMzpH9EQ15zf!> zyE-@gM_2+q=vK$3DdXXdWt1Z%N+5gR44t?l85fG@BBOnxravUSQ=@L~-+Sha?m6@O zHP_0b=4L-68@-oz>DiX1_;xOF&fR}!--f|`b{8E=UT=H*O3K5fQvaEe+2`z5bw<&h z(`pLDKfbw|e_U@ag@0Og;Gyr{FR529(@4>+*JO|6KF*6kq1qFdd61f)TsX7ob?)2C zRQkjSY~9uub5^A2Yq6I%nBUS!_D@`Q)Vnas1+6^zJmh`ed5T}*JJqfE$z98v;Z}Dw zmfg9u+j`Q}jQ-I_hM}5}{k3&)_O1Ct-$W0!z|p?;xm0*EL2c_N-8rkl8(UFTH{UJG zH~BPiB&hHDY1iCK@${8Q3o3ov<-omnW%nvie0wv#vOsO-uHBnNl*sHCEy-;uU*}ev zoUfT^)A?-Sw)x68U9}s}Hyf4)59B^L(;W6y;F+y%;B0C8ih8}?Ezd5p6O=;Qa?QS8 zk4=^Bi`XChJ~lS*kE^-CcgNaYNj~<6zO_dOH#43`zqL4iEMj?;_qvg>YlnrNuiNB< zy;(8f+3LIV8|gr^!^rv;2V z#_p&i239}Ot*cDE_T{GWD)u?S&1Tt~pL%RWWp^9bilYy>wz<7yKfO5F_QLwK_9oFk z2pOJ2HQE<9f}WByPD|f(D@ZDx5%u{)ic$4+RpG5Y?%$-u=#pBRJ{`(7dJ83R^nk)# z?JT(Uz+IC6eCb!YzhebRUgR&Gqc`qMa%O0@^0i*xW}Z*D%?Uf-t90<)yG>dSMc300 za!-!R(oYOrbnYtc$q18Qul0h~HWn)${W$a48>^TGn=#=TyC&-%Cz~54w-`^|4_@2g z|D{Ad=F<>-~|uR<~F2*=49y z%5>bFo$)zpH$9#VL_E2#SuA__*sA^`UUlEj?0bJKUNaf>M8mjVI9azuVx;d3%Fgn< z<8&_q&Gr^TWN(dvZC2OohiCM)V z(R3DrM6r(nx_+yF$3!#}c(45@qyX^W5+aj+Qi)_SXbXZSlYp>*5)PCd4M@T8w{?kJ z(ni131jqo8jNv~U1(3NFpiW3TAQ%IB1;8H)PzW=9go!@Ff?#Nb1b$6Tfkz|)VFmvS zdsqvgVr;pbyB` zfD9CYF}5%?GP7T6Vq|WIu{SidFvpl;EX<98UYCiHu`T8Y`QMQETQPqjKTmz_S`%Ay zG#YKK_Y0oJlM?l7>b#21y9ye0!DB=c8PSw^L$ucTVTnt%`A=dC z28~<{kx?XiL<|rDQ^;2EU()|%?5~JGIYhvnQW(*wAO<}gLX3>00m0-#z#XR#sL!G{ zG3meLEQnySge3(2bt%#GAZ9F)K|u!t8t@OAx=8j{jDJm;6he#$rjSwaA2t4w@UKx~ zLnsmd&ioe{Sb+K~5i9s&6aCtBi>bf1=noC~y9UfV5x{0JKwKR|Av??qeV*t)H@MY; z!$ng6G}L)RqRy+j#XqU~-%x+4*>}q1|BZ<*QeJ}kJIcU7&i~#CESB&a62B`67)DuY zvA|de5eU}jl>>PDApes4CxIW$wWL*+w6PVLgbbnsAv+Vb)IJuh;Lofj)PO`L6&L_o zLgR;hqiM`vQ-5Rth7a@zkiafX!PXja`rkR%K-qcOnnK)(5fmB(c%4uf5U*(9;zEpI z5o!NUAAc>#3jQ0O=IaF*_>Zp2uY4_dqhEbKnf@0t5OBl9eh=HJ?M#&6iO zB?kYR`lm2acnTTfJl_Gc0|rVNbXxSk6V|VU7KHWpQs;SzW(9^)NPlU<1&RDh;ule& zun}Yy5cX4vGzgl-qyvfsF!p-{Ff5c$`9ijgS0no*N zBs#CJ{|GccdP!umfX@0t_5K6+|D=9oz(gS51@n(ZkO3FP1mOQ?4E=!qPuN)k`=2V~ z-__0v@IFX)2A#|zQ5fG}sla3bpz?tXA_EvnMi?Lr46We5fGu%R^XUWz;Ld=Trvs4| zO<4r}k@OcxCrW%QFw7hMdre-mREeV3{1Exl)HRU5D%%0L4=)=;4B~n`h zS=yq&)6ypU^YIsqB@ckm=WG45F5m08s2M=F`4>O9maWT>mJdr2zjG*HUTx21Cge+Ml3K`{hP7$`N_XON6djfKQQB|^S6iu245J!17d;sVL%-Wa(++} zVS)gL#SD!W#v`>62<`7s0D<2O@ooAs#Y_k?^n1TcF>IShku`_0ao<@Q{*v_?~^+JVy@ckZ*$d%U*@U<1Ld-dyDzmvB1E9Y a27H1FAjwpI&EKg0uhU4tEYhFTNdFH=n2DzV diff --git a/demo/redlion_cub5/settings.ini b/demo/redlion_cub5/settings.ini deleted file mode 100644 index a2af5902..00000000 --- a/demo/redlion_cub5/settings.ini +++ /dev/null @@ -1,9 +0,0 @@ -[application] -name=redlion_cub5 -description=Simple serial handling of Redlion Cub5 Counter -path=demo.redlion_cub5 -version=1.0 - -; this section and item is unique to this sample -[redlion] -baud=9600 diff --git a/demo/test/test_redlion_cub_protocol.py b/demo/test/test_redlion_cub_protocol.py deleted file mode 100644 index c8dd3186..00000000 --- a/demo/test/test_redlion_cub_protocol.py +++ /dev/null @@ -1,198 +0,0 @@ -# Test the demo.redlion_cub.cub5_protocol module - -# as of 2016, mu 4-wire RJ11 cable has 4 wires: -# 1) black: rdc D+ -# 2) red: rdc D- -# 3) green: rdc SG -# 4) yellow: N/C - -import logging -import time -import unittest - -from demo.redlion_cub5.cub5_protocol import RedLionCub5 - - -class TestRedLionCub5(unittest.TestCase): - - def test_format_node_address(self): - global _logger - - print("") # skip paste '.' on line - - obj = RedLionCub5() - obj.force_use_node_address = False - - tests = [ - (0, ''), (1, 'N1'), (2, 'N2'), (3, 'N3'), (4, 'N4'), (5, 'N5'), - (6, 'N6'), (7, 'N7'), (8, 'N8'), (9, 'N9'), (10, 'N10'), - (11, 'N11'), (12, 'N12'), (13, 'N13'), (14, 'N14'), (15, 'N15'), - (16, 'N16'), (17, 'N17'), (18, 'N18'), (19, 'N19'), (20, 'N20'), - (21, 'N21'), (22, 'N22'), (23, 'N23'), (24, 'N24'), (25, 'N25'), - (26, 'N26'), (27, 'N27'), (28, 'N28'), (29, 'N29'), (30, 'N30'), - (31, 'N31'), (32, 'N32'), (33, 'N33'), (34, 'N34'), (35, 'N35'), - (36, 'N36'), (37, 'N37'), (38, 'N38'), (39, 'N39'), (40, 'N40'), - (41, 'N41'), (42, 'N42'), (43, 'N43'), (44, 'N44'), (45, 'N45'), - (46, 'N46'), (47, 'N47'), (48, 'N48'), (49, 'N49'), (50, 'N50'), - (51, 'N51'), (52, 'N52'), (53, 'N53'), (54, 'N54'), (55, 'N55'), - (56, 'N56'), (57, 'N57'), (58, 'N58'), (59, 'N59'), (60, 'N60'), - (61, 'N61'), (62, 'N62'), (63, 'N63'), (64, 'N64'), (65, 'N65'), - (66, 'N66'), (67, 'N67'), (68, 'N68'), (69, 'N69'), (70, 'N70'), - (71, 'N71'), (72, 'N72'), (73, 'N73'), (74, 'N74'), (75, 'N75'), - (76, 'N76'), (77, 'N77'), (78, 'N78'), (79, 'N79'), (80, 'N80'), - (81, 'N81'), (82, 'N82'), (83, 'N83'), (84, 'N84'), (85, 'N85'), - (86, 'N86'), (87, 'N87'), (88, 'N88'), (89, 'N89'), (90, 'N90'), - (91, 'N91'), (92, 'N92'), (93, 'N93'), (94, 'N94'), (95, 'N95'), - (96, 'N96'), (97, 'N97'), (98, 'N98'), (99, 'N99') - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = obj.format_node_address_string(source) - self.assertEqual(result, expect) - - # test the 'N0' - obj.force_use_node_address = True - source = 0 - expect = 'N0' - result = obj.format_node_address_string(source) - self.assertEqual(result, expect) - obj.force_use_node_address = False - - # test the range - source = obj.NODE_MIN - 1 - with self.assertRaises(AssertionError): - obj.format_node_address_string(source) - source = obj.NODE_MAX + 1 - with self.assertRaises(AssertionError): - obj.format_node_address_string(source) - - # a few internal tests - tests = [ - (0, ''), (1, 'N1'), (48, 'N48'), (98, 'N98'), (99, 'N99'), - (None, ValueError), ('1', ValueError), ('hello', ValueError), - (98.0, ValueError) - ] - - for test in tests: - source = test[0] - expect = test[1] - # print("test:{}".format(test)) - - if expect == ValueError: - with self.assertRaises(ValueError): - obj.set_node_address(source) - - else: - obj.set_node_address(source) - result = obj.format_node_address_string() - self.assertEqual(result, expect) - - return - - def test_format_read(self): - global _logger - - print("") # skip paste '.' on line - - obj = RedLionCub5() - - tests = [ - {'adr': 0, 'id': 'CTA', 'exp': 'TA*'}, - {'adr': 5, 'id': 'CTA', 'exp': 'N5TA*'}, - {'adr': 5, 'id': 'RTE', 'exp': 'N5TC*'}, - {'adr': 15, 'id': 'SFA', 'exp': 'N15TD*'}, - {'adr': 15, 'id': 'SFB', 'exp': 'N15TE*'}, - {'adr': 5, 'id': 'SP1', 'exp': 'N5TF*'}, - {'adr': 5, 'id': 'SP2', 'exp': 'N5TG*'}, - {'adr': 5, 'id': 'CLD', 'exp': 'N5TH*'}, - ] - - for test in tests: - obj.set_node_address(test['adr']) - result = obj.format_read_value(test['id']) - self.assertEqual(result, test['exp']) - - # test the range - obj.set_node_address(5) - with self.assertRaises(AttributeError): - # due to lack of .upper() - obj.format_read_value(None) - - with self.assertRaises(KeyError): - # due to NOT being in self.MAP_ID - obj.format_read_value('silly') - - return - - def test_parse(self): - global _logger - - print("") # skip paste '.' on line - - obj = RedLionCub5() - - tests = [ - {'src': b' CTA 0\r\n', - 'exp': {'adr': 0, 'id': 'CTA', 'data': 0, 'status': True, - 'raw': 'CTA 0'}}, - {'src': ' CTA 0\r\n', - 'exp': {'adr': 0, 'id': 'CTA', 'data': 0, 'status': True, - 'raw': 'CTA 0'}}, - {'src': b' CTA 25\r\n', - 'exp': {'adr': 0, 'id': 'CTA', 'data': 25, 'status': True, - 'raw': 'CTA 25'}}, - {'src': ' CTA 25\r\n', - 'exp': {'adr': 0, 'id': 'CTA', 'data': 25, 'status': True, - 'raw': 'CTA 25'}}, - ] - - for test in tests: - result = obj.parse_response(test['src']) - # _logger.info("result {}".format(result)) - self.assertEqual(result, test['exp']) - - return - - def test_serial(self): - global _logger - - if False: - _logger.warning("Skip serial test due to flag") - - else: - import serial - - name = "COM5" - baud = 9600 - _logger.info("Open port {}".format(name)) - ser = serial.Serial(name, baudrate=baud, bytesize=8, - parity=serial.PARITY_NONE, timeout=1.0) - - send = b'TA*' - _logger.info("Write {}".format(send)) - ser.write(send) - result = ser.read(50) - _logger.info("Read {}".format(result)) - - time.sleep(1.0) - - send = b'TB*' - _logger.info("Write {}".format(send)) - ser.write(send) - result = ser.read(50) - _logger.info("Read {}".format(result)) - - ser.close() - -if __name__ == '__main__': - - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - - _logger = logging.getLogger('unittest') - _logger.setLevel(logging.DEBUG) - - unittest.main() diff --git a/email/cs.py b/email/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/email/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/email/email.py b/email/email.py new file mode 100644 index 00000000..a8ca67c3 --- /dev/null +++ b/email/email.py @@ -0,0 +1,68 @@ + +import sys +import argparse +import smtplib +import cs + +APP_NAME = 'email' + +# This application will send a single email when it is started. + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + email_username = '' + email_password = '' + + email_from = '' + email_to = '' + email_subject = 'This is the subject line for the test email.' + email_body = ' This is the body of the test email.' + + if command == 'start': + cs.CSClient().log(APP_NAME, 'Logging into email server') + + try: + # If you are using gmail, then the login account will need to + # turn 'Allow less secure apps' in the 'Sign-in & security' + # setting for the Google account. + server = smtplib.SMTP('smtp.gmail.com', 587) + server.ehlo() + server.starttls() + server.login(email_username, email_password) + + the_email = '\r\n'.join(['TO: %s' % email_to, + 'FROM: %s' % email_from, + 'SUBJECT: %s' % email_subject, '', + email_body]) + + cs.CSClient().log(APP_NAME, 'Sending email to: {}'.format(email_to)) + server.sendmail(email_from, email_to, the_email) + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Could not send email! exception: {}'.format(e)) + finally: + if server: + server.quit() + + elif command == 'stop': + # Nothing on stop + pass + except Exception as e: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/email/install.sh b/email/install.sh new file mode 100644 index 00000000..cdafe135 --- /dev/null +++ b/email/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION email on:" >> install.log +date >> install.log diff --git a/email/package.ini b/email/package.ini new file mode 100644 index 00000000..69406eac --- /dev/null +++ b/email/package.ini @@ -0,0 +1,11 @@ +[email] +uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f +vendor=Cradlepoint +notes=Router Email Reference Application +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/email/start.sh b/email/start.sh new file mode 100644 index 00000000..ac7a5529 --- /dev/null +++ b/email/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython email.py start diff --git a/email/stop.sh b/email/stop.sh new file mode 100644 index 00000000..109b7bb5 --- /dev/null +++ b/email/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython email.py stop diff --git a/ftp_client/cs.py b/ftp_client/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/ftp_client/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/ftp_client/ftp_client.py b/ftp_client/ftp_client.py new file mode 100644 index 00000000..9200afb8 --- /dev/null +++ b/ftp_client/ftp_client.py @@ -0,0 +1,94 @@ +""" +This app will create a file and then upload it to an FTP server. +The file will be deleted when the app is stopped. +""" + +import sys +import argparse +from ftplib import FTP +import os +import cs + + +APP_NAME = "ftp_client" +TEMP_FILE = '/var/tmp/my_file.txt' + +# A USB Storage device will be mounted at /var/media +# if it is plugged into the USB port of the router. +# Note: Not all USB devices are compatible. +TEMP_FILE_USB = '/var/media/my_file.txt' + + +def start_router_app(): + # Create a temporary file to upload to an FTP server + try: + f = open(TEMP_FILE, 'w') + f.write('This is a test!!') + f.write('This is another test!!') + f.close() + except OSError as msg: + cs.CSClient().log(APP_NAME, 'Failed to open file: {}. error: {}'.format(TEMP_FILE, msg)) + + try: + # Connect to an FTP test server + ftp = FTP('speedtest.tele2.net') + + # Login to the server + reply = ftp.login('anonymous', 'anonymous') + cs.CSClient().log(APP_NAME, 'FTP login reply: {}'.format(reply)) + + # Change to the proper directory for upload + ftp.cwd('/upload/') + + # Open the file and upload it to the server + fh = open(TEMP_FILE, 'rb') + reply = ftp.storlines('STOR a.txt', fh) + cs.CSClient().log(APP_NAME, 'FTP STOR reply: {}'.format(reply)) + + except Exception as e: + cs.CSClient().log(APP_NAME, 'Something went wrong in start_router_app()! exception: {}'.format(e)) + raise + + finally: + if fh: + fh.close() + return + + +def stop_router_app(): + # delete the temporary file if it exists + if os.path.exists(TEMP_FILE): + os.remove(TEMP_FILE) + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + # Call the function to start the app. + start_router_app() + + elif command == 'stop': + # Call the function to start the app. + stop_router_app() + + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + # The start.sh and stop.sh should call this script with a start or stop argument + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/ftp_client/ftplib.py b/ftp_client/ftplib.py new file mode 100644 index 00000000..c416d856 --- /dev/null +++ b/ftp_client/ftplib.py @@ -0,0 +1,984 @@ +"""An FTP client class and some helper functions. + +Based on RFC 959: File Transfer Protocol (FTP), by J. Postel and J. Reynolds + +Example: + +>>> from ftplib import FTP +>>> ftp = FTP('ftp.python.org') # connect to host, default port +>>> ftp.login() # default, i.e.: user anonymous, passwd anonymous@ +'230 Guest login ok, access restrictions apply.' +>>> ftp.retrlines('LIST') # list directory contents +total 9 +drwxr-xr-x 8 root wheel 1024 Jan 3 1994 . +drwxr-xr-x 8 root wheel 1024 Jan 3 1994 .. +drwxr-xr-x 2 root wheel 1024 Jan 3 1994 bin +drwxr-xr-x 2 root wheel 1024 Jan 3 1994 etc +d-wxrwxr-x 2 ftp wheel 1024 Sep 5 13:43 incoming +drwxr-xr-x 2 root wheel 1024 Nov 17 1993 lib +drwxr-xr-x 6 1094 wheel 1024 Sep 13 19:07 pub +drwxr-xr-x 3 root wheel 1024 Jan 3 1994 usr +-rw-r--r-- 1 root root 312 Aug 1 1994 welcome.msg +'226 Transfer complete.' +>>> ftp.quit() +'221 Goodbye.' +>>> + +A nice test that reveals some of the network dialogue would be: +python ftplib.py -d localhost -l -p -l +""" + +# +# Changes and improvements suggested by Steve Majewski. +# Modified by Jack to work on the mac. +# Modified by Siebren to support docstrings and PASV. +# Modified by Phil Schwartz to add storbinary and storlines callbacks. +# Modified by Giampaolo Rodola' to add TLS support. +# + +import os +import sys +import socket +import warnings +from socket import _GLOBAL_DEFAULT_TIMEOUT + +__all__ = ["FTP"] + +# Magic number from +MSG_OOB = 0x1 # Process data out of band + + +# The standard FTP server control port +FTP_PORT = 21 +# The sizehint parameter passed to readline() calls +MAXLINE = 8192 + + +# Exception raised when an error or invalid response is received +class Error(Exception): pass +class error_reply(Error): pass # unexpected [123]xx reply +class error_temp(Error): pass # 4xx errors +class error_perm(Error): pass # 5xx errors +class error_proto(Error): pass # response does not begin with [1-5] + + +# All exceptions (hopefully) that may be raised here and that aren't +# (always) programming errors on our side +all_errors = (Error, OSError, EOFError) + + +# Line terminators (we always output CRLF, but accept any of CRLF, CR, LF) +CRLF = '\r\n' +B_CRLF = b'\r\n' + +# The class itself +class FTP: + + '''An FTP client class. + + To create a connection, call the class using these arguments: + host, user, passwd, acct, timeout + + The first four arguments are all strings, and have default value ''. + timeout must be numeric and defaults to None if not passed, + meaning that no timeout will be set on any ftp socket(s) + If a timeout is passed, then this is now the default timeout for all ftp + socket operations for this instance. + + Then use self.connect() with optional host and port argument. + + To download a file, use ftp.retrlines('RETR ' + filename), + or ftp.retrbinary() with slightly different arguments. + To upload a file, use ftp.storlines() or ftp.storbinary(), + which have an open file as argument (see their definitions + below for details). + The download/upload functions first issue appropriate TYPE + and PORT or PASV commands. + ''' + + debugging = 0 + host = '' + port = FTP_PORT + maxline = MAXLINE + sock = None + file = None + welcome = None + passiveserver = 1 + encoding = "latin-1" + + # Initialization method (called by class instantiation). + # Initialize host to localhost, port to standard ftp port + # Optional arguments are host (for connect()), + # and user, passwd, acct (for login()) + def __init__(self, host='', user='', passwd='', acct='', + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + self.source_address = source_address + self.timeout = timeout + if host: + self.connect(host) + if user: + self.login(user, passwd, acct) + + def __enter__(self): + return self + + # Context management protocol: try to quit() if active + def __exit__(self, *args): + if self.sock is not None: + try: + self.quit() + except (OSError, EOFError): + pass + finally: + if self.sock is not None: + self.close() + + def connect(self, host='', port=0, timeout=-999, source_address=None): + '''Connect to host. Arguments are: + - host: hostname to connect to (string, default previous host) + - port: port to connect to (integer, default previous port) + - timeout: the timeout to set against the ftp socket(s) + - source_address: a 2-tuple (host, port) for the socket to bind + to as its source address before connecting. + ''' + if host != '': + self.host = host + if port > 0: + self.port = port + if timeout != -999: + self.timeout = timeout + if source_address is not None: + self.source_address = source_address + self.sock = socket.create_connection((self.host, self.port), self.timeout, + source_address=self.source_address) + self.af = self.sock.family + self.file = self.sock.makefile('r', encoding=self.encoding) + self.welcome = self.getresp() + return self.welcome + + def getwelcome(self): + '''Get the welcome message from the server. + (this is read and squirreled away by connect())''' + if self.debugging: + print('*welcome*', self.sanitize(self.welcome)) + return self.welcome + + def set_debuglevel(self, level): + '''Set the debugging level. + The required argument level means: + 0: no debugging output (default) + 1: print commands and responses but not body text etc. + 2: also print raw lines read and sent before stripping CR/LF''' + self.debugging = level + debug = set_debuglevel + + def set_pasv(self, val): + '''Use passive or active mode for data transfers. + With a false argument, use the normal PORT mode, + With a true argument, use the PASV command.''' + self.passiveserver = val + + # Internal: "sanitize" a string for printing + def sanitize(self, s): + if s[:5] in {'pass ', 'PASS '}: + i = len(s.rstrip('\r\n')) + s = s[:5] + '*'*(i-5) + s[i:] + return repr(s) + + # Internal: send one line to the server, appending CRLF + def putline(self, line): + line = line + CRLF + if self.debugging > 1: + print('*put*', self.sanitize(line)) + self.sock.sendall(line.encode(self.encoding)) + + # Internal: send one command to the server (through putline()) + def putcmd(self, line): + if self.debugging: print('*cmd*', self.sanitize(line)) + self.putline(line) + + # Internal: return one line from the server, stripping CRLF. + # Raise EOFError if the connection is closed + def getline(self): + line = self.file.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) + if self.debugging > 1: + print('*get*', self.sanitize(line)) + if not line: + raise EOFError + if line[-2:] == CRLF: + line = line[:-2] + elif line[-1:] in CRLF: + line = line[:-1] + return line + + # Internal: get a response from the server, which may possibly + # consist of multiple lines. Return a single string with no + # trailing CRLF. If the response consists of multiple lines, + # these are separated by '\n' characters in the string + def getmultiline(self): + line = self.getline() + if line[3:4] == '-': + code = line[:3] + while 1: + nextline = self.getline() + line = line + ('\n' + nextline) + if nextline[:3] == code and \ + nextline[3:4] != '-': + break + return line + + # Internal: get a response from the server. + # Raise various errors if the response indicates an error + def getresp(self): + resp = self.getmultiline() + if self.debugging: + print('*resp*', self.sanitize(resp)) + self.lastresp = resp[:3] + c = resp[:1] + if c in {'1', '2', '3'}: + return resp + if c == '4': + raise error_temp(resp) + if c == '5': + raise error_perm(resp) + raise error_proto(resp) + + def voidresp(self): + """Expect a response beginning with '2'.""" + resp = self.getresp() + if resp[:1] != '2': + raise error_reply(resp) + return resp + + def abort(self): + '''Abort a file transfer. Uses out-of-band data. + This does not follow the procedure from the RFC to send Telnet + IP and Synch; that doesn't seem to work with the servers I've + tried. Instead, just send the ABOR command as OOB data.''' + line = b'ABOR' + B_CRLF + if self.debugging > 1: + print('*put urgent*', self.sanitize(line)) + self.sock.sendall(line, MSG_OOB) + resp = self.getmultiline() + if resp[:3] not in {'426', '225', '226'}: + raise error_proto(resp) + return resp + + def sendcmd(self, cmd): + '''Send a command and return the response.''' + self.putcmd(cmd) + return self.getresp() + + def voidcmd(self, cmd): + """Send a command and expect a response beginning with '2'.""" + self.putcmd(cmd) + return self.voidresp() + + def sendport(self, host, port): + '''Send a PORT command with the current host and the given + port number. + ''' + hbytes = host.split('.') + pbytes = [repr(port//256), repr(port%256)] + bytes = hbytes + pbytes + cmd = 'PORT ' + ','.join(bytes) + return self.voidcmd(cmd) + + def sendeprt(self, host, port): + '''Send an EPRT command with the current host and the given port number.''' + af = 0 + if self.af == socket.AF_INET: + af = 1 + if self.af == socket.AF_INET6: + af = 2 + if af == 0: + raise error_proto('unsupported address family') + fields = ['', repr(af), host, repr(port), ''] + cmd = 'EPRT ' + '|'.join(fields) + return self.voidcmd(cmd) + + def makeport(self): + '''Create a new socket and send a PORT command for it.''' + err = None + sock = None + for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE): + af, socktype, proto, canonname, sa = res + try: + sock = socket.socket(af, socktype, proto) + sock.bind(sa) + except OSError as _: + err = _ + if sock: + sock.close() + sock = None + continue + break + if sock is None: + if err is not None: + raise err + else: + raise OSError("getaddrinfo returns an empty list") + sock.listen(1) + port = sock.getsockname()[1] # Get proper port + host = self.sock.getsockname()[0] # Get proper host + if self.af == socket.AF_INET: + resp = self.sendport(host, port) + else: + resp = self.sendeprt(host, port) + if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(self.timeout) + return sock + + def makepasv(self): + if self.af == socket.AF_INET: + host, port = parse227(self.sendcmd('PASV')) + else: + host, port = parse229(self.sendcmd('EPSV'), self.sock.getpeername()) + return host, port + + def ntransfercmd(self, cmd, rest=None): + """Initiate a transfer over the data connection. + + If the transfer is active, send a port command and the + transfer command, and accept the connection. If the server is + passive, send a pasv command, connect to it, and start the + transfer command. Either way, return the socket for the + connection and the expected size of the transfer. The + expected size may be None if it could not be determined. + + Optional `rest' argument can be a string that is sent as the + argument to a REST command. This is essentially a server + marker used to tell the server to skip over any data up to the + given marker. + """ + size = None + if self.passiveserver: + host, port = self.makepasv() + conn = socket.create_connection((host, port), self.timeout, + source_address=self.source_address) + try: + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + # Some servers apparently send a 200 reply to + # a LIST or STOR command, before the 150 reply + # (and way before the 226 reply). This seems to + # be in violation of the protocol (which only allows + # 1xx or error messages for LIST), so we just discard + # this response. + if resp[0] == '2': + resp = self.getresp() + if resp[0] != '1': + raise error_reply(resp) + except: + conn.close() + raise + else: + with self.makeport() as sock: + if rest is not None: + self.sendcmd("REST %s" % rest) + resp = self.sendcmd(cmd) + # See above. + if resp[0] == '2': + resp = self.getresp() + if resp[0] != '1': + raise error_reply(resp) + conn, sockaddr = sock.accept() + if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: + conn.settimeout(self.timeout) + if resp[:3] == '150': + # this is conditional in case we received a 125 + size = parse150(resp) + return conn, size + + def transfercmd(self, cmd, rest=None): + """Like ntransfercmd() but returns only the socket.""" + return self.ntransfercmd(cmd, rest)[0] + + def login(self, user = '', passwd = '', acct = ''): + '''Login, default anonymous.''' + if not user: + user = 'anonymous' + if not passwd: + passwd = '' + if not acct: + acct = '' + if user == 'anonymous' and passwd in {'', '-'}: + # If there is no anonymous ftp password specified + # then we'll just use anonymous@ + # We don't send any other thing because: + # - We want to remain anonymous + # - We want to stop SPAM + # - We don't want to let ftp sites to discriminate by the user, + # host or country. + passwd = passwd + 'anonymous@' + resp = self.sendcmd('USER ' + user) + if resp[0] == '3': + resp = self.sendcmd('PASS ' + passwd) + if resp[0] == '3': + resp = self.sendcmd('ACCT ' + acct) + if resp[0] != '2': + raise error_reply(resp) + return resp + + def retrbinary(self, cmd, callback, blocksize=8192, rest=None): + """Retrieve data in binary mode. A new port is created for you. + + Args: + cmd: A RETR command. + callback: A single parameter callable to be called on each + block of data read. + blocksize: The maximum number of bytes to read from the + socket at one time. [default: 8192] + rest: Passed to transfercmd(). [default: None] + + Returns: + The response code. + """ + self.voidcmd('TYPE I') + with self.transfercmd(cmd, rest) as conn: + while 1: + data = conn.recv(blocksize) + if not data: + break + callback(data) + # shutdown ssl layer + if _SSLSocket is not None and isinstance(conn, _SSLSocket): + conn.unwrap() + return self.voidresp() + + def retrlines(self, cmd, callback = None): + """Retrieve data in line mode. A new port is created for you. + + Args: + cmd: A RETR, LIST, or NLST command. + callback: An optional single parameter callable that is called + for each line with the trailing CRLF stripped. + [default: print_line()] + + Returns: + The response code. + """ + if callback is None: + callback = print_line + resp = self.sendcmd('TYPE A') + with self.transfercmd(cmd) as conn, \ + conn.makefile('r', encoding=self.encoding) as fp: + while 1: + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) + if self.debugging > 2: + print('*retr*', repr(line)) + if not line: + break + if line[-2:] == CRLF: + line = line[:-2] + elif line[-1:] == '\n': + line = line[:-1] + callback(line) + # shutdown ssl layer + if _SSLSocket is not None and isinstance(conn, _SSLSocket): + conn.unwrap() + return self.voidresp() + + def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): + """Store a file in binary mode. A new port is created for you. + + Args: + cmd: A STOR command. + fp: A file-like object with a read(num_bytes) method. + blocksize: The maximum data size to read from fp and send over + the connection at once. [default: 8192] + callback: An optional single parameter callable that is called on + each block of data after it is sent. [default: None] + rest: Passed to transfercmd(). [default: None] + + Returns: + The response code. + """ + self.voidcmd('TYPE I') + with self.transfercmd(cmd, rest) as conn: + while 1: + buf = fp.read(blocksize) + if not buf: + break + conn.sendall(buf) + if callback: + callback(buf) + # shutdown ssl layer + if _SSLSocket is not None and isinstance(conn, _SSLSocket): + conn.unwrap() + return self.voidresp() + + def storlines(self, cmd, fp, callback=None): + """Store a file in line mode. A new port is created for you. + + Args: + cmd: A STOR command. + fp: A file-like object with a readline() method. + callback: An optional single parameter callable that is called on + each line after it is sent. [default: None] + + Returns: + The response code. + """ + self.voidcmd('TYPE A') + with self.transfercmd(cmd) as conn: + while 1: + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) + if not buf: + break + if buf[-2:] != B_CRLF: + if buf[-1] in B_CRLF: buf = buf[:-1] + buf = buf + B_CRLF + conn.sendall(buf) + if callback: + callback(buf) + # shutdown ssl layer + if _SSLSocket is not None and isinstance(conn, _SSLSocket): + conn.unwrap() + return self.voidresp() + + def acct(self, password): + '''Send new account name.''' + cmd = 'ACCT ' + password + return self.voidcmd(cmd) + + def nlst(self, *args): + '''Return a list of files in a given directory (default the current).''' + cmd = 'NLST' + for arg in args: + cmd = cmd + (' ' + arg) + files = [] + self.retrlines(cmd, files.append) + return files + + def dir(self, *args): + '''List a directory in long form. + By default list current directory to stdout. + Optional last argument is callback function; all + non-empty arguments before it are concatenated to the + LIST command. (This *should* only be used for a pathname.)''' + cmd = 'LIST' + func = None + if args[-1:] and type(args[-1]) != type(''): + args, func = args[:-1], args[-1] + for arg in args: + if arg: + cmd = cmd + (' ' + arg) + self.retrlines(cmd, func) + + def mlsd(self, path="", facts=[]): + '''List a directory in a standardized format by using MLSD + command (RFC-3659). If path is omitted the current directory + is assumed. "facts" is a list of strings representing the type + of information desired (e.g. ["type", "size", "perm"]). + + Return a generator object yielding a tuple of two elements + for every file found in path. + First element is the file name, the second one is a dictionary + including a variable number of "facts" depending on the server + and whether "facts" argument has been provided. + ''' + if facts: + self.sendcmd("OPTS MLST " + ";".join(facts) + ";") + if path: + cmd = "MLSD %s" % path + else: + cmd = "MLSD" + lines = [] + self.retrlines(cmd, lines.append) + for line in lines: + facts_found, _, name = line.rstrip(CRLF).partition(' ') + entry = {} + for fact in facts_found[:-1].split(";"): + key, _, value = fact.partition("=") + entry[key.lower()] = value + yield (name, entry) + + def rename(self, fromname, toname): + '''Rename a file.''' + resp = self.sendcmd('RNFR ' + fromname) + if resp[0] != '3': + raise error_reply(resp) + return self.voidcmd('RNTO ' + toname) + + def delete(self, filename): + '''Delete a file.''' + resp = self.sendcmd('DELE ' + filename) + if resp[:3] in {'250', '200'}: + return resp + else: + raise error_reply(resp) + + def cwd(self, dirname): + '''Change to a directory.''' + if dirname == '..': + try: + return self.voidcmd('CDUP') + except error_perm as msg: + if msg.args[0][:3] != '500': + raise + elif dirname == '': + dirname = '.' # does nothing, but could return error + cmd = 'CWD ' + dirname + return self.voidcmd(cmd) + + def size(self, filename): + '''Retrieve the size of a file.''' + # The SIZE command is defined in RFC-3659 + resp = self.sendcmd('SIZE ' + filename) + if resp[:3] == '213': + s = resp[3:].strip() + return int(s) + + def mkd(self, dirname): + '''Make a directory, return its full pathname.''' + resp = self.voidcmd('MKD ' + dirname) + # fix around non-compliant implementations such as IIS shipped + # with Windows server 2003 + if not resp.startswith('257'): + return '' + return parse257(resp) + + def rmd(self, dirname): + '''Remove a directory.''' + return self.voidcmd('RMD ' + dirname) + + def pwd(self): + '''Return current working directory.''' + resp = self.voidcmd('PWD') + # fix around non-compliant implementations such as IIS shipped + # with Windows server 2003 + if not resp.startswith('257'): + return '' + return parse257(resp) + + def quit(self): + '''Quit, and close the connection.''' + resp = self.voidcmd('QUIT') + self.close() + return resp + + def close(self): + '''Close the connection without assuming anything about it.''' + try: + file = self.file + self.file = None + if file is not None: + file.close() + finally: + sock = self.sock + self.sock = None + if sock is not None: + sock.close() + +try: + import ssl +except ImportError: + _SSLSocket = None +else: + _SSLSocket = ssl.SSLSocket + + class FTP_TLS(FTP): + '''A FTP subclass which adds TLS support to FTP as described + in RFC-4217. + + Connect as usual to port 21 implicitly securing the FTP control + connection before authenticating. + + Securing the data connection requires user to explicitly ask + for it by calling prot_p() method. + + Usage example: + >>> from ftplib import FTP_TLS + >>> ftps = FTP_TLS('ftp.python.org') + >>> ftps.login() # login anonymously previously securing control channel + '230 Guest login ok, access restrictions apply.' + >>> ftps.prot_p() # switch to secure data connection + '200 Protection level set to P' + >>> ftps.retrlines('LIST') # list directory content securely + total 9 + drwxr-xr-x 8 root wheel 1024 Jan 3 1994 . + drwxr-xr-x 8 root wheel 1024 Jan 3 1994 .. + drwxr-xr-x 2 root wheel 1024 Jan 3 1994 bin + drwxr-xr-x 2 root wheel 1024 Jan 3 1994 etc + d-wxrwxr-x 2 ftp wheel 1024 Sep 5 13:43 incoming + drwxr-xr-x 2 root wheel 1024 Nov 17 1993 lib + drwxr-xr-x 6 1094 wheel 1024 Sep 13 19:07 pub + drwxr-xr-x 3 root wheel 1024 Jan 3 1994 usr + -rw-r--r-- 1 root root 312 Aug 1 1994 welcome.msg + '226 Transfer complete.' + >>> ftps.quit() + '221 Goodbye.' + >>> + ''' + ssl_version = ssl.PROTOCOL_SSLv23 + + def __init__(self, host='', user='', passwd='', acct='', keyfile=None, + certfile=None, context=None, + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + if context is not None and keyfile is not None: + raise ValueError("context and keyfile arguments are mutually " + "exclusive") + if context is not None and certfile is not None: + raise ValueError("context and certfile arguments are mutually " + "exclusive") + self.keyfile = keyfile + self.certfile = certfile + if context is None: + context = ssl._create_stdlib_context(self.ssl_version, + certfile=certfile, + keyfile=keyfile) + self.context = context + self._prot_p = False + FTP.__init__(self, host, user, passwd, acct, timeout, source_address) + + def login(self, user='', passwd='', acct='', secure=True): + if secure and not isinstance(self.sock, ssl.SSLSocket): + self.auth() + return FTP.login(self, user, passwd, acct) + + def auth(self): + '''Set up secure control connection by using TLS/SSL.''' + if isinstance(self.sock, ssl.SSLSocket): + raise ValueError("Already using TLS") + if self.ssl_version >= ssl.PROTOCOL_SSLv23: + resp = self.voidcmd('AUTH TLS') + else: + resp = self.voidcmd('AUTH SSL') + self.sock = self.context.wrap_socket(self.sock, + server_hostname=self.host) + self.file = self.sock.makefile(mode='r', encoding=self.encoding) + return resp + + def ccc(self): + '''Switch back to a clear-text control connection.''' + if not isinstance(self.sock, ssl.SSLSocket): + raise ValueError("not using TLS") + resp = self.voidcmd('CCC') + self.sock = self.sock.unwrap() + return resp + + def prot_p(self): + '''Set up secure data connection.''' + # PROT defines whether or not the data channel is to be protected. + # Though RFC-2228 defines four possible protection levels, + # RFC-4217 only recommends two, Clear and Private. + # Clear (PROT C) means that no security is to be used on the + # data-channel, Private (PROT P) means that the data-channel + # should be protected by TLS. + # PBSZ command MUST still be issued, but must have a parameter of + # '0' to indicate that no buffering is taking place and the data + # connection should not be encapsulated. + self.voidcmd('PBSZ 0') + resp = self.voidcmd('PROT P') + self._prot_p = True + return resp + + def prot_c(self): + '''Set up clear text data connection.''' + resp = self.voidcmd('PROT C') + self._prot_p = False + return resp + + # --- Overridden FTP methods + + def ntransfercmd(self, cmd, rest=None): + conn, size = FTP.ntransfercmd(self, cmd, rest) + if self._prot_p: + conn = self.context.wrap_socket(conn, + server_hostname=self.host) + return conn, size + + def abort(self): + # overridden as we can't pass MSG_OOB flag to sendall() + line = b'ABOR' + B_CRLF + self.sock.sendall(line) + resp = self.getmultiline() + if resp[:3] not in {'426', '225', '226'}: + raise error_proto(resp) + return resp + + __all__.append('FTP_TLS') + all_errors = (Error, OSError, EOFError, ssl.SSLError) + + +_150_re = None + +def parse150(resp): + '''Parse the '150' response for a RETR request. + Returns the expected transfer size or None; size is not guaranteed to + be present in the 150 message. + ''' + if resp[:3] != '150': + raise error_reply(resp) + global _150_re + if _150_re is None: + import re + _150_re = re.compile( + "150 .* \((\d+) bytes\)", re.IGNORECASE | re.ASCII) + m = _150_re.match(resp) + if not m: + return None + return int(m.group(1)) + + +_227_re = None + +def parse227(resp): + '''Parse the '227' response for a PASV request. + Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' + Return ('host.addr.as.numbers', port#) tuple.''' + + if resp[:3] != '227': + raise error_reply(resp) + global _227_re + if _227_re is None: + import re + _227_re = re.compile(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)', re.ASCII) + m = _227_re.search(resp) + if not m: + raise error_proto(resp) + numbers = m.groups() + host = '.'.join(numbers[:4]) + port = (int(numbers[4]) << 8) + int(numbers[5]) + return host, port + + +def parse229(resp, peer): + '''Parse the '229' response for an EPSV request. + Raises error_proto if it does not contain '(|||port|)' + Return ('host.addr.as.numbers', port#) tuple.''' + + if resp[:3] != '229': + raise error_reply(resp) + left = resp.find('(') + if left < 0: raise error_proto(resp) + right = resp.find(')', left + 1) + if right < 0: + raise error_proto(resp) # should contain '(|||port|)' + if resp[left + 1] != resp[right - 1]: + raise error_proto(resp) + parts = resp[left + 1:right].split(resp[left+1]) + if len(parts) != 5: + raise error_proto(resp) + host = peer[0] + port = int(parts[3]) + return host, port + + +def parse257(resp): + '''Parse the '257' response for a MKD or PWD request. + This is a response to a MKD or PWD request: a directory name. + Returns the directoryname in the 257 reply.''' + + if resp[:3] != '257': + raise error_reply(resp) + if resp[3:5] != ' "': + return '' # Not compliant to RFC 959, but UNIX ftpd does this + dirname = '' + i = 5 + n = len(resp) + while i < n: + c = resp[i] + i = i+1 + if c == '"': + if i >= n or resp[i] != '"': + break + i = i+1 + dirname = dirname + c + return dirname + + +def print_line(line): + '''Default retrlines callback to print a line.''' + print(line) + + +def ftpcp(source, sourcename, target, targetname = '', type = 'I'): + '''Copy file from one FTP-instance to another.''' + if not targetname: + targetname = sourcename + type = 'TYPE ' + type + source.voidcmd(type) + target.voidcmd(type) + sourcehost, sourceport = parse227(source.sendcmd('PASV')) + target.sendport(sourcehost, sourceport) + # RFC 959: the user must "listen" [...] BEFORE sending the + # transfer request. + # So: STOR before RETR, because here the target is a "user". + treply = target.sendcmd('STOR ' + targetname) + if treply[:3] not in {'125', '150'}: + raise error_proto # RFC 959 + sreply = source.sendcmd('RETR ' + sourcename) + if sreply[:3] not in {'125', '150'}: + raise error_proto # RFC 959 + source.voidresp() + target.voidresp() + + +def test(): + '''Test program. + Usage: ftp [-d] [-r[file]] host [-l[dir]] [-d[dir]] [-p] [file] ... + + -d dir + -l list + -p password + ''' + + if len(sys.argv) < 2: + print(test.__doc__) + sys.exit(0) + + import netrc + + debugging = 0 + rcfile = None + while sys.argv[1] == '-d': + debugging = debugging+1 + del sys.argv[1] + if sys.argv[1][:2] == '-r': + # get name of alternate ~/.netrc file: + rcfile = sys.argv[1][2:] + del sys.argv[1] + host = sys.argv[1] + ftp = FTP(host) + ftp.set_debuglevel(debugging) + userid = passwd = acct = '' + try: + netrcobj = netrc.netrc(rcfile) + except OSError: + if rcfile is not None: + sys.stderr.write("Could not open account file" + " -- using anonymous login.") + else: + try: + userid, acct, passwd = netrcobj.authenticators(host) + except KeyError: + # no account for host + sys.stderr.write( + "No account -- using anonymous login.") + ftp.login(userid, passwd, acct) + for file in sys.argv[2:]: + if file[:2] == '-l': + ftp.dir(file[2:]) + elif file[:2] == '-d': + cmd = 'CWD' + if file[2:]: cmd = cmd + ' ' + file[2:] + resp = ftp.sendcmd(cmd) + elif file == '-p': + ftp.set_pasv(not ftp.passiveserver) + else: + ftp.retrbinary('RETR ' + file, \ + sys.stdout.write, 1024) + ftp.quit() + + +if __name__ == '__main__': + test() diff --git a/ftp_client/install.sh b/ftp_client/install.sh new file mode 100644 index 00000000..83e6a388 --- /dev/null +++ b/ftp_client/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION ftp_client on:" >> install.log +date >> install.log diff --git a/ftp_client/package.ini b/ftp_client/package.ini new file mode 100644 index 00000000..3372106e --- /dev/null +++ b/ftp_client/package.ini @@ -0,0 +1,11 @@ +[ftp_to_server] +uuid=1687727c-fd6c-48ff-807d-34a32faaedf8 +vendor=Cradlepoint +notes=A sample app that will upload a file to an ftp server +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/ftp_client/start.sh b/ftp_client/start.sh new file mode 100644 index 00000000..01dec69d --- /dev/null +++ b/ftp_client/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ftp_client.py start diff --git a/ftp_client/stop.sh b/ftp_client/stop.sh new file mode 100644 index 00000000..5ac6c22a --- /dev/null +++ b/ftp_client/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ftp_client.py stop diff --git a/ftp_server/asynchat.py b/ftp_server/asynchat.py new file mode 100644 index 00000000..f728d1b4 --- /dev/null +++ b/ftp_server/asynchat.py @@ -0,0 +1,336 @@ +# -*- Mode: Python; tab-width: 4 -*- +# Id: asynchat.py,v 2.26 2000/09/07 22:29:26 rushing Exp +# Author: Sam Rushing + +# ====================================================================== +# Copyright 1996 by Sam Rushing +# +# All Rights Reserved +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby +# granted, provided that the above copyright notice appear in all +# copies and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of Sam +# Rushing not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. +# +# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +# NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# ====================================================================== + +r"""A class supporting chat-style (command/response) protocols. + +This class adds support for 'chat' style protocols - where one side +sends a 'command', and the other sends a response (examples would be +the common internet protocols - smtp, nntp, ftp, etc..). + +The handle_read() method looks at the input stream for the current +'terminator' (usually '\r\n' for single-line responses, '\r\n.\r\n' +for multi-line output), calling self.found_terminator() on its +receipt. + +for example: +Say you build an async nntp client using this class. At the start +of the connection, you'll have self.terminator set to '\r\n', in +order to process the single-line greeting. Just before issuing a +'LIST' command you'll set it to '\r\n.\r\n'. The output of the LIST +command will be accumulated (using your own 'collect_incoming_data' +method) up to the terminator, and then control will be returned to +you - by calling your self.found_terminator() method. +""" +import asyncore +from collections import deque + + +class async_chat(asyncore.dispatcher): + """This is an abstract class. You must derive from this class, and add + the two methods collect_incoming_data() and found_terminator()""" + + # these are overridable defaults + + ac_in_buffer_size = 65536 + ac_out_buffer_size = 65536 + + # we don't want to enable the use of encoding by default, because that is a + # sign of an application bug that we don't want to pass silently + + use_encoding = 0 + encoding = 'latin-1' + + def __init__(self, sock=None, map=None): + # for string terminator matching + self.ac_in_buffer = b'' + + # we use a list here rather than io.BytesIO for a few reasons... + # del lst[:] is faster than bio.truncate(0) + # lst = [] is faster than bio.truncate(0) + self.incoming = [] + + # we toss the use of the "simple producer" and replace it with + # a pure deque, which the original fifo was a wrapping of + self.producer_fifo = deque() + asyncore.dispatcher.__init__(self, sock, map) + + def collect_incoming_data(self, data): + raise NotImplementedError("must be implemented in subclass") + + def _collect_incoming_data(self, data): + self.incoming.append(data) + + def _get_data(self): + d = b''.join(self.incoming) + del self.incoming[:] + return d + + def found_terminator(self): + raise NotImplementedError("must be implemented in subclass") + + def set_terminator(self, term): + """Set the input delimiter. + + Can be a fixed string of any length, an integer, or None. + """ + if isinstance(term, str) and self.use_encoding: + term = bytes(term, self.encoding) + elif isinstance(term, int) and term < 0: + raise ValueError('the number of received bytes must be positive') + self.terminator = term + + def get_terminator(self): + return self.terminator + + # grab some more data from the socket, + # throw it to the collector method, + # check for the terminator, + # if found, transition to the next state. + + def handle_read(self): + + try: + data = self.recv(self.ac_in_buffer_size) + except BlockingIOError: + return + except OSError as why: + self.handle_error() + return + + if isinstance(data, str) and self.use_encoding: + data = bytes(str, self.encoding) + self.ac_in_buffer = self.ac_in_buffer + data + + # Continue to search for self.terminator in self.ac_in_buffer, + # while calling self.collect_incoming_data. The while loop + # is necessary because we might read several data+terminator + # combos with a single recv(4096). + + while self.ac_in_buffer: + lb = len(self.ac_in_buffer) + terminator = self.get_terminator() + if not terminator: + # no terminator, collect it all + self.collect_incoming_data(self.ac_in_buffer) + self.ac_in_buffer = b'' + elif isinstance(terminator, int): + # numeric terminator + n = terminator + if lb < n: + self.collect_incoming_data(self.ac_in_buffer) + self.ac_in_buffer = b'' + self.terminator = self.terminator - lb + else: + self.collect_incoming_data(self.ac_in_buffer[:n]) + self.ac_in_buffer = self.ac_in_buffer[n:] + self.terminator = 0 + self.found_terminator() + else: + # 3 cases: + # 1) end of buffer matches terminator exactly: + # collect data, transition + # 2) end of buffer matches some prefix: + # collect data to the prefix + # 3) end of buffer does not match any prefix: + # collect data + terminator_len = len(terminator) + index = self.ac_in_buffer.find(terminator) + if index != -1: + # we found the terminator + if index > 0: + # don't bother reporting the empty string + # (source of subtle bugs) + self.collect_incoming_data(self.ac_in_buffer[:index]) + self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:] + # This does the Right Thing if the terminator + # is changed here. + self.found_terminator() + else: + # check for a prefix of the terminator + index = find_prefix_at_end(self.ac_in_buffer, terminator) + if index: + if index != lb: + # we found a prefix, collect up to the prefix + self.collect_incoming_data(self.ac_in_buffer[:-index]) + self.ac_in_buffer = self.ac_in_buffer[-index:] + break + else: + # no prefix, collect it all + self.collect_incoming_data(self.ac_in_buffer) + self.ac_in_buffer = b'' + + def handle_write(self): + self.initiate_send() + + def handle_close(self): + self.close() + + def push(self, data): + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError('data argument must be byte-ish (%r)', + type(data)) + sabs = self.ac_out_buffer_size + if len(data) > sabs: + for i in range(0, len(data), sabs): + self.producer_fifo.append(data[i:i+sabs]) + else: + self.producer_fifo.append(data) + self.initiate_send() + + def push_with_producer(self, producer): + self.producer_fifo.append(producer) + self.initiate_send() + + def readable(self): + "predicate for inclusion in the readable for select()" + # cannot use the old predicate, it violates the claim of the + # set_terminator method. + + # return (len(self.ac_in_buffer) <= self.ac_in_buffer_size) + return 1 + + def writable(self): + "predicate for inclusion in the writable for select()" + return self.producer_fifo or (not self.connected) + + def close_when_done(self): + "automatically close this channel once the outgoing queue is empty" + self.producer_fifo.append(None) + + def initiate_send(self): + while self.producer_fifo and self.connected: + first = self.producer_fifo[0] + # handle empty string/buffer or None entry + if not first: + del self.producer_fifo[0] + if first is None: + self.handle_close() + return + + # handle classic producer behavior + obs = self.ac_out_buffer_size + try: + data = first[:obs] + except TypeError: + data = first.more() + if data: + self.producer_fifo.appendleft(data) + else: + del self.producer_fifo[0] + continue + + if isinstance(data, str) and self.use_encoding: + data = bytes(data, self.encoding) + + # send the data + try: + num_sent = self.send(data) + except OSError: + self.handle_error() + return + + if num_sent: + if num_sent < len(data) or obs < len(first): + self.producer_fifo[0] = first[num_sent:] + else: + del self.producer_fifo[0] + # we tried to send some actual data + return + + def discard_buffers(self): + # Emergencies only! + self.ac_in_buffer = b'' + del self.incoming[:] + self.producer_fifo.clear() + + +class simple_producer: + + def __init__(self, data, buffer_size=512): + self.data = data + self.buffer_size = buffer_size + + def more(self): + if len(self.data) > self.buffer_size: + result = self.data[:self.buffer_size] + self.data = self.data[self.buffer_size:] + return result + else: + result = self.data + self.data = b'' + return result + + +class fifo: + def __init__(self, list=None): + import warnings + warnings.warn('fifo class will be removed in Python 3.6', + DeprecationWarning, stacklevel=2) + if not list: + self.list = deque() + else: + self.list = deque(list) + + def __len__(self): + return len(self.list) + + def is_empty(self): + return not self.list + + def first(self): + return self.list[0] + + def push(self, data): + self.list.append(data) + + def pop(self): + if self.list: + return (1, self.list.popleft()) + else: + return (0, None) + + +# Given 'haystack', see if any prefix of 'needle' is at its end. This +# assumes an exact match has already been checked. Return the number of +# characters matched. +# for example: +# f_p_a_e("qwerty\r", "\r\n") => 1 +# f_p_a_e("qwertydkjf", "\r\n") => 0 +# f_p_a_e("qwerty\r\n", "\r\n") => + +# this could maybe be made faster with a computed regex? +# [answer: no; circa Python-2.0, Jan 2001] +# new python: 28961/s +# old python: 18307/s +# re: 12820/s +# regex: 14035/s + +def find_prefix_at_end(haystack, needle): + l = len(needle) - 1 + while l and not haystack.endswith(needle[:l]): + l -= 1 + return l diff --git a/ftp_server/asyncore.py b/ftp_server/asyncore.py new file mode 100644 index 00000000..3b51f0f3 --- /dev/null +++ b/ftp_server/asyncore.py @@ -0,0 +1,643 @@ +# -*- Mode: Python -*- +# Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp +# Author: Sam Rushing + +# ====================================================================== +# Copyright 1996 by Sam Rushing +# +# All Rights Reserved +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby +# granted, provided that the above copyright notice appear in all +# copies and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of Sam +# Rushing not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. +# +# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +# NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# ====================================================================== + +"""Basic infrastructure for asynchronous socket service clients and servers. + +There are only two ways to have a program on a single processor do "more +than one thing at a time". Multi-threaded programming is the simplest and +most popular way to do it, but there is another very different technique, +that lets you have nearly all the advantages of multi-threading, without +actually using multiple threads. it's really only practical if your program +is largely I/O bound. If your program is CPU bound, then pre-emptive +scheduled threads are probably what you really need. Network servers are +rarely CPU-bound, however. + +If your operating system supports the select() system call in its I/O +library (and nearly all do), then you can use it to juggle multiple +communication channels at once; doing other work while your I/O is taking +place in the "background." Although this strategy can seem strange and +complex, especially at first, it is in many ways easier to understand and +control than multi-threaded programming. The module documented here solves +many of the difficult problems for you, making the task of building +sophisticated high-performance network servers and clients a snap. +""" + +import select +import socket +import sys +import time +import warnings + +import os +from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \ + ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ + errorcode + +_DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, + EBADF}) + +try: + socket_map +except NameError: + socket_map = {} + +def _strerror(err): + try: + return os.strerror(err) + except (ValueError, OverflowError, NameError): + if err in errorcode: + return errorcode[err] + return "Unknown error %s" %err + +class ExitNow(Exception): + pass + +_reraised_exceptions = (ExitNow, KeyboardInterrupt, SystemExit) + +def read(obj): + try: + obj.handle_read_event() + except _reraised_exceptions: + raise + except: + obj.handle_error() + +def write(obj): + try: + obj.handle_write_event() + except _reraised_exceptions: + raise + except: + obj.handle_error() + +def _exception(obj): + try: + obj.handle_expt_event() + except _reraised_exceptions: + raise + except: + obj.handle_error() + +def readwrite(obj, flags): + try: + if flags & select.POLLIN: + obj.handle_read_event() + if flags & select.POLLOUT: + obj.handle_write_event() + if flags & select.POLLPRI: + obj.handle_expt_event() + if flags & (select.POLLHUP | select.POLLERR | select.POLLNVAL): + obj.handle_close() + except OSError as e: + if e.args[0] not in _DISCONNECTED: + obj.handle_error() + else: + obj.handle_close() + except _reraised_exceptions: + raise + except: + obj.handle_error() + +def poll(timeout=0.0, map=None): + if map is None: + map = socket_map + if map: + r = []; w = []; e = [] + for fd, obj in list(map.items()): + is_r = obj.readable() + is_w = obj.writable() + if is_r: + r.append(fd) + # accepting sockets should not be writable + if is_w and not obj.accepting: + w.append(fd) + if is_r or is_w: + e.append(fd) + if [] == r == w == e: + time.sleep(timeout) + return + + r, w, e = select.select(r, w, e, timeout) + + for fd in r: + obj = map.get(fd) + if obj is None: + continue + read(obj) + + for fd in w: + obj = map.get(fd) + if obj is None: + continue + write(obj) + + for fd in e: + obj = map.get(fd) + if obj is None: + continue + _exception(obj) + +def poll2(timeout=0.0, map=None): + # Use the poll() support added to the select module in Python 2.0 + if map is None: + map = socket_map + if timeout is not None: + # timeout is in milliseconds + timeout = int(timeout*1000) + pollster = select.poll() + if map: + for fd, obj in list(map.items()): + flags = 0 + if obj.readable(): + flags |= select.POLLIN | select.POLLPRI + # accepting sockets should not be writable + if obj.writable() and not obj.accepting: + flags |= select.POLLOUT + if flags: + pollster.register(fd, flags) + + r = pollster.poll(timeout) + for fd, flags in r: + obj = map.get(fd) + if obj is None: + continue + readwrite(obj, flags) + +poll3 = poll2 # Alias for backward compatibility + +def loop(timeout=30.0, use_poll=False, map=None, count=None): + if map is None: + map = socket_map + + if use_poll and hasattr(select, 'poll'): + poll_fun = poll2 + else: + poll_fun = poll + + if count is None: + while map: + poll_fun(timeout, map) + + else: + while map and count > 0: + poll_fun(timeout, map) + count = count - 1 + +class dispatcher: + + debug = False + connected = False + accepting = False + connecting = False + closing = False + addr = None + ignore_log_types = frozenset({'warning'}) + + def __init__(self, sock=None, map=None): + if map is None: + self._map = socket_map + else: + self._map = map + + self._fileno = None + + if sock: + # Set to nonblocking just to make sure for cases where we + # get a socket from a blocking source. + sock.setblocking(0) + self.set_socket(sock, map) + self.connected = True + # The constructor no longer requires that the socket + # passed be connected. + try: + self.addr = sock.getpeername() + except OSError as err: + if err.args[0] in (ENOTCONN, EINVAL): + # To handle the case where we got an unconnected + # socket. + self.connected = False + else: + # The socket is broken in some unknown way, alert + # the user and remove it from the map (to prevent + # polling of broken sockets). + self.del_channel(map) + raise + else: + self.socket = None + + def __repr__(self): + status = [self.__class__.__module__+"."+self.__class__.__qualname__] + if self.accepting and self.addr: + status.append('listening') + elif self.connected: + status.append('connected') + if self.addr is not None: + try: + status.append('%s:%d' % self.addr) + except TypeError: + status.append(repr(self.addr)) + return '<%s at %#x>' % (' '.join(status), id(self)) + + __str__ = __repr__ + + def add_channel(self, map=None): + #self.log_info('adding channel %s' % self) + if map is None: + map = self._map + map[self._fileno] = self + + def del_channel(self, map=None): + fd = self._fileno + if map is None: + map = self._map + if fd in map: + #self.log_info('closing channel %d:%s' % (fd, self)) + del map[fd] + self._fileno = None + + def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM): + self.family_and_type = family, type + sock = socket.socket(family, type) + sock.setblocking(0) + self.set_socket(sock) + + def set_socket(self, sock, map=None): + self.socket = sock +## self.__dict__['socket'] = sock + self._fileno = sock.fileno() + self.add_channel(map) + + def set_reuse_addr(self): + # try to re-use a server port if possible + try: + self.socket.setsockopt( + socket.SOL_SOCKET, socket.SO_REUSEADDR, + self.socket.getsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR) | 1 + ) + except OSError: + pass + + # ================================================== + # predicates for select() + # these are used as filters for the lists of sockets + # to pass to select(). + # ================================================== + + def readable(self): + return True + + def writable(self): + return True + + # ================================================== + # socket object methods. + # ================================================== + + def listen(self, num): + self.accepting = True + if os.name == 'nt' and num > 5: + num = 5 + return self.socket.listen(num) + + def bind(self, addr): + self.addr = addr + return self.socket.bind(addr) + + def connect(self, address): + self.connected = False + self.connecting = True + err = self.socket.connect_ex(address) + if err in (EINPROGRESS, EALREADY, EWOULDBLOCK) \ + or err == EINVAL and os.name in ('nt', 'ce'): + self.addr = address + return + if err in (0, EISCONN): + self.addr = address + self.handle_connect_event() + else: + raise OSError(err, errorcode[err]) + + def accept(self): + # XXX can return either an address pair or None + try: + conn, addr = self.socket.accept() + except TypeError: + return None + except OSError as why: + if why.args[0] in (EWOULDBLOCK, ECONNABORTED, EAGAIN): + return None + else: + raise + else: + return conn, addr + + def send(self, data): + try: + result = self.socket.send(data) + return result + except OSError as why: + if why.args[0] == EWOULDBLOCK: + return 0 + elif why.args[0] in _DISCONNECTED: + self.handle_close() + return 0 + else: + raise + + def recv(self, buffer_size): + try: + data = self.socket.recv(buffer_size) + if not data: + # a closed connection is indicated by signaling + # a read condition, and having recv() return 0. + self.handle_close() + return b'' + else: + return data + except OSError as why: + # winsock sometimes raises ENOTCONN + if why.args[0] in _DISCONNECTED: + self.handle_close() + return b'' + else: + raise + + def close(self): + self.connected = False + self.accepting = False + self.connecting = False + self.del_channel() + if self.socket is not None: + try: + self.socket.close() + except OSError as why: + if why.args[0] not in (ENOTCONN, EBADF): + raise + + # log and log_info may be overridden to provide more sophisticated + # logging and warning methods. In general, log is for 'hit' logging + # and 'log_info' is for informational, warning and error logging. + + def log(self, message): + sys.stderr.write('log: %s\n' % str(message)) + + def log_info(self, message, type='info'): + if type not in self.ignore_log_types: + print('%s: %s' % (type, message)) + + def handle_read_event(self): + if self.accepting: + # accepting sockets are never connected, they "spawn" new + # sockets that are connected + self.handle_accept() + elif not self.connected: + if self.connecting: + self.handle_connect_event() + self.handle_read() + else: + self.handle_read() + + def handle_connect_event(self): + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + raise OSError(err, _strerror(err)) + self.handle_connect() + self.connected = True + self.connecting = False + + def handle_write_event(self): + if self.accepting: + # Accepting sockets shouldn't get a write event. + # We will pretend it didn't happen. + return + + if not self.connected: + if self.connecting: + self.handle_connect_event() + self.handle_write() + + def handle_expt_event(self): + # handle_expt_event() is called if there might be an error on the + # socket, or if there is OOB data + # check for the error condition first + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + # we can get here when select.select() says that there is an + # exceptional condition on the socket + # since there is an error, we'll go ahead and close the socket + # like we would in a subclassed handle_read() that received no + # data + self.handle_close() + else: + self.handle_expt() + + def handle_error(self): + nil, t, v, tbinfo = compact_traceback() + + # sometimes a user repr method will crash. + try: + self_repr = repr(self) + except: + self_repr = '<__repr__(self) failed for object at %0x>' % id(self) + + self.log_info( + 'uncaptured python exception, closing channel %s (%s:%s %s)' % ( + self_repr, + t, + v, + tbinfo + ), + 'error' + ) + self.handle_close() + + def handle_expt(self): + self.log_info('unhandled incoming priority event', 'warning') + + def handle_read(self): + self.log_info('unhandled read event', 'warning') + + def handle_write(self): + self.log_info('unhandled write event', 'warning') + + def handle_connect(self): + self.log_info('unhandled connect event', 'warning') + + def handle_accept(self): + pair = self.accept() + if pair is not None: + self.handle_accepted(*pair) + + def handle_accepted(self, sock, addr): + sock.close() + self.log_info('unhandled accepted event', 'warning') + + def handle_close(self): + self.log_info('unhandled close event', 'warning') + self.close() + +# --------------------------------------------------------------------------- +# adds simple buffered output capability, useful for simple clients. +# [for more sophisticated usage use asynchat.async_chat] +# --------------------------------------------------------------------------- + +class dispatcher_with_send(dispatcher): + + def __init__(self, sock=None, map=None): + dispatcher.__init__(self, sock, map) + self.out_buffer = b'' + + def initiate_send(self): + num_sent = 0 + num_sent = dispatcher.send(self, self.out_buffer[:65536]) + self.out_buffer = self.out_buffer[num_sent:] + + def handle_write(self): + self.initiate_send() + + def writable(self): + return (not self.connected) or len(self.out_buffer) + + def send(self, data): + if self.debug: + self.log_info('sending %s' % repr(data)) + self.out_buffer = self.out_buffer + data + self.initiate_send() + +# --------------------------------------------------------------------------- +# used for debugging. +# --------------------------------------------------------------------------- + +def compact_traceback(): + t, v, tb = sys.exc_info() + tbinfo = [] + if not tb: # Must have a traceback + raise AssertionError("traceback does not exist") + while tb: + tbinfo.append(( + tb.tb_frame.f_code.co_filename, + tb.tb_frame.f_code.co_name, + str(tb.tb_lineno) + )) + tb = tb.tb_next + + # just to be safe + del tb + + file, function, line = tbinfo[-1] + info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo]) + return (file, function, line), t, v, info + +def close_all(map=None, ignore_all=False): + if map is None: + map = socket_map + for x in list(map.values()): + try: + x.close() + except OSError as x: + if x.args[0] == EBADF: + pass + elif not ignore_all: + raise + except _reraised_exceptions: + raise + except: + if not ignore_all: + raise + map.clear() + +# Asynchronous File I/O: +# +# After a little research (reading man pages on various unixen, and +# digging through the linux kernel), I've determined that select() +# isn't meant for doing asynchronous file i/o. +# Heartening, though - reading linux/mm/filemap.c shows that linux +# supports asynchronous read-ahead. So _MOST_ of the time, the data +# will be sitting in memory for us already when we go to read it. +# +# What other OS's (besides NT) support async file i/o? [VMS?] +# +# Regardless, this is useful for pipes, and stdin/stdout... + +if os.name == 'posix': + class file_wrapper: + # Here we override just enough to make a file + # look like a socket for the purposes of asyncore. + # The passed fd is automatically os.dup()'d + + def __init__(self, fd): + self.fd = os.dup(fd) + + def __del__(self): + if self.fd >= 0: + warnings.warn("unclosed file %r" % self, ResourceWarning) + self.close() + + def recv(self, *args): + return os.read(self.fd, *args) + + def send(self, *args): + return os.write(self.fd, *args) + + def getsockopt(self, level, optname, buflen=None): + if (level == socket.SOL_SOCKET and + optname == socket.SO_ERROR and + not buflen): + return 0 + raise NotImplementedError("Only asyncore specific behaviour " + "implemented.") + + read = recv + write = send + + def close(self): + if self.fd < 0: + return + os.close(self.fd) + self.fd = -1 + + def fileno(self): + return self.fd + + class file_dispatcher(dispatcher): + + def __init__(self, fd, map=None): + dispatcher.__init__(self, None, map) + self.connected = True + try: + fd = fd.fileno() + except AttributeError: + pass + self.set_file(fd) + # set it to non-blocking mode + os.set_blocking(fd, False) + + def set_file(self, fd): + self.socket = file_wrapper(fd) + self._fileno = self.socket.fileno() + self.add_channel() diff --git a/ftp_server/cs.py b/ftp_server/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/ftp_server/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/ftp_server/ftp_server.py b/ftp_server/ftp_server.py new file mode 100644 index 00000000..c3a46a66 --- /dev/null +++ b/ftp_server/ftp_server.py @@ -0,0 +1,93 @@ +""" +This app will start an FTP server. This is done by using +pyftplib and also asynchat.py and asyncore.py. For detail +information about pyftplib, see https://pythonhosted.org/pyftpdlib/. +""" + +import sys +import argparse +import cs +from pyftpdlib.authorizers import DummyAuthorizer +from pyftpdlib.handlers import FTPHandler +from pyftpdlib.servers import FTPServer + +APP_NAME = "ftp_server" + +# This requires a USB compatible storage device plugged into +# the router. It will mount to /var/media. +FTP_DIR = '/var/media' + + +def start_ftp_server(): + try: + authorizer = DummyAuthorizer() + # Define a new user having full r/w permissions and a read-only + # anonymous user + authorizer.add_user('user', '12345', FTP_DIR, perm='elradfmwM') + authorizer.add_anonymous(FTP_DIR) + + # Instantiate FTP handler class + handler = FTPHandler + handler.authorizer = authorizer + + # Define a customized banner (string returned when client connects) + handler.banner = "pyftpdlib based ftpd ready." + + # Instantiate FTP server class and listen on 0.0.0.0:2121. + # Application can only use ports higher that 1024 and the port + # will need to be allowed in the router firewall + address = ('', 2121) + server = FTPServer(address, handler) + + # set a limit for connections + server.max_cons = 256 + server.max_cons_per_ip = 5 + + # start ftp server + cs.CSClient().log(APP_NAME, 'Starting FTP server...') + server.serve_forever() + + except Exception as e: + cs.CSClient().log(APP_NAME, 'Something went wrong in start_ftp_server()! exception: {}'.format(e)) + raise + + return + + +def stop_router_app(): + """ + Perform any cleanup or other actions. + """ + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + # Call the function to start the app. + start_ftp_server() + + elif command == 'stop': + # Call the function to start the app. + stop_router_app() + + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + # The start.sh and stop.sh should call this script with a start or stop argument + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/ftp_server/install.sh b/ftp_server/install.sh new file mode 100644 index 00000000..3603d2f6 --- /dev/null +++ b/ftp_server/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION ftp_server on:" >> install.log +date >> install.log diff --git a/ftp_server/package.ini b/ftp_server/package.ini new file mode 100644 index 00000000..dfa1b966 --- /dev/null +++ b/ftp_server/package.ini @@ -0,0 +1,11 @@ +[ftp_server] +uuid=800a7994-87a5-41c2-b747-a614c0326b16 +vendor=Cradlepoint +notes=Starts and FTP server in the router +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/ftp_server/pyftpdlib/__init__.py b/ftp_server/pyftpdlib/__init__.py new file mode 100644 index 00000000..2bbfdbe6 --- /dev/null +++ b/ftp_server/pyftpdlib/__init__.py @@ -0,0 +1,73 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + + +""" +pyftpdlib: RFC-959 asynchronous FTP server. + +pyftpdlib implements a fully functioning asynchronous FTP server as +defined in RFC-959. A hierarchy of classes outlined below implement +the backend functionality for the FTPd: + + [pyftpdlib.ftpservers.FTPServer] + accepts connections and dispatches them to a handler + + [pyftpdlib.handlers.FTPHandler] + a class representing the server-protocol-interpreter + (server-PI, see RFC-959). Each time a new connection occurs + FTPServer will create a new FTPHandler instance to handle the + current PI session. + + [pyftpdlib.handlers.ActiveDTP] + [pyftpdlib.handlers.PassiveDTP] + base classes for active/passive-DTP backends. + + [pyftpdlib.handlers.DTPHandler] + this class handles processing of data transfer operations (server-DTP, + see RFC-959). + + [pyftpdlib.authorizers.DummyAuthorizer] + an "authorizer" is a class handling FTPd authentications and + permissions. It is used inside FTPHandler class to verify user + passwords, to get user's home directory and to get permissions + when a filesystem read/write occurs. "DummyAuthorizer" is the + base authorizer class providing a platform independent interface + for managing virtual users. + + [pyftpdlib.filesystems.AbstractedFS] + class used to interact with the file system, providing a high level, + cross-platform interface compatible with both Windows and UNIX style + filesystems. + +Usage example: + +>>> from pyftpdlib.authorizers import DummyAuthorizer +>>> from pyftpdlib.handlers import FTPHandler +>>> from pyftpdlib.servers import FTPServer +>>> +>>> authorizer = DummyAuthorizer() +>>> authorizer.add_user("user", "12345", "/home/giampaolo", perm="elradfmw") +>>> authorizer.add_anonymous("/home/nobody") +>>> +>>> handler = FTPHandler +>>> handler.authorizer = authorizer +>>> +>>> server = FTPServer(("127.0.0.1", 21), handler) +>>> server.serve_forever() +[I 13-02-19 10:55:42] >>> starting FTP server on 127.0.0.1:21 <<< +[I 13-02-19 10:55:42] poller: +[I 13-02-19 10:55:42] masquerade (NAT) address: None +[I 13-02-19 10:55:42] passive ports: None +[I 13-02-19 10:55:42] use sendfile(2): True +[I 13-02-19 10:55:45] 127.0.0.1:34178-[] FTP session opened (connect) +[I 13-02-19 10:55:48] 127.0.0.1:34178-[user] USER 'user' logged in. +[I 13-02-19 10:56:27] 127.0.0.1:34179-[user] RETR /home/giampaolo/.vimrc + completed=1 bytes=1700 seconds=0.001 +[I 13-02-19 10:56:39] 127.0.0.1:34179-[user] FTP session closed (disconnect). +""" + + +__ver__ = '1.5.2' +__author__ = "Giampaolo Rodola' " +__web__ = 'https://github.com/giampaolo/pyftpdlib/' diff --git a/ftp_server/pyftpdlib/__main__.py b/ftp_server/pyftpdlib/__main__.py new file mode 100644 index 00000000..bf82a90e --- /dev/null +++ b/ftp_server/pyftpdlib/__main__.py @@ -0,0 +1,100 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +""" +Start a stand alone anonymous FTP server from the command line as in: + +$ python -m pyftpdlib +""" + +import logging +import optparse +import os +import sys + +from . import __ver__ +from ._compat import getcwdu +from .authorizers import DummyAuthorizer +from .handlers import FTPHandler +from .log import config_logging +from .servers import FTPServer + + +class CustomizedOptionFormatter(optparse.IndentedHelpFormatter): + """Formats options shown in help in a prettier way.""" + + def format_option(self, option): + result = [] + opts = self.option_strings[option] + result.append(' %s\n' % opts) + if option.help: + help_text = ' %s\n\n' % self.expand_default(option) + result.append(help_text) + return ''.join(result) + + +def main(): + """Start a stand alone anonymous FTP server.""" + usage = "python -m pyftpdlib [options]" + parser = optparse.OptionParser(usage=usage, description=main.__doc__, + formatter=CustomizedOptionFormatter()) + parser.add_option('-i', '--interface', default=None, metavar="ADDRESS", + help="specify the interface to run on (default all " + "interfaces)") + parser.add_option('-p', '--port', type="int", default=2121, metavar="PORT", + help="specify port number to run on (default 2121)") + parser.add_option('-w', '--write', action="store_true", default=False, + help="grants write access for the anonymous user " + "(default read-only)") + parser.add_option('-d', '--directory', default=getcwdu(), metavar="FOLDER", + help="specify the directory to share (default current " + "directory)") + parser.add_option('-n', '--nat-address', default=None, metavar="ADDRESS", + help="the NAT address to use for passive connections") + parser.add_option('-r', '--range', default=None, metavar="FROM-TO", + help="the range of TCP ports to use for passive " + "connections (e.g. -r 8000-9000)") + parser.add_option('-D', '--debug', action='store_true', + help="enable DEBUG logging evel") + parser.add_option('-v', '--version', action='store_true', + help="print pyftpdlib version and exit") + + options, args = parser.parse_args() + if options.version: + sys.exit("pyftpdlib %s" % __ver__) + if options.debug: + config_logging(level=logging.DEBUG) + + passive_ports = None + if options.range: + try: + start, stop = options.range.split('-') + start = int(start) + stop = int(stop) + except ValueError: + parser.error('invalid argument passed to -r option') + else: + passive_ports = list(range(start, stop + 1)) + # On recent Windows versions, if address is not specified and IPv6 + # is installed the socket will listen on IPv6 by default; in this + # case we force IPv4 instead. + if os.name in ('nt', 'ce') and not options.interface: + options.interface = '0.0.0.0' + + authorizer = DummyAuthorizer() + perm = options.write and "elradfmwM" or "elr" + authorizer.add_anonymous(options.directory, perm=perm) + handler = FTPHandler + handler.authorizer = authorizer + handler.masquerade_address = options.nat_address + handler.passive_ports = passive_ports + ftpd = FTPServer((options.interface, options.port), FTPHandler) + try: + ftpd.serve_forever() + finally: + ftpd.close_all() + + +if __name__ == '__main__': + main() diff --git a/ftp_server/pyftpdlib/_compat.py b/ftp_server/pyftpdlib/_compat.py new file mode 100644 index 00000000..62a8bbb4 --- /dev/null +++ b/ftp_server/pyftpdlib/_compat.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +""" +Compatibility module similar to six which helps maintaining +a single code base working with python from 2.6 to 3.x. +""" + +import os +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + def u(s): + return s + + def b(s): + return s.encode("latin-1") + + getcwdu = os.getcwd + unicode = str + xrange = range +else: + def u(s): + return unicode(s) + + def b(s): + return s + + getcwdu = os.getcwdu + unicode = unicode + xrange = xrange + + +# removed in 3.0, reintroduced in 3.2 +try: + callable = callable +except Exception: + def callable(obj): + for klass in type(obj).__mro__: + if "__call__" in klass.__dict__: + return True + return False diff --git a/ftp_server/pyftpdlib/authorizers.py b/ftp_server/pyftpdlib/authorizers.py new file mode 100644 index 00000000..b7e1d515 --- /dev/null +++ b/ftp_server/pyftpdlib/authorizers.py @@ -0,0 +1,880 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +"""An "authorizer" is a class handling authentications and permissions +of the FTP server. It is used by pyftpdlib.handlers.FTPHandler +class for: + +- verifying user password +- getting user home directory +- checking user permissions when a filesystem read/write event occurs +- changing user when accessing the filesystem + +DummyAuthorizer is the main class which handles virtual users. + +UnixAuthorizer and WindowsAuthorizer are platform specific and +interact with UNIX and Windows password database. +""" + + +import errno +import os +import sys +import warnings + +from ._compat import PY3 +from ._compat import unicode +from ._compat import getcwdu + + +__all__ = ['DummyAuthorizer', + # 'BaseUnixAuthorizer', 'UnixAuthorizer', + # 'BaseWindowsAuthorizer', 'WindowsAuthorizer', + ] + + +# =================================================================== +# --- exceptions +# =================================================================== + +class AuthorizerError(Exception): + """Base class for authorizer exceptions.""" + + +class AuthenticationFailed(Exception): + """Exception raised when authentication fails for any reason.""" + + +# =================================================================== +# --- base class +# =================================================================== + +class DummyAuthorizer(object): + """Basic "dummy" authorizer class, suitable for subclassing to + create your own custom authorizers. + + An "authorizer" is a class handling authentications and permissions + of the FTP server. It is used inside FTPHandler class for verifying + user's password, getting users home directory, checking user + permissions when a file read/write event occurs and changing user + before accessing the filesystem. + + DummyAuthorizer is the base authorizer, providing a platform + independent interface for managing "virtual" FTP users. System + dependent authorizers can by written by subclassing this base + class and overriding appropriate methods as necessary. + """ + + read_perms = "elr" + write_perms = "adfmwM" + + def __init__(self): + self.user_table = {} + + def add_user(self, username, password, homedir, perm='elr', + msg_login="Login successful.", msg_quit="Goodbye."): + """Add a user to the virtual users table. + + AuthorizerError exceptions raised on error conditions such as + invalid permissions, missing home directory or duplicate usernames. + + Optional perm argument is a string referencing the user's + permissions explained below: + + Read permissions: + - "e" = change directory (CWD command) + - "l" = list files (LIST, NLST, STAT, MLSD, MLST, SIZE, MDTM commands) + - "r" = retrieve file from the server (RETR command) + + Write permissions: + - "a" = append data to an existing file (APPE command) + - "d" = delete file or directory (DELE, RMD commands) + - "f" = rename file or directory (RNFR, RNTO commands) + - "m" = create directory (MKD command) + - "w" = store a file to the server (STOR, STOU commands) + - "M" = change file mode (SITE CHMOD command) + + Optional msg_login and msg_quit arguments can be specified to + provide customized response strings when user log-in and quit. + """ + if self.has_user(username): + raise ValueError('user %r already exists' % username) + if not isinstance(homedir, unicode): + homedir = homedir.decode('utf8') + if not os.path.isdir(homedir): + raise ValueError('no such directory: %r' % homedir) + homedir = os.path.realpath(homedir) + self._check_permissions(username, perm) + dic = {'pwd': str(password), + 'home': homedir, + 'perm': perm, + 'operms': {}, + 'msg_login': str(msg_login), + 'msg_quit': str(msg_quit) + } + self.user_table[username] = dic + + def add_anonymous(self, homedir, **kwargs): + """Add an anonymous user to the virtual users table. + + AuthorizerError exception raised on error conditions such as + invalid permissions, missing home directory, or duplicate + anonymous users. + + The keyword arguments in kwargs are the same expected by + add_user method: "perm", "msg_login" and "msg_quit". + + The optional "perm" keyword argument is a string defaulting to + "elr" referencing "read-only" anonymous user's permissions. + + Using write permission values ("adfmwM") results in a + RuntimeWarning. + """ + DummyAuthorizer.add_user(self, 'anonymous', '', homedir, **kwargs) + + def remove_user(self, username): + """Remove a user from the virtual users table.""" + del self.user_table[username] + + def override_perm(self, username, directory, perm, recursive=False): + """Override permissions for a given directory.""" + self._check_permissions(username, perm) + if not os.path.isdir(directory): + raise ValueError('no such directory: %r' % directory) + directory = os.path.normcase(os.path.realpath(directory)) + home = os.path.normcase(self.get_home_dir(username)) + if directory == home: + raise ValueError("can't override home directory permissions") + if not self._issubpath(directory, home): + raise ValueError("path escapes user home directory") + self.user_table[username]['operms'][directory] = perm, recursive + + def validate_authentication(self, username, password, handler): + """Raises AuthenticationFailed if supplied username and + password don't match the stored credentials, else return + None. + """ + msg = "Authentication failed." + if not self.has_user(username): + if username == 'anonymous': + msg = "Anonymous access not allowed." + raise AuthenticationFailed(msg) + if username != 'anonymous': + if self.user_table[username]['pwd'] != password: + raise AuthenticationFailed(msg) + + def get_home_dir(self, username): + """Return the user's home directory. + Since this is called during authentication (PASS), + AuthenticationFailed can be freely raised by subclasses in case + the provided username no longer exists. + """ + return self.user_table[username]['home'] + + def impersonate_user(self, username, password): + """Impersonate another user (noop). + + It is always called before accessing the filesystem. + By default it does nothing. The subclass overriding this + method is expected to provide a mechanism to change the + current user. + """ + + def terminate_impersonation(self, username): + """Terminate impersonation (noop). + + It is always called after having accessed the filesystem. + By default it does nothing. The subclass overriding this + method is expected to provide a mechanism to switch back + to the original user. + """ + + def has_user(self, username): + """Whether the username exists in the virtual users table.""" + return username in self.user_table + + def has_perm(self, username, perm, path=None): + """Whether the user has permission over path (an absolute + pathname of a file or a directory). + + Expected perm argument is one of the following letters: + "elradfmwM". + """ + if path is None: + return perm in self.user_table[username]['perm'] + + path = os.path.normcase(path) + for dir in self.user_table[username]['operms'].keys(): + operm, recursive = self.user_table[username]['operms'][dir] + if self._issubpath(path, dir): + if recursive: + return perm in operm + if (path == dir or os.path.dirname(path) == dir and not + os.path.isdir(path)): + return perm in operm + + return perm in self.user_table[username]['perm'] + + def get_perms(self, username): + """Return current user permissions.""" + return self.user_table[username]['perm'] + + def get_msg_login(self, username): + """Return the user's login message.""" + return self.user_table[username]['msg_login'] + + def get_msg_quit(self, username): + """Return the user's quitting message.""" + try: + return self.user_table[username]['msg_quit'] + except KeyError: + return "Goodbye." + + def _check_permissions(self, username, perm): + warned = 0 + for p in perm: + if p not in self.read_perms + self.write_perms: + raise ValueError('no such permission %r' % p) + if (username == 'anonymous' and + p in self.write_perms and not + warned): + warnings.warn("write permissions assigned to anonymous user.", + RuntimeWarning) + warned = 1 + + def _issubpath(self, a, b): + """Return True if a is a sub-path of b or if the paths are equal.""" + p1 = a.rstrip(os.sep).split(os.sep) + p2 = b.rstrip(os.sep).split(os.sep) + return p1[:len(p2)] == p2 + + +def replace_anonymous(callable): + """A decorator to replace anonymous user string passed to authorizer + methods as first argument with the actual user used to handle + anonymous sessions. + """ + + def wrapper(self, username, *args, **kwargs): + if username == 'anonymous': + username = self.anonymous_user or username + return callable(self, username, *args, **kwargs) + return wrapper + + +# =================================================================== +# --- platform specific authorizers +# =================================================================== + +class _Base(object): + """Methods common to both Unix and Windows authorizers. + Not supposed to be used directly. + """ + + msg_no_such_user = "Authentication failed." + msg_wrong_password = "Authentication failed." + msg_anon_not_allowed = "Anonymous access not allowed." + msg_invalid_shell = "User %s doesn't have a valid shell." + msg_rejected_user = "User %s is not allowed to login." + + def __init__(self): + """Check for errors in the constructor.""" + if self.rejected_users and self.allowed_users: + raise AuthorizerError("rejected_users and allowed_users options " + "are mutually exclusive") + + users = self._get_system_users() + for user in (self.allowed_users or self.rejected_users): + if user == 'anonymous': + raise AuthorizerError('invalid username "anonymous"') + if user not in users: + raise AuthorizerError('unknown user %s' % user) + + if self.anonymous_user is not None: + if not self.has_user(self.anonymous_user): + raise AuthorizerError('no such user %s' % self.anonymous_user) + home = self.get_home_dir(self.anonymous_user) + if not os.path.isdir(home): + raise AuthorizerError('no valid home set for user %s' + % self.anonymous_user) + + def override_user(self, username, password=None, homedir=None, perm=None, + msg_login=None, msg_quit=None): + """Overrides the options specified in the class constructor + for a specific user. + """ + if (not password and not homedir and not perm and not msg_login and not + msg_quit): + raise AuthorizerError( + "at least one keyword argument must be specified") + if self.allowed_users and username not in self.allowed_users: + raise AuthorizerError('%s is not an allowed user' % username) + if self.rejected_users and username in self.rejected_users: + raise AuthorizerError('%s is not an allowed user' % username) + if username == "anonymous" and password: + raise AuthorizerError("can't assign password to anonymous user") + if not self.has_user(username): + raise AuthorizerError('no such user %s' % username) + if homedir is not None and not isinstance(homedir, unicode): + homedir = homedir.decode('utf8') + + if username in self._dummy_authorizer.user_table: + # re-set parameters + del self._dummy_authorizer.user_table[username] + self._dummy_authorizer.add_user(username, + password or "", + homedir or getcwdu(), + perm or "", + msg_login or "", + msg_quit or "") + if homedir is None: + self._dummy_authorizer.user_table[username]['home'] = "" + + def get_msg_login(self, username): + return self._get_key(username, 'msg_login') or self.msg_login + + def get_msg_quit(self, username): + return self._get_key(username, 'msg_quit') or self.msg_quit + + def get_perms(self, username): + overridden_perms = self._get_key(username, 'perm') + if overridden_perms: + return overridden_perms + if username == 'anonymous': + return 'elr' + return self.global_perm + + def has_perm(self, username, perm, path=None): + return perm in self.get_perms(username) + + def _get_key(self, username, key): + if self._dummy_authorizer.has_user(username): + return self._dummy_authorizer.user_table[username][key] + + def _is_rejected_user(self, username): + """Return True if the user has been black listed via + allowed_users or rejected_users options. + """ + if self.allowed_users and username not in self.allowed_users: + return True + if self.rejected_users and username in self.rejected_users: + return True + return False + + +# =================================================================== +# --- UNIX +# =================================================================== + +try: + import crypt + import pwd + import spwd +except ImportError: + pass +else: + __all__.extend(['BaseUnixAuthorizer', 'UnixAuthorizer']) + + # the uid/gid the server runs under + PROCESS_UID = os.getuid() + PROCESS_GID = os.getgid() + + class BaseUnixAuthorizer(object): + """An authorizer compatible with Unix user account and password + database. + This class should not be used directly unless for subclassing. + Use higher-level UnixAuthorizer class instead. + """ + + def __init__(self, anonymous_user=None): + if os.geteuid() != 0 or not spwd.getspall(): + raise AuthorizerError("super user privileges are required") + self.anonymous_user = anonymous_user + + if self.anonymous_user is not None: + try: + pwd.getpwnam(self.anonymous_user).pw_dir + except KeyError: + raise AuthorizerError('no such user %s' % anonymous_user) + + # --- overridden / private API + + def validate_authentication(self, username, password, handler): + """Authenticates against shadow password db; raises + AuthenticationFailed in case of failed authentication. + """ + if username == "anonymous": + if self.anonymous_user is None: + raise AuthenticationFailed(self.msg_anon_not_allowed) + else: + try: + pw1 = spwd.getspnam(username).sp_pwd + pw2 = crypt.crypt(password, pw1) + except KeyError: # no such username + raise AuthenticationFailed(self.msg_no_such_user) + else: + if pw1 != pw2: + raise AuthenticationFailed(self.msg_wrong_password) + + @replace_anonymous + def impersonate_user(self, username, password): + """Change process effective user/group ids to reflect + logged in user. + """ + try: + pwdstruct = pwd.getpwnam(username) + except KeyError: + raise AuthorizerError(self.msg_no_such_user) + else: + os.setegid(pwdstruct.pw_gid) + os.seteuid(pwdstruct.pw_uid) + + def terminate_impersonation(self, username): + """Revert process effective user/group IDs.""" + os.setegid(PROCESS_GID) + os.seteuid(PROCESS_UID) + + @replace_anonymous + def has_user(self, username): + """Return True if user exists on the Unix system. + If the user has been black listed via allowed_users or + rejected_users options always return False. + """ + return username in self._get_system_users() + + @replace_anonymous + def get_home_dir(self, username): + """Return user home directory.""" + try: + home = pwd.getpwnam(username).pw_dir + except KeyError: + raise AuthorizerError(self.msg_no_such_user) + else: + if not PY3: + home = home.decode('utf8') + return home + + @staticmethod + def _get_system_users(): + """Return all users defined on the UNIX system.""" + # there should be no need to convert usernames to unicode + # as UNIX does not allow chars outside of ASCII set + return [entry.pw_name for entry in pwd.getpwall()] + + def get_msg_login(self, username): + return "Login successful." + + def get_msg_quit(self, username): + return "Goodbye." + + def get_perms(self, username): + return "elradfmw" + + def has_perm(self, username, perm, path=None): + return perm in self.get_perms(username) + + class UnixAuthorizer(_Base, BaseUnixAuthorizer): + """A wrapper on top of BaseUnixAuthorizer providing options + to specify what users should be allowed to login, per-user + options, etc. + + Example usages: + + >>> from pyftpdlib.authorizers import UnixAuthorizer + >>> # accept all except root + >>> auth = UnixAuthorizer(rejected_users=["root"]) + >>> + >>> # accept some users only + >>> auth = UnixAuthorizer(allowed_users=["matt", "jay"]) + >>> + >>> # accept everybody and don't care if they have not a valid shell + >>> auth = UnixAuthorizer(require_valid_shell=False) + >>> + >>> # set specific options for a user + >>> auth.override_user("matt", password="foo", perm="elr") + """ + + # --- public API + + def __init__(self, global_perm="elradfmw", + allowed_users=None, + rejected_users=None, + require_valid_shell=True, + anonymous_user=None, + msg_login="Login successful.", + msg_quit="Goodbye."): + """Parameters: + + - (string) global_perm: + a series of letters referencing the users permissions; + defaults to "elradfmw" which means full read and write + access for everybody (except anonymous). + + - (list) allowed_users: + a list of users which are accepted for authenticating + against the FTP server; defaults to [] (no restrictions). + + - (list) rejected_users: + a list of users which are not accepted for authenticating + against the FTP server; defaults to [] (no restrictions). + + - (bool) require_valid_shell: + Deny access for those users which do not have a valid shell + binary listed in /etc/shells. + If /etc/shells cannot be found this is a no-op. + Anonymous user is not subject to this option, and is free + to not have a valid shell defined. + Defaults to True (a valid shell is required for login). + + - (string) anonymous_user: + specify it if you intend to provide anonymous access. + The value expected is a string representing the system user + to use for managing anonymous sessions; defaults to None + (anonymous access disabled). + + - (string) msg_login: + the string sent when client logs in. + + - (string) msg_quit: + the string sent when client quits. + """ + BaseUnixAuthorizer.__init__(self, anonymous_user) + if allowed_users is None: + allowed_users = [] + if rejected_users is None: + rejected_users = [] + self.global_perm = global_perm + self.allowed_users = allowed_users + self.rejected_users = rejected_users + self.anonymous_user = anonymous_user + self.require_valid_shell = require_valid_shell + self.msg_login = msg_login + self.msg_quit = msg_quit + + self._dummy_authorizer = DummyAuthorizer() + self._dummy_authorizer._check_permissions('', global_perm) + _Base.__init__(self) + if require_valid_shell: + for username in self.allowed_users: + if not self._has_valid_shell(username): + raise AuthorizerError("user %s has not a valid shell" + % username) + + def override_user(self, username, password=None, homedir=None, + perm=None, msg_login=None, msg_quit=None): + """Overrides the options specified in the class constructor + for a specific user. + """ + if self.require_valid_shell and username != 'anonymous': + if not self._has_valid_shell(username): + raise AuthorizerError(self.msg_invalid_shell % username) + _Base.override_user(self, username, password, homedir, perm, + msg_login, msg_quit) + + # --- overridden / private API + + def validate_authentication(self, username, password, handler): + if username == "anonymous": + if self.anonymous_user is None: + raise AuthenticationFailed(self.msg_anon_not_allowed) + return + if self._is_rejected_user(username): + raise AuthenticationFailed(self.msg_rejected_user % username) + overridden_password = self._get_key(username, 'pwd') + if overridden_password: + if overridden_password != password: + raise AuthenticationFailed(self.msg_wrong_password) + else: + BaseUnixAuthorizer.validate_authentication(self, username, + password, handler) + if self.require_valid_shell and username != 'anonymous': + if not self._has_valid_shell(username): + raise AuthenticationFailed( + self.msg_invalid_shell % username) + + @replace_anonymous + def has_user(self, username): + if self._is_rejected_user(username): + return False + return username in self._get_system_users() + + @replace_anonymous + def get_home_dir(self, username): + overridden_home = self._get_key(username, 'home') + if overridden_home: + return overridden_home + return BaseUnixAuthorizer.get_home_dir(self, username) + + @staticmethod + def _has_valid_shell(username): + """Return True if the user has a valid shell binary listed + in /etc/shells. If /etc/shells can't be found return True. + """ + try: + file = open('/etc/shells', 'r') + except IOError as err: + if err.errno == errno.ENOENT: + return True + raise + else: + with file: + try: + shell = pwd.getpwnam(username).pw_shell + except KeyError: # invalid user + return False + for line in file: + if line.startswith('#'): + continue + line = line.strip() + if line == shell: + return True + return False + + +# =================================================================== +# --- Windows +# =================================================================== + +# Note: requires pywin32 extension +try: + import pywintypes + import win32api + import win32con + import win32net + import win32security +except ImportError: + pass +else: + if sys.version_info < (3, 0): + import _winreg as winreg + else: + import winreg + + __all__.extend(['BaseWindowsAuthorizer', 'WindowsAuthorizer']) + + class BaseWindowsAuthorizer(object): + """An authorizer compatible with Windows user account and + password database. + This class should not be used directly unless for subclassing. + Use higher-level WinowsAuthorizer class instead. + """ + + def __init__(self, anonymous_user=None, anonymous_password=None): + # actually try to impersonate the user + self.anonymous_user = anonymous_user + self.anonymous_password = anonymous_password + if self.anonymous_user is not None: + self.impersonate_user(self.anonymous_user, + self.anonymous_password) + self.terminate_impersonation(None) + + def validate_authentication(self, username, password, handler): + if username == "anonymous": + if self.anonymous_user is None: + raise AuthenticationFailed(self.msg_anon_not_allowed) + return + try: + win32security.LogonUser(username, None, password, + win32con.LOGON32_LOGON_INTERACTIVE, + win32con.LOGON32_PROVIDER_DEFAULT) + except pywintypes.error: + raise AuthenticationFailed(self.msg_wrong_password) + + @replace_anonymous + def impersonate_user(self, username, password): + """Impersonate the security context of another user.""" + handler = win32security.LogonUser( + username, None, password, + win32con.LOGON32_LOGON_INTERACTIVE, + win32con.LOGON32_PROVIDER_DEFAULT) + win32security.ImpersonateLoggedOnUser(handler) + handler.Close() + + def terminate_impersonation(self, username): + """Terminate the impersonation of another user.""" + win32security.RevertToSelf() + + @replace_anonymous + def has_user(self, username): + return username in self._get_system_users() + + @replace_anonymous + def get_home_dir(self, username): + """Return the user's profile directory, the closest thing + to a user home directory we have on Windows. + """ + try: + sid = win32security.ConvertSidToStringSid( + win32security.LookupAccountName(None, username)[0]) + except pywintypes.error as err: + raise AuthorizerError(err) + path = r"SOFTWARE\Microsoft\Windows NT" \ + r"\CurrentVersion\ProfileList" + "\\" + sid + try: + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) + except WindowsError: + raise AuthorizerError( + "No profile directory defined for user %s" % username) + value = winreg.QueryValueEx(key, "ProfileImagePath")[0] + home = win32api.ExpandEnvironmentStrings(value) + if not PY3 and not isinstance(home, unicode): + home = home.decode('utf8') + return home + + @classmethod + def _get_system_users(cls): + """Return all users defined on the Windows system.""" + # XXX - Does Windows allow usernames with chars outside of + # ASCII set? In that case we need to convert this to unicode. + return [entry['name'] for entry in + win32net.NetUserEnum(None, 0)[0]] + + def get_msg_login(self, username): + return "Login successful." + + def get_msg_quit(self, username): + return "Goodbye." + + def get_perms(self, username): + return "elradfmw" + + def has_perm(self, username, perm, path=None): + return perm in self.get_perms(username) + + class WindowsAuthorizer(_Base, BaseWindowsAuthorizer): + """A wrapper on top of BaseWindowsAuthorizer providing options + to specify what users should be allowed to login, per-user + options, etc. + + Example usages: + + >>> from pyftpdlib.authorizers import WindowsAuthorizer + >>> # accept all except Administrator + >>> auth = WindowsAuthorizer(rejected_users=["Administrator"]) + >>> + >>> # accept some users only + >>> auth = WindowsAuthorizer(allowed_users=["matt", "jay"]) + >>> + >>> # set specific options for a user + >>> auth.override_user("matt", password="foo", perm="elr") + """ + + # --- public API + + def __init__(self, + global_perm="elradfmw", + allowed_users=None, + rejected_users=None, + anonymous_user=None, + anonymous_password=None, + msg_login="Login successful.", + msg_quit="Goodbye."): + """Parameters: + + - (string) global_perm: + a series of letters referencing the users permissions; + defaults to "elradfmw" which means full read and write + access for everybody (except anonymous). + + - (list) allowed_users: + a list of users which are accepted for authenticating + against the FTP server; defaults to [] (no restrictions). + + - (list) rejected_users: + a list of users which are not accepted for authenticating + against the FTP server; defaults to [] (no restrictions). + + - (string) anonymous_user: + specify it if you intend to provide anonymous access. + The value expected is a string representing the system user + to use for managing anonymous sessions. + As for IIS, it is recommended to use Guest account. + The common practice is to first enable the Guest user, which + is disabled by default and then assign an empty password. + Defaults to None (anonymous access disabled). + + - (string) anonymous_password: + the password of the user who has been chosen to manage the + anonymous sessions. Defaults to None (empty password). + + - (string) msg_login: + the string sent when client logs in. + + - (string) msg_quit: + the string sent when client quits. + """ + if allowed_users is None: + allowed_users = [] + if rejected_users is None: + rejected_users = [] + self.global_perm = global_perm + self.allowed_users = allowed_users + self.rejected_users = rejected_users + self.anonymous_user = anonymous_user + self.anonymous_password = anonymous_password + self.msg_login = msg_login + self.msg_quit = msg_quit + self._dummy_authorizer = DummyAuthorizer() + self._dummy_authorizer._check_permissions('', global_perm) + _Base.__init__(self) + # actually try to impersonate the user + if self.anonymous_user is not None: + self.impersonate_user(self.anonymous_user, + self.anonymous_password) + self.terminate_impersonation(None) + + def override_user(self, username, password=None, homedir=None, + perm=None, msg_login=None, msg_quit=None): + """Overrides the options specified in the class constructor + for a specific user. + """ + _Base.override_user(self, username, password, homedir, perm, + msg_login, msg_quit) + + # --- overridden / private API + + def validate_authentication(self, username, password, handler): + """Authenticates against Windows user database; return + True on success. + """ + if username == "anonymous": + if self.anonymous_user is None: + raise AuthenticationFailed(self.msg_anon_not_allowed) + return + if self.allowed_users and username not in self.allowed_users: + raise AuthenticationFailed(self.msg_rejected_user % username) + if self.rejected_users and username in self.rejected_users: + raise AuthenticationFailed(self.msg_rejected_user % username) + + overridden_password = self._get_key(username, 'pwd') + if overridden_password: + if overridden_password != password: + raise AuthenticationFailed(self.msg_wrong_password) + else: + BaseWindowsAuthorizer.validate_authentication( + self, username, password, handler) + + def impersonate_user(self, username, password): + """Impersonate the security context of another user.""" + if username == "anonymous": + username = self.anonymous_user or "" + password = self.anonymous_password or "" + BaseWindowsAuthorizer.impersonate_user(self, username, password) + + @replace_anonymous + def has_user(self, username): + if self._is_rejected_user(username): + return False + return username in self._get_system_users() + + @replace_anonymous + def get_home_dir(self, username): + overridden_home = self._get_key(username, 'home') + if overridden_home: + home = overridden_home + else: + home = BaseWindowsAuthorizer.get_home_dir(self, username) + if not PY3 and not isinstance(home, unicode): + home = home.decode('utf8') + return home diff --git a/ftp_server/pyftpdlib/filesystems.py b/ftp_server/pyftpdlib/filesystems.py new file mode 100644 index 00000000..03f22506 --- /dev/null +++ b/ftp_server/pyftpdlib/filesystems.py @@ -0,0 +1,635 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import os +import stat +import tempfile +import time +try: + from stat import filemode as _filemode # PY 3.3 +except ImportError: + from tarfile import filemode as _filemode +try: + import pwd + import grp +except ImportError: + pwd = grp = None +try: + from os import scandir # py 3.5 +except ImportError: + try: + from scandir import scandir # requires "pip install scandir" + except ImportError: + scandir = None + +from ._compat import PY3 +from ._compat import u +from ._compat import unicode + + +__all__ = ['FilesystemError', 'AbstractedFS'] + + +_months_map = {1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', + 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'} + + +# =================================================================== +# --- custom exceptions +# =================================================================== + +class FilesystemError(Exception): + """Custom class for filesystem-related exceptions. + You can raise this from an AbstractedFS subclass in order to + send a customized error string to the client. + """ + + +# =================================================================== +# --- base class +# =================================================================== + +class AbstractedFS(object): + """A class used to interact with the file system, providing a + cross-platform interface compatible with both Windows and + UNIX style filesystems where all paths use "/" separator. + + AbstractedFS distinguishes between "real" filesystem paths and + "virtual" ftp paths emulating a UNIX chroot jail where the user + can not escape its home directory (example: real "/home/user" + path will be seen as "/" by the client) + + It also provides some utility methods and wraps around all os.* + calls involving operations against the filesystem like creating + files or removing directories. + + FilesystemError exception can be raised from within any of + the methods below in order to send a customized error string + to the client. + """ + + def __init__(self, root, cmd_channel): + """ + - (str) root: the user "real" home directory (e.g. '/home/user') + - (instance) cmd_channel: the FTPHandler class instance + """ + assert isinstance(root, unicode) + # Set initial current working directory. + # By default initial cwd is set to "/" to emulate a chroot jail. + # If a different behavior is desired (e.g. initial cwd = root, + # to reflect the real filesystem) users overriding this class + # are responsible to set _cwd attribute as necessary. + self._cwd = u('/') + self._root = root + self.cmd_channel = cmd_channel + + @property + def root(self): + """The user home directory.""" + return self._root + + @property + def cwd(self): + """The user current working directory.""" + return self._cwd + + @root.setter + def root(self, path): + assert isinstance(path, unicode), path + self._root = path + + @cwd.setter + def cwd(self, path): + assert isinstance(path, unicode), path + self._cwd = path + + # --- Pathname / conversion utilities + + def ftpnorm(self, ftppath): + """Normalize a "virtual" ftp pathname (typically the raw string + coming from client) depending on the current working directory. + + Example (having "/foo" as current working directory): + >>> ftpnorm('bar') + '/foo/bar' + + Note: directory separators are system independent ("/"). + Pathname returned is always absolutized. + """ + assert isinstance(ftppath, unicode), ftppath + if os.path.isabs(ftppath): + p = os.path.normpath(ftppath) + else: + p = os.path.normpath(os.path.join(self.cwd, ftppath)) + # normalize string in a standard web-path notation having '/' + # as separator. + if os.sep == "\\": + p = p.replace("\\", "/") + # os.path.normpath supports UNC paths (e.g. "//a/b/c") but we + # don't need them. In case we get an UNC path we collapse + # redundant separators appearing at the beginning of the string + while p[:2] == '//': + p = p[1:] + # Anti path traversal: don't trust user input, in the event + # that self.cwd is not absolute, return "/" as a safety measure. + # This is for extra protection, maybe not really necessary. + if not os.path.isabs(p): + p = u("/") + return p + + def ftp2fs(self, ftppath): + """Translate a "virtual" ftp pathname (typically the raw string + coming from client) into equivalent absolute "real" filesystem + pathname. + + Example (having "/home/user" as root directory): + >>> ftp2fs("foo") + '/home/user/foo' + + Note: directory separators are system dependent. + """ + assert isinstance(ftppath, unicode), ftppath + # as far as I know, it should always be path traversal safe... + if os.path.normpath(self.root) == os.sep: + return os.path.normpath(self.ftpnorm(ftppath)) + else: + p = self.ftpnorm(ftppath)[1:] + return os.path.normpath(os.path.join(self.root, p)) + + def fs2ftp(self, fspath): + """Translate a "real" filesystem pathname into equivalent + absolute "virtual" ftp pathname depending on the user's + root directory. + + Example (having "/home/user" as root directory): + >>> fs2ftp("/home/user/foo") + '/foo' + + As for ftpnorm, directory separators are system independent + ("/") and pathname returned is always absolutized. + + On invalid pathnames escaping from user's root directory + (e.g. "/home" when root is "/home/user") always return "/". + """ + assert isinstance(fspath, unicode), fspath + if os.path.isabs(fspath): + p = os.path.normpath(fspath) + else: + p = os.path.normpath(os.path.join(self.root, fspath)) + if not self.validpath(p): + return u('/') + p = p.replace(os.sep, "/") + p = p[len(self.root):] + if not p.startswith('/'): + p = '/' + p + return p + + def validpath(self, path): + """Check whether the path belongs to user's home directory. + Expected argument is a "real" filesystem pathname. + + If path is a symbolic link it is resolved to check its real + destination. + + Pathnames escaping from user's root directory are considered + not valid. + """ + assert isinstance(path, unicode), path + root = self.realpath(self.root) + path = self.realpath(path) + if not root.endswith(os.sep): + root = root + os.sep + if not path.endswith(os.sep): + path = path + os.sep + if path[0:len(root)] == root: + return True + return False + + # --- Wrapper methods around open() and tempfile.mkstemp + + def open(self, filename, mode): + """Open a file returning its handler.""" + assert isinstance(filename, unicode), filename + return open(filename, mode) + + def mkstemp(self, suffix='', prefix='', dir=None, mode='wb'): + """A wrap around tempfile.mkstemp creating a file with a unique + name. Unlike mkstemp it returns an object with a file-like + interface. + """ + class FileWrapper: + + def __init__(self, fd, name): + self.file = fd + self.name = name + + def __getattr__(self, attr): + return getattr(self.file, attr) + + text = 'b' not in mode + # max number of tries to find out a unique file name + tempfile.TMP_MAX = 50 + fd, name = tempfile.mkstemp(suffix, prefix, dir, text=text) + file = os.fdopen(fd, mode) + return FileWrapper(file, name) + + # --- Wrapper methods around os.* calls + + def chdir(self, path): + """Change the current directory.""" + # note: process cwd will be reset by the caller + assert isinstance(path, unicode), path + os.chdir(path) + self._cwd = self.fs2ftp(path) + + def mkdir(self, path): + """Create the specified directory.""" + assert isinstance(path, unicode), path + os.mkdir(path) + + def listdir(self, path): + """List the content of a directory.""" + assert isinstance(path, unicode), path + return os.listdir(path) + + def listdirinfo(self, path): + """List the content of a directory.""" + assert isinstance(path, unicode), path + return os.listdir(path) + + def rmdir(self, path): + """Remove the specified directory.""" + assert isinstance(path, unicode), path + os.rmdir(path) + + def remove(self, path): + """Remove the specified file.""" + assert isinstance(path, unicode), path + os.remove(path) + + def rename(self, src, dst): + """Rename the specified src file to the dst filename.""" + assert isinstance(src, unicode), src + assert isinstance(dst, unicode), dst + os.rename(src, dst) + + def chmod(self, path, mode): + """Change file/directory mode.""" + assert isinstance(path, unicode), path + if not hasattr(os, 'chmod'): + raise NotImplementedError + os.chmod(path, mode) + + def stat(self, path): + """Perform a stat() system call on the given path.""" + # on python 2 we might also get bytes from os.lisdir() + # assert isinstance(path, unicode), path + return os.stat(path) + + if hasattr(os, 'lstat'): + def lstat(self, path): + """Like stat but does not follow symbolic links.""" + # on python 2 we might also get bytes from os.lisdir() + # assert isinstance(path, unicode), path + return os.lstat(path) + else: + lstat = stat + + if hasattr(os, 'readlink'): + def readlink(self, path): + """Return a string representing the path to which a + symbolic link points. + """ + assert isinstance(path, unicode), path + return os.readlink(path) + + # --- Wrapper methods around os.path.* calls + + def isfile(self, path): + """Return True if path is a file.""" + assert isinstance(path, unicode), path + return os.path.isfile(path) + + def islink(self, path): + """Return True if path is a symbolic link.""" + assert isinstance(path, unicode), path + return os.path.islink(path) + + def isdir(self, path): + """Return True if path is a directory.""" + assert isinstance(path, unicode), path + return os.path.isdir(path) + + def getsize(self, path): + """Return the size of the specified file in bytes.""" + assert isinstance(path, unicode), path + return os.path.getsize(path) + + def getmtime(self, path): + """Return the last modified time as a number of seconds since + the epoch.""" + assert isinstance(path, unicode), path + return os.path.getmtime(path) + + def realpath(self, path): + """Return the canonical version of path eliminating any + symbolic links encountered in the path (if they are + supported by the operating system). + """ + assert isinstance(path, unicode), path + return os.path.realpath(path) + + def lexists(self, path): + """Return True if path refers to an existing path, including + a broken or circular symbolic link. + """ + assert isinstance(path, unicode), path + return os.path.lexists(path) + + if pwd is not None: + def get_user_by_uid(self, uid): + """Return the username associated with user id. + If this can't be determined return raw uid instead. + On Windows just return "owner". + """ + try: + return pwd.getpwuid(uid).pw_name + except KeyError: + return uid + else: + def get_user_by_uid(self, uid): + return "owner" + + if grp is not None: + def get_group_by_gid(self, gid): + """Return the groupname associated with group id. + If this can't be determined return raw gid instead. + On Windows just return "group". + """ + try: + return grp.getgrgid(gid).gr_name + except KeyError: + return gid + else: + def get_group_by_gid(self, gid): + return "group" + + # --- Listing utilities + + def format_list(self, basedir, listing, ignore_err=True): + """Return an iterator object that yields the entries of given + directory emulating the "/bin/ls -lA" UNIX command output. + + - (str) basedir: the absolute dirname. + - (list) listing: the names of the entries in basedir + - (bool) ignore_err: when False raise exception if os.lstat() + call fails. + + On platforms which do not support the pwd and grp modules (such + as Windows), ownership is printed as "owner" and "group" as a + default, and number of hard links is always "1". On UNIX + systems, the actual owner, group, and number of links are + printed. + + This is how output appears to client: + + -rw-rw-rw- 1 owner group 7045120 Sep 02 3:47 music.mp3 + drwxrwxrwx 1 owner group 0 Aug 31 18:50 e-books + -rw-rw-rw- 1 owner group 380 Sep 02 3:40 module.py + """ + assert isinstance(basedir, unicode), basedir + if self.cmd_channel.use_gmt_times: + timefunc = time.gmtime + else: + timefunc = time.localtime + SIX_MONTHS = 180 * 24 * 60 * 60 + readlink = getattr(self, 'readlink', None) + now = time.time() + for basename in listing: + if not PY3: + try: + file = os.path.join(basedir, basename) + except UnicodeDecodeError: + # (Python 2 only) might happen on filesystem not + # supporting UTF8 meaning os.listdir() returned a list + # of mixed bytes and unicode strings: + # http://goo.gl/6DLHD + # http://bugs.python.org/issue683592 + file = os.path.join(bytes(basedir), bytes(basename)) + if not isinstance(basename, unicode): + basename = unicode(basename, 'utf8', 'ignore') + else: + file = os.path.join(basedir, basename) + try: + st = self.lstat(file) + except (OSError, FilesystemError): + if ignore_err: + continue + raise + + perms = _filemode(st.st_mode) # permissions + nlinks = st.st_nlink # number of links to inode + if not nlinks: # non-posix system, let's use a bogus value + nlinks = 1 + size = st.st_size # file size + uname = self.get_user_by_uid(st.st_uid) + gname = self.get_group_by_gid(st.st_gid) + mtime = timefunc(st.st_mtime) + # if modification time > 6 months shows "month year" + # else "month hh:mm"; this matches proftpd format, see: + # https://github.com/giampaolo/pyftpdlib/issues/187 + if (now - st.st_mtime) > SIX_MONTHS: + fmtstr = "%d %Y" + else: + fmtstr = "%d %H:%M" + try: + mtimestr = "%s %s" % (_months_map[mtime.tm_mon], + time.strftime(fmtstr, mtime)) + except ValueError: + # It could be raised if last mtime happens to be too + # old (prior to year 1900) in which case we return + # the current time as last mtime. + mtime = timefunc() + mtimestr = "%s %s" % (_months_map[mtime.tm_mon], + time.strftime("%d %H:%M", mtime)) + + # same as stat.S_ISLNK(st.st_mode) but slighlty faster + islink = (st.st_mode & 61440) == stat.S_IFLNK + if islink and readlink is not None: + # if the file is a symlink, resolve it, e.g. + # "symlink -> realfile" + try: + basename = basename + " -> " + readlink(file) + except (OSError, FilesystemError): + if not ignore_err: + raise + + # formatting is matched with proftpd ls output + line = "%s %3s %-8s %-8s %8s %s %s\r\n" % ( + perms, nlinks, uname, gname, size, mtimestr, basename) + yield line.encode('utf8', self.cmd_channel.unicode_errors) + + def format_mlsx(self, basedir, listing, perms, facts, ignore_err=True): + """Return an iterator object that yields the entries of a given + directory or of a single file in a form suitable with MLSD and + MLST commands. + + Every entry includes a list of "facts" referring the listed + element. See RFC-3659, chapter 7, to see what every single + fact stands for. + + - (str) basedir: the absolute dirname. + - (list) listing: the names of the entries in basedir + - (str) perms: the string referencing the user permissions. + - (str) facts: the list of "facts" to be returned. + - (bool) ignore_err: when False raise exception if os.stat() + call fails. + + Note that "facts" returned may change depending on the platform + and on what user specified by using the OPTS command. + + This is how output could appear to the client issuing + a MLSD request: + + type=file;size=156;perm=r;modify=20071029155301;unique=8012; music.mp3 + type=dir;size=0;perm=el;modify=20071127230206;unique=801e33; ebooks + type=file;size=211;perm=r;modify=20071103093626;unique=192; module.py + """ + assert isinstance(basedir, unicode), basedir + if self.cmd_channel.use_gmt_times: + timefunc = time.gmtime + else: + timefunc = time.localtime + permdir = ''.join([x for x in perms if x not in 'arw']) + permfile = ''.join([x for x in perms if x not in 'celmp']) + if ('w' in perms) or ('a' in perms) or ('f' in perms): + permdir += 'c' + if 'd' in perms: + permdir += 'p' + show_type = 'type' in facts + show_perm = 'perm' in facts + show_size = 'size' in facts + show_modify = 'modify' in facts + show_create = 'create' in facts + show_mode = 'unix.mode' in facts + show_uid = 'unix.uid' in facts + show_gid = 'unix.gid' in facts + show_unique = 'unique' in facts + for basename in listing: + retfacts = dict() + if not PY3: + try: + file = os.path.join(basedir, basename) + except UnicodeDecodeError: + # (Python 2 only) might happen on filesystem not + # supporting UTF8 meaning os.listdir() returned a list + # of mixed bytes and unicode strings: + # http://goo.gl/6DLHD + # http://bugs.python.org/issue683592 + file = os.path.join(bytes(basedir), bytes(basename)) + if not isinstance(basename, unicode): + basename = unicode(basename, 'utf8', 'ignore') + else: + file = os.path.join(basedir, basename) + # in order to properly implement 'unique' fact (RFC-3659, + # chapter 7.5.2) we are supposed to follow symlinks, hence + # use os.stat() instead of os.lstat() + try: + st = self.stat(file) + except (OSError, FilesystemError): + if ignore_err: + continue + raise + # type + perm + # same as stat.S_ISDIR(st.st_mode) but slightly faster + isdir = (st.st_mode & 61440) == stat.S_IFDIR + if isdir: + if show_type: + if basename == '.': + retfacts['type'] = 'cdir' + elif basename == '..': + retfacts['type'] = 'pdir' + else: + retfacts['type'] = 'dir' + if show_perm: + retfacts['perm'] = permdir + else: + if show_type: + retfacts['type'] = 'file' + if show_perm: + retfacts['perm'] = permfile + if show_size: + retfacts['size'] = st.st_size # file size + # last modification time + if show_modify: + try: + retfacts['modify'] = time.strftime("%Y%m%d%H%M%S", + timefunc(st.st_mtime)) + # it could be raised if last mtime happens to be too old + # (prior to year 1900) + except ValueError: + pass + if show_create: + # on Windows we can provide also the creation time + try: + retfacts['create'] = time.strftime("%Y%m%d%H%M%S", + timefunc(st.st_ctime)) + except ValueError: + pass + # UNIX only + if show_mode: + retfacts['unix.mode'] = oct(st.st_mode & 511) + if show_uid: + retfacts['unix.uid'] = st.st_uid + if show_gid: + retfacts['unix.gid'] = st.st_gid + + # We provide unique fact (see RFC-3659, chapter 7.5.2) on + # posix platforms only; we get it by mixing st_dev and + # st_ino values which should be enough for granting an + # uniqueness for the file listed. + # The same approach is used by pure-ftpd. + # Implementors who want to provide unique fact on other + # platforms should use some platform-specific method (e.g. + # on Windows NTFS filesystems MTF records could be used). + if show_unique: + retfacts['unique'] = "%xg%x" % (st.st_dev, st.st_ino) + + # facts can be in any order but we sort them by name + factstring = "".join(["%s=%s;" % (x, retfacts[x]) + for x in sorted(retfacts.keys())]) + line = "%s %s\r\n" % (factstring, basename) + yield line.encode('utf8', self.cmd_channel.unicode_errors) + + +# =================================================================== +# --- platform specific implementation +# =================================================================== + +if os.name == 'posix': + __all__.append('UnixFilesystem') + + class UnixFilesystem(AbstractedFS): + """Represents the real UNIX filesystem. + + Differently from AbstractedFS the client will login into + /home/ and will be able to escape its home directory + and navigate the real filesystem. + """ + + def __init__(self, root, cmd_channel): + AbstractedFS.__init__(self, root, cmd_channel) + # initial cwd was set to "/" to emulate a chroot jail + self.cwd = root + + def ftp2fs(self, ftppath): + return self.ftpnorm(ftppath) + + def fs2ftp(self, fspath): + return fspath + + def validpath(self, path): + # validpath was used to check symlinks escaping user home + # directory; this is no longer necessary. + return True diff --git a/ftp_server/pyftpdlib/handlers.py b/ftp_server/pyftpdlib/handlers.py new file mode 100644 index 00000000..8c715d42 --- /dev/null +++ b/ftp_server/pyftpdlib/handlers.py @@ -0,0 +1,3552 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import asynchat +import contextlib +import errno +import glob +import logging +import os +import random +import socket +import sys +import time +import traceback +import warnings +try: + import pwd + import grp +except ImportError: + pwd = grp = None + +try: + from OpenSSL import SSL # requires "pip install pyopenssl" +except ImportError: + SSL = None + +try: + from collections import OrderedDict # python >= 2.7 +except ImportError: + OrderedDict = dict + +from . import __ver__ +from ._compat import b +from ._compat import getcwdu +from ._compat import PY3 +from ._compat import u +from ._compat import unicode +from ._compat import xrange +from .authorizers import AuthenticationFailed +from .authorizers import AuthorizerError +from .authorizers import DummyAuthorizer +from .filesystems import AbstractedFS +from .filesystems import FilesystemError +from .ioloop import _ERRNOS_DISCONNECTED +from .ioloop import _ERRNOS_RETRY +from .ioloop import Acceptor +from .ioloop import AsyncChat +from .ioloop import Connector +from .ioloop import RetryError +from .ioloop import timer +from .log import debug +from .log import logger + + +def _import_sendfile(): + # By default attempt to use os.sendfile introduced in Python 3.3: + # http://bugs.python.org/issue10882 + # ...otherwise fallback on using third-party pysendfile module: + # https://github.com/giampaolo/pysendfile/ + if os.name == 'posix': + try: + return os.sendfile # py >= 3.3 + except AttributeError: + try: + import sendfile as sf + # dirty hack to detect whether old 1.2.4 version is installed + if hasattr(sf, 'has_sf_hdtr'): + raise ImportError + return sf.sendfile + except ImportError: + pass + + +sendfile = _import_sendfile() + +proto_cmds = { + 'ABOR': dict( + perm=None, auth=True, arg=False, + help='Syntax: ABOR (abort transfer).'), + 'ALLO': dict( + perm=None, auth=True, arg=True, + help='Syntax: ALLO bytes (noop; allocate storage).'), + 'APPE': dict( + perm='a', auth=True, arg=True, + help='Syntax: APPE file-name (append data to file).'), + 'CDUP': dict( + perm='e', auth=True, arg=False, + help='Syntax: CDUP (go to parent directory).'), + 'CWD': dict( + perm='e', auth=True, arg=None, + help='Syntax: CWD [ dir-name] (change working directory).'), + 'DELE': dict( + perm='d', auth=True, arg=True, + help='Syntax: DELE file-name (delete file).'), + 'EPRT': dict( + perm=None, auth=True, arg=True, + help='Syntax: EPRT |proto|ip|port| (extended active mode).'), + 'EPSV': dict( + perm=None, auth=True, arg=None, + help='Syntax: EPSV [ proto/"ALL"] (extended passive mode).'), + 'FEAT': dict( + perm=None, auth=False, arg=False, + help='Syntax: FEAT (list all new features supported).'), + 'HELP': dict( + perm=None, auth=False, arg=None, + help='Syntax: HELP [ cmd] (show help).'), + 'LIST': dict( + perm='l', auth=True, arg=None, + help='Syntax: LIST [ path] (list files).'), + 'MDTM': dict( + perm='l', auth=True, arg=True, + help='Syntax: MDTM [ path] (file last modification time).'), + 'MLSD': dict( + perm='l', auth=True, arg=None, + help='Syntax: MLSD [ path] (list directory).'), + 'MLST': dict( + perm='l', auth=True, arg=None, + help='Syntax: MLST [ path] (show information about path).'), + 'MODE': dict( + perm=None, auth=True, arg=True, + help='Syntax: MODE mode (noop; set data transfer mode).'), + 'MKD': dict( + perm='m', auth=True, arg=True, + help='Syntax: MKD path (create directory).'), + 'NLST': dict( + perm='l', auth=True, arg=None, + help='Syntax: NLST [ path] (list path in a compact form).'), + 'NOOP': dict( + perm=None, auth=False, arg=False, + help='Syntax: NOOP (just do nothing).'), + 'OPTS': dict( + perm=None, auth=True, arg=True, + help='Syntax: OPTS cmd [ option] (set option for command).'), + 'PASS': dict( + perm=None, auth=False, arg=None, + help='Syntax: PASS [ password] (set user password).'), + 'PASV': dict( + perm=None, auth=True, arg=False, + help='Syntax: PASV (open passive data connection).'), + 'PORT': dict( + perm=None, auth=True, arg=True, + help='Syntax: PORT h,h,h,h,p,p (open active data connection).'), + 'PWD': dict( + perm=None, auth=True, arg=False, + help='Syntax: PWD (get current working directory).'), + 'QUIT': dict( + perm=None, auth=False, arg=False, + help='Syntax: QUIT (quit current session).'), + 'REIN': dict( + perm=None, auth=True, arg=False, + help='Syntax: REIN (flush account).'), + 'REST': dict( + perm=None, auth=True, arg=True, + help='Syntax: REST offset (set file offset).'), + 'RETR': dict( + perm='r', auth=True, arg=True, + help='Syntax: RETR file-name (retrieve a file).'), + 'RMD': dict( + perm='d', auth=True, arg=True, + help='Syntax: RMD dir-name (remove directory).'), + 'RNFR': dict( + perm='f', auth=True, arg=True, + help='Syntax: RNFR file-name (rename (source name)).'), + 'RNTO': dict( + perm='f', auth=True, arg=True, + help='Syntax: RNTO file-name (rename (destination name)).'), + 'SITE': dict( + perm=None, auth=False, arg=True, + help='Syntax: SITE site-command (execute SITE command).'), + 'SITE HELP': dict( + perm=None, auth=False, arg=None, + help='Syntax: SITE HELP [ cmd] (show SITE command help).'), + 'SITE CHMOD': dict( + perm='M', auth=True, arg=True, + help='Syntax: SITE CHMOD mode path (change file mode).'), + 'SIZE': dict( + perm='l', auth=True, arg=True, + help='Syntax: SIZE file-name (get file size).'), + 'STAT': dict( + perm='l', auth=False, arg=None, + help='Syntax: STAT [ path name] (server stats [list files]).'), + 'STOR': dict( + perm='w', auth=True, arg=True, + help='Syntax: STOR file-name (store a file).'), + 'STOU': dict( + perm='w', auth=True, arg=None, + help='Syntax: STOU [ name] (store a file with a unique name).'), + 'STRU': dict( + perm=None, auth=True, arg=True, + help='Syntax: STRU type (noop; set file structure).'), + 'SYST': dict( + perm=None, auth=False, arg=False, + help='Syntax: SYST (get operating system type).'), + 'TYPE': dict( + perm=None, auth=True, arg=True, + help='Syntax: TYPE [A | I] (set transfer type).'), + 'USER': dict( + perm=None, auth=False, arg=True, + help='Syntax: USER user-name (set username).'), + 'XCUP': dict( + perm='e', auth=True, arg=False, + help='Syntax: XCUP (obsolete; go to parent directory).'), + 'XCWD': dict( + perm='e', auth=True, arg=None, + help='Syntax: XCWD [ dir-name] (obsolete; change directory).'), + 'XMKD': dict( + perm='m', auth=True, arg=True, + help='Syntax: XMKD dir-name (obsolete; create directory).'), + 'XPWD': dict( + perm=None, auth=True, arg=False, + help='Syntax: XPWD (obsolete; get current dir).'), + 'XRMD': dict( + perm='d', auth=True, arg=True, + help='Syntax: XRMD dir-name (obsolete; remove directory).'), +} + +if not hasattr(os, 'chmod'): + del proto_cmds['SITE CHMOD'] + + +def _strerror(err): + if isinstance(err, EnvironmentError): + try: + return os.strerror(err.errno) + except AttributeError: + # not available on PythonCE + if not hasattr(os, 'strerror'): + return err.strerror + raise + else: + return str(err) + + +def _is_ssl_sock(sock): + return SSL is not None and isinstance(sock, SSL.Connection) + + +def _support_hybrid_ipv6(): + """Return True if it is possible to use hybrid IPv6/IPv4 sockets + on this platform. + """ + # Note: IPPROTO_IPV6 constant is broken on Windows, see: + # http://bugs.python.org/issue6926 + try: + if not socket.has_ipv6: + return False + with contextlib.closing(socket.socket(socket.AF_INET6)) as sock: + return not sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY) + except (socket.error, AttributeError): + return False + + +SUPPORTS_HYBRID_IPV6 = _support_hybrid_ipv6() + + +class _FileReadWriteError(OSError): + """Exception raised when reading or writing a file during a transfer.""" + + +class _GiveUpOnSendfile(Exception): + """Exception raised in case use of sendfile() fails on first try, + in which case send() will be used. + """ + + +# --- DTP classes + +class PassiveDTP(Acceptor): + """Creates a socket listening on a local port, dispatching the + resultant connection to DTPHandler. Used for handling PASV command. + + - (int) timeout: the timeout for a remote client to establish + connection with the listening socket. Defaults to 30 seconds. + + - (int) backlog: the maximum number of queued connections passed + to listen(). If a connection request arrives when the queue is + full the client may raise ECONNRESET. Defaults to 5. + """ + timeout = 30 + backlog = None + + def __init__(self, cmd_channel, extmode=False): + """Initialize the passive data server. + + - (instance) cmd_channel: the command channel class instance. + - (bool) extmode: wheter use extended passive mode response type. + """ + self.cmd_channel = cmd_channel + self.log = cmd_channel.log + self.log_exception = cmd_channel.log_exception + Acceptor.__init__(self, ioloop=cmd_channel.ioloop) + + local_ip = self.cmd_channel.socket.getsockname()[0] + if local_ip in self.cmd_channel.masquerade_address_map: + masqueraded_ip = self.cmd_channel.masquerade_address_map[local_ip] + elif self.cmd_channel.masquerade_address: + masqueraded_ip = self.cmd_channel.masquerade_address + else: + masqueraded_ip = None + + if self.cmd_channel.server.socket.family != socket.AF_INET: + # dual stack IPv4/IPv6 support + af = self.bind_af_unspecified((local_ip, 0)) + self.socket.close() + else: + af = self.cmd_channel.socket.family + + self.create_socket(af, socket.SOCK_STREAM) + + if self.cmd_channel.passive_ports is None: + # By using 0 as port number value we let kernel choose a + # free unprivileged random port. + self.bind((local_ip, 0)) + else: + ports = list(self.cmd_channel.passive_ports) + while ports: + port = ports.pop(random.randint(0, len(ports) - 1)) + self.set_reuse_addr() + try: + self.bind((local_ip, port)) + except socket.error as err: + if err.errno == errno.EADDRINUSE: # port already in use + if ports: + continue + # If cannot use one of the ports in the configured + # range we'll use a kernel-assigned port, and log + # a message reporting the issue. + # By using 0 as port number value we let kernel + # choose a free unprivileged random port. + else: + self.bind((local_ip, 0)) + self.cmd_channel.log( + "Can't find a valid passive port in the " + "configured range. A random kernel-assigned " + "port will be used.", + logfun=logger.warning + ) + else: + raise + else: + break + self.listen(self.backlog or self.cmd_channel.server.backlog) + + port = self.socket.getsockname()[1] + if not extmode: + ip = masqueraded_ip or local_ip + if ip.startswith('::ffff:'): + # In this scenario, the server has an IPv6 socket, but + # the remote client is using IPv4 and its address is + # represented as an IPv4-mapped IPv6 address which + # looks like this ::ffff:151.12.5.65, see: + # http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_addresses + # http://tools.ietf.org/html/rfc3493.html#section-3.7 + # We truncate the first bytes to make it look like a + # common IPv4 address. + ip = ip[7:] + # The format of 227 response in not standardized. + # This is the most expected: + resp = '227 Entering passive mode (%s,%d,%d).' % ( + ip.replace('.', ','), port // 256, port % 256) + self.cmd_channel.respond(resp) + else: + self.cmd_channel.respond('229 Entering extended passive mode ' + '(|||%d|).' % port) + if self.timeout: + self.call_later(self.timeout, self.handle_timeout) + + # --- connection / overridden + + def handle_accepted(self, sock, addr): + """Called when remote client initiates a connection.""" + if not self.cmd_channel.connected: + return self.close() + + # Check the origin of data connection. If not expressively + # configured we drop the incoming data connection if remote + # IP address does not match the client's IP address. + if self.cmd_channel.remote_ip != addr[0]: + if not self.cmd_channel.permit_foreign_addresses: + try: + sock.close() + except socket.error: + pass + msg = '425 Rejected data connection from foreign address ' \ + '%s:%s.' % (addr[0], addr[1]) + self.cmd_channel.respond_w_warning(msg) + # do not close listening socket: it couldn't be client's blame + return + else: + # site-to-site FTP allowed + msg = 'Established data connection with foreign address ' \ + '%s:%s.' % (addr[0], addr[1]) + self.cmd_channel.log(msg, logfun=logger.warning) + # Immediately close the current channel (we accept only one + # connection at time) and avoid running out of max connections + # limit. + self.close() + # delegate such connection to DTP handler + if self.cmd_channel.connected: + handler = self.cmd_channel.dtp_handler(sock, self.cmd_channel) + if handler.connected: + self.cmd_channel.data_channel = handler + self.cmd_channel._on_dtp_connection() + + def handle_timeout(self): + if self.cmd_channel.connected: + self.cmd_channel.respond("421 Passive data channel timed out.", + logfun=logging.info) + self.close() + + def handle_error(self): + """Called to handle any uncaught exceptions.""" + try: + raise + except Exception: + logger.error(traceback.format_exc()) + try: + self.close() + except Exception: + logger.critical(traceback.format_exc()) + + def close(self): + debug("call: close()", inst=self) + Acceptor.close(self) + + +class ActiveDTP(Connector): + """Connects to remote client and dispatches the resulting connection + to DTPHandler. Used for handling PORT command. + + - (int) timeout: the timeout for us to establish connection with + the client's listening data socket. + """ + timeout = 30 + + def __init__(self, ip, port, cmd_channel): + """Initialize the active data channel attemping to connect + to remote data socket. + + - (str) ip: the remote IP address. + - (int) port: the remote port. + - (instance) cmd_channel: the command channel class instance. + """ + Connector.__init__(self, ioloop=cmd_channel.ioloop) + self.cmd_channel = cmd_channel + self.log = cmd_channel.log + self.log_exception = cmd_channel.log_exception + self._idler = None + if self.timeout: + self._idler = self.ioloop.call_later(self.timeout, + self.handle_timeout, + _errback=self.handle_error) + + if ip.count('.') == 4: + self._cmd = "PORT" + self._normalized_addr = "%s:%s" % (ip, port) + else: + self._cmd = "EPRT" + self._normalized_addr = "[%s]:%s" % (ip, port) + + source_ip = self.cmd_channel.socket.getsockname()[0] + # dual stack IPv4/IPv6 support + try: + self.connect_af_unspecified((ip, port), (source_ip, 0)) + except (socket.gaierror, socket.error): + self.handle_close() + + def readable(self): + return False + + def handle_write(self): + # overridden to prevent unhandled read/write event messages to + # be printed by asyncore on Python < 2.6 + pass + + def handle_connect(self): + """Called when connection is established.""" + self.del_channel() + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + if not self.cmd_channel.connected: + return self.close() + # fix for asyncore on python < 2.6, meaning we aren't + # actually connected. + # test_active_conn_error tests this condition + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + raise socket.error(err) + # + msg = 'Active data connection established.' + self.cmd_channel.respond('200 ' + msg) + self.cmd_channel.log_cmd(self._cmd, self._normalized_addr, 200, msg) + # + if not self.cmd_channel.connected: + return self.close() + # delegate such connection to DTP handler + handler = self.cmd_channel.dtp_handler(self.socket, self.cmd_channel) + self.cmd_channel.data_channel = handler + self.cmd_channel._on_dtp_connection() + + def handle_timeout(self): + if self.cmd_channel.connected: + msg = "Active data channel timed out." + self.cmd_channel.respond("421 " + msg, logfun=logger.info) + self.cmd_channel.log_cmd( + self._cmd, self._normalized_addr, 421, msg) + self.close() + + def handle_close(self): + # With the new IO loop, handle_close() gets called in case + # the fd appears in the list of exceptional fds. + # This means connect() failed. + if not self._closed: + self.close() + if self.cmd_channel.connected: + msg = "Can't connect to specified address." + self.cmd_channel.respond("425 " + msg) + self.cmd_channel.log_cmd( + self._cmd, self._normalized_addr, 425, msg) + + def handle_error(self): + """Called to handle any uncaught exceptions.""" + try: + raise + except (socket.gaierror, socket.error): + pass + except Exception: + self.log_exception(self) + try: + self.handle_close() + except Exception: + logger.critical(traceback.format_exc()) + + def close(self): + debug("call: close()", inst=self) + if not self._closed: + Connector.close(self) + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + + +class DTPHandler(AsyncChat): + """Class handling server-data-transfer-process (server-DTP, see + RFC-959) managing data-transfer operations involving sending + and receiving data. + + Class attributes: + + - (int) timeout: the timeout which roughly is the maximum time we + permit data transfers to stall for with no progress. If the + timeout triggers, the remote client will be kicked off + (defaults 300). + + - (int) ac_in_buffer_size: incoming data buffer size (defaults 65536) + + - (int) ac_out_buffer_size: outgoing data buffer size (defaults 65536) + """ + + timeout = 300 + ac_in_buffer_size = 65536 + ac_out_buffer_size = 65536 + + def __init__(self, sock, cmd_channel): + """Initialize the command channel. + + - (instance) sock: the socket object instance of the newly + established connection. + - (instance) cmd_channel: the command channel class instance. + """ + self.cmd_channel = cmd_channel + self.file_obj = None + self.receive = False + self.transfer_finished = False + self.tot_bytes_sent = 0 + self.tot_bytes_received = 0 + self.cmd = None + self.log = cmd_channel.log + self.log_exception = cmd_channel.log_exception + self._data_wrapper = None + self._lastdata = 0 + self._had_cr = False + self._start_time = timer() + self._resp = () + self._offset = None + self._filefd = None + self._idler = None + self._initialized = False + try: + AsyncChat.__init__(self, sock, ioloop=cmd_channel.ioloop) + except socket.error as err: + # if we get an exception here we want the dispatcher + # instance to set socket attribute before closing, see: + # https://github.com/giampaolo/pyftpdlib/issues/188 + AsyncChat.__init__( + self, socket.socket(), ioloop=cmd_channel.ioloop) + # https://github.com/giampaolo/pyftpdlib/issues/143 + self.close() + if err.errno == errno.EINVAL: + return + self.handle_error() + return + + # remove this instance from IOLoop's socket map + if not self.connected: + self.close() + return + if self.timeout: + self._idler = self.ioloop.call_every(self.timeout, + self.handle_timeout, + _errback=self.handle_error) + + def __repr__(self): + return '<%s(%s)>' % (self.__class__.__name__, + self.cmd_channel.get_repr_info(as_str=True)) + + __str__ = __repr__ + + def use_sendfile(self): + if not self.cmd_channel.use_sendfile: + # as per server config + return False + if self.file_obj is None or not hasattr(self.file_obj, "fileno"): + # direcotry listing or unusual file obj + return False + if self.cmd_channel._current_type != 'i': + # text file transfer (need to transform file content on the fly) + return False + return True + + def push(self, data): + self._initialized = True + self.modify_ioloop_events(self.ioloop.WRITE) + self._wanted_io_events = self.ioloop.WRITE + AsyncChat.push(self, data) + + def push_with_producer(self, producer): + self._initialized = True + self.modify_ioloop_events(self.ioloop.WRITE) + self._wanted_io_events = self.ioloop.WRITE + if self.use_sendfile(): + self._offset = producer.file.tell() + self._filefd = self.file_obj.fileno() + try: + self.initiate_sendfile() + except _GiveUpOnSendfile: + pass + else: + self.initiate_send = self.initiate_sendfile + return + debug("starting transfer using send()", self) + AsyncChat.push_with_producer(self, producer) + + def close_when_done(self): + asynchat.async_chat.close_when_done(self) + + def initiate_send(self): + asynchat.async_chat.initiate_send(self) + + def initiate_sendfile(self): + """A wrapper around sendfile.""" + try: + sent = sendfile(self._fileno, self._filefd, self._offset, + self.ac_out_buffer_size) + except OSError as err: + if err.errno in _ERRNOS_RETRY or err.errno == errno.EBUSY: + return + elif err.errno in _ERRNOS_DISCONNECTED: + self.handle_close() + else: + if self.tot_bytes_sent == 0: + logger.warning( + "sendfile() failed; falling back on using plain send") + raise _GiveUpOnSendfile + else: + raise + else: + if sent == 0: + # this signals the channel that the transfer is completed + self.discard_buffers() + self.handle_close() + else: + self._offset += sent + self.tot_bytes_sent += sent + + # --- utility methods + + def _posix_ascii_data_wrapper(self, chunk): + """The data wrapper used for receiving data in ASCII mode on + systems using a single line terminator, handling those cases + where CRLF ('\r\n') gets delivered in two chunks. + """ + if self._had_cr: + chunk = b'\r' + chunk + + if chunk.endswith(b'\r'): + self._had_cr = True + chunk = chunk[:-1] + else: + self._had_cr = False + + return chunk.replace(b'\r\n', b(os.linesep)) + + def enable_receiving(self, type, cmd): + """Enable receiving of data over the channel. Depending on the + TYPE currently in use it creates an appropriate wrapper for the + incoming data. + + - (str) type: current transfer type, 'a' (ASCII) or 'i' (binary). + """ + self._initialized = True + self.modify_ioloop_events(self.ioloop.READ) + self._wanted_io_events = self.ioloop.READ + self.cmd = cmd + if type == 'a': + if os.linesep == '\r\n': + self._data_wrapper = None + else: + self._data_wrapper = self._posix_ascii_data_wrapper + elif type == 'i': + self._data_wrapper = None + else: + raise TypeError("unsupported type") + self.receive = True + + def get_transmitted_bytes(self): + """Return the number of transmitted bytes.""" + return self.tot_bytes_sent + self.tot_bytes_received + + def get_elapsed_time(self): + """Return the transfer elapsed time in seconds.""" + return timer() - self._start_time + + def transfer_in_progress(self): + """Return True if a transfer is in progress, else False.""" + return self.get_transmitted_bytes() != 0 + + # --- connection + + def send(self, data): + result = AsyncChat.send(self, data) + self.tot_bytes_sent += result + return result + + def refill_buffer(self): # pragma: no cover + """Overridden as a fix around http://bugs.python.org/issue1740572 + (when the producer is consumed, close() was called instead of + handle_close()). + """ + while True: + if len(self.producer_fifo): + p = self.producer_fifo.first() + # a 'None' in the producer fifo is a sentinel, + # telling us to close the channel. + if p is None: + if not self.ac_out_buffer: + self.producer_fifo.pop() + # self.close() + self.handle_close() + return + elif isinstance(p, str): + self.producer_fifo.pop() + self.ac_out_buffer += p + return + data = p.more() + if data: + self.ac_out_buffer = self.ac_out_buffer + data + return + else: + self.producer_fifo.pop() + else: + return + + def handle_read(self): + """Called when there is data waiting to be read.""" + try: + chunk = self.recv(self.ac_in_buffer_size) + except RetryError: + pass + except socket.error: + self.handle_error() + else: + self.tot_bytes_received += len(chunk) + if not chunk: + self.transfer_finished = True + # self.close() # <-- asyncore.recv() already do that... + return + if self._data_wrapper is not None: + chunk = self._data_wrapper(chunk) + try: + self.file_obj.write(chunk) + except OSError as err: + raise _FileReadWriteError(err) + + handle_read_event = handle_read # small speedup + + def readable(self): + """Predicate for inclusion in the readable for select().""" + # It the channel is not supposed to be receiving but yet it's + # in the list of readable events, that means it has been + # disconnected, in which case we explicitly close() it. + # This is necessary as differently from FTPHandler this channel + # is not supposed to be readable/writable at first, meaning the + # upper IOLoop might end up calling readable() repeatedly, + # hogging CPU resources. + if not self.receive and not self._initialized: + return self.close() + return self.receive + + def writable(self): + """Predicate for inclusion in the writable for select().""" + return not self.receive and asynchat.async_chat.writable(self) + + def handle_timeout(self): + """Called cyclically to check if data trasfer is stalling with + no progress in which case the client is kicked off. + """ + if self.get_transmitted_bytes() > self._lastdata: + self._lastdata = self.get_transmitted_bytes() + else: + msg = "Data connection timed out." + self._resp = ("421 " + msg, logger.info) + self.close() + self.cmd_channel.close_when_done() + + def handle_error(self): + """Called when an exception is raised and not otherwise handled.""" + try: + raise + # an error could occur in case we fail reading / writing + # from / to file (e.g. file system gets full) + except _FileReadWriteError as err: + error = _strerror(err.errno) + except Exception: + # some other exception occurred; we don't want to provide + # confidential error messages + self.log_exception(self) + error = "Internal error" + try: + self._resp = ("426 %s; transfer aborted." % error, logger.warning) + self.close() + except Exception: + logger.critical(traceback.format_exc()) + + def handle_close(self): + """Called when the socket is closed.""" + # If we used channel for receiving we assume that transfer is + # finished when client closes the connection, if we used channel + # for sending we have to check that all data has been sent + # (responding with 226) or not (responding with 426). + # In both cases handle_close() is automatically called by the + # underlying asynchat module. + if not self._closed: + if self.receive: + self.transfer_finished = True + else: + self.transfer_finished = len(self.producer_fifo) == 0 + try: + if self.transfer_finished: + self._resp = ("226 Transfer complete.", logger.debug) + else: + tot_bytes = self.get_transmitted_bytes() + self._resp = ("426 Transfer aborted; %d bytes transmitted." + % tot_bytes, logger.debug) + finally: + self.close() + + def close(self): + """Close the data channel, first attempting to close any remaining + file handles.""" + debug("call: close()", inst=self) + if not self._closed: + # RFC-959 says we must close the connection before replying + AsyncChat.close(self) + if self._resp: + self.cmd_channel.respond(self._resp[0], logfun=self._resp[1]) + + if self.file_obj is not None and not self.file_obj.closed: + self.file_obj.close() + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + if self.file_obj is not None: + filename = self.file_obj.name + elapsed_time = round(self.get_elapsed_time(), 3) + self.cmd_channel.log_transfer( + cmd=self.cmd, + filename=self.file_obj.name, + receive=self.receive, + completed=self.transfer_finished, + elapsed=elapsed_time, + bytes=self.get_transmitted_bytes()) + if self.transfer_finished: + if self.receive: + self.cmd_channel.on_file_received(filename) + else: + self.cmd_channel.on_file_sent(filename) + else: + if self.receive: + self.cmd_channel.on_incomplete_file_received(filename) + else: + self.cmd_channel.on_incomplete_file_sent(filename) + self.cmd_channel._on_dtp_close() + + +# dirty hack in order to turn AsyncChat into a new style class in +# python 2.x so that we can use super() +if PY3: + class _AsyncChatNewStyle(AsyncChat): + pass +else: + class _AsyncChatNewStyle(object, AsyncChat): + + def __init__(self, *args, **kwargs): + super(object, self).__init__(*args, **kwargs) # bypass object + + +class ThrottledDTPHandler(_AsyncChatNewStyle, DTPHandler): + """A DTPHandler subclass which wraps sending and receiving in a data + counter and temporarily "sleeps" the channel so that you burst to no + more than x Kb/sec average. + + - (int) read_limit: the maximum number of bytes to read (receive) + in one second (defaults to 0 == no limit). + + - (int) write_limit: the maximum number of bytes to write (send) + in one second (defaults to 0 == no limit). + + - (bool) auto_sized_buffers: this option only applies when read + and/or write limits are specified. When enabled it bumps down + the data buffer sizes so that they are never greater than read + and write limits which results in a less bursty and smoother + throughput (default: True). + """ + read_limit = 0 + write_limit = 0 + auto_sized_buffers = True + + def __init__(self, sock, cmd_channel): + super(ThrottledDTPHandler, self).__init__(sock, cmd_channel) + self._timenext = 0 + self._datacount = 0 + self.sleeping = False + self._throttler = None + if self.auto_sized_buffers: + if self.read_limit: + while self.ac_in_buffer_size > self.read_limit: + self.ac_in_buffer_size /= 2 + if self.write_limit: + while self.ac_out_buffer_size > self.write_limit: + self.ac_out_buffer_size /= 2 + self.ac_in_buffer_size = int(self.ac_in_buffer_size) + self.ac_out_buffer_size = int(self.ac_out_buffer_size) + + def __repr__(self): + return DTPHandler.__repr__(self) + + def use_sendfile(self): + return False + + def recv(self, buffer_size): + chunk = super(ThrottledDTPHandler, self).recv(buffer_size) + if self.read_limit: + self._throttle_bandwidth(len(chunk), self.read_limit) + return chunk + + def send(self, data): + num_sent = super(ThrottledDTPHandler, self).send(data) + if self.write_limit: + self._throttle_bandwidth(num_sent, self.write_limit) + return num_sent + + def _cancel_throttler(self): + if self._throttler is not None and not self._throttler.cancelled: + self._throttler.cancel() + + def _throttle_bandwidth(self, len_chunk, max_speed): + """A method which counts data transmitted so that you burst to + no more than x Kb/sec average. + """ + self._datacount += len_chunk + if self._datacount >= max_speed: + self._datacount = 0 + now = timer() + sleepfor = (self._timenext - now) * 2 + if sleepfor > 0: + # we've passed bandwidth limits + def unsleep(): + if self.receive: + event = self.ioloop.READ + else: + event = self.ioloop.WRITE + self.add_channel(events=event) + + self.del_channel() + self._cancel_throttler() + self._throttler = self.ioloop.call_later( + sleepfor, unsleep, _errback=self.handle_error) + self._timenext = now + 1 + + def close(self): + self._cancel_throttler() + super(ThrottledDTPHandler, self).close() + + +# --- producers + + +class FileProducer(object): + """Producer wrapper for file[-like] objects.""" + + buffer_size = 65536 + + def __init__(self, file, type): + """Initialize the producer with a data_wrapper appropriate to TYPE. + + - (file) file: the file[-like] object. + - (str) type: the current TYPE, 'a' (ASCII) or 'i' (binary). + """ + self.file = file + self.type = type + if type == 'a' and os.linesep != '\r\n': + self._data_wrapper = lambda x: x.replace(b(os.linesep), b'\r\n') + else: + self._data_wrapper = None + + def more(self): + """Attempt a chunk of data of size self.buffer_size.""" + try: + data = self.file.read(self.buffer_size) + except OSError as err: + raise _FileReadWriteError(err) + else: + if self._data_wrapper is not None: + data = self._data_wrapper(data) + return data + + +class BufferedIteratorProducer(object): + """Producer for iterator objects with buffer capabilities.""" + # how many times iterator.next() will be called before + # returning some data + loops = 20 + + def __init__(self, iterator): + self.iterator = iterator + + def more(self): + """Attempt a chunk of data from iterator by calling + its next() method different times. + """ + buffer = [] + for x in xrange(self.loops): + try: + buffer.append(next(self.iterator)) + except StopIteration: + break + return b''.join(buffer) + + +# --- FTP + +class FTPHandler(AsyncChat): + """Implements the FTP server Protocol Interpreter (see RFC-959), + handling commands received from the client on the control channel. + + All relevant session information is stored in class attributes + reproduced below and can be modified before instantiating this + class. + + - (int) timeout: + The timeout which is the maximum time a remote client may spend + between FTP commands. If the timeout triggers, the remote client + will be kicked off. Defaults to 300 seconds. + + - (str) banner: the string sent when client connects. + + - (int) max_login_attempts: + the maximum number of wrong authentications before disconnecting + the client (default 3). + + - (bool)permit_foreign_addresses: + FTP site-to-site transfer feature: also referenced as "FXP" it + permits for transferring a file between two remote FTP servers + without the transfer going through the client's host (not + recommended for security reasons as described in RFC-2577). + Having this attribute set to False means that all data + connections from/to remote IP addresses which do not match the + client's IP address will be dropped (defualt False). + + - (bool) permit_privileged_ports: + set to True if you want to permit active data connections (PORT) + over privileged ports (not recommended, defaulting to False). + + - (str) masquerade_address: + the "masqueraded" IP address to provide along PASV reply when + pyftpdlib is running behind a NAT or other types of gateways. + When configured pyftpdlib will hide its local address and + instead use the public address of your NAT (default None). + + - (dict) masquerade_address_map: + in case the server has multiple IP addresses which are all + behind a NAT router, you may wish to specify individual + masquerade_addresses for each of them. The map expects a + dictionary containing private IP addresses as keys, and their + corresponding public (masquerade) addresses as values. + + - (list) passive_ports: + what ports the ftpd will use for its passive data transfers. + Value expected is a list of integers (e.g. range(60000, 65535)). + When configured pyftpdlib will no longer use kernel-assigned + random ports (default None). + + - (bool) use_gmt_times: + when True causes the server to report all ls and MDTM times in + GMT and not local time (default True). + + - (bool) use_sendfile: when True uses sendfile() system call to + send a file resulting in faster uploads (from server to client). + Works on UNIX only and requires pysendfile module to be + installed separately: + https://github.com/giampaolo/pysendfile/ + Automatically defaults to True if pysendfile module is + installed. + + - (bool) tcp_no_delay: controls the use of the TCP_NODELAY socket + option which disables the Nagle algorithm resulting in + significantly better performances (default True on all systems + where it is supported). + + - (str) unicode_errors: + the error handler passed to ''.encode() and ''.decode(): + http://docs.python.org/library/stdtypes.html#str.decode + (detaults to 'replace'). + + - (str) log_prefix: + the prefix string preceding any log line; all instance + attributes can be used as arguments. + + + All relevant instance attributes initialized when client connects + are reproduced below. You may be interested in them in case you + want to subclass the original FTPHandler. + + - (bool) authenticated: True if client authenticated himself. + - (str) username: the name of the connected user (if any). + - (int) attempted_logins: number of currently attempted logins. + - (str) current_type: the current transfer type (default "a") + - (int) af: the connection's address family (IPv4/IPv6) + - (instance) server: the FTPServer class instance. + - (instance) data_channel: the data channel instance (if any). + """ + # these are overridable defaults + + # default classes + authorizer = DummyAuthorizer() + active_dtp = ActiveDTP + passive_dtp = PassiveDTP + dtp_handler = DTPHandler + abstracted_fs = AbstractedFS + proto_cmds = proto_cmds + + # session attributes (explained in the docstring) + timeout = 300 + banner = "pyftpdlib %s ready." % __ver__ + max_login_attempts = 3 + permit_foreign_addresses = False + permit_privileged_ports = False + masquerade_address = None + masquerade_address_map = {} + passive_ports = None + use_gmt_times = True + use_sendfile = sendfile is not None + tcp_no_delay = hasattr(socket, "TCP_NODELAY") + unicode_errors = 'replace' + log_prefix = '%(remote_ip)s:%(remote_port)s-[%(username)s]' + auth_failed_timeout = 3 + + def __init__(self, conn, server, ioloop=None): + """Initialize the command channel. + + - (instance) conn: the socket object instance of the newly + established connection. + - (instance) server: the ftp server class instance. + """ + # public session attributes + self.server = server + self.fs = None + self.authenticated = False + self.username = "" + self.password = "" + self.attempted_logins = 0 + self.data_channel = None + self.remote_ip = "" + self.remote_port = "" + self.started = time.time() + + # private session attributes + self._last_response = "" + self._current_type = 'a' + self._restart_position = 0 + self._quit_pending = False + self._in_buffer = [] + self._in_buffer_len = 0 + self._epsvall = False + self._dtp_acceptor = None + self._dtp_connector = None + self._in_dtp_queue = None + self._out_dtp_queue = None + self._extra_feats = [] + self._current_facts = ['type', 'perm', 'size', 'modify'] + self._rnfr = None + self._idler = None + self._log_debug = logging.getLogger('pyftpdlib').getEffectiveLevel() \ + <= logging.DEBUG + + if os.name == 'posix': + self._current_facts.append('unique') + self._available_facts = self._current_facts[:] + if pwd and grp: + self._available_facts += ['unix.mode', 'unix.uid', 'unix.gid'] + if os.name == 'nt': + self._available_facts.append('create') + + try: + AsyncChat.__init__(self, conn, ioloop=ioloop) + except socket.error as err: + # if we get an exception here we want the dispatcher + # instance to set socket attribute before closing, see: + # https://github.com/giampaolo/pyftpdlib/issues/188 + AsyncChat.__init__(self, socket.socket(), ioloop=ioloop) + self.close() + debug("call: FTPHandler.__init__, err %r" % err, self) + if err.errno == errno.EINVAL: + # https://github.com/giampaolo/pyftpdlib/issues/143 + return + self.handle_error() + return + self.set_terminator(b"\r\n") + + # connection properties + try: + self.remote_ip, self.remote_port = self.socket.getpeername()[:2] + except socket.error as err: + debug("call: FTPHandler.__init__, err on getpeername() %r" % err, + self) + # A race condition may occur if the other end is closing + # before we can get the peername, hence ENOTCONN (see issue + # #100) while EINVAL can occur on OSX (see issue #143). + self.connected = False + if err.errno in (errno.ENOTCONN, errno.EINVAL): + self.close() + else: + self.handle_error() + return + else: + self.log("FTP session opened (connect)") + + # try to handle urgent data inline + try: + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_OOBINLINE, 1) + except socket.error as err: + debug("call: FTPHandler.__init__, err on SO_OOBINLINE %r" % err, + self) + + # disable Nagle algorithm for the control socket only, resulting + # in significantly better performances + if self.tcp_no_delay: + try: + self.socket.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) + except socket.error as err: + debug( + "call: FTPHandler.__init__, err on TCP_NODELAY %r" % err, + self) + + # remove this instance from IOLoop's socket_map + if not self.connected: + self.close() + return + + if self.timeout: + self._idler = self.ioloop.call_later( + self.timeout, self.handle_timeout, _errback=self.handle_error) + + def get_repr_info(self, as_str=False, extra_info={}): + info = OrderedDict() + info['id'] = id(self) + info['addr'] = "%s:%s" % (self.remote_ip, self.remote_port) + if _is_ssl_sock(self.socket): + info['ssl'] = True + if self.username: + info['user'] = self.username + # If threads are involved sometimes "self" may be None (?!?). + dc = getattr(self, 'data_channel', None) + if dc is not None: + if _is_ssl_sock(dc.socket): + info['ssl-data'] = True + if dc.file_obj: + if self.data_channel.receive: + info['sending-file'] = dc.file_obj + if dc.use_sendfile(): + info['use-sendfile(2)'] = True + else: + info['receiving-file'] = dc.file_obj + info['bytes-trans'] = dc.get_transmitted_bytes() + info.update(extra_info) + if as_str: + return ', '.join(['%s=%r' % (k, v) for (k, v) in info.items()]) + return info + + def __repr__(self): + return '<%s(%s)>' % (self.__class__.__name__, self.get_repr_info(True)) + + __str__ = __repr__ + + def handle(self): + """Return a 220 'ready' response to the client over the command + channel. + """ + self.on_connect() + if not self._closed and not self._closing: + if len(self.banner) <= 75: + self.respond("220 %s" % str(self.banner)) + else: + self.push('220-%s\r\n' % str(self.banner)) + self.respond('220 ') + + def handle_max_cons(self): + """Called when limit for maximum number of connections is reached.""" + msg = "421 Too many connections. Service temporarily unavailable." + self.respond_w_warning(msg) + # If self.push is used, data could not be sent immediately in + # which case a new "loop" will occur exposing us to the risk of + # accepting new connections. Since this could cause asyncore to + # run out of fds in case we're using select() on Windows we + # immediately close the channel by using close() instead of + # close_when_done(). If data has not been sent yet client will + # be silently disconnected. + self.close() + + def handle_max_cons_per_ip(self): + """Called when too many clients are connected from the same IP.""" + msg = "421 Too many connections from the same IP address." + self.respond_w_warning(msg) + self.close_when_done() + + def handle_timeout(self): + """Called when client does not send any command within the time + specified in attribute.""" + msg = "Control connection timed out." + self.respond("421 " + msg, logfun=logger.info) + self.close_when_done() + + # --- asyncore / asynchat overridden methods + + def readable(self): + # Checking for self.connected seems to be necessary as per: + # https://github.com/giampaolo/pyftpdlib/issues/188#c18 + # In contrast to DTPHandler, here we are not interested in + # attempting to receive any further data from a closed socket. + return self.connected and AsyncChat.readable(self) + + def writable(self): + return self.connected and AsyncChat.writable(self) + + def collect_incoming_data(self, data): + """Read incoming data and append to the input buffer.""" + self._in_buffer.append(data) + self._in_buffer_len += len(data) + # Flush buffer if it gets too long (possible DoS attacks). + # RFC-959 specifies that a 500 response could be given in + # such cases + buflimit = 2048 + if self._in_buffer_len > buflimit: + self.respond_w_warning('500 Command too long.') + self._in_buffer = [] + self._in_buffer_len = 0 + + def decode(self, bytes): + return bytes.decode('utf8', self.unicode_errors) + + def found_terminator(self): + r"""Called when the incoming data stream matches the \r\n + terminator. + """ + if self._idler is not None and not self._idler.cancelled: + self._idler.reset() + + line = b''.join(self._in_buffer) + try: + line = self.decode(line) + except UnicodeDecodeError: + # By default we'll never get here as we replace errors + # but user might want to override this behavior. + # RFC-2640 doesn't mention what to do in this case so + # we'll just return 501 (bad arg). + return self.respond("501 Can't decode command.") + + self._in_buffer = [] + self._in_buffer_len = 0 + + cmd = line.split(' ')[0].upper() + arg = line[len(cmd) + 1:] + try: + self.pre_process_command(line, cmd, arg) + except UnicodeEncodeError: + self.respond("501 can't decode path (server filesystem encoding " + "is %s)" % sys.getfilesystemencoding()) + + def pre_process_command(self, line, cmd, arg): + kwargs = {} + if cmd == "SITE" and arg: + cmd = "SITE %s" % arg.split(' ')[0].upper() + arg = line[len(cmd) + 1:] + + if cmd != 'PASS': + self.logline("<- %s" % line) + else: + self.logline("<- %s %s" % (line.split(' ')[0], '*' * 6)) + + # Recognize those commands having a "special semantic". They + # should be sent by following the RFC-959 procedure of sending + # Telnet IP/Synch sequence (chr 242 and 255) as OOB data but + # since many ftp clients don't do it correctly we check the + # last 4 characters only. + if cmd not in self.proto_cmds: + if cmd[-4:] in ('ABOR', 'STAT', 'QUIT'): + cmd = cmd[-4:] + else: + msg = 'Command "%s" not understood.' % cmd + self.respond('500 ' + msg) + if cmd: + self.log_cmd(cmd, arg, 500, msg) + return + + if not arg and self.proto_cmds[cmd]['arg'] == True: # NOQA + msg = "Syntax error: command needs an argument." + self.respond("501 " + msg) + self.log_cmd(cmd, "", 501, msg) + return + if arg and self.proto_cmds[cmd]['arg'] == False: # NOQA + msg = "Syntax error: command does not accept arguments." + self.respond("501 " + msg) + self.log_cmd(cmd, arg, 501, msg) + return + + if not self.authenticated: + if self.proto_cmds[cmd]['auth'] or (cmd == 'STAT' and arg): + msg = "Log in with USER and PASS first." + self.respond("530 " + msg) + self.log_cmd(cmd, arg, 530, msg) + else: + # call the proper ftp_* method + self.process_command(cmd, arg) + return + else: + if (cmd == 'STAT') and not arg: + self.ftp_STAT(u('')) + return + + # for file-system related commands check whether real path + # destination is valid + if self.proto_cmds[cmd]['perm'] and (cmd != 'STOU'): + if cmd in ('CWD', 'XCWD'): + arg = self.fs.ftp2fs(arg or u('/')) + elif cmd in ('CDUP', 'XCUP'): + arg = self.fs.ftp2fs(u('..')) + elif cmd == 'LIST': + if arg.lower() in ('-a', '-l', '-al', '-la'): + arg = self.fs.ftp2fs(self.fs.cwd) + else: + arg = self.fs.ftp2fs(arg or self.fs.cwd) + elif cmd == 'STAT': + if glob.has_magic(arg): + msg = 'Globbing not supported.' + self.respond('550 ' + msg) + self.log_cmd(cmd, arg, 550, msg) + return + arg = self.fs.ftp2fs(arg or self.fs.cwd) + elif cmd == 'SITE CHMOD': + if ' ' not in arg: + msg = "Syntax error: command needs two arguments." + self.respond("501 " + msg) + self.log_cmd(cmd, "", 501, msg) + return + else: + mode, arg = arg.split(' ', 1) + arg = self.fs.ftp2fs(arg) + kwargs = dict(mode=mode) + else: # LIST, NLST, MLSD, MLST + arg = self.fs.ftp2fs(arg or self.fs.cwd) + + if not self.fs.validpath(arg): + line = self.fs.fs2ftp(arg) + msg = '"%s" points to a path which is outside ' \ + "the user's root directory" % line + self.respond("550 %s." % msg) + self.log_cmd(cmd, arg, 550, msg) + return + + # check permission + perm = self.proto_cmds[cmd]['perm'] + if perm is not None and cmd != 'STOU': + if not self.authorizer.has_perm(self.username, perm, arg): + msg = "Not enough privileges." + self.respond("550 " + msg) + self.log_cmd(cmd, arg, 550, msg) + return + + # call the proper ftp_* method + self.process_command(cmd, arg, **kwargs) + + def process_command(self, cmd, *args, **kwargs): + """Process command by calling the corresponding ftp_* class + method (e.g. for received command "MKD pathname", ftp_MKD() + method is called with "pathname" as the argument). + """ + if self._closed: + return + self._last_response = "" + method = getattr(self, 'ftp_' + cmd.replace(' ', '_')) + method(*args, **kwargs) + if self._last_response: + code = int(self._last_response[:3]) + resp = self._last_response[4:] + self.log_cmd(cmd, args[0], code, resp) + + def handle_error(self): + try: + self.log_exception(self) + self.close() + except Exception: + logger.critical(traceback.format_exc()) + + def handle_close(self): + self.close() + + def close(self): + """Close the current channel disconnecting the client.""" + debug("call: close()", inst=self) + if not self._closed: + AsyncChat.close(self) + + self._shutdown_connecting_dtp() + + if self.data_channel is not None: + self.data_channel.close() + del self.data_channel + + if self._out_dtp_queue is not None: + file = self._out_dtp_queue[2] + if file is not None: + file.close() + if self._in_dtp_queue is not None: + file = self._in_dtp_queue[0] + if file is not None: + file.close() + + del self._out_dtp_queue + del self._in_dtp_queue + + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + + # remove client IP address from ip map + if self.remote_ip in self.server.ip_map: + self.server.ip_map.remove(self.remote_ip) + + if self.fs is not None: + self.fs.cmd_channel = None + self.fs = None + self.log("FTP session closed (disconnect).") + # Having self.remote_ip not set means that no connection + # actually took place, hence we're not interested in + # invoking the callback. + if self.remote_ip: + self.ioloop.call_later(0, self.on_disconnect, + _errback=self.handle_error) + + def _shutdown_connecting_dtp(self): + """Close any ActiveDTP or PassiveDTP instance waiting to + establish a connection (passive or active). + """ + if self._dtp_acceptor is not None: + self._dtp_acceptor.close() + self._dtp_acceptor = None + if self._dtp_connector is not None: + self._dtp_connector.close() + self._dtp_connector = None + + # --- public callbacks + # Note: to run a time consuming task make sure to use a separate + # process or thread (see FAQs). + + def on_connect(self): + """Called when client connects, *before* sending the initial + 220 reply. + """ + + def on_disconnect(self): + """Called when connection is closed.""" + + def on_login(self, username): + """Called on user login.""" + + def on_login_failed(self, username, password): + """Called on failed login attempt. + At this point client might have already been disconnected if it + failed too many times. + """ + + def on_logout(self, username): + """Called when user "cleanly" logs out due to QUIT or USER + issued twice (re-login). This is not called if the connection + is simply closed by client. + """ + + def on_file_sent(self, file): + """Called every time a file has been succesfully sent. + "file" is the absolute name of the file just being sent. + """ + + def on_file_received(self, file): + """Called every time a file has been succesfully received. + "file" is the absolute name of the file just being received. + """ + + def on_incomplete_file_sent(self, file): + """Called every time a file has not been entirely sent. + (e.g. ABOR during transfer or client disconnected). + "file" is the absolute name of that file. + """ + + def on_incomplete_file_received(self, file): + """Called every time a file has not been entirely received + (e.g. ABOR during transfer or client disconnected). + "file" is the absolute name of that file. + """ + + # --- internal callbacks + + def _on_dtp_connection(self): + """Called every time data channel connects, either active or + passive. + + Incoming and outgoing queues are checked for pending data. + If outbound data is pending, it is pushed into the data channel. + If awaiting inbound data, the data channel is enabled for + receiving. + """ + # Close accepting DTP only. By closing ActiveDTP DTPHandler + # would receive a closed socket object. + # self._shutdown_connecting_dtp() + if self._dtp_acceptor is not None: + self._dtp_acceptor.close() + self._dtp_acceptor = None + + # stop the idle timer as long as the data transfer is not finished + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + + # check for data to send + if self._out_dtp_queue is not None: + data, isproducer, file, cmd = self._out_dtp_queue + self._out_dtp_queue = None + self.data_channel.cmd = cmd + if file: + self.data_channel.file_obj = file + try: + if not isproducer: + self.data_channel.push(data) + else: + self.data_channel.push_with_producer(data) + if self.data_channel is not None: + self.data_channel.close_when_done() + except Exception: + # dealing with this exception is up to DTP (see bug #84) + self.data_channel.handle_error() + + # check for data to receive + elif self._in_dtp_queue is not None: + file, cmd = self._in_dtp_queue + self.data_channel.file_obj = file + self._in_dtp_queue = None + self.data_channel.enable_receiving(self._current_type, cmd) + + def _on_dtp_close(self): + """Called every time the data channel is closed.""" + self.data_channel = None + if self._quit_pending: + self.close() + elif self.timeout: + # data transfer finished, restart the idle timer + if self._idler is not None and not self._idler.cancelled: + self._idler.cancel() + self._idler = self.ioloop.call_later( + self.timeout, self.handle_timeout, _errback=self.handle_error) + + # --- utility + + def push(self, s): + asynchat.async_chat.push(self, s.encode('utf8')) + + def respond(self, resp, logfun=logger.debug): + """Send a response to the client using the command channel.""" + self._last_response = resp + self.push(resp + '\r\n') + if self._log_debug: + self.logline('-> %s' % resp, logfun=logfun) + else: + self.log(resp[4:], logfun=logfun) + + def respond_w_warning(self, resp): + self.respond(resp, logfun=logger.warning) + + def push_dtp_data(self, data, isproducer=False, file=None, cmd=None): + """Pushes data into the data channel. + + It is usually called for those commands requiring some data to + be sent over the data channel (e.g. RETR). + If data channel does not exist yet, it queues the data to send + later; data will then be pushed into data channel when + _on_dtp_connection() will be called. + + - (str/classobj) data: the data to send which may be a string + or a producer object). + - (bool) isproducer: whether treat data as a producer. + - (file) file: the file[-like] object to send (if any). + """ + if self.data_channel is not None: + self.respond( + "125 Data connection already open. Transfer starting.") + if file: + self.data_channel.file_obj = file + try: + if not isproducer: + self.data_channel.push(data) + else: + self.data_channel.push_with_producer(data) + if self.data_channel is not None: + self.data_channel.cmd = cmd + self.data_channel.close_when_done() + except Exception: + # dealing with this exception is up to DTP (see bug #84) + self.data_channel.handle_error() + else: + self.respond( + "150 File status okay. About to open data connection.") + self._out_dtp_queue = (data, isproducer, file, cmd) + + def flush_account(self): + """Flush account information by clearing attributes that need + to be reset on a REIN or new USER command. + """ + self._shutdown_connecting_dtp() + # if there's a transfer in progress RFC-959 states we are + # supposed to let it finish + if self.data_channel is not None: + if not self.data_channel.transfer_in_progress(): + self.data_channel.close() + self.data_channel = None + + username = self.username + if self.authenticated and username: + self.on_logout(username) + self.authenticated = False + self.username = "" + self.password = "" + self.attempted_logins = 0 + self._current_type = 'a' + self._restart_position = 0 + self._quit_pending = False + self._in_dtp_queue = None + self._rnfr = None + self._out_dtp_queue = None + + def run_as_current_user(self, function, *args, **kwargs): + """Execute a function impersonating the current logged-in user.""" + self.authorizer.impersonate_user(self.username, self.password) + try: + return function(*args, **kwargs) + finally: + self.authorizer.terminate_impersonation(self.username) + + # --- logging wrappers + + # this is defined earlier + # log_prefix = '%(remote_ip)s:%(remote_port)s-[%(username)s]' + + def log(self, msg, logfun=logger.info): + """Log a message, including additional identifying session data.""" + prefix = self.log_prefix % self.__dict__ + logfun("%s %s" % (prefix, msg)) + + def logline(self, msg, logfun=logger.debug): + """Log a line including additional indentifying session data. + By default this is disabled unless logging level == DEBUG. + """ + if self._log_debug: + prefix = self.log_prefix % self.__dict__ + logfun("%s %s" % (prefix, msg)) + + def logerror(self, msg): + """Log an error including additional indentifying session data.""" + prefix = self.log_prefix % self.__dict__ + logger.error("%s %s" % (prefix, msg)) + + def log_exception(self, instance): + """Log an unhandled exception. 'instance' is the instance + where the exception was generated. + """ + logger.exception("unhandled exception in instance %r", instance) + + # the list of commands which gets logged when logging level + # is >= logging.INFO + log_cmds_list = ["DELE", "RNFR", "RNTO", "MKD", "RMD", "CWD", + "XMKD", "XRMD", "XCWD", + "REIN", "SITE CHMOD"] + + def log_cmd(self, cmd, arg, respcode, respstr): + """Log commands and responses in a standardized format. + This is disabled in case the logging level is set to DEBUG. + + - (str) cmd: + the command sent by client + + - (str) arg: + the command argument sent by client. + For filesystem commands such as DELE, MKD, etc. this is + already represented as an absolute real filesystem path + like "/home/user/file.ext". + + - (int) respcode: + the response code as being sent by server. Response codes + starting with 4xx or 5xx are returned if the command has + been rejected for some reason. + + - (str) respstr: + the response string as being sent by server. + + By default only DELE, RMD, RNTO, MKD, CWD, ABOR, REIN, SITE CHMOD + commands are logged and the output is redirected to self.log + method. + + Can be overridden to provide alternate formats or to log + further commands. + """ + if not self._log_debug and cmd in self.log_cmds_list: + line = '%s %s' % (' '.join([cmd, arg]).strip(), respcode) + if str(respcode)[0] in ('4', '5'): + line += ' %r' % respstr + self.log(line) + + def log_transfer(self, cmd, filename, receive, completed, elapsed, bytes): + """Log all file transfers in a standardized format. + + - (str) cmd: + the original command who caused the tranfer. + + - (str) filename: + the absolutized name of the file on disk. + + - (bool) receive: + True if the transfer was used for client uploading (STOR, + STOU, APPE), False otherwise (RETR). + + - (bool) completed: + True if the file has been entirely sent, else False. + + - (float) elapsed: + transfer elapsed time in seconds. + + - (int) bytes: + number of bytes transmitted. + """ + line = '%s %s completed=%s bytes=%s seconds=%s' % \ + (cmd, filename, completed and 1 or 0, bytes, elapsed) + self.log(line) + + # --- connection + def _make_eport(self, ip, port): + """Establish an active data channel with remote client which + issued a PORT or EPRT command. + """ + # FTP bounce attacks protection: according to RFC-2577 it's + # recommended to reject PORT if IP address specified in it + # does not match client IP address. + remote_ip = self.remote_ip + if remote_ip.startswith('::ffff:'): + # In this scenario, the server has an IPv6 socket, but + # the remote client is using IPv4 and its address is + # represented as an IPv4-mapped IPv6 address which + # looks like this ::ffff:151.12.5.65, see: + # http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_addresses + # http://tools.ietf.org/html/rfc3493.html#section-3.7 + # We truncate the first bytes to make it look like a + # common IPv4 address. + remote_ip = remote_ip[7:] + if not self.permit_foreign_addresses and ip != remote_ip: + msg = "501 Rejected data connection to foreign address %s:%s." \ + % (ip, port) + self.respond_w_warning(msg) + return + + # ...another RFC-2577 recommendation is rejecting connections + # to privileged ports (< 1024) for security reasons. + if not self.permit_privileged_ports and port < 1024: + msg = '501 PORT against the privileged port "%s" refused.' % port + self.respond_w_warning(msg) + return + + # close establishing DTP instances, if any + self._shutdown_connecting_dtp() + + if self.data_channel is not None: + self.data_channel.close() + self.data_channel = None + + # make sure we are not hitting the max connections limit + if not self.server._accept_new_cons(): + msg = "425 Too many connections. Can't open data channel." + self.respond_w_warning(msg) + return + + # open data channel + self._dtp_connector = self.active_dtp(ip, port, self) + + def _make_epasv(self, extmode=False): + """Initialize a passive data channel with remote client which + issued a PASV or EPSV command. + If extmode argument is True we assume that client issued EPSV in + which case extended passive mode will be used (see RFC-2428). + """ + # close establishing DTP instances, if any + self._shutdown_connecting_dtp() + + # close established data connections, if any + if self.data_channel is not None: + self.data_channel.close() + self.data_channel = None + + # make sure we are not hitting the max connections limit + if not self.server._accept_new_cons(): + msg = "425 Too many connections. Can't open data channel." + self.respond_w_warning(msg) + return + + # open data channel + self._dtp_acceptor = self.passive_dtp(self, extmode) + + def ftp_PORT(self, line): + """Start an active data channel by using IPv4.""" + if self._epsvall: + self.respond("501 PORT not allowed after EPSV ALL.") + return + # Parse PORT request for getting IP and PORT. + # Request comes in as: + # > h1,h2,h3,h4,p1,p2 + # ...where the client's IP address is h1.h2.h3.h4 and the TCP + # port number is (p1 * 256) + p2. + try: + addr = list(map(int, line.split(','))) + if len(addr) != 6: + raise ValueError + for x in addr[:4]: + if not 0 <= x <= 255: + raise ValueError + ip = '%d.%d.%d.%d' % tuple(addr[:4]) + port = (addr[4] * 256) + addr[5] + if not 0 <= port <= 65535: + raise ValueError + except (ValueError, OverflowError): + self.respond("501 Invalid PORT format.") + return + self._make_eport(ip, port) + + def ftp_EPRT(self, line): + """Start an active data channel by choosing the network protocol + to use (IPv4/IPv6) as defined in RFC-2428. + """ + if self._epsvall: + self.respond("501 EPRT not allowed after EPSV ALL.") + return + # Parse EPRT request for getting protocol, IP and PORT. + # Request comes in as: + # protoipport + # ...where is an arbitrary delimiter character (usually "|") and + # is the network protocol to use (1 for IPv4, 2 for IPv6). + try: + af, ip, port = line.split(line[0])[1:-1] + port = int(port) + if not 0 <= port <= 65535: + raise ValueError + except (ValueError, IndexError, OverflowError): + self.respond("501 Invalid EPRT format.") + return + + if af == "1": + # test if AF_INET6 and IPV6_V6ONLY + if (self.socket.family == socket.AF_INET6 and not + SUPPORTS_HYBRID_IPV6): + self.respond('522 Network protocol not supported (use 2).') + else: + try: + octs = list(map(int, ip.split('.'))) + if len(octs) != 4: + raise ValueError + for x in octs: + if not 0 <= x <= 255: + raise ValueError + except (ValueError, OverflowError): + self.respond("501 Invalid EPRT format.") + else: + self._make_eport(ip, port) + elif af == "2": + if self.socket.family == socket.AF_INET: + self.respond('522 Network protocol not supported (use 1).') + else: + self._make_eport(ip, port) + else: + if self.socket.family == socket.AF_INET: + self.respond('501 Unknown network protocol (use 1).') + else: + self.respond('501 Unknown network protocol (use 2).') + + def ftp_PASV(self, line): + """Start a passive data channel by using IPv4.""" + if self._epsvall: + self.respond("501 PASV not allowed after EPSV ALL.") + return + self._make_epasv(extmode=False) + + def ftp_EPSV(self, line): + """Start a passive data channel by using IPv4 or IPv6 as defined + in RFC-2428. + """ + # RFC-2428 specifies that if an optional parameter is given, + # we have to determine the address family from that otherwise + # use the same address family used on the control connection. + # In such a scenario a client may use IPv4 on the control channel + # and choose to use IPv6 for the data channel. + # But how could we use IPv6 on the data channel without knowing + # which IPv6 address to use for binding the socket? + # Unfortunately RFC-2428 does not provide satisfing information + # on how to do that. The assumption is that we don't have any way + # to know wich address to use, hence we just use the same address + # family used on the control connection. + if not line: + self._make_epasv(extmode=True) + # IPv4 + elif line == "1": + if self.socket.family != socket.AF_INET: + self.respond('522 Network protocol not supported (use 2).') + else: + self._make_epasv(extmode=True) + # IPv6 + elif line == "2": + if self.socket.family == socket.AF_INET: + self.respond('522 Network protocol not supported (use 1).') + else: + self._make_epasv(extmode=True) + elif line.lower() == 'all': + self._epsvall = True + self.respond( + '220 Other commands other than EPSV are now disabled.') + else: + if self.socket.family == socket.AF_INET: + self.respond('501 Unknown network protocol (use 1).') + else: + self.respond('501 Unknown network protocol (use 2).') + + def ftp_QUIT(self, line): + """Quit the current session disconnecting the client.""" + if self.authenticated: + msg_quit = self.authorizer.get_msg_quit(self.username) + else: + msg_quit = "Goodbye." + if len(msg_quit) <= 75: + self.respond("221 %s" % msg_quit) + else: + self.push("221-%s\r\n" % msg_quit) + self.respond("221 ") + + # From RFC-959: + # If file transfer is in progress, the connection must remain + # open for result response and the server will then close it. + # We also stop responding to any further command. + if self.data_channel: + self._quit_pending = True + self.del_channel() + else: + self._shutdown_connecting_dtp() + self.close_when_done() + if self.authenticated and self.username: + self.on_logout(self.username) + + # --- data transferring + + def ftp_LIST(self, path): + """Return a list of files in the specified directory to the + client. + On success return the directory path, else None. + """ + # - If no argument, fall back on cwd as default. + # - Some older FTP clients erroneously issue /bin/ls-like LIST + # formats in which case we fall back on cwd as default. + try: + isdir = self.fs.isdir(path) + if isdir: + listing = self.run_as_current_user(self.fs.listdir, path) + if isinstance(listing, list): + try: + # RFC 959 recommends the listing to be sorted. + listing.sort() + except UnicodeDecodeError: + # (Python 2 only) might happen on filesystem not + # supporting UTF8 meaning os.listdir() returned a list + # of mixed bytes and unicode strings: + # http://goo.gl/6DLHD + # http://bugs.python.org/issue683592 + pass + iterator = self.fs.format_list(path, listing) + else: + basedir, filename = os.path.split(path) + self.fs.lstat(path) # raise exc in case of problems + iterator = self.fs.format_list(basedir, [filename]) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + producer = BufferedIteratorProducer(iterator) + self.push_dtp_data(producer, isproducer=True, cmd="LIST") + return path + + def ftp_NLST(self, path): + """Return a list of files in the specified directory in a + compact form to the client. + On success return the directory path, else None. + """ + try: + if self.fs.isdir(path): + listing = list(self.run_as_current_user(self.fs.listdir, path)) + else: + # if path is a file we just list its name + self.fs.lstat(path) # raise exc in case of problems + listing = [os.path.basename(path)] + except (OSError, FilesystemError) as err: + self.respond('550 %s.' % _strerror(err)) + else: + data = '' + if listing: + try: + listing.sort() + except UnicodeDecodeError: + # (Python 2 only) might happen on filesystem not + # supporting UTF8 meaning os.listdir() returned a list + # of mixed bytes and unicode strings: + # http://goo.gl/6DLHD + # http://bugs.python.org/issue683592 + ls = [] + for x in listing: + if not isinstance(x, unicode): + x = unicode(x, 'utf8') + ls.append(x) + listing = sorted(ls) + data = '\r\n'.join(listing) + '\r\n' + data = data.encode('utf8', self.unicode_errors) + self.push_dtp_data(data, cmd="NLST") + return path + + # --- MLST and MLSD commands + + # The MLST and MLSD commands are intended to standardize the file and + # directory information returned by the server-FTP process. These + # commands differ from the LIST command in that the format of the + # replies is strictly defined although extensible. + + def ftp_MLST(self, path): + """Return information about a pathname in a machine-processable + form as defined in RFC-3659. + On success return the path just listed, else None. + """ + line = self.fs.fs2ftp(path) + basedir, basename = os.path.split(path) + perms = self.authorizer.get_perms(self.username) + try: + iterator = self.run_as_current_user( + self.fs.format_mlsx, basedir, [basename], perms, + self._current_facts, ignore_err=False) + data = b''.join(iterator) + except (OSError, FilesystemError) as err: + self.respond('550 %s.' % _strerror(err)) + else: + data = data.decode('utf8', self.unicode_errors) + # since TVFS is supported (see RFC-3659 chapter 6), a fully + # qualified pathname should be returned + data = data.split(' ')[0] + ' %s\r\n' % line + # response is expected on the command channel + self.push('250-Listing "%s":\r\n' % line) + # the fact set must be preceded by a space + self.push(' ' + data) + self.respond('250 End MLST.') + return path + + def ftp_MLSD(self, path): + """Return contents of a directory in a machine-processable form + as defined in RFC-3659. + On success return the path just listed, else None. + """ + # RFC-3659 requires 501 response code if path is not a directory + if not self.fs.isdir(path): + self.respond("501 No such directory.") + return + try: + listing = self.run_as_current_user(self.fs.listdir, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + perms = self.authorizer.get_perms(self.username) + iterator = self.fs.format_mlsx(path, listing, perms, + self._current_facts) + producer = BufferedIteratorProducer(iterator) + self.push_dtp_data(producer, isproducer=True, cmd="MLSD") + return path + + def ftp_RETR(self, file): + """Retrieve the specified file (transfer from the server to the + client). On success return the file path else None. + """ + rest_pos = self._restart_position + self._restart_position = 0 + try: + fd = self.run_as_current_user(self.fs.open, file, 'rb') + except (EnvironmentError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + return + + try: + if rest_pos: + # Make sure that the requested offset is valid (within the + # size of the file being resumed). + # According to RFC-1123 a 554 reply may result in case that + # the existing file cannot be repositioned as specified in + # the REST. + ok = 0 + try: + if rest_pos > self.fs.getsize(file): + raise ValueError + fd.seek(rest_pos) + ok = 1 + except ValueError: + why = "Invalid REST parameter" + except (EnvironmentError, FilesystemError) as err: + why = _strerror(err) + if not ok: + fd.close() + self.respond('554 %s' % why) + return + producer = FileProducer(fd, self._current_type) + self.push_dtp_data(producer, isproducer=True, file=fd, cmd="RETR") + return file + except Exception: + fd.close() + raise + + def ftp_STOR(self, file, mode='w'): + """Store a file (transfer from the client to the server). + On success return the file path, else None. + """ + # A resume could occur in case of APPE or REST commands. + # In that case we have to open file object in different ways: + # STOR: mode = 'w' + # APPE: mode = 'a' + # REST: mode = 'r+' (to permit seeking on file object) + if 'a' in mode: + cmd = 'APPE' + else: + cmd = 'STOR' + rest_pos = self._restart_position + self._restart_position = 0 + if rest_pos: + mode = 'r+' + try: + fd = self.run_as_current_user(self.fs.open, file, mode + 'b') + except (EnvironmentError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + return + + try: + if rest_pos: + # Make sure that the requested offset is valid (within the + # size of the file being resumed). + # According to RFC-1123 a 554 reply may result in case + # that the existing file cannot be repositioned as + # specified in the REST. + ok = 0 + try: + if rest_pos > self.fs.getsize(file): + raise ValueError + fd.seek(rest_pos) + ok = 1 + except ValueError: + why = "Invalid REST parameter" + except (EnvironmentError, FilesystemError) as err: + why = _strerror(err) + if not ok: + fd.close() + self.respond('554 %s' % why) + return + + if self.data_channel is not None: + resp = "Data connection already open. Transfer starting." + self.respond("125 " + resp) + self.data_channel.file_obj = fd + self.data_channel.enable_receiving(self._current_type, cmd) + else: + resp = "File status okay. About to open data connection." + self.respond("150 " + resp) + self._in_dtp_queue = (fd, cmd) + return file + except Exception: + fd.close() + raise + + def ftp_STOU(self, line): + """Store a file on the server with a unique name. + On success return the file path, else None. + """ + # Note 1: RFC-959 prohibited STOU parameters, but this + # prohibition is obsolete. + # Note 2: 250 response wanted by RFC-959 has been declared + # incorrect in RFC-1123 that wants 125/150 instead. + # Note 3: RFC-1123 also provided an exact output format + # defined to be as follow: + # > 125 FILE: pppp + # ...where pppp represents the unique path name of the + # file that will be written. + + # watch for STOU preceded by REST, which makes no sense. + if self._restart_position: + self.respond("450 Can't STOU while REST request is pending.") + return + + if line: + basedir, prefix = os.path.split(self.fs.ftp2fs(line)) + prefix = prefix + '.' + else: + basedir = self.fs.ftp2fs(self.fs.cwd) + prefix = 'ftpd.' + try: + fd = self.run_as_current_user(self.fs.mkstemp, prefix=prefix, + dir=basedir) + except (EnvironmentError, FilesystemError) as err: + # likely, we hit the max number of retries to find out a + # file with a unique name + if getattr(err, "errno", -1) == errno.EEXIST: + why = 'No usable unique file name found' + # something else happened + else: + why = _strerror(err) + self.respond("450 %s." % why) + return + + try: + if not self.authorizer.has_perm(self.username, 'w', fd.name): + try: + fd.close() + self.run_as_current_user(self.fs.remove, fd.name) + except (OSError, FilesystemError): + pass + self.respond("550 Not enough privileges.") + return + + # now just acts like STOR except that restarting isn't allowed + filename = os.path.basename(fd.name) + if self.data_channel is not None: + self.respond("125 FILE: %s" % filename) + self.data_channel.file_obj = fd + self.data_channel.enable_receiving(self._current_type, "STOU") + else: + self.respond("150 FILE: %s" % filename) + self._in_dtp_queue = (fd, "STOU") + return filename + except Exception: + fd.close() + raise + + def ftp_APPE(self, file): + """Append data to an existing file on the server. + On success return the file path, else None. + """ + # watch for APPE preceded by REST, which makes no sense. + if self._restart_position: + self.respond("450 Can't APPE while REST request is pending.") + else: + return self.ftp_STOR(file, mode='a') + + def ftp_REST(self, line): + """Restart a file transfer from a previous mark.""" + if self._current_type == 'a': + self.respond('501 Resuming transfers not allowed in ASCII mode.') + return + try: + marker = int(line) + if marker < 0: + raise ValueError + except (ValueError, OverflowError): + self.respond("501 Invalid parameter.") + else: + self.respond("350 Restarting at position %s." % marker) + self._restart_position = marker + + def ftp_ABOR(self, line): + """Abort the current data transfer.""" + # ABOR received while no data channel exists + if (self._dtp_acceptor is None and + self._dtp_connector is None and + self.data_channel is None): + self.respond("225 No transfer to abort.") + return + else: + # a PASV or PORT was received but connection wasn't made yet + if (self._dtp_acceptor is not None or + self._dtp_connector is not None): + self._shutdown_connecting_dtp() + resp = "225 ABOR command successful; data channel closed." + + # If a data transfer is in progress the server must first + # close the data connection, returning a 426 reply to + # indicate that the transfer terminated abnormally, then it + # must send a 226 reply, indicating that the abort command + # was successfully processed. + # If no data has been transmitted we just respond with 225 + # indicating that no transfer was in progress. + if self.data_channel is not None: + if self.data_channel.transfer_in_progress(): + self.data_channel.close() + self.data_channel = None + self.respond("426 Transfer aborted via ABOR.", + logfun=logging.info) + resp = "226 ABOR command successful." + else: + self.data_channel.close() + self.data_channel = None + resp = "225 ABOR command successful; data channel closed." + self.respond(resp) + + # --- authentication + def ftp_USER(self, line): + """Set the username for the current session.""" + # RFC-959 specifies a 530 response to the USER command if the + # username is not valid. If the username is valid is required + # ftpd returns a 331 response instead. In order to prevent a + # malicious client from determining valid usernames on a server, + # it is suggested by RFC-2577 that a server always return 331 to + # the USER command and then reject the combination of username + # and password for an invalid username when PASS is provided later. + if not self.authenticated: + self.respond('331 Username ok, send password.') + else: + # a new USER command could be entered at any point in order + # to change the access control flushing any user, password, + # and account information already supplied and beginning the + # login sequence again. + self.flush_account() + msg = 'Previous account information was flushed' + self.respond('331 %s, send password.' % msg, logfun=logging.info) + self.username = line + + def handle_auth_failed(self, msg, password): + def callback(username, password, msg): + self.add_channel() + if hasattr(self, '_closed') and not self._closed: + self.attempted_logins += 1 + if self.attempted_logins >= self.max_login_attempts: + msg += " Disconnecting." + self.respond("530 " + msg) + self.close_when_done() + else: + self.respond("530 " + msg) + self.log("USER '%s' failed login." % username) + self.on_login_failed(username, password) + + self.del_channel() + if not msg: + if self.username == 'anonymous': + msg = "Anonymous access not allowed." + else: + msg = "Authentication failed." + else: + # response string should be capitalized as per RFC-959 + msg = msg.capitalize() + self.ioloop.call_later(self.auth_failed_timeout, callback, + self.username, password, msg, + _errback=self.handle_error) + self.username = "" + + def handle_auth_success(self, home, password, msg_login): + if not isinstance(home, unicode): + if PY3: + raise TypeError('type(home) != text') + else: + warnings.warn( + '%s.get_home_dir returned a non-unicode string; now ' + 'casting to unicode' % ( + self.authorizer.__class__.__name__), + RuntimeWarning) + home = home.decode('utf8') + + if len(msg_login) <= 75: + self.respond('230 %s' % msg_login) + else: + self.push("230-%s\r\n" % msg_login) + self.respond("230 ") + self.log("USER '%s' logged in." % self.username) + self.authenticated = True + self.password = password + self.attempted_logins = 0 + + self.fs = self.abstracted_fs(home, self) + self.on_login(self.username) + + def ftp_PASS(self, line): + """Check username's password against the authorizer.""" + if self.authenticated: + self.respond("503 User already authenticated.") + return + if not self.username: + self.respond("503 Login with USER first.") + return + + try: + self.authorizer.validate_authentication(self.username, line, self) + home = self.authorizer.get_home_dir(self.username) + msg_login = self.authorizer.get_msg_login(self.username) + except (AuthenticationFailed, AuthorizerError) as err: + self.handle_auth_failed(str(err), line) + else: + self.handle_auth_success(home, line, msg_login) + + def ftp_REIN(self, line): + """Reinitialize user's current session.""" + # From RFC-959: + # REIN command terminates a USER, flushing all I/O and account + # information, except to allow any transfer in progress to be + # completed. All parameters are reset to the default settings + # and the control connection is left open. This is identical + # to the state in which a user finds himself immediately after + # the control connection is opened. + self.flush_account() + # Note: RFC-959 erroneously mention "220" as the correct response + # code to be given in this case, but this is wrong... + self.respond("230 Ready for new user.") + + # --- filesystem operations + def ftp_PWD(self, line): + """Return the name of the current working directory to the client.""" + # The 257 response is supposed to include the directory + # name and in case it contains embedded double-quotes + # they must be doubled (see RFC-959, chapter 7, appendix 2). + cwd = self.fs.cwd + assert isinstance(cwd, unicode), cwd + self.respond('257 "%s" is the current directory.' + % cwd.replace('"', '""')) + + def ftp_CWD(self, path): + """Change the current working directory. + On success return the new directory path, else None. + """ + # Temporarily join the specified directory to see if we have + # permissions to do so, then get back to original process's + # current working directory. + # Note that if for some reason os.getcwd() gets removed after + # the process is started we'll get into troubles (os.getcwd() + # will fail with ENOENT) but we can't do anything about that + # except logging an error. + init_cwd = getcwdu() + try: + self.run_as_current_user(self.fs.chdir, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + cwd = self.fs.cwd + assert isinstance(cwd, unicode), cwd + self.respond('250 "%s" is the current directory.' % cwd) + if getcwdu() != init_cwd: + os.chdir(init_cwd) + return path + + def ftp_CDUP(self, path): + """Change into the parent directory. + On success return the new directory, else None. + """ + # Note: RFC-959 says that code 200 is required but it also says + # that CDUP uses the same codes as CWD. + return self.ftp_CWD(path) + + def ftp_SIZE(self, path): + """Return size of file in a format suitable for using with + RESTart as defined in RFC-3659.""" + + # Implementation note: properly handling the SIZE command when + # TYPE ASCII is used would require to scan the entire file to + # perform the ASCII translation logic + # (file.read().replace(os.linesep, '\r\n')) and then calculating + # the len of such data which may be different than the actual + # size of the file on the server. Considering that calculating + # such result could be very resource-intensive and also dangerous + # (DoS) we reject SIZE when the current TYPE is ASCII. + # However, clients in general should not be resuming downloads + # in ASCII mode. Resuming downloads in binary mode is the + # recommended way as specified in RFC-3659. + + line = self.fs.fs2ftp(path) + if self._current_type == 'a': + why = "SIZE not allowed in ASCII mode" + self.respond("550 %s." % why) + return + if not self.fs.isfile(self.fs.realpath(path)): + why = "%s is not retrievable" % line + self.respond("550 %s." % why) + return + try: + size = self.run_as_current_user(self.fs.getsize, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond("213 %s" % size) + + def ftp_MDTM(self, path): + """Return last modification time of file to the client as an ISO + 3307 style timestamp (YYYYMMDDHHMMSS) as defined in RFC-3659. + On success return the file path, else None. + """ + line = self.fs.fs2ftp(path) + if not self.fs.isfile(self.fs.realpath(path)): + self.respond("550 %s is not retrievable" % line) + return + if self.use_gmt_times: + timefunc = time.gmtime + else: + timefunc = time.localtime + try: + secs = self.run_as_current_user(self.fs.getmtime, path) + lmt = time.strftime("%Y%m%d%H%M%S", timefunc(secs)) + except (ValueError, OSError, FilesystemError) as err: + if isinstance(err, ValueError): + # It could happen if file's last modification time + # happens to be too old (prior to year 1900) + why = "Can't determine file's last modification time" + else: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond("213 %s" % lmt) + return path + + def ftp_MKD(self, path): + """Create the specified directory. + On success return the directory path, else None. + """ + line = self.fs.fs2ftp(path) + try: + self.run_as_current_user(self.fs.mkdir, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + # The 257 response is supposed to include the directory + # name and in case it contains embedded double-quotes + # they must be doubled (see RFC-959, chapter 7, appendix 2). + self.respond( + '257 "%s" directory created.' % line.replace('"', '""')) + return path + + def ftp_RMD(self, path): + """Remove the specified directory. + On success return the directory path, else None. + """ + if self.fs.realpath(path) == self.fs.realpath(self.fs.root): + msg = "Can't remove root directory." + self.respond("550 %s" % msg) + return + try: + self.run_as_current_user(self.fs.rmdir, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond("250 Directory removed.") + + def ftp_DELE(self, path): + """Delete the specified file. + On success return the file path, else None. + """ + try: + self.run_as_current_user(self.fs.remove, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond("250 File removed.") + return path + + def ftp_RNFR(self, path): + """Rename the specified (only the source name is specified + here, see RNTO command)""" + if not self.fs.lexists(path): + self.respond("550 No such file or directory.") + elif self.fs.realpath(path) == self.fs.realpath(self.fs.root): + self.respond("550 Can't rename home directory.") + else: + self._rnfr = path + self.respond("350 Ready for destination name.") + + def ftp_RNTO(self, path): + """Rename file (destination name only, source is specified with + RNFR). + On success return a (source_path, destination_path) tuple. + """ + if not self._rnfr: + self.respond("503 Bad sequence of commands: use RNFR first.") + return + src = self._rnfr + self._rnfr = None + try: + self.run_as_current_user(self.fs.rename, src, path) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond("250 Renaming ok.") + return (src, path) + + # --- others + def ftp_TYPE(self, line): + """Set current type data type to binary/ascii""" + type = line.upper().replace(' ', '') + if type in ("A", "L7"): + self.respond("200 Type set to: ASCII.") + self._current_type = 'a' + elif type in ("I", "L8"): + self.respond("200 Type set to: Binary.") + self._current_type = 'i' + else: + self.respond('504 Unsupported type "%s".' % line) + + def ftp_STRU(self, line): + """Set file structure ("F" is the only one supported (noop)).""" + stru = line.upper() + if stru == 'F': + self.respond('200 File transfer structure set to: F.') + elif stru in ('P', 'R'): + # R is required in minimum implementations by RFC-959, 5.1. + # RFC-1123, 4.1.2.13, amends this to only apply to servers + # whose file systems support record structures, but also + # suggests that such a server "may still accept files with + # STRU R, recording the byte stream literally". + # Should we accept R but with no operational difference from + # F? proftpd and wu-ftpd don't accept STRU R. We just do + # the same. + # + # RFC-1123 recommends against implementing P. + self.respond('504 Unimplemented STRU type.') + else: + self.respond('501 Unrecognized STRU type.') + + def ftp_MODE(self, line): + """Set data transfer mode ("S" is the only one supported (noop)).""" + mode = line.upper() + if mode == 'S': + self.respond('200 Transfer mode set to: S') + elif mode in ('B', 'C'): + self.respond('504 Unimplemented MODE type.') + else: + self.respond('501 Unrecognized MODE type.') + + def ftp_STAT(self, path): + """Return statistics about current ftp session. If an argument + is provided return directory listing over command channel. + + Implementation note: + + RFC-959 does not explicitly mention globbing but many FTP + servers do support it as a measure of convenience for FTP + clients and users. + + In order to search for and match the given globbing expression, + the code has to search (possibly) many directories, examine + each contained filename, and build a list of matching files in + memory. Since this operation can be quite intensive, both CPU- + and memory-wise, we do not support globbing. + """ + # return STATus information about ftpd + if not path: + s = [] + s.append('Connected to: %s:%s' % self.socket.getsockname()[:2]) + if self.authenticated: + s.append('Logged in as: %s' % self.username) + else: + if not self.username: + s.append("Waiting for username.") + else: + s.append("Waiting for password.") + if self._current_type == 'a': + type = 'ASCII' + else: + type = 'Binary' + s.append("TYPE: %s; STRUcture: File; MODE: Stream" % type) + if self._dtp_acceptor is not None: + s.append('Passive data channel waiting for connection.') + elif self.data_channel is not None: + bytes_sent = self.data_channel.tot_bytes_sent + bytes_recv = self.data_channel.tot_bytes_received + elapsed_time = self.data_channel.get_elapsed_time() + s.append('Data connection open:') + s.append('Total bytes sent: %s' % bytes_sent) + s.append('Total bytes received: %s' % bytes_recv) + s.append('Transfer elapsed time: %s secs' % elapsed_time) + else: + s.append('Data connection closed.') + + self.push('211-FTP server status:\r\n') + self.push(''.join([' %s\r\n' % item for item in s])) + self.respond('211 End of status.') + # return directory LISTing over the command channel + else: + line = self.fs.fs2ftp(path) + try: + isdir = self.fs.isdir(path) + if isdir: + listing = self.run_as_current_user(self.fs.listdir, path) + if isinstance(listing, list): + try: + # RFC 959 recommends the listing to be sorted. + listing.sort() + except UnicodeDecodeError: + # (Python 2 only) might happen on filesystem not + # supporting UTF8 meaning os.listdir() returned a + # list of mixed bytes and unicode strings: + # http://goo.gl/6DLHD + # http://bugs.python.org/issue683592 + pass + iterator = self.fs.format_list(path, listing) + else: + basedir, filename = os.path.split(path) + self.fs.lstat(path) # raise exc in case of problems + iterator = self.fs.format_list(basedir, [filename]) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.push('213-Status of "%s":\r\n' % line) + self.push_with_producer(BufferedIteratorProducer(iterator)) + self.respond('213 End of status.') + return path + + def ftp_FEAT(self, line): + """List all new features supported as defined in RFC-2398.""" + features = set(['UTF8', 'TVFS']) + features.update([feat for feat in ('EPRT', 'EPSV', 'MDTM', 'SIZE') + if feat in self.proto_cmds]) + features.update(self._extra_feats) + if 'MLST' in self.proto_cmds or 'MLSD' in self.proto_cmds: + facts = '' + for fact in self._available_facts: + if fact in self._current_facts: + facts += fact + '*;' + else: + facts += fact + ';' + features.add('MLST ' + facts) + if 'REST' in self.proto_cmds: + features.add('REST STREAM') + features = sorted(features) + self.push("211-Features supported:\r\n") + self.push("".join([" %s\r\n" % x for x in features])) + self.respond('211 End FEAT.') + + def ftp_OPTS(self, line): + """Specify options for FTP commands as specified in RFC-2389.""" + try: + if line.count(' ') > 1: + raise ValueError('Invalid number of arguments') + if ' ' in line: + cmd, arg = line.split(' ') + if ';' not in arg: + raise ValueError('Invalid argument') + else: + cmd, arg = line, '' + # actually the only command able to accept options is MLST + if cmd.upper() != 'MLST' or 'MLST' not in self.proto_cmds: + raise ValueError('Unsupported command "%s"' % cmd) + except ValueError as err: + self.respond('501 %s.' % err) + else: + facts = [x.lower() for x in arg.split(';')] + self._current_facts = \ + [x for x in facts if x in self._available_facts] + f = ''.join([x + ';' for x in self._current_facts]) + self.respond('200 MLST OPTS ' + f) + + def ftp_NOOP(self, line): + """Do nothing.""" + self.respond("200 I successfully done nothin'.") + + def ftp_SYST(self, line): + """Return system type (always returns UNIX type: L8).""" + # This command is used to find out the type of operating system + # at the server. The reply shall have as its first word one of + # the system names listed in RFC-943. + # Since that we always return a "/bin/ls -lA"-like output on + # LIST we prefer to respond as if we would on Unix in any case. + self.respond("215 UNIX Type: L8") + + def ftp_ALLO(self, line): + """Allocate bytes for storage (noop).""" + # not necessary (always respond with 202) + self.respond("202 No storage allocation necessary.") + + def ftp_HELP(self, line): + """Return help text to the client.""" + if line: + line = line.upper() + if line in self.proto_cmds: + self.respond("214 %s" % self.proto_cmds[line]['help']) + else: + self.respond("501 Unrecognized command.") + else: + # provide a compact list of recognized commands + def formatted_help(): + cmds = [] + keys = sorted([x for x in self.proto_cmds.keys() + if not x.startswith('SITE ')]) + while keys: + elems = tuple((keys[0:8])) + cmds.append(' %-6s' * len(elems) % elems + '\r\n') + del keys[0:8] + return ''.join(cmds) + + self.push("214-The following commands are recognized:\r\n") + self.push(formatted_help()) + self.respond("214 Help command successful.") + + # --- site commands + + # The user willing to add support for a specific SITE command must + # update self.proto_cmds dictionary and define a new ftp_SITE_%CMD% + # method in the subclass. + + def ftp_SITE_CHMOD(self, path, mode): + """Change file mode. + On success return a (file_path, mode) tuple. + """ + # Note: although most UNIX servers implement it, SITE CHMOD is not + # defined in any official RFC. + try: + assert len(mode) in (3, 4) + for x in mode: + assert 0 <= int(x) <= 7 + mode = int(mode, 8) + except (AssertionError, ValueError): + self.respond("501 Invalid SITE CHMOD format.") + else: + try: + self.run_as_current_user(self.fs.chmod, path, mode) + except (OSError, FilesystemError) as err: + why = _strerror(err) + self.respond('550 %s.' % why) + else: + self.respond('200 SITE CHMOD successful.') + return (path, mode) + + def ftp_SITE_HELP(self, line): + """Return help text to the client for a given SITE command.""" + if line: + line = line.upper() + if line in self.proto_cmds: + self.respond("214 %s" % self.proto_cmds[line]['help']) + else: + self.respond("501 Unrecognized SITE command.") + else: + self.push("214-The following SITE commands are recognized:\r\n") + site_cmds = [] + for cmd in sorted(self.proto_cmds.keys()): + if cmd.startswith('SITE '): + site_cmds.append(' %s\r\n' % cmd[5:]) + self.push(''.join(site_cmds)) + self.respond("214 Help SITE command successful.") + + # --- support for deprecated cmds + + # RFC-1123 requires that the server treat XCUP, XCWD, XMKD, XPWD + # and XRMD commands as synonyms for CDUP, CWD, MKD, LIST and RMD. + # Such commands are obsoleted but some ftp clients (e.g. Windows + # ftp.exe) still use them. + + def ftp_XCUP(self, line): + "Change to the parent directory. Synonym for CDUP. Deprecated." + return self.ftp_CDUP(line) + + def ftp_XCWD(self, line): + "Change the current working directory. Synonym for CWD. Deprecated." + return self.ftp_CWD(line) + + def ftp_XMKD(self, line): + "Create the specified directory. Synonym for MKD. Deprecated." + return self.ftp_MKD(line) + + def ftp_XPWD(self, line): + "Return the current working directory. Synonym for PWD. Deprecated." + return self.ftp_PWD(line) + + def ftp_XRMD(self, line): + "Remove the specified directory. Synonym for RMD. Deprecated." + return self.ftp_RMD(line) + + +# =================================================================== +# --- FTP over SSL +# =================================================================== + + +if SSL is not None: + + class SSLConnection(_AsyncChatNewStyle): + """An AsyncChat subclass supporting TLS/SSL.""" + + _ssl_accepting = False + _ssl_established = False + _ssl_closing = False + _ssl_requested = False + + def __init__(self, *args, **kwargs): + super(SSLConnection, self).__init__(*args, **kwargs) + self._error = False + self._ssl_want_read = False + self._ssl_want_write = False + + def readable(self): + return self._ssl_want_read or \ + super(SSLConnection, self).readable() + + def writable(self): + return self._ssl_want_write or \ + super(SSLConnection, self).writable() + + def secure_connection(self, ssl_context): + """Secure the connection switching from plain-text to + SSL/TLS. + """ + debug("securing SSL connection", self) + self._ssl_requested = True + try: + self.socket = SSL.Connection(ssl_context, self.socket) + except socket.error as err: + # may happen in case the client connects/disconnects + # very quickly + debug( + "call: secure_connection(); can't secure SSL connection " + "%r; closing" % err, self) + self.close() + except ValueError: + # may happen in case the client connects/disconnects + # very quickly + if self.socket.fileno() == -1: + debug( + "ValueError and fd == -1 on secure_connection()", self) + return + raise + else: + self.socket.set_accept_state() + self._ssl_accepting = True + + @contextlib.contextmanager + def _handle_ssl_want_rw(self): + prev_row_pending = self._ssl_want_read or self._ssl_want_write + try: + yield + except SSL.WantReadError: + # we should never get here; it's just for extra safety + self._ssl_want_read = True + except SSL.WantWriteError: + # we should never get here; it's just for extra safety + self._ssl_want_write = True + + if self._ssl_want_read: + self.modify_ioloop_events( + self._wanted_io_events | self.ioloop.READ, logdebug=True) + elif self._ssl_want_write: + self.modify_ioloop_events( + self._wanted_io_events | self.ioloop.WRITE, logdebug=True) + else: + if prev_row_pending: + self.modify_ioloop_events(self._wanted_io_events) + + def _do_ssl_handshake(self): + self._ssl_accepting = True + self._ssl_want_read = False + self._ssl_want_write = False + try: + self.socket.do_handshake() + except SSL.WantReadError: + self._ssl_want_read = True + debug("call: _do_ssl_handshake, err: ssl-want-read", inst=self) + except SSL.WantWriteError: + self._ssl_want_write = True + debug("call: _do_ssl_handshake, err: ssl-want-write", + inst=self) + except SSL.SysCallError as err: + debug("call: _do_ssl_handshake, err: %r" % err, inst=self) + retval, desc = err.args + if (retval == -1 and desc == 'Unexpected EOF') or retval > 0: + return self.handle_close() + raise + except SSL.Error as err: + debug("call: _do_ssl_handshake, err: %r" % err, inst=self) + return self.handle_failed_ssl_handshake() + else: + debug("SSL connection established", self) + self._ssl_accepting = False + self._ssl_established = True + self.handle_ssl_established() + + def handle_ssl_established(self): + """Called when SSL handshake has completed.""" + pass + + def handle_ssl_shutdown(self): + """Called when SSL shutdown() has completed.""" + super(SSLConnection, self).close() + + def handle_failed_ssl_handshake(self): + raise NotImplementedError("must be implemented in subclass") + + def handle_read_event(self): + if not self._ssl_requested: + super(SSLConnection, self).handle_read_event() + else: + with self._handle_ssl_want_rw(): + self._ssl_want_read = False + if self._ssl_accepting: + self._do_ssl_handshake() + elif self._ssl_closing: + self._do_ssl_shutdown() + else: + super(SSLConnection, self).handle_read_event() + + def handle_write_event(self): + if not self._ssl_requested: + super(SSLConnection, self).handle_write_event() + else: + with self._handle_ssl_want_rw(): + self._ssl_want_write = False + if self._ssl_accepting: + self._do_ssl_handshake() + elif self._ssl_closing: + self._do_ssl_shutdown() + else: + super(SSLConnection, self).handle_write_event() + + def handle_error(self): + self._error = True + try: + raise + except Exception: + self.log_exception(self) + # when facing an unhandled exception in here it's better + # to rely on base class (FTPHandler or DTPHandler) + # close() method as it does not imply SSL shutdown logic + try: + super(SSLConnection, self).close() + except Exception: + logger.critical(traceback.format_exc()) + + def send(self, data): + if not isinstance(data, bytes): + data = bytes(data) + try: + return super(SSLConnection, self).send(data) + except SSL.WantReadError: + debug("call: send(), err: ssl-want-read", inst=self) + self._ssl_want_read = True + return 0 + except SSL.WantWriteError: + debug("call: send(), err: ssl-want-write", inst=self) + self._ssl_want_write = True + return 0 + except SSL.ZeroReturnError as err: + debug( + "call: send() -> shutdown(), err: zero-return", inst=self) + super(SSLConnection, self).handle_close() + return 0 + except SSL.SysCallError as err: + debug("call: send(), err: %r" % err, inst=self) + errnum, errstr = err.args + if errnum == errno.EWOULDBLOCK: + return 0 + elif (errnum in _ERRNOS_DISCONNECTED or + errstr == 'Unexpected EOF'): + super(SSLConnection, self).handle_close() + return 0 + else: + raise + + def recv(self, buffer_size): + try: + return super(SSLConnection, self).recv(buffer_size) + except SSL.WantReadError: + debug("call: recv(), err: ssl-want-read", inst=self) + self._ssl_want_read = True + raise RetryError + except SSL.WantWriteError: + debug("call: recv(), err: ssl-want-write", inst=self) + self._ssl_want_write = True + raise RetryError + except SSL.ZeroReturnError as err: + debug("call: recv() -> shutdown(), err: zero-return", + inst=self) + super(SSLConnection, self).handle_close() + return b'' + except SSL.SysCallError as err: + debug("call: recv(), err: %r" % err, inst=self) + errnum, errstr = err.args + if (errnum in _ERRNOS_DISCONNECTED or + errstr == 'Unexpected EOF'): + super(SSLConnection, self).handle_close() + return b'' + else: + raise + + def _do_ssl_shutdown(self): + """Executes a SSL_shutdown() call to revert the connection + back to clear-text. + twisted/internet/tcp.py code has been used as an example. + """ + self._ssl_closing = True + if os.name == 'posix': + # since SSL_shutdown() doesn't report errors, an empty + # write call is done first, to try to detect if the + # connection has gone away + try: + os.write(self.socket.fileno(), b'') + except (OSError, socket.error) as err: + debug( + "call: _do_ssl_shutdown() -> os.write, err: %r" % err, + inst=self) + if err.errno in (errno.EINTR, errno.EWOULDBLOCK, + errno.ENOBUFS): + return + elif err.errno in _ERRNOS_DISCONNECTED: + return super(SSLConnection, self).close() + else: + raise + # Ok, this a mess, but the underlying OpenSSL API simply + # *SUCKS* and I really couldn't do any better. + # + # Here we just want to shutdown() the SSL layer and then + # close() the connection so we're not interested in a + # complete SSL shutdown() handshake, so let's pretend + # we already received a "RECEIVED" shutdown notification + # from the client. + # Once the client received our "SENT" shutdown notification + # then we close() the connection. + # + # Since it is not clear what errors to expect during the + # entire procedure we catch them all and assume the + # following: + # - WantReadError and WantWriteError means "retry" + # - ZeroReturnError, SysCallError[EOF], Error[] are all + # aliases for disconnection + try: + laststate = self.socket.get_shutdown() + self.socket.set_shutdown(laststate | SSL.RECEIVED_SHUTDOWN) + done = self.socket.shutdown() + if not (laststate & SSL.RECEIVED_SHUTDOWN): + self.socket.set_shutdown(SSL.SENT_SHUTDOWN) + except SSL.WantReadError: + self._ssl_want_read = True + debug("call: _do_ssl_shutdown, err: ssl-want-read", inst=self) + except SSL.WantWriteError: + self._ssl_want_write = True + debug("call: _do_ssl_shutdown, err: ssl-want-write", inst=self) + except SSL.ZeroReturnError as err: + debug( + "call: _do_ssl_shutdown() -> shutdown(), err: zero-return", + inst=self) + super(SSLConnection, self).close() + except SSL.SysCallError as err: + debug("call: _do_ssl_shutdown() -> shutdown(), err: %r" % err, + inst=self) + errnum, errstr = err.args + if (errnum in _ERRNOS_DISCONNECTED or + errstr == 'Unexpected EOF'): + super(SSLConnection, self).close() + else: + raise + except SSL.Error as err: + debug("call: _do_ssl_shutdown() -> shutdown(), err: %r" % err, + inst=self) + # see: + # https://github.com/giampaolo/pyftpdlib/issues/171 + # https://bugs.launchpad.net/pyopenssl/+bug/785985 + if err.args and not getattr(err, "errno", None): + pass + else: + raise + except socket.error as err: + debug("call: _do_ssl_shutdown() -> shutdown(), err: %r" % err, + inst=self) + if err.errno in _ERRNOS_DISCONNECTED: + super(SSLConnection, self).close() + else: + raise + else: + if done: + debug("call: _do_ssl_shutdown(), shutdown completed", + inst=self) + self._ssl_established = False + self._ssl_closing = False + self.handle_ssl_shutdown() + else: + debug( + "call: _do_ssl_shutdown(), shutdown not completed yet", + inst=self) + + def close(self): + if self._ssl_established and not self._error: + self._do_ssl_shutdown() + else: + self._ssl_accepting = False + self._ssl_established = False + self._ssl_closing = False + super(SSLConnection, self).close() + + class TLS_DTPHandler(SSLConnection, DTPHandler): + """A DTPHandler subclass supporting TLS/SSL.""" + + def __init__(self, sock, cmd_channel): + super(TLS_DTPHandler, self).__init__(sock, cmd_channel) + if self.cmd_channel._prot: + self.secure_connection(self.cmd_channel.ssl_context) + + def __repr__(self): + return DTPHandler.__repr__(self) + + def use_sendfile(self): + if isinstance(self.socket, SSL.Connection): + return False + else: + return super(TLS_DTPHandler, self).use_sendfile() + + def handle_failed_ssl_handshake(self): + # TLS/SSL handshake failure, probably client's fault which + # used a SSL version different from server's. + # RFC-4217, chapter 10.2 expects us to return 522 over the + # command channel. + self.cmd_channel.respond("522 SSL handshake failed.") + self.cmd_channel.log_cmd("PROT", "P", 522, "SSL handshake failed.") + self.close() + + class TLS_FTPHandler(SSLConnection, FTPHandler): + """A FTPHandler subclass supporting TLS/SSL. + Implements AUTH, PBSZ and PROT commands (RFC-2228 and RFC-4217). + + Configurable attributes: + + - (bool) tls_control_required: + When True requires SSL/TLS to be established on the control + channel, before logging in. This means the user will have + to issue AUTH before USER/PASS (default False). + + - (bool) tls_data_required: + When True requires SSL/TLS to be established on the data + channel. This means the user will have to issue PROT + before PASV or PORT (default False). + + SSL-specific options: + + - (string) certfile: + the path to the file which contains a certificate to be + used to identify the local side of the connection. + This must always be specified, unless context is provided + instead. + + - (string) keyfile: + the path to the file containing the private RSA key; + can be omitted if certfile already contains the private + key (defaults: None). + + - (int) ssl_protocol: + the desired SSL protocol version to use. This defaults to + PROTOCOL_SSLv23 which will negotiate the highest protocol + that both the server and your installation of OpenSSL + support. + + - (int) ssl_options: + specific OpenSSL options. These default to: + SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3| SSL.OP_NO_COMPRESSION + which are all considered insecure features. + Can be set to None in order to improve compatibilty with + older (insecure) FTP clients. + + - (instance) ssl_context: + a SSL Context object previously configured; if specified + all other parameters will be ignored. + (default None). + """ + + # configurable attributes + tls_control_required = False + tls_data_required = False + certfile = None + keyfile = None + ssl_protocol = SSL.SSLv23_METHOD + # - SSLv2 is easily broken and is considered harmful and dangerous + # - SSLv3 has several problems and is now dangerous + # - Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (see https://github.com/shazow/urllib3/pull/309) + ssl_options = SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 + if hasattr(SSL, "OP_NO_COMPRESSION"): + ssl_options |= SSL.OP_NO_COMPRESSION + ssl_context = None + + # overridden attributes + dtp_handler = TLS_DTPHandler + proto_cmds = FTPHandler.proto_cmds.copy() + proto_cmds.update({ + 'AUTH': dict( + perm=None, auth=False, arg=True, + help='Syntax: AUTH TLS|SSL (set up secure control ' + 'channel).'), + 'PBSZ': dict( + perm=None, auth=False, arg=True, + help='Syntax: PBSZ 0 (negotiate TLS buffer).'), + 'PROT': dict( + perm=None, auth=False, arg=True, + help='Syntax: PROT [C|P] (set up un/secure data ' + 'channel).'), + }) + + def __init__(self, conn, server, ioloop=None): + super(TLS_FTPHandler, self).__init__(conn, server, ioloop) + if not self.connected: + return + self._extra_feats = ['AUTH TLS', 'AUTH SSL', 'PBSZ', 'PROT'] + self._pbsz = False + self._prot = False + self.ssl_context = self.get_ssl_context() + + def __repr__(self): + return FTPHandler.__repr__(self) + + @classmethod + def get_ssl_context(cls): + if cls.ssl_context is None: + if cls.certfile is None: + raise ValueError("at least certfile must be specified") + cls.ssl_context = SSL.Context(cls.ssl_protocol) + if cls.ssl_protocol != SSL.SSLv2_METHOD: + cls.ssl_context.set_options(SSL.OP_NO_SSLv2) + else: + warnings.warn("SSLv2 protocol is insecure", RuntimeWarning) + cls.ssl_context.use_certificate_chain_file(cls.certfile) + if not cls.keyfile: + cls.keyfile = cls.certfile + cls.ssl_context.use_privatekey_file(cls.keyfile) + if cls.ssl_options: + cls.ssl_context.set_options(cls.ssl_options) + return cls.ssl_context + + # --- overridden methods + + def flush_account(self): + FTPHandler.flush_account(self) + self._pbsz = False + self._prot = False + + def process_command(self, cmd, *args, **kwargs): + if cmd in ('USER', 'PASS'): + if self.tls_control_required and not self._ssl_established: + msg = "SSL/TLS required on the control channel." + self.respond("550 " + msg) + self.log_cmd(cmd, args[0], 550, msg) + return + elif cmd in ('PASV', 'EPSV', 'PORT', 'EPRT'): + if self.tls_data_required and not self._prot: + msg = "SSL/TLS required on the data channel." + self.respond("550 " + msg) + self.log_cmd(cmd, args[0], 550, msg) + return + FTPHandler.process_command(self, cmd, *args, **kwargs) + + # --- new methods + + def handle_failed_ssl_handshake(self): + # TLS/SSL handshake failure, probably client's fault which + # used a SSL version different from server's. + # We can't rely on the control connection anymore so we just + # disconnect the client without sending any response. + self.log("SSL handshake failed.") + self.close() + + def ftp_AUTH(self, line): + """Set up secure control channel.""" + arg = line.upper() + if isinstance(self.socket, SSL.Connection): + self.respond("503 Already using TLS.") + elif arg in ('TLS', 'TLS-C', 'SSL', 'TLS-P'): + # From RFC-4217: "As the SSL/TLS protocols self-negotiate + # their levels, there is no need to distinguish between SSL + # and TLS in the application layer". + self.respond('234 AUTH %s successful.' % arg) + self.secure_connection(self.ssl_context) + else: + self.respond( + "502 Unrecognized encryption type (use TLS or SSL).") + + def ftp_PBSZ(self, line): + """Negotiate size of buffer for secure data transfer. + For TLS/SSL the only valid value for the parameter is '0'. + Any other value is accepted but ignored. + """ + if not isinstance(self.socket, SSL.Connection): + self.respond( + "503 PBSZ not allowed on insecure control connection.") + else: + self.respond('200 PBSZ=0 successful.') + self._pbsz = True + + def ftp_PROT(self, line): + """Setup un/secure data channel.""" + arg = line.upper() + if not isinstance(self.socket, SSL.Connection): + self.respond( + "503 PROT not allowed on insecure control connection.") + elif not self._pbsz: + self.respond( + "503 You must issue the PBSZ command prior to PROT.") + elif arg == 'C': + self.respond('200 Protection set to Clear') + self._prot = False + elif arg == 'P': + self.respond('200 Protection set to Private') + self._prot = True + elif arg in ('S', 'E'): + self.respond('521 PROT %s unsupported (use C or P).' % arg) + else: + self.respond("502 Unrecognized PROT type (use C or P).") diff --git a/ftp_server/pyftpdlib/ioloop.py b/ftp_server/pyftpdlib/ioloop.py new file mode 100644 index 00000000..0804ad2c --- /dev/null +++ b/ftp_server/pyftpdlib/ioloop.py @@ -0,0 +1,1059 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +""" +A specialized IO loop on top of asyncore adding support for epoll() +on Linux and kqueue() and OSX/BSD, dramatically increasing performances +offered by base asyncore module. + +poll() and select() loops are also reimplemented and are an order of +magnitude faster as they support fd un/registration and modification. + +This module is not supposed to be used directly unless you want to +include a new dispatcher which runs within the main FTP server loop, +in which case: + __________________________________________________________________ + | | | + | INSTEAD OF | ...USE: | + |______________________|___________________________________________| + | | | + | asyncore.dispacher | Acceptor (for servers) | + | asyncore.dispacher | Connector (for clients) | + | asynchat.async_chat | AsyncChat (for a full duplex connection ) | + | asyncore.loop | FTPServer.server_forever() | + |______________________|___________________________________________| + +asyncore.dispatcher_with_send is not supported, same for "map" argument +for asyncore.loop and asyncore.dispatcher and asynchat.async_chat +constructors. + +Follows a server example: + +import socket +from pyftpdlib.ioloop import IOLoop, Acceptor, AsyncChat + +class Handler(AsyncChat): + + def __init__(self, sock): + AsyncChat.__init__(self, sock) + self.push('200 hello\r\n') + self.close_when_done() + +class Server(Acceptor): + + def __init__(self, host, port): + Acceptor.__init__(self) + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.set_reuse_addr() + self.bind((host, port)) + self.listen(5) + + def handle_accepted(self, sock, addr): + Handler(sock) + +server = Server('localhost', 8021) +IOLoop.instance().loop() +""" + +import asynchat +import asyncore +import errno +import heapq +import os +import select +import socket +import sys +import time +import traceback +try: + import threading +except ImportError: + import dummy_threading as threading + +from ._compat import callable +from .log import config_logging +from .log import debug +from .log import is_logging_configured +from .log import logger + + +timer = getattr(time, 'monotonic', time.time) +_read = asyncore.read +_write = asyncore.write + +# These errnos indicate that a connection has been abruptly terminated. +_ERRNOS_DISCONNECTED = set(( + errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN, errno.ECONNABORTED, + errno.EPIPE, errno.EBADF, errno.ETIMEDOUT)) +if hasattr(errno, "WSAECONNRESET"): + _ERRNOS_DISCONNECTED.add(errno.WSAECONNRESET) +if hasattr(errno, "WSAECONNABORTED"): + _ERRNOS_DISCONNECTED.add(errno.WSAECONNABORTED) + +# These errnos indicate that a non-blocking operation must be retried +# at a later time. +_ERRNOS_RETRY = set((errno.EAGAIN, errno.EWOULDBLOCK)) +if hasattr(errno, "WSAEWOULDBLOCK"): + _ERRNOS_RETRY.add(errno.WSAEWOULDBLOCK) + + +class RetryError(Exception): + pass + + +# =================================================================== +# --- scheduler +# =================================================================== + +class _Scheduler(object): + """Run the scheduled functions due to expire soonest (if any).""" + + def __init__(self): + # the heap used for the scheduled tasks + self._tasks = [] + self._cancellations = 0 + + def poll(self): + """Run the scheduled functions due to expire soonest and + return the timeout of the next one (if any, else None). + """ + now = timer() + calls = [] + while self._tasks: + if now < self._tasks[0].timeout: + break + call = heapq.heappop(self._tasks) + if call.cancelled: + self._cancellations -= 1 + else: + calls.append(call) + + for call in calls: + if call._repush: + heapq.heappush(self._tasks, call) + call._repush = False + continue + try: + call.call() + except Exception: + logger.error(traceback.format_exc()) + + # remove cancelled tasks and re-heapify the queue if the + # number of cancelled tasks is more than the half of the + # entire queue + if (self._cancellations > 512 and + self._cancellations > (len(self._tasks) >> 1)): + debug("re-heapifying %s cancelled tasks" % self._cancellations) + self.reheapify() + + try: + return max(0, self._tasks[0].timeout - now) + except IndexError: + pass + + def register(self, what): + """Register a _CallLater instance.""" + heapq.heappush(self._tasks, what) + + def unregister(self, what): + """Unregister a _CallLater instance. + The actual unregistration will happen at a later time though. + """ + self._cancellations += 1 + + def reheapify(self): + """Get rid of cancelled calls and reinitialize the internal heap.""" + self._cancellations = 0 + self._tasks = [x for x in self._tasks if not x.cancelled] + heapq.heapify(self._tasks) + + +class _CallLater(object): + """Container object which instance is returned by ioloop.call_later().""" + + __slots__ = ('_delay', '_target', '_args', '_kwargs', '_errback', '_sched', + '_repush', 'timeout', 'cancelled') + + def __init__(self, seconds, target, *args, **kwargs): + assert callable(target), "%s is not callable" % target + assert sys.maxsize >= seconds >= 0, \ + "%s is not greater than or equal to 0 seconds" % seconds + self._delay = seconds + self._target = target + self._args = args + self._kwargs = kwargs + self._errback = kwargs.pop('_errback', None) + self._sched = kwargs.pop('_scheduler') + self._repush = False + # seconds from the epoch at which to call the function + if not seconds: + self.timeout = 0 + else: + self.timeout = timer() + self._delay + self.cancelled = False + self._sched.register(self) + + def __lt__(self, other): + return self.timeout < other.timeout + + def __le__(self, other): + return self.timeout <= other.timeout + + def __repr__(self): + if self._target is None: + sig = object.__repr__(self) + else: + sig = repr(self._target) + sig += ' args=%s, kwargs=%s, cancelled=%s, secs=%s' % ( + self._args or '[]', self._kwargs or '{}', self.cancelled, + self._delay) + return '<%s>' % sig + + __str__ = __repr__ + + def _post_call(self, exc): + if not self.cancelled: + self.cancel() + + def call(self): + """Call this scheduled function.""" + assert not self.cancelled, "already cancelled" + exc = None + try: + self._target(*self._args, **self._kwargs) + except Exception as _: + exc = _ + if self._errback is not None: + self._errback() + else: + raise + finally: + self._post_call(exc) + + def reset(self): + """Reschedule this call resetting the current countdown.""" + assert not self.cancelled, "already cancelled" + self.timeout = timer() + self._delay + self._repush = True + + def cancel(self): + """Unschedule this call.""" + if not self.cancelled: + self.cancelled = True + self._target = self._args = self._kwargs = self._errback = None + self._sched.unregister(self) + + +class _CallEvery(_CallLater): + """Container object which instance is returned by IOLoop.call_every().""" + + def _post_call(self, exc): + if not self.cancelled: + if exc: + self.cancel() + else: + self.timeout = timer() + self._delay + self._sched.register(self) + + +class _IOLoop(object): + """Base class which will later be referred as IOLoop.""" + + READ = 1 + WRITE = 2 + _instance = None + _lock = threading.Lock() + _started_once = False + + def __init__(self): + self.socket_map = {} + self.sched = _Scheduler() + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __repr__(self): + status = [self.__class__.__module__ + "." + self.__class__.__name__] + status.append("(fds=%s, tasks=%s)" % ( + len(self.socket_map), len(self.sched._tasks))) + return '<%s at %#x>' % (' '.join(status), id(self)) + + __str__ = __repr__ + + @classmethod + def instance(cls): + """Return a global IOLoop instance.""" + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def register(self, fd, instance, events): + """Register a fd, handled by instance for the given events.""" + raise NotImplementedError('must be implemented in subclass') + + def unregister(self, fd): + """Register fd.""" + raise NotImplementedError('must be implemented in subclass') + + def modify(self, fd, events): + """Changes the events assigned for fd.""" + raise NotImplementedError('must be implemented in subclass') + + def poll(self, timeout): + """Poll once. The subclass overriding this method is supposed + to poll over the registered handlers and the scheduled functions + and then return. + """ + raise NotImplementedError('must be implemented in subclass') + + def loop(self, timeout=None, blocking=True): + """Start the asynchronous IO loop. + + - (float) timeout: the timeout passed to the underlying + multiplex syscall (select(), epoll() etc.). + + - (bool) blocking: if True poll repeatedly, as long as there + are registered handlers and/or scheduled functions. + If False poll only once and return the timeout of the next + scheduled call (if any, else None). + """ + if not _IOLoop._started_once: + _IOLoop._started_once = True + if not is_logging_configured(): + # If we get to this point it means the user hasn't + # configured logging. We want to log by default so + # we configure logging ourselves so that it will + # print to stderr. + config_logging() + + if blocking: + # localize variable access to minimize overhead + poll = self.poll + socket_map = self.socket_map + sched_poll = self.sched.poll + + if timeout is not None: + while socket_map: + poll(timeout) + sched_poll() + else: + soonest_timeout = None + while socket_map: + poll(soonest_timeout) + soonest_timeout = sched_poll() + else: + sched = self.sched + if self.socket_map: + self.poll(timeout) + if sched._tasks: + return sched.poll() + + def call_later(self, seconds, target, *args, **kwargs): + """Calls a function at a later time. + It can be used to asynchronously schedule a call within the polling + loop without blocking it. The instance returned is an object that + can be used to cancel or reschedule the call. + + - (int) seconds: the number of seconds to wait + - (obj) target: the callable object to call later + - args: the arguments to call it with + - kwargs: the keyword arguments to call it with; a special + '_errback' parameter can be passed: it is a callable + called in case target function raises an exception. + """ + kwargs['_scheduler'] = self.sched + return _CallLater(seconds, target, *args, **kwargs) + + def call_every(self, seconds, target, *args, **kwargs): + """Schedules the given callback to be called periodically.""" + kwargs['_scheduler'] = self.sched + return _CallEvery(seconds, target, *args, **kwargs) + + def close(self): + """Closes the IOLoop, freeing any resources used.""" + debug("closing IOLoop", self) + self.__class__._instance = None + + # free connections + instances = sorted(self.socket_map.values(), key=lambda x: x._fileno) + for inst in instances: + try: + inst.close() + except OSError as err: + if err.errno != errno.EBADF: + logger.error(traceback.format_exc()) + except Exception: + logger.error(traceback.format_exc()) + self.socket_map.clear() + + # free scheduled functions + for x in self.sched._tasks: + try: + if not x.cancelled: + x.cancel() + except Exception: + logger.error(traceback.format_exc()) + del self.sched._tasks[:] + + +# =================================================================== +# --- select() - POSIX / Windows +# =================================================================== + +class Select(_IOLoop): + """select()-based poller.""" + + def __init__(self): + _IOLoop.__init__(self) + self._r = [] + self._w = [] + + def register(self, fd, instance, events): + if fd not in self.socket_map: + self.socket_map[fd] = instance + if events & self.READ: + self._r.append(fd) + if events & self.WRITE: + self._w.append(fd) + + def unregister(self, fd): + try: + del self.socket_map[fd] + except KeyError: + debug("call: unregister(); fd was no longer in socket_map", self) + for l in (self._r, self._w): + try: + l.remove(fd) + except ValueError: + pass + + def modify(self, fd, events): + inst = self.socket_map.get(fd) + if inst is not None: + self.unregister(fd) + self.register(fd, inst, events) + else: + debug("call: modify(); fd was no longer in socket_map", self) + + def poll(self, timeout): + try: + r, w, e = select.select(self._r, self._w, [], timeout) + except select.error as err: + if getattr(err, "errno", None) == errno.EINTR: + return + raise + + smap_get = self.socket_map.get + for fd in r: + obj = smap_get(fd) + if obj is None or not obj.readable(): + continue + _read(obj) + for fd in w: + obj = smap_get(fd) + if obj is None or not obj.writable(): + continue + _write(obj) + + +# =================================================================== +# --- poll() / epoll() +# =================================================================== + +class _BasePollEpoll(_IOLoop): + """This is common to both poll() (UNIX), epoll() (Linux) and + /dev/poll (Solaris) implementations which share almost the same + interface. + Not supposed to be used directly. + """ + + def __init__(self): + _IOLoop.__init__(self) + self._poller = self._poller() + + def register(self, fd, instance, events): + try: + self._poller.register(fd, events) + except EnvironmentError as err: + if err.errno == errno.EEXIST: + debug("call: register(); poller raised EEXIST; ignored", self) + else: + raise + self.socket_map[fd] = instance + + def unregister(self, fd): + try: + del self.socket_map[fd] + except KeyError: + debug("call: unregister(); fd was no longer in socket_map", self) + else: + try: + self._poller.unregister(fd) + except EnvironmentError as err: + if err.errno in (errno.ENOENT, errno.EBADF): + debug("call: unregister(); poller returned %r; " + "ignoring it" % err, self) + else: + raise + + def modify(self, fd, events): + try: + self._poller.modify(fd, events) + except OSError as err: + if err.errno == errno.ENOENT and fd in self.socket_map: + # XXX - see: + # https://github.com/giampaolo/pyftpdlib/issues/329 + instance = self.socket_map[fd] + self.register(fd, instance, events) + else: + raise + + def poll(self, timeout): + try: + events = self._poller.poll(timeout or -1) # -1 waits indefinitely + except (IOError, select.error) as err: + # for epoll() and poll() respectively + if err.errno == errno.EINTR: + return + raise + # localize variable access to minimize overhead + smap_get = self.socket_map.get + for fd, event in events: + inst = smap_get(fd) + if inst is None: + continue + if event & self._ERROR and not event & self.READ: + inst.handle_close() + else: + if event & self.READ: + if inst.readable(): + _read(inst) + if event & self.WRITE: + if inst.writable(): + _write(inst) + + +# =================================================================== +# --- poll() - POSIX +# =================================================================== + +if hasattr(select, 'poll'): + + class Poll(_BasePollEpoll): + """poll() based poller.""" + + READ = select.POLLIN + WRITE = select.POLLOUT + _ERROR = select.POLLERR | select.POLLHUP | select.POLLNVAL + _poller = select.poll + + def modify(self, fd, events): + inst = self.socket_map[fd] + self.unregister(fd) + self.register(fd, inst, events) + + def poll(self, timeout): + # poll() timeout is expressed in milliseconds + if timeout is not None: + timeout = int(timeout * 1000) + _BasePollEpoll.poll(self, timeout) + + +# =================================================================== +# --- /dev/poll - Solaris (introduced in python 3.3) +# =================================================================== + +if hasattr(select, 'devpoll'): # pragma: no cover + + class DevPoll(_BasePollEpoll): + """/dev/poll based poller (introduced in python 3.3).""" + + READ = select.POLLIN + WRITE = select.POLLOUT + _ERROR = select.POLLERR | select.POLLHUP | select.POLLNVAL + _poller = select.devpoll + + # introduced in python 3.4 + if hasattr(select.devpoll, 'fileno'): + def fileno(self): + """Return devpoll() fd.""" + return self._poller.fileno() + + def modify(self, fd, events): + inst = self.socket_map[fd] + self.unregister(fd) + self.register(fd, inst, events) + + def poll(self, timeout): + # /dev/poll timeout is expressed in milliseconds + if timeout is not None: + timeout = int(timeout * 1000) + _BasePollEpoll.poll(self, timeout) + + # introduced in python 3.4 + if hasattr(select.devpoll, 'close'): + def close(self): + _IOLoop.close(self) + self._poller.close() + + +# =================================================================== +# --- epoll() - Linux +# =================================================================== + +if hasattr(select, 'epoll'): + + class Epoll(_BasePollEpoll): + """epoll() based poller.""" + + READ = select.EPOLLIN + WRITE = select.EPOLLOUT + _ERROR = select.EPOLLERR | select.EPOLLHUP + _poller = select.epoll + + def fileno(self): + """Return epoll() fd.""" + return self._poller.fileno() + + def close(self): + _IOLoop.close(self) + self._poller.close() + + +# =================================================================== +# --- kqueue() - BSD / OSX +# =================================================================== + +if hasattr(select, 'kqueue'): # pragma: no cover + + class Kqueue(_IOLoop): + """kqueue() based poller.""" + + def __init__(self): + _IOLoop.__init__(self) + self._kqueue = select.kqueue() + self._active = {} + + def fileno(self): + """Return kqueue() fd.""" + return self._kqueue.fileno() + + def close(self): + _IOLoop.close(self) + self._kqueue.close() + + def register(self, fd, instance, events): + self.socket_map[fd] = instance + try: + self._control(fd, events, select.KQ_EV_ADD) + except EnvironmentError as err: + if err.errno == errno.EEXIST: + debug("call: register(); poller raised EEXIST; ignored", + self) + else: + raise + self._active[fd] = events + + def unregister(self, fd): + try: + del self.socket_map[fd] + events = self._active.pop(fd) + except KeyError: + pass + else: + try: + self._control(fd, events, select.KQ_EV_DELETE) + except EnvironmentError as err: + if err.errno in (errno.ENOENT, errno.EBADF): + debug("call: unregister(); poller returned %r; " + "ignoring it" % err, self) + else: + raise + + def modify(self, fd, events): + instance = self.socket_map[fd] + self.unregister(fd) + self.register(fd, instance, events) + + def _control(self, fd, events, flags): + kevents = [] + if events & self.WRITE: + kevents.append(select.kevent( + fd, filter=select.KQ_FILTER_WRITE, flags=flags)) + if events & self.READ or not kevents: + # always read when there is not a write + kevents.append(select.kevent( + fd, filter=select.KQ_FILTER_READ, flags=flags)) + # even though control() takes a list, it seems to return + # EINVAL on Mac OS X (10.6) when there is more than one + # event in the list + for kevent in kevents: + self._kqueue.control([kevent], 0) + + # localize variable access to minimize overhead + def poll(self, + timeout, + _len=len, + _READ=select.KQ_FILTER_READ, + _WRITE=select.KQ_FILTER_WRITE, + _EOF=select.KQ_EV_EOF, + _ERROR=select.KQ_EV_ERROR): + try: + kevents = self._kqueue.control(None, _len(self.socket_map), + timeout) + except OSError as err: + if err.errno == errno.EINTR: + return + raise + for kevent in kevents: + inst = self.socket_map.get(kevent.ident) + if inst is None: + continue + if kevent.filter == _READ: + if inst.readable(): + _read(inst) + if kevent.filter == _WRITE: + if kevent.flags & _EOF: + # If an asynchronous connection is refused, + # kqueue returns a write event with the EOF + # flag set. + # Note that for read events, EOF may be returned + # before all data has been consumed from the + # socket buffer, so we only check for EOF on + # write events. + inst.handle_close() + else: + if inst.writable(): + _write(inst) + if kevent.flags & _ERROR: + inst.handle_close() + + +# =================================================================== +# --- choose the better poller for this platform +# =================================================================== + +if hasattr(select, 'epoll'): # epoll() - Linux + IOLoop = Epoll +elif hasattr(select, 'kqueue'): # kqueue() - BSD / OSX + IOLoop = Kqueue +elif hasattr(select, 'devpoll'): # /dev/poll - Solaris + IOLoop = DevPoll +elif hasattr(select, 'poll'): # poll() - POSIX + IOLoop = Poll +else: # select() - POSIX and Windows + IOLoop = Select + + +# =================================================================== +# --- asyncore dispatchers +# =================================================================== + +# these are overridden in order to register() and unregister() +# file descriptors against the new pollers + + +class AsyncChat(asynchat.async_chat): + """Same as asynchat.async_chat, only working with the new IO poller + and being more clever in avoid registering for read events when + it shouldn't. + """ + + def __init__(self, sock=None, ioloop=None): + self.ioloop = ioloop or IOLoop.instance() + self._wanted_io_events = self.ioloop.READ + self._current_io_events = self.ioloop.READ + self._closed = False + self._closing = False + self._fileno = sock.fileno() if sock else None + self._tasks = [] + asynchat.async_chat.__init__(self, sock) + + # --- IO loop related methods + + def add_channel(self, map=None, events=None): + assert self._fileno, repr(self._fileno) + events = events if events is not None else self.ioloop.READ + self.ioloop.register(self._fileno, self, events) + self._wanted_io_events = events + self._current_io_events = events + + def del_channel(self, map=None): + if self._fileno is not None: + self.ioloop.unregister(self._fileno) + + def modify_ioloop_events(self, events, logdebug=False): + if not self._closed: + assert self._fileno, repr(self._fileno) + if self._fileno not in self.ioloop.socket_map: + debug( + "call: modify_ioloop_events(), fd was no longer in " + "socket_map, had to register() it again", inst=self) + self.add_channel(events=events) + else: + if events != self._current_io_events: + if logdebug: + if events == self.ioloop.READ: + ev = "R" + elif events == self.ioloop.WRITE: + ev = "W" + elif events == self.ioloop.READ | self.ioloop.WRITE: + ev = "RW" + else: + ev = events + debug("call: IOLoop.modify(); setting %r IO events" % ( + ev), self) + self.ioloop.modify(self._fileno, events) + self._current_io_events = events + else: + debug( + "call: modify_ioloop_events(), handler had already been " + "close()d, skipping modify()", inst=self) + + # --- utils + + def call_later(self, seconds, target, *args, **kwargs): + """Same as self.ioloop.call_later but also cancel()s the + scheduled function on close(). + """ + if '_errback' not in kwargs and hasattr(self, 'handle_error'): + kwargs['_errback'] = self.handle_error + callback = self.ioloop.call_later(seconds, target, *args, **kwargs) + self._tasks.append(callback) + return callback + + # --- overridden asynchat methods + + def connect(self, addr): + self.modify_ioloop_events(self.ioloop.WRITE) + asynchat.async_chat.connect(self, addr) + + def connect_af_unspecified(self, addr, source_address=None): + """Same as connect() but guesses address family from addr. + Return the address family just determined. + """ + assert self.socket is None + host, port = addr + err = "getaddrinfo() returned an empty list" + info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + socket.SOCK_STREAM, 0, socket.AI_PASSIVE) + for res in info: + self.socket = None + af, socktype, proto, canonname, sa = res + try: + self.create_socket(af, socktype) + if source_address: + if source_address[0].startswith('::ffff:'): + # In this scenario, the server has an IPv6 socket, but + # the remote client is using IPv4 and its address is + # represented as an IPv4-mapped IPv6 address which + # looks like this ::ffff:151.12.5.65, see: + # http://en.wikipedia.org/wiki/IPv6\ + # IPv4-mapped_addresses + # http://tools.ietf.org/html/rfc3493.html#section-3.7 + # We truncate the first bytes to make it look like a + # common IPv4 address. + source_address = (source_address[0][7:], + source_address[1]) + self.bind(source_address) + self.connect((host, port)) + except socket.error as _: + err = _ + if self.socket is not None: + self.socket.close() + self.del_channel() + self.socket = None + continue + break + if self.socket is None: + self.del_channel() + raise socket.error(err) + return af + + # send() and recv() overridden as a fix around various bugs: + # - http://bugs.python.org/issue1736101 + # - https://github.com/giampaolo/pyftpdlib/issues/104 + # - https://github.com/giampaolo/pyftpdlib/issues/109 + + def send(self, data): + try: + return self.socket.send(data) + except socket.error as err: + debug("call: send(), err: %s" % err, inst=self) + if err.errno in _ERRNOS_RETRY: + return 0 + elif err.errno in _ERRNOS_DISCONNECTED: + self.handle_close() + return 0 + else: + raise + + def recv(self, buffer_size): + try: + data = self.socket.recv(buffer_size) + except socket.error as err: + debug("call: recv(), err: %s" % err, inst=self) + if err.errno in _ERRNOS_DISCONNECTED: + self.handle_close() + return b'' + elif err.errno in _ERRNOS_RETRY: + raise RetryError + else: + raise + else: + if not data: + # a closed connection is indicated by signaling + # a read condition, and having recv() return 0. + self.handle_close() + return b'' + else: + return data + + def handle_read(self): + try: + asynchat.async_chat.handle_read(self) + except RetryError: + # This can be raised by (the overridden) recv(). + pass + + def initiate_send(self): + asynchat.async_chat.initiate_send(self) + if not self._closed: + # if there's still data to send we want to be ready + # for writing, else we're only intereseted in reading + if not self.producer_fifo: + wanted = self.ioloop.READ + else: + # In FTPHandler, we also want to listen for user input + # hence the READ. DTPHandler has its own initiate_send() + # which will either READ or WRITE. + wanted = self.ioloop.READ | self.ioloop.WRITE + if self._wanted_io_events != wanted: + self.ioloop.modify(self._fileno, wanted) + self._wanted_io_events = wanted + else: + debug("call: initiate_send(); called with no connection", + inst=self) + + def close_when_done(self): + if len(self.producer_fifo) == 0: + self.handle_close() + else: + self._closing = True + asynchat.async_chat.close_when_done(self) + + def close(self): + if not self._closed: + self._closed = True + try: + asynchat.async_chat.close(self) + finally: + for fun in self._tasks: + try: + fun.cancel() + except Exception: + logger.error(traceback.format_exc()) + self._tasks = [] + self._closed = True + self._closing = False + self.connected = False + + +class Connector(AsyncChat): + """Same as base AsyncChat and supposed to be used for + clients. + """ + + def add_channel(self, map=None, events=None): + AsyncChat.add_channel(self, map=map, events=self.ioloop.WRITE) + + +class Acceptor(AsyncChat): + """Same as base AsyncChat and supposed to be used to + accept new connections. + """ + + def add_channel(self, map=None, events=None): + AsyncChat.add_channel(self, map=map, events=self.ioloop.READ) + + def bind_af_unspecified(self, addr): + """Same as bind() but guesses address family from addr. + Return the address family just determined. + """ + assert self.socket is None + host, port = addr + if host == "": + # When using bind() "" is a symbolic name meaning all + # available interfaces. People might not know we're + # using getaddrinfo() internally, which uses None + # instead of "", so we'll make the conversion for them. + host = None + err = "getaddrinfo() returned an empty list" + info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + socket.SOCK_STREAM, 0, socket.AI_PASSIVE) + for res in info: + self.socket = None + self.del_channel() + af, socktype, proto, canonname, sa = res + try: + self.create_socket(af, socktype) + self.set_reuse_addr() + self.bind(sa) + except socket.error as _: + err = _ + if self.socket is not None: + self.socket.close() + self.del_channel() + self.socket = None + continue + break + if self.socket is None: + self.del_channel() + raise socket.error(err) + return af + + def listen(self, num): + AsyncChat.listen(self, num) + # XXX - this seems to be necessary, otherwise kqueue.control() + # won't return listening fd events + try: + if isinstance(self.ioloop, Kqueue): + self.ioloop.modify(self._fileno, self.ioloop.READ) + except NameError: + pass + + def handle_accept(self): + try: + sock, addr = self.accept() + except TypeError: + # sometimes accept() might return None, see: + # https://github.com/giampaolo/pyftpdlib/issues/91 + debug("call: handle_accept(); accept() returned None", self) + return + except socket.error as err: + # ECONNABORTED might be thrown on *BSD, see: + # https://github.com/giampaolo/pyftpdlib/issues/105 + if err.errno != errno.ECONNABORTED: + raise + else: + debug("call: handle_accept(); accept() returned ECONNABORTED", + self) + else: + # sometimes addr == None instead of (ip, port) (see issue 104) + if addr is not None: + self.handle_accepted(sock, addr) + + def handle_accepted(self, sock, addr): + sock.close() + self.log_info('unhandled accepted event', 'warning') + + # overridden for convenience; avoid to reuse address on Windows + if (os.name in ('nt', 'ce')) or (sys.platform == 'cygwin'): + def set_reuse_addr(self): + pass diff --git a/ftp_server/pyftpdlib/log.py b/ftp_server/pyftpdlib/log.py new file mode 100644 index 00000000..1958a662 --- /dev/null +++ b/ftp_server/pyftpdlib/log.py @@ -0,0 +1,159 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +""" +Logging support for pyftpdlib, inspired from Tornado's +(http://www.tornadoweb.org/). + +This is not supposed to be imported/used directly. +Instead you should use logging.basicConfig before serve_forever(). +""" + +import logging +import sys +import time +try: + import curses +except ImportError: + curses = None + +from ._compat import unicode + + +# default logger +logger = logging.getLogger('pyftpdlib') + + +def _stderr_supports_color(): + color = False + if curses is not None and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +# configurable options +LEVEL = logging.INFO +PREFIX = '[%(levelname)1.1s %(asctime)s]' +COLOURED = _stderr_supports_color() +TIME_FORMAT = "%Y-%m-%d %H:%M:%S" + + +# taken and adapted from Tornado +class LogFormatter(logging.Formatter): + """Log formatter used in pyftpdlib. + Key features of this formatter are: + + * Color support when logging to a terminal that supports it. + * Timestamps on every log line. + * Robust against str/bytes encoding problems. + """ + + def __init__(self, *args, **kwargs): + logging.Formatter.__init__(self, *args, **kwargs) + self._coloured = COLOURED and _stderr_supports_color() + if self._coloured: + curses.setupterm() + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or curses.tigetstr("setf") or + "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = unicode(fg_color, "ascii") + self._colors = { + # blues + logging.DEBUG: unicode(curses.tparm(fg_color, 4), "ascii"), + # green + logging.INFO: unicode(curses.tparm(fg_color, 2), "ascii"), + # yellow + logging.WARNING: unicode(curses.tparm(fg_color, 3), "ascii"), + # red + logging.ERROR: unicode(curses.tparm(fg_color, 1), "ascii") + } + self._normal = unicode(curses.tigetstr("sgr0"), "ascii") + + def format(self, record): + try: + record.message = record.getMessage() + except Exception as err: + record.message = "Bad message (%r): %r" % (err, record.__dict__) + + record.asctime = time.strftime(TIME_FORMAT, + self.converter(record.created)) + prefix = PREFIX % record.__dict__ + if self._coloured: + prefix = (self._colors.get(record.levelno, self._normal) + + prefix + self._normal) + + # Encoding notes: The logging module prefers to work with character + # strings, but only enforces that log messages are instances of + # basestring. In python 2, non-ascii bytestrings will make + # their way through the logging framework until they blow up with + # an unhelpful decoding error (with this formatter it happens + # when we attach the prefix, but there are other opportunities for + # exceptions further along in the framework). + # + # If a byte string makes it this far, convert it to unicode to + # ensure it will make it out to the logs. Use repr() as a fallback + # to ensure that all byte strings can be converted successfully, + # but don't do it by default so we don't add extra quotes to ascii + # bytestrings. This is a bit of a hacky place to do this, but + # it's worth it since the encoding errors that would otherwise + # result are so useless (and tornado is fond of using utf8-encoded + # byte strings wherever possible). + try: + message = unicode(record.message) + except UnicodeDecodeError: + message = repr(record.message) + + formatted = prefix + " " + message + if record.exc_info: + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + if record.exc_text: + formatted = formatted.rstrip() + "\n" + record.exc_text + return formatted.replace("\n", "\n ") + + +def debug(s, inst=None): + s = "[debug] " + s + if inst is not None: + s += " (%r)" % inst + logger.debug(s) + + +def is_logging_configured(): + if logging.getLogger('pyftpdlib').handlers: + return True + if logging.root.handlers: + return True + return False + + +# TODO: write tests +def config_logging(level=LEVEL, prefix=PREFIX, other_loggers=None): + # Little speed up + if "%(process)d" not in prefix: + logging.logProcesses = False + if "%(processName)s" not in prefix: + logging.logMultiprocessing = False + if "%(thread)d" not in prefix and "%(threadName)s" not in prefix: + logging.logThreads = False + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + loggers = [logging.getLogger('pyftpdlib')] + if other_loggers is not None: + loggers.extend(other_loggers) + for logger in loggers: + logger.setLevel(level) + logger.addHandler(handler) diff --git a/ftp_server/pyftpdlib/servers.py b/ftp_server/pyftpdlib/servers.py new file mode 100644 index 00000000..e703af3f --- /dev/null +++ b/ftp_server/pyftpdlib/servers.py @@ -0,0 +1,537 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +""" +This module contains the main FTPServer class which listens on a +host:port and dispatches the incoming connections to a handler. +The concurrency is handled asynchronously by the main process thread, +meaning the handler cannot block otherwise the whole server will hang. + +Other than that we have 2 subclasses changing the asynchronous concurrency +model using multiple threads or processes. + +You might be interested in these in case your code contains blocking +parts which cannot be adapted to the base async model or if the +underlying filesystem is particularly slow, see: + +https://github.com/giampaolo/pyftpdlib/issues/197 +https://github.com/giampaolo/pyftpdlib/issues/212 + +Two classes are provided: + + - ThreadingFTPServer + - MultiprocessFTPServer + +...spawning a new thread or process every time a client connects. + +The main thread will be async-based and be used only to accept new +connections. +Every time a new connection comes in that will be dispatched to a +separate thread/process which internally will run its own IO loop. +This way the handler handling that connections will be free to block +without hanging the whole FTP server. +""" + +import errno +import os +import select +import signal +import sys +import time +import traceback + +from .ioloop import Acceptor +from .ioloop import IOLoop +from .log import config_logging +from .log import debug +from .log import is_logging_configured +from .log import logger + + +__all__ = ['FTPServer'] +_BSD = 'bsd' in sys.platform + + +# =================================================================== +# --- base class +# =================================================================== + +class FTPServer(Acceptor): + """Creates a socket listening on
, dispatching the requests + to a (typically FTPHandler class). + + Depending on the type of address specified IPv4 or IPv6 connections + (or both, depending from the underlying system) will be accepted. + + All relevant session information is stored in class attributes + described below. + + - (int) max_cons: + number of maximum simultaneous connections accepted (defaults + to 512). Can be set to 0 for unlimited but it is recommended + to always have a limit to avoid running out of file descriptors + (DoS). + + - (int) max_cons_per_ip: + number of maximum connections accepted for the same IP address + (defaults to 0 == unlimited). + """ + + max_cons = 512 + max_cons_per_ip = 0 + + def __init__(self, address_or_socket, handler, ioloop=None, backlog=100): + """Creates a socket listening on 'address' dispatching + connections to a 'handler'. + + - (tuple) address_or_socket: the (host, port) pair on which + the command channel will listen for incoming connections or + an existent socket object. + + - (instance) handler: the handler class to use. + + - (instance) ioloop: a pyftpdlib.ioloop.IOLoop instance + + - (int) backlog: the maximum number of queued connections + passed to listen(). If a connection request arrives when + the queue is full the client may raise ECONNRESET. + Defaults to 5. + """ + Acceptor.__init__(self, ioloop=ioloop) + self.handler = handler + self.backlog = backlog + self.ip_map = [] + # in case of FTPS class not properly configured we want errors + # to be raised here rather than later, when client connects + if hasattr(handler, 'get_ssl_context'): + handler.get_ssl_context() + if callable(getattr(address_or_socket, 'listen', None)): + sock = address_or_socket + sock.setblocking(0) + self.set_socket(sock) + else: + self.bind_af_unspecified(address_or_socket) + self.listen(backlog) + + @property + def address(self): + return self.socket.getsockname()[:2] + + def _map_len(self): + return len(self.ioloop.socket_map) + + def _accept_new_cons(self): + """Return True if the server is willing to accept new connections.""" + if not self.max_cons: + return True + else: + return self._map_len() <= self.max_cons + + def _log_start(self): + def get_fqname(obj): + try: + return obj.__module__ + "." + obj.__class__.__name__ + except AttributeError: + try: + return obj.__module__ + "." + obj.__name__ + except AttributeError: + return str(obj) + + if not is_logging_configured(): + # If we get to this point it means the user hasn't + # configured any logger. We want logging to be on + # by default (stderr). + config_logging() + + if self.handler.passive_ports: + pasv_ports = "%s->%s" % (self.handler.passive_ports[0], + self.handler.passive_ports[-1]) + else: + pasv_ports = None + addr = self.address + if hasattr(self.handler, 'ssl_protocol'): + proto = "FTP+SSL" + else: + proto = "FTP" + logger.info(">>> starting %s server on %s:%s, pid=%i <<<" + % (proto, addr[0], addr[1], os.getpid())) + if ('ThreadedFTPServer' in __all__ and + issubclass(self.__class__, ThreadedFTPServer)): + logger.info("concurrency model: multi-thread") + elif ('MultiprocessFTPServer' in __all__ and + issubclass(self.__class__, MultiprocessFTPServer)): + logger.info("concurrency model: multi-process") + elif issubclass(self.__class__, FTPServer): + logger.info("concurrency model: async") + + logger.info("masquerade (NAT) address: %s", + self.handler.masquerade_address) + logger.info("passive ports: %s", pasv_ports) + logger.debug("poller: %r", get_fqname(self.ioloop)) + logger.debug("authorizer: %r", get_fqname(self.handler.authorizer)) + if os.name == 'posix': + logger.debug("use sendfile(2): %s", self.handler.use_sendfile) + logger.debug("handler: %r", get_fqname(self.handler)) + logger.debug("max connections: %s", self.max_cons or "unlimited") + logger.debug("max connections per ip: %s", + self.max_cons_per_ip or "unlimited") + logger.debug("timeout: %s", self.handler.timeout or "unlimited") + logger.debug("banner: %r", self.handler.banner) + logger.debug("max login attempts: %r", self.handler.max_login_attempts) + if getattr(self.handler, 'certfile', None): + logger.debug("SSL certfile: %r", self.handler.certfile) + if getattr(self.handler, 'keyfile', None): + logger.debug("SSL keyfile: %r", self.handler.keyfile) + + def serve_forever(self, timeout=None, blocking=True, handle_exit=True): + """Start serving. + + - (float) timeout: the timeout passed to the underlying IO + loop expressed in seconds. + + - (bool) blocking: if False loop once and then return the + timeout of the next scheduled call next to expire soonest + (if any). + + - (bool) handle_exit: when True catches KeyboardInterrupt and + SystemExit exceptions (generally caused by SIGTERM / SIGINT + signals) and gracefully exits after cleaning up resources. + Also, logs server start and stop. + """ + if handle_exit: + log = handle_exit and blocking + if log: + self._log_start() + try: + self.ioloop.loop(timeout, blocking) + except (KeyboardInterrupt, SystemExit): + logger.info("received interrupt signal") + if blocking: + if log: + logger.info( + ">>> shutting down FTP server (%s active socket " + "fds) <<<", + self._map_len()) + self.close_all() + else: + self.ioloop.loop(timeout, blocking) + + def handle_accepted(self, sock, addr): + """Called when remote client initiates a connection.""" + handler = None + ip = None + try: + handler = self.handler(sock, self, ioloop=self.ioloop) + if not handler.connected: + return + + ip = addr[0] + self.ip_map.append(ip) + + # For performance and security reasons we should always set a + # limit for the number of file descriptors that socket_map + # should contain. When we're running out of such limit we'll + # use the last available channel for sending a 421 response + # to the client before disconnecting it. + if not self._accept_new_cons(): + handler.handle_max_cons() + return + + # accept only a limited number of connections from the same + # source address. + if self.max_cons_per_ip: + if self.ip_map.count(ip) > self.max_cons_per_ip: + handler.handle_max_cons_per_ip() + return + + try: + handler.handle() + except Exception: + handler.handle_error() + else: + return handler + except Exception: + # This is supposed to be an application bug that should + # be fixed. We do not want to tear down the server though + # (DoS). We just log the exception, hoping that someone + # will eventually file a bug. References: + # - https://github.com/giampaolo/pyftpdlib/issues/143 + # - https://github.com/giampaolo/pyftpdlib/issues/166 + # - https://groups.google.com/forum/#!topic/pyftpdlib/h7pPybzAx14 + logger.error(traceback.format_exc()) + if handler is not None: + handler.close() + else: + if ip is not None and ip in self.ip_map: + self.ip_map.remove(ip) + + def handle_error(self): + """Called to handle any uncaught exceptions.""" + try: + raise + except Exception: + logger.error(traceback.format_exc()) + self.close() + + def close_all(self): + """Stop serving and also disconnects all currently connected + clients. + """ + return self.ioloop.close() + + +# =================================================================== +# --- extra implementations +# =================================================================== + +class _SpawnerBase(FTPServer): + """Base class shared by multiple threads/process dispatcher. + Not supposed to be used. + """ + + # how many seconds to wait when join()ing parent's threads + # or processes + join_timeout = 5 + _lock = None + _exit = None + + def __init__(self, address_or_socket, handler, ioloop=None, backlog=100): + FTPServer.__init__(self, address_or_socket, handler, + ioloop=ioloop, backlog=backlog) + self._active_tasks = [] + + def _start_task(self, *args, **kwargs): + raise NotImplementedError('must be implemented in subclass') + + def _current_task(self): + raise NotImplementedError('must be implemented in subclass') + + def _map_len(self): + raise NotImplementedError('must be implemented in subclass') + + def _loop(self, handler): + """Serve handler's IO loop in a separate thread or process.""" + with IOLoop() as ioloop: + handler.ioloop = ioloop + try: + handler.add_channel() + except EnvironmentError as err: + if err.errno == errno.EBADF: + # we might get here in case the other end quickly + # disconnected (see test_quick_connect()) + debug("call: %s._loop(); add_channel() returned EBADF", + self) + return + else: + raise + + # Here we localize variable access to minimize overhead. + poll = ioloop.poll + sched_poll = ioloop.sched.poll + poll_timeout = getattr(self, 'poll_timeout', None) + soonest_timeout = poll_timeout + + while (ioloop.socket_map or ioloop.sched._tasks) and \ + not self._exit.is_set(): + try: + if ioloop.socket_map: + poll(timeout=soonest_timeout) + if ioloop.sched._tasks: + soonest_timeout = sched_poll() + # Handle the case where socket_map is emty but some + # cancelled scheduled calls are still around causing + # this while loop to hog CPU resources. + # In theory this should never happen as all the sched + # functions are supposed to be cancel()ed on close() + # but by using threads we can incur into + # synchronization issues such as this one. + # https://github.com/giampaolo/pyftpdlib/issues/245 + if not ioloop.socket_map: + # get rid of cancel()led calls + ioloop.sched.reheapify() + soonest_timeout = sched_poll() + if soonest_timeout: + time.sleep(min(soonest_timeout, 1)) + else: + soonest_timeout = None + except (KeyboardInterrupt, SystemExit): + # note: these two exceptions are raised in all sub + # processes + self._exit.set() + except select.error as err: + # on Windows we can get WSAENOTSOCK if the client + # rapidly connect and disconnects + if os.name == 'nt' and err[0] == 10038: + for fd in list(ioloop.socket_map.keys()): + try: + select.select([fd], [], [], 0) + except select.error: + try: + logger.info("discarding broken socket %r", + ioloop.socket_map[fd]) + del ioloop.socket_map[fd] + except KeyError: + # dict changed during iteration + pass + else: + raise + else: + if poll_timeout: + if (soonest_timeout is None or + soonest_timeout > poll_timeout): + soonest_timeout = poll_timeout + + def handle_accepted(self, sock, addr): + handler = FTPServer.handle_accepted(self, sock, addr) + if handler is not None: + # unregister the handler from the main IOLoop used by the + # main thread to accept connections + self.ioloop.unregister(handler._fileno) + + t = self._start_task(target=self._loop, args=(handler,)) + t.name = repr(addr) + t.start() + + # it is a different process so free resources here + if hasattr(t, 'pid'): + handler.close() + + with self._lock: + # clean finished tasks + for task in self._active_tasks[:]: + if not task.is_alive(): + self._active_tasks.remove(task) + # add the new task + self._active_tasks.append(t) + + def _log_start(self): + FTPServer._log_start(self) + + def serve_forever(self, timeout=1.0, blocking=True, handle_exit=True): + self._exit.clear() + if handle_exit: + log = handle_exit and blocking + if log: + self._log_start() + try: + self.ioloop.loop(timeout, blocking) + except (KeyboardInterrupt, SystemExit): + pass + if blocking: + if log: + logger.info( + ">>> shutting down FTP server (%s active workers) <<<", + self._map_len()) + self.close_all() + else: + self.ioloop.loop(timeout, blocking) + + def close_all(self): + tasks = self._active_tasks[:] + # this must be set after getting active tasks as it causes + # thread objects to get out of the list too soon + self._exit.set() + if tasks and hasattr(tasks[0], 'terminate'): + # we're dealing with subprocesses + for t in tasks: + try: + if not _BSD: + t.terminate() + else: + # XXX - On FreeBSD using SIGTERM doesn't work + # as the process hangs on kqueue.control() or + # select.select(). Use SIGKILL instead. + os.kill(t.pid, signal.SIGKILL) + except OSError as err: + if err.errno != errno.ESRCH: + raise + + self._wait_for_tasks(tasks) + del self._active_tasks[:] + FTPServer.close_all(self) + + def _wait_for_tasks(self, tasks): + """Wait for threads or subprocesses to terminate.""" + warn = logger.warning + for t in tasks: + t.join(self.join_timeout) + if t.is_alive(): + # Thread or process is still alive. If it's a process + # attempt to send SIGKILL as last resort. + # Set timeout to None so that we will exit immediately + # in case also other threads/processes are hanging. + self.join_timeout = None + if hasattr(t, 'terminate'): + msg = "could not terminate process %r" % t + if not _BSD: + warn(msg + "; sending SIGKILL as last resort") + try: + os.kill(t.pid, signal.SIGKILL) + except OSError as err: + if err.errno != errno.ESRCH: + raise + else: + warn(msg) + else: + warn("thread %r didn't terminate; ignoring it", t) + + +try: + import threading +except ImportError: + pass +else: + __all__ += ['ThreadedFTPServer'] + + # compatibility with python <= 2.6 + if not hasattr(threading.Thread, 'is_alive'): + threading.Thread.is_alive = threading.Thread.isAlive + + class ThreadedFTPServer(_SpawnerBase): + """A modified version of base FTPServer class which spawns a + thread every time a new connection is established. + """ + # The timeout passed to thread's IOLoop.poll() call on every + # loop. Necessary since threads ignore KeyboardInterrupt. + poll_timeout = 1.0 + _lock = threading.Lock() + _exit = threading.Event() + + # compatibility with python <= 2.6 + if not hasattr(_exit, 'is_set'): + _exit.is_set = _exit.isSet + + def _start_task(self, *args, **kwargs): + return threading.Thread(*args, **kwargs) + + def _current_task(self): + return threading.currentThread() + + def _map_len(self): + return threading.activeCount() + + +if os.name == 'posix': + try: + import multiprocessing + except ImportError: + pass + else: + __all__ += ['MultiprocessFTPServer'] + + class MultiprocessFTPServer(_SpawnerBase): + """A modified version of base FTPServer class which spawns a + process every time a new connection is established. + """ + _lock = multiprocessing.Lock() + _exit = multiprocessing.Event() + + def _start_task(self, *args, **kwargs): + return multiprocessing.Process(*args, **kwargs) + + def _current_task(self): + return multiprocessing.current_process() + + def _map_len(self): + return len(multiprocessing.active_children()) diff --git a/ftp_server/pyftpdlib/test/README b/ftp_server/pyftpdlib/test/README new file mode 100644 index 00000000..c79aedf6 --- /dev/null +++ b/ftp_server/pyftpdlib/test/README @@ -0,0 +1,5 @@ +RUNNNING TESTS +============== + +In order to run these tests cd into project root directory then run +"make test" (this is also valid for Windows). diff --git a/ftp_server/pyftpdlib/test/__init__.py b/ftp_server/pyftpdlib/test/__init__.py new file mode 100644 index 00000000..c9956f8d --- /dev/null +++ b/ftp_server/pyftpdlib/test/__init__.py @@ -0,0 +1,394 @@ +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import atexit +import contextlib +import errno +import functools +import logging +import os +import shutil +import socket +import sys +import tempfile +import threading +import time +import warnings +try: + from unittest import mock # py3 +except ImportError: + import mock # NOQA - requires "pip install mock" + +from pyftpdlib._compat import getcwdu +from pyftpdlib._compat import u +from pyftpdlib.authorizers import DummyAuthorizer +from pyftpdlib.handlers import FTPHandler +from pyftpdlib.ioloop import IOLoop +from pyftpdlib.servers import FTPServer + +if sys.version_info < (2, 7): + import unittest2 as unittest # pip install unittest2 +else: + import unittest + +if not hasattr(unittest.TestCase, "assertRaisesRegex"): + unittest.TestCase.assertRaisesRegex = unittest.TestCase.assertRaisesRegexp + +sendfile = None +if os.name == 'posix': + try: + import sendfile + except ImportError: + pass + + +# Attempt to use IP rather than hostname (test suite will run a lot faster) +try: + HOST = socket.gethostbyname('localhost') +except socket.error: + HOST = 'localhost' +USER = 'user' +PASSWD = '12345' +HOME = getcwdu() +TESTFN = 'tmp-pyftpdlib' +TESTFN_UNICODE = TESTFN + '-unicode-' + '\xe2\x98\x83' +TESTFN_UNICODE_2 = TESTFN_UNICODE + '-2' +TIMEOUT = 2 +BUFSIZE = 1024 +INTERRUPTED_TRANSF_SIZE = 32768 +NO_RETRIES = 5 +OSX = sys.platform.startswith("darwin") +POSIX = os.name == 'posix' +WINDOWS = os.name == 'nt' +TRAVIS = bool(os.environ.get('TRAVIS')) +VERBOSITY = 1 if os.getenv('SILENT') else 2 + + +class TestCase(unittest.TestCase): + + def __str__(self): + return "%s.%s.%s" % ( + self.__class__.__module__, self.__class__.__name__, + self._testMethodName) + + +# Hack that overrides default unittest.TestCase in order to print +# a full path representation of the single unit tests being run. +unittest.TestCase = TestCase + + +def try_address(host, port=0, family=socket.AF_INET): + """Try to bind a socket on the given host:port and return True + if that has been possible.""" + try: + with contextlib.closing(socket.socket(family)) as sock: + sock.bind((host, port)) + except (socket.error, socket.gaierror): + return False + else: + return True + + +SUPPORTS_IPV4 = try_address('127.0.0.1') +SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6) +SUPPORTS_SENDFILE = hasattr(os, 'sendfile') or sendfile is not None + + +def safe_remove(*files): + "Convenience function for removing temporary test files" + for file in files: + try: + os.remove(file) + except OSError as err: + if os.name == 'nt': + return + if err.errno != errno.ENOENT: + raise + + +def safe_rmdir(dir): + "Convenience function for removing temporary test directories" + try: + os.rmdir(dir) + except OSError as err: + if os.name == 'nt': + return + if err.errno != errno.ENOENT: + raise + + +def safe_mkdir(dir): + "Convenience function for creating a directory" + try: + os.mkdir(dir) + except OSError as err: + if err.errno != errno.EEXIST: + raise + + +def touch(name): + """Create a file and return its name.""" + with open(name, 'w') as f: + return f.name + + +def remove_test_files(): + """Remove files and directores created during tests.""" + for name in os.listdir(u('.')): + if name.startswith(tempfile.template): + if os.path.isdir(name): + shutil.rmtree(name) + else: + safe_remove(name) + + +def warn(msg): + """Add warning message to be executed on exit.""" + atexit.register(warnings.warn, str(msg) + " - tests have been skipped", + RuntimeWarning) + + +def configure_logging(): + """Set pyftpdlib logger to "WARNING" level.""" + channel = logging.StreamHandler() + logger = logging.getLogger('pyftpdlib') + logger.setLevel(logging.WARNING) + logger.addHandler(channel) + + +def disable_log_warning(fun): + """Temporarily set FTP server's logging level to ERROR.""" + @functools.wraps(fun) + def wrapper(self, *args, **kwargs): + logger = logging.getLogger('pyftpdlib') + level = logger.getEffectiveLevel() + logger.setLevel(logging.ERROR) + try: + return fun(self, *args, **kwargs) + finally: + logger.setLevel(level) + return wrapper + + +def cleanup(): + """Cleanup function executed on interpreter exit.""" + remove_test_files() + map = IOLoop.instance().socket_map + for x in list(map.values()): + try: + sys.stderr.write("garbage: %s\n" % repr(x)) + x.close() + except Exception: + pass + map.clear() + + +def retry_on_failure(ntimes=None): + """Decorator to retry a test in case of failure.""" + def decorator(fun): + @functools.wraps(fun) + def wrapper(*args, **kwargs): + for x in range(ntimes or NO_RETRIES): + try: + return fun(*args, **kwargs) + except AssertionError as _: + err = _ + raise err + return wrapper + return decorator + + +def call_until(fun, expr, timeout=TIMEOUT): + """Keep calling function for timeout secs and exit if eval() + expression is True. + """ + stop_at = time.time() + timeout + while time.time() < stop_at: + ret = fun() + if eval(expr): + return ret + time.sleep(0.001) + raise RuntimeError('timed out (ret=%r)' % ret) + + +def get_server_handler(): + """Return the first FTPHandler instance running in the IOLoop.""" + ioloop = IOLoop.instance() + for fd in ioloop.socket_map: + instance = ioloop.socket_map[fd] + if isinstance(instance, FTPHandler): + return instance + raise RuntimeError("can't find any FTPHandler instance") + + +# commented out as per bug http://bugs.python.org/issue10354 +# tempfile.template = 'tmp-pyftpdlib' + + +class ThreadWorker(threading.Thread): + """A wrapper on top of threading.Thread. + It lets you define a thread worker class which you can easily + start() and stop(). + Subclass MUST provide a poll() method. Optionally it can also + provide the following methods: + + - before_start + - before_stop + - after_stop + + poll() is supposed to be a non-blocking method so that the + worker can be stop()ped immediately. + + **All method calls are supposed to be thread safe, start(), stop() + and the callback methods.** + + Example: + + class MyWorker(ThreadWorker): + + def poll(self): + do_something() + + def before_start(self): + log("starting") + + def before_stop(self): + log("stopping") + + def after_stop(self): + do_cleanup() + + worker = MyWorker(poll_interval=5) + worker.start() + worker.stop() + """ + + # Makes the thread stop on interpreter exit. + daemon = True + + def __init__(self, poll_interval=1.0): + super(ThreadWorker, self).__init__() + self.poll_interval = poll_interval + self.started = False + self.stopped = False + self.lock = threading.Lock() + self._stop_flag = False + self._event_start = threading.Event() + self._event_stop = threading.Event() + + # --- overridable methods + + def poll(self): + raise NotImplementedError("must be implemented in subclass") + + def before_start(self): + """Called right before start().""" + pass + + def before_stop(self): + """Called right before stop(), before signaling the thread + to stop polling. + """ + pass + + def after_stop(self): + """Called right after stop(), after the thread stopped polling.""" + pass + + # --- internals + + def sleep(self): + # Responsive sleep, so that the interpreter will shut down + # after max 1 sec. + if self.poll_interval: + stop_at = time.time() + self.poll_interval + while True: + time.sleep(min(self.poll_interval, 1)) + if time.time() >= stop_at: + break + + def run(self): + try: + while not self._stop_flag: + with self.lock: + if not self.started: + self._event_start.set() + self.started = True + self.poll() + self.sleep() + finally: + self._event_stop.set() + + # --- external API + + def start(self): + if self.started: + raise RuntimeError("already started") + if self._stop_flag: + # ensure the thread can be restarted + super(ThreadWorker, self).__init__(self, self.poll_interval) + with self.lock: + self.before_start() + threading.Thread.start(self) + self._event_start.wait() + + def stop(self): + # TODO: we might want to specify a timeout arg for join. + if not self.stopped: + with self.lock: + self.before_stop() + self._stop_flag = True # signal the main loop to exit + self.stopped = True + # It is important to exit the lock context here otherwise + # we might hang indefinitively. + self.join() + self._event_stop.wait() + with self.lock: + self.after_stop() + + +class ThreadedTestFTPd(ThreadWorker): + """A threaded FTP server used for running tests. + + This is basically a modified version of the FTPServer class which + wraps the polling loop into a thread. + + The instance returned can be used to start(), stop() and + eventually re-start() the server. + """ + handler = FTPHandler + server_class = FTPServer + shutdown_after = 10 + poll_interval = 0.001 if TRAVIS else 0.000001 + + def __init__(self, addr=None): + super(ThreadedTestFTPd, self).__init__( + poll_interval=self.poll_interval) + self.addr = (HOST, 0) if addr is None else addr + authorizer = DummyAuthorizer() + authorizer.add_user(USER, PASSWD, HOME, perm='elradfmwM') # full perms + authorizer.add_anonymous(HOME) + self.handler.authorizer = authorizer + # lower buffer sizes = more "loops" while transfering data + # = less false positives + self.handler.dtp_handler.ac_in_buffer_size = 4096 + self.handler.dtp_handler.ac_out_buffer_size = 4096 + self.server = self.server_class(self.addr, self.handler) + self.host, self.port = self.server.socket.getsockname()[:2] + self.start_time = None + + def before_start(self): + self.start_time = time.time() + + def poll(self): + self.server.serve_forever(timeout=self.poll_interval, blocking=False) + if (self.shutdown_after and + time.time() >= self.start_time + self.shutdown_after): + now = time.time() + if now <= now + self.shutdown_after: + self.server.close_all() + raise Exception("test FTPd shutdown due to timeout") + + def after_stop(self): + self.server.close_all() diff --git a/ftp_server/pyftpdlib/test/keycert.pem b/ftp_server/pyftpdlib/test/keycert.pem new file mode 100644 index 00000000..2f46fcf1 --- /dev/null +++ b/ftp_server/pyftpdlib/test/keycert.pem @@ -0,0 +1,32 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQC8ddrhm+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9L +opdJhTvbGfEj0DQs1IE8M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVH +fhi/VwovESJlaBOp+WMnfhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQAB +AoGBAK0FZpaKj6WnJZN0RqhhK+ggtBWwBnc0U/ozgKz2j1s3fsShYeiGtW6CK5nU +D1dZ5wzhbGThI7LiOXDvRucc9n7vUgi0alqPQ/PFodPxAN/eEYkmXQ7W2k7zwsDA +IUK0KUhktQbLu8qF/m8qM86ba9y9/9YkXuQbZ3COl5ahTZrhAkEA301P08RKv3KM +oXnGU2UHTuJ1MAD2hOrPxjD4/wxA/39EWG9bZczbJyggB4RHu0I3NOSFjAm3HQm0 +ANOu5QK9owJBANgOeLfNNcF4pp+UikRFqxk5hULqRAWzVxVrWe85FlPm0VVmHbb/ +loif7mqjU8o1jTd/LM7RD9f2usZyE2psaw8CQQCNLhkpX3KO5kKJmS9N7JMZSc4j +oog58yeYO8BBqKKzpug0LXuQultYv2K4veaIO04iL9VLe5z9S/Q1jaCHBBuXAkEA +z8gjGoi1AOp6PBBLZNsncCvcV/0aC+1se4HxTNo2+duKSDnbq+ljqOM+E7odU+Nq +ewvIWOG//e8fssd0mq3HywJBAJ8l/c8GVmrpFTx8r/nZ2Pyyjt3dH1widooDXYSV +q6Gbf41Llo5sYAtmxdndTLASuHKecacTgZVhy0FryZpLKrU= +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICpzCCAhCgAwIBAgIJAP+qStv1cIGNMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD +VQQGEwJVUzERMA8GA1UECBMIRGVsYXdhcmUxEzARBgNVBAcTCldpbG1pbmd0b24x +IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMQwwCgYDVQQLEwNT +U0wxHzAdBgNVBAMTFnNvbWVtYWNoaW5lLnB5dGhvbi5vcmcwHhcNMDcwODI3MTY1 +NDUwWhcNMTMwMjE2MTY1NDUwWjCBiTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCERl +bGF3YXJlMRMwEQYDVQQHEwpXaWxtaW5ndG9uMSMwIQYDVQQKExpQeXRob24gU29m +dHdhcmUgRm91bmRhdGlvbjEMMAoGA1UECxMDU1NMMR8wHQYDVQQDExZzb21lbWFj +aGluZS5weXRob24ub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8ddrh +m+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9LopdJhTvbGfEj0DQs1IE8 +M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVHfhi/VwovESJlaBOp+WMn +fhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQABoxUwEzARBglghkgBhvhC +AQEEBAMCBkAwDQYJKoZIhvcNAQEFBQADgYEAF4Q5BVqmCOLv1n8je/Jw9K669VXb +08hyGzQhkemEBYQd6fzQ9A/1ZzHkJKb1P6yreOLSEh4KcxYPyrLRC1ll8nr5OlCx +CMhKkTnR6qBsdNV0XtdU2+N25hqW+Ma4ZeqsN/iiJVCGNOZGnvQuvCAGWF8+J/f/ +iHkC6gGdBJhogs4= +-----END CERTIFICATE----- diff --git a/ftp_server/pyftpdlib/test/runner.py b/ftp_server/pyftpdlib/test/runner.py new file mode 100644 index 00000000..3ae93767 --- /dev/null +++ b/ftp_server/pyftpdlib/test/runner.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import os +import sys + +from pyftpdlib.test import configure_logging +from pyftpdlib.test import remove_test_files +from pyftpdlib.test import unittest +from pyftpdlib.test import VERBOSITY + + +HERE = os.path.abspath(os.path.dirname(__file__)) + + +def main(): + testmodules = [os.path.splitext(x)[0] for x in os.listdir(HERE) + if x.endswith('.py') and x.startswith('test_')] + configure_logging() + remove_test_files() + suite = unittest.TestSuite() + for t in testmodules: + # ...so that "make test" will print the full test paths + t = "pyftpdlib.test.%s" % t + suite.addTest(unittest.defaultTestLoader.loadTestsFromName(t)) + result = unittest.TextTestRunner(verbosity=VERBOSITY).run(suite) + return result.wasSuccessful() + + +if __name__ == '__main__': + if not main(): + sys.exit(1) diff --git a/ftp_server/pyftpdlib/test/test_authorizers.py b/ftp_server/pyftpdlib/test/test_authorizers.py new file mode 100644 index 00000000..f40dd6d3 --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_authorizers.py @@ -0,0 +1,553 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import os +import random +import string +import sys +import tempfile +import warnings + +from pyftpdlib._compat import getcwdu +from pyftpdlib._compat import unicode +from pyftpdlib.authorizers import AuthenticationFailed +from pyftpdlib.authorizers import AuthorizerError +from pyftpdlib.authorizers import DummyAuthorizer +from pyftpdlib.test import HOME +from pyftpdlib.test import PASSWD +from pyftpdlib.test import POSIX +from pyftpdlib.test import TESTFN +from pyftpdlib.test import touch +from pyftpdlib.test import unittest +from pyftpdlib.test import USER +from pyftpdlib.test import VERBOSITY +from pyftpdlib.test import WINDOWS + +if POSIX: + import pwd + try: + from pyftpdlib.authorizers import UnixAuthorizer + except ImportError: + UnixAuthorizer = None +else: + UnixAuthorizer = None + +if WINDOWS: + from pywintypes import error as Win32ExtError + from pyftpdlib.authorizers import WindowsAuthorizer +else: + WindowsAuthorizer = None + + +class TestDummyAuthorizer(unittest.TestCase): + """Tests for DummyAuthorizer class.""" + + # temporarily change warnings to exceptions for the purposes of testing + def setUp(self): + self.tempdir = tempfile.mkdtemp(dir=HOME) + self.subtempdir = tempfile.mkdtemp( + dir=os.path.join(HOME, self.tempdir)) + self.tempfile = touch(os.path.join(self.tempdir, TESTFN)) + self.subtempfile = touch(os.path.join(self.subtempdir, TESTFN)) + warnings.filterwarnings("error") + + def tearDown(self): + os.remove(self.tempfile) + os.remove(self.subtempfile) + os.rmdir(self.subtempdir) + os.rmdir(self.tempdir) + warnings.resetwarnings() + + def test_common_methods(self): + auth = DummyAuthorizer() + # create user + auth.add_user(USER, PASSWD, HOME) + auth.add_anonymous(HOME) + # check credentials + auth.validate_authentication(USER, PASSWD, None) + self.assertRaises(AuthenticationFailed, + auth.validate_authentication, USER, 'wrongpwd', None) + auth.validate_authentication('anonymous', 'foo', None) + auth.validate_authentication('anonymous', '', None) # empty passwd + # remove them + auth.remove_user(USER) + auth.remove_user('anonymous') + # raise exc if user does not exists + self.assertRaises(KeyError, auth.remove_user, USER) + # raise exc if path does not exist + self.assertRaisesRegex(ValueError, + 'no such directory', + auth.add_user, USER, PASSWD, '?:\\') + self.assertRaisesRegex(ValueError, + 'no such directory', + auth.add_anonymous, '?:\\') + # raise exc if user already exists + auth.add_user(USER, PASSWD, HOME) + auth.add_anonymous(HOME) + self.assertRaisesRegex(ValueError, + 'user %r already exists' % USER, + auth.add_user, USER, PASSWD, HOME) + self.assertRaisesRegex(ValueError, + "user 'anonymous' already exists", + auth.add_anonymous, HOME) + auth.remove_user(USER) + auth.remove_user('anonymous') + # raise on wrong permission + self.assertRaisesRegex(ValueError, + "no such permission", + auth.add_user, USER, PASSWD, HOME, perm='?') + self.assertRaisesRegex(ValueError, + "no such permission", + auth.add_anonymous, HOME, perm='?') + # expect warning on write permissions assigned to anonymous user + for x in "adfmw": + self.assertRaisesRegex( + RuntimeWarning, + "write permissions assigned to anonymous user.", + auth.add_anonymous, HOME, perm=x) + + def test_override_perm_interface(self): + auth = DummyAuthorizer() + auth.add_user(USER, PASSWD, HOME, perm='elr') + # raise exc if user does not exists + self.assertRaises(KeyError, auth.override_perm, USER + 'w', + HOME, 'elr') + # raise exc if path does not exist or it's not a directory + self.assertRaisesRegex(ValueError, + 'no such directory', + auth.override_perm, USER, '?:\\', 'elr') + self.assertRaisesRegex(ValueError, + 'no such directory', + auth.override_perm, USER, self.tempfile, 'elr') + # raise on wrong permission + self.assertRaisesRegex(ValueError, + "no such permission", auth.override_perm, + USER, HOME, perm='?') + # expect warning on write permissions assigned to anonymous user + auth.add_anonymous(HOME) + for p in "adfmw": + self.assertRaisesRegex( + RuntimeWarning, + "write permissions assigned to anonymous user.", + auth.override_perm, 'anonymous', HOME, p) + # raise on attempt to override home directory permissions + self.assertRaisesRegex(ValueError, + "can't override home directory permissions", + auth.override_perm, USER, HOME, perm='w') + # raise on attempt to override a path escaping home directory + if os.path.dirname(HOME) != HOME: + self.assertRaisesRegex(ValueError, + "path escapes user home directory", + auth.override_perm, USER, + os.path.dirname(HOME), perm='w') + # try to re-set an overridden permission + auth.override_perm(USER, self.tempdir, perm='w') + auth.override_perm(USER, self.tempdir, perm='wr') + + def test_override_perm_recursive_paths(self): + auth = DummyAuthorizer() + auth.add_user(USER, PASSWD, HOME, perm='elr') + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir), False) + auth.override_perm(USER, self.tempdir, perm='w', recursive=True) + self.assertEqual(auth.has_perm(USER, 'w', HOME), False) + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir), True) + self.assertEqual(auth.has_perm(USER, 'w', self.tempfile), True) + self.assertEqual(auth.has_perm(USER, 'w', self.subtempdir), True) + self.assertEqual(auth.has_perm(USER, 'w', self.subtempfile), True) + + self.assertEqual(auth.has_perm(USER, 'w', HOME + '@'), False) + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir + '@'), False) + path = os.path.join(self.tempdir + '@', + os.path.basename(self.tempfile)) + self.assertEqual(auth.has_perm(USER, 'w', path), False) + # test case-sensitiveness + if (os.name in ('nt', 'ce')) or (sys.platform == 'cygwin'): + self.assertTrue(auth.has_perm(USER, 'w', self.tempdir.upper())) + + def test_override_perm_not_recursive_paths(self): + auth = DummyAuthorizer() + auth.add_user(USER, PASSWD, HOME, perm='elr') + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir), False) + auth.override_perm(USER, self.tempdir, perm='w') + self.assertEqual(auth.has_perm(USER, 'w', HOME), False) + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir), True) + self.assertEqual(auth.has_perm(USER, 'w', self.tempfile), True) + self.assertEqual(auth.has_perm(USER, 'w', self.subtempdir), False) + self.assertEqual(auth.has_perm(USER, 'w', self.subtempfile), False) + + self.assertEqual(auth.has_perm(USER, 'w', HOME + '@'), False) + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir + '@'), False) + path = os.path.join(self.tempdir + '@', + os.path.basename(self.tempfile)) + self.assertEqual(auth.has_perm(USER, 'w', path), False) + # test case-sensitiveness + if (os.name in ('nt', 'ce')) or (sys.platform == 'cygwin'): + self.assertEqual(auth.has_perm(USER, 'w', self.tempdir.upper()), + True) + + +class _SharedAuthorizerTests(object): + """Tests valid for both UnixAuthorizer and WindowsAuthorizer for + those parts which share the same API. + """ + authorizer_class = None + # --- utils + + def get_users(self): + return self.authorizer_class._get_system_users() + + def get_current_user(self): + if POSIX: + return pwd.getpwuid(os.getuid()).pw_name + else: + return os.environ['USERNAME'] + + def get_current_user_homedir(self): + if POSIX: + return pwd.getpwuid(os.getuid()).pw_dir + else: + return os.environ['USERPROFILE'] + + def get_nonexistent_user(self): + # return a user which does not exist on the system + users = self.get_users() + letters = string.ascii_lowercase + while True: + user = ''.join([random.choice(letters) for i in range(10)]) + if user not in users: + return user + + def assertRaisesWithMsg(self, excClass, msg, callableObj, *args, **kwargs): + try: + callableObj(*args, **kwargs) + except excClass as err: + if str(err) == msg: + return + raise self.failureException("%s != %s" % (str(err), msg)) + else: + if hasattr(excClass, '__name__'): + excName = excClass.__name__ + else: + excName = str(excClass) + raise self.failureException("%s not raised" % excName) + # --- /utils + + def test_get_home_dir(self): + auth = self.authorizer_class() + home = auth.get_home_dir(self.get_current_user()) + self.assertTrue(isinstance(home, unicode)) + nonexistent_user = self.get_nonexistent_user() + self.assertTrue(os.path.isdir(home)) + if auth.has_user('nobody'): + home = auth.get_home_dir('nobody') + self.assertRaises(AuthorizerError, + auth.get_home_dir, nonexistent_user) + + def test_has_user(self): + auth = self.authorizer_class() + current_user = self.get_current_user() + nonexistent_user = self.get_nonexistent_user() + self.assertTrue(auth.has_user(current_user)) + self.assertFalse(auth.has_user(nonexistent_user)) + auth = self.authorizer_class(rejected_users=[current_user]) + self.assertFalse(auth.has_user(current_user)) + + def test_validate_authentication(self): + # can't test for actual success in case of valid authentication + # here as we don't have the user password + if self.authorizer_class.__name__ == 'UnixAuthorizer': + auth = self.authorizer_class(require_valid_shell=False) + else: + auth = self.authorizer_class() + current_user = self.get_current_user() + nonexistent_user = self.get_nonexistent_user() + self.assertRaises( + AuthenticationFailed, + auth.validate_authentication, current_user, 'wrongpasswd', None) + self.assertRaises( + AuthenticationFailed, + auth.validate_authentication, nonexistent_user, 'bar', None) + + def test_impersonate_user(self): + auth = self.authorizer_class() + nonexistent_user = self.get_nonexistent_user() + try: + if self.authorizer_class.__name__ == 'UnixAuthorizer': + auth.impersonate_user(self.get_current_user(), '') + self.assertRaises( + AuthorizerError, + auth.impersonate_user, nonexistent_user, 'pwd') + else: + self.assertRaises( + Win32ExtError, + auth.impersonate_user, nonexistent_user, 'pwd') + self.assertRaises( + Win32ExtError, + auth.impersonate_user, self.get_current_user(), '') + finally: + auth.terminate_impersonation('') + + def test_terminate_impersonation(self): + auth = self.authorizer_class() + auth.terminate_impersonation('') + auth.terminate_impersonation('') + + def test_get_perms(self): + auth = self.authorizer_class(global_perm='elr') + self.assertTrue('r' in auth.get_perms(self.get_current_user())) + self.assertFalse('w' in auth.get_perms(self.get_current_user())) + + def test_has_perm(self): + auth = self.authorizer_class(global_perm='elr') + self.assertTrue(auth.has_perm(self.get_current_user(), 'r')) + self.assertFalse(auth.has_perm(self.get_current_user(), 'w')) + + def test_messages(self): + auth = self.authorizer_class(msg_login="login", msg_quit="quit") + self.assertTrue(auth.get_msg_login, "login") + self.assertTrue(auth.get_msg_quit, "quit") + + def test_error_options(self): + wrong_user = self.get_nonexistent_user() + self.assertRaisesWithMsg( + AuthorizerError, + "rejected_users and allowed_users options are mutually exclusive", + self.authorizer_class, allowed_users=['foo'], + rejected_users=['bar']) + self.assertRaisesWithMsg( + AuthorizerError, + 'invalid username "anonymous"', + self.authorizer_class, allowed_users=['anonymous']) + self.assertRaisesWithMsg( + AuthorizerError, + 'invalid username "anonymous"', + self.authorizer_class, rejected_users=['anonymous']) + self.assertRaisesWithMsg( + AuthorizerError, + 'unknown user %s' % wrong_user, + self.authorizer_class, allowed_users=[wrong_user]) + self.assertRaisesWithMsg(AuthorizerError, + 'unknown user %s' % wrong_user, + self.authorizer_class, + rejected_users=[wrong_user]) + + def test_override_user_password(self): + auth = self.authorizer_class() + user = self.get_current_user() + auth.override_user(user, password='foo') + auth.validate_authentication(user, 'foo', None) + self.assertRaises(AuthenticationFailed(auth.validate_authentication, + user, 'bar', None)) + # make sure other settings keep using default values + self.assertEqual(auth.get_home_dir(user), + self.get_current_user_homedir()) + self.assertEqual(auth.get_perms(user), "elradfmw") + self.assertEqual(auth.get_msg_login(user), "Login successful.") + self.assertEqual(auth.get_msg_quit(user), "Goodbye.") + + def test_override_user_homedir(self): + auth = self.authorizer_class() + user = self.get_current_user() + dir = os.path.dirname(getcwdu()) + auth.override_user(user, homedir=dir) + self.assertEqual(auth.get_home_dir(user), dir) + # make sure other settings keep using default values + # self.assertEqual(auth.get_home_dir(user), + # self.get_current_user_homedir()) + self.assertEqual(auth.get_perms(user), "elradfmw") + self.assertEqual(auth.get_msg_login(user), "Login successful.") + self.assertEqual(auth.get_msg_quit(user), "Goodbye.") + + def test_override_user_perm(self): + auth = self.authorizer_class() + user = self.get_current_user() + auth.override_user(user, perm="elr") + self.assertEqual(auth.get_perms(user), "elr") + # make sure other settings keep using default values + self.assertEqual(auth.get_home_dir(user), + self.get_current_user_homedir()) + # self.assertEqual(auth.get_perms(user), "elradfmw") + self.assertEqual(auth.get_msg_login(user), "Login successful.") + self.assertEqual(auth.get_msg_quit(user), "Goodbye.") + + def test_override_user_msg_login_quit(self): + auth = self.authorizer_class() + user = self.get_current_user() + auth.override_user(user, msg_login="foo", msg_quit="bar") + self.assertEqual(auth.get_msg_login(user), "foo") + self.assertEqual(auth.get_msg_quit(user), "bar") + # make sure other settings keep using default values + self.assertEqual(auth.get_home_dir(user), + self.get_current_user_homedir()) + self.assertEqual(auth.get_perms(user), "elradfmw") + # self.assertEqual(auth.get_msg_login(user), "Login successful.") + # self.assertEqual(auth.get_msg_quit(user), "Goodbye.") + + def test_override_user_errors(self): + if self.authorizer_class.__name__ == 'UnixAuthorizer': + auth = self.authorizer_class(require_valid_shell=False) + else: + auth = self.authorizer_class() + this_user = self.get_current_user() + for x in self.get_users(): + if x != this_user: + another_user = x + break + nonexistent_user = self.get_nonexistent_user() + self.assertRaisesWithMsg( + AuthorizerError, + "at least one keyword argument must be specified", + auth.override_user, this_user) + self.assertRaisesWithMsg(AuthorizerError, + 'no such user %s' % nonexistent_user, + auth.override_user, nonexistent_user, + perm='r') + if self.authorizer_class.__name__ == 'UnixAuthorizer': + auth = self.authorizer_class(allowed_users=[this_user], + require_valid_shell=False) + else: + auth = self.authorizer_class(allowed_users=[this_user]) + auth.override_user(this_user, perm='r') + self.assertRaisesWithMsg(AuthorizerError, + '%s is not an allowed user' % another_user, + auth.override_user, another_user, perm='r') + if self.authorizer_class.__name__ == 'UnixAuthorizer': + auth = self.authorizer_class(rejected_users=[this_user], + require_valid_shell=False) + else: + auth = self.authorizer_class(rejected_users=[this_user]) + auth.override_user(another_user, perm='r') + self.assertRaisesWithMsg(AuthorizerError, + '%s is not an allowed user' % this_user, + auth.override_user, this_user, perm='r') + self.assertRaisesWithMsg(AuthorizerError, + "can't assign password to anonymous user", + auth.override_user, "anonymous", + password='foo') + + +# ===================================================================== +# --- UNIX authorizer +# ===================================================================== + + +@unittest.skipUnless(POSIX, "UNIX only") +@unittest.skipUnless(UnixAuthorizer is not None, + "UnixAuthorizer class not available") +class TestUnixAuthorizer(_SharedAuthorizerTests, unittest.TestCase): + """Unix authorizer specific tests.""" + + authorizer_class = UnixAuthorizer + + def setUp(self): + try: + UnixAuthorizer() + except AuthorizerError: # not root + self.skipTest("need root access") + + def test_get_perms_anonymous(self): + auth = UnixAuthorizer( + global_perm='elr', anonymous_user=self.get_current_user()) + self.assertTrue('e' in auth.get_perms('anonymous')) + self.assertFalse('w' in auth.get_perms('anonymous')) + warnings.filterwarnings("ignore") + auth.override_user('anonymous', perm='w') + warnings.resetwarnings() + self.assertTrue('w' in auth.get_perms('anonymous')) + + def test_has_perm_anonymous(self): + auth = UnixAuthorizer( + global_perm='elr', anonymous_user=self.get_current_user()) + self.assertTrue(auth.has_perm(self.get_current_user(), 'r')) + self.assertFalse(auth.has_perm(self.get_current_user(), 'w')) + self.assertTrue(auth.has_perm('anonymous', 'e')) + self.assertFalse(auth.has_perm('anonymous', 'w')) + warnings.filterwarnings("ignore") + auth.override_user('anonymous', perm='w') + warnings.resetwarnings() + self.assertTrue(auth.has_perm('anonymous', 'w')) + + def test_validate_authentication(self): + # we can only test for invalid credentials + auth = UnixAuthorizer(require_valid_shell=False) + self.assertRaises(AuthenticationFailed, + auth.validate_authentication, '?!foo', '?!foo', None) + auth = UnixAuthorizer(require_valid_shell=True) + self.assertRaises(AuthenticationFailed, + auth.validate_authentication, '?!foo', '?!foo', None) + + def test_validate_authentication_anonymous(self): + current_user = self.get_current_user() + auth = UnixAuthorizer(anonymous_user=current_user, + require_valid_shell=False) + self.assertRaises(AuthenticationFailed, + auth.validate_authentication, 'foo', 'passwd', None) + self.assertRaises( + AuthenticationFailed, + auth.validate_authentication, current_user, 'passwd', None) + auth.validate_authentication('anonymous', 'passwd', None) + + def test_require_valid_shell(self): + + def get_fake_shell_user(): + for user in self.get_users(): + shell = pwd.getpwnam(user).pw_shell + # On linux fake shell is usually /bin/false, on + # freebsd /usr/sbin/nologin; in case of other + # UNIX variants test needs to be adjusted. + if '/false' in shell or '/nologin' in shell: + return user + self.fail("no user found") + + user = get_fake_shell_user() + self.assertRaisesWithMsg( + AuthorizerError, + "user %s has not a valid shell" % user, + UnixAuthorizer, allowed_users=[user]) + # commented as it first fails for invalid home + # self.assertRaisesWithMsg( + # ValueError, + # "user %s has not a valid shell" % user, + # UnixAuthorizer, anonymous_user=user) + auth = UnixAuthorizer() + self.assertTrue(auth._has_valid_shell(self.get_current_user())) + self.assertFalse(auth._has_valid_shell(user)) + self.assertRaisesWithMsg(AuthorizerError, + "User %s doesn't have a valid shell." % user, + auth.override_user, user, perm='r') + + def test_not_root(self): + # UnixAuthorizer is supposed to work only as super user + auth = self.authorizer_class() + try: + auth.impersonate_user('nobody', '') + self.assertRaisesWithMsg(AuthorizerError, + "super user privileges are required", + UnixAuthorizer) + finally: + auth.terminate_impersonation('nobody') + + +# ===================================================================== +# --- Windows authorizer +# ===================================================================== + + +@unittest.skipUnless(WINDOWS, "Windows only") +class TestWindowsAuthorizer(_SharedAuthorizerTests, unittest.TestCase): + """Windows authorizer specific tests.""" + + authorizer_class = WindowsAuthorizer + + def test_wrong_anonymous_credentials(self): + user = self.get_current_user() + self.assertRaises(Win32ExtError, self.authorizer_class, + anonymous_user=user, + anonymous_password='$|1wrongpasswd') + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_filesystems.py b/ftp_server/pyftpdlib/test/test_filesystems.py new file mode 100644 index 00000000..d5ee1a08 --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_filesystems.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import os +import tempfile + +from pyftpdlib._compat import getcwdu +from pyftpdlib._compat import u +from pyftpdlib.filesystems import AbstractedFS +from pyftpdlib.test import HOME +from pyftpdlib.test import POSIX +from pyftpdlib.test import safe_remove +from pyftpdlib.test import TESTFN +from pyftpdlib.test import touch +from pyftpdlib.test import unittest +from pyftpdlib.test import VERBOSITY + +if POSIX: + from pyftpdlib.filesystems import UnixFilesystem + + +class TestAbstractedFS(unittest.TestCase): + """Test for conversion utility methods of AbstractedFS class.""" + + def setUp(self): + safe_remove(TESTFN) + + tearDown = setUp + + def test_ftpnorm(self): + # Tests for ftpnorm method. + ae = self.assertEqual + fs = AbstractedFS(u('/'), None) + + fs._cwd = u('/') + ae(fs.ftpnorm(u('')), u('/')) + ae(fs.ftpnorm(u('/')), u('/')) + ae(fs.ftpnorm(u('.')), u('/')) + ae(fs.ftpnorm(u('..')), u('/')) + ae(fs.ftpnorm(u('a')), u('/a')) + ae(fs.ftpnorm(u('/a')), u('/a')) + ae(fs.ftpnorm(u('/a/')), u('/a')) + ae(fs.ftpnorm(u('a/..')), u('/')) + ae(fs.ftpnorm(u('a/b')), '/a/b') + ae(fs.ftpnorm(u('a/b/..')), u('/a')) + ae(fs.ftpnorm(u('a/b/../..')), u('/')) + fs._cwd = u('/sub') + ae(fs.ftpnorm(u('')), u('/sub')) + ae(fs.ftpnorm(u('/')), u('/')) + ae(fs.ftpnorm(u('.')), u('/sub')) + ae(fs.ftpnorm(u('..')), u('/')) + ae(fs.ftpnorm(u('a')), u('/sub/a')) + ae(fs.ftpnorm(u('a/')), u('/sub/a')) + ae(fs.ftpnorm(u('a/..')), u('/sub')) + ae(fs.ftpnorm(u('a/b')), u('/sub/a/b')) + ae(fs.ftpnorm(u('a/b/')), u('/sub/a/b')) + ae(fs.ftpnorm(u('a/b/..')), u('/sub/a')) + ae(fs.ftpnorm(u('a/b/../..')), u('/sub')) + ae(fs.ftpnorm(u('a/b/../../..')), u('/')) + ae(fs.ftpnorm(u('//')), u('/')) # UNC paths must be collapsed + + def test_ftp2fs(self): + # Tests for ftp2fs method. + def join(x, y): + return os.path.join(x, y.replace('/', os.sep)) + + ae = self.assertEqual + fs = AbstractedFS(u('/'), None) + + def goforit(root): + fs._root = root + fs._cwd = u('/') + ae(fs.ftp2fs(u('')), root) + ae(fs.ftp2fs(u('/')), root) + ae(fs.ftp2fs(u('.')), root) + ae(fs.ftp2fs(u('..')), root) + ae(fs.ftp2fs(u('a')), join(root, u('a'))) + ae(fs.ftp2fs(u('/a')), join(root, u('a'))) + ae(fs.ftp2fs(u('/a/')), join(root, u('a'))) + ae(fs.ftp2fs(u('a/..')), root) + ae(fs.ftp2fs(u('a/b')), join(root, u(r'a/b'))) + ae(fs.ftp2fs(u('/a/b')), join(root, u(r'a/b'))) + ae(fs.ftp2fs(u('/a/b/..')), join(root, u('a'))) + ae(fs.ftp2fs(u('/a/b/../..')), root) + fs._cwd = u('/sub') + ae(fs.ftp2fs(u('')), join(root, u('sub'))) + ae(fs.ftp2fs(u('/')), root) + ae(fs.ftp2fs(u('.')), join(root, u('sub'))) + ae(fs.ftp2fs(u('..')), root) + ae(fs.ftp2fs(u('a')), join(root, u('sub/a'))) + ae(fs.ftp2fs(u('a/')), join(root, u('sub/a'))) + ae(fs.ftp2fs(u('a/..')), join(root, u('sub'))) + ae(fs.ftp2fs(u('a/b')), join(root, 'sub/a/b')) + ae(fs.ftp2fs(u('a/b/..')), join(root, u('sub/a'))) + ae(fs.ftp2fs(u('a/b/../..')), join(root, u('sub'))) + ae(fs.ftp2fs(u('a/b/../../..')), root) + # UNC paths must be collapsed + ae(fs.ftp2fs(u('//a')), join(root, u('a'))) + + if os.sep == '\\': + goforit(u(r'C:\dir')) + goforit(u('C:\\')) + # on DOS-derived filesystems (e.g. Windows) this is the same + # as specifying the current drive directory (e.g. 'C:\\') + goforit(u('\\')) + elif os.sep == '/': + goforit(u('/home/user')) + goforit(u('/')) + else: + # os.sep == ':'? Don't know... let's try it anyway + goforit(getcwdu()) + + def test_fs2ftp(self): + # Tests for fs2ftp method. + def join(x, y): + return os.path.join(x, y.replace('/', os.sep)) + + ae = self.assertEqual + fs = AbstractedFS(u('/'), None) + + def goforit(root): + fs._root = root + ae(fs.fs2ftp(root), u('/')) + ae(fs.fs2ftp(join(root, u('/'))), u('/')) + ae(fs.fs2ftp(join(root, u('.'))), u('/')) + # can't escape from root + ae(fs.fs2ftp(join(root, u('..'))), u('/')) + ae(fs.fs2ftp(join(root, u('a'))), u('/a')) + ae(fs.fs2ftp(join(root, u('a/'))), u('/a')) + ae(fs.fs2ftp(join(root, u('a/..'))), u('/')) + ae(fs.fs2ftp(join(root, u('a/b'))), u('/a/b')) + ae(fs.fs2ftp(join(root, u('a/b'))), u('/a/b')) + ae(fs.fs2ftp(join(root, u('a/b/..'))), u('/a')) + ae(fs.fs2ftp(join(root, u('/a/b/../..'))), u('/')) + fs._cwd = u('/sub') + ae(fs.fs2ftp(join(root, 'a/')), u('/a')) + + if os.sep == '\\': + goforit(u(r'C:\dir')) + goforit(u('C:\\')) + # on DOS-derived filesystems (e.g. Windows) this is the same + # as specifying the current drive directory (e.g. 'C:\\') + goforit(u('\\')) + fs._root = u(r'C:\dir') + ae(fs.fs2ftp(u('C:\\')), u('/')) + ae(fs.fs2ftp(u('D:\\')), u('/')) + ae(fs.fs2ftp(u('D:\\dir')), u('/')) + elif os.sep == '/': + goforit(u('/')) + if os.path.realpath('/__home/user') != '/__home/user': + self.fail('Test skipped (symlinks not allowed).') + goforit(u('/__home/user')) + fs._root = u('/__home/user') + ae(fs.fs2ftp(u('/__home')), u('/')) + ae(fs.fs2ftp(u('/')), u('/')) + ae(fs.fs2ftp(u('/__home/userx')), u('/')) + else: + # os.sep == ':'? Don't know... let's try it anyway + goforit(getcwdu()) + + def test_validpath(self): + # Tests for validpath method. + fs = AbstractedFS(u('/'), None) + fs._root = HOME + self.assertTrue(fs.validpath(HOME)) + self.assertTrue(fs.validpath(HOME + '/')) + self.assertFalse(fs.validpath(HOME + 'bar')) + + if hasattr(os, 'symlink'): + + def test_validpath_validlink(self): + # Test validpath by issuing a symlink pointing to a path + # inside the root directory. + fs = AbstractedFS(u('/'), None) + fs._root = HOME + TESTFN2 = TESTFN + '1' + try: + touch(TESTFN) + os.symlink(TESTFN, TESTFN2) + self.assertTrue(fs.validpath(u(TESTFN))) + finally: + safe_remove(TESTFN, TESTFN2) + + def test_validpath_external_symlink(self): + # Test validpath by issuing a symlink pointing to a path + # outside the root directory. + fs = AbstractedFS(u('/'), None) + fs._root = HOME + # tempfile should create our file in /tmp directory + # which should be outside the user root. If it is + # not we just skip the test. + with tempfile.NamedTemporaryFile() as file: + try: + if HOME == os.path.dirname(file.name): + return + os.symlink(file.name, TESTFN) + self.assertFalse(fs.validpath(u(TESTFN))) + finally: + safe_remove(TESTFN) + + +@unittest.skipUnless(POSIX, "UNIX only") +class TestUnixFilesystem(unittest.TestCase): + + def test_case(self): + root = getcwdu() + fs = UnixFilesystem(root, None) + self.assertEqual(fs.root, root) + self.assertEqual(fs.cwd, root) + cdup = os.path.dirname(root) + self.assertEqual(fs.ftp2fs(u('..')), cdup) + self.assertEqual(fs.fs2ftp(root), root) + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_functional.py b/ftp_server/pyftpdlib/test/test_functional.py new file mode 100644 index 00000000..496cf93c --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_functional.py @@ -0,0 +1,2851 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import contextlib +import errno +import ftplib +import logging +import os +import random +import re +import select +import shutil +import socket +import stat +import sys +import tempfile +import time +import warnings + +from pyftpdlib._compat import b +from pyftpdlib._compat import PY3 +from pyftpdlib._compat import u +from pyftpdlib._compat import unicode +from pyftpdlib.filesystems import AbstractedFS +from pyftpdlib.handlers import DTPHandler +from pyftpdlib.handlers import FTPHandler +from pyftpdlib.handlers import SUPPORTS_HYBRID_IPV6 +from pyftpdlib.handlers import ThrottledDTPHandler +from pyftpdlib.ioloop import IOLoop +from pyftpdlib.servers import FTPServer +from pyftpdlib.test import BUFSIZE +from pyftpdlib.test import call_until +from pyftpdlib.test import configure_logging +from pyftpdlib.test import disable_log_warning +from pyftpdlib.test import get_server_handler +from pyftpdlib.test import HOME +from pyftpdlib.test import HOST +from pyftpdlib.test import INTERRUPTED_TRANSF_SIZE +from pyftpdlib.test import mock +from pyftpdlib.test import OSX +from pyftpdlib.test import PASSWD +from pyftpdlib.test import POSIX +from pyftpdlib.test import remove_test_files +from pyftpdlib.test import retry_on_failure +from pyftpdlib.test import safe_mkdir +from pyftpdlib.test import safe_remove +from pyftpdlib.test import safe_rmdir +from pyftpdlib.test import SUPPORTS_IPV4 +from pyftpdlib.test import SUPPORTS_IPV6 +from pyftpdlib.test import SUPPORTS_SENDFILE +from pyftpdlib.test import TESTFN +from pyftpdlib.test import TESTFN_UNICODE +from pyftpdlib.test import TESTFN_UNICODE_2 +from pyftpdlib.test import ThreadedTestFTPd +from pyftpdlib.test import TIMEOUT +from pyftpdlib.test import touch +from pyftpdlib.test import TRAVIS +from pyftpdlib.test import unittest +from pyftpdlib.test import USER +from pyftpdlib.test import VERBOSITY +from pyftpdlib.test import WINDOWS +import pyftpdlib.__main__ + +try: + from StringIO import StringIO as BytesIO +except ImportError: + from io import BytesIO +try: + import ssl +except ImportError: + ssl = None + +sendfile = None +if POSIX: + try: + import sendfile + except ImportError: + pass + + +class TestFtpAuthentication(unittest.TestCase): + + "test: USER, PASS, REIN." + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + with self.server.lock: + self.server.handler.auth_failed_timeout = 0.001 + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.file = open(TESTFN, 'w+b') + self.dummyfile = BytesIO() + + def tearDown(self): + with self.server.lock: + self.server.handler.auth_failed_timeout = 5 + self.client.close() + self.server.stop() + if not self.file.closed: + self.file.close() + if not self.dummyfile.closed: + self.dummyfile.close() + os.remove(TESTFN) + + def assert_auth_failed(self, user, passwd): + self.assertRaisesRegex(ftplib.error_perm, '530 Authentication failed', + self.client.login, user, passwd) + + def test_auth_ok(self): + self.client.login(user=USER, passwd=PASSWD) + + def test_anon_auth(self): + self.client.login(user='anonymous', passwd='anon@') + self.client.login(user='anonymous', passwd='') + # supposed to be case sensitive + self.assert_auth_failed('AnoNymouS', 'foo') + # empty passwords should be allowed + self.client.sendcmd('user anonymous') + self.client.sendcmd('pass ') + self.client.sendcmd('user anonymous') + self.client.sendcmd('pass') + + def test_auth_failed(self): + self.assert_auth_failed(USER, 'wrong') + self.assert_auth_failed('wrong', PASSWD) + self.assert_auth_failed('wrong', 'wrong') + + def test_wrong_cmds_order(self): + self.assertRaisesRegex(ftplib.error_perm, '503 Login with USER first', + self.client.sendcmd, 'pass ' + PASSWD) + self.client.login(user=USER, passwd=PASSWD) + self.assertRaisesRegex(ftplib.error_perm, + "503 User already authenticated.", + self.client.sendcmd, 'pass ' + PASSWD) + + def test_max_auth(self): + self.assert_auth_failed(USER, 'wrong') + self.assert_auth_failed(USER, 'wrong') + self.assert_auth_failed(USER, 'wrong') + # If authentication fails for 3 times ftpd disconnects the + # client. We can check if that happens by using self.client.sendcmd() + # on the 'dead' socket object. If socket object is really + # closed it should be raised a socket.error exception (Windows) + # or a EOFError exception (Linux). + self.client.sock.settimeout(.1) + self.assertRaises((socket.error, EOFError), self.client.sendcmd, '') + + def test_rein(self): + self.client.login(user=USER, passwd=PASSWD) + self.client.sendcmd('rein') + # user not authenticated, error response expected + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.sendcmd, 'pwd') + # by logging-in again we should be able to execute a + # file-system command + self.client.login(user=USER, passwd=PASSWD) + self.client.sendcmd('pwd') + + @retry_on_failure() + def test_rein_during_transfer(self): + # Test REIN while already authenticated and a transfer is + # in progress. + self.client.login(user=USER, passwd=PASSWD) + data = b'abcde12345' * 1000000 + self.file.write(data) + self.file.close() + + conn = self.client.transfercmd('retr ' + TESTFN) + self.addCleanup(conn.close) + rein_sent = False + bytes_recv = 0 + while True: + chunk = conn.recv(BUFSIZE) + if not chunk: + break + bytes_recv += len(chunk) + self.dummyfile.write(chunk) + if bytes_recv > INTERRUPTED_TRANSF_SIZE and not rein_sent: + rein_sent = True + # flush account, error response expected + self.client.sendcmd('rein') + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.dir) + + # a 226 response is expected once tranfer finishes + self.assertEqual(self.client.voidresp()[:3], '226') + # account is still flushed, error response is still expected + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.sendcmd, 'size ' + TESTFN) + # by logging-in again we should be able to execute a + # filesystem command + self.client.login(user=USER, passwd=PASSWD) + self.client.sendcmd('pwd') + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + + def test_user(self): + # Test USER while already authenticated and no transfer + # is in progress. + self.client.login(user=USER, passwd=PASSWD) + self.client.sendcmd('user ' + USER) # authentication flushed + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.sendcmd, 'pwd') + self.client.sendcmd('pass ' + PASSWD) + self.client.sendcmd('pwd') + + def test_user_during_transfer(self): + # Test USER while already authenticated and a transfer is + # in progress. + self.client.login(user=USER, passwd=PASSWD) + data = b'abcde12345' * 1000000 + self.file.write(data) + self.file.close() + + conn = self.client.transfercmd('retr ' + TESTFN) + self.addCleanup(conn.close) + rein_sent = 0 + bytes_recv = 0 + while True: + chunk = conn.recv(BUFSIZE) + if not chunk: + break + bytes_recv += len(chunk) + self.dummyfile.write(chunk) + # stop transfer while it isn't finished yet + if bytes_recv > INTERRUPTED_TRANSF_SIZE and not rein_sent: + rein_sent = True + # flush account, expect an error response + self.client.sendcmd('user ' + USER) + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.dir) + + # a 226 response is expected once transfer finishes + self.assertEqual(self.client.voidresp()[:3], '226') + # account is still flushed, error response is still expected + self.assertRaisesRegex(ftplib.error_perm, + '530 Log in with USER and PASS first', + self.client.sendcmd, 'pwd') + # by logging-in again we should be able to execute a + # filesystem command + self.client.sendcmd('pass ' + PASSWD) + self.client.sendcmd('pwd') + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + + +class TestFtpDummyCmds(unittest.TestCase): + "test: TYPE, STRU, MODE, NOOP, SYST, ALLO, HELP, SITE HELP" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + self.client.close() + self.server.stop() + + def test_type(self): + self.client.sendcmd('type a') + self.client.sendcmd('type i') + self.client.sendcmd('type l7') + self.client.sendcmd('type l8') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'type ?!?') + + def test_stru(self): + self.client.sendcmd('stru f') + self.client.sendcmd('stru F') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'stru p') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'stru r') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'stru ?!?') + + def test_mode(self): + self.client.sendcmd('mode s') + self.client.sendcmd('mode S') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'mode b') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'mode c') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'mode ?!?') + + def test_noop(self): + self.client.sendcmd('noop') + + def test_syst(self): + self.client.sendcmd('syst') + + def test_allo(self): + self.client.sendcmd('allo x') + + def test_quit(self): + self.client.sendcmd('quit') + + def test_help(self): + self.client.sendcmd('help') + cmd = random.choice(list(FTPHandler.proto_cmds.keys())) + self.client.sendcmd('help %s' % cmd) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'help ?!?') + + def test_site(self): + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'site') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'site ?!?') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site foo bar') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'sitefoo bar') + + def test_site_help(self): + self.client.sendcmd('site help') + self.client.sendcmd('site help help') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site help ?!?') + + def test_rest(self): + # Test error conditions only; resumed data transfers are + # tested later. + self.client.sendcmd('type i') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'rest') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'rest str') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'rest -1') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'rest 10.1') + # REST is not supposed to be allowed in ASCII mode + self.client.sendcmd('type a') + self.assertRaisesRegex(ftplib.error_perm, 'not allowed in ASCII mode', + self.client.sendcmd, 'rest 10') + + def test_feat(self): + resp = self.client.sendcmd('feat') + self.assertTrue('UTF8' in resp) + self.assertTrue('TVFS' in resp) + + def test_opts_feat(self): + self.assertRaises( + ftplib.error_perm, self.client.sendcmd, 'opts mlst bad_fact') + self.assertRaises( + ftplib.error_perm, self.client.sendcmd, 'opts mlst type ;') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'opts not_mlst') + # utility function which used for extracting the MLST "facts" + # string from the FEAT response + + def mlst(): + resp = self.client.sendcmd('feat') + return re.search(r'^\s*MLST\s+(\S+)$', resp, re.MULTILINE).group(1) + # we rely on "type", "perm", "size", and "modify" facts which + # are those available on all platforms + self.assertTrue('type*;perm*;size*;modify*;' in mlst()) + self.assertEqual(self.client.sendcmd( + 'opts mlst type;'), '200 MLST OPTS type;') + self.assertEqual(self.client.sendcmd( + 'opts mLSt TypE;'), '200 MLST OPTS type;') + self.assertTrue('type*;perm;size;modify;' in mlst()) + + self.assertEqual(self.client.sendcmd('opts mlst'), '200 MLST OPTS ') + self.assertTrue('*' not in mlst()) + + self.assertEqual( + self.client.sendcmd('opts mlst fish;cakes;'), '200 MLST OPTS ') + self.assertTrue('*' not in mlst()) + self.assertEqual(self.client.sendcmd('opts mlst fish;cakes;type;'), + '200 MLST OPTS type;') + self.assertTrue('type*;perm;size;modify;' in mlst()) + + +class TestFtpCmdsSemantic(unittest.TestCase): + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + arg_cmds = ['allo', 'appe', 'dele', 'eprt', 'mdtm', 'mode', 'mkd', 'opts', + 'port', 'rest', 'retr', 'rmd', 'rnfr', 'rnto', 'site', 'size', + 'stor', 'stru', 'type', 'user', 'xmkd', 'xrmd', 'site chmod'] + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + self.client.close() + self.server.stop() + + def test_arg_cmds(self): + # Test commands requiring an argument. + expected = "501 Syntax error: command needs an argument." + for cmd in self.arg_cmds: + self.client.putcmd(cmd) + resp = self.client.getmultiline() + self.assertEqual(resp, expected) + + def test_no_arg_cmds(self): + # Test commands accepting no arguments. + expected = "501 Syntax error: command does not accept arguments." + narg_cmds = ['abor', 'cdup', 'feat', 'noop', 'pasv', 'pwd', 'quit', + 'rein', 'syst', 'xcup', 'xpwd'] + for cmd in narg_cmds: + self.client.putcmd(cmd + ' arg') + resp = self.client.getmultiline() + self.assertEqual(resp, expected) + + def test_auth_cmds(self): + # Test those commands requiring client to be authenticated. + expected = "530 Log in with USER and PASS first." + self.client.sendcmd('rein') + for cmd in self.server.handler.proto_cmds: + cmd = cmd.lower() + if cmd in ('feat', 'help', 'noop', 'user', 'pass', 'stat', 'syst', + 'quit', 'site', 'site help', 'pbsz', 'auth', 'prot', + 'ccc'): + continue + if cmd in self.arg_cmds: + cmd = cmd + ' arg' + self.client.putcmd(cmd) + resp = self.client.getmultiline() + self.assertEqual(resp, expected) + + def test_no_auth_cmds(self): + # Test those commands that do not require client to be authenticated. + self.client.sendcmd('rein') + for cmd in ('feat', 'help', 'noop', 'stat', 'syst', 'site help'): + self.client.sendcmd(cmd) + # STAT provided with an argument is equal to LIST hence not allowed + # if not authenticated + self.assertRaisesRegex(ftplib.error_perm, '530 Log in with USER', + self.client.sendcmd, 'stat /') + self.client.sendcmd('quit') + + +class TestFtpFsOperations(unittest.TestCase): + + "test: PWD, CWD, CDUP, SIZE, RNFR, RNTO, DELE, MKD, RMD, MDTM, STAT" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.tempfile = os.path.basename(touch(TESTFN)) + self.tempdir = os.path.basename(tempfile.mkdtemp(dir=HOME)) + + def tearDown(self): + self.client.close() + self.server.stop() + safe_remove(self.tempfile) + if os.path.exists(self.tempdir): + shutil.rmtree(self.tempdir) + + def test_cwd(self): + self.client.cwd(self.tempdir) + self.assertEqual(self.client.pwd(), '/' + self.tempdir) + self.assertRaises(ftplib.error_perm, self.client.cwd, 'subtempdir') + # cwd provided with no arguments is supposed to move us to the + # root directory + self.client.sendcmd('cwd') + self.assertEqual(self.client.pwd(), u('/')) + + def test_pwd(self): + self.assertEqual(self.client.pwd(), u('/')) + self.client.cwd(self.tempdir) + self.assertEqual(self.client.pwd(), '/' + self.tempdir) + + def test_cdup(self): + subfolder = os.path.basename(tempfile.mkdtemp(dir=self.tempdir)) + self.assertEqual(self.client.pwd(), u('/')) + self.client.cwd(self.tempdir) + self.assertEqual(self.client.pwd(), '/%s' % self.tempdir) + self.client.cwd(subfolder) + self.assertEqual(self.client.pwd(), + '/%s/%s' % (self.tempdir, subfolder)) + self.client.sendcmd('cdup') + self.assertEqual(self.client.pwd(), '/%s' % self.tempdir) + self.client.sendcmd('cdup') + self.assertEqual(self.client.pwd(), u('/')) + + # make sure we can't escape from root directory + self.client.sendcmd('cdup') + self.assertEqual(self.client.pwd(), u('/')) + + def test_mkd(self): + tempdir = os.path.basename(tempfile.mktemp(dir=HOME)) + dirname = self.client.mkd(tempdir) + # the 257 response is supposed to include the absolute dirname + self.assertEqual(dirname, '/' + tempdir) + # make sure we can't create directories which already exist + # (probably not really necessary); + # let's use a try/except statement to avoid leaving behind + # orphaned temporary directory in the event of a test failure. + try: + self.client.mkd(tempdir) + except ftplib.error_perm: + os.rmdir(tempdir) # ok + else: + self.fail('ftplib.error_perm not raised.') + + def test_rmd(self): + self.client.rmd(self.tempdir) + self.assertRaises(ftplib.error_perm, self.client.rmd, self.tempfile) + # make sure we can't remove the root directory + self.assertRaisesRegex(ftplib.error_perm, + "Can't remove root directory", + self.client.rmd, u('/')) + + def test_dele(self): + self.client.delete(self.tempfile) + self.assertRaises(ftplib.error_perm, self.client.delete, self.tempdir) + + def test_rnfr_rnto(self): + # rename file + tempname = os.path.basename(tempfile.mktemp(dir=HOME)) + self.client.rename(self.tempfile, tempname) + self.client.rename(tempname, self.tempfile) + # rename dir + tempname = os.path.basename(tempfile.mktemp(dir=HOME)) + self.client.rename(self.tempdir, tempname) + self.client.rename(tempname, self.tempdir) + # rnfr/rnto over non-existing paths + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.rename, bogus, '/x') + self.assertRaises( + ftplib.error_perm, self.client.rename, self.tempfile, u('/')) + # rnto sent without first specifying the source + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'rnto ' + self.tempfile) + + # make sure we can't rename root directory + self.assertRaisesRegex(ftplib.error_perm, + "Can't rename home directory", + self.client.rename, '/', '/x') + + def test_mdtm(self): + self.client.sendcmd('mdtm ' + self.tempfile) + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'mdtm ' + bogus) + # make sure we can't use mdtm against directories + try: + self.client.sendcmd('mdtm ' + self.tempdir) + except ftplib.error_perm as err: + self.assertTrue("not retrievable" in str(err)) + else: + self.fail('Exception not raised') + + def test_unforeseen_mdtm_event(self): + # Emulate a case where the file last modification time is prior + # to year 1900. This most likely will never happen unless + # someone specifically force the last modification time of a + # file in some way. + # To do so we temporarily override os.path.getmtime so that it + # returns a negative value referring to a year prior to 1900. + # It causes time.localtime/gmtime to raise a ValueError exception + # which is supposed to be handled by server. + + # On python 3 it seems that the trick of replacing the original + # method with the lambda doesn't work. + if not PY3: + _getmtime = AbstractedFS.getmtime + try: + AbstractedFS.getmtime = lambda x, y: -9000000000 + self.assertRaisesRegex( + ftplib.error_perm, + "550 Can't determine file's last modification time", + self.client.sendcmd, 'mdtm ' + self.tempfile) + # make sure client hasn't been disconnected + self.client.sendcmd('noop') + finally: + AbstractedFS.getmtime = _getmtime + + def test_size(self): + self.client.sendcmd('type a') + self.assertRaises(ftplib.error_perm, self.client.size, self.tempfile) + self.client.sendcmd('type i') + self.client.size(self.tempfile) + # make sure we can't use size against directories + try: + self.client.sendcmd('size ' + self.tempdir) + except ftplib.error_perm as err: + self.assertTrue("not retrievable" in str(err)) + else: + self.fail('Exception not raised') + + if not hasattr(os, 'chmod'): + def test_site_chmod(self): + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site chmod 777 ' + self.tempfile) + else: + def test_site_chmod(self): + # not enough args + self.assertRaises(ftplib.error_perm, + self.client.sendcmd, 'site chmod 777') + # bad args + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site chmod -177 ' + self.tempfile) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site chmod 778 ' + self.tempfile) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site chmod foo ' + self.tempfile) + + def getmode(): + mode = oct(stat.S_IMODE(os.stat(self.tempfile).st_mode)) + if PY3: + mode = mode.replace('o', '') + return mode + + # on Windows it is possible to set read-only flag only + if WINDOWS: + self.client.sendcmd('site chmod 777 ' + self.tempfile) + self.assertEqual(getmode(), '0666') + self.client.sendcmd('site chmod 444 ' + self.tempfile) + self.assertEqual(getmode(), '0444') + self.client.sendcmd('site chmod 666 ' + self.tempfile) + self.assertEqual(getmode(), '0666') + else: + self.client.sendcmd('site chmod 777 ' + self.tempfile) + self.assertEqual(getmode(), '0777') + self.client.sendcmd('site chmod 755 ' + self.tempfile) + self.assertEqual(getmode(), '0755') + self.client.sendcmd('site chmod 555 ' + self.tempfile) + self.assertEqual(getmode(), '0555') + + +class TestFtpStoreData(unittest.TestCase): + """Test STOR, STOU, APPE, REST, TYPE.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.dummy_recvfile = BytesIO() + self.dummy_sendfile = BytesIO() + + def tearDown(self): + self.client.close() + self.server.stop() + self.dummy_recvfile.close() + self.dummy_sendfile.close() + safe_remove(TESTFN) + + def test_stor(self): + try: + data = b'abcde12345' * 100000 + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + self.client.retrbinary('retr ' + TESTFN, self.dummy_recvfile.write) + self.dummy_recvfile.seek(0) + datafile = self.dummy_recvfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(TESTFN): + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + def test_stor_active(self): + # Like test_stor but using PORT + self.client.set_pasv(False) + self.test_stor() + + def test_stor_ascii(self): + # Test STOR in ASCII mode + + def store(cmd, fp, blocksize=8192): + # like storbinary() except it sends "type a" instead of + # "type i" before starting the transfer + self.client.voidcmd('type a') + with contextlib.closing(self.client.transfercmd(cmd)) as conn: + while True: + buf = fp.read(blocksize) + if not buf: + break + conn.sendall(buf) + return self.client.voidresp() + + try: + data = b'abcde12345\r\n' * 100000 + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + store('stor ' + TESTFN, self.dummy_sendfile) + self.client.retrbinary('retr ' + TESTFN, self.dummy_recvfile.write) + expected = data.replace(b'\r\n', b(os.linesep)) + self.dummy_recvfile.seek(0) + datafile = self.dummy_recvfile.read() + self.assertEqual(len(expected), len(datafile)) + self.assertEqual(hash(expected), hash(datafile)) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(TESTFN): + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + def test_stor_ascii_2(self): + # Test that no extra extra carriage returns are added to the + # file in ASCII mode in case CRLF gets truncated in two chunks + # (issue 116) + + def store(cmd, fp, blocksize=8192): + # like storbinary() except it sends "type a" instead of + # "type i" before starting the transfer + self.client.voidcmd('type a') + with contextlib.closing(self.client.transfercmd(cmd)) as conn: + while True: + buf = fp.read(blocksize) + if not buf: + break + conn.sendall(buf) + return self.client.voidresp() + + old_buffer = DTPHandler.ac_in_buffer_size + try: + # set a small buffer so that CRLF gets delivered in two + # separate chunks: "CRLF", " f", "oo", " CR", "LF", " b", "ar" + DTPHandler.ac_in_buffer_size = 2 + data = b'\r\n foo \r\n bar' + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + store('stor ' + TESTFN, self.dummy_sendfile) + + expected = data.replace(b'\r\n', b(os.linesep)) + self.client.retrbinary('retr ' + TESTFN, self.dummy_recvfile.write) + self.dummy_recvfile.seek(0) + self.assertEqual(expected, self.dummy_recvfile.read()) + finally: + DTPHandler.ac_in_buffer_size = old_buffer + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(TESTFN): + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + def test_stou(self): + data = b'abcde12345' * 100000 + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + + self.client.voidcmd('TYPE I') + # filename comes in as "1xx FILE: " + filename = self.client.sendcmd('stou').split('FILE: ')[1] + try: + with contextlib.closing(self.client.makeport()) as sock: + conn, sockaddr = sock.accept() + with contextlib.closing(conn): + conn.settimeout(TIMEOUT) + if hasattr(self.client_class, 'ssl_version'): + conn = ssl.wrap_socket(conn) + while True: + buf = self.dummy_sendfile.read(8192) + if not buf: + break + conn.sendall(buf) + # transfer finished, a 226 response is expected + self.assertEqual('226', self.client.voidresp()[:3]) + self.client.retrbinary('retr ' + filename, + self.dummy_recvfile.write) + self.dummy_recvfile.seek(0) + datafile = self.dummy_recvfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(filename): + try: + self.client.delete(filename) + except (ftplib.Error, EOFError, socket.error): + safe_remove(filename) + + def test_stou_rest(self): + # Watch for STOU preceded by REST, which makes no sense. + self.client.sendcmd('type i') + self.client.sendcmd('rest 10') + self.assertRaisesRegex(ftplib.error_temp, "Can't STOU while REST", + self.client.sendcmd, 'stou') + + def test_stou_orphaned_file(self): + # Check that no orphaned file gets left behind when STOU fails. + # Even if STOU fails the file is first created and then erased. + # Since we can't know the name of the file the best way that + # we have to test this case is comparing the content of the + # directory before and after STOU has been issued. + # Assuming that TESTFN is supposed to be a "reserved" file + # name we shouldn't get false positives. + safe_remove(TESTFN) + # login as a limited user in order to make STOU fail + self.client.login('anonymous', '@nopasswd') + before = os.listdir(HOME) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'stou ' + TESTFN) + after = os.listdir(HOME) + if before != after: + for file in after: + self.assertFalse(file.startswith(TESTFN)) + + def test_appe(self): + try: + data1 = b'abcde12345' * 100000 + self.dummy_sendfile.write(data1) + self.dummy_sendfile.seek(0) + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + + data2 = b'fghil67890' * 100000 + self.dummy_sendfile.write(data2) + self.dummy_sendfile.seek(len(data1)) + self.client.storbinary('appe ' + TESTFN, self.dummy_sendfile) + + self.client.retrbinary("retr " + TESTFN, self.dummy_recvfile.write) + self.dummy_recvfile.seek(0) + datafile = self.dummy_recvfile.read() + self.assertEqual(len(data1 + data2), len(datafile)) + self.assertEqual(hash(data1 + data2), hash(datafile)) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(TESTFN): + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + def test_appe_rest(self): + # Watch for APPE preceded by REST, which makes no sense. + self.client.sendcmd('type i') + self.client.sendcmd('rest 10') + self.assertRaisesRegex(ftplib.error_temp, "Can't APPE while REST", + self.client.sendcmd, 'appe x') + + def test_rest_on_stor(self): + # Test STOR preceded by REST. + data = b'abcde12345' * 100000 + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + + self.client.voidcmd('TYPE I') + with contextlib.closing( + self.client.transfercmd('stor ' + TESTFN)) as conn: + bytes_sent = 0 + while True: + chunk = self.dummy_sendfile.read(BUFSIZE) + conn.sendall(chunk) + bytes_sent += len(chunk) + # stop transfer while it isn't finished yet + if bytes_sent >= INTERRUPTED_TRANSF_SIZE or not chunk: + break + + # transfer wasn't finished yet but server can't know this, + # hence expect a 226 response + self.assertEqual('226', self.client.voidresp()[:3]) + + # resuming transfer by using a marker value greater than the + # file size stored on the server should result in an error + # on stor + file_size = self.client.size(TESTFN) + self.assertEqual(file_size, bytes_sent) + self.client.sendcmd('rest %s' % ((file_size + 1))) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'stor ' + TESTFN) + self.client.sendcmd('rest %s' % bytes_sent) + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + + self.client.retrbinary('retr ' + TESTFN, self.dummy_recvfile.write) + self.dummy_sendfile.seek(0) + self.dummy_recvfile.seek(0) + + data_sendfile = self.dummy_sendfile.read() + data_recvfile = self.dummy_recvfile.read() + self.assertEqual(len(data_sendfile), len(data_recvfile)) + self.assertEqual(len(data_sendfile), len(data_recvfile)) + self.client.delete(TESTFN) + + def test_failing_rest_on_stor(self): + # Test REST -> STOR against a non existing file. + if os.path.exists(TESTFN): + self.client.delete(TESTFN) + self.client.sendcmd('type i') + self.client.sendcmd('rest 10') + self.assertRaises(ftplib.error_perm, self.client.storbinary, + 'stor ' + TESTFN, lambda x: x) + # if the first STOR failed because of REST, the REST marker + # is supposed to be resetted to 0 + self.dummy_sendfile.write(b'x' * 4096) + self.dummy_sendfile.seek(0) + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + + def test_quit_during_transfer(self): + # RFC-959 states that if QUIT is sent while a transfer is in + # progress, the connection must remain open for result response + # and the server will then close it. + with contextlib.closing( + self.client.transfercmd('stor ' + TESTFN)) as conn: + conn.sendall(b'abcde12345' * 50000) + self.client.sendcmd('quit') + conn.sendall(b'abcde12345' * 50000) + # expect the response (transfer ok) + self.assertEqual('226', self.client.voidresp()[:3]) + # Make sure client has been disconnected. + # socket.error (Windows) or EOFError (Linux) exception is supposed + # to be raised in such a case. + self.client.sock.settimeout(.1) + self.assertRaises((socket.error, EOFError), + self.client.sendcmd, 'noop') + + def test_stor_empty_file(self): + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + self.client.quit() + with open(TESTFN) as f: + self.assertEqual(f.read(), "") + + +@unittest.skipUnless(POSIX, "POSIX only") +@unittest.skipIf(sys.version_info < (3, 3) and sendfile is None, + "pysendfile not installed") +class TestFtpStoreDataNoSendfile(TestFtpStoreData): + """Test STOR, STOU, APPE, REST, TYPE not using sendfile().""" + + def setUp(self): + TestFtpStoreData.setUp(self) + with self.server.lock: + self.server.handler.use_sendfile = False + + def tearDown(self): + TestFtpStoreData.tearDown(self) + with self.server.lock: + self.server.handler.use_sendfile = True + + +@unittest.skipUnless(POSIX, "POSIX only") +@unittest.skipIf(sys.version_info < (3, 3) and sendfile is None, + "pysendfile not installed") +class TestSendfile(unittest.TestCase): + """Sendfile specific tests.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.dummy_recvfile = BytesIO() + self.dummy_sendfile = BytesIO() + + def tearDown(self): + self.client.close() + self.server.stop() + self.dummy_recvfile.close() + self.dummy_sendfile.close() + safe_remove(TESTFN) + + def test_fallback(self): + # Makes sure that if sendfile() fails and no bytes were + # transmitted yet the server falls back on using plain + # send() + data = b'abcde12345' * 100000 + self.dummy_sendfile.write(data) + self.dummy_sendfile.seek(0) + self.client.storbinary('stor ' + TESTFN, self.dummy_sendfile) + with mock.patch('pyftpdlib.handlers.sendfile', + side_effect=OSError(errno.EINVAL)) as fun: + try: + self.client.retrbinary( + 'retr ' + TESTFN, self.dummy_recvfile.write) + assert fun.called + self.dummy_recvfile.seek(0) + datafile = self.dummy_recvfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + if os.path.exists(TESTFN): + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + +class TestFtpRetrieveData(unittest.TestCase): + + "Test RETR, REST, TYPE" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.file = open(TESTFN, 'w+b') + self.dummyfile = BytesIO() + + def tearDown(self): + self.client.close() + self.server.stop() + if not self.file.closed: + self.file.close() + if not self.dummyfile.closed: + self.dummyfile.close() + safe_remove(TESTFN) + + def test_retr(self): + data = b'abcde12345' * 100000 + self.file.write(data) + self.file.close() + self.client.retrbinary("retr " + TESTFN, self.dummyfile.write) + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + + # attempt to retrieve a file which doesn't exist + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.retrbinary, + "retr " + bogus, lambda x: x) + + def test_retr_ascii(self): + # Test RETR in ASCII mode. + + def retrieve(cmd, callback, blocksize=8192, rest=None): + # like retrbinary but uses TYPE A instead + self.client.voidcmd('type a') + with contextlib.closing( + self.client.transfercmd(cmd, rest)) as conn: + conn.settimeout(TIMEOUT) + while True: + data = conn.recv(blocksize) + if not data: + break + callback(data) + return self.client.voidresp() + + data = (b'abcde12345' + b(os.linesep)) * 100000 + self.file.write(data) + self.file.close() + retrieve("retr " + TESTFN, self.dummyfile.write) + expected = data.replace(b(os.linesep), b'\r\n') + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(expected), len(datafile)) + self.assertEqual(hash(expected), hash(datafile)) + + @retry_on_failure() + def test_restore_on_retr(self): + data = b'abcde12345' * 1000000 + self.file.write(data) + self.file.close() + + received_bytes = 0 + self.client.voidcmd('TYPE I') + with contextlib.closing( + self.client.transfercmd('retr ' + TESTFN)) as conn: + conn.settimeout(TIMEOUT) + while True: + chunk = conn.recv(BUFSIZE) + if not chunk: + break + self.dummyfile.write(chunk) + received_bytes += len(chunk) + if received_bytes >= INTERRUPTED_TRANSF_SIZE: + break + + # transfer wasn't finished yet so we expect a 426 response + self.assertEqual(self.client.getline()[:3], "426") + + # resuming transfer by using a marker value greater than the + # file size stored on the server should result in an error + # on retr (RFC-1123) + file_size = self.client.size(TESTFN) + self.client.sendcmd('rest %s' % ((file_size + 1))) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'retr ' + TESTFN) + # test resume + self.client.sendcmd('rest %s' % received_bytes) + self.client.retrbinary("retr " + TESTFN, self.dummyfile.write) + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + + def test_retr_empty_file(self): + self.client.retrbinary("retr " + TESTFN, self.dummyfile.write) + self.dummyfile.seek(0) + self.assertEqual(self.dummyfile.read(), b"") + + +@unittest.skipUnless(POSIX, "POSIX only") +@unittest.skipIf(sys.version_info < (3, 3) and sendfile is None, + "pysendfile not installed") +class TestFtpRetrieveDataNoSendfile(TestFtpRetrieveData): + """Test RETR, REST, TYPE by not using sendfile().""" + + def setUp(self): + TestFtpRetrieveData.setUp(self) + with self.server.lock: + self.server.handler.use_sendfile = False + + def tearDown(self): + TestFtpRetrieveData.tearDown(self) + with self.server.lock: + self.server.handler.use_sendfile = True + + +class TestFtpListingCmds(unittest.TestCase): + """Test LIST, NLST, argumented STAT.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + touch(TESTFN) + + def tearDown(self): + self.client.close() + self.server.stop() + os.remove(TESTFN) + + def _test_listing_cmds(self, cmd): + """Tests common to LIST NLST and MLSD commands.""" + # assume that no argument has the same meaning of "/" + l1 = l2 = [] + self.client.retrlines(cmd, l1.append) + self.client.retrlines(cmd + ' /', l2.append) + self.assertEqual(l1, l2) + if cmd.lower() != 'mlsd': + # if pathname is a file one line is expected + x = [] + self.client.retrlines('%s ' % cmd + TESTFN, x.append) + self.assertEqual(len(x), 1) + self.assertTrue(''.join(x).endswith(TESTFN)) + # non-existent path, 550 response is expected + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.retrlines, + '%s ' % cmd + bogus, lambda x: x) + # for an empty directory we excpect that the data channel is + # opened anyway and that no data is received + x = [] + tempdir = os.path.basename(tempfile.mkdtemp(dir=HOME)) + try: + self.client.retrlines('%s %s' % (cmd, tempdir), x.append) + self.assertEqual(x, []) + finally: + safe_rmdir(tempdir) + + def test_nlst(self): + # common tests + self._test_listing_cmds('nlst') + + def test_list(self): + # common tests + self._test_listing_cmds('list') + # known incorrect pathname arguments (e.g. old clients) are + # expected to be treated as if pathname would be == '/' + l1 = l2 = l3 = l4 = l5 = [] + self.client.retrlines('list /', l1.append) + self.client.retrlines('list -a', l2.append) + self.client.retrlines('list -l', l3.append) + self.client.retrlines('list -al', l4.append) + self.client.retrlines('list -la', l5.append) + tot = (l1, l2, l3, l4, l5) + for x in range(len(tot) - 1): + self.assertEqual(tot[x], tot[x + 1]) + + def test_mlst(self): + # utility function for extracting the line of interest + def mlstline(cmd): + return self.client.voidcmd(cmd).split('\n')[1] + + # the fact set must be preceded by a space + self.assertTrue(mlstline('mlst').startswith(' ')) + # where TVFS is supported, a fully qualified pathname is expected + self.assertTrue(mlstline('mlst ' + TESTFN).endswith('/' + TESTFN)) + self.assertTrue(mlstline('mlst').endswith('/')) + # assume that no argument has the same meaning of "/" + self.assertEqual(mlstline('mlst'), mlstline('mlst /')) + # non-existent path + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'mlst ' + bogus) + # test file/dir notations + self.assertTrue('type=dir' in mlstline('mlst')) + self.assertTrue('type=file' in mlstline('mlst ' + TESTFN)) + # let's add some tests for OPTS command + self.client.sendcmd('opts mlst type;') + self.assertEqual(mlstline('mlst'), ' type=dir; /') + # where no facts are present, two leading spaces before the + # pathname are required (RFC-3659) + self.client.sendcmd('opts mlst') + self.assertEqual(mlstline('mlst'), ' /') + + def test_mlsd(self): + # common tests + self._test_listing_cmds('mlsd') + dir = os.path.basename(tempfile.mkdtemp(dir=HOME)) + self.addCleanup(safe_rmdir, dir) + try: + self.client.retrlines('mlsd ' + TESTFN, lambda x: x) + except ftplib.error_perm as err: + resp = str(err) + # if path is a file a 501 response code is expected + self.assertEqual(str(resp)[0:3], "501") + else: + self.fail("Exception not raised") + + def test_mlsd_all_facts(self): + feat = self.client.sendcmd('feat') + # all the facts + facts = re.search(r'^\s*MLST\s+(\S+)$', feat, re.MULTILINE).group(1) + facts = facts.replace("*;", ";") + self.client.sendcmd('opts mlst ' + facts) + resp = self.client.sendcmd('mlst') + + local = facts[:-1].split(";") + returned = resp.split("\n")[1].strip()[:-3] + returned = [x.split("=")[0] for x in returned.split(";")] + self.assertEqual(sorted(local), sorted(returned)) + + self.assertTrue("type" in resp) + self.assertTrue("size" in resp) + self.assertTrue("perm" in resp) + self.assertTrue("modify" in resp) + if POSIX: + self.assertTrue("unique" in resp) + self.assertTrue("unix.mode" in resp) + self.assertTrue("unix.uid" in resp) + self.assertTrue("unix.gid" in resp) + elif WINDOWS: + self.assertTrue("create" in resp) + + def test_stat(self): + # Test STAT provided with argument which is equal to LIST + self.client.sendcmd('stat /') + self.client.sendcmd('stat ' + TESTFN) + self.client.putcmd('stat *') + resp = self.client.getmultiline() + self.assertEqual(resp, '550 Globbing not supported.') + bogus = os.path.basename(tempfile.mktemp(dir=HOME)) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'stat ' + bogus) + + def test_unforeseen_time_event(self): + # Emulate a case where the file last modification time is prior + # to year 1900. This most likely will never happen unless + # someone specifically force the last modification time of a + # file in some way. + # To do so we temporarily override os.path.getmtime so that it + # returns a negative value referring to a year prior to 1900. + # It causes time.localtime/gmtime to raise a ValueError exception + # which is supposed to be handled by server. + _getmtime = AbstractedFS.getmtime + try: + AbstractedFS.getmtime = lambda x, y: -9000000000 + self.client.sendcmd('stat /') # test AbstractedFS.format_list() + self.client.sendcmd('mlst /') # test AbstractedFS.format_mlsx() + # make sure client hasn't been disconnected + self.client.sendcmd('noop') + finally: + AbstractedFS.getmtime = _getmtime + + +class TestFtpAbort(unittest.TestCase): + + "test: ABOR" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + self.client.close() + self.server.stop() + + def test_abor_no_data(self): + # Case 1: ABOR while no data channel is opened: respond with 225. + resp = self.client.sendcmd('ABOR') + self.assertEqual('225 No transfer to abort.', resp) + self.client.retrlines('list', [].append) + + def test_abor_pasv(self): + # Case 2: user sends a PASV, a data-channel socket is listening + # but not connected, and ABOR is sent: close listening data + # socket, respond with 225. + self.client.makepasv() + respcode = self.client.sendcmd('ABOR')[:3] + self.assertEqual('225', respcode) + self.client.retrlines('list', [].append) + + def test_abor_port(self): + # Case 3: data channel opened with PASV or PORT, but ABOR sent + # before a data transfer has been started: close data channel, + # respond with 225 + self.client.set_pasv(0) + with contextlib.closing(self.client.makeport()): + respcode = self.client.sendcmd('ABOR')[:3] + self.assertEqual('225', respcode) + self.client.retrlines('list', [].append) + + def test_abor_during_transfer(self): + # Case 4: ABOR while a data transfer on DTP channel is in + # progress: close data channel, respond with 426, respond + # with 226. + data = b'abcde12345' * 1000000 + with open(TESTFN, 'w+b') as f: + f.write(data) + try: + self.client.voidcmd('TYPE I') + with contextlib.closing( + self.client.transfercmd('retr ' + TESTFN)) as conn: + bytes_recv = 0 + while bytes_recv < 65536: + chunk = conn.recv(BUFSIZE) + bytes_recv += len(chunk) + + # stop transfer while it isn't finished yet + self.client.putcmd('ABOR') + + # transfer isn't finished yet so ftpd should respond with 426 + self.assertEqual(self.client.getline()[:3], "426") + + # transfer successfully aborted, so should now respond + # with a 226 + self.assertEqual('226', self.client.voidresp()[:3]) + finally: + # We do not use os.remove() because file could still be + # locked by ftpd thread. If DELE through FTP fails try + # os.remove() as last resort. + try: + self.client.delete(TESTFN) + except (ftplib.Error, EOFError, socket.error): + safe_remove(TESTFN) + + @unittest.skipUnless(hasattr(socket, 'MSG_OOB'), "MSG_OOB not available") + @unittest.skipIf(sys.version_info < (2, 6), + "does not work on python < 2.6") + @unittest.skipIf(OSX, "does not work on OSX") + def test_oob_abor(self): + # Send ABOR by following the RFC-959 directives of sending + # Telnet IP/Synch sequence as OOB data. + # On some systems like FreeBSD this happened to be a problem + # due to a different SO_OOBINLINE behavior. + # On some platforms (e.g. Python CE) the test may fail + # although the MSG_OOB constant is defined. + self.client.sock.sendall(b(chr(244)), socket.MSG_OOB) + self.client.sock.sendall(b(chr(255)), socket.MSG_OOB) + self.client.sock.sendall(b'abor\r\n') + self.assertEqual(self.client.getresp()[:3], '225') + + +class TestThrottleBandwidth(unittest.TestCase): + """Test ThrottledDTPHandler class.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + class CustomDTPHandler(ThrottledDTPHandler): + # overridden so that the "awake" callback is executed + # immediately; this way we won't introduce any slowdown + # and still test the code of interest + + def _throttle_bandwidth(self, *args, **kwargs): + ThrottledDTPHandler._throttle_bandwidth(self, *args, **kwargs) + if (self._throttler is not None and not + self._throttler.cancelled): + self._throttler.call() + self._throttler = None + + self.server = self.server_class() + with self.server.lock: + self.server.handler.dtp_handler = CustomDTPHandler + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.dummyfile = BytesIO() + + def tearDown(self): + self.client.close() + with self.server.lock: + self.server.handler.dtp_handler.read_limit = 0 + self.server.handler.dtp_handler.write_limit = 0 + self.server.handler.dtp_handler = DTPHandler + self.server.stop() + if not self.dummyfile.closed: + self.dummyfile.close() + if os.path.exists(TESTFN): + os.remove(TESTFN) + + def test_throttle_send(self): + # This test doesn't test the actual speed accuracy, just + # awakes all that code which implements the throttling. + with self.server.lock: + self.server.handler.dtp_handler.write_limit = 32768 + data = b'abcde12345' * 100000 + with open(TESTFN, 'wb') as file: + file.write(data) + self.client.retrbinary("retr " + TESTFN, self.dummyfile.write) + self.dummyfile.seek(0) + datafile = self.dummyfile.read() + self.assertEqual(len(data), len(datafile)) + self.assertEqual(hash(data), hash(datafile)) + + def test_throttle_recv(self): + # This test doesn't test the actual speed accuracy, just + # awakes all that code which implements the throttling. + with self.server.lock: + self.server.handler.dtp_handler.read_limit = 32768 + data = b'abcde12345' * 100000 + self.dummyfile.write(data) + self.dummyfile.seek(0) + self.client.storbinary("stor " + TESTFN, self.dummyfile) + self.client.quit() # needed to fix occasional failures + with open(TESTFN, 'rb') as file: + file_data = file.read() + self.assertEqual(len(data), len(file_data)) + self.assertEqual(hash(data), hash(file_data)) + + +class TestTimeouts(unittest.TestCase): + """Test idle-timeout capabilities of control and data channels. + Some tests may fail on slow machines. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = None + self.client = None + + def _setUp(self, idle_timeout=300, data_timeout=300, pasv_timeout=30, + port_timeout=30): + self.server = self.server_class() + with self.server.lock: + self.server.handler.timeout = idle_timeout + self.server.handler.dtp_handler.timeout = data_timeout + self.server.handler.passive_dtp.timeout = pasv_timeout + self.server.handler.active_dtp.timeout = port_timeout + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + if self.client is not None and self.server is not None: + self.client.close() + with self.server.lock: + self.server.handler.timeout = 300 + self.server.handler.dtp_handler.timeout = 300 + self.server.handler.passive_dtp.timeout = 30 + self.server.handler.active_dtp.timeout = 30 + self.server.stop() + + def test_idle_timeout(self): + # Test control channel timeout. The client which does not send + # any command within the time specified in FTPHandler.timeout is + # supposed to be kicked off. + self._setUp(idle_timeout=0.1) + # fail if no msg is received within 1 second + self.client.sock.settimeout(1) + data = self.client.sock.recv(BUFSIZE) + self.assertEqual(data, b"421 Control connection timed out.\r\n") + # ensure client has been kicked off + self.assertRaises((socket.error, EOFError), self.client.sendcmd, + 'noop') + + def test_data_timeout(self): + # Test data channel timeout. The client which does not send + # or receive any data within the time specified in + # DTPHandler.timeout is supposed to be kicked off. + self._setUp(data_timeout=0.1) + addr = self.client.makepasv() + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.connect(addr) + # fail if no msg is received within 1 second + self.client.sock.settimeout(1) + data = self.client.sock.recv(BUFSIZE) + self.assertEqual(data, b"421 Data connection timed out.\r\n") + # ensure client has been kicked off + self.assertRaises((socket.error, EOFError), self.client.sendcmd, + 'noop') + + def test_data_timeout_not_reached(self): + # Impose a timeout for the data channel, then keep sending data for a + # time which is longer than that to make sure that the code checking + # whether the transfer stalled for with no progress is executed. + self._setUp(data_timeout=0.1) + with contextlib.closing( + self.client.transfercmd('stor ' + TESTFN)) as sock: + if hasattr(self.client_class, 'ssl_version'): + sock = ssl.wrap_socket(sock) + try: + stop_at = time.time() + 0.2 + while time.time() < stop_at: + sock.send(b'x' * 1024) + sock.close() + self.client.voidresp() + finally: + if os.path.exists(TESTFN): + self.client.delete(TESTFN) + + def test_idle_data_timeout1(self): + # Tests that the control connection timeout is suspended while + # the data channel is opened + self._setUp(idle_timeout=0.1, data_timeout=0.2) + addr = self.client.makepasv() + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.connect(addr) + # fail if no msg is received within 1 second + self.client.sock.settimeout(1) + data = self.client.sock.recv(BUFSIZE) + self.assertEqual(data, b"421 Data connection timed out.\r\n") + # ensure client has been kicked off + self.assertRaises((socket.error, EOFError), self.client.sendcmd, + 'noop') + + def test_idle_data_timeout2(self): + # Tests that the control connection timeout is restarted after + # data channel has been closed + self._setUp(idle_timeout=0.1, data_timeout=0.2) + addr = self.client.makepasv() + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.connect(addr) + # close data channel + self.client.sendcmd('abor') + self.client.sock.settimeout(1) + data = self.client.sock.recv(BUFSIZE) + self.assertEqual(data, b"421 Control connection timed out.\r\n") + # ensure client has been kicked off + self.assertRaises((socket.error, EOFError), self.client.sendcmd, + 'noop') + + def test_pasv_timeout(self): + # Test pasv data channel timeout. The client which does not + # connect to the listening data socket within the time specified + # in PassiveDTP.timeout is supposed to receive a 421 response. + self._setUp(pasv_timeout=0.1) + self.client.makepasv() + # fail if no msg is received within 1 second + self.client.sock.settimeout(1) + data = self.client.sock.recv(BUFSIZE) + self.assertEqual(data, b"421 Passive data channel timed out.\r\n") + # client is not expected to be kicked off + self.client.sendcmd('noop') + + def test_disabled_idle_timeout(self): + self._setUp(idle_timeout=0) + self.client.sendcmd('noop') + + def test_disabled_data_timeout(self): + self._setUp(data_timeout=0) + addr = self.client.makepasv() + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.connect(addr) + + def test_disabled_pasv_timeout(self): + self._setUp(pasv_timeout=0) + self.client.makepasv() + # reset passive socket + addr = self.client.makepasv() + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.connect(addr) + + def test_disabled_port_timeout(self): + self._setUp(port_timeout=0) + with contextlib.closing(self.client.makeport()): + with contextlib.closing(self.client.makeport()): + pass + + +class TestConfigurableOptions(unittest.TestCase): + """Test those daemon options which are commonly modified by user.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + touch(TESTFN) + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + os.remove(TESTFN) + # set back options to their original value + with self.server.lock: + self.server.server.max_cons = 0 + self.server.server.max_cons_per_ip = 0 + self.server.handler.banner = "pyftpdlib ready." + self.server.handler.max_login_attempts = 3 + self.server.handler.auth_failed_timeout = 5 + self.server.handler.masquerade_address = None + self.server.handler.masquerade_address_map = {} + self.server.handler.permit_privileged_ports = False + self.server.handler.permit_foreign_addresses = False + self.server.handler.passive_ports = None + self.server.handler.use_gmt_times = True + self.server.handler.tcp_no_delay = hasattr(socket, 'TCP_NODELAY') + self.server.stop() + self.client.close() + + @disable_log_warning + def test_max_connections(self): + # Test FTPServer.max_cons attribute + with self.server.lock: + self.server.server.max_cons = 3 + self.client.quit() + c1 = self.client_class() + c2 = self.client_class() + c3 = self.client_class() + try: + c1.connect(self.server.host, self.server.port) + c2.connect(self.server.host, self.server.port) + self.assertRaises(ftplib.error_temp, c3.connect, self.server.host, + self.server.port) + # with passive data channel established + c2.quit() + c1.login(USER, PASSWD) + c1.makepasv() + self.assertRaises(ftplib.error_temp, c2.connect, self.server.host, + self.server.port) + # with passive data socket waiting for connection + c1.login(USER, PASSWD) + c1.sendcmd('pasv') + self.assertRaises(ftplib.error_temp, c2.connect, self.server.host, + self.server.port) + # with active data channel established + c1.login(USER, PASSWD) + with contextlib.closing(c1.makeport()): + self.assertRaises( + ftplib.error_temp, c2.connect, self.server.host, + self.server.port) + finally: + for c in (c1, c2, c3): + try: + c.quit() + except (socket.error, EOFError): # already disconnected + c.close() + + @disable_log_warning + def test_max_connections_per_ip(self): + # Test FTPServer.max_cons_per_ip attribute + with self.server.lock: + self.server.server.max_cons_per_ip = 3 + self.client.quit() + c1 = self.client_class() + c2 = self.client_class() + c3 = self.client_class() + c4 = self.client_class() + try: + c1.connect(self.server.host, self.server.port) + c2.connect(self.server.host, self.server.port) + c3.connect(self.server.host, self.server.port) + self.assertRaises(ftplib.error_temp, c4.connect, self.server.host, + self.server.port) + # Make sure client has been disconnected. + # socket.error (Windows) or EOFError (Linux) exception is + # supposed to be raised in such a case. + self.assertRaises((socket.error, EOFError), c4.sendcmd, 'noop') + finally: + for c in (c1, c2, c3, c4): + try: + c.quit() + except (socket.error, EOFError): # already disconnected + c.close() + + def test_banner(self): + # Test FTPHandler.banner attribute + with self.server.lock: + self.server.handler.banner = 'hello there' + self.client.close() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.assertEqual(self.client.getwelcome()[4:], 'hello there') + + def test_max_login_attempts(self): + # Test FTPHandler.max_login_attempts attribute. + with self.server.lock: + self.server.handler.max_login_attempts = 1 + self.server.handler.auth_failed_timeout = 0 + self.assertRaises(ftplib.error_perm, self.client.login, 'wrong', + 'wrong') + # socket.error (Windows) or EOFError (Linux) exceptions are + # supposed to be raised when attempting to send/recv some data + # using a disconnected socket + self.assertRaises((socket.error, EOFError), self.client.sendcmd, + 'noop') + + def test_masquerade_address(self): + # Test FTPHandler.masquerade_address attribute + host, port = self.client.makepasv() + self.assertEqual(host, self.server.host) + with self.server.lock: + self.server.handler.masquerade_address = "256.256.256.256" + host, port = self.client.makepasv() + self.assertEqual(host, "256.256.256.256") + + def test_masquerade_address_map(self): + # Test FTPHandler.masquerade_address_map attribute + host, port = self.client.makepasv() + self.assertEqual(host, self.server.host) + with self.server.lock: + self.server.handler.masquerade_address_map = {self.server.host: + "128.128.128.128"} + host, port = self.client.makepasv() + self.assertEqual(host, "128.128.128.128") + + def test_passive_ports(self): + # Test FTPHandler.passive_ports attribute + _range = list(range(40000, 60000, 200)) + with self.server.lock: + self.server.handler.passive_ports = _range + self.assertTrue(self.client.makepasv()[1] in _range) + self.assertTrue(self.client.makepasv()[1] in _range) + self.assertTrue(self.client.makepasv()[1] in _range) + self.assertTrue(self.client.makepasv()[1] in _range) + + @disable_log_warning + def test_passive_ports_busy(self): + # If the ports in the configured range are busy it is expected + # that a kernel-assigned port gets chosen + with contextlib.closing(socket.socket()) as s: + s.settimeout(TIMEOUT) + s.bind((HOST, 0)) + port = s.getsockname()[1] + with self.server.lock: + self.server.handler.passive_ports = [port] + resulting_port = self.client.makepasv()[1] + self.assertTrue(port != resulting_port) + + @disable_log_warning + def test_permit_privileged_ports(self): + # Test FTPHandler.permit_privileged_ports_active attribute + + # try to bind a socket on a privileged port + sock = None + for port in reversed(range(1, 1024)): + try: + socket.getservbyport(port) + except socket.error: + # not registered port; go on + try: + sock = socket.socket(self.client.af, socket.SOCK_STREAM) + self.addCleanup(sock.close) + sock.settimeout(TIMEOUT) + sock.bind((HOST, port)) + break + except socket.error as err: + if err.errno == errno.EACCES: + # root privileges needed + if sock is not None: + sock.close() + sock = None + break + sock.close() + continue + else: + # registered port found; skip to the next one + continue + else: + # no usable privileged port was found + sock = None + + with self.server.lock: + self.server.handler.permit_privileged_ports = False + self.assertRaises(ftplib.error_perm, self.client.sendport, HOST, + port) + if sock: + port = sock.getsockname()[1] + with self.server.lock: + self.server.handler.permit_privileged_ports = True + sock.listen(5) + sock.settimeout(TIMEOUT) + self.client.sendport(HOST, port) + s, addr = sock.accept() + s.close() + + def test_use_gmt_times(self): + # use GMT time + with self.server.lock: + self.server.handler.use_gmt_times = True + gmt1 = self.client.sendcmd('mdtm ' + TESTFN) + gmt2 = self.client.sendcmd('mlst ' + TESTFN) + gmt3 = self.client.sendcmd('stat ' + TESTFN) + + # use local time + with self.server.lock: + self.server.handler.use_gmt_times = False + + self.client.quit() + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + loc1 = self.client.sendcmd('mdtm ' + TESTFN) + loc2 = self.client.sendcmd('mlst ' + TESTFN) + loc3 = self.client.sendcmd('stat ' + TESTFN) + + # if we're not in a GMT time zone times are supposed to be + # different + if time.timezone != 0: + self.assertNotEqual(gmt1, loc1) + self.assertNotEqual(gmt2, loc2) + self.assertNotEqual(gmt3, loc3) + # ...otherwise they should be the same + else: + self.assertEqual(gmt1, loc1) + self.assertEqual(gmt2, loc2) + self.assertEqual(gmt3, loc3) + + @unittest.skipUnless(hasattr(socket, 'TCP_NODELAY'), + 'TCP_NODELAY not available') + def test_tcp_no_delay(self): + s = get_server_handler().socket + self.assertTrue(s.getsockopt(socket.SOL_TCP, socket.TCP_NODELAY)) + self.client.quit() + with self.server.lock: + self.server.handler.tcp_no_delay = False + self.client.connect(self.server.host, self.server.port) + self.client.sendcmd('noop') + s = get_server_handler().socket + self.assertFalse(s.getsockopt(socket.SOL_TCP, socket.TCP_NODELAY)) + + def test_permit_foreign_address_false(self): + handler = get_server_handler() + handler.permit_foreign_addresses = False + handler.remote_ip = '9.9.9.9' + with self.assertRaises(ftplib.error_perm) as cm: + self.client.makeport() + self.assertIn('foreign address', str(cm.exception)) + + def test_permit_foreign_address_true(self): + handler = get_server_handler() + handler.permit_foreign_addresses = True + handler.remote_ip = '9.9.9.9' + s = self.client.makeport() + s.close() + + +class TestCallbacks(unittest.TestCase): + """Test FTPHandler class callback methods.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.client = None + self.server = None + self.file = None + self.dummyfile = None + + def _setUp(self, handler, connect=True, login=True): + self.tearDown() + ThreadedTestFTPd.handler = handler + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + if connect: + self.client.connect(self.server.host, self.server.port) + if login: + self.client.login(USER, PASSWD) + self.file = open(TESTFN, 'w+b') + self.dummyfile = BytesIO() + self._tearDown = False + + def tearDown(self): + if self.client is not None: + self.client.close() + if self.server is not None: + self.server.stop() + if self.file is not None: + self.file.close() + if self.dummyfile is not None: + self.dummyfile.close() + safe_remove(TESTFN) + + def test_on_file_sent(self): + _file = [] + + class TestHandler(FTPHandler): + + def on_file_sent(self, file): + _file.append(file) + + self._setUp(TestHandler) + data = b'abcde12345' * 100000 + self.file.write(data) + self.file.close() + self.client.retrbinary("retr " + TESTFN, lambda x: x) + self.client.quit() # prevent race conditions + call_until(lambda: _file, "ret == [os.path.abspath(TESTFN)]") + + def test_on_file_received(self): + _file = [] + + class TestHandler(FTPHandler): + + def on_file_received(self, file): + _file.append(file) + + self._setUp(TestHandler) + data = b'abcde12345' * 100000 + self.dummyfile.write(data) + self.dummyfile.seek(0) + self.client.storbinary('stor ' + TESTFN, self.dummyfile) + self.client.quit() # prevent race conditions + call_until(lambda: _file, "ret == [os.path.abspath(TESTFN)]") + + @retry_on_failure() + def test_on_incomplete_file_sent(self): + _file = [] + + class TestHandler(FTPHandler): + + def on_incomplete_file_sent(self, file): + _file.append(file) + + self._setUp(TestHandler) + data = b'abcde12345' * 100000 + self.file.write(data) + self.file.close() + + bytes_recv = 0 + with contextlib.closing( + self.client.transfercmd("retr " + TESTFN, None)) as conn: + while True: + chunk = conn.recv(BUFSIZE) + bytes_recv += len(chunk) + if bytes_recv >= INTERRUPTED_TRANSF_SIZE or not chunk: + break + self.assertEqual(self.client.getline()[:3], "426") + self.client.quit() # prevent race conditions + call_until(lambda: _file, "ret == [os.path.abspath(TESTFN)]") + + @unittest.skipIf(TRAVIS, "failing on Travis") + @retry_on_failure() + def test_on_incomplete_file_received(self): + _file = [] + + class TestHandler(FTPHandler): + + def on_incomplete_file_received(self, file): + _file.append(file) + + self._setUp(TestHandler) + data = b'abcde12345' * 100000 + self.dummyfile.write(data) + self.dummyfile.seek(0) + + with contextlib.closing( + self.client.transfercmd('stor ' + TESTFN)) as conn: + bytes_sent = 0 + while True: + chunk = self.dummyfile.read(BUFSIZE) + conn.sendall(chunk) + bytes_sent += len(chunk) + # stop transfer while it isn't finished yet + if bytes_sent >= INTERRUPTED_TRANSF_SIZE or not chunk: + self.client.putcmd('abor') + break + self.assertRaises(ftplib.error_temp, self.client.getresp) # 426 + self.client.quit() # prevent race conditions + call_until(lambda: _file, "ret == [os.path.abspath(TESTFN)]") + + def test_on_connect(self): + flag = [] + + class TestHandler(FTPHandler): + + def on_connect(self): + flag.append(None) + + self._setUp(TestHandler, connect=False) + self.client.connect(self.server.host, self.server.port) + self.client.sendcmd('noop') + self.client.quit() # prevent race conditions + call_until(lambda: flag, "ret == [None]") + + def test_on_disconnect(self): + flag = [] + + class TestHandler(FTPHandler): + + def on_disconnect(self): + flag.append(None) + + self._setUp(TestHandler) + self.assertFalse(flag) + self.client.sendcmd('quit') + call_until(lambda: flag, "ret == [None]") + + def test_on_login(self): + user = [] + + class TestHandler(FTPHandler): + auth_failed_timeout = 0 + + def on_login(self, username): + user.append(username) + + self._setUp(TestHandler) + self.client.quit() # prevent race conditions + call_until(lambda: user, "ret == [USER]") + + def test_on_login_failed(self): + pair = [] + + class TestHandler(FTPHandler): + auth_failed_timeout = 0 + + def on_login_failed(self, username, password): + pair.append((username, password)) + + self._setUp(TestHandler, login=False) + self.assertRaises(ftplib.error_perm, self.client.login, 'foo', 'bar') + self.client.quit() # prevent race conditions + call_until(lambda: pair, "ret == [('foo', 'bar')]") + + def test_on_logout_quit(self): + user = [] + + class TestHandler(FTPHandler): + + def on_logout(self, username): + user.append(username) + + self._setUp(TestHandler) + self.client.quit() # prevent race conditions + call_until(lambda: user, "ret == [USER]") + + def test_on_logout_rein(self): + user = [] + + class TestHandler(FTPHandler): + + def on_logout(self, username): + user.append(username) + + self._setUp(TestHandler) + self.client.sendcmd('rein') + self.client.quit() # prevent race conditions + call_until(lambda: user, "ret == [USER]") + + def test_on_logout_user_issued_twice(self): + users = [] + + class TestHandler(FTPHandler): + + def on_logout(self, username): + users.append(username) + + self._setUp(TestHandler) + # At this point user "user" is logged in. Re-login as anonymous, + # then quit and expect queue == ["user", "anonymous"] + self.client.login("anonymous") + self.client.quit() # prevent race conditions + call_until(lambda: users, "ret == [USER, 'anonymous']") + + def test_on_logout_no_pass(self): + # make sure on_logout() is not called if USER was provided + # but not PASS + users = [] + + class TestHandler(FTPHandler): + + def on_logout(self, username): + users.append(username) + + self._setUp(TestHandler, login=False) + self.client.sendcmd("user foo") + self.client.quit() # prevent race conditions + call_until(lambda: users, "ret == []") + + +class _TestNetworkProtocols(object): + """Test PASV, EPSV, PORT and EPRT commands. + + Do not use this class directly, let TestIPv4Environment and + TestIPv6Environment classes use it instead. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + HOST = HOST + + def setUp(self): + self.server = self.server_class((self.HOST, 0)) + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + if self.client.af == socket.AF_INET: + self.proto = "1" + self.other_proto = "2" + else: + self.proto = "2" + self.other_proto = "1" + + def tearDown(self): + self.client.close() + self.server.stop() + + def cmdresp(self, cmd): + """Send a command and return response, also if the command failed.""" + try: + return self.client.sendcmd(cmd) + except ftplib.Error as err: + return str(err) + + @disable_log_warning + def test_eprt(self): + if not SUPPORTS_HYBRID_IPV6: + # test wrong proto + try: + self.client.sendcmd('eprt |%s|%s|%s|' % ( + self.other_proto, self.server.host, self.server.port)) + except ftplib.error_perm as err: + self.assertEqual(str(err)[0:3], "522") + else: + self.fail("Exception not raised") + + # test bad args + msg = "501 Invalid EPRT format." + # len('|') > 3 + self.assertEqual(self.cmdresp('eprt ||||'), msg) + # len('|') < 3 + self.assertEqual(self.cmdresp('eprt ||'), msg) + # port > 65535 + self.assertEqual(self.cmdresp('eprt |%s|%s|65536|' % (self.proto, + self.HOST)), msg) + # port < 0 + self.assertEqual(self.cmdresp('eprt |%s|%s|-1|' % (self.proto, + self.HOST)), msg) + # port < 1024 + resp = self.cmdresp('eprt |%s|%s|222|' % (self.proto, self.HOST)) + self.assertEqual(resp[:3], '501') + self.assertIn('privileged port', resp) + # proto > 2 + _cmd = 'eprt |3|%s|%s|' % (self.server.host, self.server.port) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, _cmd) + + if self.proto == '1': + # len(ip.octs) > 4 + self.assertEqual(self.cmdresp('eprt |1|1.2.3.4.5|2048|'), msg) + # ip.oct > 255 + self.assertEqual(self.cmdresp('eprt |1|1.2.3.256|2048|'), msg) + # bad proto + resp = self.cmdresp('eprt |2|1.2.3.256|2048|') + self.assertTrue("Network protocol not supported" in resp) + + # test connection + with contextlib.closing(socket.socket(self.client.af)) as sock: + sock.bind((self.client.sock.getsockname()[0], 0)) + sock.listen(5) + sock.settimeout(TIMEOUT) + ip, port = sock.getsockname()[:2] + self.client.sendcmd('eprt |%s|%s|%s|' % (self.proto, ip, port)) + try: + s = sock.accept() + s[0].close() + except socket.timeout: + self.fail("Server didn't connect to passive socket") + + def test_epsv(self): + # test wrong proto + try: + self.client.sendcmd('epsv ' + self.other_proto) + except ftplib.error_perm as err: + self.assertEqual(str(err)[0:3], "522") + else: + self.fail("Exception not raised") + + # proto > 2 + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'epsv 3') + + # test connection + for cmd in ('EPSV', 'EPSV ' + self.proto): + host, port = ftplib.parse229(self.client.sendcmd(cmd), + self.client.sock.getpeername()) + with contextlib.closing( + socket.socket(self.client.af, socket.SOCK_STREAM)) as s: + s.settimeout(TIMEOUT) + s.connect((host, port)) + self.client.sendcmd('abor') + + def test_epsv_all(self): + self.client.sendcmd('epsv all') + self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'pasv') + self.assertRaises(ftplib.error_perm, self.client.sendport, self.HOST, + 2000) + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'eprt |%s|%s|%s|' % (self.proto, self.HOST, 2000)) + + +@unittest.skipUnless(SUPPORTS_IPV4, "IPv4 not supported") +class TestIPv4Environment(_TestNetworkProtocols, unittest.TestCase): + """Test PASV, EPSV, PORT and EPRT commands. + + Runs tests contained in _TestNetworkProtocols class by using IPv4 + plus some additional specific tests. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + HOST = '127.0.0.1' + + @disable_log_warning + def test_port_v4(self): + # test connection + with contextlib.closing(self.client.makeport()): + self.client.sendcmd('abor') + # test bad arguments + ae = self.assertEqual + msg = "501 Invalid PORT format." + ae(self.cmdresp('port 127,0,0,1,1.1'), msg) # sep != ',' + ae(self.cmdresp('port X,0,0,1,1,1'), msg) # value != int + ae(self.cmdresp('port 127,0,0,1,1,1,1'), msg) # len(args) > 6 + ae(self.cmdresp('port 127,0,0,1'), msg) # len(args) < 6 + ae(self.cmdresp('port 256,0,0,1,1,1'), msg) # oct > 255 + ae(self.cmdresp('port 127,0,0,1,256,1'), msg) # port > 65535 + ae(self.cmdresp('port 127,0,0,1,-1,0'), msg) # port < 0 + # port < 1024 + resp = self.cmdresp('port %s,1,1' % self.HOST.replace('.', ',')) + self.assertEqual(resp[:3], '501') + self.assertIn('privileged port', resp) + if "1.2.3.4" != self.HOST: + resp = self.cmdresp('port 1,2,3,4,4,4') + assert 'foreign address' in resp, resp + + @disable_log_warning + def test_eprt_v4(self): + resp = self.cmdresp('eprt |1|0.10.10.10|2222|') + self.assertEqual(resp[:3], '501') + self.assertIn('foreign address', resp) + + def test_pasv_v4(self): + host, port = ftplib.parse227(self.client.sendcmd('pasv')) + with contextlib.closing( + socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.settimeout(TIMEOUT) + s.connect((host, port)) + + +@unittest.skipUnless(SUPPORTS_IPV6, "IPv6 not supported") +class TestIPv6Environment(_TestNetworkProtocols, unittest.TestCase): + """Test PASV, EPSV, PORT and EPRT commands. + + Runs tests contained in _TestNetworkProtocols class by using IPv6 + plus some additional specific tests. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + HOST = '::1' + + def test_port_v6(self): + # PORT is not supposed to work + self.assertRaises(ftplib.error_perm, self.client.sendport, + self.server.host, self.server.port) + + def test_pasv_v6(self): + # PASV is still supposed to work to support clients using + # IPv4 connecting to a server supporting both IPv4 and IPv6 + self.client.makepasv() + + @disable_log_warning + def test_eprt_v6(self): + resp = self.cmdresp('eprt |2|::foo|2222|') + self.assertEqual(resp[:3], '501') + self.assertIn('foreign address', resp) + + +@unittest.skipUnless(SUPPORTS_HYBRID_IPV6, "IPv4/6 dual stack not supported") +class TestIPv6MixedEnvironment(unittest.TestCase): + """By running the server by specifying "::" as IP address the + server is supposed to listen on all interfaces, supporting both + IPv4 and IPv6 by using a single socket. + + What we are going to do here is starting the server in this + manner and try to connect by using an IPv4 client. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + HOST = "::" + + def setUp(self): + self.server = self.server_class((self.HOST, 0)) + self.server.start() + self.client = None + + def tearDown(self): + if self.client is not None: + self.client.close() + self.server.stop() + + def test_port_v4(self): + def noop(x): + return x + + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect('127.0.0.1', self.server.port) + self.client.set_pasv(False) + self.client.login(USER, PASSWD) + self.client.retrlines('list', noop) + + def test_pasv_v4(self): + def noop(x): + return x + + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect('127.0.0.1', self.server.port) + self.client.set_pasv(True) + self.client.login(USER, PASSWD) + self.client.retrlines('list', noop) + # make sure pasv response doesn't return an IPv4-mapped address + ip = self.client.makepasv()[0] + self.assertFalse(ip.startswith("::ffff:")) + + def test_eprt_v4(self): + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect('127.0.0.1', self.server.port) + self.client.login(USER, PASSWD) + # test connection + with contextlib.closing( + socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: + sock.bind((self.client.sock.getsockname()[0], 0)) + sock.listen(5) + sock.settimeout(2) + ip, port = sock.getsockname()[:2] + self.client.sendcmd('eprt |1|%s|%s|' % (ip, port)) + try: + sock2, addr = sock.accept() + sock2.close() + except socket.timeout: + self.fail("Server didn't connect to passive socket") + + def test_epsv_v4(self): + def mlstline(cmd): + return self.client.voidcmd(cmd).split('\n')[1] + + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect('127.0.0.1', self.server.port) + self.client.login(USER, PASSWD) + host, port = ftplib.parse229(self.client.sendcmd('EPSV'), + self.client.sock.getpeername()) + self.assertEqual('127.0.0.1', host) + with contextlib.closing( + socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.settimeout(TIMEOUT) + s.connect((host, port)) + self.assertTrue(mlstline('mlst /').endswith('/')) + + +class TestCornerCases(unittest.TestCase): + """Tests for any kind of strange situation for the server to be in, + mainly referring to bugs signaled on the bug tracker. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + + def tearDown(self): + self.client.close() + if self.server.is_alive(): + self.server.stop() + + def test_port_race_condition(self): + # Refers to bug #120, first sends PORT, then disconnects the + # control channel before accept()ing the incoming data connection. + # The original server behavior was to reply with "200 Active + # data connection established" *after* the client had already + # disconnected the control connection. + with contextlib.closing(socket.socket(self.client.af)) as sock: + sock.bind((self.client.sock.getsockname()[0], 0)) + sock.listen(5) + sock.settimeout(TIMEOUT) + host, port = sock.getsockname()[:2] + + hbytes = host.split('.') + pbytes = [repr(port // 256), repr(port % 256)] + bytes = hbytes + pbytes + cmd = 'PORT ' + ','.join(bytes) + '\r\n' + self.client.sock.sendall(b(cmd)) + self.client.getresp() + s, addr = sock.accept() + s.close() + + def test_stou_max_tries(self): + # Emulates case where the max number of tries to find out a + # unique file name when processing STOU command gets hit. + + class TestFS(AbstractedFS): + + def mkstemp(self, *args, **kwargs): + raise IOError(errno.EEXIST, + "No usable temporary file name found") + + with self.server.lock: + self.server.handler.abstracted_fs = TestFS + try: + self.client.quit() + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'stou') + finally: + with self.server.lock: + self.server.handler.abstracted_fs = AbstractedFS + + def test_quick_connect(self): + # Clients that connected and disconnected quickly could cause + # the server to crash, due to a failure to catch errors in the + # initial part of the connection process. + # Tracked in issues #91, #104 and #105. + # See also https://bugs.launchpad.net/zodb/+bug/135108 + import struct + + def connect(addr): + with contextlib.closing(socket.socket()) as s: + # Set SO_LINGER to 1,0 causes a connection reset (RST) to + # be sent when close() is called, instead of the standard + # FIN shutdown sequence. + s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, + struct.pack('ii', 1, 0)) + s.settimeout(TIMEOUT) + try: + s.connect(addr) + except socket.error: + pass + + for x in range(10): + connect((self.server.host, self.server.port)) + for x in range(10): + addr = self.client.makepasv() + connect(addr) + + def test_error_on_callback(self): + # test that the server do not crash in case an error occurs + # while firing a scheduled function + self.tearDown() + server = FTPServer((HOST, 0), FTPHandler) + self.addCleanup(server.close) + logger = logging.getLogger('pyftpdlib') + logger.disabled = True + try: + len1 = len(IOLoop.instance().socket_map) + IOLoop.instance().call_later(0, lambda: 1 // 0) + server.serve_forever(timeout=0.001, blocking=False) + len2 = len(IOLoop.instance().socket_map) + self.assertEqual(len1, len2) + finally: + logger.disabled = False + + def test_active_conn_error(self): + # we open a socket() but avoid to invoke accept() to + # reproduce this error condition: + # http://code.google.com/p/pyftpdlib/source/detail?r=905 + with contextlib.closing(socket.socket()) as sock: + sock.bind((HOST, 0)) + port = sock.getsockname()[1] + self.client.sock.settimeout(.1) + try: + resp = self.client.sendport(HOST, port) + except ftplib.error_temp as err: + self.assertEqual(str(err)[:3], '425') + except (socket.timeout, getattr(ssl, "SSLError", object())): + pass + else: + self.assertNotEqual(str(resp)[:3], '200') + + def test_repr(self): + # make sure the FTP/DTP handler classes have a sane repr() + with contextlib.closing(self.client.makeport()): + for inst in IOLoop.instance().socket_map.values(): + repr(inst) + str(inst) + + if hasattr(os, 'sendfile'): + def test_sendfile(self): + # make sure that on python >= 3.3 we're using os.sendfile + # rather than third party pysendfile module + from pyftpdlib.handlers import sendfile + self.assertIs(sendfile, os.sendfile) + + if SUPPORTS_SENDFILE: + def test_sendfile_enabled(self): + self.assertEqual(FTPHandler.use_sendfile, True) + + if hasattr(select, 'epoll') or hasattr(select, 'kqueue'): + def test_ioloop_fileno(self): + with self.server.lock: + fd = self.server.server.ioloop.fileno() + self.assertTrue(isinstance(fd, int), fd) + + +# TODO: disabled as on certain platforms (OSX and Windows) +# produces failures with python3. Will have to get back to +# this and fix it. +@unittest.skipIf(OSX or WINDOWS, "fails on OSX or Windows") +class TestUnicodePathNames(unittest.TestCase): + """Test FTP commands and responses by using path names with non + ASCII characters. + """ + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = self.server_class() + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.encoding = 'utf8' # PY3 only + self.client.connect(self.server.host, self.server.port) + self.client.login(USER, PASSWD) + if PY3: + safe_mkdir(bytes(TESTFN_UNICODE, 'utf8')) + touch(bytes(TESTFN_UNICODE_2, 'utf8')) + self.utf8fs = TESTFN_UNICODE in os.listdir('.') + else: + warnings.filterwarnings("ignore") + safe_mkdir(TESTFN_UNICODE) + touch(TESTFN_UNICODE_2) + self.utf8fs = unicode(TESTFN_UNICODE, 'utf8') in os.listdir(u('.')) + warnings.resetwarnings() + + def tearDown(self): + self.client.close() + self.server.stop() + remove_test_files() + + # --- fs operations + + def test_cwd(self): + if self.utf8fs: + resp = self.client.cwd(TESTFN_UNICODE) + self.assertTrue(TESTFN_UNICODE in resp) + else: + self.assertRaises(ftplib.error_perm, self.client.cwd, + TESTFN_UNICODE) + + def test_mkd(self): + if self.utf8fs: + os.rmdir(TESTFN_UNICODE) + dirname = self.client.mkd(TESTFN_UNICODE) + self.assertEqual(dirname, '/' + TESTFN_UNICODE) + self.assertTrue(os.path.isdir(TESTFN_UNICODE)) + else: + self.assertRaises(ftplib.error_perm, self.client.mkd, + TESTFN_UNICODE) + + def test_rmdir(self): + if self.utf8fs: + self.client.rmd(TESTFN_UNICODE) + else: + self.assertRaises(ftplib.error_perm, self.client.rmd, + TESTFN_UNICODE) + + def test_rnfr_rnto(self): + if self.utf8fs: + self.client.rename(TESTFN_UNICODE, TESTFN) + else: + self.assertRaises(ftplib.error_perm, self.client.rename, + TESTFN_UNICODE, TESTFN) + + def test_size(self): + self.client.sendcmd('type i') + if self.utf8fs: + self.client.sendcmd('size ' + TESTFN_UNICODE_2) + else: + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'size ' + TESTFN_UNICODE_2) + + def test_mdtm(self): + if self.utf8fs: + self.client.sendcmd('mdtm ' + TESTFN_UNICODE_2) + else: + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'mdtm ' + TESTFN_UNICODE_2) + + def test_stou(self): + if self.utf8fs: + resp = self.client.sendcmd('stou ' + TESTFN_UNICODE) + self.assertTrue(TESTFN_UNICODE in resp) + else: + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'stou ' + TESTFN_UNICODE) + + if hasattr(os, 'chmod'): + def test_site_chmod(self): + if self.utf8fs: + self.client.sendcmd('site chmod 777 ' + TESTFN_UNICODE) + else: + self.assertRaises(ftplib.error_perm, self.client.sendcmd, + 'site chmod 777 ' + TESTFN_UNICODE) + + # --- listing cmds + + def _test_listing_cmds(self, cmd): + ls = [] + self.client.retrlines(cmd, ls.append) + ls = '\n'.join(ls) + if self.utf8fs: + self.assertTrue(TESTFN_UNICODE in ls) + else: + # Part of the filename which are not encodable are supposed + # to have been replaced. The file should be something like + # 'tmp-pyftpdlib-unicode-????'. In any case it is not + # referenceable (e.g. DELE 'tmp-pyftpdlib-unicode-????' + # won't work). + self.assertTrue('tmp-pyftpdlib-unicode' in ls) + + def test_list(self): + self._test_listing_cmds('list') + + def test_nlst(self): + self._test_listing_cmds('nlst') + + def test_mlsd(self): + self._test_listing_cmds('mlsd') + + def test_mlst(self): + # utility function for extracting the line of interest + def mlstline(cmd): + return self.client.voidcmd(cmd).split('\n')[1] + + if self.utf8fs: + self.assertTrue('type=dir' in + mlstline('mlst ' + TESTFN_UNICODE)) + self.assertTrue('/' + TESTFN_UNICODE in + mlstline('mlst ' + TESTFN_UNICODE)) + self.assertTrue('type=file' in + mlstline('mlst ' + TESTFN_UNICODE_2)) + self.assertTrue('/' + TESTFN_UNICODE_2 in + mlstline('mlst ' + TESTFN_UNICODE_2)) + else: + self.assertRaises(ftplib.error_perm, + mlstline, 'mlst ' + TESTFN_UNICODE) + + # --- file transfer + + def test_stor(self): + if self.utf8fs: + data = b'abcde12345' * 500 + os.remove(TESTFN_UNICODE_2) + dummy = BytesIO() + dummy.write(data) + dummy.seek(0) + self.client.storbinary('stor ' + TESTFN_UNICODE_2, dummy) + dummy_recv = BytesIO() + self.client.retrbinary('retr ' + TESTFN_UNICODE_2, + dummy_recv.write) + dummy_recv.seek(0) + self.assertEqual(dummy_recv.read(), data) + else: + dummy = BytesIO() + self.assertRaises(ftplib.error_perm, self.client.storbinary, + 'stor ' + TESTFN_UNICODE_2, dummy) + + def test_retr(self): + if self.utf8fs: + data = b'abcd1234' * 500 + with open(TESTFN_UNICODE_2, 'wb') as f: + f.write(data) + dummy = BytesIO() + self.client.retrbinary('retr ' + TESTFN_UNICODE_2, dummy.write) + dummy.seek(0) + self.assertEqual(dummy.read(), data) + else: + dummy = BytesIO() + self.assertRaises(ftplib.error_perm, self.client.retrbinary, + 'retr ' + TESTFN_UNICODE_2, dummy.write) + + +class TestCommandLineParser(unittest.TestCase): + """Test command line parser.""" + SYSARGV = sys.argv + STDERR = sys.stderr + + def setUp(self): + class DummyFTPServer(FTPServer): + """An overridden version of FTPServer class which forces + serve_forever() to return immediately. + """ + + def serve_forever(self, *args, **kwargs): + return + + if PY3: + import io + self.devnull = io.StringIO() + else: + self.devnull = BytesIO() + sys.argv = self.SYSARGV[:] + sys.stderr = self.STDERR + self.original_ftpserver_class = FTPServer + pyftpdlib.__main__.FTPServer = DummyFTPServer + + def tearDown(self): + self.devnull.close() + sys.argv = self.SYSARGV[:] + sys.stderr = self.STDERR + pyftpdlib.servers.FTPServer = self.original_ftpserver_class + safe_rmdir(TESTFN) + + def test_a_option(self): + sys.argv += ["-i", "localhost", "-p", "0"] + pyftpdlib.__main__.main() + sys.argv = self.SYSARGV[:] + + # no argument + sys.argv += ["-a"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + def test_p_option(self): + sys.argv += ["-p", "0"] + pyftpdlib.__main__.main() + + # no argument + sys.argv = self.SYSARGV[:] + sys.argv += ["-p"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + # invalid argument + sys.argv += ["-p foo"] + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + def test_w_option(self): + sys.argv += ["-w", "-p", "0"] + with warnings.catch_warnings(): + warnings.filterwarnings("error") + self.assertRaises(RuntimeWarning, pyftpdlib.__main__.main) + + # unexpected argument + sys.argv = self.SYSARGV[:] + sys.argv += ["-w foo"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + def test_d_option(self): + sys.argv += ["-d", TESTFN, "-p", "0"] + safe_mkdir(TESTFN) + pyftpdlib.__main__.main() + + # without argument + sys.argv = self.SYSARGV[:] + sys.argv += ["-d"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + # no such directory + sys.argv = self.SYSARGV[:] + sys.argv += ["-d %s" % TESTFN] + safe_rmdir(TESTFN) + self.assertRaises(ValueError, pyftpdlib.__main__.main) + + def test_r_option(self): + sys.argv += ["-r 60000-61000", "-p", "0"] + pyftpdlib.__main__.main() + + # without arg + sys.argv = self.SYSARGV[:] + sys.argv += ["-r"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + # wrong arg + sys.argv = self.SYSARGV[:] + sys.argv += ["-r yyy-zzz"] + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + def test_v_option(self): + sys.argv += ["-v"] + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + # unexpected argument + sys.argv = self.SYSARGV[:] + sys.argv += ["-v foo"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + def test_D_option(self): + with mock.patch('pyftpdlib.__main__.config_logging') as fun: + sys.argv += ["-D", "-p 0"] + pyftpdlib.__main__.main() + fun.assert_called_once_with(level=logging.DEBUG) + + # unexpected argument + sys.argv = self.SYSARGV[:] + sys.argv += ["-V foo"] + sys.stderr = self.devnull + self.assertRaises(SystemExit, pyftpdlib.__main__.main) + + +configure_logging() +remove_test_files() + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_functional_ssl.py b/ftp_server/pyftpdlib/test/test_functional_ssl.py new file mode 100644 index 00000000..f0fd5944 --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_functional_ssl.py @@ -0,0 +1,407 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import contextlib +import ftplib +import os +import socket +import sys +import ssl + +import OpenSSL # requires "pip install pyopenssl" + +from pyftpdlib.handlers import TLS_FTPHandler +from pyftpdlib.test import configure_logging +from pyftpdlib.test import PASSWD +from pyftpdlib.test import remove_test_files +from pyftpdlib.test import ThreadedTestFTPd +from pyftpdlib.test import TIMEOUT +from pyftpdlib.test import TRAVIS +from pyftpdlib.test import unittest +from pyftpdlib.test import USER +from pyftpdlib.test import VERBOSITY +from pyftpdlib.test.test_functional import TestCallbacks +from pyftpdlib.test.test_functional import TestConfigurableOptions +from pyftpdlib.test.test_functional import TestCornerCases +from pyftpdlib.test.test_functional import TestFtpAbort +from pyftpdlib.test.test_functional import TestFtpAuthentication +from pyftpdlib.test.test_functional import TestFtpCmdsSemantic +from pyftpdlib.test.test_functional import TestFtpDummyCmds +from pyftpdlib.test.test_functional import TestFtpFsOperations +from pyftpdlib.test.test_functional import TestFtpListingCmds +from pyftpdlib.test.test_functional import TestFtpRetrieveData +from pyftpdlib.test.test_functional import TestFtpStoreData +from pyftpdlib.test.test_functional import TestIPv4Environment +from pyftpdlib.test.test_functional import TestIPv6Environment +from pyftpdlib.test.test_functional import TestSendfile +from pyftpdlib.test.test_functional import TestTimeouts + + +FTPS_SUPPORT = hasattr(ftplib, 'FTP_TLS') +if sys.version_info < (2, 7): + FTPS_UNSUPPORT_REASON = "requires python 2.7+" +else: + FTPS_UNSUPPORT_REASON = "FTPS test skipped" + +CERTFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), + 'keycert.pem')) + +del OpenSSL + +# ===================================================================== +# --- FTPS mixin tests +# ===================================================================== + +# What we're going to do here is repeat the original functional tests +# defined in test_functinal.py but by using FTPS. +# we secure both control and data connections before running any test. +# This is useful as we reuse the existent functional tests which are +# supposed to work no matter if the underlying protocol is FTP or FTPS. + + +if FTPS_SUPPORT: + class FTPSClient(ftplib.FTP_TLS): + """A modified version of ftplib.FTP_TLS class which implicitly + secure the data connection after login(). + """ + + def login(self, *args, **kwargs): + ftplib.FTP_TLS.login(self, *args, **kwargs) + self.prot_p() + + class FTPSServer(ThreadedTestFTPd): + """A threaded FTPS server used for functional testing.""" + handler = TLS_FTPHandler + handler.certfile = CERTFILE + + class TLSTestMixin: + server_class = FTPSServer + client_class = FTPSClient +else: + @unittest.skipIf(True, FTPS_UNSUPPORT_REASON) + class TLSTestMixin: + pass + + +class TestFtpAuthenticationTLSMixin(TLSTestMixin, TestFtpAuthentication): + pass + + +class TestTFtpDummyCmdsTLSMixin(TLSTestMixin, TestFtpDummyCmds): + pass + + +class TestFtpCmdsSemanticTLSMixin(TLSTestMixin, TestFtpCmdsSemantic): + pass + + +class TestFtpFsOperationsTLSMixin(TLSTestMixin, TestFtpFsOperations): + pass + + +class TestFtpStoreDataTLSMixin(TLSTestMixin, TestFtpStoreData): + + @unittest.skipIf(1, "fails with SSL") + def test_stou(self): + pass + + +class TestSendFileTLSMixin(TLSTestMixin, TestSendfile): + + def test_fallback(self): + self.client.prot_c() + super(TestSendFileTLSMixin, self).test_fallback() + + +class TestFtpRetrieveDataTLSMixin(TLSTestMixin, TestFtpRetrieveData): + + @unittest.skipIf(os.name == 'nt', "may fail on windows") + def test_restore_on_retr(self): + super(TestFtpRetrieveDataTLSMixin, self).test_restore_on_retr() + + +class TestFtpListingCmdsTLSMixin(TLSTestMixin, TestFtpListingCmds): + + # TODO: see https://travis-ci.org/giampaolo/pyftpdlib/jobs/87318445 + # Fails with: + # File "/opt/python/2.7.9/lib/python2.7/ftplib.py", line 735, in retrlines + # conn.unwrap() + # File "/opt/python/2.7.9/lib/python2.7/ssl.py", line 771, in unwrap + # s = self._sslobj.shutdown() + # error: [Errno 0] Error + @unittest.skipIf(TRAVIS or os.name == 'nt', "may fail on travis/windows") + def test_nlst(self): + super(TestFtpListingCmdsTLSMixin, self).test_nlst() + + +class TestFtpAbortTLSMixin(TLSTestMixin, TestFtpAbort): + + @unittest.skipIf(1, "fails with SSL") + def test_oob_abor(self): + pass + + +class TestTimeoutsTLSMixin(TLSTestMixin, TestTimeouts): + + @unittest.skipIf(1, "fails with SSL") + def test_data_timeout_not_reached(self): + pass + + +class TestConfigurableOptionsTLSMixin(TLSTestMixin, TestConfigurableOptions): + pass + + +class TestCallbacksTLSMixin(TLSTestMixin, TestCallbacks): + + def test_on_file_received(self): + pass + + def test_on_file_sent(self): + pass + + def test_on_incomplete_file_received(self): + pass + + def test_on_incomplete_file_sent(self): + pass + + def test_on_connect(self): + pass + + def test_on_disconnect(self): + pass + + def test_on_login(self): + pass + + def test_on_login_failed(self): + pass + + def test_on_logout_quit(self): + pass + + def test_on_logout_rein(self): + pass + + def test_on_logout_user_issued_twice(self): + pass + + +class TestIPv4EnvironmentTLSMixin(TLSTestMixin, TestIPv4Environment): + pass + + +class TestIPv6EnvironmentTLSMixin(TLSTestMixin, TestIPv6Environment): + pass + + +class TestCornerCasesTLSMixin(TLSTestMixin, TestCornerCases): + pass + + +# ===================================================================== +# dedicated FTPS tests +# ===================================================================== + + +@unittest.skipUnless(FTPS_SUPPORT, FTPS_UNSUPPORT_REASON) +class TestFTPS(unittest.TestCase): + """Specific tests fot TSL_FTPHandler class.""" + + def setUp(self): + self.server = FTPSServer() + self.server.start() + self.client = ftplib.FTP_TLS(timeout=TIMEOUT) + self.client.connect(self.server.host, self.server.port) + + def tearDown(self): + self.client.ssl_version = ssl.PROTOCOL_SSLv23 + with self.server.lock: + self.server.handler.ssl_version = ssl.PROTOCOL_SSLv23 + self.server.handler.tls_control_required = False + self.server.handler.tls_data_required = False + self.client.close() + self.server.stop() + + def assertRaisesWithMsg(self, excClass, msg, callableObj, *args, **kwargs): + try: + callableObj(*args, **kwargs) + except excClass as err: + if str(err) == msg: + return + raise self.failureException("%s != %s" % (str(err), msg)) + else: + if hasattr(excClass, '__name__'): + excName = excClass.__name__ + else: + excName = str(excClass) + raise self.failureException("%s not raised" % excName) + + def test_auth(self): + # unsecured + self.client.login(secure=False) + self.assertFalse(isinstance(self.client.sock, ssl.SSLSocket)) + # secured + self.client.login() + self.assertTrue(isinstance(self.client.sock, ssl.SSLSocket)) + # AUTH issued twice + msg = '503 Already using TLS.' + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.sendcmd, 'auth tls') + + def test_pbsz(self): + # unsecured + self.client.login(secure=False) + msg = "503 PBSZ not allowed on insecure control connection." + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.sendcmd, 'pbsz 0') + # secured + self.client.login(secure=True) + resp = self.client.sendcmd('pbsz 0') + self.assertEqual(resp, "200 PBSZ=0 successful.") + + def test_prot(self): + self.client.login(secure=False) + msg = "503 PROT not allowed on insecure control connection." + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.sendcmd, 'prot p') + self.client.login(secure=True) + # secured + self.client.prot_p() + sock = self.client.transfercmd('list') + with contextlib.closing(sock): + while True: + if not sock.recv(1024): + self.client.voidresp() + break + self.assertTrue(isinstance(sock, ssl.SSLSocket)) + # unsecured + self.client.prot_c() + sock = self.client.transfercmd('list') + with contextlib.closing(sock): + while True: + if not sock.recv(1024): + self.client.voidresp() + break + self.assertFalse(isinstance(sock, ssl.SSLSocket)) + + def test_feat(self): + feat = self.client.sendcmd('feat') + cmds = ['AUTH TLS', 'AUTH SSL', 'PBSZ', 'PROT'] + for cmd in cmds: + self.assertTrue(cmd in feat) + + def test_unforseen_ssl_shutdown(self): + self.client.login() + try: + sock = self.client.sock.unwrap() + except socket.error as err: + if err.errno == 0: + return + raise + sock.settimeout(TIMEOUT) + sock.sendall(b'noop') + try: + chunk = sock.recv(1024) + except socket.error: + pass + else: + self.assertEqual(chunk, b"") + + def test_tls_control_required(self): + with self.server.lock: + self.server.handler.tls_control_required = True + msg = "550 SSL/TLS required on the control channel." + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.sendcmd, "user " + USER) + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.sendcmd, "pass " + PASSWD) + self.client.login(secure=True) + + def test_tls_data_required(self): + with self.server.lock: + self.server.handler.tls_data_required = True + self.client.login(secure=True) + msg = "550 SSL/TLS required on the data channel." + self.assertRaisesWithMsg(ftplib.error_perm, msg, + self.client.retrlines, 'list', lambda x: x) + self.client.prot_p() + self.client.retrlines('list', lambda x: x) + + def try_protocol_combo(self, server_protocol, client_protocol): + with self.server.lock: + self.server.handler.ssl_version = server_protocol + self.client.ssl_version = client_protocol + self.client.close() + self.client.connect(self.server.host, self.server.port) + try: + self.client.login() + except (ssl.SSLError, socket.error): + self.client.close() + else: + self.client.quit() + + # def test_ssl_version(self): + # protos = [ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, + # ssl.PROTOCOL_TLSv1] + # if hasattr(ssl, "PROTOCOL_SSLv2"): + # protos.append(ssl.PROTOCOL_SSLv2) + # for proto in protos: + # self.try_protocol_combo(ssl.PROTOCOL_SSLv2, proto) + # for proto in protos: + # self.try_protocol_combo(ssl.PROTOCOL_SSLv3, proto) + # for proto in protos: + # self.try_protocol_combo(ssl.PROTOCOL_SSLv23, proto) + # for proto in protos: + # self.try_protocol_combo(ssl.PROTOCOL_TLSv1, proto) + + def test_ssl_options(self): + from OpenSSL import SSL + from OpenSSL._util import lib + from pyftpdlib.handlers import TLS_FTPHandler + try: + TLS_FTPHandler.ssl_context = None + ctx = TLS_FTPHandler.get_ssl_context() + # Verify default opts. + with contextlib.closing(socket.socket()) as s: + s = SSL.Connection(ctx, s) + opts = lib.SSL_CTX_get_options(ctx._context) + self.assertTrue(opts & SSL.OP_NO_SSLv2) + self.assertTrue(opts & SSL.OP_NO_SSLv3) + self.assertTrue(opts & SSL.OP_NO_COMPRESSION) + TLS_FTPHandler.ssl_context = None # reset + # Make sure that if ssl_options is None no options are set + # (except OP_NO_SSLv2 whch is enabled by default unless + # ssl_proto is set to SSL.SSLv23_METHOD). + TLS_FTPHandler.ssl_context = None + TLS_FTPHandler.ssl_options = None + ctx = TLS_FTPHandler.get_ssl_context() + with contextlib.closing(socket.socket()) as s: + s = SSL.Connection(ctx, s) + opts = lib.SSL_CTX_get_options(ctx._context) + self.assertTrue(opts & SSL.OP_NO_SSLv2) + # self.assertFalse(opts & SSL.OP_NO_SSLv3) + self.assertFalse(opts & SSL.OP_NO_COMPRESSION) + finally: + TLS_FTPHandler.ssl_context = None + + if hasattr(ssl, "PROTOCOL_SSLv2"): + def test_sslv2(self): + self.client.ssl_version = ssl.PROTOCOL_SSLv2 + self.client.close() + with self.server.lock: + self.client.connect(self.server.host, self.server.port) + self.assertRaises(socket.error, self.client.login) + self.client.ssl_version = ssl.PROTOCOL_SSLv2 + + +configure_logging() +remove_test_files() + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_ioloop.py b/ftp_server/pyftpdlib/test/test_ioloop.py new file mode 100644 index 00000000..7c86fb9a --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_ioloop.py @@ -0,0 +1,551 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import contextlib +import errno +import select +import socket +import sys +import time + +from pyftpdlib._compat import PY3 +from pyftpdlib.ioloop import Acceptor +from pyftpdlib.ioloop import AsyncChat +from pyftpdlib.ioloop import IOLoop +from pyftpdlib.ioloop import RetryError +from pyftpdlib.test import mock +from pyftpdlib.test import POSIX +from pyftpdlib.test import unittest +from pyftpdlib.test import VERBOSITY +import pyftpdlib.ioloop + + +if hasattr(socket, 'socketpair'): + socketpair = socket.socketpair +else: + def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): + with contextlib.closing(socket.socket(family, type, proto)) as l: + l.bind(("localhost", 0)) + l.listen(5) + c = socket.socket(family, type, proto) + try: + c.connect(l.getsockname()) + caddr = c.getsockname() + while True: + a, addr = l.accept() + # check that we've got the correct client + if addr == caddr: + return c, a + a.close() + except OSError: + c.close() + raise + + +# TODO: write more tests. +class BaseIOLoopTestCase(object): + + ioloop_class = None + + def make_socketpair(self): + rd, wr = socketpair() + self.addCleanup(rd.close) + self.addCleanup(wr.close) + return rd, wr + + def test_register(self): + s = self.ioloop_class() + self.addCleanup(s.close) + rd, wr = self.make_socketpair() + handler = AsyncChat(rd) + s.register(rd, handler, s.READ) + s.register(wr, handler, s.WRITE) + self.assertIn(rd, s.socket_map) + self.assertIn(wr, s.socket_map) + return (s, rd, wr) + + def test_unregister(self): + s, rd, wr = self.test_register() + s.unregister(rd) + s.unregister(wr) + self.assertNotIn(rd, s.socket_map) + self.assertNotIn(wr, s.socket_map) + + def test_unregister_twice(self): + s, rd, wr = self.test_register() + s.unregister(rd) + s.unregister(rd) + s.unregister(wr) + s.unregister(wr) + + def test_modify(self): + s, rd, wr = self.test_register() + s.modify(rd, s.WRITE) + s.modify(wr, s.READ) + + def test_loop(self): + # no timeout + s, rd, wr = self.test_register() + s.call_later(0, s.close) + s.loop() + # with timeout + s, rd, wr = self.test_register() + s.call_later(0, s.close) + s.loop(timeout=0.001) + + def test_close(self): + s, rd, wr = self.test_register() + s.close() + self.assertEqual(s.socket_map, {}) + + def test_close_w_handler_exc(self): + # Simulate an exception when close()ing a socket handler. + # Exception should be logged and ignored. + class Handler(AsyncChat): + + def close(self): + 1 / 0 + + s = self.ioloop_class() + self.addCleanup(s.close) + rd, wr = self.make_socketpair() + handler = Handler(rd) + s.register(rd, handler, s.READ) + with mock.patch("pyftpdlib.ioloop.logger.error") as m: + s.close() + assert m.called + self.assertIn('ZeroDivisionError', m.call_args[0][0]) + + def test_close_w_handler_ebadf_exc(self): + # Simulate an exception when close()ing a socket handler. + # Exception should be ignored (and not logged). + class Handler(AsyncChat): + + def close(self): + raise OSError(errno.EBADF, "") + + s = self.ioloop_class() + self.addCleanup(s.close) + rd, wr = self.make_socketpair() + handler = Handler(rd) + s.register(rd, handler, s.READ) + with mock.patch("pyftpdlib.ioloop.logger.error") as m: + s.close() + assert not m.called + + def test_close_w_callback_exc(self): + # Simulate an exception when close()ing the IO loop and a + # scheduled callback raises an exception on cancel(). + with mock.patch("pyftpdlib.ioloop.logger.error") as logerr: + with mock.patch("pyftpdlib.ioloop._CallLater.cancel", + side_effect=lambda: 1 / 0) as cancel: + s = self.ioloop_class() + self.addCleanup(s.close) + s.call_later(1, lambda: 0) + s.close() + assert cancel.called + assert logerr.called + self.assertIn('ZeroDivisionError', logerr.call_args[0][0]) + + +class DefaultIOLoopTestCase(unittest.TestCase, BaseIOLoopTestCase): + ioloop_class = pyftpdlib.ioloop.IOLoop + + +# =================================================================== +# select() +# =================================================================== + +class SelectIOLoopTestCase(unittest.TestCase, BaseIOLoopTestCase): + ioloop_class = pyftpdlib.ioloop.Select + + def test_select_eintr(self): + # EINTR is supposed to be ignored + with mock.patch('pyftpdlib.ioloop.select.select', + side_effect=select.error()) as m: + m.side_effect.errno = errno.EINTR + s, rd, wr = self.test_register() + s.poll(0) + # ...but just that + with mock.patch('pyftpdlib.ioloop.select.select', + side_effect=select.error()) as m: + m.side_effect.errno = errno.EBADF + s, rd, wr = self.test_register() + self.assertRaises(select.error, s.poll, 0) + + +# =================================================================== +# poll() +# =================================================================== + +@unittest.skipUnless(hasattr(pyftpdlib.ioloop, 'Poll'), + "poll() not available on this platform") +class PollIOLoopTestCase(unittest.TestCase, BaseIOLoopTestCase): + ioloop_class = getattr(pyftpdlib.ioloop, "Poll", None) + poller_mock = "pyftpdlib.ioloop.Poll._poller" + + @unittest.skipIf(sys.version_info[:2] == (3, 2), "") + def test_eintr_on_poll(self): + # EINTR is supposed to be ignored + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + if not PY3: + m.return_value.poll.side_effect = select.error + m.return_value.poll.side_effect.errno = errno.EINTR + else: + m.return_value.poll.side_effect = OSError(errno.EINTR, "") + s, rd, wr = self.test_register() + s.poll(0) + assert m.called + # ...but just that + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + if not PY3: + m.return_value.poll.side_effect = select.error + m.return_value.poll.side_effect.errno = errno.EBADF + else: + m.return_value.poll.side_effect = OSError(errno.EBADF, "") + s, rd, wr = self.test_register() + self.assertRaises(select.error, s.poll, 0) + assert m.called + + def test_eexist_on_register(self): + # EEXIST is supposed to be ignored + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + m.return_value.register.side_effect = \ + EnvironmentError(errno.EEXIST, "") + s, rd, wr = self.test_register() + # ...but just that + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + m.return_value.register.side_effect = \ + EnvironmentError(errno.EBADF, "") + self.assertRaises(EnvironmentError, self.test_register) + + def test_enoent_ebadf_on_unregister(self): + # ENOENT and EBADF are supposed to be ignored + for errnum in (errno.EBADF, errno.ENOENT): + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + m.return_value.unregister.side_effect = \ + EnvironmentError(errnum, "") + s, rd, wr = self.test_register() + s.unregister(rd) + # ...but just those + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + m.return_value.unregister.side_effect = \ + EnvironmentError(errno.EEXIST, "") + s, rd, wr = self.test_register() + self.assertRaises(EnvironmentError, s.unregister, rd) + + def test_enoent_on_modify(self): + # ENOENT is supposed to be ignored + with mock.patch(self.poller_mock, return_vaue=mock.Mock()) as m: + m.return_value.modify.side_effect = \ + OSError(errno.ENOENT, "") + s, rd, wr = self.test_register() + s.modify(rd, s.READ) + + +# =================================================================== +# epoll() +# =================================================================== + +@unittest.skipUnless(hasattr(pyftpdlib.ioloop, 'Epoll'), + "epoll() not available on this platform (Linux only)") +class EpollIOLoopTestCase(PollIOLoopTestCase): + ioloop_class = getattr(pyftpdlib.ioloop, "Epoll", None) + poller_mock = "pyftpdlib.ioloop.Epoll._poller" + + +# =================================================================== +# /dev/poll +# =================================================================== + +@unittest.skipUnless(hasattr(pyftpdlib.ioloop, 'DevPoll'), + "/dev/poll not available on this platform (Solaris only)") +class DevPollIOLoopTestCase(unittest.TestCase, BaseIOLoopTestCase): + ioloop_class = getattr(pyftpdlib.ioloop, "DevPoll", None) + + +# =================================================================== +# kqueue +# =================================================================== + +@unittest.skipUnless(hasattr(pyftpdlib.ioloop, 'Kqueue'), + "/dev/poll not available on this platform (BSD only)") +class KqueueIOLoopTestCase(unittest.TestCase, BaseIOLoopTestCase): + ioloop_class = getattr(pyftpdlib.ioloop, "Kqueue", None) + + +class TestCallLater(unittest.TestCase): + """Tests for CallLater class.""" + + def setUp(self): + self.ioloop = IOLoop.instance() + for task in self.ioloop.sched._tasks: + if not task.cancelled: + task.cancel() + del self.ioloop.sched._tasks[:] + + def scheduler(self, timeout=0.01, count=100): + while self.ioloop.sched._tasks and count > 0: + self.ioloop.sched.poll() + count -= 1 + time.sleep(timeout) + + def test_interface(self): + def fun(): + return 0 + + self.assertRaises(AssertionError, self.ioloop.call_later, -1, fun) + x = self.ioloop.call_later(3, fun) + self.assertEqual(x.cancelled, False) + x.cancel() + self.assertEqual(x.cancelled, True) + self.assertRaises(AssertionError, x.call) + self.assertRaises(AssertionError, x.reset) + x.cancel() + + def test_order(self): + def fun(x): + l.append(x) + + l = [] + for x in [0.05, 0.04, 0.03, 0.02, 0.01]: + self.ioloop.call_later(x, fun, x) + self.scheduler() + self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05]) + + # The test is reliable only on those systems where time.time() + # provides time with a better precision than 1 second. + if not str(time.time()).endswith('.0'): + def test_reset(self): + def fun(x): + l.append(x) + + l = [] + self.ioloop.call_later(0.01, fun, 0.01) + self.ioloop.call_later(0.02, fun, 0.02) + self.ioloop.call_later(0.03, fun, 0.03) + x = self.ioloop.call_later(0.04, fun, 0.04) + self.ioloop.call_later(0.05, fun, 0.05) + time.sleep(0.1) + x.reset() + self.scheduler() + self.assertEqual(l, [0.01, 0.02, 0.03, 0.05, 0.04]) + + def test_cancel(self): + def fun(x): + l.append(x) + + l = [] + self.ioloop.call_later(0.01, fun, 0.01).cancel() + self.ioloop.call_later(0.02, fun, 0.02) + self.ioloop.call_later(0.03, fun, 0.03) + self.ioloop.call_later(0.04, fun, 0.04) + self.ioloop.call_later(0.05, fun, 0.05).cancel() + self.scheduler() + self.assertEqual(l, [0.02, 0.03, 0.04]) + + def test_errback(self): + l = [] + self.ioloop.call_later( + 0.0, lambda: 1 // 0, _errback=lambda: l.append(True)) + self.scheduler() + self.assertEqual(l, [True]) + + def test__repr__(self): + repr(self.ioloop.call_later(0.01, lambda: 0, 0.01)) + + def test__lt__(self): + a = self.ioloop.call_later(0.01, lambda: 0, 0.01) + b = self.ioloop.call_later(0.02, lambda: 0, 0.02) + self.assertTrue(a < b) + + def test__le__(self): + a = self.ioloop.call_later(0.01, lambda: 0, 0.01) + b = self.ioloop.call_later(0.02, lambda: 0, 0.02) + self.assertTrue(a <= b) + + +class TestCallEvery(unittest.TestCase): + """Tests for CallEvery class.""" + + def setUp(self): + self.ioloop = IOLoop.instance() + for task in self.ioloop.sched._tasks: + if not task.cancelled: + task.cancel() + del self.ioloop.sched._tasks[:] + + def scheduler(self, timeout=0.003): + stop_at = time.time() + timeout + while time.time() < stop_at: + self.ioloop.sched.poll() + + def test_interface(self): + def fun(): + return 0 + + self.assertRaises(AssertionError, self.ioloop.call_every, -1, fun) + x = self.ioloop.call_every(3, fun) + self.assertEqual(x.cancelled, False) + x.cancel() + self.assertEqual(x.cancelled, True) + self.assertRaises(AssertionError, x.call) + self.assertRaises(AssertionError, x.reset) + x.cancel() + + def test_only_once(self): + # make sure that callback is called only once per-loop + def fun(): + l1.append(None) + + l1 = [] + self.ioloop.call_every(0, fun) + self.ioloop.sched.poll() + self.assertEqual(l1, [None]) + + def test_multi_0_timeout(self): + # make sure a 0 timeout callback is called as many times + # as the number of loops + def fun(): + l.append(None) + + l = [] + self.ioloop.call_every(0, fun) + for x in range(100): + self.ioloop.sched.poll() + self.assertEqual(len(l), 100) + + # run it on systems where time.time() has a higher precision + if POSIX: + def test_low_and_high_timeouts(self): + # make sure a callback with a lower timeout is called more + # frequently than another with a greater timeout + def fun(): + l1.append(None) + + l1 = [] + self.ioloop.call_every(0.001, fun) + self.scheduler() + + def fun(): + l2.append(None) + + l2 = [] + self.ioloop.call_every(0.005, fun) + self.scheduler(timeout=0.01) + + self.assertTrue(len(l1) > len(l2)) + + def test_cancel(self): + # make sure a cancelled callback doesn't get called anymore + def fun(): + l.append(None) + + l = [] + call = self.ioloop.call_every(0.001, fun) + self.scheduler() + len_l = len(l) + call.cancel() + self.scheduler() + self.assertEqual(len_l, len(l)) + + def test_errback(self): + l = [] + self.ioloop.call_every( + 0.0, lambda: 1 // 0, _errback=lambda: l.append(True)) + self.scheduler() + self.assertTrue(l) + + +class TestAsyncChat(unittest.TestCase): + + def get_connected_handler(self): + s = socket.socket() + self.addCleanup(s.close) + ac = AsyncChat(sock=s) + self.addCleanup(ac.close) + return ac + + def test_send_retry(self): + ac = self.get_connected_handler() + for errnum in pyftpdlib.ioloop._ERRNOS_RETRY: + with mock.patch("pyftpdlib.ioloop.socket.socket.send", + side_effect=socket.error(errnum, "")) as m: + self.assertEqual(ac.send(b"x"), 0) + assert m.called + + def test_send_disconnect(self): + ac = self.get_connected_handler() + for errnum in pyftpdlib.ioloop._ERRNOS_DISCONNECTED: + with mock.patch("pyftpdlib.ioloop.socket.socket.send", + side_effect=socket.error(errnum, "")) as send: + with mock.patch.object(ac, "handle_close") as handle_close: + self.assertEqual(ac.send(b"x"), 0) + assert send.called + assert handle_close.called + + def test_recv_retry(self): + ac = self.get_connected_handler() + for errnum in pyftpdlib.ioloop._ERRNOS_RETRY: + with mock.patch("pyftpdlib.ioloop.socket.socket.recv", + side_effect=socket.error(errnum, "")) as m: + self.assertRaises(RetryError, ac.recv, 1024) + assert m.called + + def test_recv_disconnect(self): + ac = self.get_connected_handler() + for errnum in pyftpdlib.ioloop._ERRNOS_DISCONNECTED: + with mock.patch("pyftpdlib.ioloop.socket.socket.recv", + side_effect=socket.error(errnum, "")) as send: + with mock.patch.object(ac, "handle_close") as handle_close: + self.assertEqual(ac.recv(b"x"), b'') + assert send.called + assert handle_close.called + + def test_connect_af_unspecified_err(self): + ac = AsyncChat() + with mock.patch.object( + ac, "connect", + side_effect=socket.error(errno.EBADF, "")) as m: + self.assertRaises(socket.error, + ac.connect_af_unspecified, ("localhost", 0)) + assert m.called + self.assertIsNone(ac.socket) + + +class TestAcceptor(unittest.TestCase): + + def test_bind_af_unspecified_err(self): + ac = Acceptor() + with mock.patch.object( + ac, "bind", + side_effect=socket.error(errno.EBADF, "")) as m: + self.assertRaises(socket.error, + ac.bind_af_unspecified, ("localhost", 0)) + assert m.called + self.assertIsNone(ac.socket) + + def test_handle_accept_econnacorted(self): + # https://github.com/giampaolo/pyftpdlib/issues/105 + ac = Acceptor() + with mock.patch.object( + ac, "accept", + side_effect=socket.error(errno.ECONNABORTED, "")) as m: + ac.handle_accept() + assert m.called + self.assertIsNone(ac.socket) + + def test_handle_accept_typeerror(self): + # https://github.com/giampaolo/pyftpdlib/issues/91 + ac = Acceptor() + with mock.patch.object(ac, "accept", side_effect=TypeError) as m: + ac.handle_accept() + assert m.called + self.assertIsNone(ac.socket) + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_misc.py b/ftp_server/pyftpdlib/test/test_misc.py new file mode 100644 index 00000000..054db722 --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_misc.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +from pyftpdlib.test import unittest +from pyftpdlib.test import VERBOSITY +from pyftpdlib.test import ThreadWorker + + +class TestThreadWorker(unittest.TestCase): + + def test_callback_methods(self): + class Worker(ThreadWorker): + + def poll(self): + if 'poll' not in flags: + flags.append('poll') + + def before_start(self): + flags.append('before_start') + + def before_stop(self): + flags.append('before_stop') + + def after_stop(self): + flags.append('after_stop') + + # Stress test it a little to make sure there are no race conditions + # between locks: the order is always supposed to be the same, no + # matter what. + for x in range(100): + flags = [] + tw = Worker(0.001) + tw.start() + tw.stop() + self.assertEqual( + flags, ['before_start', 'poll', 'before_stop', 'after_stop']) + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/pyftpdlib/test/test_servers.py b/ftp_server/pyftpdlib/test/test_servers.py new file mode 100644 index 00000000..cf491fa1 --- /dev/null +++ b/ftp_server/pyftpdlib/test/test_servers.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python + +# Copyright (C) 2007 Giampaolo Rodola' . +# Use of this source code is governed by MIT license that can be +# found in the LICENSE file. + +import contextlib +import ftplib +import socket + +from pyftpdlib import servers +from pyftpdlib.test import configure_logging +from pyftpdlib.test import HOST +from pyftpdlib.test import PASSWD +from pyftpdlib.test import remove_test_files +from pyftpdlib.test import ThreadedTestFTPd +from pyftpdlib.test import TIMEOUT +from pyftpdlib.test import unittest +from pyftpdlib.test import USER +from pyftpdlib.test import VERBOSITY +from pyftpdlib.test.test_functional import TestCallbacks +from pyftpdlib.test.test_functional import TestCornerCases +from pyftpdlib.test.test_functional import TestFtpAbort +from pyftpdlib.test.test_functional import TestFtpAuthentication +from pyftpdlib.test.test_functional import TestFtpCmdsSemantic +from pyftpdlib.test.test_functional import TestFtpDummyCmds +from pyftpdlib.test.test_functional import TestFtpFsOperations +from pyftpdlib.test.test_functional import TestFtpListingCmds +from pyftpdlib.test.test_functional import TestFtpRetrieveData +from pyftpdlib.test.test_functional import TestFtpStoreData +from pyftpdlib.test.test_functional import TestIPv4Environment +from pyftpdlib.test.test_functional import TestIPv6Environment + + +MPROCESS_SUPPORT = hasattr(servers, 'MultiprocessFTPServer') + + +class TestFTPServer(unittest.TestCase): + """Tests for *FTPServer classes.""" + server_class = ThreadedTestFTPd + client_class = ftplib.FTP + + def setUp(self): + self.server = None + self.client = None + + def tearDown(self): + if self.client is not None: + self.client.close() + if self.server is not None: + self.server.stop() + + def test_sock_instead_of_addr(self): + # pass a socket object instead of an address tuple to FTPServer + # constructor + with contextlib.closing(socket.socket()) as sock: + sock.bind((HOST, 0)) + sock.listen(5) + ip, port = sock.getsockname()[:2] + self.server = self.server_class(sock) + self.server.start() + self.client = self.client_class(timeout=TIMEOUT) + self.client.connect(ip, port) + self.client.login(USER, PASSWD) + + +# ===================================================================== +# --- threaded FTP server mixin tests +# ===================================================================== + +# What we're going to do here is repeat the original functional tests +# defined in test_functinal.py but by using different concurrency +# modules (multi thread and multi process instead of async. +# This is useful as we reuse the existent functional tests which are +# supposed to work no matter what the concurrency model is. + + +class _TFTPd(ThreadedTestFTPd): + server_class = servers.ThreadedFTPServer + + +class ThreadFTPTestMixin: + server_class = _TFTPd + + +class TestFtpAuthenticationThreadMixin(ThreadFTPTestMixin, + TestFtpAuthentication): + pass + + +class TestTFtpDummyCmdsThreadMixin(ThreadFTPTestMixin, TestFtpDummyCmds): + pass + + +class TestFtpCmdsSemanticThreadMixin(ThreadFTPTestMixin, TestFtpCmdsSemantic): + pass + + +class TestFtpFsOperationsThreadMixin(ThreadFTPTestMixin, TestFtpFsOperations): + pass + + +class TestFtpStoreDataThreadMixin(ThreadFTPTestMixin, TestFtpStoreData): + pass + + +class TestFtpRetrieveDataThreadMixin(ThreadFTPTestMixin, TestFtpRetrieveData): + pass + + +class TestFtpListingCmdsThreadMixin(ThreadFTPTestMixin, TestFtpListingCmds): + pass + + +class TestFtpAbortThreadMixin(ThreadFTPTestMixin, TestFtpAbort): + pass + + +# class TestTimeoutsThreadMixin(ThreadFTPTestMixin, TestTimeouts): +# def test_data_timeout_not_reached(self): pass +# class TestConfOptsThreadMixin(ThreadFTPTestMixin, TestConfigurableOptions): +# pass + + +class TestCallbacksThreadMixin(ThreadFTPTestMixin, TestCallbacks): + pass + + +class TestIPv4EnvironmentThreadMixin(ThreadFTPTestMixin, TestIPv4Environment): + pass + + +class TestIPv6EnvironmentThreadMixin(ThreadFTPTestMixin, TestIPv6Environment): + pass + + +class TestCornerCasesThreadMixin(ThreadFTPTestMixin, TestCornerCases): + pass + + +# class TestFTPServerThreadMixin(ThreadFTPTestMixin, TestFTPServer): +# pass + + +# ===================================================================== +# --- multiprocess FTP server mixin tests +# ===================================================================== + +if MPROCESS_SUPPORT: + class MultiProcFTPd(ThreadedTestFTPd): + server_class = servers.MultiprocessFTPServer + + class MProcFTPTestMixin: + server_class = MultiProcFTPd +else: + @unittest.skipIf(True, "multiprocessing module not installed") + class MProcFTPTestMixin: + pass + + +class TestFtpAuthenticationMProcMixin(MProcFTPTestMixin, + TestFtpAuthentication): + pass + + +class TestTFtpDummyCmdsMProcMixin(MProcFTPTestMixin, TestFtpDummyCmds): + pass + + +class TestFtpCmdsSemanticMProcMixin(MProcFTPTestMixin, TestFtpCmdsSemantic): + pass + + +class TestFtpFsOperationsMProcMixin(MProcFTPTestMixin, TestFtpFsOperations): + + def test_unforeseen_mdtm_event(self): + pass + + +class TestFtpStoreDataMProcMixin(MProcFTPTestMixin, TestFtpStoreData): + pass + + +class TestFtpRetrieveDataMProcMixin(MProcFTPTestMixin, TestFtpRetrieveData): + pass + + +class TestFtpListingCmdsMProcMixin(MProcFTPTestMixin, TestFtpListingCmds): + pass + + +class TestFtpAbortMProcMixin(MProcFTPTestMixin, TestFtpAbort): + pass + + +# class TestTimeoutsMProcMixin(MProcFTPTestMixin, TestTimeouts): +# def test_data_timeout_not_reached(self): pass +# class TestConfiOptsMProcMixin(MProcFTPTestMixin, TestConfigurableOptions): +# pass +# class TestCallbacksMProcMixin(MProcFTPTestMixin, TestCallbacks): pass + + +class TestIPv4EnvironmentMProcMixin(MProcFTPTestMixin, TestIPv4Environment): + pass + + +class TestIPv6EnvironmentMProcMixin(MProcFTPTestMixin, TestIPv6Environment): + pass + + +class TestCornerCasesMProcMixin(MProcFTPTestMixin, TestCornerCases): + pass + + +# class TestFTPServerMProcMixin(MProcFTPTestMixin, TestFTPServer): +# pass + + +configure_logging() +remove_test_files() + + +if __name__ == '__main__': + unittest.main(verbosity=VERBOSITY) diff --git a/ftp_server/start.sh b/ftp_server/start.sh new file mode 100644 index 00000000..d87a03a9 --- /dev/null +++ b/ftp_server/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ftp_server.py start diff --git a/ftp_server/stop.sh b/ftp_server/stop.sh new file mode 100644 index 00000000..e3e41d0d --- /dev/null +++ b/ftp_server/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ftp_server.py stop diff --git a/gnu_apps/extensible_ui_ref_app/README.md b/gnu_apps/extensible_ui_ref_app/README.md deleted file mode 100644 index 882d0e2c..00000000 --- a/gnu_apps/extensible_ui_ref_app/README.md +++ /dev/null @@ -1,154 +0,0 @@ -#Router SDK Dynamic UI reference application and development tools.# - ----------- - -### IMPORTANT: ### -This folder contains an SDK app that uses GNU make to build and install. The SDK python tools cannot be used this application. - -Prior to using 'make' execute the following based on you OS: - -- Linux - - sudo apt-get install libffi-dev - - sudo apt-get install libssl-dev - - sudo apt-get install curl - - sudo apt-get install python3-pip - - sudo python3 -m pip install -U cryptography -- OS X - - install python 3.5.1 from python.org - - pip3 install pyopenssl - - ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - - brew install curl - - brew install openssl - - export COPYFILE_DISABLE=1 - - excludes that "*._" files from the tar.gz. package in OS X. - ----------- - -###Available GNU make targets### - -**default:** - Build and test the router SDK reference app and create the archive - file suitable for deployment to a router DEV mode or for uploading - to ECM. - - **clean:** - Clean all project artifacts. Entails execution of all "-clean" - make targets. - - **build:** - PEP8 and PEP257 validation of all python source. - - **package:** - Create the application archive tar.gz file. - - **status:** - Fetch and print current SDK app status from the locally connected - router. - - **install:** - Secure copy the application archive to a locally connected router. - The router must already be in SDK DEV mode via registration and - licensing in ECM. - - **start:** - Start the application on the locally connected router. - - **stop:** - Stop the application on the locally connected router. - - **uninstall:** - Uninstall the application from the locally connected router. - - **purge:** - Purge all applications from the locally connected router. - - ----------- - -# HOW-TO Steps for running the reference application on your router. # - -*The Dynamic UI is supported in Firmware Version: 6.3.0 and above* - -1. Register your router with ECM. - -2. Put your router into SDK DEV mode via ECM. - -3. Export the following variables in your environment: - - DEV_CLIENT_MAC - The mac address of your router - DEV_CLIENT_IP - The lan ip address of your router - - Example: - - $ export DEV_CLIENT_MAC=44224267 - $ export DEV_CLIENT_IP=192.168.20.1 - -4. Build the SDK environment. - - $ make - -5. Test connectivity with your router via the 'status' target. - - $ make status - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X GET http://192.168.0.1/api/status/system/sdk | \ - /usr/bin/env python3 -m json.tool - { - "data": {}, - "success": true - } - -6. Build, test and install the reference application on your router. - - $ make install - scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload - admin@192.168.0.1's password: - hspt.tar.gz 100% 1439 1.4KB/s 00:00 - Received disconnect from 192.168.0.1: 11: Bye Bye - lost connection - -7. Get application execution status from your router. - - $ make status - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X GET http://192.168.0.1/api/status/system/sdk | \ - /usr/bin/env python3 -m json.tool - { - "data": { - "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": { - "app": { - "date": "2015-12-04T09:30:39.656151", - "name": "hspt", - "restart": true, - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "vendor": "Cradlebox", - "version_major": 1, - "version_minor": 1 - }, - "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "directory": hspt", - "filename": "dist/tmp_znv2t", - "state": "started", - "summary": "Package started successfully", - "type": "development", - "url": "file:///var/tmp/tmpg1385l", - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" - } - }, - "success": true - } - -8. Uninstall the reference application from your router. - - $ make uninstall - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X PUT http://192.168.0.1/api/control/system/sdk/action \ - -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \ - /usr/bin/env python3 -m json.tool - { - "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "success": true - } diff --git a/gnu_apps/extensible_ui_ref_app/hspt/cs.py b/gnu_apps/extensible_ui_ref_app/hspt/cs.py deleted file mode 100644 index d8e28436..00000000 --- a/gnu_apps/extensible_ui_ref_app/hspt/cs.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -Copyright (c) 2016 CradlePoint, Inc. . All rights -reserved. - -This file contains confidential information of CradlePoint, Inc. and your use -of this file is subject to the CradlePoint Software License Agreement -distributed with this file. Unauthorized reproduction or distribution of this -file is subject to civil and criminal penalties. -""" - -import re -import json -import socket -import subprocess - -def log(msg): - subprocess.run(['logger', msg]) - -class CSClient(object): - """Wrapper for the TCP interface to the router config store.""" - - def get(self, base, query='', tree=0): - """Send a get request.""" - cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) - return self._dispatch(cmd) - - def put(self, base, value='', query='', tree=0): - """Send a put request.""" - value = json.dumps(value).replace(' ', '') - cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) - return self._dispatch(cmd) - - def append(self, base, value='', query=''): - """Send an append request.""" - value = json.dumps(value).replace(' ', '') - cmd = "post\n{}\n{}\n{}\n".format(base, query, value) - return self._dispatch(cmd) - - def delete(self, base, query=''): - """Send a delete request.""" - cmd = "delete\n{}\n{}\n".format(base, query) - return self._dispatch(cmd) - - def alert(self, name='', value=''): - """Send a request to create an alert.""" - cmd = "alert\n{}\n{}\n".format(name, value) - return self._dispatch(cmd) - - def log(self, name='', value=''): - """Send a request to create a log entry.""" - cmd = "log\n{}\n{}\n".format(name, value) - return self._dispatch(cmd) - - def _dispatch(self, cmd): - """Send the command and return the response.""" - resl = '' - with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: - sock.connect('/var/tmp/cs.sock') - sock.sendall(bytes(cmd, 'ascii')) - - if str(sock.recv(1024), 'ascii').strip() == 'status: ok': - recv_mesg = str(sock.recv(1024), 'ascii').strip().split(' ')[1] - try: - mlen = int(recv_mesg) - except ValueError: - m = re.search("([0-9]*)", recv_mesg) - mlen = int(m.group(0)) - if str(sock.recv(1024), 'ascii') == '\r\n\r\n': - while mlen > 0: - resl += str(sock.recv(1024), 'ascii') - mlen -= 1024 - return resl diff --git a/gnu_apps/extensible_ui_ref_app/hspt/installer.py b/gnu_apps/extensible_ui_ref_app/hspt/installer.py deleted file mode 100644 index b0a26a41..00000000 --- a/gnu_apps/extensible_ui_ref_app/hspt/installer.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Copyright (c) 2016 CradlePoint, Inc. . All rights -reserved. - -This file contains confidential information of CradlePoint, Inc. and your use -of this file is subject to the CradlePoint Software License Agreement -distributed with this file. Unauthorized reproduction or distribution of this -file is subject to civil and criminal penalties. -""" -import os -import sys -import argparse -import subprocess -sys.path.append('.') - -import cs - -path = '/control/system/httpserver' - -route_map = [] - -def log(msg): - subprocess.run(['logger', msg]) - - -def mkroutes(route, directory): - location = "%s/%s" % (os.getcwd(), directory) - route_map.append((route, location)) - - -def action(command): - client = cs.CSClient() - - value = { - 'action': command, - 'routes': route_map, - 'server': 'hotspotServer' - } - client.put(path, value) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('opt') - args = parser.parse_args() - - # Build route maps for / and /resources - mkroutes('/(.*)', '') - mkroutes('/resources/(.*)', 'resources/') - - if args.opt not in ['start', 'stop']: - log('failed to run command') - exit() - - action(args.opt) diff --git a/gpio/power/__init__.py b/gpio/power/__init__.py deleted file mode 100644 index 19caa001..00000000 --- a/gpio/power/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from gpio.power.power import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/gpio/power/power.py b/gpio/power/power.py deleted file mode 100644 index 1d30521b..00000000 --- a/gpio/power/power.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Query the 2x2 power connector I/O -""" -import sys -import time - -from cp_lib.app_base import CradlepointAppBase - -DEF_INPUT_NAME = "status/gpio/CGPIO_CONNECTOR_INPUT" -DEF_OUTPUT_NAME = "status/gpio/CGPIO_CONNECTOR_OUTPUT" -DEF_LOOP_DELAY = 15 - - -def run_router_app(app_base, loop=True): - """ - - :param CradlepointAppBase app_base: the prepared resources: logger, - cs_client, settings, etc - :param bool loop: T to loop, else exit - :return: - """ - - # confirm we are running on 1100/1150, result should be like "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info("Product Model is good:{}".format(result)) - else: - app_base.logger.error("Inappropriate Product:{} - aborting.".format( - result)) - return -1 - - input_name = DEF_INPUT_NAME - output_name = DEF_OUTPUT_NAME - loop_delay = DEF_LOOP_DELAY - if "gpio_names" in app_base.settings: - if "input_name" in app_base.settings["gpio_names"]: - input_name = app_base.settings["gpio_names"]["input_name"] - if "output_name" in app_base.settings["gpio_names"]: - output_name = app_base.settings["gpio_names"]["output_name"] - loop_delay = float(app_base.settings["gpio_names"].get("loop_delay", - 15)) - - if not loop: - # then we'll jump from loop - likely running as test on a PC computer - loop_delay = None - - app_base.logger.info("GPIO 2x2 input name:{}".format(input_name)) - app_base.logger.info("GPIO 2x2 output name:{}".format(output_name)) - - while True: - - # self.state = self.client.get('/status/gpio/%s' % self.name) - result_in = app_base.cs_client.get(input_name) - result_out = app_base.cs_client.get(output_name) - app_base.logger.info("In={} Out={}".format(result_in, result_out)) - - if loop_delay is None: - # do an invert of output - if result_out in (1, "1"): - value = 0 - else: - value = 1 - - # self.client.put('/control/gpio', {self.name: self.state}) - result = app_base.cs_client.put("control/gpio", - {"CGPIO_CONNECTOR_OUTPUT": value}) - - if value != int(result): - app_base.logger.error("BAD - change failed {}".format(result)) - - # else app_base.logger.info("Change was GOOD {}".format(result)) - - break - else: - app_base.logger.debug("Looping - delay {} seconds".format( - loop_delay)) - time.sleep(loop_delay) - - return 0 - - -if __name__ == "__main__": - - my_app = CradlepointAppBase("gpio/power") - - _result = run_router_app(my_app, loop=False) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/gpio/power/settings.ini b/gpio/power/settings.ini deleted file mode 100644 index 558e35e2..00000000 --- a/gpio/power/settings.ini +++ /dev/null @@ -1,11 +0,0 @@ -[application] -name=power -description=Read the status of the 2x2 power connector -path=gpio/power -uuid=11c5bf3b-b0b0-408e-ba76-dbe436ec308d -version=1.0 - -[gpio_names] -input_name=status/gpio/CGPIO_CONNECTOR_INPUT -output_name=status/gpio/CGPIO_CONNECTOR_OUTPUT -loop_delay=10 diff --git a/gpio/serial_gpio/__init__.py b/gpio/serial_gpio/__init__.py deleted file mode 100644 index 4f079997..00000000 --- a/gpio/serial_gpio/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from gpio.serial_gpio.serial_gpio import read_gpio - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to read_gpio()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = read_gpio(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/gpio/serial_gpio/serial_gpio.py b/gpio/serial_gpio/serial_gpio.py deleted file mode 100644 index 757bb417..00000000 --- a/gpio/serial_gpio/serial_gpio.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Query the 2x2 power connector I/O -""" -import sys -import time - -from cp_lib.app_base import CradlepointAppBase - -DEF_SERIAL_NAME_1 = "status/gpio/CGPIO_SERIAL_INPUT_1" -DEF_SERIAL_NAME_2 = "status/gpio/CGPIO_SERIAL_INPUT_2" -DEF_SERIAL_NAME_3 = "status/gpio/CGPIO_SERIAL_INPUT_3" - -DEF_LOOP_DELAY = 15 - - -def read_gpio(app_base, loop=True): - """ - - :param CradlepointAppBase app_base: the prepared resources: logger, cs_client, settings, etc - :param bool loop: T to loop, else exit - :return: - """ - - # confirm we are running on an 1100/1150, result should be like "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info("Product Model is good:{}".format(result)) - else: - app_base.logger.error("Inappropriate Product:{} - aborting.".format(result)) - return -1 - - loop_delay = DEF_LOOP_DELAY - if "gpio_names" in app_base.settings: - loop_delay = float(app_base.settings["gpio_names"].get("loop_delay", 15)) - - if not loop: - # then we'll jump from loop - likely we are running as test on a PC computer - loop_delay = None - - # confirm we have the 1100 serial GPIO enabled, so return is True or False - result = app_base.cs_client.get_bool("status/system/gpio_actions/") - app_base.logger.debug("GET: status/system/gpio_actions/ = [{}]".format(result)) - if result is None: - # then the serial GPIO function is NOT enabled - app_base.logger.error("The Serial GPIO is NOT enabled!") - app_base.logger.info("Router Application is exiting") - return -1 - - while loop_delay: - # loop as long as not None or zero - result1 = app_base.cs_client.get(DEF_SERIAL_NAME_1) - result2 = app_base.cs_client.get(DEF_SERIAL_NAME_2) - result3 = app_base.cs_client.get(DEF_SERIAL_NAME_3) - app_base.logger.info("Inp = ({}, {}, {})".format(result1, result2, result3)) - - app_base.logger.debug("Looping - delay {} seconds".format(loop_delay)) - time.sleep(loop_delay) - - app_base.logger.info("Router Application is exiting") - return 0 - - -if __name__ == "__main__": - my_app = CradlepointAppBase("gpio/serial_gpio") - - _result = read_gpio(my_app, loop=False) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - - sys.exit(_result) diff --git a/gpio/serial_gpio/settings.ini b/gpio/serial_gpio/settings.ini deleted file mode 100644 index b7247a14..00000000 --- a/gpio/serial_gpio/settings.ini +++ /dev/null @@ -1,6 +0,0 @@ -[application] -name=serial_gpio -description=Read the status of the 1100 serial inputs -path=gpio/serial_gpio -uuid=0bbe8bcf-060e-4c9c-a141-48f5daf2a231 -version=1.0 diff --git a/gps/README.md b/gps/README.md deleted file mode 100644 index 8bee935e..00000000 --- a/gps/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Router App/SDK sample applications. - -## Directory gps_localhost - -Assuming the Cradlepoint router is configured to forward NMEA sentences -to a localhost port, open the port as a server and receive the streaming -GSP data. This code can be run on either a PC or Router. - -## Directory probe_gps - -Walk through the router API 'status' and 'config' trees, returning -a list of text strings showing if any GPS source exists, if there is -existing last-seen data, and so on. diff --git a/gps/gps_localhost/README.md b/gps/gps_localhost/README.md deleted file mode 100644 index 6566e912..00000000 --- a/gps/gps_localhost/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# directory: ./gps/gps_localhost -## Router App/SDK sample applications - -Received GPS, assuming the router's GPS function sends new data (sentences) -to a localhost port - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: gps_localhost.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [gps]: - -* host_port=9999, define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. diff --git a/gps/gps_localhost/__init__.py b/gps/gps_localhost/__init__.py deleted file mode 100644 index 4b655fa8..00000000 --- a/gps/gps_localhost/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from gps.gps_localhost.gps_localhost import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/gps/gps_localhost/gps_localhost.py b/gps/gps_localhost/gps_localhost.py deleted file mode 100644 index a72d557a..00000000 --- a/gps/gps_localhost/gps_localhost.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Received GPS, assuming the router's GPS function sends new data (sentences) -to a localhost port -""" - -import socket -import time -import gc - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.gps_nmea import NmeaStatus -from cp_lib.parse_data import parse_boolean - - -DEF_HOST_IP = 'localhost' -DEF_HOST_PORT = 9999 -DEF_BUFFER_SIZE = 1024 - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - host_ip = DEF_HOST_IP - host_port = DEF_HOST_PORT - buffer_size = DEF_BUFFER_SIZE - - gps = NmeaStatus() - - section = "gps" - if section in app_base.settings: - # then load dynamic values - host_ip = app_base.settings[section].get("host_ip", DEF_HOST_IP) - host_port = int(app_base.settings[section].get("host_port", - DEF_HOST_PORT)) - buffer_size = int(app_base.settings[section].get("buffer_size", - DEF_BUFFER_SIZE)) - - gps.date_time = parse_boolean( - app_base.settings[section].get("date_time", gps.DEF_DATE_TIME)) - gps.speed = parse_boolean( - app_base.settings[section].get("speed", gps.DEF_SPEED)) - gps.altitude = parse_boolean( - app_base.settings[section].get("altitude", gps.DEF_ALTITUDE)) - gps.coor_ddmm = parse_boolean( - app_base.settings[section].get("coor_ddmm", gps.DEF_COOR_DDMM)) - gps.coor_dec = parse_boolean( - app_base.settings[section].get("coor_dec", gps.DEF_COOR_DEC)) - - while True: - # define the socket resource, including the type (stream == "TCP") - address = (host_ip, host_port) - app_base.logger.info("Preparing GPS Listening on {}".format(address)) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # attempt to actually lock resource, which may fail if unavailable - # (see BIND ERROR note) - try: - sock.bind(address) - except OSError as msg: - app_base.logger.error("socket.bind() failed - {}".format(msg)) - - # technically, Python will close when 'sock' goes out of scope, - # but be disciplined and close it yourself. Python may warning - # you of unclosed resource, during runtime. - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors - # are likely permanent. - return -1 - - # only allow 1 client at a time - sock.listen(3) - - while True: - # loop forever - app_base.logger.info("Waiting on TCP socket %d" % host_port) - client, address = sock.accept() - app_base.logger.info("Accepted connection from {}".format(address)) - - # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # set non-blocking so we can do a manual timeout (use of select() - # is better ... but that's another sample) - # client.setblocking(0) - - while True: - app_base.logger.debug("Waiting to receive data") - data = client.recv(buffer_size) - # data is type() bytes, to echo we don't need to convert - # to str to format or return. - if data: - data = data.decode().split() - - gps.start() - for line in data: - result = gps.parse_sentence(line) - if not result: - break - gps.publish() - - app_base.logger.debug( - "See({})".format(gps.get_attributes())) - # client.send(data) - else: - break - - time.sleep(1.0) - - app_base.logger.info("Client disconnected") - client.close() - - # since this server is expected to run on a small embedded system, - # free up memory ASAP (see MEMORY note) - del client - gc.collect() - - return 0 - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("gps/gps_localhost") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/gps/probe_gps/__init__.py b/gps/probe_gps/__init__.py deleted file mode 100644 index 8a4fc5e8..00000000 --- a/gps/probe_gps/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -import time -from cp_lib.app_base import CradlepointAppBase -from gps.probe_gps.probe_gps import probe_gps - -SLEEP_DELAY = 60.0 - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to probe_gps()") - - # if user included a different timeout in settings - try: - delay = float(self.settings['probe_gps']['delay']) - - except (KeyError, ValueError): - delay = SLEEP_DELAY - - # we do this wrap to dump any Python exception traceback out to Syslog - result = -1 - while True: - try: - result = probe_gps(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - self.logger.debug("sleep to delay for {} seconds".format(delay)) - time.sleep(delay) - - return result diff --git a/gps/probe_gps/settings.ini b/gps/probe_gps/settings.ini deleted file mode 100644 index 5a3e85f8..00000000 --- a/gps/probe_gps/settings.ini +++ /dev/null @@ -1,10 +0,0 @@ -[application] -name=probe_gps -description=Query router status tree - discover if GPS is available and active -path=gps/probe_gps -uuid=8f828277-5e8f-4c90-9b99-aeebf3eb61f3 -version=1.2 - -[probe_gps] -filename=.gps.txt -delay=60.0 diff --git a/gps_localhost/cs.py b/gps_localhost/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/gps_localhost/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/gps_localhost/gps_localhost.py b/gps_localhost/gps_localhost.py new file mode 100644 index 00000000..a46d8dd4 --- /dev/null +++ b/gps_localhost/gps_localhost.py @@ -0,0 +1,141 @@ +""" +Assuming the Cradlepoint router is configured to forward NMEA sentences +to a localhost port, open the port as a server and receive the streaming +GSP data. + +""" + +import argparse +import socket +import time +import gc +import cs +import gps_nmea + +APP_NAME = 'gps_localhost' + + +def run_router_app(): + """ + """ + # cs.CSClient().log(APP_NAME, "Settings({})".format(sets)) + + host_ip = 'localhost' + host_port = 9999 + buffer_size = 1024 + + gps = gps_nmea.NmeaStatus() + + # set True to parse GPS time (as ['gps_utc']), else omit + gps.date_time = False + # set True to parse speed over ground (as ['knots'] & ['kmh']), else omit + gps.speed = True + # set True to parse altitude (as ['alt'], else omit + gps.altitude = False + # set True to include DDMM.MM string (as ['lat_ddmm' & 'long_ddmm'], else omit + gps.coor_ddmm = False + # set True to parse lat/log as decimal (as ['lat', 'long]), else omit + gps.coor_dec = True + + while True: + # define the socket resource, including the type (stream == "TCP") + address = (host_ip, host_port) + cs.CSClient().log(APP_NAME, "Preparing GPS Listening on {}".format(address)) + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + # attempt to actually lock resource, which may fail if unavailable + # (see BIND ERROR note) + try: + sock.bind(address) + except OSError as msg: + cs.CSClient().log(APP_NAME, "socket.bind() failed - {}".format(msg)) + + # technically, Python will close when 'sock' goes out of scope, + # but be disciplined and close it yourself. Python may warning + # you of unclosed resource, during runtime. + try: + sock.close() + except OSError: + pass + + # we exit, because if we cannot secure the resource, the errors + # are likely permanent. + return -1 + + # only allow 1 client at a time + sock.listen(3) + + while True: + # loop forever + cs.CSClient().log(APP_NAME, "Waiting on TCP socket %d" % host_port) + client, address = sock.accept() + cs.CSClient().log(APP_NAME, "Accepted connection from {}".format(address)) + + # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + + # set non-blocking so we can do a manual timeout (use of select() + # is better ... but that's another sample) + # client.setblocking(0) + + while True: + cs.CSClient().log(APP_NAME, "Waiting to receive data") + data = client.recv(buffer_size) + # data is type() bytes, to echo we don't need to convert + # to str to format or return. + if data: + data = data.decode().split() + + gps.start() + for line in data: + result = gps.parse_sentence(line) + if not result: + break + gps.publish() + + cs.CSClient().log(APP_NAME, + "See({})".format(gps.get_attributes())) + # client.send(data) + else: + break + + time.sleep(1.0) + + cs.CSClient().log(APP_NAME, "Client disconnected") + client.close() + + # since this server is expected to run on a small embedded system, + # free up memory ASAP (see MEMORY note) + del client + gc.collect() + + return 0 + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + run_router_app() + + elif command == 'stop': + # Nothing on stop + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/cp_lib/gps_nmea.py b/gps_localhost/gps_nmea.py similarity index 100% rename from cp_lib/gps_nmea.py rename to gps_localhost/gps_nmea.py diff --git a/gps_localhost/install.sh b/gps_localhost/install.sh new file mode 100644 index 00000000..8a6f4696 --- /dev/null +++ b/gps_localhost/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION gps_localhost on:" >> install.log +date >> install.log diff --git a/gps_localhost/package.ini b/gps_localhost/package.ini new file mode 100644 index 00000000..d665b0c3 --- /dev/null +++ b/gps_localhost/package.ini @@ -0,0 +1,11 @@ +[gps_localhost] +uuid=d2f51bb3-9f5f-414d-bf7e-82e2210d5e7b +vendor=Cradlepoint +notes=Receive GPS sentences on localhost port. +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/gps/gps_localhost/settings.ini b/gps_localhost/settings.ini similarity index 100% rename from gps/gps_localhost/settings.ini rename to gps_localhost/settings.ini diff --git a/gps_localhost/start.sh b/gps_localhost/start.sh new file mode 100644 index 00000000..ae239b25 --- /dev/null +++ b/gps_localhost/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython gps_localhost.py start diff --git a/gps_localhost/stop.sh b/gps_localhost/stop.sh new file mode 100644 index 00000000..a32d1a0c --- /dev/null +++ b/gps_localhost/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython gps_localhost.py stop diff --git a/gps_probe/cs.py b/gps_probe/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/gps_probe/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/gps/probe_gps/probe_gps.py b/gps_probe/gps_probe.py similarity index 59% rename from gps/probe_gps/probe_gps.py rename to gps_probe/gps_probe.py index 464e3061..f4854dde 100644 --- a/gps/probe_gps/probe_gps.py +++ b/gps_probe/gps_probe.py @@ -1,42 +1,40 @@ """ -Probe the GPS hardware, return a report as list of text, and actual ASCII file +Probe the GPS hardware and log the results. + +Walk through the router API 'status' and 'config' trees, returning +a list of text strings showing if any GPS source exists, if there is +existing last-seen data, and so on. + """ +import argparse import json import sys import time +import cs -from cp_lib.app_base import CradlepointAppBase -# from cp_lib.hw_status import am_running_on_router +APP_NAME = 'gps_probe' -def probe_gps(app_base, save_file=None): +def probe_gps(): """ - The main GPS task. - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param str save_file: If a name, then save as text file - :return int: + Probe for GPS data and log the results. """ message = "Probing GPS HW - {}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) report_lines = [message] - if "probe_gps" in app_base.settings: - if "filename" in app_base.settings["probe_gps"]: - save_file = app_base.settings["probe_gps"]["filename"] - # check the type of Router we are running on try: - result = app_base.settings["product_info"]["product_name"] + result = json.loads(cs.CSClient().get("status/product_info/product_name")) message = "Router Model:{}".format(result) report_lines.append(message) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) except KeyError: - app_base.logger.error("App Base is missing 'product_info'") + cs.CSClient().log(APP_NAME, "App Base is missing 'product_info'") - result = app_base.cs_client.get("config/system/gps") + result = json.loads(cs.CSClient().get("config/system/gps")) if not isinstance(result, dict): # some error? gps_enabled = False @@ -53,30 +51,18 @@ def probe_gps(app_base, save_file=None): else: message = "GPS Function is NOT Enabled" report_lines.append(message) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) if result.get("enable_gps_keepalive", False): message = "GPS Keepalive is Enabled" else: message = "GPS Keepalive is NOT Enabled" report_lines.append(message) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) if gps_enabled: # only do this if enabled! - app_base.cs_client.show_rsp = False - result = app_base.cs_client.get("status/wan/devices") - app_base.cs_client.show_rsp = True - # logger.debug("Type(result):{}".format(type(result))) - # logger.debug("Result:{}".format(result)) - - # if not am_running_on_router(): - if sys.platform == "win32": - file_name = ".dump.json" - app_base.logger.debug("Save file:{}".format(file_name)) - file_han = open(file_name, "w") - file_han.write(json.dumps(result, ensure_ascii=True, indent=4)) - file_han.close() + result = json.loads(cs.CSClient().get("status/wan/devices")) gps_sources = [] for key in result: @@ -91,10 +77,10 @@ def probe_gps(app_base, save_file=None): gps_sources.append(key) else: # for example, inactive w/o GPS will be only {} - message = "Modem named \"{0}\" lacks GPS data".format( - key) + message = "Modem named \"{0}\" lacks GPS data".format(key) + report_lines.append(message) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) except KeyError: # for example, the WAN device 'ethernet-wan' will LACK # the key ["info"]["supports_gps"] @@ -106,10 +92,10 @@ def probe_gps(app_base, save_file=None): elif len(gps_sources) == 1: message = "Router has 1 modem claiming to have GPS data" else: - message = "Router has {0} modems claiming GPS data".format( - len(gps_sources)) + message = "Router has {0} modems claiming GPS data".format(len(gps_sources)) + report_lines.append(message) - app_base.logger.info(message) + cs.CSClient().log(APP_NAME, message) # {'fix': { # 'age': 57.38595999999962, @@ -132,41 +118,44 @@ def probe_gps(app_base, save_file=None): if len(gps_sources) > 0: value = result[gps_sources[0]]["status"]["gps"] message = "GPS data follows" - app_base.logger.debug(message) + cs.CSClient().log(APP_NAME, message) report_lines.append(message) json_value = json.dumps(value, ensure_ascii=True, indent=4) json_lines = json_value.split(sep='\n') for line in json_lines: - app_base.logger.debug(line) + cs.CSClient().log(APP_NAME, line) + # Save all the gps data in report_lines. This can + # be saved to a file if needed. report_lines.append(line) - if save_file is not None: - # if am_running_on_router(): - if sys.platform != "win32": - pass - # app_base.logger.error( - # Skip save to file - am running on router.") - else: - app_base.logger.debug("Save file:{}".format(save_file)) - file_han = open(save_file, "w") - for line in report_lines: - file_han.write(line + '\n') - file_han.close() - return 0 -if __name__ == "__main__": - import logging +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) - # get this started, else we don't see anything for a while - logging.basicConfig(level=logging.DEBUG) + if command == 'start': + probe_gps() - my_app = CradlepointAppBase("gps/probe_gps") + elif command == 'stop': + # Nothing on stop + pass - _result = probe_gps(my_app) + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() - my_app.logger.info("Exiting, status code is {}".format(_result)) + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() - sys.exit(_result) + action(args.opt) diff --git a/gps_probe/install.sh b/gps_probe/install.sh new file mode 100644 index 00000000..f97d79ea --- /dev/null +++ b/gps_probe/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION gps_probe on:" >> install.log +date >> install.log diff --git a/gps_probe/package.ini b/gps_probe/package.ini new file mode 100644 index 00000000..8f8b2b72 --- /dev/null +++ b/gps_probe/package.ini @@ -0,0 +1,11 @@ +[gps_probe] +uuid=887552c5-ba26-49fb-80df-6e2ad1265eae +vendor=Cradlepoint +notes=GPS Reference Application: Probe for GPS data if it's enabled. +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/gps_probe/start.sh b/gps_probe/start.sh new file mode 100644 index 00000000..ed58b162 --- /dev/null +++ b/gps_probe/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython gps_probe.py start diff --git a/gps_probe/stop.sh b/gps_probe/stop.sh new file mode 100644 index 00000000..fdf24d9d --- /dev/null +++ b/gps_probe/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython gps_probe.py stop diff --git a/hello_world/cs.py b/hello_world/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/hello_world/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/hello_world/hello_world.py b/hello_world/hello_world.py new file mode 100644 index 00000000..2d80c2c3 --- /dev/null +++ b/hello_world/hello_world.py @@ -0,0 +1,34 @@ +''' +Outputs a 'Hello World!' log every 10 seconds. +''' + +import argparse +import time +import cs +import subprocess + +APP_NAME = 'hello_world' + + +def action(command): + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + while True: + cs.CSClient().log(APP_NAME, 'Hello World!') + time.sleep(10) + + elif command == 'stop': + pass + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/hello_world/install.sh b/hello_world/install.sh new file mode 100644 index 00000000..66afc23b --- /dev/null +++ b/hello_world/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION hello_world on:" >> install.log +date >> install.log diff --git a/hello_world/package.ini b/hello_world/package.ini new file mode 100644 index 00000000..34331686 --- /dev/null +++ b/hello_world/package.ini @@ -0,0 +1,11 @@ +[hello_world] +uuid=616acd0c-0475-479e-a33b-f7054843c971 +vendor=Cradlepoint +notes=Router SDK Hello World Application +firmware_major=7 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/hello_world/start.sh b/hello_world/start.sh new file mode 100644 index 00000000..25646ed8 --- /dev/null +++ b/hello_world/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython hello_world.py start diff --git a/hello_world/stop.sh b/hello_world/stop.sh new file mode 100644 index 00000000..7204ba45 --- /dev/null +++ b/hello_world/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython hello_world.py stop diff --git a/hspt/cs.py b/hspt/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/hspt/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/gnu_apps/extensible_ui_ref_app/dynui.txt b/hspt/dynui.txt similarity index 100% rename from gnu_apps/extensible_ui_ref_app/dynui.txt rename to hspt/dynui.txt diff --git a/gnu_apps/extensible_ui_ref_app/hspt/index.tpl.html b/hspt/index.tpl.html similarity index 59% rename from gnu_apps/extensible_ui_ref_app/hspt/index.tpl.html rename to hspt/index.tpl.html index 236825c6..f15c3448 100644 --- a/gnu_apps/extensible_ui_ref_app/hspt/index.tpl.html +++ b/hspt/index.tpl.html @@ -16,6 +16,14 @@

Dynamic UI example

This is a static webpage to demonstrate the use of Dynamic UI SDK technology. This page can be used to display a Terms of Service for Cradlepoint's Hotspot functionality.

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut id tempor risus, id efficitur + est. Fusce eu velit tincidunt, condimentum tellus sed, interdum arcu. Curabitur id dolor non ex + commodo faucibus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur + ridiculus mus. Proin ac sem ligula. Suspendisse et fermentum ipsum, id fringilla nulla. Vivamus + sit amet pulvinar magna, vitae posuere eros. Praesent eget mauris eu risus viverra gravida. + Integer efficitur nec lectus scelerisque lacinia. Cras massa arcu, efficitur vitae eros eu, + feugiat aliquet ante.

diff --git a/gnu_apps/extensible_ui_ref_app/hspt/install.sh b/hspt/install.sh similarity index 100% rename from gnu_apps/extensible_ui_ref_app/hspt/install.sh rename to hspt/install.sh diff --git a/hspt/installer.py b/hspt/installer.py new file mode 100644 index 00000000..d65cb869 --- /dev/null +++ b/hspt/installer.py @@ -0,0 +1,56 @@ +""" +Copyright (c) 2016 CradlePoint, Inc. . All rights +reserved. + +This file contains confidential information of CradlePoint, Inc. and your use +of this file is subject to the CradlePoint Software License Agreement +distributed with this file. Unauthorized reproduction or distribution of this +file is subject to civil and criminal penalties. +""" +import os +import sys +import argparse +import subprocess +sys.path.append('.') + +import cs + +path = '/control/system/httpserver' + +route_map = [] + + +def log(msg): + subprocess.run(['logger', msg]) + + +def mkroutes(route, directory): + location = "%s/%s" % (os.getcwd(), directory) + route_map.append((route, location)) + + +def action(command): + client = cs.CSClient() + + value = { + 'action': command, + 'routes': route_map, + 'server': 'hotspotServer' + } + client.put(path, value) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + # Build route maps for / and /resources + mkroutes('/(.*)', '') + mkroutes('/resources/(.*)', 'resources/') + + if args.opt not in ['start', 'stop']: + log('failed to run command') + exit() + + action(args.opt) diff --git a/gnu_apps/extensible_ui_ref_app/hspt/package.ini b/hspt/package.ini similarity index 90% rename from gnu_apps/extensible_ui_ref_app/hspt/package.ini rename to hspt/package.ini index cdee118a..628ba466 100644 --- a/gnu_apps/extensible_ui_ref_app/hspt/package.ini +++ b/hspt/package.ini @@ -1,6 +1,6 @@ [hspt] uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c -vendor=Cradlebox +vendor=Cradlepoint notes=Router SDK Demo Application firmware_major=6 firmware_minor=1 diff --git a/gnu_apps/extensible_ui_ref_app/hspt/resources/generic.css b/hspt/resources/generic.css similarity index 100% rename from gnu_apps/extensible_ui_ref_app/hspt/resources/generic.css rename to hspt/resources/generic.css diff --git a/gnu_apps/extensible_ui_ref_app/hspt/resources/netcloud-mobileimg.jpg b/hspt/resources/netcloud-mobileimg.jpg similarity index 100% rename from gnu_apps/extensible_ui_ref_app/hspt/resources/netcloud-mobileimg.jpg rename to hspt/resources/netcloud-mobileimg.jpg diff --git a/gnu_apps/extensible_ui_ref_app/hspt/start.sh b/hspt/start.sh similarity index 100% rename from gnu_apps/extensible_ui_ref_app/hspt/start.sh rename to hspt/start.sh diff --git a/gnu_apps/extensible_ui_ref_app/hspt/stop.sh b/hspt/stop.sh similarity index 100% rename from gnu_apps/extensible_ui_ref_app/hspt/stop.sh rename to hspt/stop.sh diff --git a/list_serial_ports/cs.py b/list_serial_ports/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/list_serial_ports/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/list_serial_ports/install.sh b/list_serial_ports/install.sh new file mode 100644 index 00000000..6f631ff6 --- /dev/null +++ b/list_serial_ports/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION list_serial_ports on:" >> install.log +date >> install.log diff --git a/list_serial_ports/list_serial_ports.py b/list_serial_ports/list_serial_ports.py new file mode 100644 index 00000000..ec2bca2a --- /dev/null +++ b/list_serial_ports/list_serial_ports.py @@ -0,0 +1,179 @@ +import argparse +import serial +import json +import cs + +''' +This sample code runs through one check, then exits. +Assuming you have 'restart' true in your settings.ini file, then +the code restarts forever. + +Based on the model of router you have, it checks to see if the ports below +exist, can be opened, and the name of the port written to it. + +Real Physical ports: + +* /dev/ttyS1 (only on models such as IBR1100) +* /dev/ttyS2 (normally will fail/not exist) + +USB serial ports: + +* /dev/ttyUSB0 +* /dev/ttyUSB1 +* /dev/ttyUSB2 +* /dev/ttyUSB3 +* /dev/ttyUSB4 + +Most USB-serial devices with an FTDI-chipset can be used. +''' + +# this exists on most, but is for internal use. +IGNORE_TTYS0 = True + +PORT_LIST_PHYSICAL = (1, 2) +PORT_LIST_USB = (0, 1, 2, 3, 4) + +APP_NAME = 'list_serial_ports' + + +def run_router_app(): + """ + Do the probe/check of + """ + + # as of Mat-2016/FW=6.1, PySerial is version 2.6 (2.6-pre1) + cs.CSClient().log(APP_NAME, "serial.VERSION = {}.".format(serial.VERSION)) + + # probe_physical = True, set False to NOT probe real physical serial ports. + # On models without physical ports, this setting is ignored. + probe_physical = True + + # probe_usb = True, set False to NOT probe for USB serial ports. + probe_usb = True + + # write_name = True, set False to NOT send out the port name, which is + # sent to help you identify between multiple ports. + write_name = False + + # probe_directory(app_base, "/dev") + port_list = [] + + # confirm we are running on an 1100/1150 or 900/950, result should be "IBR1100LPE" + result = json.loads(cs.CSClient().get("status/product_info/product_name")) + if "IBR1100" in result or "IBR1150" in result or "IBR900" in result or "IBR950" in result: + name = "/dev/ttyS1" + cs.CSClient().log(APP_NAME, "Product Model {} has 1 builtin port:{}".format(result, name)) + port_list.append(name) + + elif "IBR300" in result or "IBR350" in result: + cs.CSClient().log(APP_NAME, "Product Model {} has no serial support".format(result)) + + else: + cs.CSClient().log(APP_NAME, "Inappropriate Product:{} - aborting.".format(result)) + return -1 + + if probe_physical: + # fixed ports - 1100 only? + if not IGNORE_TTYS0: + # only check S0 if 'requested' to, else ignore + name = "/dev/ttyS0" + if name not in port_list: + port_list.append(name) + + for port in PORT_LIST_PHYSICAL: + name = "/dev/ttyS%d" % port + if name not in port_list: + port_list.append(name) + + if probe_usb: + # try first 5 USB + for port in PORT_LIST_USB: + name = "/dev/ttyUSB%d" % port + if name not in port_list: + port_list.append(name) + + # cycle through and probe the desired ports + for name in port_list: + probe_serial(name, write_name) + + return 0 + + +def probe_serial(port_name, write_name=False): + """ + dump a directory in router FW + """ + try: + ser = serial.Serial(port_name, dsrdtr=False, rtscts=False) + if write_name: + port_name += '\r\n' + ser.write(port_name.encode()) + + cs.CSClient().log(APP_NAME, "Port({}) exists.".format(port_name)) + + # as of Mat-2016/FW=6.1, PySerial is version 2.6 + # therefore .getDSR() works and .dsr does not! + try: + cs.CSClient().log(APP_NAME, " serial.dsr = {}.".format(ser.dsr)) + except AttributeError: + cs.CSClient().log(APP_NAME, " serial.dsr is not supported!") + + try: + cs.CSClient().log(APP_NAME, " serial.getDSR() = {}.".format(ser.getDSR())) + except AttributeError: + cs.CSClient().log(APP_NAME, " serial.getDSR() is not supported!") + + ser.close() + return True + + except (serial.SerialException, FileNotFoundError): + cs.CSClient().log(APP_NAME, "Port({}) didn't exist.".format(port_name)) + return False + + +def probe_directory(base_dir): + """ + dump a directory in router FW + """ + import os + + cs.CSClient().log(APP_NAME, "Dump Directory:{}".format(base_dir)) + result = os.access(base_dir, os.R_OK) + if result: + cs.CSClient().log(APP_NAME, "GOOD name:{}".format(base_dir)) + else: + cs.CSClient().log(APP_NAME, "BAD name:{}".format(base_dir)) + + if result: + result = os.listdir(base_dir) + for name in result: + cs.CSClient().log(APP_NAME, " file:{}".format(name)) + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + run_router_app() + + elif command == 'stop': + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/list_serial_ports/package.ini b/list_serial_ports/package.ini new file mode 100644 index 00000000..4f2c01aa --- /dev/null +++ b/list_serial_ports/package.ini @@ -0,0 +1,11 @@ +[list_serial_ports] +uuid=0268197b-1713-42d4-955f-25f04708ac21 +vendor=Cradlepoint +notes=Router Serial Reference Application. List all the serial ports. +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/list_serial_ports/start.sh b/list_serial_ports/start.sh new file mode 100644 index 00000000..87c7db6a --- /dev/null +++ b/list_serial_ports/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython list_serial_ports.py start diff --git a/list_serial_ports/stop.sh b/list_serial_ports/stop.sh new file mode 100644 index 00000000..5ab36705 --- /dev/null +++ b/list_serial_ports/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython list_serial_ports.py stop diff --git a/loglevel/cs.py b/loglevel/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/loglevel/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/loglevel/install.sh b/loglevel/install.sh new file mode 100644 index 00000000..96e94ff6 --- /dev/null +++ b/loglevel/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION loglevel on:" >> install.log +date >> install.log diff --git a/loglevel/loglevel.py b/loglevel/loglevel.py new file mode 100644 index 00000000..822201a8 --- /dev/null +++ b/loglevel/loglevel.py @@ -0,0 +1,44 @@ +''' +This reference application will change the router logging level to 'info' when +the app is started and then to 'debug' when it is stopped (i.e. unloaded or purged). +''' +import argparse +import cs + +APP_NAME = 'loglevel' + + +def action(command): + try: + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + # Read the logging level + ret_value = cs.CSClient().get('/config/system/logging/level') + + # Output a syslog for the current logging level + cs.CSClient().log(APP_NAME, 'Current Logging level = {}'.format(ret_value)) + ret_value = '' + + if command == 'start': + # Set the logging level to info when the app is started. + ret_value = cs.CSClient().put('/config/system/logging', {'level': 'info'}) + elif command == 'stop': + # Set the logging level to debug when the app is stopped. + ret_value = cs.CSClient().put('/config/system/logging', {'level': 'debug'}) + + # Output a syslog for the new current logging level + cs.CSClient().log(APP_NAME, 'New Logging level = {}'.format(ret_value)) + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/loglevel/package.ini b/loglevel/package.ini new file mode 100644 index 00000000..651ecb6a --- /dev/null +++ b/loglevel/package.ini @@ -0,0 +1,11 @@ +[loglevel] +uuid=616acd0c-0475-479e-a33b-f7054843c971 +vendor=Cradlepoint +notes=Router SDK Reference Application +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/loglevel/start.sh b/loglevel/start.sh new file mode 100644 index 00000000..7a0b2138 --- /dev/null +++ b/loglevel/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython loglevel.py start diff --git a/loglevel/stop.sh b/loglevel/stop.sh new file mode 100644 index 00000000..dd728348 --- /dev/null +++ b/loglevel/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython loglevel.py stop diff --git a/make.py b/make.py index 34bbda6b..ee946f66 100644 --- a/make.py +++ b/make.py @@ -1,1359 +1,350 @@ +''' +This is the Router SDK tool used to created applications +for Cradlepoint routers. It will work on Linux, OS X, and +Windows once the computer environment is setup. +''' -import logging import os -import os.path +import sys +import uuid +import json import shutil +import requests import subprocess -import sys -import time - -# these must be added, pulled in by pip -# import requests -# import requests.exceptions -# from requests.auth import HTTPDigestAuth - -from tools.copy_file_nl import copy_file_nl -import cp_lib.app_name_parse as app_name_parse -from cp_lib.app_base import CradlepointAppBase, CradlepointSdkDisabled -from cp_lib.cs_ping import cs_ping - -SDIR_CONFIG = "config" -SDIR_BUILD = "build" - -# used for make options which don't need name (that assume 'any app' on -# router or in ./build -DEF_DUMMY_NAME = "make" - -FILE_NAME_INSTALL = "install.sh" -FILE_NAME_START = "start.sh" -FILE_NAME_MAIN = "main.py" -FILE_NAME_UUID = "_last_uuid.txt" - -SCP_USER_DEFAULT = "admin" -WIN_SCP_NAME = "./tools/pscp.exe" - -# def is for Linux -DEF_SCP_NAME = "scp" - -# set False means SCP will ask for password always; True means SSHPASS is used -# to feed password from ./config/settings.ini -USE_SSH_PASS = True - -# codes returned by Router API access which fails -EXIT_CODE_NO_DATA = -20099 -EXIT_CODE_NO_RESPONSE = -20098 -EXIT_CODE_BAD_FORM = -20097 -EXIT_CODE_NO_APPS = -20096 -EXIT_CODE_MISSING_DEP = -20095 -EXIT_CODE_BAD_ACTION = -20094 - -# allow a quicker timeout since we are talking LOCALLY only, so default is -# unnecessarily long -API_REQUESTS_TIMEOUT = 2.0 - -# any file in app directory starting with this is skipped, set to None to -# NOT skip any -SKIP_PREFACE_CHARACTER = '.' - - -class TheMaker(CradlepointAppBase): - - SDIR_SAVE_EXT = ".save" - - ACTION_DEFAULT = "status" - ACTION_NAMES = ("build", "package", "status", "install", "start", - "stop", "uninstall", - "purge", "uuid", "reboot", "clean", "ping") - ACTION_HELP = { - "build": "Alias for 'package'.", - "package": "Create the application archive tar.gz file.", - "status": "Print current SDK app status from locally connected router", - "install": "Secure copy the application archive to a locally connect" + - "ed router. The router must already be in SDK DEV mode " + - "via registration and licensing in ECM.", - "start": "Start the application on the locally connected router.", - "stop": "Stop the application on the locally connected router.", - "uninstall": "Uninstall the application from locally connected router", - "purge": "Purge all applications from the locally connected router.", - "uuid": "Issue status to router, display any UUID installed", - "reboot": "Reboot your router", - "clean": "delete temp build files", - "ping": "ask router to ping a local IP" - } - - ACTION_CALL_TO_ROUTER = ("status", "install", "start", "stop", - "uninstall", "purge", "uuid", "reboot", "ping") - ACTION_NEED_UUID = ("start", "stop", "uninstall") - - SETS_DEFAULT_USER_NAME = "admin" - - # could also set to be os.sep, if you like. But Windows accepts Linux style - DEF_SEP = '/' - - def __init__(self): - """Basic Init""" - from cp_lib.load_settings_ini import copy_config_ini_to_json - - # make sure we have at least a basic ./config/settings.json - # ALWAYS copy existing ./config/settings.ini over, which makes - # CradlepointAppBase.__init__() happy - copy_config_ini_to_json() - - # we don't contact router for model/fw - will do in sanity_check, IF - # the command means contact router - CradlepointAppBase.__init__(self, call_router=False, log_name="make") - - # 'attrib' are our internal pre-processed settings for MAKE use - self.attrib = {} - - self.command = "make" - self.action = self.ACTION_DEFAULT - - # these are in CradlepointAppBase - # self.run_name = None # like "network/tcp_echo/__init__.py" - # self.app_path = None # like "network/tcp_echo/", used to find files - # self.app_name = None # like "tcp_echo" - # self.mod_name = None # like "network.tcp_echo", used for importlib - # self.settings = load_settings_json(self.app_path) - # self.logger = get_recommended_logger(self.settings) - # self.cs_client = init_cs_client_on_my_platform(self.logger, - # self.settings) - - # should MAKE edit/change the [app][version] in setting.ini? - self.increment_version = False - - # are we building for running on PC? Then don't include PIP add-ins - self.ignore_pip = False - - # define LOGGING between DEBUG or INFO - self.verbose = False - - self.last_url = None - self.last_reply = None - self.last_status = None - self._last_uuid = None - - self._exclude = [] - - return - - def run(self): - """Dummy to satisfy CradlepointAppBase""" - return - - def main(self): - """ - - :return int: code for sys.exit() - """ - from cp_lib.load_settings_ini import load_sdk_ini_as_dict - - self.logger.debug("Make:, Action:{0}, Name:{1}".format(self.action, - self.app_path)) - - # handle diverse app_path - if self.app_path is not None: - assert isinstance(self.app_path, str) - # make sure is Linux-style PATH, not Windows nor 'dot' module name - self.app_path = app_name_parse.get_app_path(self.app_path, - self.DEF_SEP) - self.app_name = app_name_parse.get_app_name(self.app_path) - self.mod_name = app_name_parse.get_module_name(self.app_path) - - # load the base config from raw INI. These are use of all actions, - # but not BUILD/PACKAGE - self.settings = load_sdk_ini_as_dict(self.app_path) - - # confirm we have the APP PATH set okay - if self.app_path is None: - # without a path, might be just checking router status, etc - self.attrib["path"] = DEF_DUMMY_NAME - self.attrib["name"] = DEF_DUMMY_NAME - self.app_path = DEF_DUMMY_NAME - - else: # assume was passed in commandline - self.attrib["name"] = self.app_name - self.attrib["path"] = self.app_path - - # throws exception if environment is not sane & cannot be made sane - self.sanity_check_environment() - - self.action = self.action.lower() - if self.action in ("build", "package"): - # go to our router & check status - return self.action_package() - - elif self.action == "status": - # go to our router & check status - try: - return self.action_status(verbose=True) - - except CradlepointSdkDisabled: - self.logger.error("Router Lacks SDK function") - return -1 - - elif self.action == "install": - # try to send our TAR.GZIP to our router - return self.action_install(self.app_path) - - elif self.action == "start": - # go to our router & start (if installed?) - return self.action_start() - - elif self.action == "stop": - # go to our router & stop (if running?) - return self.action_stop() - - elif self.action == "uninstall": - # go to our router & do an install - # TODO - fix the uninstall after FW: 6.2.2 - # now, router leaves misc old app info around, so we'll - # need to do a better scan, finding apps to install - # INFO:make:SDK APP[0] UUID:db946fe9-fb7e-42b1-8589-123ff698b67e - # INFO:make:SDK APP[0] State:uninstalled - # INFO:make:SDK APP[0] Summary:Uninstalled Application - # INFO:make:SDK APP[1] UUID:114c8c0f-9887-4e68-a4e7-de8d73fba69f - # INFO:make:SDK APP[1] State:started - # INFO:make:SDK APP[1] Summary:Started Application - # INFO:make:SDK APP[1] Name:hello_world - # INFO:make:SDK APP[1] Date:2016-10-20T13:12:51Z - # INFO:make:SDK APP[1] Version:1.12 - # return self.action_uninstall() - self.logger.info("Doing PURGE instead of UNINSTALL") - return self.action_purge() - - elif self.action == "purge": - # go to our router & force a purge - return self.action_purge() - - elif self.action == "uuid": - # go to our router & check UUID in status - return self.action_get_uuid_from_router() - - elif self.action == "reboot": - # go to our router & force a reboot - return self.action_reboot() - - elif self.action == "clean": - # delete temp build files - return self.action_clean() - - elif self.action == "ping": - # delete temp build files - return self.action_ping(self.app_path) - - else: - raise ValueError("Unsupported Command:" + self.action) - - def get_app_name(self): - """Return the path for the app files""" - return self.settings["application"]["name"] - - def get_app_path(self): - """Return the path for the app files""" - if "path" in self.attrib: - return self.attrib["path"] - raise KeyError("App Path attrib is missing") - - def get_build_path(self): - """Return the path for the app files - force Linux format""" - if "build" not in self.attrib: - # self.attrib["build"] = os.path.join(SDIR_BUILD, - # self.get_app_name()) - self.attrib["build"] = SDIR_BUILD + '/' + self.get_app_name() + '/' - return self.attrib["build"] - - def get_main_file_name(self): - """Return the MAIN file name to run""" - if "main_file_name" in self.attrib: - return self.attrib["main_file_name"] - else: - return FILE_NAME_MAIN - - def get_router_ip(self): - return self.settings["router_api"]["local_ip"] - - def get_router_password(self): - return self.settings["router_api"]["password"] - - def get_router_user_name(self): - try: - return self.settings["router_api"]["user_name"] - except KeyError: - return "admin" - - def sanity_check_environment(self): - """ - Confirm the basic directories do exist - such as ./config - - :return None: Throws an exception if it fails - """ - from cp_lib.load_product_info import load_product_info - from cp_lib.load_firmware_info import load_firmware_info - - # confirm ./config exists and is not a file - self._confirm_dir_exists(SDIR_CONFIG, "CONFIG dir") - - if "path" not in self.attrib: - raise KeyError("SDK App Path missing in attributes") - - if "name" not in self.attrib: - raise KeyError("SDK App Name missing in attributes") - - # fussy neatness - force Linux to propagate to - ["path"] - self.attrib["path"] = app_name_parse.normalize_path_separator( - self.attrib["path"], self.DEF_SEP) - - if self.action in self.ACTION_CALL_TO_ROUTER: - self.logger.info("sets:{}".format(self.settings)) - # then check for Model & firmware - save_value = self.cs_client.show_rsp - self.cs_client.show_rsp = False - self.settings = load_product_info(self.settings, self.cs_client) - self.settings = load_firmware_info(self.settings, self.cs_client) - # print(json.dumps(self.settings, ensure_ascii=True, indent=4)) - self.cs_client.show_rsp = save_value - - self.logger.info("Cradlepoint router is model:{}".format( - self.settings["product_info"]["product_name"])) - self.logger.info("Cradlepoint router FW version:{}".format( - self.settings["fw_info"]["version"])) - - if self.action in self.ACTION_NEED_UUID: - # these need the UUID - if "uuid" not in self.attrib: - # then try to read the ./config/last_uuid.txt file - data = self._read_uid_file() - if data is not None: - self.logger.debug("last_uuid=({})".format(data)) - self.attrib["uuid"] = data - - # else: - # raise KeyError("SDK UUID missing in attributes") - - return - - def _delete_uid(self): - """Delete any saved UUID file - ./config/_last_uuid.txt""" - file_name = os.path.join(SDIR_CONFIG, FILE_NAME_UUID) - if os.path.exists(file_name): - self.logger.debug("Delete {}".format(file_name)) - os.remove(file_name) - return - - def _read_uid_file(self): - """Read / load a saved UUID from file - ./config/_last_uuid.txt""" - file_name = os.path.join(SDIR_CONFIG, FILE_NAME_UUID) - if os.path.exists(file_name): - file_han = open(file_name, "r") - data = file_han.read().strip() - file_han.close() - self.logger.debug("Read {} saw {}.".format(file_name, data)) - return data - else: - self.logger.debug("Read {} failed - does not exist.".format( - file_name)) - - return None - - def _write_uid(self, data: str): - """Write / dump a saved UUID to file - ./config/_last_uuid.txt""" - assert isinstance(data, str) - - file_name = os.path.join(SDIR_CONFIG, FILE_NAME_UUID) - self.logger.debug("Write {} with {}".format(file_name, data)) - file_han = open(file_name, "w") - file_han.write(data) - file_han.close() - return - - def action_package(self): - """ - Build the actual package, copying to build - - :return int: value intended for sys.exit() - """ - import tools.make_load_settings - import cp_lib.load_settings_ini - from tools.module_dependency import BuildDependencyList - from tools.make_package_ini import make_package_ini - from tools.package_application import package_application - - if self.attrib["name"] == DEF_DUMMY_NAME: - self.logger.error("Cannot build - no app_path given") - sys.exit(-1) - - self.logger.info("Building Package({0}) in dir({1}))".format( - self.attrib["name"], self.attrib["path"])) - - # confirm PATH exists! - if not os.path.isdir(self.attrib["path"]): - raise FileNotFoundError( - "Cannot build - app_path({}) is invalid".format( - self.attrib["path"])) - - # does nothing - just create so we can add files to it - dep_list = BuildDependencyList() - dep_list.ignore_pip = self.ignore_pip - dep_list.logger = self.logger - - # confirm ./build exists and is not a file - dst_file_name = SDIR_BUILD - self.logger.debug("Confirm ./{} exists and is empty".format( - dst_file_name)) - if os.path.isdir(dst_file_name): - try: - shutil.rmtree(dst_file_name, ignore_errors=True) - except OSError: - self.logger.error( - "Could not delete OLD ./" + - "{} - have you open files there?".format(dst_file_name)) - raise - - # confirm .build/{app_name} exists - dst_file_name = self.get_build_path() - self.logger.debug("Confirm ./{} exists".format(dst_file_name)) - self._confirm_dir_exists(dst_file_name, "BUILD dir") - - # start with the SETTINGS: - # make sure has [application] section, plus "uuid" and "version" - self.logger.info("Confirm App INI has required UUID and Version") - tools.make_load_settings.validate_project_settings( - self.get_app_path(), self.increment_version) - - # ./config/settings.ini then {app_path}/settings.ini - # (again, as UUID might have changed) - self.settings = tools.make_load_settings.load_settings( - self.get_app_path()) - - # save as ./build/{project}/settings.json - dst_file_name = os.path.join( - self.get_build_path(), - cp_lib.load_settings_ini.DEF_SETTINGS_FILE_NAME + - cp_lib.load_settings_ini.DEF_JSON_EXT) - cp_lib.load_settings_ini.save_root_settings_json(self.settings, - dst_file_name) - - # exclude the APP ini and json - save_root_settings_json() made - # a combined copy - app_file_name = os.path.join( - self.app_path, - cp_lib.load_settings_ini.DEF_SETTINGS_FILE_NAME + - cp_lib.load_settings_ini.DEF_INI_EXT) - self._exclude.append(app_file_name) - app_file_name = os.path.join( - self.app_path, - cp_lib.load_settings_ini.DEF_SETTINGS_FILE_NAME + - cp_lib.load_settings_ini.DEF_JSON_EXT) - self._exclude.append(app_file_name) - - # do/copy over the SH files to BUILD, these have no dependencies - self.create_install_sh() - self.create_start_sh() - - # this will create a simple Windows batch file - self.create_go_bat() - - # handle the main.py - # GLOBAL = ./config/main.py - glob_file_name = os.path.join(SDIR_CONFIG, self.get_main_file_name()) - # APP = ./{app_project}/main.py - app_file_name = os.path.join(self.get_app_path(), - self.get_main_file_name()) - # DST = ./build/{app_name}/main.py - dst_file_name = os.path.join(self.get_build_path(), - self.get_main_file_name()) - - if os.path.exists(app_file_name): - # if app developer supplies one, use it (TDB - do pre-processing) - # for example, copy "network/tcp_echo/main.py" to "build/main.py" - self.logger.info("Copy existing APP MAIN from [{}]".format( - app_file_name)) - copy_file_nl(app_file_name, dst_file_name) - # sh util.copyfile(app_file_name, dst_file_name) - # make sure we add any required files from cp_lib - dep_list.add_file_dependency(app_file_name) - - # we exclude it as "app_dir/main.py", because it will be - # in archive as ./main.py! - self.logger.debug("Add file [{}] to exclude list".format( - app_file_name)) - self._exclude.append(app_file_name) - - elif os.path.exists(glob_file_name): - # if root supplies one, use it (TDB - do pre-processing) - self.logger.info("Copy existing ROOT MAIN from [{}]".format( - glob_file_name)) - copy_file_nl(glob_file_name, dst_file_name) - # sh util.copyfile(glob_file_name, dst_file_name) - - # make sure we add any required files from cp_lib - dep_list.add_file_dependency(glob_file_name) - - else: - raise ValueError("\'main\' script is missing!") - - # sys.exit(-99) - - # all will use this? - # file_name = os.path.join("cp_lib", "app_base.py") - # dep_list.add_file_dependency(file_name) - # - # dep_list.add_if_new("cp_lib.__init__") - - # make a list of files in app_dir, copy them to BUILD, - # plus collect dependency list - file_list = os.listdir(self.get_app_path()) - dst_path_name = os.path.join(self.get_build_path(), - self.get_app_path()) - self._confirm_dir_exists(dst_path_name, "Project Directory") - - for file_name in file_list: - - if file_name[0] == SKIP_PREFACE_CHARACTER: - # if file starts with '.', skip - - # set SKIP_PREFACE_CHARACTER == None to skip this - self.logger.debug("skip due to SKIP preface:{}".format( - file_name)) - continue - - path_name = os.path.join(self.get_app_path(), file_name) - - if os.path.isdir(path_name): - # handle any sub-directories (TBD) - - if file_name in ("__pycache__", "test"): - self.logger.debug("skip sdir:[{}]".format(path_name)) - pass - - else: # TODO - recurse into it - self.logger.debug("see app sdir:[{}]".format(path_name)) - - elif os.path.isfile(path_name): - # handle any files - # self.logger.debug("see app file:[{}]".format(path_name)) - if path_name in self._exclude: - self.logger.debug("skip file:[{}]".format(path_name)) +import configparser - else: - # make sure we add any required files from cp_lib - dep_list.add_file_dependency(path_name) - dst_file_name = os.path.join( - self.get_build_path(), - self.get_app_path(), file_name) +# These will be set in init() by using the sdk_settings.ini file. +# They are used be various functions in the file. +g_app_name = '' +g_app_uuid = '' +g_dev_client_ip = '' +g_dev_client_username = '' +g_dev_client_password = '' +g_python_cmd = 'python3' # Default for Linux and OS X - # self.logger.debug("Make Dir [{0}]".format(dst_path_name)) - self._confirm_dir_exists(dst_path_name, "File to Build") - self.logger.debug("Copy file [{0}] to {1}".format( - path_name, dst_file_name)) - # note: copyfile requires 2 file names - 2nd cannot - # be a directory destination, we'll skip EMPTY files - copy_file_nl(path_name, dst_file_name, discard_empty=True) - # sh util.copyfile(path_name, dst_file_name) +# Returns an HTTPDigestAuth for the global username and password. +def get_digest(): + return requests.auth.HTTPDigestAuth(g_dev_client_username, g_dev_client_password) - # copy everything from app_dir to build - for source in dep_list.dep_list: - self.logger.info("Copy Over Dependency {0}".format(source)) - self.copy_dep_name_to_build(source) - # handle the package.ini - file_name = os.path.join(self.get_build_path(), "package.ini") - self.logger.debug("Make {}".format(file_name)) - make_package_ini(self.settings, file_name) +# Returns the app package name based on the global app name. +def get_app_pack(): + package_name = g_app_name + ".tar.gz" + return package_name - # propagate to MANIFEST.json - package_application(self.get_build_path(), pkey=None) - return 0 - - def copy_dep_name_to_build(self, source_file_name, fix_form=True): - """ - Given a file name from an import (like "cp_lib.cp_logging"), which - we assume is a .PY/python file, copy it to the build directory - - such as "build/cp_lib/cp_logging.py" - - :param str source_file_name: - :param bool fix_form: True if source is like "cp_lib.cp_logging", - False to treat as final - :return: - """ - assert isinstance(source_file_name, str) - if fix_form: - # convert "cp_lib.cp_logging" to "cp_lib/cp_logging.py" - if source_file_name.endswith(".py"): - # assume is already okay - pass - # TODO - fix this! How? - elif source_file_name.endswith(".ico"): - # assume is already okay - pass - elif source_file_name.endswith(".jpg"): - # assume is already okay - pass - elif source_file_name.endswith(".md"): - # assume is already okay - return - elif source_file_name.endswith(".ini"): - # assume is already okay - return - else: - source_file_name = source_file_name.replace( - '.', self.DEF_SEP) + ".py" - - # make up the destination as "build/cp_lib/cp_logging.py" - build_file_name = os.path.join(self.get_build_path(), source_file_name) - - # breaks into ["build/cp_lib", "cp_logging.py"], make sure it exists - path_name = os.path.split(build_file_name) - self._confirm_dir_exists(path_name[0], "Dep 2 Build") - - self.logger.debug("Copy file [{0}] to {1}".format(source_file_name, - build_file_name)) - # copyfile requires 2 file names - 2nd cannot be a directory dest - copy_file_nl(source_file_name, build_file_name, discard_empty=True) - # sh util.copyfile(source_file_name, build_file_name) - - return - - def action_get_uuid_from_router(self): - """ - Issue the STATUS, to check the UUID installed - - When at least one APP is installed, return is like this: - {'summary': 'Service started', 'service': 'started', - 'mode': 'devmode', 'apps': [ - {'_id_': '8f828277-5e8f-4c90-9b99-a3eb61f3', - 'app': { - 'uuid': '8f828277-5e8f-4c90-9b99-a3eb61f3', - 'vendor': 'customer', - 'version_minor': 2, 'restart': True, 'version_major': 1, - 'name': 'probe_gps', - 'date': '2016-03-21T22:46:39Z'}, - 'summary': 'Started application', 'state': 'started'}]} - - When no APP is installed, return is like this: - {'summary': 'Service started', 'service': 'started', - 'mode': 'devmode', 'apps': []} - - :return int: value intended for sys.exit() - """ - self._last_uuid = None - self.logger.info("Checking SDK status on router({})".format( - self.get_router_ip())) - - # quietly get the STATUS into, will be saved as self.last_status - self.action_status(verbose=False) - - if 'apps' not in self.last_status: - self.logger.error( - "SDK get UUID failed - missing \'apps\' key in response.") - return EXIT_CODE_BAD_FORM - - if len(self.last_status['apps']) == 0: - self.logger.error( - "SDK get UUID failed - [\'apps\'] data is empty.") - return EXIT_CODE_NO_APPS - - reply = self.last_status['apps'] - """ :type reply: list """ - assert isinstance(reply, list) - - # for now, we only allow 1 SDK app, so take index[0] - if '_id_' in reply[0]: - self._last_uuid = reply[0]['_id_'] - self.logger.info("Router has UUID:{} installed".format( - self._last_uuid)) - - if self._last_uuid is None: - self.logger.error("SDK failed to get UUID from router.") - return EXIT_CODE_BAD_ACTION +# Gets data from the router config store +def get(config_tree): + router_api = 'http://{}/api/{}'.format(g_dev_client_ip, config_tree) - return 0 + try: + response = requests.get(router_api, auth=get_digest()) - def action_status(self, verbose=True): - """ - Go to our router and check SDK status + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(g_dev_client_ip)) + return None - :param bool verbose: T to see response via logging, - F to merely 'test status' - :return int: value intended for sys.exit() - """ - from cp_lib.status_tree_data import string_list_status_apps + return json.dumps(json.loads(response.text), indent=4) - self.logger.info("Checking SDK status on router({})".format( - self.get_router_ip())) - # we save as 'last_status', as a few clients use as as proxy - self.last_status = self.cs_client.get("status/system/sdk") - if self.last_status is None: - raise CradlepointSdkDisabled("Router lacks SDK Function") +# Puts an SDK action in the router config store +def put(value): + try: + response = requests.put("http://{}/api/control/system/sdk/action".format(g_dev_client_ip), + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=get_digest(), + data={"data": '"{} {}"'.format(value, get_app_uuid())}) - self.logger.info("SDK status check successful") - # self.logger.debug("RSP:{}".format(reply['data'])) - # {'service': 'started', 'apps': [], 'mode': 'devmode', - # 'summary': 'Service started'} + print('status_code: {}'.format(response.status_code)) - if self.last_status is None: - self.logger.info("SDK is not enabled in the Router.") + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(g_dev_client_ip)) + return None + return json.dumps(json.loads(response.text), indent=4) + + +# Cleans the SDK directory for a given app by removing files created during packaging. +def clean(): + print("Cleaning {}".format(g_app_name)) + try: + app_pack_name = get_app_pack() + if os.path.isfile(app_pack_name): + os.remove(app_pack_name) + except OSError: + print('Clean Error 1 for file {}: {}'.format(app_pack_name, OSError.strerror())) + + try: + meta_dir = '{}/{}/METADATA'.format(os.getcwd(), g_app_name) + if os.path.isdir(meta_dir): + shutil.rmtree(meta_dir) + except OSError: + print('Clean Error 2 for directory {}: {}'.format(meta_dir, OSError.strerror())) + + try: + build_file = os.path.join(os.getcwd(), '.build') + if os.path.isfile(build_file): + os.remove(build_file) + except OSError: + print('Clean Error 3 for file {}: {}'.format(build_file, OSError.strerror())) + + +# Build, just validates, the application code and package. +def build(): + print("Building {}".format(g_app_name)) + success = True + validate_script_path = os.path.join('tools', 'bin', 'validate_application.py') + app_path = os.path.join(g_app_name) + try: + if sys.platform == 'win32': + subprocess.check_output('{} {} {}'.format(g_python_cmd, validate_script_path, app_path)) else: - self.logger.info("SDK status check successful") - - if verbose: - # then put out all of the logging info, else don't - result = self._string_list_status_basic(self.last_status) - for line in result: - self.logger.info(line) - - if 'apps' in self.last_status and \ - (len(self.last_status['apps']) > 0): - _index = 0 - for one_app in self.last_status['apps']: - result = string_list_status_apps(_index, one_app) - for line in result: - self.logger.info(line) - _index += 1 - else: - self.logger.info("SDK App Count:0") + subprocess.check_output('{} {} {}'.format(g_python_cmd, validate_script_path, app_path), shell=True) + + except subprocess.CalledProcessError as err: + print('Error building {}: {}'.format(g_app_name, err)) + success = False + finally: + return success + + +# Package the app files into a tar.gz archive. +def package(): + success = True + print("Packaging {}".format(g_app_name)) + package_dir = os.path.join('tools', 'bin') + package_script_path = os.path.join('tools', 'bin', 'package_application.py') + app_path = os.path.join(g_app_name) + + try: + subprocess.check_output('{} {} {}'.format(g_python_cmd, package_script_path, app_path), shell=True) + except subprocess.CalledProcessError as err: + print('Error packaging {}: {}'.format(g_app_name, err)) + success = False + finally: + return success + + +# Get the SDK status from the router +def status(): + status_tree = '/status/system/sdk' + print('Get {} status for router at {}'.format(status_tree, g_dev_client_ip)) + response = get(status_tree) + print(response) + + +# Transfer the app app tar.gz package to the router +def install(): + app_archive = get_app_pack() + + # Use scp for Linux or OS X + cmd = 'scp {0} {1}@{2}:/app_upload'.format(app_archive, g_dev_client_username, g_dev_client_ip) + + # For Windows, use pscp.exe in the tools directory + if sys.platform == 'win32': + cmd = "./tools/bin/pscp.exe -pw {0} -v {1} {2}@{3}:/app_upload".format( + g_dev_client_password, app_archive, + g_dev_client_username, g_dev_client_ip) + + print('Installing {} in router {}.'.format(app_archive, g_dev_client_ip)) + try: + if sys.platform == 'win32': + subprocess.check_output(cmd) + else: + subprocess.check_output(cmd, shell=True) + except subprocess.CalledProcessError as err: + # There is always an error because the router will drop the connection. + # print('Error installing: {}'.format(err)) return 0 - @staticmethod - def _string_list_status_basic(status): - """ - Given STATUS return from Router, Make a list of strings to show - of basic things like: {'service': 'started', 'apps': [], - 'mode': 'devmode', 'summary': 'Service started'} - - This does NOT enumerate through the APPS list - - :param dict status: - :return list: - """ - result = [] - - if status is not None: - if 'service' in status: - result.append("SDK Service Status:{}".format( - status['service'])) - - if 'summary' in status: - result.append("SDK Summary:{}".format(status['summary'])) - - if 'mode' in status: - if status['mode'].lower() == "devmode": - result.append("SDK Router is in DEV MODE") - elif status['mode'].lower() == "standard": - result.append( - "SDK Router is NOT in DEV MODE - is in STANDARD mode.") - else: - result.append("SDK Router Dev Mode Unknown:{}".format( - status['mode'])) - - if 'apps' in status: - if len(status['apps']) == 0: - result.append("SDK - No Apps Installed") - else: - result.append("SDK App Count:{}".format( - len(status['apps']))) - - return result - - def action_install(self, file_name): - """ - SCP (copy/upload) the bundle to the router, which then installs - - :param str file_name: base file name to upload, without the ".tar.gz" - :return int: value intended for sys.exit() - """ - from cp_lib.app_name_parse import get_app_name - - self.logger.debug("file_name: {}".format(file_name)) - if file_name.startswith(DEF_DUMMY_NAME): - file_name = None - - # confirm we have BUILD directory; if not, assume no package was built - if not os.path.isdir(SDIR_BUILD): - self.logger.error( - "MAKE cannot install - no {} directory!".format(SDIR_BUILD)) - sys.exit(-11) - - result = self.action_status(verbose=False) - if result == EXIT_CODE_NO_DATA: - # then status failed - self.logger.error( - "MAKE cannot install - SDK appears to be disabled.") - return result - - elif result != 0: - # then status failed - self.logger.error( - "MAKE cannot install - SDK status check failed," + - "code={}".format(result)) - return result - - # try to guess package from ./build - # - find the tar.gz (such as tcp_echo.tar.gz) and deduce the name - if file_name is None: - self.logger.debug("No file given - search for one") - assert os.path.isdir(SDIR_BUILD) - result = os.listdir(SDIR_BUILD) - file_name = None - for name in result: - if name.endswith(".tar.gz"): - file_name = name[:-7] - # self.logger.debug("Split ({})".format(file_name)) - break - - if file_name is None: - sys.exit(-12) - - # we want to reduce to just the 'app name' - might be anything - # from path to file name: example, if network/tcp_echo/tcp_echo or - # network.tcp_echo, just want tcp_echo - file_name = get_app_name(file_name) - - # for now, just purge to remove any old files - # self.action_purge() - - # minor fix-up - if file_name ends with .py, strip that off - if file_name.endswith(".py"): - file_name = file_name[:-3] - - # file_name should be like "tcp-echo" - self.logger.debug("Install:({})".format(file_name)) - - # confirm we have BUILD/{name} directory - file_name = os.path.join(SDIR_BUILD, file_name + ".tar.gz") - if not os.path.isfile(file_name): - self.logger.error("MAKE cannot install - no {} archive!".format( - file_name)) - sys.exit(-13) - - if sys.platform == "win32": - self.logger.info( - "Upload & Install SDK on router({}) (win32)".format( - self.get_router_ip())) - - # Windows is happy with a single string ... but - cmd = "{0} -pw {1} -v {2} {3}@{4}:/app_upload".format( - WIN_SCP_NAME, self.get_router_password(), file_name, - self.get_router_user_name(), - self.get_router_ip()) - else: - self.logger.info( - "Upload & Install SDK on router({}) (else)".format( - self.get_router_ip())) - - # ... but Linux requires the list - if USE_SSH_PASS: - # we allow user to select to use or not - cmd = ["sshpass", "-p", self.get_router_password(), - DEF_SCP_NAME, file_name, "{0}@{1}:/app_upload".format( - self.get_router_user_name(), self.get_router_ip())] +# Start the app from the router +def start(): + print('Start application {} for router at {}'.format(g_app_name, g_dev_client_ip)) + print('Application UUID is {}.'.format(g_app_uuid)) + response = put('start') + print(response) + + +# Stop the app from the router +def stop(): + print('Stop application {} for router at {}'.format(g_app_name, g_dev_client_ip)) + print('Application UUID is {}.'.format(g_app_uuid)) + response = put('stop') + print(response) + + +# Uninstall the app from the router +def uninstall(): + print('Uninstall application {} for router at {}'.format(g_app_name, g_dev_client_ip)) + print('Application UUID is {}.'.format(g_app_uuid)) + response = put('uninstall') + print(response) + + +# Purge the app from the router +def purge(): + print('Purge application {} for router at {}'.format(g_app_name, g_dev_client_ip)) + print('Application UUID is {}.'.format(g_app_uuid)) + response = put('purge') + print(response) + + +# Prints the help information +def output_help(): + print('Command format is: {} make.py '.format(g_python_cmd)) + print('clean: Clean all project artifacts.\n') + print('build or package: Create the app archive tar.gz file.\n') + print('status: Fetch and print current app status from the locally connected router.\n') + print('install: Secure copy the app archive to a locally connected router.') + print(' The router must already be in SDK DEV mode via registration ') + print(' and licensing in ECM.\n') + print('start: Start the app on the locally connected router.\n') + print('stop: Stop the app on the locally connected router.\n') + print('uninstall: Uninstall the app from the locally connected router.\n') + print('purge: Purge all apps from the locally connected router.\n') + print('help: Print this help information.\n') + pass + + +# Get the uuid from application package.ini if not already set +def get_app_uuid(): + global g_app_uuid + + if g_app_uuid == '': + uuid_key = 'uuid' + app_config_file = os.path.join(g_app_name, 'package.ini') + config = configparser.ConfigParser() + config.read(app_config_file) + if g_app_name in config: + if uuid_key in config[g_app_name]: + g_app_uuid = config[g_app_name][uuid_key] + + if g_app_uuid == '': + # Create a UUID if it does not exist + _uuid = str(uuid.uuid4()) + config.set(g_app_name, uuid_key, _uuid) + with open(app_config_file, 'w') as configfile: + config.write(configfile) + print('INFO: The uuid did not exist in {}'.format(app_config_file)) + print('INFO: Created and saved uuid {} in {}'.format(_uuid, app_config_file)) else: - cmd = [DEF_SCP_NAME, file_name, "{0}@{1}:/app_upload".format( - self.get_router_user_name(), self.get_router_ip())] + print('ERROR: The uuid key does not exist in {}'.format(app_config_file)) + else: + print('ERROR: The APP_NAME section does not exist in {}'.format(app_config_file)) - try: - self.logger.debug("cmd:({})".format(cmd)) - result = subprocess.check_output(cmd) + return g_app_uuid - except subprocess.CalledProcessError as err: - # return subprocess.CalledProcessError.returncode - # <131>ERROR:make:res:(['probe_gps', 'probe_gps.tar', - # 'probe_gps.tar.gz']) - # TODO - handle the PSCP error more gracefully? - # self.logger.error("err:({})".format(err)) - return 0 +# Setup all the globals based on the OS and the sdk_settings.ini file. +def init(): + global g_python_cmd + global g_app_name + global g_dev_client_ip + global g_dev_client_username + global g_dev_client_password - self.logger.debug("res:({})".format(result)) + success = True - # save _last_uuid, so for start/stop/uninstall don't have to re-enter - if "application" in self.settings: - # then we have - if "uuid" in self.settings["application"]: - self._write_uid(self.settings["application"]["uuid"]) + # Keys in sdk_settings.ini + sdk_key = 'sdk' + app_key = 'app_name' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' - return 0 + if sys.platform == 'win32': + g_python_cmd = 'python' - def action_start(self, uuid=None): - """ - Go to our router and start the SDK - - :param str uuid: optional UUID as string, else use self.attrib - :return int: value intended for sys.exit() - """ - if uuid is None: - # if no UUID, then try to read the router - result = self.action_get_uuid_from_router() - if result not in (0, EXIT_CODE_NO_APPS): - # then the action failed - self.logger.error("SDK start failed - no SDK?") - return result - - # last_uuid was either set to a found value, or None - uuid = self._last_uuid - - if uuid is None: - self.logger.error( - "Start failed - UUID unknown, or nothing installed") - return EXIT_CODE_NO_APPS - - self.logger.info( - "Starting SDK on router({})".format(self.get_router_ip())) - put_data = '\"start {0}\"'.format(uuid) - result = self.cs_client.put("control/system/sdk/action", put_data) - if result.startswith("start"): - # then assume is okay - # - need to delay and do new status to really see if started - return 0 - - self.logger.info("Start Result:{}".format(result)) - return EXIT_CODE_BAD_ACTION - - def action_stop(self, uuid=None): - """ - Go to our router and stop the SDK - - :param str uuid: optional UUID as string, else use self.attrib - :return int: value intended for sys.exit() - """ - if uuid is None: - # if no UUID, then try to read the router - result = self.action_get_uuid_from_router() - if result not in (0, EXIT_CODE_NO_APPS): - # then the action failed - self.logger.error("SDK stop failed - no SDK?") - return result - - # last_uuid was either set to a found value, or None - uuid = self._last_uuid - - if uuid is None: - self.logger.error( - "Stop failed - UUID unknown, or nothing installed") - return EXIT_CODE_NO_APPS - - self.logger.info( - "Stopping SDK on router({})".format(self.get_router_ip())) - put_data = '\"stop {0}\"'.format(uuid) - result = self.cs_client.put("control/system/sdk/action", put_data) - if result.startswith("stop"): - # then assume is okay - # - need to delay and do new status to really see if started - return 0 - - self.logger.info("Stop Result:{}".format(result)) - return EXIT_CODE_BAD_ACTION - - def action_uninstall(self, uuid=None): - """ - Go to our router and uninstall ONE SDK instance - - :param str uuid: optional UUID as string, else use self.attrib - :return int: value intended for sys.exit() - """ - if uuid is None: - # if no UUID, then try to read the router - result = self.action_get_uuid_from_router() - if result not in (0, EXIT_CODE_NO_APPS): - # then the action failed - self.logger.error("SDK uninstall failed - no SDK?") - return result - - # last_uuid was either set to a found value, or None - uuid = self._last_uuid - - if uuid is None: - self.logger.error( - "Uninstalled failed - UUID unknown, or nothing installed") - return EXIT_CODE_NO_APPS - - self.logger.info( - "Uninstall SDK on router({})".format(self.get_router_ip())) - put_data = '\"uninstall {0}\"'.format(uuid) - result = self.cs_client.put("control/system/sdk/action", put_data) - if result.startswith("uninstall"): - # then assume is okay - # - need to delay and do new status to really see if started - - # make sure none remaining - self._delete_uid() - return 0 - - self.logger.info("Uninstall Result:{}".format(result)) - return EXIT_CODE_BAD_ACTION - - def action_purge(self): - """ - Go to our router and purge ALL SDK instances - - :return int: value intended for sys.exit() - """ - self.logger.info( - "Purging SDK on router({})".format(self.get_router_ip())) - put_data = '\"purge\"' - result = self.cs_client.put("control/system/sdk/action", put_data) - if result.startswith("purge"): - # then assume is okay - # - need to delay and do new status to really see if started - return 0 - - self.logger.info("Purge Result:{}".format(result)) - return EXIT_CODE_BAD_ACTION - - def action_reboot(self): - """ - Go to our router, and reboot it - - :return int: value intended for sys.exit() - """ - self.logger.info( - "Reboot our development router({})".format(self.get_router_ip())) - # put_data = '\"true\"' - put_data = 'true' - result = self.cs_client.put("control/system/reboot", put_data) - # result will be boolean? - if False: - # then assume is okay - # - need to delay and do new status to really see if started - self.logger.info("SDK reboot successful") - return 0 - - self.logger.info("Reboot Result:{}".format(result)) - return EXIT_CODE_BAD_ACTION - - def action_clean(self): - """ - Delete temp build files - - :return int: value intended for sys.exit() - """ - self.logger.info("Clean temporary build files") - - # clean out the BUILD files - path_name = SDIR_BUILD - if os.path.isdir(path_name): - self.logger.info("Delete BUILD directory") - shutil.rmtree(path_name, ignore_errors=True) - - path_name = os.getcwd() - # self.logger.info("Cleaning from directory {}".format(path_name)) - - # clean out the Python cache directories - del_list = [] - for path, dir_name, file_name in os.walk(path_name): - - # self.logger.debug("path:{0} dir:{1} fil:{2}".format( - # path, dir_name, file_name)) - - if path.startswith(path_name + os.sep + '.'): - # we'll skip everything like "./.idea" or any starting with '.' - # self.logger.debug("skip:{}".format(path)) - continue - - if path.endswith("__pycache__"): - # we'll want to delete this - # self.logger.debug("add to list:{}".format(path)) - del_list.append(path) - continue - - pass # try next one - - for path_name in del_list: - self.logger.info("Delete {} directory".format(path_name)) - shutil.rmtree(path_name, ignore_errors=True) - - for path_name in ("config/settings.json", "syslog1.txt"): - # delete a few known temporary files - if os.path.isfile(path_name): - self.logger.info("Delete FILE {}".format(path_name)) - os.remove(path_name) - - # sometimes, we end up with .pyc in /tools? - for path_name in ("tools", "test"): - del_list = os.listdir(path_name) - for file_name in del_list: - if file_name.endswith(".pyc"): - self.logger.info("Delete FILE {}".format(file_name)) - os.remove(file_name) - if file_name.endswith(".pyo"): - self.logger.info("Delete FILE {}".format(file_name)) - os.remove(file_name) + elif sys.platform == 'Darwin': + # This will exclude the '._' files in the + # tar.gz package for OS X. + os.environ["COPYFILE_DISABLE"] = "1" - return 0 + settings_file = os.path.join(os.getcwd(), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) - def action_ping(self, ip_address): - """ - Go to our router, and try to ping remotely - - :param str ip_address: the IP to pin - :return int: value intended for sys.exit() - """ - # TODO - if ip_address IS our router, do ping from PC? - - self.logger.info("Send a PING to {} from router({})".format( - ip_address, self.get_router_ip())) - - result = cs_ping(self, ip_address) - if result['status'] == "success": - return 0 - return EXIT_CODE_BAD_ACTION - - def _copy_a_file(self, file_name): - """ - Copy the file over, using logic: - 1) if {app_path}/{file_name} exists, use that - 2) else is {config}/{file_name} exists, use that - 3) else return False - - :param str file_name: the file to handle - :rtype: None - """ - - app_file_name = os.path.join(self.get_app_path(), file_name) - cfg_file_name = os.path.join(SDIR_CONFIG, file_name) - dst_file_name = os.path.join(self.get_build_path(), file_name) - - if os.path.exists(app_file_name): - # if app developer supplies one, use it (TDB - do pre-processing) - self.logger.debug("Copy existing app script from [{}]".format( - app_file_name)) - copy_file_nl(app_file_name, dst_file_name) - # sh util.copyfile(app_file_name, dst_file_name) - self.logger.debug("Add file [{}] to exclude list".format( - app_file_name)) - self._exclude.append(app_file_name) - - elif os.path.exists(cfg_file_name): - # if root supplies one, use it (TDB - do pre-processing) - self.logger.debug("Copy existing root script from [{}]".format( - cfg_file_name)) - copy_file_nl(cfg_file_name, dst_file_name) - # sh util.copyfile(cfg_file_name, dst_file_name) + # Initialize the globals based on the sdk_settings.ini contents. + if sdk_key in config: + if app_key in config[sdk_key]: + g_app_name = config[sdk_key][app_key] + else: + success = False + print('ERROR 1: The {} key does not exist in {}'.format(app_key, settings_file)) + if ip_key in config[sdk_key]: + g_dev_client_ip = config[sdk_key][ip_key] else: - return False - - return True - - def create_install_sh(self, file_name=None): - """ - Create the install.sh in BUILD, using logic: - 1) if {app_path}/install.sh exists, use that - 2) else is {config}/install.sh exists, use that - 3) else make a basic default - - Final name will be in build/install.sh - - :param str file_name: an alternative name for safe regression testing - :rtype: None - """ - self.logger.info("Create INSTALL.SH script") - - if file_name is None: - file_name = FILE_NAME_INSTALL - - if not self._copy_a_file(file_name): - file_name = os.path.join(self.get_build_path(), file_name) - # self.logger.debug("create new {}".format(file_name)) - data = [ - '#!/bin/bash\n', - 'echo "INSTALLATION for {0}:" >> install.log\n'.format( - self.mod_name), - 'date >> install.log\n' - ] - file_han = open(file_name, 'wb') - for line in data: - # we don't want a Windows file, treat as binary ("wb" not "w") - file_han.write(line.encode()) - file_han.close() - - return - - def create_start_sh(self, file_name=None): - """ - Create the start.sh, or copy from config. - - Final name will be in router_app/start.sh - - :param str file_name: alternative name for safe regression testing - :rtype: None - """ - self.logger.info("Create START.SH script") - - if file_name is None: - file_name = FILE_NAME_START - - if not self._copy_a_file(file_name): - file_name = os.path.join(self.get_build_path(), file_name) - - # self.logger.debug("create new {}".format(file_name)) - data = [ - '#!/bin/bash\n', - 'cppython main.py %s\n' % self.mod_name - ] - file_han = open(file_name, 'wb') - for line in data: - # we don't want a Windows file, treat as binary ("wb" not "w") - file_han.write(line.encode()) - file_han.close() - - return - - def create_go_bat(self): - """ - Create a simple go.bat on Windows - """ - if sys.platform == "win32": - file_name = os.path.join(self.get_build_path(), "go.bat") - self.logger.info("Create {} script".format(file_name)) - data = 'python main.py %s' % self.mod_name - file_han = open(file_name, 'w') - file_han.write(data) - file_han.close() - - return - - def _confirm_dir_exists(self, dir_name, dir_msg=None): - """ - Confirm the directory exists, create if required. If the name - is blocked by a file of - the same name, then rename as {name}.save - - :param str dir_name: the relative directory name - :param str dir_msg: a message for errors, like "CONFIG dir" - :return: - """ - # confirm ./config exists and is not a file - if os.path.isfile(dir_name): - # rename as .save, then allow creation below - shutil.copyfile(dir_name, dir_name + self.SDIR_SAVE_EXT) - os.remove(dir_name) - - if not os.path.isdir(dir_name): - # if not there, make it! - self.logger.debug("{}({}) being created".format(dir_msg, dir_name)) - - # NOT working under windows! Add delay, seems to be race condition - # where adding immediately after delete fails as PermissionError! - try: - os.makedirs(dir_name) - except PermissionError: - time.sleep(1.0) - os.makedirs(dir_name) - - file_name = os.path.join(dir_name, "__init__.py") - self.logger.info("Create __init__.py") - file_han = open(file_name, 'w') - file_han.write(" ") - file_han.close() - - # else: - # self.logger.debug("{}({}) exists as dir".format( - # dir_msg, dir_name)) - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) + success = False + print('ERROR 2: The {} key does not exist in {}'.format(ip_key, settings_file)) + if username_key in config[sdk_key]: + g_dev_client_username = config[sdk_key][username_key] else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - def dump_help(self, args): - """ - - :param list args: the command name - :return: - """ - print("Syntax:") - print(' {} -m '.format(args[0])) - print() - print(" Default action = {}".format(self.ACTION_DEFAULT)) - for command in self.ACTION_NAMES: - print() - print("- action={0}".format(command)) - print(" {0}".format(self.ACTION_HELP[command])) - - return + success = False + print('ERROR 3: The {} key does not exist in {}'.format(username_key, settings_file)) -if __name__ == "__main__": + if password_key in config[sdk_key]: + g_dev_client_password = config[sdk_key][password_key] + else: + success = False + print('ERROR 4: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + success = False + print('ERROR 5: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + # This will also create a UUID if needed. + get_app_uuid() - maker = TheMaker() + return success - # Use below for debug testing - # sys.argv = ['-v', '-m', 'build', 'simple.hello_world'] - # sys.argv = ['-v', '-m', 'status'] +if __name__ == "__main__": + + # Default is no arguments given. if len(sys.argv) < 2: - maker.dump_help(sys.argv) - sys.exit(-1) + output_help() + sys.exit(0) - # if cmdline is only "make", then run as "make build" but we'll - # expect ["name"] in global sets + utility_name = str(sys.argv[1]).lower() - # save this, just in case we care later - utility_name = sys.argv[0] + if not init(): + sys.exit(0) - index = 1 - while index < len(sys.argv): - # loop through an process the parameters + if utility_name == 'clean': + clean() - if sys.argv[index] in ('-m', '-M'): - # then what follows is the mode/action - action = sys.argv[index + 1].lower() - if action in maker.ACTION_NAMES: - # then it is indeed an action - maker.action = action - index += 1 # need an extra ++ as -m includes 2 params + elif utility_name == 'build': + # build() + package() - elif sys.argv[index] in ('-i', '-I', '+i', '+I'): - # then we'll want the [app][version] incremented in the system.ini - maker.increment_version = True + elif utility_name == 'package': + package() - elif sys.argv[index] in ('-p', '-P'): - # then we'll ignore some PIP dependencies, as we're running - # on PC only - maker.ignore_pip = True + elif utility_name == 'status': + status() - elif sys.argv[index] in ('-v', '-V', '+v', '+V'): - # switch the logger to DEBUG from INFO - maker.verbose = True + elif utility_name == 'install': + install() - else: - # assume this is the app path - maker.app_path = sys.argv[index] + elif utility_name == 'start': + start() - index += 1 # get to next setting + elif utility_name == 'stop': + stop() - if maker.verbose: - logging.basicConfig(level=logging.DEBUG) - maker.logger.setLevel(level=logging.DEBUG) + elif utility_name == 'uninstall': + uninstall() - else: - logging.basicConfig(level=logging.INFO) - maker.logger.setLevel(level=logging.INFO) - # quiet INFO messages from requests module, - # "requests.packages.urllib3.connection pool" - logging.getLogger('requests').setLevel(logging.WARNING) + elif utility_name == 'purge': + purge() - _result = maker.main() - if _result != 0: - logging.error("return is {}".format(_result)) + else: + output_help() - sys.exit(_result) + sys.exit(0) diff --git a/serial_port/modbus_poll/crc16.py b/modbus_poll/crc16.py similarity index 100% rename from serial_port/modbus_poll/crc16.py rename to modbus_poll/crc16.py diff --git a/modbus_poll/cs.py b/modbus_poll/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/modbus_poll/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/modbus_poll/install.sh b/modbus_poll/install.sh new file mode 100644 index 00000000..315f4592 --- /dev/null +++ b/modbus_poll/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION modbus_poll on:" >> install.log +date >> install.log diff --git a/modbus_poll/modbus_poll.py b/modbus_poll/modbus_poll.py new file mode 100644 index 00000000..123518d6 --- /dev/null +++ b/modbus_poll/modbus_poll.py @@ -0,0 +1,166 @@ +""" +Poll a single range of Modbus registers from an attached serial +Modbus/RTU PLC or slave device. The poll is repeated, in a loop. +The only output you'll see if via Syslog. + +If you need such a device, do an internet search for "modbus simulator', as +there are many available for free or low (shareware) cost. These run on a +computer, serving up data by direct or USB serial port. + +* port_name=???, define the serial port to use. Commonly this will be +/dev/ttyS1 or /dev/ttyUSB0 + +* baud_rate=9600, allows you to define a different baud rate. This sample +assumes the other settings are fixed at: bytesize=8, parity='N', stopbits=1, +and all flow control (XonXOff and HW) is off/disabled. +Edit the code if you need to change this. + +* register_start=0, the raw Modbus offset, so '0' and NOT 40001. +Permitted range is 0 to 65535 + +* register_count=4, the number of Holding Register to read. +The request function is fixed to 3, so read multiple holding registers. +The permitted count is 1 to 125 registers (16-bit words) + +* slave_address=1, the Modbus slave address, which must be in the range +from 1 to 255. Since Modbus/RTU is a multi-drop line, the slave +address is used to select 1 of many slaves. +For example, if a device is assigned the address 7, it will ignore all +requests with slave addresses other than 7. + +* poll_delay=15 sec, how often to repoll the device. A lone number (like 60) + is interpreted as seconds. However, it uses the CP library module + "parse_duration", so time tags such as 'sec', 'min, 'hr' can be used. +""" +import json +import serial +import time +import argparse +import parse_duration +import crc16 +import cs + + +APP_NAME = 'modbus_poll' + + +def run_router_app(): + # confirm we are running on an 900/950 or 1100/1150, result should be like "IBR1100LPE" + result = json.loads(cs.CSClient().get("status/product_info/product_name")) + if "IBR900" in result or "IBR950" in result or \ + "IBR1100" in result or "IBR1150" in result: + cs.CSClient().log(APP_NAME, "Product Model is good:{}".format(result)) + else: + cs.CSClient().log(APP_NAME, + "ERROR: Inappropriate Product:{} - aborting.".format(result)) + return -1 + + period = parse_duration.TimeDuration(5) + + port_name = "/dev/ttyS1" + baud_rate = 9600 + register_start = 0 + register_count = 1 + slave_address = 1 + poll_delay = period.get_seconds() + + # see if port is a digit? + if port_name[0].isdecimal(): + port_name = int(port_name) + + # a few validation tests + if not 0 <= register_start <= 0xFFFF: + raise ValueError("Modbus start address must be between 0 & 0xFFFF") + if not 1 <= register_count <= 125: + raise ValueError("Modbus count must be between 1 & 125") + if not 1 <= slave_address <= 255: + raise ValueError("Modbus address must be between 1 & 125") + if poll_delay < 1: + raise ValueError("Poll delay most be 1 second or longer") + + poll_delay = float(poll_delay) + + # make a fixed Modbus 4x register read/poll + poll = bytes([slave_address, 0x03, + (register_start & 0xFF00) >> 8, register_start & 0xFF, + (register_count & 0xFF00) >> 8, register_count & 0xFF]) + crc = crc16.calc_string(poll) + cs.CSClient().log(APP_NAME, "CRC = %04X" % crc) + poll += bytes([crc & 0xFF, (crc & 0xFF00) >> 8]) + + cs.CSClient().log(APP_NAME, + "Starting Modbus/RTU poll {0}, baud={1}".format(port_name, baud_rate)) + cs.CSClient().log(APP_NAME, + "Modbus/RTU request is {0}".format(poll)) + + try: + ser = serial.Serial(port_name, baudrate=baud_rate, bytesize=8, + parity='N', stopbits=1, timeout=0.25, + xonxoff=0, rtscts=0) + + except serial.SerialException: + cs.CSClient().log(APP_NAME, "ERROR: Open failed!") + raise + + try: + while True: + + cs.CSClient().log(APP_NAME, "Send poll") + ser.write(poll) + time.sleep(0.1) + + try: + response = ser.read(size=255) + except KeyboardInterrupt: + cs.CSClient().log(APP_NAME, + "WARNING: Keyboard Interrupt - asked to quit") + break + + if len(response): + cs.CSClient().log(APP_NAME, + "Modbus/RTU response is {0}".format(response)) + + else: + cs.CSClient().log(APP_NAME, + "ERROR: no Modbus/RTU response") + + try: + time.sleep(poll_delay) + except KeyboardInterrupt: + cs.CSClient().log(APP_NAME, + "WARNING: Keyboard Interrupt - asked to quit") + break + + finally: + ser.close() + + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + run_router_app() + + elif command == 'stop': + # Nothing on stop + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/modbus_poll/package.ini b/modbus_poll/package.ini new file mode 100644 index 00000000..f4fe73e2 --- /dev/null +++ b/modbus_poll/package.ini @@ -0,0 +1,11 @@ +[modbus_poll] +uuid=ca0a62bd-648e-4bbc-a915-5f67a477c82d +vendor=Cradlepoint +notes=Poll a Modbus/RTU register from a PLC/slave +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/cp_lib/parse_duration.py b/modbus_poll/parse_duration.py similarity index 100% rename from cp_lib/parse_duration.py rename to modbus_poll/parse_duration.py diff --git a/modbus_poll/start.sh b/modbus_poll/start.sh new file mode 100644 index 00000000..3907ce62 --- /dev/null +++ b/modbus_poll/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython modbus_poll.py start diff --git a/modbus_poll/stop.sh b/modbus_poll/stop.sh new file mode 100644 index 00000000..2fedb6cf --- /dev/null +++ b/modbus_poll/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython modbus_poll.py stop diff --git a/modbus_simple_bridge/__init__.py b/modbus_simple_bridge/__init__.py new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/modbus_simple_bridge/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modbus_simple_bridge/cp_lib/__init__.py b/modbus_simple_bridge/cp_lib/__init__.py new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/modbus_simple_bridge/cp_lib/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cp_lib/app_base.py b/modbus_simple_bridge/cp_lib/app_base.py similarity index 100% rename from cp_lib/app_base.py rename to modbus_simple_bridge/cp_lib/app_base.py diff --git a/cp_lib/app_name_parse.py b/modbus_simple_bridge/cp_lib/app_name_parse.py similarity index 100% rename from cp_lib/app_name_parse.py rename to modbus_simple_bridge/cp_lib/app_name_parse.py diff --git a/cp_lib/buffer_dump.py b/modbus_simple_bridge/cp_lib/buffer_dump.py similarity index 100% rename from cp_lib/buffer_dump.py rename to modbus_simple_bridge/cp_lib/buffer_dump.py diff --git a/cp_lib/cp_logging.py b/modbus_simple_bridge/cp_lib/cp_logging.py similarity index 100% rename from cp_lib/cp_logging.py rename to modbus_simple_bridge/cp_lib/cp_logging.py diff --git a/cp_lib/cs_client.py b/modbus_simple_bridge/cp_lib/cs_client.py similarity index 100% rename from cp_lib/cs_client.py rename to modbus_simple_bridge/cp_lib/cs_client.py diff --git a/cp_lib/cs_client_remote.py b/modbus_simple_bridge/cp_lib/cs_client_remote.py similarity index 100% rename from cp_lib/cs_client_remote.py rename to modbus_simple_bridge/cp_lib/cs_client_remote.py diff --git a/modbus_simple_bridge/cp_lib/data/__init__.py b/modbus_simple_bridge/cp_lib/data/__init__.py new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/modbus_simple_bridge/cp_lib/data/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cp_lib/data/data_tree.py b/modbus_simple_bridge/cp_lib/data/data_tree.py similarity index 100% rename from cp_lib/data/data_tree.py rename to modbus_simple_bridge/cp_lib/data/data_tree.py diff --git a/cp_lib/hw_status.py b/modbus_simple_bridge/cp_lib/hw_status.py similarity index 100% rename from cp_lib/hw_status.py rename to modbus_simple_bridge/cp_lib/hw_status.py diff --git a/cp_lib/load_firmware_info.py b/modbus_simple_bridge/cp_lib/load_firmware_info.py similarity index 100% rename from cp_lib/load_firmware_info.py rename to modbus_simple_bridge/cp_lib/load_firmware_info.py diff --git a/cp_lib/load_product_info.py b/modbus_simple_bridge/cp_lib/load_product_info.py similarity index 100% rename from cp_lib/load_product_info.py rename to modbus_simple_bridge/cp_lib/load_product_info.py diff --git a/cp_lib/load_settings_json.py b/modbus_simple_bridge/cp_lib/load_settings_json.py similarity index 100% rename from cp_lib/load_settings_json.py rename to modbus_simple_bridge/cp_lib/load_settings_json.py diff --git a/modbus_simple_bridge/cp_lib/modbus/__init__.py b/modbus_simple_bridge/cp_lib/modbus/__init__.py new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/modbus_simple_bridge/cp_lib/modbus/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cp_lib/modbus/modbus_asc.py b/modbus_simple_bridge/cp_lib/modbus/modbus_asc.py similarity index 100% rename from cp_lib/modbus/modbus_asc.py rename to modbus_simple_bridge/cp_lib/modbus/modbus_asc.py diff --git a/cp_lib/modbus/modbus_rtu.py b/modbus_simple_bridge/cp_lib/modbus/modbus_rtu.py similarity index 100% rename from cp_lib/modbus/modbus_rtu.py rename to modbus_simple_bridge/cp_lib/modbus/modbus_rtu.py diff --git a/cp_lib/modbus/modbus_tcp.py b/modbus_simple_bridge/cp_lib/modbus/modbus_tcp.py similarity index 100% rename from cp_lib/modbus/modbus_tcp.py rename to modbus_simple_bridge/cp_lib/modbus/modbus_tcp.py diff --git a/cp_lib/modbus/transaction.py b/modbus_simple_bridge/cp_lib/modbus/transaction.py similarity index 100% rename from cp_lib/modbus/transaction.py rename to modbus_simple_bridge/cp_lib/modbus/transaction.py diff --git a/cp_lib/modbus/transaction_modbus.py b/modbus_simple_bridge/cp_lib/modbus/transaction_modbus.py similarity index 100% rename from cp_lib/modbus/transaction_modbus.py rename to modbus_simple_bridge/cp_lib/modbus/transaction_modbus.py diff --git a/cp_lib/parse_data.py b/modbus_simple_bridge/cp_lib/parse_data.py similarity index 100% rename from cp_lib/parse_data.py rename to modbus_simple_bridge/cp_lib/parse_data.py diff --git a/modbus_simple_bridge/cp_lib/parse_duration.py b/modbus_simple_bridge/cp_lib/parse_duration.py new file mode 100644 index 00000000..c6eb0a71 --- /dev/null +++ b/modbus_simple_bridge/cp_lib/parse_duration.py @@ -0,0 +1,285 @@ +""" +Helper function to parse a time durations; use '3 hr' or '15 min' instead +of mind-bending settings such as 10800 and 900 seconds +""" + +from cp_lib.parse_data import parse_float, parse_integer + +__version__ = "1.0.0" + +# History: +# +# 1.0.0: 2015-Apr Lynn +# * initial rewrite +# + + +class TimeDuration(object): + """ + Helper class to process user settings such as "3 hr" or "5 min", rather + than demanding a setting like 900 sec + + It handles basically 2 classes of data: + 1) lone token must be a numeric in seconds, so 5 or " 5" means 5 seconds. + 2) time tag in the set ('sec', 'ms', 'min', 'hr', 'day', 'mon', 'yr') + decorates so "5 min" becomes 900 sec + + In addition, one can add a + or -, so "-5 min" means -900 seconds. This + can be used to trigger an even before the hour, such once an hour plus + "-5 min" means at minute = 55 of the hour. + + One can also decorate with UTC, Z, or GM. This rarely affects the seconds, + but can be used by callers to as example trigger something every 12 hours + based on UTC (or local). + + """ + + DURATION_SECOND = 0 + DURATION_MSEC = 1 + DURATION_MINUTE = 2 + DURATION_HOUR = 3 + DURATION_DAY = 4 + DURATION_MONTH = 5 + DURATION_YEAR = 6 + DURATION_NAME_LIST = ('sec', 'ms', 'min', 'hr', 'day', 'mon', 'yr') + DURATION_FROM_SECS = (1.0, 1000.0, 1/60.0, 1/3600.0, 1/86400.0, None, None) + DURATION_TO_SECS = (1.0, 0.001, 60.0, 3600.0, 86400.0, None, None) + + DURATION_TAG_TO_MSEC = { + DURATION_MSEC: 1, + DURATION_SECOND: 1000, + DURATION_MINUTE: 60000, + DURATION_HOUR: 3600000, + DURATION_DAY: 86400000, + # no Month or Year due to variable days-per-month and leap-years + # DURATION_MONTH: 0, + # DURATION_YEAR: 0 + } + + FORMAT_FLOAT = "%0.2f %s" + FORMAT_INT = "%d %s" + + def __init__(self, source=None): + self.period_code = self.DURATION_SECOND + self.period_value = 0 + self.seconds = None + self.utc = None + self.format = self.FORMAT_INT + + if source is not None: + self.parse_time_duration_to_seconds(source) + return + + def reset(self): + self.period_code = self.DURATION_SECOND + self.period_value = 0 + self.seconds = None + self.utc = None + self.format = self.FORMAT_INT + return + + def get_period_as_string(self): + """ + :return: return the formatted STRING of the period, such as "5 min" + :rtype: str + """ + # TODO - add the UTC support, and what about sign? + # print "period_value:%s type=%s" % (self.period_value, + # type(self.period_value)) + # print " period_code:%s type=%s" % (self.period_code, + # type(self.period_code)) + return self.format % (self.period_value, + self.DURATION_NAME_LIST[self.period_code]) + + def get_tag_as_string(self, tag=None): + """ + :return: return the simple STRING tag of the period, so + if DURATION_MINUTE, return "min" + :rtype: str + """ + if tag is None: + tag = self.period_code + + elif not isinstance(tag, int): + raise TypeError("Duration enum must be between 0 and 6") + + elif not (self.DURATION_SECOND <= tag <= self.DURATION_YEAR): + raise ValueError("Duration enum must be between 0 and 6") + + return self.DURATION_NAME_LIST[tag] + + def get_seconds(self): + """ + :return: return the seconds in thi period, or ValueError if no + seconds (such as for month or year) + :rtype: int or float + """ + if self.seconds is None: + raise ValueError("get_seconds() impossible for period:%s" % + self.get_tag_as_string()) + return self.seconds + + def parse_time_duration_to_seconds(self, source, delimiter=None): + """ + Parse a given time duration into a specified unit of measure. + + Supports integer, float, and string input. String input will be split + into a list and parsed if necessary. + + The in/out type must be in ['ms', 'sec', 'min', 'hr', 'day'] + 'mon' and 'year' NOT supported + + :param source: the source duration to be parsed, which might be 10, + or '10 min' or '10 min utc' + :type source: int, str, bytes + :param delimiter: allows using ',' or other tag delimiter. If None, + use space (' ') + :type delimiter: str or None + :return: seconds as float + :rtype: float + """ + + if isinstance(source, int) or isinstance(source, float): + # _tracer.info('is number, so just return SAME type') + self.period_code = self.DURATION_SECOND + self.period_value = source + self.seconds = source + return self.seconds + + if isinstance(source, bytes): + # make bytes into string + source = source.decode() + + # get rid of any leading/trailing spaces + source = source.strip().lower() + + # this should be one of three forms + # 1) "60" which is already seconds + # 2) "60 min", which is a number plus the time tag + # 3) "60 min utz", which adds a time-zone tag + if delimiter is None: + delimiter = ' ' + elements = source.split(delimiter) + + # see if LAST token is UTC decoration - this examines the LAST + # space-delimited token + self.utc = self._decode_utc_element(elements[-1]) + if self.utc: + # if True, pop off the last item in elements + elements.pop() + + self._decode_a_pair(elements) + + return self.seconds + + def _decode_a_pair(self, pair): + """ + Given a two-element list such as ['5', 'sec'] or (10, 'min'), with + the second element in the set: + ['ms', 'sec', 'min', 'hr', 'day', 'mon', 'yr']. + + :param pair: two-element list such as ['5', 'sec'] or (10, 'min') + :type pair: list + :return: adjusts 'self' if okay, else throws exception + :rtype: None + """ + if len(pair) < 1: + raise ValueError( + "_decode_a_pair() requires at least 1 element in list") + + if pair[0].find('.') >= 0: + # then is a float + self.period_value = parse_float(pair[0]) + self.format = self.FORMAT_FLOAT + else: + self.period_value = parse_integer(pair[0]) + self.format = self.FORMAT_INT + + if len(pair) > 1: + # obtain period code, like DURATION_SECOND or DURATION_HOUR + self.period_code = self.decode_time_tag(pair[1]) + else: + self.period_code = self.DURATION_SECOND + + # obtain the number, convert to seconds + if self.DURATION_TO_SECS[self.period_code] is None: + # for Month/Year, there are no 'seconds' + self.seconds = None + else: + # else calc seconds from 2 'period values' (10 minutes = 600 sec) + self.seconds = self.period_value * \ + self.DURATION_TO_SECS[self.period_code] + + # print "period_code:%s type=%s" % (self.period_code, + # type(self.period_code)) + return True + + @staticmethod + def _decode_utc_element(utc): + """ + Given a source string, such as '5 day' (etc), check for a + UTC/Z/Zulu/uct/gm tag (not case sensitive). + We assume the tag is the LAST space-delimited token in the string + + So these strings all return True: + * 'utc', 'min zulu', '2 hr utc', 'silly funny 5 crap utc' + + So these strings all return False: + * '', 'min', '2 hr', 'silly funny 5 crap' + + :param utc: string like "hour" or "utc" + :type utc: str + :return: True if UTC was indicated, else is False + :rtype: bool + """ + if isinstance(utc, str): + utc = utc.lower() + if utc.endswith('z'): + return True + if utc.endswith('utc'): + return True + if utc.endswith('gm'): + return True + if utc.endswith('uct'): + return True + if utc.endswith('zulu'): + return True + return False + + def decode_time_tag(self, source): + """ + :param source: source string + :type source: str + :return: int code for the period + :rtype: int + """ + if not isinstance(source, str): + raise TypeError("decode_time_tag(%s) requires STRING, not %s" % + (str(source), type(source))) + + # only check if we seem to have something + source = source.lower() + ' ' + source = source[:3] # first 3 char only + + if source == 'sec': # then sec, secs, second, seconds + return self.DURATION_SECOND + + elif source == 'min': # then min, mins, minute, minutes + return self.DURATION_MINUTE + + elif source in ('hr ', 'hrs', 'hou'): # then hr, hrs, hour, hours + return self.DURATION_HOUR + + elif source in ('dy ', 'dys', 'day'): # then d, dy, dys, day, days + return self.DURATION_DAY + + elif source in ('mse', 'ms ', 'mil'): # then ms, msec, millis... + return self.DURATION_MSEC + + elif source in ('mn ', 'mon'): # then special for Month + return self.DURATION_MONTH + + elif source in ('yr ', 'yea'): # then special for YEAR + return self.DURATION_YEAR + + raise ValueError('decode_time_tag(%s) unknown string source' % source) diff --git a/cp_lib/probe_serial.py b/modbus_simple_bridge/cp_lib/probe_serial.py similarity index 100% rename from cp_lib/probe_serial.py rename to modbus_simple_bridge/cp_lib/probe_serial.py diff --git a/cp_lib/split_version.py b/modbus_simple_bridge/cp_lib/split_version.py similarity index 100% rename from cp_lib/split_version.py rename to modbus_simple_bridge/cp_lib/split_version.py diff --git a/cp_lib/unquote_string.py b/modbus_simple_bridge/cp_lib/unquote_string.py similarity index 100% rename from cp_lib/unquote_string.py rename to modbus_simple_bridge/cp_lib/unquote_string.py diff --git a/modbus_simple_bridge/go.bat b/modbus_simple_bridge/go.bat new file mode 100644 index 00000000..3bbd39eb --- /dev/null +++ b/modbus_simple_bridge/go.bat @@ -0,0 +1 @@ +python main.py serial_port.modbus_simple_bridge \ No newline at end of file diff --git a/modbus_simple_bridge/install.sh b/modbus_simple_bridge/install.sh new file mode 100644 index 00000000..65a95cd5 --- /dev/null +++ b/modbus_simple_bridge/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION for serial_port.modbus_simple_bridge:" >> install.log +date >> install.log diff --git a/config/main.py b/modbus_simple_bridge/main.py similarity index 100% rename from config/main.py rename to modbus_simple_bridge/main.py diff --git a/modbus_simple_bridge/package.ini b/modbus_simple_bridge/package.ini new file mode 100644 index 00000000..0c7a6bd6 --- /dev/null +++ b/modbus_simple_bridge/package.ini @@ -0,0 +1,12 @@ +[modbus_simple_bridge] +uuid=07c01e6b-b080-43e8-9576-ca43e1b8e036 +vendor=Sample Code, Inc. +notes=Simple 1-thread Modbus/TCP to RTU bridge +restart=true +reboot=true +auto_start=true +firmware_major=6 +firmware_minor=1 +version_major=1 +version_minor=27 +version_patch=0 diff --git a/serial_port/modbus_simple_bridge/README.md b/modbus_simple_bridge/serial_port/modbus_simple_bridge/README.md similarity index 100% rename from serial_port/modbus_simple_bridge/README.md rename to modbus_simple_bridge/serial_port/modbus_simple_bridge/README.md diff --git a/serial_port/modbus_simple_bridge/__init__.py b/modbus_simple_bridge/serial_port/modbus_simple_bridge/__init__.py similarity index 100% rename from serial_port/modbus_simple_bridge/__init__.py rename to modbus_simple_bridge/serial_port/modbus_simple_bridge/__init__.py diff --git a/serial_port/modbus_simple_bridge/modbus_tcp_bridge.py b/modbus_simple_bridge/serial_port/modbus_simple_bridge/modbus_tcp_bridge.py similarity index 100% rename from serial_port/modbus_simple_bridge/modbus_tcp_bridge.py rename to modbus_simple_bridge/serial_port/modbus_simple_bridge/modbus_tcp_bridge.py diff --git a/modbus_simple_bridge/settings.json b/modbus_simple_bridge/settings.json new file mode 100644 index 00000000..ad5def62 --- /dev/null +++ b/modbus_simple_bridge/settings.json @@ -0,0 +1,42 @@ +{ + "application": { + "_comment": "Settings for the application being built.", + "auto_start": "true", + "description": "Simple 1-thread Modbus/TCP to RTU bridge", + "firmware": "6.1", + "name": "modbus_simple_bridge", + "path": "serial_port/modbus_simple_bridge", + "reboot": "true", + "restart": "true", + "uuid": "07c01e6b-b080-43e8-9576-ca43e1b8e036", + "vendor": "Sample Code, Inc.", + "version": "1.27" + }, + "logging": { + "_comment": "Settings for the application debug/syslog/logging function.", + "level": "debug", + "pc_syslog": "false", + "syslog_ip": "/dev/log" + }, + "modbus_ip": { + "host_port": "8502", + "idle_timeout": "30 sec" + }, + "modbus_serial": { + "baud_rate": "9600", + "parity": "N", + "port_name": "/dev/ttyS1" + }, + "router_api": { + "_comment": "Settings to allow accessing router API in development mode.", + "local_ip": "192.168.0.1", + "password": "44224267", + "user_name": "admin" + }, + "startup": { + "boot_delay_for_time": "True", + "boot_delay_for_wan": "True", + "boot_delay_max": "5 min", + "exit_delay": "15 sec" + } +} \ No newline at end of file diff --git a/modbus_simple_bridge/start.sh b/modbus_simple_bridge/start.sh new file mode 100644 index 00000000..66efee34 --- /dev/null +++ b/modbus_simple_bridge/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython main.py serial_port.modbus_simple_bridge diff --git a/network/README.md b/network/README.md deleted file mode 100644 index dc358ef4..00000000 --- a/network/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Router App/SDK sample applications. - -Remember - for any network 'server' application, you will need to go into -the router's Zone Firewall configuration and enable the appropriate traffic -to reach your router. By default, all incoming client packets will be -discarded. - -## Directory simple\_web - -A very basic web server - a "Hello World" by web, -using the standard Python 3 "http.server" module. - -_Note: requires Router Zone Firewall Changes_ - -## Directory digit\_web - -A more complex basic web server, using the standard Python 3 "http.server" -module. It returns a slightly dynamic page of 5 'digit' images, representing -a 'counter'. In the sample, the digits are fixed at "00310", but a richer -design could allow new numbers to be used. - -_Note: requires Router Zone Firewall Changes_ - -## Directory send\_ping - -Uses the router API 'control' tree to issue a raw Ethernet ping. - -## Directory send\_email - -Sends a fixed email to gmail.com, using TTL/SSL. If you don't have a gmail -account, you can set up a free one. It can also send to other SMTP servers, -but you may need to change the way the SSL works, TCP ports used, etc. - -## Directory tcp\_echo - -binds on a TCP port, returning (echoing) any data received. - -_Note: requires Router Zone Firewall Changes_ diff --git a/network/digit_web/README.md b/network/digit_web/README.md deleted file mode 100644 index 58a3c520..00000000 --- a/network/digit_web/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# directory: ./network/digit_web -## Router App/SDK sample applications - -A more complex basic web server, using the standard Python 3 "http.server" -module. It returns a slightly dynamic page of 5 'digit' images, representing -a 'counter'. In the sample, the digits are fixed at "00310", but a richer -design could allow new numbers to be used. - -More importantly, the fact we have images on the text page means any -one client request results in up to 6 requests - the first returns the -text page with the 5 images, and then up to 5 more are submitted to -fetch the images. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: web_server.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [web_server]: - -* host_port=9001, define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. -Also, avoid 8001 or 8080, as router may be using already. - -## Web Page is K.I.S.S. (Keep-It-Simple-Stupid) - -Obviously could make the web page was complex as desired - using Javascript -to auto-refresh, and so on. - - - - - - The Count Is - - - - - - - - - - -
- - diff --git a/network/digit_web/__init__.py b/network/digit_web/__init__.py deleted file mode 100644 index 948f8526..00000000 --- a/network/digit_web/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from network.digit_web.web_server import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/network/digit_web/favicon.ico b/network/digit_web/favicon.ico deleted file mode 100644 index 871f85551aaea0ba8674d6b206e5c568f97be970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5694 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 F{|*eo>4E?N diff --git a/network/digit_web/sdigit_0.jpg b/network/digit_web/sdigit_0.jpg deleted file mode 100644 index 8ce2365f204cee25b93c425e746ddfe2bc2ba282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28254 zcmb5V1#}#}@-H}MW~P{#nVDl|W@cuJF^-v;8DnNDF|Qs!CPWrJqVYpT9o00mxq^q$L0#z(NZ`3jlns14IGfU|@eMus}e7LqNenK|w-7 zA;Q8!!yzN0pdce6BcY<>Vxpp9qah(<5@KQF;SmrJpkNY_5aN^I;uGNiB?1Bg0RaUG zg#ZPGfRBodivRz+eD(uSph0{A-C!Un08kVVFcgr_K>$7g00IFN7Vw_}0RRO9hlB!w z2HwR50e<=Kn*ab92q-uN8Bg z@o~u4Kv|**Epdu)h(K@~{6WO_St8-NI@jl%ORcypN|;^<&4W{c>=Ct+Ic7PLmM>OM z60FRpwM%&VOGq@Ud&e%-or}=Ou338W4lU_r`W$n%sCI$uO(Stq}3mxlm^~k3CHhX z*an^bo^|A`yz^?~*YPBDLGhu1(P+CTRB8K|cA+;gHjT8uy`17la5sTl`OQ65pXqzl zBII#!je?q@W`(4eW4(o(6Vm6lI>06um3u6 zd`!&8nC}~^`xJhNk0v(6Qo^v*uIq92=5IlCe${u`->@;|YIMIFvnWij)i6`an-5{s zBX(!PG~vQOHHaQ`+?~B82gM5`c25RUHRT=qf)>%iQ+_w2L!TAPEXS3txtCmE7J2S+ zGIK1k%DllONx0g>T=PXBwLuSgRX=2od9;K8C#{Zc-9^8W9#jI)vqj`_f}iB~?7NuDFn>%V@47YT zA+skmQTA|0tio=WO1hSWdpxc5n?fu_68Om;IH`UYjS1qmhd>X(M(#K8MPL3M2X zD*voGEr0MO^J<2f@`X<TWm%{rdL z9wnE2Go8C2shb(9z4&o<>sQ$`suzm$8qKdZp5W|!CyJwjns&cFTQ+umNygm}SL>RG zH>W=HyioYrX1VWeH)Fqhx{@@PLrb5iWj!ULi}L&tbU5f?L3X@~F|<7MB@qXq z{!&AnmOLT0+Hk#fE zQp8`Z)FW8aQ%V(&PR>?u-d0yDS$}1-o8BKpSdJCNO{x2VxLS}AN;y}D&40Mnv(nCv zRY$P*DYZG!nouOKM?m-Z?y`#J3-bLzjW=ErQ49^}msJ|1k?2z51OH;%EwUzTd_;Fv>{ zT?uM*nC1J0#JHW&6y?wQ+-_N7V?ZdET5*#)pR+S{cAqEl0G$9eAcd|L9>P`H5ORW#`bMp6CK-!G}~NdEHtqsp`< zb(DPa^?ojTW!iL^x+vZ*M?PHgNPg1DdqP9Zx#R64S92s}%eNbil=^GzWJ3VgvF*Uc zexI4OhPUk$=udHnq4UFf8~mjkyPpDa2smG5Y(r9&s^0N;8)N(t9$CBGQSl_O77CRj zhwXMX!v@R@y3Npb@ulU5><(Fs5;epwZroVcoHdQ37?rG#?UE=tCA_=4?i6(75MneS zR{S%BI&uk8oD;>{%6|@_ze#MVP#_a+7@eB^+2O`z5HD_zAa&P{0xM0fA3DZi8@1g& zzwy{)jacpNlA~+-x+<`2^YcKZ5UC?65ENmUp+wYzua7*ntk?kJ&Mf7X&5gpW4xvGP zxxP{hg1U;M8sLi6cpib+{wCC zrzyUSRF$)}7WeEHHyGcJQWJ8Nk1R4EEhTPtdGPZa5lfsg%&PQKhc>% zM>mZz`X6`#5uU&#gLdinjcs2jaL$2(k5sJswk3;-Y7D>se*g>|3YlRF<;E+(YBUf$ z-aT%$oTuw?N|ttX{@?gU3bQ~TMjMKm3i-=ST}mNc^IBBK2-6tfe<2`6AaZHBewV>Z zfI19ZJ#Hdp$bYQ)_CM(8UngN8(4s>IfPjO5fkJ@)8*YIDK)}EuP*Bm(*&&gMh*>d6 zm{~~Kgqg^I&h>?m=-%{bk`>nNKa*W6OZ0fQ zb*T#H5)sSum-zkAm!5Y2h`$S7ue?wRekm7Jr9z<%So-J6CqVEx@6EgDT`^Cr`V*kB zxKW5jP4A}d#oWOlsk400X0KiPsN>s`NPl=LuMxWtUAiRg?k`=4aBKoT36q9#5yZy) zu1Y9IelKG1pM%D>b%Xfe4VuKMrk2TpiBFS$)<<*~CP>$YUm}HUslRj(i6TawC=kl5 zT(R&zF0SHTmZW&`)%A=^II$+eg$EEsHJS(z&Ly13wcJW_EYB5V8=Fv4?S!WvM0u@f zu$wJw)$_|OEo)Y6s-~hvt<`opmWWTAG(FgbXI{4a;>TeaL$jg{n~!`7;$=8punWF! zL3NT{<76%+5ED;TB6*K{FLHmMe8yE*e?=-JUv-_`Yan9fot_<**D!Y~VQHgCkaWV? z9LK}u*P)BhGIVNo!RxHLl~U>$7gH7!k;iwMd20IQhr=+gKe)8-%ClnFL`{3su`ptC z&}K{s^Zg4?vU`m!L?NH6GL_>Witmg&Imrs-YYt6^1Tlyn1v`8LFsg zROv_972`89=vpA9BJirs)uLay`6M+oZj{*5eB~G#S(a{YFtNpSJlY_)rH=cNP={m7wFPs3g<9GYq_jig%sJ-*GVvOTVAmtLQpFljvr|V>h?{g~hL6q_&aHX5iOhll@o4F~V>bRITEdn05vM z)xCcBk8^se^Bp5f)az+=mPiJA?=TV4Y6}g=t{b^kKOBJtqb9@GNHD#++5P%CVddA3 z6^P!^Pk`m`OY4GSzps?;iA7NQg!LHp&fkeVBdCt*XqgZ`0b%-6`(r5zjcf1L0BLqb zE2P1Phv-AB68+xE<{!)r0M30)S@&m^U{N*k1h_}aQ~b9#Oik#m(rf55SMGmjh^dV%K!@5`s|-G z9iGYzd;#Ib-Z#T;kEVEE>t5-v%W)pXriZGrW4d_7a!d?vn7zH(><_QZ33iabS8q z*Qr*nCy8{WwhaaS4Ty|GC17OABh@$awXgKMQSO~K8SJFIWx>C5IF;YW1=ms43GsGE zI6DG%7#2Td)6ICzdRD*|5lIJMU(&Qje~uM%`b|}~o9v0{R;9JOO-wf#pt>y9@wW_j zcwN1bujP*Y zCA?)})@cQGb1%Xl*G3j<Eu>#@W=^+x<%HKvpM8 zyRV#x8lS`y=cjDZw<Tlqk{h&`Mj z1&%xdTgIOzpjqT@%F(FI&7eGenTEK@>AnUj z0+vhtVjy5Av01Q?bluJ$VkPvJfWFOEg!#y7LcUY`7f3#9SNR56CF!c%kNO(fKU>K` z+=OU6*Ev+OKO5Al;|_ZGf`_p_aCl9g>qp(!4Z=c;6wx$zq9H|6G$Ib!2MWW@tuKt{wv^d^sP7+`^73UC3y( z#qgEqqnlZDZtgHaNIzbc+N);heiNW{uM5@zte**d7VYgZk`od{|N{_BHx=w zP6tp5W<@CHZqjp7z6iIGpUYyY%M8?y8RLsBh7rQA#qagO$TIhXIG?K$kLsPC3oN_% z={4*W9P}M=4Z;wn$H&d-G^j*fgs>0?|*2 zLr~ez;6d4Sz1ZEo?&a5oe`HsSo~$YOC%{u|EqMX5oGg0oHX%m}S3oK!mYP8-EQ)1? zt4$g{%ju4}?L*TwB48+I1<1+R&uqa;_yOK|?$HthdhZ*s$b>I_3=FVmjzwfyeY+O2mGRU=NAAvi}sNFDh zUm-=ShMa->ikR#!%RD%|`@?>Yr(vBRU}u3nQyb*y$~qi0DO>gXK$Ha!u3UG&?S~s; zL_c-BRQRHM=wLAf4qJjLg<;`w4JV2wVb2^KT!*dMWLqlBp}fecIV6_CK|!#P)qz*h zeIqKmA9ZQ;`h;4=MhpFf^G1{QvsHzq^a@CQ0vg~SY%&)xsYn70#g(U#F9ACRpMbRg z!6=v>`Yniwd0q<#a@#mEzToh;&Rd*n%f8D<=ayTw z9Q>`Z$={weA%cdCvvYW#%Xb$&&Px(5SM?0eTz}=1F*dhL#U_%rHk{tSj9r=lC4Cl4 zTwD*@!R|av6jQP6S^G>*EE52GQ-d4m^XhhuROOc*-{uf9IU+E~|a{B$0Qxeh({3E1I(Ij3y>1PtNZ$F2UTt(BO4B;EOK z*)RCL|55{bVf0ru=4%OG_YJR2h4+MCTMMjun5(m-ztv*GCjeT(9_-6$VR3|k{Xg_; zjr1|5xmgp4`qw=a6MrO#)>j}cwQVX&dSG?b=M=Xz8VO*@4G)qqfgat7SiF^(+a52* z|FG5PN?MQ|i95jWm$;IZ&6u&?0JEPmLV;B1D~52K3+v4)2&x5?RogY1)d z9HWXMH4mj73~4HFtm!_rqO(Ppp9maP?mm^&{6)28UlOS;z+i-hjT7vZW6iX>vtC9y z-~L7;96qG#S|_+3OQhoCShN}+*C;wI+)D(`oKRRE9|L((*UXVEaQcfKD=r(eI@^b& z56;0SZ_h0zPt)qkbtTTeVt4ZU$fn4c3E3@dadB+@A%>(3+I#Cu2>QncHK(afy7C}C z+v*}Z+cZ+g@YofDcdS3g&d{YU`u86a9z(E-f>G4+4@!v%vxMc$fse5dtISV4Gy6r~ zxq6-IV0Ab{Xkt<*y+H``gjIbUi;ssz9(JMS@m#!0(OHh`f{DK@ubI3-spB@ z36|*{aquX=4QCl%?jqGETIltSRDEMkAyEEaM;U$%~!EXhEz zEH~FZF0*f+$I zK?eC=NgNzQArE~MUcT?${u5A)r#T8^)NUQu@bp}&*$~K9*=T#?dW%1gQ;)y2HfK?l zwk--;Z#C2@ldjx?71z8#NK;xI?oCw?1Y0=^E1z~*!4X#mr``Y6H2$|?7NR>1e~Xsn zi)!z8JrTLvC+#}_WGb>vv8l_*)y)bcf3ktDh&0Lc(adt~-sSBIZ_Ui(f(U4u8X@X- z?A&7ivkOanG+~N9?hD94N}fG4XLmTFX;g+RH$3x5BF1_sSvwxH%J-l+%}q9)XwRCbkefH@;C9we zz#z3=voMo`b1D5IHw3kniK7}no!mdF(I^0_MiTP;aFcni9Tb-?tzRzjXe5N9N0A6d zyMzI=ly8zw5%P=`vCsPSx{WWsev2aS_DDZJUIKh zJDadw{@F9#SM496h>i%?x%@IQB30T3a&eh&5?LQW)G4#rDM}90w~GFprfWOINMvWG zGC%lR9B6qpZ=eGWB^MwzEwY$v-mE*^W`i|BOBf^4?|+uhb>smq{&GkJ|_8>S-r8#4Lp98*N`%JHHoq35!SQf zS1tCNTUi}uN>lSCEu>AOJSdIrf0ol;+onM9|dKXJ$r zt||_Sg}hNq@P4uW>wVBb?<<{!RWX-PvD(nf&Iff?>BOX( zSMD!n`a7!kbpgbLc`vFj2+H>o^;Ay7g<&E)hB@b9MP}k&YbJaP0Z2*7YTP!BdmJDt zqZXa0c$-N5M?K_vym=(h(bZE*vL^(k)UD1QJ9nU^{y9^M-O_r2Tc-tBUnR)2q?oXQ zI%3=>{R3M#Yn^H?(J1;9SZ{>9D*M>Sps^~{KgK2gYhP<8O~E;nx36pQKCECta+3p1 z60gKVU}8|_B_bhfg}I?6*A0TYq;uX~Y4nh7hFBSlYtis`d-!qfN6`^#TPVg2nFrlfm#!jBT9uF00_ktsgOcOwhB$bSgrCt$aCtf0?oj?{%rAZp|HV3I^%|TLA;Sj z8u5ye7<`!?ZR5Isu}Ro}I1x5T^IdNlKWrQ3g%iD7GfFDei|c^IU~So!U(_hufvH6RWBe@%f|&cDOb7+?3`A zKLK_Jnd?miH_(xI7zn}A9%NH^*M+{1syh2Cu4M&9qfRut7cL2TZGIgd+O8g_2H^(E zn;kT$7e*1jt{!|}6>&km=YzU;C#}r^w5rx^Jl)P7P<&> z9tk@&X;AH6pWtk9xR>1sIov(Nz=Csj{u{U}K(N~11Z_7iGwlm9zBBi0?ArNQ6J)&6 z>?-fgL!KF2pWS0T)lt}fS1^0>B5@Q+um;`hRa1X(+)wWa@|}CMTa1}-z4M{=Ye{ji zojJ~|lPg~v$}1h!4>B2;W`vWVY*2`kePc*^D^!p_4C~Y%TTB`XW1>Uq{{%=Cy)Rgv z1cO1h!hY3ugwv+W6$b1#?pY3Tu{lFm=1<97^o%5NNh>(S=24+T%ep0+%a!R9dj@q1 z>l5?j^O&BXWz~y?OpTX&+6w1r7WI}!f8;}8#In(0%8)0F;ZZw*pvErqC&e;y-dT0P zztUEv*eF?78#kr2FVm`4D>rD-R=(qpK<@h#Js9uoFP zv-Lm&r42Fh=I3O zh=6MjR$*i%Q6qFA5mIF*rhir%pnq2ybtdS>QA$Bf63~6vq~L~8DF62+Trj<@LD0cO zDuZqh#6)~~QuWBkC!kPa^yw4u``+rAkYH&d9R~+Tu#ofK{39xNF7bth!PHc@&B?@% zt75Saea}=Ubc~cMeQ=t>i8G!v9}hhG1j4GbiT>m84CHl7d2LR@eZEQ&tZq#l_jKRe>On#jf8& zjI2A~v)?G4?syT?vghbsIZd@Fk9%Y1NKt(4m9Y2nu@;LDeSzeB2-yBu*x<*9F0I;X zjDP#_9^>LWM|Hv4@)pVoQ<-m7I(&#!f!Z8iyeuyGSCqKZNyTT)Q&P+7h=Wt= z@%mwj-O{<%av#zBH!ZHtk-8q)N*v{SG4q3>2%k0i&k(3lH0|?Wih@DwztXe z>JF%L+2=Lv2q;`fa=W4ySthS$xD3pP=t-{TTE|hy7xQ8dnx$E?`-3wJEJE_5=fDpmFITF(Bf5}BnCE}r2dtK@cayCgN`WOlstTdHHXx0zoS=;|^t z%+4cwm_^%7|KVD?Ny=+E*Qh!_^iw7DAS>ojQ+Y(>nPs$_{3>rRze%aP7`sgFt2hqz z@Y$ZlWjY}z0wXK+qs(rx?0RcK&W{KVvBt$M|L}YA2M0kh|1lgqTixv^Dvu0Ptyjm~CQ_p%k<(5v&Byx%BRMAiR19p5wh_n=1KQwl35{}fHI zZ0GPl4f>}G!8}KsbKF9?2$!TVJxsdHajb}h@(YPfzPs4EQM67WUA#>3YQv){R%%#k zdeUo=9oN=8rFq*|r$$sX|5)!gn-4jMshjG1_Q#v^8fiJy6BE)K ziN!0HXuc+sNj)|SZBsjA3vN_BL}PN9bx~>`i3z){u$fK8w@x`D%%gML^PfE}pS2KAFbEE(lBKLgj-?vAM_tLZ4NRpm zO(oPO=n(>&i(UTBT;(!ey@q#owP+o?V5sn^=?}d{&Ct&YoxR_KQ!y`@f^MR>*K@b^ z1g5IpwyTCOF@$xz1=`0(uOwrB*#4vM@Po0lfo?_UqYG~kQ^WNkXl2VEG9=FY;f;_)ka+r zbqyC3`(5Z7?#JRF3Mwd;JiEi#V0!Z(IdWa2s~himJ^{xib*=fut80_<=*~;gMind~ zTBjrUZsM~|v`eacWq&xhI_>|>W!!I`BRSzc#c6hR>lVvToSq$TY!$C8E<>9|c_JCu zNa3r>swu!Aqi5q-KeoRS7g+qSuC$V=BDlx4&nk(seL70FyfIZu(9|wcNsfmS4}_+q zxvb>yUIh*$2CMoVNuPl0c{yZ{#nsme!ql+XA^sh9&w=}}yW+>``Ex^PRbkXyigi<>#b2_bB87fODQ`;*`LU$NO?tjoF`VV}!$Zjhk74+BS`WM%_{8L9 zhNUJay%yil6O6}o){C22%dXP2vOX&{heF@}KL1&#RU>&@pm?Y=a=u10q{UFQY=0?% zXeW$bez{|$W;2J>Z2P`|^)Dht`Z6*oOQ$SNw59j*G{}uos*cA>Yc1CEl#Lb9eyHn) zG;7)q1Wi^OQM%djA~`71Z=|cD?Z$VG^Fa4A7;Hc0mZ~4D5tb}%aKip$rgKm(Qywb# zih*WZD&jW;T}DqLx%0KONaS4$7*TvT*gETpm$E*>|16sArv!Pa9+G2El%43yiR-Fz z*LlMkf6EV9i)f?RUo@@i=6@r3`2~!A|MVig+BL{OI{yTaJIJ|_(=;C|Hsj(++P$YQ zzi`;EztXNFNR5}y5r$N}5M`VypOJjA$JN(@9@bB5^p4UBNT9yroY(3ds7N2uYBS>%2wQs_;9EAAa&sTxl+qu3eEAf^ge${UWKY$qeF!OMF35C zcezhQwdA5&iRo5>!$I7gV^g%w`}L?JKEi5X;I}-g2oeL9W2NX*ZpUd((g6lI%%|ul za|y0WCq0A1p(t7SzeQHYQNpUj=@Za%yl^WZ`1p>iFF6v^LjMU^8wy_-*4X|KXMDwb z2{3;kG{3>YVtgl;gUvvPKp_tJJN*j)H;h5Sz+j+&8AouiztjKUj3Wv$I4Uy{35&3j zk&|;DG8(IhOJKZm0;y1b9Xgw+@eUbN(2dF5zcP;?07ya5w_m?6 zz(gVuu^TUNn8Ft#;6)dxE(;2#qR|dK6L)(XjR>D=PGaEo+1j*0XCfY*__Kev6EVwz zBQC)T{vj4PeBQz86z!$kZ_jex3iVD3o0iMJrQlHL~(+;F~Tzrdb33(?q`WNnIp^VJC|79F+5(2!=#Yny#X|0Qeh zR0D|h!zJHkLX<=J#>mRvyDSbZ9CWWcC(BuNl0((UBx(T1w)s9A36na;0;20G6%7WP z%n_u|ycOsog*VrJ3reQb9iiK*Q*Nb&Cm++r z+BKpf%o`K+z{f6z>*Yd`*-|sx4JxcG(++9)IAJg?8ZY3G#ZJ0#=LjmM`oxYLbTb+A zmdqZ{TleTs-yc#@xWQCk#fzhvv$Gtmm1J;nS8UbjQ(1~pY-*k7zdwc&7chxxvL#$z zFz0V9p6z&q$p=wQefLH=pUvoHXCrlO*4g;!lS4B$Q1N4OtBu1zykhLK20F_24?3>t zvF)^bf7TpAbxtjl5^-BEcY3Lx#+P0P_R`n*#NZzjB@^G6@z9LqZ;@BUOdY>#Uh_ z#LkX*tzjP+-7Zuhyp3I`w&J=>sMxIbta%L>&)Gokh`2FESP>jgo9m_Q%@)^oNB;!$ zhfCX+lmgcCtZ4?u7Rx%P&JxYP`Oh$KnpW{i1EFIF&Q@aqh6n{~* zbxL3%qshWs4UXsS4_hhsq7a+DJ`96)7tUElk;KhAys}3fwfbm?Rf#U9^EPT0g1-dK z5C-HXD{61uXc$?&_gCMMt6ciDibJ<5W~94Mav?I|!J5SJ1>M+pew3e5wR_X{I*bY5 z752Dsk6)NqT9`g1Z`r*g=fKWL7*#DH-r?03{5Pqb(@`il+N4hSh1XSs)>Rp}1|j&b z;j2(z)%Y|JzD8Uu_e8`Y*!RxGnypv+&t8aoc;FxgNDV%~f=cz~XUtL_D00yXt~gfy zHTqvg=FY*6@L{C2z*WppO!XBn{VLuZu)khHGb6vPp@&3z%5y_E;K%2xfkpZi+`Ko0 z>Z)A{2^O<}SlPMkB$S1b%in6d75ZlX-}FZFK)xKK70-Pw`!6pf9-5geQxj&M#+r7x-YL1?<71k!LNd{+pUCk{B&T)7P
ZHr3KI3)({T{X%{$AOk|3NYfu9egkve%cgOBWFop;dyfZT2OXu-(KA#N9HhU zENv&9Y((nsfFA|dyyNuJ2>ApwL5i|t$Ndy{?OQMRRCraikhEbutgR472692C=m3N7FxJ`AR<-kNlcV$DYl3*U`S(U&6?%2qxS zqdo;t&Gsu!TaQmjg3KHV+5C2tO~+8oF3$l7Jt za-5d7qomCYQQT}b$Qf^k^JunddhsM<{S74_k!o?#QexlTuUJgM)P)v)*P$UIqu>Q9 zNo_KBTg~v82U?+%^rImuM5C)J<$H#*uo0^ip%sn*AYoz7RJv8M?O9w;x*+StqLxEO z?Fhq}owus^vcE?DjjI7-w3LQ6QTgJNu73!m2fJcQ0J~X7@;Bwr@?qBJ+O=_d8zkDJ zt_5y6v_GyOt#~5(dZ<%8<>`@!q?R>2aE4}g&6gAhQd#_dl8UBHj=C(nB|Xii&0%6^ zdSpj-cFuUvCgyDYM?Dt6P!nw8mtttFlj3%4UM zN|Yc9%S&|zePE!l_!}seOu@d4u+4S2V`xAJ8>(b&yd4n~W6usr#EF>IYe3*2v4Ov` zR*V*I*PvpJo23WIh6tz>jnz%X!&I3Jzo5U$#8lQk*+~$ui;|}Gr`eLGi&+>3UxM6bflj9;-i~k5Dc#s- z$-5)^!75jM8#!3AdVWFQ^MgJaeZ#SrYMRk86nT=^b@E!QuuhB1O{pz?g<|HIUF*A1 z&rY5W$}}&Wswm&KE7WEdkv-E{J{6m}UdC$U}% zjfSI$A)ybtj_!^F_1NvPuEVaV6q>0wyR$7V6LL#T-pxNVJVT%_zpLVGiz0G1(AocG zs9;s@?Qoi#GPaZ@DLE)RRR@Pn371a1wy~bDb0-?|cQqz}}u-)b< z?rHY_`LVbY1TJBykbz4U5KwTazkincR{|4&Ld*FFlwOSIXkqoKz9-f0|s!@?Nu9clq2$A}-S*N7*nlJZL$tlzjis%l33F zQ7utN{IOmoha1+F*Ac0ED}C5Z^$r73H@%CcS?*b@PZ_J-Hhk*LQNED{w%H?$f>u+x zKdL#Wx@ob81;pn#*AwTcKxBcBqq)rXP>b*-l?|Q9(SNDs#S~5HlZEITpBhAQAuk0W8Hf3n_B`JSNVAH+=f=T zd*9aoKB%oG1ZEqV52o;GdDCvc+YtP>11}@e{m}y!mQ}Be#%Z zxN3!wtZl+R25vE9Zhyw^iy=sz$U7&9Wo_;{FI#;9R1`~u23qd@rq(rD)c|4egrv6q z!=%C58}b7bDg?sKPgW2XURX7AcmFB`IeKwcoC%0N7{F0+moqGaaWvfR{SbB{@K!J( z5H^kVS=aDWrSjDN#9Qf+TiQz{*9>|6k=d!Tg3%=g4KyhjNKaJdp&v3w1RXZ9UW&=; z*n@EC#FmO9^0aDnqvt`P(KqgIGfSDFYvm?xc7QRs27KqC`ZV|&#;$(MeJ)ZN&T%kUT5$Wk%}BdoF(SV z?^+E9jo>jg65EtX7zn^gJ9A^nqO%>-p8zbTFs{(G2ZPwu zzr#T9r?*8iMn_N+5+kTy%X#Jx$7XW$9_-ld*pp7qX!4Xz0WQb~s8kdKEQ>7~VlarCLgIbm5s5v4*E7?K?e>+~QuEV4I3%hPS zQE>leDv7>(b2(kd_&!|&Jzw_$^s5}Ea7nAV+IR6uwKSs`7ZocrjU8%Wawk#5sF_ih z%Po4=`7Fz$|BV@GsAi>G2}+SBRBi6QJ5dT2HRG3Dr}2|m;O-ygO52%yLMKX^z$C|| zk}}S!SJ|5mPL}FW#sZ6+Q6#RMtI0N=jfs>>(u>d@3?oed9AqFXdx=Z2gNs^f7J_rD zhp^g%!sh$Ign<+;6O{SRoIJc?8zTJHVb zhU5Yl*X2LgxItmKR@1xWrQu^?20d@W)0u7-Qb_)>jG0xYwLmz2}4 zX=Y6Hb)VbsJoi8k!!*<~P$aox?_(eG4o#)AqJz==PO(X&kENWkK;jamy&%%<{1H!U zB>6aoDmhBH-6Q6Ojk(`G-zFk77i@Ss&{bOi+gRp{#!sSjB1(ROTD|anv@eladpGX^JMxYa@V@o~DTvmRznu6C6MD}zg9=cRvKI1j2 zJ&nPUdskGg4ATPUhd4;6i7MYQhCzRkN^JNJ!)a4=fADr+nz$rSM8M z?{dRvH~RM{DwYdC75j-P^`xtEG3mfrQ+`{ptX%&qHq^EswDpi&D1TZqg0}~*&y->W zv3eCmHfsO3C28X@y>KiMF8l0LEj5`ube1U(Y)MnRY0#nG&PSKP0eX(w#M+(TTu@f2 zUvt?XrpPw=`{|}DoT?*4ncvlQ%b5iRvdXMy6PMsl|F&%In)Z4}pwv;#-|B7p| zEhtu(C2gBn(>cyFrqOGs;S{|TzTAZp3nas^hQ%CoWoDSpt=L?MKGYMT z2x9~&W;(flirRd;0gJxk4tM!^BR>i^b0Ep~RX=X^#Z&}pXvr8=cRzzbtX5RgVT1f9 zAQ7Np7~wTAjz89Y`7DdZA&KUYV#K4lrGJB^r?I?q@qQ~l7mO8>c1D*CW5c3JB(D{O zrhJ8D@mo6A9I*&=qBCfm5v6w->H*chRMJbS$;wTZCjYY941D56&CoO@m0jZ1cd@mg z`FIU5PTrc$Go+sfrD3`AV|n+A)j={!j;hx13BDYn`W;0>ORZ7K#OWDg%+_t6w1QSa z3Ac+ow~R`}dMhDaR7ai2q?IaVjP)U;nD;rnuNmV|$JW-V%^alMFB`=|6a!z90-YI6 z1lz5j-o#}6v7eHypf9pt8rzCdV9+=_`8ZZe;Fwh9Lk5Ej<0n&95T|sT_f5ut+Xh!& z%92+^KPF3gN=3{e0F&49pEwPumw;( ze$B?bbh?1D+OIW^BHJpaVII{ygI&qx8uQ}z+CU0zq2R*ijMa?Nthi&GiI4}a<#nA& znRO|i{cNuj9+yOhX#!u4LHTyNY=twWWlVvM^Xtyju+FgW8VYh_CZEo%s=x{r)|#(l z3qdpv#Luh(2W~$ZUw5~yIJ=yZd{{o`SGqY!vj0)XWdX$7$;Hx{MLnC9LFmN^OGfAN zC%~k!zkBSprxRA9S&VlguIUaLS6;q`>nio-TG+TRcsr6XU~zr~S!IUh1(P;?rmMJI zyKm!~3(cTh?;`}C#A8{85CqX{7sGwz*G7?RCFtfx7eBER*SaJc+QJ$22s(=SO3n>R z3r(ZHSh<^7&_;;HIFRrYQW*Av8>ra_;Ou}gMd7)hC8c-0-CLZ@ zRN+qwP&4!;2f<32hZ8i#W(kgoe~6W*E`8XrmS~0X$;u>o5&n}`IL^E8 zso1URBmOS7j9(2GlW5)MH4I_{kl}N(KThRXcI7V>gn+B*ZkwWZdln#QXCz#FC>OS) zU+VJcce&va;wNm=P%g1Qh-BX)Z-FVj^4+aFIwArWJIF{~7DX z^0oQ^xTW~{7I7iTcFm}~4VOM#stG~2O{DZ=P%irgw)S`^Hhvo68Oym0nQ4n_sh9k< zeH5B}h~)ENQ@ufFkC$yd>Q|4w?Hxa}s@cS!V&B!gy=-D~ug#U_p^>2BN$u3~oviMO zODk+_)*J@+YQke-Z05~VS{uX>5Wy6fF>8t&l9!n5#1v5HZ*S-4Kj4Dr*sRaK zpjDMtRwCtg9?lE`9ck&GWl;Rh1$V;@d(R(Nxy06keP7W)gNaJR=*WLS^v-ka#KO_X}1^)+m1*ehTOl2@X z^#7T<#SYe*ll zPS4W>mGv#4uW)T)iRWkhKRgg-OYeCy<79JYfn{gdKN2W-}b<&+QwQdL*;0`{}640#Npy*_Fey7i(!;$zoUgx;< z=lX*4FCgBPfST;6IvA{YyG<}Sp0(^cd(Cz3^*exCXR;Yv(fRrGfedbF29xE7D?_sH zFbUjDvR-tQ)bB$8Y725W334D1@URpO{v`$rgfVT&r|;K^0>WNVG=KIiPXmM~uQSOy zb1?u?)UF-d*WJPZA>#iUzyjj5N}*Rg2mn{@kk9fopOv9fcnLjL4 z@cNJ1^M#Wb!|(XJw;=WXB!ZjT`oLx zDp`tj2Xj7ij?2FXU$Y$M94J*ekNxuH`++?Kdnb5&myRFt^Q6B1vJuhXxZ@$v zs0RNpz%$}!DL;7W@n>X8**a9F0|WmC8Ka`@zImsXH{(nJv!m6nQ-F*)#z#*q;4dJrdF<2V65WTsJuw%G zKflkh7pP_E9#DD1h!*`>^rh9|h@#F7&2xR%OrS8m;u6fB zZ9{6ZC#h~^Ai+KM@7^D z^V&n;_j{cr;7YlCVG(aZX`O6z%7geZ>6=@2Mh;b?pi8PvkGcW9xl?;Rzt*bEB)M>Z z8v$UNpBD6z=KxbAE;!tKMP$~Ye}sAp2NOXO{LSqcHe#D+NriZbg~7RlBz~r_G2|q# zkJ^^Y?4--1%QWUT0|$3ZJt;qU@<2$R`96kur|S5J9W>S@2+7y6#xzgG+QNrl6_fNQ z{MVD-W=Etwkbcivi2{3~MGJ!cL&F{I4SS1gyF9DejP&QlB=_)ee{$tV6>$cI4$GWt@U$EUEMjX^!hCTB0D z&*Ay+s_PjVrcly5jXnq}qmm3SO79PC6=^Om9aLg_|4_(6)U4ZRHYz)ggVACX!e}BU zNj;4{oDMPzKNQEFTLBO;-*TtsdsXR1o}iV6`b7?-K2Lf!O)2P6wEyrT>L);Slo_h# zeTr7b-jJCQ>paaWIP>FHEv!U39c*Tm+1vD{Ff%-O`3rbNc8Fr5=O9ZrQoN`}$qyWn zbSuraNO@lnpu8X06>2bSOR}LCh9W8^-SAt4u;IrX*%xE%RYPqaH^)lcmMu%>uYCKv+`O{SyFo4 z!TtRk1%hothUSo-EJ&UW4o;C5uBzl&Yzy#c-Axn_t z?i|pKKUkc}?p8aiOZSRzPK{G9R<`p=kqrg;sj7(i^rJ8yPDU5*T6~9l%0PVkRdYAH z#oQT1mtH%%(HW}f3e*#`5!Zz|!A7SH?KiPhKvYv^Oz?90u$5Ub!orVYFzfknG*xs< zcr^Y;27gFZHs}Rr>3i+XJ-g@X2qW8OV6lUmQY=~uXd%)hfts$3>rCO3+L#96HOU&M z@KBF)fXelo<(I)(|1R=YLqhi7(hKb!Q#Zf=P{lD+)POM9(A-v6M5)$mnUm_Xm$yDr zU6|@kCWyG_pn#wV?ixG!GslO7OcDSJ0?>@O?mqb2(fB=8JR;+Xbmi{ug!#^|1}x3yQ=iZg z6Ga2LkC)u;ifw-Z1{T+4q%j1--XROjpT?}EJu6VBy!;6b%QH@=z~M%S?htX$A%C;_ z5KPrAt9=$9fuy=ghmRF}zW+o%3U(izDOz3)w5Dt8U5;*SJNNjkcV$q$U z$YqFrAB`=O8xonnE2nBDnXr@j-Z0trdbZ0X=f%Zq*QtwFAJDuidOP#{DOA=&_U)C~ zy;u;t1hF$$JO(Vn1XZI}+u8TtQceCV@ci2@6bQHBUg2q?Exo>74GT$&zyqe{PUjds zq#O|DOfS(&)|#aFDA-?Tr^?kQlP?NFKAm^U;f z_zs$+rNm4d>E>R4jb#={#L;dbQQT60rkn`gwta69y~;rCe>nwqD4Ey905eoADhK0K zM3ug{2Y+TU4GZ2p;Invhs;LYmBB;beFQLDqcODxIcq6JO$DiYpuZTax)FKU~UisyXM ziwEne?pH`{1NC}bBGadWnlD_we)rcfZAE`DKAjg$&UMAXLVXuH@b1Qh6hlskei^$L zy13%Hcw|Pb??uo41;}L`cB#oPvc}n9M3sY5unD#l$JiYD2EHY$O71ssr=-pO_P+WH zpocg2P16*rRgr&$X8Bq4x4DhU@d#q2*ALJG5g#{#Kg`2o>Mw|UGo`z;U*TuEvtQef_o*_+v7CTnDMEySl254iwF1$1R5mnRfU%;<_ieUeN!q6^$sMFp*2>IVo z7^Lo6Okoa1!W^OEP%!-84t@}Ptzbkj1P=;?VOQM==S*dwj0dJab7nf)q08+JVPMuP+6u=B88M z?$YqNj+K!tajeTCe}*hz6>1oSAO{dqt`nQh$P9Id*f+$`a1axORBXnHODm33)pJ+X3V-UwH5*qeo~_o$&(<7~xD3R@R5VzQla z`j(u`Cgsd+b|#zvJFC5u*wg7P%DG>&!~*vOw0R0i!$KNN2|-phgagl)Y|2f)GQnBVu~8owct0pi z|H-V}6)@@($93Py)c#&NK(o3FN-#+=eWFN=5f?%?BXig z_#mZ_vtSpc?GC2g%=>Bpk$`WwhwmWYyC3-U3jO+**Y^^%<=7rxaq$+YL=H>N@JXMLk10 z<>}}X%;Rs9NFM)$Ch)Kn`JSsshU{JxIgw$IYmDM0(zs!0h$F6cG<1d7<$ZdH|D@G z|9q@x-55q)q2N^#R+v3$edTGj|p=z zf=bq(V?~_x>N|lulCkjgB=CFUD4yD)o1~PpYjx2YZvzPCG-R+c;ppQ|vP1R9zL)6Z z!3ax{f)G3g{bnOQRnDl-_7F;&19*3ol8s`m>W*ED4PNFxpY*8ITU_JuaXwQJS7%oO z-X$SJ&2sE{Fy&KY`fR}z804FZ9~%Q+{cKybc@HomjANv`&|1LQe#)>&X=VK!K5@w; z;o7Kw_ExMclA@$#ckF*LKLS_caliW|M9UL>thD|L0__#)%xra{=1{!an?O@-9jUlP z&lP(=7CWjqXDyftOrXkmqfKXNSv2)DOi(miXSZrrYYi%=Qtt zp1HTd_KSV)Id8vFu$8~;V*H0`PNqe4Hk*r=z{+%6fYE}J_H-$zD$@nhIm`yx&O)rq z^G(!#4?BV+YW`la&o=^0xpL-|<}$2ZHvyd8d3aWzYHI>@ZCI>~XNtLWH$b%Po+aZ9 zybIXJ-^MO&{pAogWxT?Ri6d&vN}!u)Kd8TP2kNm@eVh&|C;}y=$$H>j;@rtui4Z_C z&}3INx+BMO%*3M=`6&U9HtuuX?CdiylA86q={Wg?Fvq7rsTT*!s^gc8(615!R06!yR(yDpYq1}-6-vh^VCM_}FEy-y3@Hg`RwyeOx z!Tr}V_uo%zb9JbzM=`W(WoY)YY3JX1JE%pQ7zq5k_$kE6PfT4iSn3w0^f0KX+#L9esa~Uw z8rI`Uzk!c^@y;_p%6O<7p!m@ix!qP7>%#Z-?T&Rog0}vDuHIl}=G3nb1x$%oS59kk zYuD|Hv|ciXV@!3J`mxvC%GKY>c#G0sKodHbBzgq599+M^tgt3mf7U4+82fDR8P;;O zo!Oxeo55=Ic05v67A^eJuhT+vZ>7AZ(em#ls&x<@1XSPC)?vi3VoWk#i&eh%f$4QQN@5)?RY-oE{68gAX$pa>&n{5b<-M#_;4e>lWn_ zE_BRDj?-3bJ7)kG&-LpdhA=!cS2v8yy|&X7&%^qLr><%Eu~?uQDxMJa+%%XZ@OjSD zM;7|WO$a8}eHxaNBg<6dkYtn^)l-9?gV~F%gNvKZ%Kv)L8n#It z!+oJkx3Nxh_1-O)9#)cd)V2e<b@H9fl*(J|`D8HhW*CMvAO6(gq{Kpq z;%MVjm!{&G5lzf?<0RQYf`e0bB`^on9nh97^VFex8eU*rZE|TY`~?&S0-?ree6-B8 zDOf(XCt%Tn92vD)VrEOr2t)40B^tBg7&7s{fNy2m@x55=RfWh(LcPqomj_y5?b>1a zInAhX9#LZzzndipWpj1z`_b;}oAV-{_7lQ|PUM2V72MAmpo)(^^z@tHSrbj8wRBfc zPG)?pL2hqneEZIDf-`44uM%#`$)R0{h*lLZUmXG{73X29HndlJR*HjvMkgQPL<8bf z^N^5Qatvzm{JMLO2v2Nu{_s6QzE#4g`C7`*^n`PIo*#gh zfexMhxDCQmwP#8^dWXDu^PQ|1JN^?`dplBO=-w=&8;Gq43yB>0jKsiw|3mHT!MGE* zp{-uXb#!(f%&Ok4D3v%YbsUGsNfa#LvD?6)v#VQy=kp>M8+)gh#jl;tb+_OUvyv83(&f zAMUGqbf$U*_9&CKT7y2T^Xdbcn`EgI1F5>}HKwsogu!g_Dnz4Q zztzC}j_WG1EUcBihYPb^#!XhEN=;u=%clevlbG|$-DI{7tM+EnHZvf(m?ap`1~VPFXJs=~4LdM<+vCG9h8aQvakDZzB7Hm{Z*ROAEf_ z*F^)MFfR;7vS$s@S;y>H3gV&7wvR^sS*V7-M*EzzKb|t7@oBktz#!_tL$Ktr7iKO2 z2~T@e8ruZnX!4h4N*GG2PkWDZvKiidz3|z!YY1=B7%{(tuu*9(*fs?YqgvzM97gv< z_E03jk+n3EgXBR_nB%7Dy%4-0{3U8Lv&R#DJ79Nx$f%mIa9+Q^I2p2Jxm=lCo)P1P?-h9e3{KXq%KT&8cfl$LG&$26Vz0Z{Sod&}dXmYeN@8qdP_HmpxJbg`lQ zN)UZo*`xMxUgy|cp_IK->k?YUBBwvw(`RJF@jgV}#>-YK7Mg5BW$B>C3pfR0ZEX*r z6X^|B`h7Q?C;Gml5*~3#YkNkW(@?7TYB`cm=DR@4qvpx?5rQBU`FNG0t|CJuQ;y-C z#wsa-MbVFaQVix8W^>4859>F7ChG_tc#PQnuE8UjCb$Td;6}V95pkF*uc`>&LtKmB zetue%LJsX6H9>`JsK}}&P30}hbaV3<$$hu!j_Ir>u4U;@s;=-702@-lKJx>2pehK+7dw{ieY&HI&H1wX}Aq2D#BjQrPUvP^yYz|MZ`t8=t ztk!^)3nwQIv|+%gTVgfsbd}aBwi}vPD)4<2azn_v;;KQCf5?eWJ+iH$I+wmUK@m z=noz$dT6V4bcj%5iApyaydhb%c%6(5sOG5|kjmN;^sz4xC93h2_~Vb;pscuwSsx|? z#E0FY=@VgfTYJxS$Gx>8Av4t4-cyuwI36}=b#84x>P8tcV)Oig0tdHrv5~Q#c-XPRaIy6tLA!IZON1L;)7f_R=pN$t3+U98{&EI6JXJ)7p>_}_ zRzG*Pr3#dB1Fs|Q>r7JJ&JVr>#(TDItcJ%r%voR?HK+;ypkYGUEQe5XvuD`hEh*Ey zu*L)WnXtN{Oz9Fr^Gb%4`WcnCA7`KVnRbX*$BLoEimbJ_^0M{`QIRx}zD=}r%VZVc z0Aa$UFjhuFaOFKKTLe$UsZTW?0x>~@{yE50+4B`6piuWHE1oGU&JcWlZ75SagrH_O z8jtSu3k6l@khlRRJFsLBb+gt+MzUssQ&yAAlw?G30pYlbqN!C9MI&qAs)Q+WrWvu4 zJJQc1lE9!0K8TdBQQIyyzDCd;?VA;0ToDVYv&0vtuY74du}k|j>nn)x7TO^uyX7<8 zsGa~H;i*KwoI3Ievw)`Q;1pAu`%0S<*8>r%xVIoZ-NPJl$kZP-u2t0ErqrZbWneXv z1q2Uvn;a{pNqYUyYe}UaOMC6gvzDmd1t;rEd||*?pTx+Lyv4lyb1@O?!HZ*JbMH?f zINK+XUctlU$L_wd!|7K<`I^AIAj^g%4`*g3LQ&Z|Z>Zq+C)j32Noxwma6k6Ds|6xB z&z5_fw>30p7SOP9Unv--E)!Gn{Wd5&_mH=mF8ad~LShKvQX0RR<`>;;dq4gIGq2&3 z)SB3okj1uNzj2I<7~s-tL3*_2c#A&@xrN_p!ck_b4mTDQH^g$5ETAnN9@!hgb5wEa zH*co+R&UXrYb@+ZrhXQk!q9GOY6|Zhbv>^BiGDbrg(i(7?Zy$p{Ma@l((*g@T+KyA zcr>eIAUA`tatzE{>m*B|I4(2U2@CQ(zK}>LDsPeFsPM9h&fJ$xVzp2dF>p!Eo*F64 zrxVBUOG>E+7wbmG10T+OgXw5W~dpJzbweAYSTYOKOQ4O5+1Y zMEp*7dX9S_rF|42Ot~!>Wnz$~a}WpbmOx~I;XSqYl?-Jhet~HHY^LR`k4`hB(sAPi zrE2XhMH$C5E}H;UVcv<@ErXCv9_5%hLVL-}>jtd72XLC;33ewC_RK`|9Rs8ZiCJ^G z?KZh}a$?4RD0Q^hws7K3%GR0-*}y}^&rQOv1UqSXlhlHD19#8WM=)bcJL{XmVX>d4 zk;KR%2N3nJQQUjDPq+sm5|xr*vIfi$5M{c z_D?jkA(4n*bbJOvSa&13yzh|KCGSuDw3EyEY>7i=%WwvSdQ^YiUv8KA^3s{n70r<5 z$9cRr#Y^&qA&UxnvjeUegR0PCk6x2=v~;yfBuN_J7Sa>!0K2@Vu81iZy~BraPdSd9 z5NeZ9^Nj0z;J<(;V;7jt{OD`J00U_AC<_rk(iq-~**c3n*l47vi}QhLGxE*FbH5(GcO1D19DaMCGu>gmWzE(pjjDCIb|6_9N{rx z{70YRoH}Eo7X?>wES6)Va@&&9sK)J=zMsFRRj#v|N};2%Q=X{ZcFc6ytl{SS7q8m$HrEc%J3j z6`vAfPp#wC>R#?F5*4yH%5=FBC|20j`CWv=fzw*%5K}BaNM0{5J&osq6Il(1`uj{8 zg>oiXZ3m-oD7vs1R*^`sx4vAmWB+)$aKegN3u)KL%{9Y7JR!YkcIr=Q4zy=a&+szR z-OppWrS?BDG*;{u=}k1@8zsZ{;%uX#$Q!kY6f*JTP1rTIGf*@e{OP#Vt$2wdXOZul z8N&ff`-Ml-CeiVOZIOL&iSENDT7!_{zSER=v7==s;UxzRUAe*+wUR`HIm_wtB{|zaVgkvF4 z5rdYTHI7AuU?@hFN!pemGZ;N%9kJWGnz~WK`YCrj!;F4OV=YC_X&JWB1}IYuXJ8#tgG^m*nmlo)M*j3%jKHE_Q+*>jmRj2WIQH-X58%^sRM;0z^=W02nZ9 zqx`vLQkQSbSzmLu^Y9_2KU_(cQ3JMa;?Yzby^OxnzqFxTxKJ$^$4kqPe4iO1CvF2_ zeSq(rgEvPq!zpW;a_}n3TCd7iiDaaN=@)e|auGA0ymhMS6`?ZUJjbC3rV^ZP%#zm} zS0kWH$hp-BsL(JNlO=D9gi%-He8+8#QkECVW#1nfAHP2x$qv3qoMQZXTOkQda5fJ< znlHDCt8%=})H`oO4FLO1$VvJ)=`MqKZ@3?`&EY)3#*A4SbKxcS+$$*UyNSH=E$&%@ z)3&*Y;pOF?32N1eh%`Hl5qiif*HQ(PDPI}cWo8r|30q-GU(cGe<4IBMPfV`5*M+j- zD+Lbuu7e_KKeZuA)QsgV;EiomFPF3nTAfWOYR_<7tR84!=P=K|3!-Y2l(@xZ>odPL z%9v+0VAVFVo6tV4JUMiAKIA1I+l=HP3V>+C$VA=BTmp24i4}7N+v~lC=J;rH!n)y= zQ0W`Z;G{cD66Bf0VVFNMJ-UCsd6o7=5x)_-y>>O|@tpns%sU_qegD!ixJl~Qo#85I zslvrb;LUP}yvpf|#vL4(JSyfq;up(-_R*LsS`~ttzc-bN3S=J)(#A*MBRYJ z<9g!}OJgfDgYt#BGMNggm1+oI(iiDEya9(!j0=jDT0@ai)4D8P+(7Jij4o@NNPJ`1i`qxDkjo2%`}n|!X6nkuxiovIe(n_S z8-k`^2!m&}kgRX0Ch!JLs&kDWsI6WkV7~Q)>%0s|Q{c8EW(}@BXXrzk_x^Je{AZAD z#`H3Vh9^)6Ux|oB+ychv385|5zjikETc}4P;!RIL^8oVRd~MYu83k9QZDJjFF`LY2 zSc4Y*@LO@+!p}SXsg>`P$2C&+fmQ=GP{CS_RonNr<-4(B2UfbwvYS_>B^&TPLA>J% z+2xDz+ggauNUDT~+9?p0d(_z|j%jI1X5*@e459y1JrBcLX~z+8xc*^(EJr;i~M1|^qCVyA|4*}z& AhyVZp diff --git a/network/digit_web/sdigit_1.jpg b/network/digit_web/sdigit_1.jpg deleted file mode 100644 index 84fb432bf3ac59567ef25b821f6460c6fa92eb12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27709 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 diff --git a/network/digit_web/sdigit_4.jpg b/network/digit_web/sdigit_4.jpg deleted file mode 100644 index cd343024168b8179548479d4eebe15b6254a4589..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27931 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 diff --git a/network/digit_web/sdigit_5.jpg b/network/digit_web/sdigit_5.jpg deleted file mode 100644 index 02fe6d5535a52484e13b94e9644d117f341e51d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28008 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 PR|Vi`uXb|$Kgj>twi@&< diff --git a/network/digit_web/sdigit_7.jpg b/network/digit_web/sdigit_7.jpg deleted file mode 100644 index ccf6ddfaec3d027958277b976c2c9b30ffdb056c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27419 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 J?uFl${}(EB8LQEDX%w8&crlVBru@5D?(u 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 z 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 Aga7~l diff --git a/network/digit_web/settings.ini b/network/digit_web/settings.ini deleted file mode 100644 index 00ffa1fd..00000000 --- a/network/digit_web/settings.ini +++ /dev/null @@ -1,13 +0,0 @@ -; one app settings - -[application] -name=digit_web -description=Web server, shows 5 digits as images -path = network/digit_web -version = 1.7 -uuid=8a3e1bb6-71d5-4ee7-8023-4559c578c080 - -[web_server] -; port cannot be less than 1024 on CP router, and avoid 8001 & 8080 -host_port=9001 -start_count=10934 diff --git a/network/digit_web/web_server.py b/network/digit_web/web_server.py deleted file mode 100644 index 678cdd80..00000000 --- a/network/digit_web/web_server.py +++ /dev/null @@ -1,208 +0,0 @@ -""" -A basic but complete echo server -""" -import threading -import time -from http.server import BaseHTTPRequestHandler, HTTPServer - -from cp_lib.app_base import CradlepointAppBase - -# avoid 8080, as the router may have service on it. -DEF_HOST_PORT = 9001 -DEF_HOST_IP = "" -DEF_START_COUNT = 1099 - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - my_server = WebServerThread('Digit_Web', app_base) - my_server.start() - - # we need to block the main thread here, because this sample is running - # a SECOND thread for the actual server. This makes no sense in a pure - # sample-code scenario, but doing it this way does allow you to - # import & run the class WebServerThread() from another demo app - # which requires multiple threads - such as my Counter demo which - # requires both a web server AND a JSON RPC server as 2 threads. - try: - while True: - time.sleep(15.0) - - except KeyboardInterrupt: - app_base.logger.info("Stopping Server, Key Board interrupt") - - return 0 - - -class WebServerThread(threading.Thread): - - def __init__(self, name, app_base): - """ - prep our thread, but do not start yet - - :param str name: name for the thread - :param CradlepointAppBase app_base: prepared resources: logger, etc - """ - threading.Thread.__init__(self, name=name) - - self.app_base = app_base - self.app_base.logger.info("started INIT") - - return - - def run(self): - """ - Now thread is being asked to start running - """ - if "web_server" in self.app_base.settings: - host_port = int(self.app_base.settings["web_server"].get( - "host_port", DEF_HOST_PORT)) - - host_ip = self.app_base.settings["web_server"].get( - "host_ip", DEF_HOST_IP) - - start_count = int(self.app_base.settings["web_server"].get( - "start_count", DEF_START_COUNT)) - else: - # we create, so WebServerRequestHandler can obtain - self.app_base.settings["web_server"] = dict() - - host_port = DEF_HOST_PORT - self.app_base.settings["web_server"]["host_port"] = host_port - - host_ip = DEF_HOST_IP - self.app_base.settings["web_server"]["host_ip"] = host_ip - - start_count = DEF_START_COUNT - - # push in the start count - self.app_base.put_user_data('counter', start_count) - - # we want on all interfaces - server_address = (host_ip, host_port) - - self.app_base.logger.info("Starting Server:{}".format(server_address)) - - self.app_base.logger.info("Running") - - httpd = HTTPServer(server_address, WebServerRequestHandler) - # set by singleton - pushes in any/all instances - WebServerRequestHandler.APP_BASE = self.app_base - - httpd.serve_forever() - - def please_stop(self): - """ - Now thread is being asked to start running - """ - raise NotImplementedError - - -class WebServerRequestHandler(BaseHTTPRequestHandler): - """ - - """ - - # a singleton to support pass-in of our settings and logger - APP_BASE = None - - START_LINES = '' +\ - 'The Count Is' +\ - '' - - IMAGE_LINES = '' - - END_LINES = '
' - - # images should be 190x380 pixels - IMAGES = { - '0': "sdigit_0.jpg", - '1': "sdigit_1.jpg", - '2': "sdigit_2.jpg", - '3': "sdigit_3.jpg", - '4': "sdigit_4.jpg", - '5': "sdigit_5.jpg", - '6': "sdigit_6.jpg", - '7': "sdigit_7.jpg", - '8': "sdigit_8.jpg", - '9': "sdigit_9.jpg", - '.': "sdigit_dot.jpg", - ' ': "sdigit_blank.jpg", - } - - PATH = "network/digit_web/" - - # def __init__(self): - # BaseHTTPRequestHandler.__init__(self) - # self.path = None - # return - - def do_GET(self): - - if self.path == "/": - self.path = "/counter.html" - - if self.APP_BASE is not None: - self.APP_BASE.logger.debug("Path={}".format(self.path)) - - try: - - mime_type = 'text/html' - send_reply = False - if self.path.endswith(".html"): - - # fetch the current value, which might have changed - count = "%5d" % int(self.APP_BASE.get_user_data('counter')) - - web_message = self.START_LINES - for ch in count: - web_message += self.IMAGE_LINES % self.IMAGES[ch] - web_message += self.END_LINES - web_message = bytes(web_message, "utf-8") - send_reply = True - - elif self.path.endswith(".jpg"): - mime_type = 'image/jpg' - f = open(self.PATH + self.path, 'rb') - web_message = f.read() - send_reply = True - - elif self.path.endswith(".ico"): - mime_type = 'image/x-icon' - f = open(self.PATH + self.path, 'rb') - web_message = f.read() - send_reply = True - - else: - raise IOError - - except IOError: - self.send_error(404, 'File Not Found: %s' % self.path) - return - - if send_reply: - # Send response status code - self.send_response(200) - - # Send headers - self.send_header('Content-type', mime_type) - self.end_headers() - - # Send message back to client - # Write content as utf-8 data - self.wfile.write(web_message) - - return - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/simple_web") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/network/send_email/__init__.py b/network/send_email/__init__.py deleted file mode 100644 index f5783fdd..00000000 --- a/network/send_email/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from network.send_email.send_email import send_one_email - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to send_one_email()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = send_one_email(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise diff --git a/network/send_email/send_email.py b/network/send_email/send_email.py deleted file mode 100644 index 2b306693..00000000 --- a/network/send_email/send_email.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Send a single email -""" -from cp_lib.app_base import CradlepointAppBase -from cp_lib.cp_email import cp_send_email - - -def send_one_email(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - if "send_email" not in app_base.settings: - raise ValueError("settings.ini requires [send_email] section") - - local_settings = dict() - # we default to GMAIL, assume this is for testing - local_settings['smtp_url'] = app_base.settings["send_email"].get( - "smtp_url", 'smtp.gmail.com') - local_settings['smtp_port'] = int(app_base.settings["send_email"].get( - "smtp_port", 587)) - - for value in ('username', 'password', 'email_to', 'email_from'): - if value not in app_base.settings["send_email"]: - raise ValueError( - "settings [send_email] section requires {} data".format(value)) - # assume all are 'strings' - no need for INT - local_settings[value] = app_base.settings["send_email"][value] - - local_settings['subject'] = app_base.settings["send_email"].get( - "subject", "test-Subject") - local_settings['body'] = app_base.settings["send_email"].get( - "body", "test-body") - - app_base.logger.debug("Send Email To:({})".format( - local_settings['email_to'])) - result = cp_send_email(local_settings) - - app_base.logger.debug("result({})".format(result)) - - return result - -# Required keys -# ['smtp_tls] = T/F to use TLS, defaults to True -# ['smtp_url'] = URL, such as 'smtp.gmail.com' -# ['smtp_port'] = TCP port like 587 - be careful, as some servers have more -# than one, with the number defining the security demanded. -# ['username'] = your smtp user name (often your email acct address) -# ['password'] = your smtp acct password -# ['email_to'] = the target email address, as str or list -# ['subject'] = the email subject - -# Optional keys -# ['email_from'] = the from address - any smtp server will ignore, and force -# this to be your user/acct email address; def = ['username'] -# ['body'] = the email body; def = ['subject'] - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/send_email") - - _result = send_one_email(my_app) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - - sys.exit(_result) diff --git a/network/send_email/settings.ini b/network/send_email/settings.ini deleted file mode 100644 index 02ca9a90..00000000 --- a/network/send_email/settings.ini +++ /dev/null @@ -1,16 +0,0 @@ -[application] -name=send_email -description=send an email to GMAIL -path = network/send_email -version=1.8 -uuid=d204d898-c5cf-4f50-aecb-96500a71a7b6 - -[send_email] -username={your name}@gmail.com -password={put your password here} -smtp_url=smtp.gmail.com -smtp_port=587 -email_to={your name}@gmail.com -email_from={your name}@gmail.com -subject=This is a test! -body=Well, it looked good on paper! diff --git a/network/send_ping/__init__.py b/network/send_ping/__init__.py deleted file mode 100644 index 1248e738..00000000 --- a/network/send_ping/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from network.send_ping.send_ping import run_router_app - - -# this name RouterApp is CRITICAL - importlib will seek it! -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise diff --git a/network/send_ping/send_ping.py b/network/send_ping/send_ping.py deleted file mode 100644 index 0c7e83ad..00000000 --- a/network/send_ping/send_ping.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Issue a ping, via Router API control/ping -""" -from cp_lib.app_base import CradlepointAppBase -from cp_lib.cs_ping import cs_ping - - -# this name "run_router_app" is not important, reserved, or demanded -# - but must match below in __main__ and also in __init__.py -def run_router_app(app_base, ping_ip=None): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :param str ping_ip: the IP to ping - :return: - """ - if ping_ip is None: - # then try settings.ini - if "ping" in app_base.settings: - ping_ip = app_base.settings["ping"].get("ping_ip", '') - # else, just assume passed in value is best - - result = cs_ping(app_base, ping_ip) - return result - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/send_ping") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/network/send_ping/settings.ini b/network/send_ping/settings.ini deleted file mode 100644 index 8406d917..00000000 --- a/network/send_ping/settings.ini +++ /dev/null @@ -1,13 +0,0 @@ -[application] -name=send_ping -description=send a ping to an IP -path = network/send_ping -version=1.11 -uuid=db946fe9-fb7e-42b1-8589-123ff698b67e - -[ping] -; this can be IP or DNS name -; ping_ip=www.google.com -; ping_ip=192.168.115.6 -ping_ip=192.168.115.6 -ping_count=4 diff --git a/network/simple_web/README.md b/network/simple_web/README.md deleted file mode 100644 index 43a63230..00000000 --- a/network/simple_web/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# directory: ./network/simple_web -## Router App/SDK sample applications - -A most basic web server, using the standard Python 3 "http.server" module. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: web_server.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [web_server]: - -* host_port=9001, define the listening port, which on Cradlepoint Router -SDK must be greater than 1024 due to permissions. -Also, avoid 8001 or 8080, as router may be using already. - -* host_ip=192.168.0.1, limits the interface used. -Normally, you can omit and server will work on ALL interfaces - -host_ip will == "". -However, you might want to limit to local LAN, which means the interface -your router offers DHCP to local clients. - -* message=Hello from Cradlepoint Router!, put any UTF8 message here diff --git a/network/simple_web/__init__.py b/network/simple_web/__init__.py deleted file mode 100644 index fe957482..00000000 --- a/network/simple_web/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from network.simple_web.web_server import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/network/simple_web/settings.ini b/network/simple_web/settings.ini deleted file mode 100644 index e03a4857..00000000 --- a/network/simple_web/settings.ini +++ /dev/null @@ -1,14 +0,0 @@ -; one app settings - -[application] -name=simple_web -description=Basic Web server, with single fixed page -path = network/simple_web -version = 1.0 -uuid=fbf3522a-83b8-4901-97c9-067772d9993c - -[web_server] -; port cannot be less than 1024 on CP router -host_port=9001 -; host_ip=192.168.1.1 -message=Hello from Cradlepoint Router! diff --git a/network/simple_web/web_server.py b/network/simple_web/web_server.py deleted file mode 100644 index 3c17f067..00000000 --- a/network/simple_web/web_server.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -A basic but complete echo server -""" - -from http.server import BaseHTTPRequestHandler, HTTPServer - -from cp_lib.app_base import CradlepointAppBase - -# avoid 8080, as the router may have servcie on it. -DEF_HOST_PORT = 9001 -DEF_HOST_IP = "" -DEF_WEB_MESSAGE = "Hello World" - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - if "web_server" in app_base.settings: - host_port = int(app_base.settings["web_server"].get( - "host_port", DEF_HOST_PORT)) - - host_ip = app_base.settings["web_server"].get( - "host_ip", DEF_HOST_IP) - - web_message = app_base.settings["web_server"].get( - "message", DEF_WEB_MESSAGE) - else: - # we create, so WebServerRequestHandler can obtain - app_base.settings["web_server"] = dict() - - host_port = DEF_HOST_PORT - app_base.settings["web_server"]["host_port"] = host_port - - host_ip = DEF_HOST_IP - app_base.settings["web_server"]["host_ip"] = host_ip - - web_message = DEF_WEB_MESSAGE - app_base.settings["web_server"]["message"] = web_message - - # we want on all interfaces - server_address = (host_ip, host_port) - - app_base.logger.info("Starting Server:{}".format(server_address)) - app_base.logger.info("Web Message is:{}".format(web_message)) - - httpd = HTTPServer(server_address, WebServerRequestHandler) - # set by singleton - pushes in any/all instances - WebServerRequestHandler.APP_BASE = app_base - - try: - httpd.serve_forever() - - except KeyboardInterrupt: - app_base.logger.info("Stopping Server, Key Board interrupt") - - return 0 - - -class WebServerRequestHandler(BaseHTTPRequestHandler): - """ - - """ - - # a singleton to support pass-in of our settings and logger - APP_BASE = None - - def do_GET(self): - - if self.APP_BASE is not None: - self.APP_BASE.logger.info("Request from :{}".format( - self.address_string())) - web_message = self.APP_BASE.settings["web_server"]["message"] - - else: - web_message = DEF_WEB_MESSAGE - - # Send response status code - self.send_response(200) - - # Send headers - self.send_header('Content-type', 'text/html') - self.end_headers() - - # Send message back to client - # Write content as utf-8 data - self.wfile.write(bytes(web_message, "utf8")) - return - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/simple_web") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/network/tcp_echo/__init__.py b/network/tcp_echo/__init__.py deleted file mode 100644 index 603cea04..00000000 --- a/network/tcp_echo/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from network.tcp_echo.tcp_echo import tcp_echo_server - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - - self.logger.debug("__init__ chaining to tcp_echo_server()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = tcp_echo_server(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/network/tcp_echo/settings.ini b/network/tcp_echo/settings.ini deleted file mode 100644 index d6a1872f..00000000 --- a/network/tcp_echo/settings.ini +++ /dev/null @@ -1,11 +0,0 @@ -; one app settings - -[application] -name=tcp_echo -description=Basic TCP echo server and client -path = network/tcp_echo -uuid = 7042c8fd-fe7a-4846-aed1-e3f8d6a1c92a -version = 1.10 - -[tcp_echo] -host_port = 9999 diff --git a/network/tcp_echo/tcp_echo.py b/network/tcp_echo/tcp_echo.py deleted file mode 100644 index 587ca75f..00000000 --- a/network/tcp_echo/tcp_echo.py +++ /dev/null @@ -1,279 +0,0 @@ -""" -A basic but complete echo server -""" - -import socket -import time -import gc - -from cp_lib.app_base import CradlepointAppBase - -""" -Notes for tcp_echo_server and tcp_echo_client - -Anytime your code access an external resource or even internet-based server, -be prepared for the unexpected! - -Common socket error reasons are shown here: - https://www.python.org/dev/peps/pep-3151/#common-errnos-with-socket-error - -BIND ERROR note: - Your code is attempting to obtain and lock an exclusive resource. That - attempt might fail for various reasons - the most common one is that - another program/task ALREADY has locked that resource. In fact, it might - even be a second copy of your own program running! While this sample - merely exits, realistic server code could delay (use time.sleep()) for a - few minutes, then try again. Still, feed back to users is critical, - because if nothing changes ... nothing CHANGES. - - A second common error will be that Linux (such as used by Cradlepoint - routers) does not allow non-privileged programs to open server sockets - on ports lower than 1024. This script simulates this on Windows by - manually raising an exception. - TODO - what does Linux do? - - Example trace on a Win32 computer, when bind() fails due to resource - ALREADY being used/locked. - tcp_echo - INFO - Preparing to wait on TCP socket 9999 - tcp_echo - ERROR - socket.bind() failed - [WinError 10048] Only one - usage of each socket address (protocol/network - address/port) is normally permitted - tcp_echo - ERROR - Exiting, status code is -1 - -BYTES, STR, UTF8 note: - When looking on the internet for answers or code samples, be careful - to seek Python 3 examples! A big change in Python 3, is that all strings - now support UNICODE, which defaults to UTF8. UTF8 allows strings to - include foreign language symbols, such as accent marks in European - languages, or even direct Chinese (like å, δ, or 語). - - See https://docs.python.org/3/howto/unicode.html - - But the key importance for Cradlepoint router development, is that both - the SOCKET and the PYSERIAL modules recv/send bytes() objects, not str() - objects! So for example, the line "sock.send('Hello, world')" will throw - an exception because the SOCKET module works with "bytes" objects, not - "str" objects. The trivial solution for string constants - is to define them as b'Hello, world', not 'Hello, world'! - - To convert types of existing variable data: - new_bytes_thing = string_thing.encode() # def x.encode(encoding='utf-8') - new_string_thing = bytes_thing.decode() # def x.decode(encoding='utf-8') - -CLOSE ERROR note: - It is best-practice to always CLOSE your socket when you know it is - "going away". In this sample, this step is not technically required, - because when Python exits the routine and variable 'sock' goes out of - scope, Python will close the socket. However, by explicitly closing it - yourself, you are reminding viewers that the socket is being discarded. - An empty try/except OSError/pass wrapper ignore error conditions where - the socket.close() would fail due to other error situations - -CONNECT ERROR note: - Your code is attempting to link to a remote resource, which may not be - accessible, or not accepting connections. While this sample merely exits, - realistic client code could delay (use time.sleep()) for a few minutes, - then try again. Still, feed back to users - is critical, because if nothing changes ... nothing CHANGES. - - Example trace on a Win32 computer, when connect() fails due to resource - ALREADY being used. - tcp_echo - INFO - Preparing to connect on TCP socket 9999 - tcp_echo - ERROR - socket.connect() failed - [WinError 10061] No - connection could be made because the target - machine actively refused it - tcp_echo - ERROR - Exiting, status code is -1 - -KEEP ALIVE note: - For historical reasons, TCP sockets default to not use keepalive, which - is a means to detect when an idle peer "has gone away". On cellular, this - is pretty much guaranteed to happen at least once a day - if not after - 5 minutes of being idle! Without TCP keepalive, a server socket can be - idle, and the memory resources used held FOREVER (as in years and years, - or until the Cradlepoint router reboots!) - - Use this line: sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - While many online samples show ways to define the timing behavior, - however this is very OS dependant, plus on many smaller OS product, the - TCP KeepAlive settings are global, so changing in one applications - changes the timing for ALL applications. A better solution is to confirm - that the default/common TCP Keepalive settings (probe count and time - delays) are set to reasonable values for cellular. - -MEMORY note: - As Python variables are created and deleted, Python manages a list of - "garbage", which is unused data that has not yet been freed. Python does - this, because proving data is unused takes time - for example, if I - delete a string variable of the value "Hello World", that actual data - MIGHT be shared with multiple variables. Therefore Python caches the - object as "possibly free", and using various estimates, Python - periodically batch processes the "possibly free" collection list. - - While in general you should allow Python to do its job, when you have - an object which is known to be large AND no longer used, manually - running memory cleanup is safest on a small embedded system. Situations - to consider manual garbage collection are: - 1) when a client socket closes, which is especially critical if the - client might repeatedly reconnect. For example, each socket (with - buffers) could contain up to 1/4 MB of memory - 2) when a child thread exists, as the thread also could consume a large - collection of dead memory objects - 3) after a large imported object, as as when an XML file has been parsed - into memory. For example, an XML text file of 10K may consume over - 1MB of RAM after being parsed into memory. - -""" - - -def tcp_echo_server(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - # logger.debug("Settings({})".format(sets)) - - host_ip = 'localhost' - host_port = 9999 - buffer_size = 1024 - - if "tcp_echo" in app_base.settings: - host_ip = app_base.settings["tcp_echo"].get("host_ip", '') - host_port = int(app_base.settings["tcp_echo"].get("host_port", 9999)) - buffer_size = int(app_base.settings["tcp_echo"].get("buffer_size", - 1024)) - - while True: - # define the socket resource, including the type (stream == "TCP") - app_base.logger.info("Preparing TCP socket %d" % host_port) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # attempt to actually lock resource, which may fail if unavailable - # (see BIND ERROR note) - try: - sock.bind((host_ip, host_port)) - except OSError as msg: - app_base.logger.error("socket.bind() failed - {}".format(msg)) - - # technically, Python will close when 'sock' goes out of scope, - # but be disciplined and close it yourself. Python may warning - # you of unclosed resource, during runtime. - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors - # are likely permanent. - return -1 - - # only allow 1 client at a time - sock.listen(1) - - while True: - # loop forever - app_base.logger.info("Waiting on TCP socket %d" % host_port) - client, address = sock.accept() - app_base.logger.info("Accepted connection from {}".format(address)) - - # for cellular, ALWAYS enable TCP Keep Alive (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # set non-blocking so we can do a manual timeout (use of select() - # is better ... but that's another sample) - # client.setblocking(0) - - while True: - app_base.logger.debug("Waiting to receive data") - data = client.recv(buffer_size) - # data is type() bytes, to echo we don't need to convert - # to str to format or return. - app_base.logger.debug("See data({})".format(data)) - if data: - client.send(data) - else: - break - - time.sleep(1.0) - - app_base.logger.info("Client disconnected") - client.close() - - # since this server is expected to run on a small embedded system, - # free up memory ASAP (see MEMORY note) - del client - gc.collect() - - return 0 - - -def tcp_echo_client(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - - host_ip = 'localhost' - host_port = 9999 - buffer_size = 1024 - - if "tcp_echo" in app_base.settings: - host_ip = app_base.settings["tcp_echo"].get("host_ip", 'localhost') - host_port = int(app_base.settings["tcp_echo"].get("host_port", 9999)) - buffer_size = int(app_base.settings["tcp_echo"].get("buffer_size", - 1024)) - - # allocate the socket resource, including the type (stream == "TCP") - app_base.logger.info("Preparing to connect on TCP socket %d" % host_port) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # for cellular, ALWAYS enable TCP Keep Alive - (see KEEP ALIVE note) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # attempt to actually lock the resource, which may fail if unavailable - # (see CONNECT ERROR note) - try: - sock.connect((host_ip, host_port)) - except OSError as msg: - app_base.logger.error("socket.connect() failed - {}".format(msg)) - - # Python will close when variable 'sock' goes out of scope - # (see CLOSE ERROR note) - try: - sock.close() - except OSError: - pass - - # we exit, because if we cannot secure the resource, the errors are - # likely permanent. - return -1 - - # note: sock.send('Hello, world') will fail, because Python 3 socket() - # handles BYTES (see BYTES and STR note) - data = b'Hello, world' - app_base.logger.debug("Request({})".format(data)) - sock.send(data) - data = sock.recv(buffer_size) - app_base.logger.debug("Response({})".format(data)) - sock.close() - - time.sleep(1.0) - - return 0 - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("network/tcp_echo") - - if len(sys.argv) == 1: - # if no cmdline args, we assume SERVER - _result = tcp_echo_server(my_app) - else: - _result = tcp_echo_client(my_app) - - my_app.logger.info("Exiting, status code is {}".format(_result)) - - sys.exit(_result) diff --git a/ping/cs.py b/ping/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/ping/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/ping/install.sh b/ping/install.sh new file mode 100644 index 00000000..f18f009b --- /dev/null +++ b/ping/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION ping on:" >> install.log +date >> install.log diff --git a/ping/package.ini b/ping/package.ini new file mode 100644 index 00000000..a0f5b1bb --- /dev/null +++ b/ping/package.ini @@ -0,0 +1,11 @@ +[ping] +uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f +vendor=Cradlepoint +notes=Router Ping Reference Application +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/ping/ping.py b/ping/ping.py new file mode 100644 index 00000000..ccfb7a6e --- /dev/null +++ b/ping/ping.py @@ -0,0 +1,65 @@ +''' +This application will ping an address and log the results +''' +import sys +import argparse +import time +import json +import cs + +APP_NAME = 'ping' + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + ping_data = { + 'host': 'www.google.com', # Can also be an IP address + 'size': 64 + } + + result = cs.CSClient().put('/control/ping/start', ping_data) + cs.CSClient().log(APP_NAME, 'Start ping: {}'.format(result)) + + done = False + ping_results = [] + while not done: + time.sleep(1) + ping_data = json.loads(cs.CSClient().get('/control/ping')) + # Need to collect the results as it is cleared when read. + result = ping_data['result'] + + if result != '': + lines = result.split('\n') + ping_results.extend(lines) + + status = ping_data['status'] + + if status == 'done' or status == 'error': + done = True + + # Now that the ping is done, log the results + for line in ping_results: + cs.CSClient().log(APP_NAME, 'Ping Results: {}'.format(line)) + + elif command == 'stop': + # Nothing on stop + pass + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/ping/start.sh b/ping/start.sh new file mode 100644 index 00000000..b23a9676 --- /dev/null +++ b/ping/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ping.py start diff --git a/ping/stop.sh b/ping/stop.sh new file mode 100644 index 00000000..17061e02 --- /dev/null +++ b/ping/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython ping.py stop diff --git a/power_gpio/cs.py b/power_gpio/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/power_gpio/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/power_gpio/install.sh b/power_gpio/install.sh new file mode 100644 index 00000000..891acbf8 --- /dev/null +++ b/power_gpio/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION power_gpio on:" >> install.log +date >> install.log diff --git a/power_gpio/package.ini b/power_gpio/package.ini new file mode 100644 index 00000000..c3ea9490 --- /dev/null +++ b/power_gpio/package.ini @@ -0,0 +1,11 @@ +[power_gpio] +uuid=79be164a-aa55-40aa-9ab3-13ffa889ca01 +vendor=Cradlebox +notes=Power Connector GPIO Reference Application +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/power_gpio/power_gpio.py b/power_gpio/power_gpio.py new file mode 100644 index 00000000..8bdd2655 --- /dev/null +++ b/power_gpio/power_gpio.py @@ -0,0 +1,66 @@ +""" +Query the 2x2 power connector GPIO +""" +import json +import argparse +import cs + +APP_NAME = "power_gpio" + + +def run_router_app(): + """ + Read the Power Connector GPIO input and output + """ + + # confirm we are running on 900/950 or 1100/1150 + result = json.loads(cs.CSClient().get("status/product_info/product_name")) + if "IBR900" in result or "IBR950" in result: + input_name = "status/gpio/CONNECTOR_INPUT" + output_name = "status/gpio/CONNECTOR_OUTPUT" + + elif "IBR1100" in result or "IBR1150" in result: + input_name = "status/gpio/CGPIO_CONNECTOR_INPUT" + output_name = "status/gpio/CGPIO_CONNECTOR_OUTPUT" + + else: + cs.CSClient().log(APP_NAME, "Inappropriate Product:{} - aborting.".format(result)) + return + + result_in = json.loads(cs.CSClient().get(input_name)) + result_out = json.loads(cs.CSClient().get(output_name)) + + cs.CSClient().log(APP_NAME, "Product Model is: {}".format(result)) + cs.CSClient().log(APP_NAME, "GPIO 2x2: {} = {}".format(input_name, result_in)) + cs.CSClient().log(APP_NAME, "GPIO 2x2: {} = {}".format(output_name, result_out)) + + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + run_router_app() + + elif command == 'stop': + # Nothing on stop + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/power_gpio/start.sh b/power_gpio/start.sh new file mode 100644 index 00000000..592d5264 --- /dev/null +++ b/power_gpio/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython power_gpio.py start diff --git a/power_gpio/stop.sh b/power_gpio/stop.sh new file mode 100644 index 00000000..f6c692d5 --- /dev/null +++ b/power_gpio/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython power_gpio.py stop diff --git a/py33.bat b/py33.bat deleted file mode 100644 index 8e134637..00000000 --- a/py33.bat +++ /dev/null @@ -1,5 +0,0 @@ -set PATH=%PATH%;C:\Python33 - -d: -cd \root -set PYTHONPATH=D:\root; diff --git a/sdk_settings.ini b/sdk_settings.ini new file mode 100644 index 00000000..872f4be5 --- /dev/null +++ b/sdk_settings.ini @@ -0,0 +1,5 @@ +[sdk] +app_name=hello_world +dev_client_ip=192.168.0.1 +dev_client_username=admin +dev_client_password=44224267 diff --git a/send_alert/cs.py b/send_alert/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/send_alert/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/send_alert/install.sh b/send_alert/install.sh new file mode 100644 index 00000000..0a1296e0 --- /dev/null +++ b/send_alert/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION send_alert on:" >> install.log +date >> install.log diff --git a/send_alert/package.ini b/send_alert/package.ini new file mode 100644 index 00000000..fc13b213 --- /dev/null +++ b/send_alert/package.ini @@ -0,0 +1,11 @@ +[send_alert] +uuid=9126bf4f-b85f-459f-bbae-439c8ff1e838 +vendor=Cradlebox +notes=Router Send ECM Alert Reference Application +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/send_alert/send_alert.py b/send_alert/send_alert.py new file mode 100644 index 00000000..f45d1754 --- /dev/null +++ b/send_alert/send_alert.py @@ -0,0 +1,46 @@ +''' +This application will send an alert to the ECM when the +application is started and stopped. The alert must be +setup in the ECM. This is a Router Apps, Custom Alert. + +The CSClient function to send an alert is: + + cs.CSClient().alert(name, value) + :param str name - The 'Alert:' field for the alert in ECM. + :param str value - The 'Message:' field for the alert in ECM. +''' + +import sys +import argparse +import cs + +APP_NAME = 'send_alert' + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + cs.CSClient().log(APP_NAME, 'Sent ECM alert that app was started.') + cs.CSClient().alert(APP_NAME, 'Application has been started') + + elif command == 'stop': + cs.CSClient().log(APP_NAME, 'Sent ECM alert that app was stopped.') + cs.CSClient().alert(APP_NAME, 'Application has been stopped') + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exception: {}'.format(APP_NAME, command, e)) + raise + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/send_alert/start.sh b/send_alert/start.sh new file mode 100644 index 00000000..6b234d85 --- /dev/null +++ b/send_alert/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython send_alert.py start diff --git a/send_alert/stop.sh b/send_alert/stop.sh new file mode 100644 index 00000000..0b57469a --- /dev/null +++ b/send_alert/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython send_alert.py stop diff --git a/send_to_server/cs.py b/send_to_server/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/send_to_server/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/send_to_server/install.sh b/send_to_server/install.sh new file mode 100644 index 00000000..9015d86d --- /dev/null +++ b/send_to_server/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION send_to_server on:" >> install.log +date >> install.log diff --git a/send_to_server/package.ini b/send_to_server/package.ini new file mode 100644 index 00000000..275957f9 --- /dev/null +++ b/send_to_server/package.ini @@ -0,0 +1,11 @@ +[send_to_server] +uuid=82583a58-108e-4ac7-80e2-b0bba753330e +vendor=Cradlebox +notes=Sends data to a server via http post. +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/send_to_server/send_to_server.py b/send_to_server/send_to_server.py new file mode 100644 index 00000000..3ab4081d --- /dev/null +++ b/send_to_server/send_to_server.py @@ -0,0 +1,89 @@ +''' +Gets the '/status' from the reouter config store and send it +to a test server. +''' + +import sys +import argparse +import datetime +import urllib.request +import urllib.parse +import json +import time +import cs + +APP_NAME = 'send_to_server' + + +def post_to_server(): + try: + # The tree item to get from the router config store + tree_item = '/status' + cs.CSClient().log(APP_NAME, "get {}".format(tree_item)) + start_time = datetime.datetime.now() + + # Get the item from the router config store + tree_data = cs.CSClient().get(tree_item) + cs.CSClient().log(APP_NAME, "{}: {}".format(tree_item, tree_data)) + + time_to_get = datetime.datetime.now() - start_time + encode_start_time = datetime.datetime.now() + + # Convert the tree_data string to a json object (i.e. dictionary) + tree_data = json.loads(tree_data) + + # URL encode the tree_data + params = urllib.parse.urlencode(tree_data) + + # UTF-8 encode the URL encoded data + params = params.encode('utf-8') + + time_to_encode = datetime.datetime.now() - encode_start_time + send_to_server_start_time = datetime.datetime.now() + + # Send a post request to a test server. It will respond with the data sent + # in the request + response = urllib.request.urlopen("http://httpbin.org/post", params) + end_time = datetime.datetime.now() + + # Log the response code and the processing timing information. + cs.CSClient().log(APP_NAME, "data sent, http response code: {}".format(response.code)) + cs.CSClient().log(APP_NAME, 'Time to get data from router config store: {}'.format(time_to_get)) + cs.CSClient().log(APP_NAME, 'Time to urlencode data: {}'.format(time_to_encode)) + cs.CSClient().log(APP_NAME, 'Time to get reply from server: {}'.format(end_time - send_to_server_start_time)) + cs.CSClient().log(APP_NAME, 'Time to get and send data in post request: {}'.format(end_time - start_time)) + + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Something went wrong! exceptions: {}'.format(e)) + raise + + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + post_to_server() + + elif command == 'stop': + # Do nothing + pass + except: + e = sys.exc_info()[0] + cs.CSClient().log(APP_NAME, 'Problem with {} on {}! exceptions: {}'.format(APP_NAME, command, e)) + raise + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/send_to_server/start.sh b/send_to_server/start.sh new file mode 100644 index 00000000..0b6ac4ea --- /dev/null +++ b/send_to_server/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython send_to_server.py start diff --git a/send_to_server/stop.sh b/send_to_server/stop.sh new file mode 100644 index 00000000..17e4bed0 --- /dev/null +++ b/send_to_server/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython send_to_server.py stop diff --git a/serial_echo/cs.py b/serial_echo/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/serial_echo/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/serial_echo/install.sh b/serial_echo/install.sh new file mode 100644 index 00000000..40f3f9c6 --- /dev/null +++ b/serial_echo/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION serial_echo on:" >> install.log +date >> install.log diff --git a/serial_echo/package.ini b/serial_echo/package.ini new file mode 100644 index 00000000..3f405239 --- /dev/null +++ b/serial_echo/package.ini @@ -0,0 +1,11 @@ +[serial_echo] +uuid=98793e88-a2a4-40d6-9c1c-6845d79d3f1b +vendor=Cradlepoint +notes=Simple echo server, which echos any lines received. +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/serial_echo/serial_echo.py b/serial_echo/serial_echo.py new file mode 100644 index 00000000..b70baeb5 --- /dev/null +++ b/serial_echo/serial_echo.py @@ -0,0 +1,138 @@ +""" +Serial echo + +Wait for data to enter the serial port, then echo back out. +Data will be processed byte by byte, although you could edit the +sample code to wait for an end-of-line character. + +""" + +import json +import serial +import argparse +import cs + +APP_NAME = 'serial_echo' + +# set to None to disable, or set to bytes to send +ASK_ARE_YOU_THERE = b"u there?" + + +def run_router_app(): + # confirm we are running on an 1100/1150, 900/950, or 600/650. result should be like "IBR1100LPE" + result = json.loads(cs.CSClient().get("status/product_info/product_name")) + if "IBR1100" in result or "IBR1150" in result or \ + "IBR900" in result or "IBR950" in result or \ + "IBR600" in result or "IBR650" in result: + cs.CSClient().log(APP_NAME, "Product Model is good:{}".format(result)) + else: + cs.CSClient().log(APP_NAME, + "Inappropriate Product:{} - aborting.".format(result)) + return -1 + + port_name = 9600 + baud_rate = '/dev/ttyS1' + + # see if port is a digit? + if port_name[0].isdecimal(): + port_name = int(port_name) + + old_pyserial = serial.VERSION.startswith("2.6") + + message = "Starting serial echo on {0}, baud={1}".format(port_name, + baud_rate) + cs.CSClient().log(APP_NAME, message) + + try: + ser = serial.Serial(port_name, baudrate=baud_rate, bytesize=8, + parity='N', stopbits=1, timeout=1, + xonxoff=0, rtscts=0) + + except serial.SerialException: + cs.CSClient().log(APP_NAME, "ERROR: Open failed!") + raise + + # start as None to force at least 1 change + dsr_was = None + cts_was = None + + try: + while True: + try: + data = ser.read(size=1) + except KeyboardInterrupt: + cs.CSClient().log(APP_NAME, + "WARNING: Keyboard Interrupt - asked to quit") + break + + if len(data): + cs.CSClient().log(APP_NAME, str(data)) + ser.write(data) + elif ASK_ARE_YOU_THERE is not None: + ser.write(ASK_ARE_YOU_THERE) + # else: + # app_base.logger.debug(b".") + + if old_pyserial: + # as of May-2016/FW 6.1, this is PySerial v2.6, so it uses + # the older style control signal access + if dsr_was != ser.getDSR(): + # do this 'get' twice to handle first pass as None + dsr_was = ser.getDSR() + cs.CSClient().log(APP_NAME, + "DSR changed to {}, setting DTR".format(dsr_was)) + ser.setDTR(dsr_was) + + if cts_was != ser.getCTS(): + cts_was = ser.getCTS() + cs.CSClient().log(APP_NAME, + "CTS changed to {}, setting RTS".format(cts_was)) + ser.setRTS(cts_was) + else: + if dsr_was != ser.dsr: + dsr_was = ser.dsr + cs.CSClient().log(APP_NAME, + "DSR changed to {}, setting DTR".format(dsr_was)) + ser.dtr = dsr_was + + if cts_was != ser.cts: + cts_was = ser.cts + cs.CSClient().log(APP_NAME, + "CTS changed to {}, setting RTS".format(cts_was)) + ser.rts = cts_was + + # if you lose the serial port - like disconnected, then + # ser.getDSR() will throw OSError #5 Input/Output error + + finally: + ser.close() + + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + run_router_app() + + elif command == 'stop': + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/serial_echo/start.sh b/serial_echo/start.sh new file mode 100644 index 00000000..634bc7cb --- /dev/null +++ b/serial_echo/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython serial_echo.py start diff --git a/serial_echo/stop.sh b/serial_echo/stop.sh new file mode 100644 index 00000000..97162200 --- /dev/null +++ b/serial_echo/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython serial_echo.py stop diff --git a/serial_port/README.md b/serial_port/README.md deleted file mode 100644 index bfd70044..00000000 --- a/serial_port/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Router App/SDK sample applications - SERIAL PORT samples - -## Directory list_ports - -Shows how to use your own MAIN.PY, which is run as the main app of the SDK. -The code loops, sending a "Hello World" message to a Syslog server. - -Because you control the full application, you must manage the Syslog output -and settings yourself. - -## Directory modbus_poll - -Expands the function in "hello_world" sample, using the stock -CradlepointAppBase class, which adds the following services: -* self.logger = a Syslog logging module -* self.settings = finds/loads your settings.json (made from settings.ini) -* self.cs_client = read/write the Cradlepoint status/config trees - -## Directory modbus_simple_bridge - -Expands the function in "hello_world_app" sample, adding a sub-task -to do the "Hello World" Syslog message. -Shows how to spawn, as well as stop (kill/join) the sub-task. - -## Directory serial_echo - -Shows basic serial port read/write. -Opens a serial port, as defined in settings.ini -(can be built-in port on IBR11X0 or USB-Serial) -then echos any bytes seen. - diff --git a/serial_port/list_ports/README.md b/serial_port/list_ports/README.md deleted file mode 100644 index ed0e2a99..00000000 --- a/serial_port/list_ports/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# directory: ./serial_port/list_ports -## Router App/SDK sample applications - -This sample code runs through one check, then exits. -Assuming you have 'restart' true in your settings.ini file, then -the code restarts forever. - -Based on the model of router you have, it checks to see if the ports below -exist, can be opened, and the name of the port written to it. - -Real Physical ports: - -* /dev/ttyS1 (only on models such as IBR1100) -* /dev/ttyS2 (normally will fail/not exist) - -USB serial ports: - -* /dev/ttyUSB0 -* /dev/ttyUSB1 -* /dev/ttyUSB2 -* /dev/ttyUSB3 -* /dev/ttyUSB4 - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: list_ports.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [list_ports]: - -* probe_physical = True, set False to NOT probe real physical serial ports. -On models without physical ports, this setting is ignored. - -* probe_usb = True, set False to NOT probe for USB serial ports. - -* write_name = True, set False to NOT send out the port name, which is -sent to help you identify between multiple ports. - -## Testing USB-serial devices - -Most USB-serial devices with an FTDI-chipset can be used. Some specific -products known to work are shown here: - -* -* -* diff --git a/serial_port/list_ports/__init__.py b/serial_port/list_ports/__init__.py deleted file mode 100644 index a8a8df3a..00000000 --- a/serial_port/list_ports/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from serial_port.list_ports.list_ports import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/serial_port/list_ports/list_ports.py b/serial_port/list_ports/list_ports.py deleted file mode 100644 index 3a9bba03..00000000 --- a/serial_port/list_ports/list_ports.py +++ /dev/null @@ -1,177 +0,0 @@ -import serial -import sys - -import cp_lib.hw_status -from cp_lib.app_base import CradlepointAppBase -from cp_lib.parse_data import parse_boolean - -DEF_PROBE_PHYSICAL = True -DEF_PROBE_USB = True -DEF_WRITE_NAME = False -# this exists on most, but is for internal use. -IGNORE_TTYS0 = True - -PORT_LIST_PHYSICAL = (1, 2) -PORT_LIST_USB = (0, 1, 2, 3, 4) - - -def run_router_app(app_base): - """ - Do the probe/check of - - :param CradlepointAppBase app_base: the prepared resources: logger, - cs_client, settings, etc - :return: - """ - - # as of Mat-2016/FW=6.1, PySerial is version 2.6 (2.6-pre1) - app_base.logger.info("serial.VERSION = {}.".format(serial.VERSION)) - - probe_physical = DEF_PROBE_PHYSICAL - probe_usb = DEF_PROBE_USB - write_name = DEF_WRITE_NAME - - app_key = "list_ports" - if app_key in app_base.settings: - if "probe_physical" in app_base.settings[app_key]: - probe_physical = parse_boolean( - app_base.settings[app_key]["probe_physical"]) - if "probe_usb" in app_base.settings[app_key]: - probe_usb = parse_boolean( - app_base.settings[app_key]["probe_usb"]) - if "write_name" in app_base.settings[app_key]: - write_name = parse_boolean( - app_base.settings[app_key]["write_name"]) - - if cp_lib.hw_status.am_running_on_router(): - # then we are running on Cradlepoint Router: - - # probe_directory(app_base, "/dev") - port_list = [] - - # confirm we are running on an 1100/1150, result should be "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - name = "/dev/ttyS1" - app_base.logger.info( - "Product Model {} has 1 builtin port:{}".format( - result, name)) - port_list.append(name) - - elif result in ("IBR300", "IBR350"): - app_base.logger.warning( - "Product Model {} has no serial support".format(result)) - - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - if probe_physical: - # fixed ports - 1100 only? - if not IGNORE_TTYS0: - # only check S0 if 'requested' to, else ignore - name = "/dev/ttyS0" - if name not in port_list: - port_list.append(name) - - for port in PORT_LIST_PHYSICAL: - name = "/dev/ttyS%d" % port - if name not in port_list: - port_list.append(name) - - if probe_usb: - # try first 5 USB - for port in PORT_LIST_USB: - name = "/dev/ttyUSB%d" % port - if name not in port_list: - port_list.append(name) - - # cycle through and probe the desired ports - for name in port_list: - probe_serial(app_base, name, write_name) - - elif sys.platform == "win32": - # then handle Windows - - for index in range(1, 17): - name = "COM%d" % index - try: - ser = serial.Serial(name) - ser.close() - app_base.logger.info("Port({}) exists.".format(name)) - - except serial.SerialException: - app_base.logger.info("Port({}) didn't exist.".format(name)) - - else: - raise NotImplementedError( - "This sample only runs on CP Router or Windows") - - return 0 - - -def probe_serial(app_base, port_name, write_name=False): - """ - dump a directory in router FW - - :param CradlepointAppBase app_base: resources: logger, settings, etc - :param str port_name: the port name - :param bool write_name: if T, write out the name - """ - try: - ser = serial.Serial(port_name, dsrdtr=False, rtscts=False) - if write_name: - port_name += '\r\n' - ser.write(port_name.encode()) - app_base.logger.info("Port({}) exists.".format(port_name)) - - # as of Mat-2016/FW=6.1, PySerial is version 2.6 - # therefore .getDSR() works and .dsr does not! - try: - app_base.logger.info(" serial.dsr = {}.".format(ser.dsr)) - except AttributeError: - app_base.logger.info(" serial.dsr is not supported!") - - try: - app_base.logger.info(" serial.getDSR() = {}.".format(ser.getDSR())) - except AttributeError: - app_base.logger.info(" serial.getDSR() is not supported!") - - ser.close() - return True - - except (serial.SerialException, FileNotFoundError): - app_base.logger.info("Port({}) didn't exist.".format(port_name)) - return False - - -def probe_directory(app_base, base_dir): - """ - dump a directory in router FW - - :param CradlepointAppBase app_base: resources: logger, settings, etc - :param str base_dir: the directory to dump - """ - import os - - app_base.logger.debug("Dump Directory:{}".format(base_dir)) - result = os.access(base_dir, os.R_OK) - if result: - app_base.logger.debug("GOOD name:{}".format(base_dir)) - else: - app_base.logger.debug("BAD name:{}".format(base_dir)) - - if result: - result = os.listdir(base_dir) - for name in result: - app_base.logger.debug(" file:{}".format(name)) - return - -if __name__ == "__main__": - - my_app = CradlepointAppBase("serial_port/list_ports") - - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/serial_port/list_ports/settings.ini b/serial_port/list_ports/settings.ini deleted file mode 100644 index 49105509..00000000 --- a/serial_port/list_ports/settings.ini +++ /dev/null @@ -1,15 +0,0 @@ -; one app settings - -[application] -name=list_ports -description=Dump the Serial ports -path=serial_port.list_ports -restart=true -reboot=false -uuid=0268197b-1713-42d4-955f-25f04708ac21 -version=1.1 - -[list_ports] -probe_physical = True -probe_usb = True -write_name = False diff --git a/serial_port/modbus_poll/README.md b/serial_port/modbus_poll/README.md deleted file mode 100644 index 33f2fd6f..00000000 --- a/serial_port/modbus_poll/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# directory: ./serial_port/modbus_poll -## Router App/SDK sample applications - -Poll a single range of Modbus registers from an attached serial -Modbus/RTU PLC or slave device. The poll is repeated, in a loop. -The only output you'll see if via Syslog. - -If you need such a device, do an internet search for "modbus simulator', as -there are many available for free or low (shareware) cost. These run on a -computer, serving up data by direct or USB serial port. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: modbus_poll.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [modbus]: - -* port_name=???, define the serial port to use. Commonly this will be -/dev/ttyS1 or /dev/ttyUSB0 - -* baud_rate=9600, allows you to define a different baud rate. This sample -assumes the other settings are fixed at: bytesize=8, parity='N', stopbits=1, -and all flow control (XonXOff and HW) is off/disabled. -Edit the code if you need to change this. - -* register_start=0, the raw Modbus offset, so '0' and NOT 40001. -Permitted range is 0 to 65535 - -* register_count=4, the number of Holding Register to read. -The request function is fixed to 3, so read multiple holding registers. -The permitted count is 1 to 125 registers (16-bit words) - -* slave_address=1, the Modbus slave address, which must be in the range -from 1 to 255. Since Modbus/RTU is a multi-drop line, the slave -address is used to select 1 of many slaves. -For example, if a device is assigned the address 7, it will ignore all -requests with slave addresses other than 7. - -* poll_delay=15 sec, how often to repoll the device. A lone number (like 60) - is interpreted as seconds. However, it uses the CP library module - "parse_duration", so time tags such as 'sec', 'min, 'hr' can be used. diff --git a/serial_port/modbus_poll/__init__.py b/serial_port/modbus_poll/__init__.py deleted file mode 100644 index 6194f17f..00000000 --- a/serial_port/modbus_poll/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from serial_port.modbus_poll.modbus_poll import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "serial.serial_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to run_main()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/serial_port/modbus_poll/modbus_poll.py b/serial_port/modbus_poll/modbus_poll.py deleted file mode 100644 index 4b05c997..00000000 --- a/serial_port/modbus_poll/modbus_poll.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Serial echo -""" -import sys -import serial -import time - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.parse_duration import TimeDuration -from serial_port.modbus_poll.crc16 import calc_string - -DEF_BAUD_RATE = 9600 -DEF_PORT_NAME = "/dev/ttyS1" -DEF_REG_START = 0 -DEF_REG_COUNT = 1 -DEF_SLAVE_ADDRESS = 1 -DEF_POLL_DELAY = 5 - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return list: - """ - # confirm we are running on an 1100/1150, result should be "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150"): - app_base.logger.info("Product Model is good:{}".format(result)) - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - period = TimeDuration(DEF_POLL_DELAY) - - port_name = DEF_PORT_NAME - baud_rate = DEF_BAUD_RATE - register_start = DEF_REG_START - register_count = DEF_REG_COUNT - slave_address = DEF_SLAVE_ADDRESS - poll_delay = period.get_seconds() - - app_key = "modbus" - if app_key in app_base.settings: - if "port_name" in app_base.settings[app_key]: - port_name = app_base.settings[app_key]["port_name"] - if "baud_rate" in app_base.settings[app_key]: - baud_rate = int(app_base.settings[app_key]["baud_rate"]) - if "register_start" in app_base.settings[app_key]: - register_start = int(app_base.settings[app_key]["register_start"]) - if "register_count" in app_base.settings[app_key]: - register_count = int(app_base.settings[app_key]["register_count"]) - if "slave_address" in app_base.settings[app_key]: - slave_address = int(app_base.settings[app_key]["slave_address"]) - if "poll_delay" in app_base.settings[app_key]: - poll_delay = app_base.settings[app_key]["poll_delay"] - poll_delay = period.parse_time_duration_to_seconds(poll_delay) - - # see if port is a digit? - if port_name[0].isdecimal(): - port_name = int(port_name) - - # a few validation tests - if not 0 <= register_start <= 0xFFFF: - raise ValueError("Modbus start address must be between 0 & 0xFFFF") - if not 1 <= register_count <= 125: - raise ValueError("Modbus count must be between 1 & 125") - if not 1 <= slave_address <= 255: - raise ValueError("Modbus address must be between 1 & 125") - if poll_delay < 1: - raise ValueError("Poll delay most be 1 second or longer") - - poll_delay = float(poll_delay) - - # make a fixed Modbus 4x register read/poll - poll = bytes([slave_address, 0x03, - (register_start & 0xFF00) >> 8, register_start & 0xFF, - (register_count & 0xFF00) >> 8, register_count & 0xFF]) - crc = calc_string(poll) - app_base.logger.debug("CRC = %04X" % crc) - poll += bytes([crc & 0xFF, (crc & 0xFF00) >> 8]) - - app_base.logger.info( - "Starting Modbus/RTU poll {0}, baud={1}".format(port_name, baud_rate)) - app_base.logger.info( - "Modbus/RTU request is {0}".format(poll)) - - try: - ser = serial.Serial(port_name, baudrate=baud_rate, bytesize=8, - parity='N', stopbits=1, timeout=0.25, - xonxoff=0, rtscts=0) - - except serial.SerialException: - app_base.logger.error("Open failed!") - raise - - try: - while True: - - app_base.logger.info("Send poll") - ser.write(poll) - time.sleep(0.1) - - try: - response = ser.read(size=255) - except KeyboardInterrupt: - app_base.logger.warning( - "Keyboard Interrupt - asked to quit") - break - - if len(response): - app_base.logger.info( - "Modbus/RTU response is {0}".format(response)) - - else: - app_base.logger.error( - "no Modbus/RTU response") - - try: - time.sleep(poll_delay) - except KeyboardInterrupt: - app_base.logger.warning( - "Keyboard Interrupt - asked to quit") - break - - finally: - ser.close() - - return - - -if __name__ == "__main__": - my_app = CradlepointAppBase("serial/serial_echo") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/serial_port/modbus_poll/settings.ini b/serial_port/modbus_poll/settings.ini deleted file mode 100644 index 092bff09..00000000 --- a/serial_port/modbus_poll/settings.ini +++ /dev/null @@ -1,17 +0,0 @@ -[application] -name=modbus_poll -description=Poll a Modbus/RTU register from a PLC/slave -path=serial_port/modbus_poll -uuid=ca0a62bd-648e-4bbc-a915-5f67a477c82d -version=1.0 - -[modbus] -; port_name=/dev/ttyS1 -port_name=/dev/ttyUSB0 -; port_name=COM5 -baud_rate=9600 -; enter the raw Modbus offset, so '0' and NOT 40001 -register_start=0 -register_count=4 -slave_address=1 -poll_delay=15 sec diff --git a/serial_port/modbus_simple_bridge/settings.ini b/serial_port/modbus_simple_bridge/settings.ini deleted file mode 100644 index 7866dbd5..00000000 --- a/serial_port/modbus_simple_bridge/settings.ini +++ /dev/null @@ -1,28 +0,0 @@ -[application] -name=modbus_simple_bridge -description=Simple 1-thread Modbus/TCP to RTU bridge -path=serial_port/modbus_simple_bridge -version=1.27 -uuid=efd6b062-1800-4aac-a066-38e2266bbfb4 - -[startup] -exit_delay=15 sec - -[modbus_serial] -port_name=/dev/ttyS1 -; port_name=/dev/ttyUSB0 -; port_name=COM1 -baud_rate=9600 -; for now, parity should match PySerial expectations -parity=N -; protocls are in (mbrtu, mbasc), default = mbrtu -; protocol=mbasc - -[modbus_ip] -; only set host_ip to limit/narrow interface, else will remain '' for all -; host_ip=127.0.0.1 -; note that host_port must be > -host_port=8502 -idle_timeout=30 sec -; protocls are in (mbtcp, mbrtu, mbasc), default = mbtcp -; protocol=mbtcp diff --git a/serial_port/notes.txt b/serial_port/notes.txt deleted file mode 100644 index 5dba0a1e..00000000 --- a/serial_port/notes.txt +++ /dev/null @@ -1,28 +0,0 @@ -config/system/gpio_actions/ - "serial_gpio_enable": true, - - "system": { - "connector_gpio": { - "output": 0, - "timeout": 300, - "input": 1 - }, - - -# this only works when {"Content-Type": "application/x-www-form-urlencoded"} -result = client.put("control/gpio/CGPIO_CONNECTOR_OUTPUT", "data=%d" % result) -# PUT http://192.168.1.1/api/control/gpio/CGPIO_CONNECTOR_OUTPUT data=0 -# GET RSP 0 - -# result = client.put("control/gpio", {"data": "CGPIO_CONNECTOR_OUTPUT %d" % result}) -# PUT http://192.168.1.1/api/control/gpio {"data": "CGPIO_CONNECTOR_OUTPUT 0"} -# RSP {'exception': 'key', 'key': 'data'} - -# result = client.put("control/gpio", {"CGPIO_CONNECTOR_OUTPUT": result}) -# PUT http://192.168.1.1/api/control/gpio {"CGPIO_CONNECTOR_OUTPUT": 0} -# RSP {'key': 'data', 'exception': 'key'} - -# result = client.put("control/gpio/CGPIO_CONNECTOR_OUTPUT", {"data": result}) -# PUT http://192.168.1.1/api/control/gpio/CGPIO_CONNECTOR_OUTPUT {"data": 0} -# RSP {'key': 'data', 'exception': 'key'} - diff --git a/serial_port/serial_echo/README.md b/serial_port/serial_echo/README.md deleted file mode 100644 index 76457ad4..00000000 --- a/serial_port/serial_echo/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# directory: ./serial_port/serial_echo -## Router App/SDK sample applications - -Wait for data to enter the serial port, then echo back out. -Data will be processed byte by byte, although you could edit the -sample code to wait for an end-of-line character. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -which will be run by main.py - -## File: serial_echo.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code: - -In section [serial_echo]: - -* port_name=???, define the serial port to use. Commonly this will be -/dev/ttyS1 or /dev/ttyUSB0 - -* baud_rate=9600, allows you to define a different baud rate. This sample -assumes the other settings are fixed at: bytesize=8, parity='N', stopbits=1, -and all flow control (XonXOff and HW) is off/disabled. -Edit the code if you need to change this. diff --git a/serial_port/serial_echo/__init__.py b/serial_port/serial_echo/__init__.py deleted file mode 100644 index e9e32431..00000000 --- a/serial_port/serial_echo/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from serial_port.serial_echo.serial_echo import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "serial.serial_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to run_main()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/serial_port/serial_echo/serial_echo.py b/serial_port/serial_echo/serial_echo.py deleted file mode 100644 index bb1091d6..00000000 --- a/serial_port/serial_echo/serial_echo.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Serial echo -""" -import sys -import serial - -from cp_lib.app_base import CradlepointAppBase - -DEF_BAUD_RATE = 9600 -DEF_PORT_NAME = "/dev/ttyS1" - -# set to None to disable, or set to bytes to send -ASK_ARE_YOU_THERE = b"u there?" - - -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return list: - """ - # confirm we are running on an 1100/1150, result should be "IBR1100LPE" - result = app_base.get_product_name() - if result in ("IBR1100", "IBR1150", "IBR600B", "IBR650B"): - app_base.logger.info("Product Model is good:{}".format(result)) - else: - app_base.logger.error( - "Inappropriate Product:{} - aborting.".format(result)) - return -1 - - port_name = DEF_PORT_NAME - baud_rate = DEF_BAUD_RATE - if "serial_echo" in app_base.settings: - if "port_name" in app_base.settings["serial_echo"]: - port_name = app_base.settings["serial_echo"]["port_name"] - if "baud_rate" in app_base.settings["serial_echo"]: - baud_rate = int(app_base.settings["serial_echo"]["baud_rate"]) - - # see if port is a digit? - if port_name[0].isdecimal(): - port_name = int(port_name) - - old_pyserial = serial.VERSION.startswith("2.6") - - message = "Starting serial echo on {0}, baud={1}".format(port_name, - baud_rate) - app_base.logger.info(message) - - try: - ser = serial.Serial(port_name, baudrate=baud_rate, bytesize=8, - parity='N', stopbits=1, timeout=1, - xonxoff=0, rtscts=0) - - except serial.SerialException: - app_base.logger.error("Open failed!") - raise - - # start as None to force at least 1 change - dsr_was = None - cts_was = None - - try: - while True: - try: - data = ser.read(size=1) - except KeyboardInterrupt: - app_base.logger.warning( - "Keyboard Interrupt - asked to quit") - break - - if len(data): - app_base.logger.debug(str(data)) - ser.write(data) - elif ASK_ARE_YOU_THERE is not None: - ser.write(ASK_ARE_YOU_THERE) - # else: - # app_base.logger.debug(b".") - - if old_pyserial: - # as of May-2016/FW 6.1, this is PySerial v2.6, so it uses - # the older style control signal access - if dsr_was != ser.getDSR(): - # do this 'get' twice to handle first pass as None - dsr_was = ser.getDSR() - app_base.logger.info( - "DSR changed to {}, setting DTR".format(dsr_was)) - ser.setDTR(dsr_was) - - if cts_was != ser.getCTS(): - cts_was = ser.getCTS() - app_base.logger.info( - "CTS changed to {}, setting RTS".format(cts_was)) - ser.setRTS(cts_was) - else: - if dsr_was != ser.dsr: - dsr_was = ser.dsr - app_base.logger.info( - "DSR changed to {}, setting DTR".format(dsr_was)) - ser.dtr = dsr_was - - if cts_was != ser.cts: - cts_was = ser.cts - app_base.logger.info( - "CTS changed to {}, setting RTS".format(cts_was)) - ser.rts = cts_was - - # if you lose the serial port - like disconnected, then - # ser.getDSR() will throw OSError #5 Input/Output error - - finally: - ser.close() - - return - - -if __name__ == "__main__": - my_app = CradlepointAppBase("serial/serial_echo") - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/serial_port/serial_echo/settings.ini b/serial_port/serial_echo/settings.ini deleted file mode 100644 index ed6bcdc6..00000000 --- a/serial_port/serial_echo/settings.ini +++ /dev/null @@ -1,13 +0,0 @@ -[application] -name=serial_echo -description=Simple echo server, which echos any lines received -path=serial_port/serial_echo -version=1.6 -uuid=98793e88-a2a4-40d6-9c1c-6845d79d3f1b - -[serial_echo] -port_name=/dev/ttyS1 -; port_name=/dev/ttyUSB3 -; port_name=0 - this will be aliased to /dev/ttyS0 -; port_name=COM11 -baud_rate=9600 diff --git a/simple/README.md b/simple/README.md deleted file mode 100644 index 827d88cb..00000000 --- a/simple/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Router App/SDK sample applications - SIMPLE single function samples - -## Directory hello_world - -Shows how to use your own MAIN.PY, which is run as the main app of the SDK. -The code loops, sending a "Hello World" message to a Syslog server. - -Because you control the full application, you must manage the Syslog output -and settings yourself. - -## Directory hello_world_app - -Expands the function in "hello_world" sample, using the stock -CradlepointAppBase class, which adds the following services: -* self.logger = a Syslog logging module -* self.settings = finds/loads your settings.json (made from settings.ini) -* self.cs_client = read/write the Cradlepoint status/config trees - -## Directory hello_world_1task - -Expands the function in "hello_world_app" sample, adding a sub-task -to do the "Hello World" Syslog message. -Shows how to spawn, as well as stop (kill/join) the sub-task. - -## Directory hello_world_3task - -Expands the function in "hello_world_1task" sample, -adding three (3) sub-tasks, including one which exits and must be restarted - -## Directory send_alert - -Sends a message to router, which is treated as an ECM alert. diff --git a/simple/hello_world/README.md b/simple/hello_world/README.md deleted file mode 100644 index 76e363f7..00000000 --- a/simple/hello_world/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# directory: ./simple/hello_world -## Router App/SDK sample applications - -The sample application shows how to create your own MAIN function. - -The stock MAKE.PY will detect the existence of this 'main.py' file, -using it instead of the stock cp_lib/make.py. -The downside is that your application must handle setup of syslog, -finding app settings, and so on. -(see ./simple/hello_world_app for a version using the stock main and settings design) - -The actual application sends a "Hello SDK World" message to Syslog at an -'INFO' priority. - -## File: __init__.py - -{ an EMPTY file - used to define Python modules } - -## File: main.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, required by MAKE.PY - diff --git a/simple/hello_world/__init__.py b/simple/hello_world/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/simple/hello_world/main.py b/simple/hello_world/main.py deleted file mode 100644 index da3e3712..00000000 --- a/simple/hello_world/main.py +++ /dev/null @@ -1,52 +0,0 @@ -import time - -# NOTES: -# - since this MAIN.PY exists, the tool building the TAR.GZIP archive will -# ignore (not use) the standard ./config/main.py -# -# - it is critical that the file "simple/hello_world/__init__.py" is empty -# -# - although this file does NOT use the "simple/hello_world/settings.ini" -# will be required by the tool building the TAR.GZIP archive! - - -def do_something(): - logger.info("Hello SDK World!") - time.sleep(10) - return - - -if __name__ == "__main__": - import sys - import logging - import logging.handlers - - if sys.platform == "win32": - # technically, will run on Linux, but designed for CP router - raise NotImplementedError("This code only runs on router") - - logger = logging.getLogger("routerSDK") - logger.setLevel(logging.DEBUG) - - formatter = logging.Formatter("%(levelname)s:%(name)s:%(message)s") - - # create the Syslog handler, which blends output on router's - # Syslog output - handler = logging.handlers.SysLogHandler( - address="/dev/log", facility=logging.handlers.SysLogHandler.LOG_LOCAL6) - handler.setLevel(logging.DEBUG) - handler.setFormatter(formatter) - logger.addHandler(handler) - - logger.info("Starting ...") - time.sleep(2.0) - - while True: - # we do this wrap to dump any Python exception traceback out to - # Syslog. Of course, this simple code won't likely fail, but it - # demos the requirement! Without this, you'd see no error! - try: - do_something() - except: - logger.exception("simple main.py failed!") - raise diff --git a/simple/hello_world/settings.ini b/simple/hello_world/settings.ini deleted file mode 100644 index e47c4568..00000000 --- a/simple/hello_world/settings.ini +++ /dev/null @@ -1,8 +0,0 @@ -; Although the hello_world MAIN.PY does NOT use this, the MAKE.PY -; tool which builds the TAR.GZIP requires some of this data -[application] -name=hello_world -description=Simple Hello-World sample -path=simple.hello_world -uuid=114c8c0f-9887-4e68-a4e7-de8d73fba69f -version=1.12 diff --git a/simple/hello_world_1task/README.md b/simple/hello_world_1task/README.md deleted file mode 100644 index 3db1ccb4..00000000 --- a/simple/hello_world_1task/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# directory: ./simple/hello_world_1task -## Router App/SDK sample applications - -The sample application creates 1 sub-tasks (so two total). -The main application starts 1 sub-task, which loops, sleeping a fixed time, then printing out a Syslog INFO message. -It shows the proper way to deal with sub-tasks, including standard clean-up when exiting. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -with will be run by the stock main.py - -## File: hello_world.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code - diff --git a/simple/hello_world_1task/__init__.py b/simple/hello_world_1task/__init__.py deleted file mode 100644 index 2085f4c2..00000000 --- a/simple/hello_world_1task/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from simple.hello_world_1task.hello_world import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/simple/hello_world_1task/hello_world.py b/simple/hello_world_1task/hello_world.py deleted file mode 100644 index 1e906593..00000000 --- a/simple/hello_world_1task/hello_world.py +++ /dev/null @@ -1,90 +0,0 @@ -import threading -import time -from cp_lib.app_base import CradlepointAppBase - - -def run_router_app(app_base): - """ - Say hello every 10 seconds using a task. Note this sample is rather silly - as the CP router spawns THIS function (run_router_app()) as a unique - thread. so no point making 1 thread into two! - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - my_task = HelloOneTask("task1", app_base) - my_task.start() - - try: - while True: - time.sleep(300) - - except KeyboardInterrupt: - # this is only true on a test PC - won't see on router - # must trap here to prevent try/except in __init__.py from avoiding - # the graceful shutdown below. - pass - - # now we need to try & kill off our kids - if we are here - app_base.logger.info("Okay, exiting") - - # signal sub task to halt - my_task.please_stop() - - # what until it does - remember, it is sleeping, so will take some time - my_task.join() - return 0 - - -class HelloOneTask(threading.Thread): - - def __init__(self, name, app_base): - """ - prep our thread, but do not start yet - - :param str name: name for the thread - :param CradlepointAppBase app_base: prepared resources: logger, etc - """ - threading.Thread.__init__(self, name=name) - - self.app_base = app_base - self.app_base.logger.info("started INIT") - - if "hello_world" in app_base.settings and \ - "message" in app_base.settings["hello_world"]: - # see if we have 'message' data in settings.ini - self.say_what = app_base.settings["hello_world"]["message"] - else: - self.say_what = "Hello SDK World!" - - # create an event to manage our stopping - # (Note: on CP router, this isn't strictly true, as when the parent is - # stopped/halted, the child dies as well. However, you may want - # your sub task to clean up before it exists - self.keep_running = threading.Event() - self.keep_running.set() - - return - - def run(self): - """ - Now thread is being asked to start running - """ - - self.app_base.logger.info("started RUN") - - message = "task:{0} says:{1}".format(self.name, self.say_what) - while self.keep_running.is_set(): - self.app_base.logger.info(message) - time.sleep(10) - - message = "task:{0} was asked to stop!".format(self.name) - self.app_base.logger.info(message) - return 0 - - def please_stop(self): - """ - Now thread is being asked to start running - """ - self.keep_running.clear() - return diff --git a/simple/hello_world_1task/settings.ini b/simple/hello_world_1task/settings.ini deleted file mode 100644 index 9f65753a..00000000 --- a/simple/hello_world_1task/settings.ini +++ /dev/null @@ -1,10 +0,0 @@ -[application] -name=hello_world -description=Simple Hello World sample, using 1 subtask -path=simple.hello_world_1task -version=1.0 -uuid=4d9afb98-dab9-4a54-9738-9de9c7e69539 - -; this section and item is unique to this sample -[hello_world] -message=Hello Universe! diff --git a/simple/hello_world_3tasks/README.md b/simple/hello_world_3tasks/README.md deleted file mode 100644 index e52ca032..00000000 --- a/simple/hello_world_3tasks/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# directory: ./simple/hello_world_3tasks -## Router App/SDK sample applications - -The sample application creates 3 sub-tasks (so four total). -The main application starts 3 sub-tasks, which loop, sleeping with a random -delay before printing out a Syslog INFO message. It shows the proper way to deal with sub-tasks, including standard clean-up when exiting. - -The first 2 sub-tasks will run 'forever' - or on a PC, when you do a ^C or -keyboard interrupt, the main task will abort, using an event() to stop -all three sub-tasks. - -The third task will exit after each loop, and the main task will notice, then re-run it. - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -with will be run by the stock main.py - -## File: hello_world.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code - diff --git a/simple/hello_world_3tasks/__init__.py b/simple/hello_world_3tasks/__init__.py deleted file mode 100644 index 452bc5b0..00000000 --- a/simple/hello_world_3tasks/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from simple.hello_world_3tasks.hello_world import run_router_app - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/simple/hello_world_3tasks/hello_world.py b/simple/hello_world_3tasks/hello_world.py deleted file mode 100644 index 0b98fda0..00000000 --- a/simple/hello_world_3tasks/hello_world.py +++ /dev/null @@ -1,134 +0,0 @@ -import gc -import random -import threading -import time -from cp_lib.app_base import CradlepointAppBase - -# these are required to match in settings.ini -NAME1 = "message1" -NAME2 = "message2" -NAME3 = "message3" - -# to make a little more interesting, each sub-task selects a random loop delay -MIN_DELAY = 5 -MAX_DELAY = 15 - - -def run_router_app(app_base): - """ - Say hello every 10 seconds using a task. Note this sample is rather silly - as the CP router spawns THIS function (run_router_app()) as a unique - thread. so no point making 1 thread into two! - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - - # we want a more random pattern; not repeated - random.seed() - - # task #1 runs "forever" - my_task1 = HelloOneTask(NAME1, app_base) - my_task1.start() - - # task #2 runs "forever" - my_task2 = HelloOneTask(NAME2, app_base) - my_task2.start() - - # task #3 exits after each delay loop - my_task3 = HelloOneTask(NAME3, app_base) - my_task3.start() - - try: - while True: - if not my_task3.is_alive(): - # we keep restarting task #3; it will exit always - - # do memory collection, clean-up after old run on task #3 - # else we risk collecting a lot of large chunks - gc.collect() - - app_base.logger.info("Re-Running task #3") - my_task3.run() - - time.sleep(30) - - except KeyboardInterrupt: - # this is only true on a test PC - won't see on router - # must trap here to prevent try/except in __init__.py from avoiding - # the graceful shutdown below. - pass - - # now we need to try & kill off our kids - if we are here - app_base.logger.info("Okay, exiting") - - # signal sub task to halt - my_task1.please_stop() - my_task2.please_stop() - my_task3.please_stop() - - # what until it does - remember, it is sleeping, so will take some time - my_task1.join() - my_task2.join() - my_task3.join() - - return 0 - - -class HelloOneTask(threading.Thread): - - def __init__(self, name, app_base): - """ - prep our thread, but do not start yet - - :param str name: name for the thread. We will assume - :param CradlepointAppBase app_base: prepared resources: logger, etc - """ - threading.Thread.__init__(self, name=name) - - self.app_base = app_base - self.app_base.logger.info("started INIT") - - if "hello_world" in app_base.settings and \ - name in app_base.settings["hello_world"]: - # see if we have 'message' data in settings.ini - self.say_what = app_base.settings["hello_world"][name] - else: - self.say_what = "no message for [%s]!" % name - - # create an event to manage our stopping - # (Note: on CP router, this isn't strictly true, as when the parent is - # stopped/halted, the child dies as well. However, you may want - # your sub task to clean up before it exists - self.keep_running = threading.Event() - self.keep_running.set() - - return - - def run(self): - """ - Now thread is being asked to start running - """ - delay = random.randrange(MIN_DELAY, MAX_DELAY) - message = "task:{0} Running, delay={1}".format(self.name, delay) - self.app_base.logger.info(message) - - message = "task:{0} says:{1}".format(self.name, self.say_what) - self.keep_running.set() - while self.keep_running.is_set(): - self.app_base.logger.info(message) - time.sleep(delay) - if self.name == NAME3: - # then we exit - self.keep_running.clear() - - message = "task:{0} was asked to stop!".format(self.name) - self.app_base.logger.info(message) - return 0 - - def please_stop(self): - """ - Now thread is being asked to start running - """ - self.keep_running.clear() - return diff --git a/simple/hello_world_3tasks/settings.ini b/simple/hello_world_3tasks/settings.ini deleted file mode 100644 index 8775ca64..00000000 --- a/simple/hello_world_3tasks/settings.ini +++ /dev/null @@ -1,12 +0,0 @@ -[application] -name=hello_world -description=Hello World sample, using 3 subtasks -path=simple.hello_world_3tasks -version=1.11 -uuid=c69cfe79-5f11-4cae-986a-9d568bf96629 - -; this section and item is unique to this sample -[hello_world] -message1=Hello Universe! -message2=Where am I? -message3=What? Again? diff --git a/simple/hello_world_app/README.md b/simple/hello_world_app/README.md deleted file mode 100644 index 87095a96..00000000 --- a/simple/hello_world_app/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# directory: ./simple/hello_world_app -## Router App/SDK sample applications - -The sample application shows how to use the CradlepointAppBase to make -an ultra-simple application. -The CradlepointAppBase adds the following services: -* self.logger = a Syslog logging module -* self.settings = finds/loads your settings.json (made from settings.ini) -* self.cs_client = read/write the Cradlepoint status/config trees - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -with will be run by the stock main.py - -## File: hello_world.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code - diff --git a/simple/hello_world_app/__init__.py b/simple/hello_world_app/__init__.py deleted file mode 100644 index 987bd013..00000000 --- a/simple/hello_world_app/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from simple.hello_world_app.hello_world import do_hello_world - - -class RouterApp(CradlepointAppBase): - - def __init__(self, app_name): - """ - :param str app_name: the file name, such as "simple.hello_world_app" - :return: - """ - CradlepointAppBase.__init__(self, app_name) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = do_hello_world(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/simple/hello_world_app/hello_world.py b/simple/hello_world_app/hello_world.py deleted file mode 100644 index abd05a87..00000000 --- a/simple/hello_world_app/hello_world.py +++ /dev/null @@ -1,21 +0,0 @@ -import time -from cp_lib.app_base import CradlepointAppBase - - -def do_hello_world(app_base): - """ - Say hello every 10 seconds - - :param CradlepointAppBase app_base: prepared resources: logger, cs_client - :return: - """ - if "hello_world" in app_base.settings and \ - "message" in app_base.settings["hello_world"]: - # see if we have 'message' data in settings.ini - say_what = app_base.settings["hello_world"]["message"] - else: - say_what = "Hello SDK World!" - - while True: - app_base.logger.info(say_what) - time.sleep(10) diff --git a/simple/hello_world_app/settings.ini b/simple/hello_world_app/settings.ini deleted file mode 100644 index b42d29ef..00000000 --- a/simple/hello_world_app/settings.ini +++ /dev/null @@ -1,10 +0,0 @@ -[application] -name=hello_world -description=Simple Hello World sample, using CradlepointAppBase -path=simple.hello_world -version=1.0 -uuid=15265202-c336-44cc-8ddc-4032a54c9244 - -; this section and item is unique to this sample -[hello_world] -message=Hello Universe! diff --git a/simple/send_alert/README.md b/simple/send_alert/README.md deleted file mode 100644 index 208ba567..00000000 --- a/simple/send_alert/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# directory: ./simple/send_alert -## Router App/SDK sample applications - -The sample application uses the local CS_Client function to push an ECM -alert. - -(How do they show up in ECM? That's TBD) - -## File: __init__.py - -The Python script with the class RouterApp(CradlepointAppBase) instance, -with will be run by the stock main.py - -## File: hello_world.py - -The main files of the application. - -## File: settings.ini - -The Router App settings, including a few required by this code - diff --git a/simple/send_alert/__init__.py b/simple/send_alert/__init__.py deleted file mode 100644 index 88ccc3cd..00000000 --- a/simple/send_alert/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from cp_lib.app_base import CradlepointAppBase -from simple.send_alert.send_alert import run_router_app - - -# this name RouterApp is CRITICAL - importlib will seek it! -class RouterApp(CradlepointAppBase): - - def __init__(self, app_main): - """ - :param str app_main: the file name, such as "network.tcp_echo" - :return: - """ - CradlepointAppBase.__init__(self, app_main) - return - - def run(self): - self.logger.debug("__init__ chaining to run_router_app()") - - # we do this wrap to dump any Python exception traceback out to Syslog - try: - result = run_router_app(self) - except: - self.logger.exception("CradlepointAppBase failed") - raise - - return result diff --git a/simple/send_alert/send_alert.py b/simple/send_alert/send_alert.py deleted file mode 100644 index 3993e52c..00000000 --- a/simple/send_alert/send_alert.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Send a Single message to ECM as alert. -""" -from cp_lib.app_base import CradlepointAppBase - - -# this name "run_router_app" is not important, reserved, or demanded -# - but must match below in __main__ and also in __init__.py -def run_router_app(app_base): - """ - - :param CradlepointAppBase app_base: resources: logger, settings, etc - """ - - app_base.logger.info("Send ALERT to ECM via CSClient") - - # user may have passed in another path - alert = "Default Message - All is well!" - if "send_alert" in app_base.settings: - if "alert" in app_base.settings["send_alert"]: - alert = app_base.settings["send_alert"]["alert"] - - # here we send to Syslog using our OWN facility/channel - app_base.logger.info('LOG: Sending alert to ECM=[{}].'.format(alert)) - - # this line will be sent via Router's Syslog facility/channel - app_base.cs_client.log( - 'RouterSDKDemo', 'CS: Sending alert to ECM=[{}].'.format(alert)) - app_base.cs_client.alert('RouterSDKDemo', alert) - - return 0 - - -if __name__ == "__main__": - import sys - - my_app = CradlepointAppBase("simple/send_alert") - - _result = run_router_app(my_app) - my_app.logger.info("Exiting, status code is {}".format(_result)) - sys.exit(_result) diff --git a/simple/send_alert/settings.ini b/simple/send_alert/settings.ini deleted file mode 100644 index 5b4af9a3..00000000 --- a/simple/send_alert/settings.ini +++ /dev/null @@ -1,11 +0,0 @@ -[application] -name=send_alert -description=Send an alert to ECM -path=simple/send_alert -; restart=false -uuid=547c5c9f-1d59-40db-9691-a157fcb8d3ae -version=1.0 - -[send_alert] -; place your status path here - like status/product_info/product_name -alert=Hello from the field! diff --git a/simple_web_server/cs.py b/simple_web_server/cs.py new file mode 100644 index 00000000..b83a98d0 --- /dev/null +++ b/simple_web_server/cs.py @@ -0,0 +1,257 @@ +""" +sdk_config_store.py - Communication module for sdk apps + +Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. + +This file contains confidential information of CradlePoint, Inc. and your use of +this file is subject to the CradlePoint Software License Agreement distributed with +this file. Unauthorized reproduction or distribution of this file is subject to civil and +criminal penalties. + +""" + +import json +import re +import socket +import sys + + +class SdkCSException(Exception): + pass + + +CSCLIENT_NAME = 'SDK CSClient' + + +class CSClient(object): + END_OF_HEADER = b"\r\n\r\n" + STATUS_HEADER_RE = re.compile(b"status: \w*") + CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") + MAX_PACKET_SIZE = 8192 + RECV_TIMEOUT = 2.0 + + _instances = {} + + @classmethod + def is_initialized(cls): + return (cls in cls._instances) + + def __new__(cls, *na, **kwna): + """ Singleton factory (with subclassing support) """ + if not cls.is_initialized(): + cls._instances[cls] = super().__new__(cls) + return cls._instances[cls] + + def __init__(self, init=False): + if not init: + return + + @staticmethod + def _get_router_access_info(): + """Should only be called when running in a computer. It will return the + dev_client_ip, dev_client_username, and dev_client_password as defined in + the sdk section of the sdk_settings.ini file.""" + router_ip = '' + router_username = '' + router_password = '' + + if sys.platform != 'linux2': + import os + import configparser + + settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') + config = configparser.ConfigParser() + config.read(settings_file) + + # Keys in sdk_settings.ini + sdk_key = 'sdk' + ip_key = 'dev_client_ip' + username_key = 'dev_client_username' + password_key = 'dev_client_password' + + if sdk_key in config: + if ip_key in config[sdk_key]: + router_ip = config[sdk_key][ip_key] + else: + print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) + + if username_key in config[sdk_key]: + router_username = config[sdk_key][username_key] + else: + print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) + + if password_key in config[sdk_key]: + router_password = config[sdk_key][password_key] + else: + print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) + else: + print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) + + return router_ip, router_username, router_password + + def get(self, base, query='', tree=0): + """Send a get request.""" + if sys.platform == 'linux2': + cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the get to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.get(router_api, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return json.loads(response.text)['data'] + + def put(self, base, value='', query='', tree=0): + """Send a put request.""" + value = json.dumps(value).replace(' ', '') + if sys.platform == 'linux2': + cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the put to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.put(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def append(self, base, value='', query=''): + """Send an append request.""" + if sys.platform == 'linux2': + value = json.dumps(value).replace(' ', '') + cmd = "post\n{}\n{}\n{}\n".format(base, query, value) + return self._dispatch(cmd) + else: + print('Append is only available when running the app in the router.') + raise NotImplementedError + + def delete(self, base, query=''): + """Send a delete request.""" + if sys.platform == 'linux2': + cmd = "delete\n{}\n{}\n".format(base, query) + return self._dispatch(cmd) + else: + # Running in a computer so use http to send the delete to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.delete(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password)) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text + + def alert(self, app_name='', value=''): + """Send a request to create an alert.""" + if sys.platform == 'linux2': + cmd = "alert\n{}\n{}\n".format(app_name, value) + return self._dispatch(cmd) + else: + print('Alert is only available when running the app in the router.') + raise NotImplementedError + + def log(self, name='', value='', level='DEBUG'): + """Send a request to create a log entry.""" + if sys.platform == 'linux2': + cmd = "log\n{}\n{}\n".format(name, value) + return self._dispatch(cmd) + else: + # Running in a computer so just use print for the log. + print('[{}]: {}'.format(name, value)) + + def _safe_dispatch(self, cmd): + """Send the command and return the response.""" + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect('/var/tmp/cs.sock') + sock.sendall(bytes(cmd, 'ascii')) + return self._receive(sock) + + def _dispatch(self, cmd): + errmsg = None + result = "" + try: + result = self._safe_dispatch(cmd) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + pass + return result + + def _safe_receive(self, sock): + sock.settimeout(self.RECV_TIMEOUT) + data = b"" + eoh = -1 + while eoh < 0: + # In the event that the config store times out in returning data, lib returns + # an empty result. Then again, if the config store hangs for 2+ seconds, + # the app's behavior is the least of our worries. + try: + buf = sock.recv(self.MAX_PACKET_SIZE) + except socket.timeout: + return {"status": "timeout", "data": None} + if len(buf) == 0: + break + data += buf + eoh = data.find(self.END_OF_HEADER) + + status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] + content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] + remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) + + # body sent from csevent_xxx.sock will have id, action, path, & cfg + while remaining > 0: + buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. + if len(buf) == 0: + break + data += buf + remaining -= len(buf) + body = data[eoh:].decode() + try: + result = json.loads(body) + except json.JSONDecodeError as e: + # config store receiver doesn't give back + # proper json for 'put' ops, body + # contains verbose error message + # so putting the error msg in result + result = body.strip() + return {"status": status_hdr.decode(), "data": result} + + def _receive(self, sock): + errmsg = None + result = "" + try: + result = self._safe_receive(sock) + except Exception as err: + # ignore the command error, continue on to next command + errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) + if errmsg is not None: + self.log(CSCLIENT_NAME, errmsg) + return result diff --git a/simple_web_server/install.sh b/simple_web_server/install.sh new file mode 100644 index 00000000..1cceb73b --- /dev/null +++ b/simple_web_server/install.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "INSTALLATION simple_web_server on:" >> install.log +date >> install.log diff --git a/simple_web_server/package.ini b/simple_web_server/package.ini new file mode 100644 index 00000000..ef7083e6 --- /dev/null +++ b/simple_web_server/package.ini @@ -0,0 +1,11 @@ +[simple_web_server] +uuid=fbf3522a-83b8-4901-97c9-067772d9993c +vendor=Cradlepoint +notes=Simple Web Server Reference Application with single fixed page +firmware_major=6 +firmware_minor=2 +restart=false +reboot=true +version_major=1 +version_minor=0 +auto_start=true diff --git a/simple_web_server/simple_web_server.py b/simple_web_server/simple_web_server.py new file mode 100644 index 00000000..50dd2343 --- /dev/null +++ b/simple_web_server/simple_web_server.py @@ -0,0 +1,78 @@ +""" +A Simple Web server +""" + +import cs +import argparse + +from http.server import BaseHTTPRequestHandler, HTTPServer + +APP_NAME = 'simple_web_server' +WEB_MESSAGE = "Hello World from Cradlepoint router!" + + +def start_server(): + # avoid 8080, as the router may have service on it. + # Firewall rules will need to be changed in the router + # to allow access on this port. + server_address = ('', 9001) + + cs.CSClient().log(APP_NAME, "Starting Server: {}".format(server_address)) + cs.CSClient().log(APP_NAME, "Web Message is: {}".format(WEB_MESSAGE)) + + httpd = HTTPServer(server_address, WebServerRequestHandler) + + try: + httpd.serve_forever() + + except KeyboardInterrupt: + cs.CSClient().log(APP_NAME, "Stopping Server, Key Board interrupt") + + return 0 + + +class WebServerRequestHandler(BaseHTTPRequestHandler): + + def do_GET(self): + # Log the Get request + cs.CSClient().log(APP_NAME, 'Received Get request: {}'.format(self.path)) + + # Send response status code + self.send_response(200) + + # Send headers + self.send_header('Content-type', 'text/html') + self.end_headers() + + # Send message back to client + # Write content as utf-8 data + self.wfile.write(bytes(WEB_MESSAGE, "utf8")) + return + + +def action(command): + try: + # Log the action for the app. + cs.CSClient().log(APP_NAME, 'action({})'.format(command)) + + if command == 'start': + start_server() + + elif command == 'stop': + pass + + except: + cs.CSClient().log(APP_NAME, 'Problem with {} on {}!'.format(APP_NAME, command)) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('opt') + args = parser.parse_args() + + if args.opt not in ['start', 'stop']: + cs.CSClient().log(APP_NAME, 'Failed to run command: {}'.format(args.opt)) + exit() + + action(args.opt) diff --git a/simple_web_server/start.sh b/simple_web_server/start.sh new file mode 100644 index 00000000..f0dbea22 --- /dev/null +++ b/simple_web_server/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython simple_web_server.py start diff --git a/simple_web_server/stop.sh b/simple_web_server/stop.sh new file mode 100644 index 00000000..26df61b7 --- /dev/null +++ b/simple_web_server/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cppython simple_web_server.py stop diff --git a/syslog.bat b/syslog.bat deleted file mode 100644 index fe58c60c..00000000 --- a/syslog.bat +++ /dev/null @@ -1 +0,0 @@ -python tools\syslog_server.py diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/test/sdk_status_examples.txt b/test/sdk_status_examples.txt deleted file mode 100644 index 98a2d1f8..00000000 --- a/test/sdk_status_examples.txt +++ /dev/null @@ -1,397 +0,0 @@ - -App was installed okay, and started: -{ - '6903f7bb-cee2-41eb-af-9b71ab8d3ad5': { - 'type': 'development', - 'app': { - 'date': '2016-03-03T17: 04: 06.838652', - 'uuid': '6903f7bb-cee2-41eb-afba-9b71ab8d3ad5', - 'version_major': 1, - 'name': 'hello_world', - 'restart': True, - 'version_minor': 10, - 'vendor': 'customer' - }, - 'summary': 'Startedapplication', - 'state': 'started' - } -} - -{ - '114c8c0f-9887-4e68-a4e7-de8d73fba69f': { - 'state': 'started', - 'summary': 'Startedapplication', - 'app': { - 'version_major': 1, - 'uuid': '114c8c0f-9887-4e68-a4e7-de8d73fba69f', - 'restart': True, - 'date': '2016-03-04T15: 30: 01.455373', - 'vendor': 'customer', - 'version_minor': 8, - 'name': 'hello_world' - }, - 'type': 'development' - } -} - -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK:GOOD file:/usr/lib -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcares.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcares.so.2.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcompat.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcrypto.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcrypto.so.1.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcsclient.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcsclient.so.1.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip4tc.so.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip4tc.so.0.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip6tc.so.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip6tc.so.0.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libipsec.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libipsec.so.0.8.1 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libiptc.so.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libiptc.so.0.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libjansson.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libjansson.so.2.6 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libm.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libm.so.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libmnl.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libmnl.so.1.0.3 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_acct.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_acct.so.1.0.2 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_conntrack.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_conntrack.so.1.0.4 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnfnetlink.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnfnetlink.so.1.0.1 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-genl.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-genl.so.3.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-nf.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-nf.so.3.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-route.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-route.so.3.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl.so.3.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam.so.1.1.6 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam_misc.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam_misc.so.1.1.6 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpamc.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpamc.so.1.1.6 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpcap.so.1 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpcap.so.1.6.2 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libquagga.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssh.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssh.so.0.7.1 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssl.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssl.so.1.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libusb.so -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libusb.so.1.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libxtables.so.7 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libxtables.so.7.0.0 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libz.so.1 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libz.so.1.2.8 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pppd -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:python3.3 -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:rp-pppoe -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:security -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ulogd -92.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:xtables - -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>httpserver: Accepted API login from local address 192.168.1.6, user: admin -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:Hello SDK World! -192.168.1.1 : <14>httpserver: Accepted API login from local address 192.168.1.6, user: admin -192.168.1.1 : <14>httpserver: Accepted API login from local address 192.168.1.6, user: admin -192.168.1.1 : <15>routersdk: _onControlAction ['control', 'system', 'sdk', 'action'] uninstall 114c8c0f-9887-4e68-a4e7-de8d73fba69f -192.168.1.1 : <15>psmon:sh: Stopping process 4028: /bin/sh -192.168.1.1 : <15>psmon:sh: Process (/bin/sh[4028]) exited with code: -15 -192.168.1.1 : <15>psmon:sh: Stopped process 4028: /bin/sh -192.168.1.1 : <15>routersdk: Application successfully stopped -192.168.1.1 : <14>filemgr: Rebuilding flash sector: id: 1, allocated: 234, remaining: 2847, total: 62689, erase_count: 107, inodes: 6, files: 1 -192.168.1.1 : <15>svcmgr: Erasing sector: 1 -192.168.1.1 : <15>routersdk: Application successfully uninstalled -192.168.1.1 : <14>httpserver: Accepted API login from local address 192.168.1.6, user: admin -192.168.1.1 : <15>ecm: Remote code exec triggered -192.168.1.1 : <14>ssh: Client SSH session started from 192.168.1.6, user: admin -192.168.1.1 : <15>routersdk: Developer application upload successful -192.168.1.1 : <14>ssh: Client session ended from 192.168.1.6, user: admin -192.168.1.1 : <15>routersdk: Successfully created paths /var/mnt/sdk/apps/114c8c0f-9887-4e68-a4e7-de8d73fba69f & /var/mnt/sdk/apps/114c8c0f-9887-4e68 --a4e7-de8d73fba69f/dist -192.168.1.1 : <15>routersdk: Successfully downloaded package dist/tmpd0eek0 -192.168.1.1 : <15>routersdk: Successfully extracted application directory (hello_world) -192.168.1.1 : <15>routersdk: Successfully extracted application -192.168.1.1 : <15>routersdk: Application Manifest validation successful -192.168.1.1 : <14>filemgr: Rebuilding flash sector: id: 0, allocated: 887, remaining: 1659, total: 63877, erase_count: 106, inodes: 8, files: 3 -192.168.1.1 : <15>svcmgr: Erasing sector: 0 -192.168.1.1 : <15>routersdk: Application successfully installed -192.168.1.1 : <15>psmon:sh: Started process 4118: ['/bin/sh', 'start.sh'] -192.168.1.1 : <15>routersdk: Application successfully started -192.168.1.1 : <14>UNKNOWN: INFO:routerSDK:CWD:/var/mnt/sdk/apps/114c8c0f-9887-4e68-a4e7-de8d73fba69f/hello_world -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK:GOOD file:/usr/lib -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcares.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcares.so.2.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcompat.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcrypto.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcrypto.so.1.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcsclient.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libcsclient.so.1.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip4tc.so.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip4tc.so.0.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip6tc.so.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libip6tc.so.0.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libipsec.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libipsec.so.0.8.1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libiptc.so.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libiptc.so.0.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libjansson.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libjansson.so.2.6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libm.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libm.so.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libmnl.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libmnl.so.1.0.3 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_acct.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_acct.so.1.0.2 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_conntrack.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnetfilter_conntrack.so.1.0.4 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnfnetlink.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnfnetlink.so.1.0.1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-genl.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-genl.so.3.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-nf.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-nf.so.3.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-route.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl-route.so.3.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libnl.so.3.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam.so.1.1.6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam_misc.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpam_misc.so.1.1.6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpamc.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpamc.so.1.1.6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpcap.so.1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libpcap.so.1.6.2 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libquagga.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssh.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssh.so.0.7.1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssl.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libssl.so.1.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libusb.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libusb.so.1.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libxtables.so.7 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libxtables.so.7.0.0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libz.so.1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:libz.so.1.2.8 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pppd -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:python3.3 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:rp-pppoe -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:security -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ulogd -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:xtables - -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK:GOOD file:/usr/lib/python3.3 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:OpenSSL -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:__future__.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:_compat_pickle.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:_pyio.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:_ssh.cpython-33m.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:_strptime.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:_weakrefset.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:abc.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:argparse.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:base64.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:bdb.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:bisect.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cProfile.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:calendar.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cgi.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:chunk.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cmd.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:code.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:codecs.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:codeop.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:collections -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:compileall.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:configparser.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:contextlib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:copy.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:copyreg.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cp -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cpsite.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cradlepoint.cpython-33m.so -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ctypes -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:datetime.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:dateutil -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:difflib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:dis.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:dnslib -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:dnsproxy.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:dummy_threading.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:email -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:encodings -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:fnmatch.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:functools.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:genericpath.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:getopt.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:gettext.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:glob.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:gzip.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:hashlib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:heapq.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:hmac.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:html -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:http -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:imp.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:importlib -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:inspect.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:io.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ipaddress.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:json -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:keyword.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:lib-dynload -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:linecache.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:locale.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:logging -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:lzma.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mailbox.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mimetypes.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:numbers.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:opcode.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:os.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pdb.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pickle.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pkgutil.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:platform.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:posixpath.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pprint.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:py_compile.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pyrad -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:queue.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:quopri.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:random.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:re.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:reprlib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:runpy.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:serial -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:shlex.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:shutil.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:smtplib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:socket.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:socketserver.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:sre_compile.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:sre_constants.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:sre_parse.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ssh.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ssl.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:stat.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:string.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:stringprep.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:struct.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:subprocess.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tarfile.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:telnetlib.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tempfile.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:textwrap.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:threading.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:token.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tokenize.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tornado -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:traceback.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tty.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:types.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:urllib -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:uu.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:uuid.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:warnings.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:weakref.pyo -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:xml - -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK:GOOD file:/dev -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:log -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cp_lkm_pm -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cp_lkm_usb -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:switch0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ubi1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ubi1_0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:watchdog0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:watchdog -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:pts -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:bus -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock8 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock7 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock5 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:root -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock4 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock3 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock2 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtdblock0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:network_throughput -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ralink_gpio -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ubi_ctrl -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:network_latency -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:cpu_dma_latency -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:net -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ttyS1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ttyS0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:console -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ptmx -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:tty -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:ppp -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd8ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd7ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd6ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd5ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd4ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd3ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd2ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd1ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd0ro -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd8 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd7 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd6 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd5 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd4 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd3 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd2 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd1 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mtd0 -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:urandom -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:random -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:zero -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:port -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:null -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:kmsg -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:full -192.168.1.1 : <15>UNKNOWN: DEBUG:routerSDK: file:mem diff --git a/test/test_app_base.py b/test/test_app_base.py deleted file mode 100644 index a6c0f6ff..00000000 --- a/test/test_app_base.py +++ /dev/null @@ -1,487 +0,0 @@ -# Test the cp_lib.app_base module - -import logging -import os -import unittest - - -class TestAppBase(unittest.TestCase): - - def test_import_full_file_name(self): - """ - :return: - """ - from cp_lib.app_base import CradlepointAppBase - - print() # move past the '.' - - if True: - return - - name = "network.tcp_echo" - obj = CradlepointAppBase(name) - - # here, INIT is used, it exists and is larger than trivial (5 bytes) - # we want the tcp-echo.py to exist, but won't use - expect = os.path.join("network", "tcp_echo", "tcp_echo.py") - self.assertTrue(os.path.exists(expect)) - - expect = os.path.join("network", "tcp_echo", "__init__.py") - self.assertTrue(os.path.exists(expect)) - logging.info("TEST names when {} can be run_name".format(expect)) - - self.assertEqual(obj.run_name, expect) - expect = os.path.join("network", "tcp_echo") + os.sep - self.assertEqual(obj.app_path, expect) - self.assertEqual(obj.app_name, "tcp_echo") - self.assertEqual(obj.mod_name, "network.tcp_echo") - - name = "RouterSDKDemo" - obj = CradlepointAppBase(name) - - # here, the app name is used (the INIT is empty / zero bytes) - expect = os.path.join("RouterSDKDemo", "__init__.py") - self.assertTrue(os.path.exists(expect)) - logging.info( - "TEST names when {} is too small to be run_name".format(expect)) - - expect = os.path.join(name, name) + ".py" - self.assertTrue(os.path.exists(expect)) - logging.info("TEST names when {} can be run_name".format(expect)) - - self.assertEqual(obj.run_name, expect) - expect = name + os.sep - self.assertEqual(obj.app_path, expect) - self.assertEqual(obj.app_name, "RouterSDKDemo") - self.assertEqual(obj.mod_name, "RouterSDKDemo") - - return - - def test_normalize_app_name(self): - """ - :return: - """ - from cp_lib.app_name_parse import normalize_app_name, \ - get_module_name, get_app_name, get_app_path - # TODO - test get_run_name()! - import os - - print() # move past the '.' - - logging.info("TEST normalize_app_name()") - tests = [ - ("network\\tcp_echo\\file.py", ["network", "tcp_echo", "file.py"]), - ("network\\tcp_echo\\file", ["network", "tcp_echo", "file", ""]), - ("network\\tcp_echo\\", ["network", "tcp_echo", ""]), - ("network\\tcp_echo", ["network", "tcp_echo", ""]), - - ("network/tcp_echo/file.py", ["network", "tcp_echo", "file.py"]), - ("network/tcp_echo/file", ["network", "tcp_echo", "file", ""]), - ("network/tcp_echo/", ["network", "tcp_echo", ""]), - ("network/tcp_echo", ["network", "tcp_echo", ""]), - - ("network.tcp_echo.file.py", ["network", "tcp_echo", "file.py"]), - ("network.tcp_echo.file", ["network", "tcp_echo", "file", ""]), - ("network.tcp_echo.", ["network", "tcp_echo", ""]), - ("network.tcp_echo", ["network", "tcp_echo", ""]), - - ("network", ["network", ""]), - ("network.py", ["", "network.py"]), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = normalize_app_name(source) - # logging.debug( - # "normalize_app_name({0}) = {1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.info("TEST get_module_name()") - tests = [ - ("network\\tcp_echo\\file.py", "network.tcp_echo"), - ("network\\tcp_echo\\file", "network.tcp_echo.file"), - ("network\\tcp_echo", "network.tcp_echo"), - - ("network/tcp_echo/file.py", "network.tcp_echo"), - ("network/tcp_echo/file", "network.tcp_echo.file"), - ("network/tcp_echo", "network.tcp_echo"), - - ("network.tcp_echo.file.py", "network.tcp_echo"), - ("network.tcp_echo.file", "network.tcp_echo.file"), - ("network.tcp_echo", "network.tcp_echo"), - - ("network", "network"), - ("network.py", ""), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = get_module_name(source) - # logging.debug( - # "get_module_name({0}) = {1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.info("TEST get_app_name()") - tests = [ - ("network\\tcp_echo\\file.py", "tcp_echo"), - ("network\\tcp_echo\\file", "file"), - ("network\\tcp_echo", "tcp_echo"), - - ("network/tcp_echo/file.py", "tcp_echo"), - ("network/tcp_echo/file", "file"), - ("network/tcp_echo", "tcp_echo"), - - ("network.tcp_echo.file.py", "tcp_echo"), - ("network.tcp_echo.file", "file"), - ("network.tcp_echo", "tcp_echo"), - - ("network", "network"), - ("network.py", ""), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = get_app_name(source) - # logging.debug("get_app_name({0}) = {1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.info( - "TEST get_app_path(), with native os.sep, = \'{}\'".format(os.sep)) - tests = [ - ("network\\tcp_echo\\file.py", - os.path.join("network", "tcp_echo") + os.sep), - ("network\\tcp_echo\\file", - os.path.join("network", "tcp_echo", "file") + os.sep), - ("network\\tcp_echo", - os.path.join("network", "tcp_echo") + os.sep), - - ("network/tcp_echo/file.py", - os.path.join("network", "tcp_echo") + os.sep), - ("network/tcp_echo/file", - os.path.join("network", "tcp_echo", "file") + os.sep), - ("network/tcp_echo", - os.path.join("network", "tcp_echo") + os.sep), - - ("network.tcp_echo.file.py", - os.path.join("network", "tcp_echo") + os.sep), - ("network.tcp_echo.file", - os.path.join("network", "tcp_echo", "file") + os.sep), - ("network.tcp_echo", - os.path.join("network", "tcp_echo") + os.sep), - - ("network", "network" + os.sep), - ("network.py", ""), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = get_app_path(source) - # logging.debug("get_module_name({0})={1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.info("TEST get_app_path(), forced LINUX separator of \'/\'") - tests = [ - ("network\\tcp_echo\\file.py", "network/tcp_echo/"), - ("network\\tcp_echo\\file", "network/tcp_echo/file/"), - ("network\\tcp_echo", "network/tcp_echo/"), - - ("network/tcp_echo/file.py", "network/tcp_echo/"), - ("network/tcp_echo/file", "network/tcp_echo/file/"), - ("network/tcp_echo", "network/tcp_echo/"), - - ("network.tcp_echo.file.py", "network/tcp_echo/"), - ("network.tcp_echo.file", "network/tcp_echo/file/"), - ("network.tcp_echo", "network/tcp_echo/"), - - ("network", "network/"), - ("network.py", ""), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = get_app_path(source, separator='/') - # logging.debug("get_module_name({0})={1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.info("TEST get_app_path(), forced WINDOWS separator of \'\\\'") - tests = [ - ("network\\tcp_echo\\file.py", "network\\tcp_echo\\"), - ("network\\tcp_echo\\file", "network\\tcp_echo\\file\\"), - ("network\\tcp_echo", "network\\tcp_echo\\"), - - ("network/tcp_echo/file.py", "network\\tcp_echo\\"), - ("network/tcp_echo/file", "network\\tcp_echo\\file\\"), - ("network/tcp_echo", "network\\tcp_echo\\"), - - ("network.tcp_echo.file.py", "network\\tcp_echo\\"), - ("network.tcp_echo.file", "network\\tcp_echo\\file\\"), - ("network.tcp_echo", "network\\tcp_echo\\"), - - ("network", "network\\"), - ("network.py", ""), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = get_app_path(source, separator='\\') - # logging.debug("get_module_name({0})={1}".format(source, result)) - - self.assertEqual(result, expect) - - logging.warning("TODO - we don't TEST get_run_name()") - - return - - def test_normalize_path_separator(self): - """ - :return: - """ - from cp_lib.app_name_parse import normalize_path_separator - import os - - print() # move past the '.' - - logging.info("TEST normalize_path_separator() to Windows Style") - tests = [ - ("network\\tcp_echo\\file.py", "network\\tcp_echo\\file.py"), - ("network\\tcp_echo\\file", "network\\tcp_echo\\file"), - ("network\\tcp_echo", "network\\tcp_echo"), - - ("network\\tcp_echo/file.py", "network\\tcp_echo\\file.py"), - - ("network/tcp_echo/file.py", "network\\tcp_echo\\file.py"), - ("network/tcp_echo/file", "network\\tcp_echo\\file"), - ("network/tcp_echo", "network\\tcp_echo"), - - ("network.tcp_echo.file.py", "network.tcp_echo.file.py"), - - ("network", "network"), - ("network.py", "network.py"), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = normalize_path_separator(source, separator="\\") - # logging.debug( - # "normalize_path_separator({0}) = {1}".format(source, result)) - self.assertEqual(result, expect) - - logging.info("TEST normalize_path_separator() to Linux Style") - tests = [ - ("network\\tcp_echo\\file.py", "network/tcp_echo/file.py"), - ("network\\tcp_echo\\file", "network/tcp_echo/file"), - ("network\\tcp_echo", "network/tcp_echo"), - - ("network\\tcp_echo/file", "network/tcp_echo/file"), - - ("network/tcp_echo/file.py", "network/tcp_echo/file.py"), - ("network/tcp_echo/file", "network/tcp_echo/file"), - ("network/tcp_echo", "network/tcp_echo"), - - ("network.tcp_echo.file.py", "network.tcp_echo.file.py"), - - ("network", "network"), - ("network.py", "network.py"), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = normalize_path_separator(source, separator="/") - # logging.debug( - # "normalize_path_separator({0}) = {1}".format(source, result)) - self.assertEqual(result, expect) - - logging.info( - "TEST normalize_path_separator(), native os.sep = \'{}\'".format( - os.sep)) - tests = [ - ("network\\tcp_echo\\file.py", - os.path.join("network", "tcp_echo", "file.py")), - ("network\\tcp_echo\\file", - os.path.join("network", "tcp_echo", "file")), - ("network\\tcp_echo", - os.path.join("network", "tcp_echo")), - - ("network\\tcp_echo/file.py", - os.path.join("network", "tcp_echo", "file.py")), - - ("network/tcp_echo/file.py", - os.path.join("network", "tcp_echo", "file.py")), - ("network/tcp_echo/file", - os.path.join("network", "tcp_echo", "file")), - ("network/tcp_echo", - os.path.join("network", "tcp_echo")), - - ("network.tcp_echo.file.py", "network.tcp_echo.file.py"), - - ("network", "network"), - ("network.py", "network.py"), - ] - - for test in tests: - source = test[0] - expect = test[1] - - result = normalize_path_separator(source) - # logging.debug( - # "normalize_path_separator({0}) = {1}".format(source, result)) - self.assertEqual(result, expect) - - return - - def test_get_settings(self): - """ - :return: - """ - from cp_lib.app_base import CradlepointAppBase - - print() # move past the '.' - - # we'll just use this as example, assuming .config/setting.ini - # and - name = "network.tcp_echo" - obj = CradlepointAppBase(name, call_router=False) - - # just slam in a known 'data tree' - obj.settings = { - 'application': { - 'firmware': '6.1', - 'name': 'make', - 'restart': 'true', - 'reboot': True, - 'sleeping': 'On', - 'explosion': 'enabled', - }, - 'router_api': { - 'user_name': 'admin', - 'interface': 'ENet USB-1', - 'password': '441b1702', - 'local_ip': '192.168.1.1' - }, - 'logging': { - 'syslog_ip': '192.168.1.6', - 'pc_syslog': 'false', - 'level': 'debug' - }, - 'startup': { - 'boot_delay_for_wan': 'True', - 'exit_delay': '30 sec', - 'boot_delay_max': '5 min', - 'bomb_delay': 17, - 'rain_delay': '19', - 'boot_delay_for_time': 'True' - }, - 'glob_dir': 'config', - 'base_name': 'settings', - 'app_dir': 'network\\tcp_echo\\', - } - - logging.info("TEST simple get_setting(), without force_type") - self.assertEqual("make", - obj.get_setting("application.name")) - self.assertEqual("6.1", - obj.get_setting("application.firmware")) - self.assertEqual(True, - obj.get_setting("application.reboot")) - - logging.info("TEST get_setting(), with force_type=bool") - self.assertEqual("true", - obj.get_setting("application.restart")) - self.assertEqual(True, - obj.get_setting("application.restart", - force_type=bool)) - self.assertEqual(True, - obj.get_setting("application.reboot")) - self.assertEqual(True, - obj.get_setting("application.reboot", - force_type=bool)) - self.assertEqual(1, - obj.get_setting("application.reboot", - force_type=int)) - self.assertEqual("On", - obj.get_setting("application.sleeping")) - self.assertEqual(True, - obj.get_setting("application.sleeping", - force_type=bool)) - self.assertEqual("enabled", - obj.get_setting("application.explosion")) - self.assertEqual(True, - obj.get_setting("application.explosion", - force_type=bool)) - # doesn't exist, but force to String means "None" - self.assertEqual(None, - obj.get_setting("application.not_exists", - force_type=bool)) - - with self.assertRaises(ValueError): - # string 'true' can't be forced to int, bool True can - obj.get_setting("application.name", force_type=bool) - - logging.info("TEST get_setting(), with force_type=str") - # [restart] is already string, but [reboot] is bool(True) - self.assertEqual("true", - obj.get_setting("application.restart", - force_type=str)) - self.assertEqual("True", - obj.get_setting("application.reboot", - force_type=str)) - # doesn't exist, & force to String does not means "None" - self.assertEqual(None, - obj.get_setting("application.not_exists")) - self.assertEqual(None, - obj.get_setting("application.not_exists", - force_type=str)) - - logging.info("TEST get_setting_time_secs()") - self.assertEqual( - "30 sec", obj.get_setting("startup.exit_delay")) - self.assertEqual( - 30.0, obj.get_setting_time_secs("startup.exit_delay")) - - self.assertEqual( - "5 min", obj.get_setting("startup.boot_delay_max")) - self.assertEqual( - 300.0, obj.get_setting_time_secs("startup.boot_delay_max")) - - self.assertEqual( - 17, obj.get_setting("startup.bomb_delay")) - self.assertEqual( - 17.0, obj.get_setting_time_secs("startup.bomb_delay")) - - self.assertEqual( - "19", obj.get_setting("startup.rain_delay")) - self.assertEqual( - 19.0, obj.get_setting_time_secs("startup.rain_delay")) - - with self.assertRaises(ValueError): - # string 'true' can't be forced to int, bool True can - obj.get_setting("application.restart", force_type=int) - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_buffer_dump.py b/test/test_buffer_dump.py deleted file mode 100644 index fdc21a7c..00000000 --- a/test/test_buffer_dump.py +++ /dev/null @@ -1,188 +0,0 @@ -# Test the cp_lib.split.version module - -import logging -import unittest - - -class TestBufferDump(unittest.TestCase): - - def test_buffer_dump(self): - """ - Test buffer to lines function - :return: - """ - from cp_lib.buffer_dump import buffer_dump - - tests = [ - {"msg": None, "dat": None, "asc": False, - "exp": ['dump:None, data=None']}, - {"msg": None, "dat": None, "asc": True, - "exp": ['dump:None, data=None']}, - {"msg": "null", "dat": None, "asc": False, - "exp": ['dump:null, data=None']}, - {"msg": "null", "dat": None, "asc": True, - "exp": ['dump:null, data=None']}, - - {"msg": "fruit", "dat": "Apple", "asc": False, - "exp": ['dump:fruit, len=5', '[000] 41 70 70 6C 65']}, - {"msg": "fruit", "dat": "Apple", "asc": True, - "exp": ['dump:fruit, len=5', '[000] 41 70 70 6C 65 \'Apple\'']}, - {"msg": "fruit", "dat": b"Apple", "asc": False, - "exp": ['dump:fruit, len=5 bytes()', '[000] 41 70 70 6C 65']}, - {"msg": "fruit", "dat": b"Apple", "asc": True, - "exp": ['dump:fruit, len=5 bytes()', '[000] 41 70 70 6C 65 b\'Apple\'']}, - - {"msg": "fruit", "dat": "Apple\n", "asc": False, - "exp": ['dump:fruit, len=6', '[000] 41 70 70 6C 65 0A']}, - {"msg": "fruit", "dat": "Apple\n", "asc": True, - "exp": ['dump:fruit, len=6', '[000] 41 70 70 6C 65 0A \'Apple\\n\'']}, - {"msg": "fruit", "dat": b"Apple\n", "asc": False, - "exp": ['dump:fruit, len=6 bytes()', '[000] 41 70 70 6C 65 0A']}, - {"msg": "fruit", "dat": b"Apple\n", "asc": True, - "exp": ['dump:fruit, len=6 bytes()', '[000] 41 70 70 6C 65 0A b\'Apple\\n\'']}, - - {"msg": "fruit nl", "dat": "Apple\r\n\0", "asc": False, - "exp": ['dump:fruit nl, len=8', '[000] 41 70 70 6C 65 0D 0A 00']}, - {"msg": "fruit nl", "dat": "Apple\r\n\0", "asc": True, - "exp": ['dump:fruit nl, len=8', '[000] 41 70 70 6C 65 0D 0A 00 \'Apple\\r\\n\\x00\'']}, - {"msg": "fruit nl", "dat": b"Apple\r\n\0", "asc": False, - "exp": ['dump:fruit nl, len=8 bytes()', - '[000] 41 70 70 6C 65 0D 0A 00']}, - {"msg": "fruit nl", "dat": b"Apple\r\n\0", "asc": True, - "exp": ['dump:fruit nl, len=8 bytes()', - '[000] 41 70 70 6C 65 0D 0A 00 b\'Apple\\r\\n\\x00\'']}, - - {"msg": "longer", "dat": "Apple\nIs found in the country of my birth\n", "asc": False, - "exp": ['dump:longer, len=42', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66', - '[032] 20 6D 79 20 62 69 72 74 68 0A']}, - {"msg": "longer", "dat": "Apple\nIs found in the country of my birth\n", "asc": True, - "exp": ['dump:longer, len=42', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69' + - ' \'Apple\\nIs found i\'', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66' + - ' \'n the country of\'', - '[032] 20 6D 79 20 62 69 72 74 68 0A \' my birth\\n\'']}, - {"msg": "longer", "dat": b"Apple\nIs found in the country of my birth\n", "asc": False, - "exp": ['dump:longer, len=42 bytes()', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66', - '[032] 20 6D 79 20 62 69 72 74 68 0A']}, - {"msg": "longer", "dat": b"Apple\nIs found in the country of my birth\n", "asc": True, - "exp": ['dump:longer, len=42 bytes()', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69' + - ' b\'Apple\\nIs found i\'', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66' + - ' b\'n the country of\'', - '[032] 20 6D 79 20 62 69 72 74 68 0A b\' my birth\\n\'']}, - - {"msg": "Modbus", "dat": "\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09", "asc": False, - "exp": ['dump:Modbus, len=11', - '[000] 01 1F 00 01 02 03 04 05 06 08 09']}, - {"msg": "Modbus", "dat": b"\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09", "asc": False, - "exp": ['dump:Modbus, len=11 bytes()', - '[000] 01 1F 00 01 02 03 04 05 06 08 09']}, - {"msg": "Modbus+", "asc": False, - "dat": "\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09\x00\x01\x02\x03\x04\x05\x06\x08", - "exp": ['dump:Modbus+, len=19', - '[000] 01 1F 00 01 02 03 04 05 06 08 09 00 01 02 03 04', - '[016] 05 06 08']}, - {"msg": "Modbus+", "asc": False, - "dat": b"\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09\x00\x01\x02\x03\x04\x05\x06\x08", - "exp": ['dump:Modbus+, len=19 bytes()', - '[000] 01 1F 00 01 02 03 04 05 06 08 09 00 01 02 03 04', - '[016] 05 06 08']}, - - ] - - for test in tests: - # logging.debug("Test:{}".format(test)) - - result = buffer_dump(test['msg'], test['dat'], test['asc']) - for line in result: - logging.debug(" {}".format(line)) - self.assertEqual(result, test['exp']) - - logging.debug("") - - return - - def test_logger_buffer_dump(self): - """ - Test buffer to lines function - :return: - """ - from cp_lib.buffer_dump import logger_buffer_dump - - tests = [ - {"msg": "fruit", "dat": "Apple", "asc": False, - "exp": ['dump:fruit, len=5', '[000] 41 70 70 6C 65']}, - {"msg": "fruit", "dat": "Apple", "asc": True, - "exp": ['dump:fruit, len=5', '[000] 41 70 70 6C 65 \'Apple\'']}, - {"msg": "fruit", "dat": b"Apple", "asc": False, - "exp": ['dump:fruit, len=5 bytes()', '[000] 41 70 70 6C 65']}, - {"msg": "fruit", "dat": b"Apple", "asc": True, - "exp": ['dump:fruit, len=5 bytes()', '[000] 41 70 70 6C 65 b\'Apple\'']}, - - {"msg": "longer", "dat": "Apple\nIs found in the country of my birth\n", "asc": False, - "exp": ['dump:longer, len=42', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66', - '[032] 20 6D 79 20 62 69 72 74 68 0A']}, - {"msg": "longer", "dat": "Apple\nIs found in the country of my birth\n", "asc": True, - "exp": ['dump:longer, len=42', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69' + - ' \'Apple\\nIs found i\'', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66' + - ' \'n the country of\'', - '[032] 20 6D 79 20 62 69 72 74 68 0A \' my birth\\n\'']}, - {"msg": "longer", "dat": b"Apple\nIs found in the country of my birth\n", "asc": False, - "exp": ['dump:longer, len=42 bytes()', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66', - '[032] 20 6D 79 20 62 69 72 74 68 0A']}, - {"msg": "longer", "dat": b"Apple\nIs found in the country of my birth\n", "asc": True, - "exp": ['dump:longer, len=42 bytes()', - '[000] 41 70 70 6C 65 0A 49 73 20 66 6F 75 6E 64 20 69' + - ' b\'Apple\\nIs found i\'', - '[016] 6E 20 74 68 65 20 63 6F 75 6E 74 72 79 20 6F 66' + - ' b\'n the country of\'', - '[032] 20 6D 79 20 62 69 72 74 68 0A b\' my birth\\n\'']}, - - {"msg": "Modbus", "dat": "\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09", "asc": False, - "exp": ['dump:Modbus, len=11', - '[000] 01 1F 00 01 02 03 04 05 06 08 09']}, - {"msg": "Modbus", "dat": b"\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09", "asc": False, - "exp": ['dump:Modbus, len=11 bytes()', - '[000] 01 1F 00 01 02 03 04 05 06 08 09']}, - {"msg": "Modbus+", "asc": False, - "dat": "\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09\x00\x01\x02\x03\x04\x05\x06\x08", - "exp": ['dump:Modbus+, len=19', - '[000] 01 1F 00 01 02 03 04 05 06 08 09 00 01 02 03 04', - '[016] 05 06 08']}, - {"msg": "Modbus+", "asc": False, - "dat": b"\x01\x1F\x00\x01\x02\x03\x04\x05\x06\x08\x09\x00\x01\x02\x03\x04\x05\x06\x08", - "exp": ['dump:Modbus+, len=19 bytes()', - '[000] 01 1F 00 01 02 03 04 05 06 08 09 00 01 02 03 04', - '[016] 05 06 08']}, - - ] - - logging.info("") - - logger = logging.getLogger('unitest') - logger.setLevel(logging.DEBUG) - - for test in tests: - # logging.debug("Test:{}".format(test)) - - logger_buffer_dump(logger, test['msg'], test['dat'], test['asc']) - logging.info("") - - return - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_clean_ini.py b/test/test_clean_ini.py deleted file mode 100644 index 68837b44..00000000 --- a/test/test_clean_ini.py +++ /dev/null @@ -1,85 +0,0 @@ -# Test the cp_lib.clean_ini module - -import logging -import os.path -import shutil -import unittest - -from cp_lib.clean_ini import clean_ini_file, DEF_BACKUP_EXT - - -class TestCleanIni(unittest.TestCase): - - TEST_FILE_NAME_INI = "test/test.ini" - - def test_settings(self): - """ - Test the raw/simple handling of 1 INI to JSON in any directory - :return: - """ - - data_list = [ - "", - "# Global settings", - "", - "[Logging]", - "level = debug", - "name = silly_toes", - "log_file = trace.txt", - "#server = (\"192.168.0.10\", 514)", - "", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password =441b1702", - "", - "", - ] - - # make the original bad-ish file - _han = open(self.TEST_FILE_NAME_INI, 'w') - for line in data_list: - _han.write(line + "\n") - _han.close() - - test_file_name_bak = self.TEST_FILE_NAME_INI + DEF_BACKUP_EXT - self._remove_name_no_error(test_file_name_bak) - - self.assertTrue(os.path.exists(self.TEST_FILE_NAME_INI)) - self.assertFalse(os.path.exists(test_file_name_bak)) - - clean_ini_file(self.TEST_FILE_NAME_INI, backup=True) - - self.assertTrue(os.path.exists(self.TEST_FILE_NAME_INI)) - self.assertTrue(os.path.exists(test_file_name_bak)) - - # self.assertEqual(settings[cp_logging.SETS_NAME], cp_logging.DEF_NAME) - - # clean up the temp file - # self._remove_name_no_error(self.TEST_FILE_NAME_INI) - - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_cp_logging.py b/test/test_cp_logging.py deleted file mode 100644 index 1b478d74..00000000 --- a/test/test_cp_logging.py +++ /dev/null @@ -1,207 +0,0 @@ -# Test the cp_lib.cp_logging module - -import json -import logging -import os.path -import shutil -import unittest - -import cp_lib.cp_logging as cp_logging - - -class TestCpLogging(unittest.TestCase): - - TEST_FILE_NAME_INI = "test/test.ini" - TEST_FILE_NAME_JSON = "test/test.json" - - def test_settings(self): - """ - Test the raw/simple handling of 1 INI to JSON in any directory - :return: - """ - - # start with NO changes - logging.info("test #0 - all defaults") - settings = cp_logging._process_settings() - # logging.debug("settings={}".format(settings)) - - self.assertIsNone(settings[cp_logging.SETS_FILE]) - self.assertIsNone(settings[cp_logging.SETS_SYSLOG_IP]) - - self.assertEqual(settings[cp_logging.SETS_NAME], cp_logging.DEF_NAME) - self.assertEqual(settings[cp_logging.SETS_LEVEL], logging.INFO) - - logging.info("test #1 - confirm the LEVEL setting") - tests = [ - ("10", logging.DEBUG), - (10, logging.DEBUG), - ("debug", logging.DEBUG), - ("Debug", logging.DEBUG), - ("DEBUG", logging.DEBUG), - - (-10, ValueError), - (10.0, ValueError), - ("Junk", ValueError), - ("", ValueError), - (None, ValueError), - ] - - for test in tests: - value = test[0] - expect = test[1] - - # logging.info("") - # logging.debug("Level={0}, type={1}".format(value, type(value))) - ini_data = [ - "[application]", - "name = tcp_echo", - "", - "[logging]", - "level = {}".format(value), - ] - settings = self._make_ini_file(ini_data) - - if expect == ValueError: - with self.assertRaises(ValueError): - cp_logging._process_settings(settings) - else: - settings = cp_logging._process_settings(settings) - self.assertEqual(settings[cp_logging.SETS_LEVEL], expect) - - logging.info("test #2 - confirm the NAME setting") - - expect = "tcp_echo" - ini_data = [ - "[application]", - "name = tcp_echo", - ] - settings = self._make_ini_file(ini_data) - settings = cp_logging._process_settings(settings) - self.assertEqual(settings[cp_logging.SETS_NAME], expect) - - expect = "runny" - ini_data = [ - "[application]", - "name = tcp_echo", - "", - "[logging]", - "name = {}".format(expect), - ] - settings = self._make_ini_file(ini_data) - settings = cp_logging._process_settings(settings) - self.assertEqual(settings[cp_logging.SETS_NAME], expect) - - # expect = "" (empty string - is ValueError) - ini_data = [ - "[application]", - "name = tcp_echo", - "", - "[logging]", - "name = ", - ] - settings = self._make_ini_file(ini_data) - with self.assertRaises(ValueError): - cp_logging._process_settings(settings) - - logging.info("test #3 - confirm the LOG FILE NAME setting") - tests = [ - ("log.txt", "log.txt"), - ("test/log.txt", "test/log.txt"), - ("", None), - ] - - for test in tests: - value = test[0] - expect = test[1] - - ini_data = [ - "[application]", - "name = tcp_echo", - "", - "[logging]", - "log_file = {}".format(expect), - ] - settings = self._make_ini_file(ini_data) - settings = cp_logging._process_settings(settings) - self.assertEqual(settings[cp_logging.SETS_FILE], expect) - - logging.info("test #4 - confirm the SYSLOG SERVER setting") - tests = [ - ("192.168.0.10", "192.168.0.10", 514), - (' ("192.168.0.10", 514)', "192.168.0.10", 514), - ('["192.168.0.10", 514]', "192.168.0.10", 514), - ('("10.4.23.10", 8514)', "10.4.23.10", 8514), - ("", None, 514), - ('("", 8514)', ValueError, 0), - ('("10.4.23.10", -1)', ValueError, 0), - ('("10.4.23.10", 0x10000)', ValueError, 0), - ] - - for test in tests: - value = test[0] - expect_ip = test[1] - expect_port = test[2] - - ini_data = [ - "[application]", - "name = tcp_echo", - "", - "[logging]", - "syslog = {}".format(value), - ] - settings = self._make_ini_file(ini_data) - - if expect_ip == ValueError: - with self.assertRaises(ValueError): - cp_logging._process_settings(settings) - else: - settings = cp_logging._process_settings(settings) - self.assertEqual(settings[cp_logging.SETS_SYSLOG_IP], expect_ip) - if expect_ip is not None: - self.assertEqual(settings[cp_logging.SETS_SYSLOG_PORT], expect_port) - - # clean up the temp file - self._remove_name_no_error(self.TEST_FILE_NAME_INI) - self._remove_name_no_error(self.TEST_FILE_NAME_JSON) - self._remove_name_no_error(self.TEST_FILE_NAME_JSON + ".save") - - return - - def _make_ini_file(self, data_list: list): - """Bounce settings through INI and JSON""" - from cp_lib.load_settings import propagate_ini_to_json - - _han = open(self.TEST_FILE_NAME_INI, 'w') - for line in data_list: - _han.write(line + "\n") - _han.close() - - propagate_ini_to_json(self.TEST_FILE_NAME_INI, self.TEST_FILE_NAME_JSON) - file_han = open(self.TEST_FILE_NAME_JSON, "r") - settings = json.load(file_han) - file_han.close() - - return settings - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_cplib_data_tree.py b/test/test_cplib_data_tree.py deleted file mode 100644 index b227d9c0..00000000 --- a/test/test_cplib_data_tree.py +++ /dev/null @@ -1,436 +0,0 @@ -# Test the PARSE DATA module -import sys -import unittest - -from cp_lib.data.data_tree import DataTreeItemNotFound, DataTreeItemBadValue, \ - get_item, get_item_bool, get_item_int, data_tree_clean, \ - get_item_float, get_item_time_duration_to_seconds, put_item - -# mimic a settings.ini config -data_tree = { - "logging": { - "level": "debug", - "syslog_ip": "192.168.35.6", - "pc_syslog": False, - }, - "router_api": { - "user_name": None, - "interface": "null", - "local_ip": "192.168.35.1", - "password": "441b537e", - # we nest one more level to check depth - "application": { - "name": "make", - "firmware": "6.1", - "restart": "true", - "reboot": True, - "other": { - "able": True, - "babble": False, - "cable": None, - } - }, - }, - "startup": { - "boot_delay_max": "5 min", - "boot_delay_for_time": True, - "boot_delay_for_wan": True, - "exit_delay": "30 sec", - } -} - - -class TestParseDataTree(unittest.TestCase): - - def test_get_item(self): - - # this one's not there, so expect None - self.assertEqual(None, get_item(data_tree, "")) - self.assertEqual(None, get_item(data_tree, "apple")) - self.assertEqual(None, get_item(data_tree, - "router_api.apple")) - self.assertEqual(None, get_item(data_tree, - "router_api.apple.core")) - - # here want the exception thrown, not to return None - with self.assertRaises(DataTreeItemNotFound): - get_item(data_tree, "", throw_exception=True) - get_item(data_tree, "apple", throw_exception=True) - get_item(data_tree, "router_api.apple", throw_exception=True) - get_item(data_tree, "router_api.apple.core", throw_exception=True) - - # however, confirm None which is found is returned as None - self.assertEqual(None, get_item( - data_tree, "router_api.user_name", throw_exception=True)) - self.assertEqual(None, get_item( - data_tree, "router_api.application.other.cable", - throw_exception=True)) - - self.assertEqual("debug", get_item(data_tree, "logging.level")) - self.assertEqual("192.168.35.6", get_item(data_tree, - "logging.syslog_ip")) - self.assertEqual(False, get_item(data_tree, "logging.pc_syslog")) - - self.assertEqual(None, get_item(data_tree, "router_api.user_name")) - self.assertEqual("null", get_item(data_tree, "router_api.interface")) - self.assertEqual("192.168.35.1", get_item(data_tree, - "router_api.local_ip")) - self.assertEqual("441b537e", get_item(data_tree, - "router_api.password")) - - self.assertEqual("make", get_item(data_tree, - "router_api.application.name")) - self.assertEqual("6.1", get_item(data_tree, - "router_api.application.firmware")) - self.assertEqual("true", get_item(data_tree, - "router_api.application.restart")) - self.assertEqual(True, get_item(data_tree, - "router_api.application.reboot")) - - self.assertEqual(True, get_item(data_tree, - "router_api.application.other.able")) - self.assertEqual(False, get_item( - data_tree, "router_api.application.other.babble")) - self.assertEqual(None, get_item( - data_tree, "router_api.application.other.cable")) - - self.assertEqual("5 min", get_item(data_tree, - "startup.boot_delay_max")) - self.assertEqual(True, get_item(data_tree, - "startup.boot_delay_for_time")) - self.assertEqual(True, get_item(data_tree, - "startup.boot_delay_for_wan")) - self.assertEqual("30 sec", get_item(data_tree, "startup.exit_delay")) - - with self.assertRaises(TypeError): - # first param must be dict() - get_item(None, "startup.exit_delay") - get_item(True, "startup.exit_delay") - get_item(10, "startup.exit_delay") - get_item("Hello", "startup.exit_delay") - - with self.assertRaises(TypeError): - # second param must be str() - get_item(data_tree, None) - get_item(data_tree, True) - get_item(data_tree, 10) - - self.assertEqual(None, get_item(data_tree, "")) - - # check a few sub-tree pulls - self.assertEqual(data_tree["logging"], - get_item(data_tree, "logging")) - self.assertEqual(data_tree["router_api"], - get_item(data_tree, "router_api")) - self.assertEqual(data_tree["router_api"]["application"], - get_item(data_tree, "router_api.application")) - self.assertEqual(data_tree["router_api"]["application"]["other"], - get_item(data_tree, "router_api.application.other")) - - return - - def test_data_tree_clean(self): - # mimic a settings.ini config - - # make new tree, since we change the tree items - _data_tree = { - "logging": { - "level": "debug", - "syslog_ip": "false", - "pc_syslog": False, - }, - "router_api": { - "user_name": None, - "interface": "null", - "local_ip": "192.168.35.1", - "password": "none", - "application": { - "name": "make", - "firmware": "6.1", - "restart": "tRUe", - "reboot": True, - }, - }, - } - - # check everything is as expected - self.assertEqual("debug", get_item(_data_tree, "logging.level")) - self.assertEqual("false", get_item(_data_tree, "logging.syslog_ip")) - self.assertEqual(False, get_item(_data_tree, "logging.pc_syslog")) - - self.assertEqual(None, get_item(_data_tree, "router_api.user_name")) - self.assertEqual("null", get_item(_data_tree, "router_api.interface")) - self.assertEqual("192.168.35.1", get_item(_data_tree, - "router_api.local_ip")) - self.assertEqual("none", get_item(_data_tree, "router_api.password")) - - self.assertEqual("make", get_item(_data_tree, - "router_api.application.name")) - self.assertEqual("6.1", get_item(_data_tree, - "router_api.application.firmware")) - self.assertEqual("tRUe", get_item(_data_tree, - "router_api.application.restart")) - self.assertEqual(True, get_item(_data_tree, - "router_api.application.reboot")) - - # now we go through & clean - data_tree_clean(_data_tree) - - self.assertEqual("debug", get_item(_data_tree, "logging.level")) - self.assertEqual(False, get_item(_data_tree, "logging.syslog_ip")) - self.assertEqual(False, get_item(_data_tree, "logging.pc_syslog")) - - self.assertEqual(None, get_item(_data_tree, "router_api.user_name")) - self.assertEqual(None, get_item(_data_tree, "router_api.interface")) - self.assertEqual("192.168.35.1", get_item(_data_tree, - "router_api.local_ip")) - self.assertEqual(None, get_item(_data_tree, "router_api.password")) - - self.assertEqual("make", get_item(_data_tree, - "router_api.application.name")) - self.assertEqual("6.1", get_item(_data_tree, - "router_api.application.firmware")) - self.assertEqual(True, get_item(_data_tree, - "router_api.application.restart")) - self.assertEqual(True, get_item(_data_tree, - "router_api.application.reboot")) - - return - - def test_get_item_bool(self): - - mini_tree = { - "are_true": { - "a": True, - "b": "t", - "c": "T", - "d": "true", - "e": "tRUe", - "f": "TRUE", - "g": "on", - "h": "On", - "i": "ON", - "j": "enable", - "k": "enabled", - "l": 1, - "m": '1', - "are_false": { - "a": False, - "b": "f", - "c": "F", - "d": "false", - "e": "faLSe", - "f": "FALSE", - "g": "off", - "h": "Off", - "i": "OFF", - "j": "disable", - "k": "disabled", - "l": 0, - "m": '0', - }, - }, - "junk": { - "a": None, - "b": 10, - "c": 'Hello', - "d": {'g': True}, - "e": (True, 10), - } - } - - self.assertTrue(get_item_bool(mini_tree, "are_true.a")) - self.assertTrue(get_item_bool(mini_tree, "are_true.b")) - self.assertTrue(get_item_bool(mini_tree, "are_true.c")) - self.assertTrue(get_item_bool(mini_tree, "are_true.d")) - self.assertTrue(get_item_bool(mini_tree, "are_true.e")) - self.assertTrue(get_item_bool(mini_tree, "are_true.f")) - self.assertTrue(get_item_bool(mini_tree, "are_true.g")) - self.assertTrue(get_item_bool(mini_tree, "are_true.h")) - self.assertTrue(get_item_bool(mini_tree, "are_true.i")) - self.assertTrue(get_item_bool(mini_tree, "are_true.j")) - self.assertTrue(get_item_bool(mini_tree, "are_true.k")) - self.assertTrue(get_item_bool(mini_tree, "are_true.l")) - self.assertTrue(get_item_bool(mini_tree, "are_true.m")) - - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.a")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.b")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.c")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.d")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.e")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.f")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.g")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.h")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.i")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.j")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.k")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.l")) - self.assertFalse(get_item_bool(mini_tree, "are_true.are_false.m")) - - # just check the bool items - self.assertFalse(get_item_bool(data_tree, "logging.pc_syslog")) - self.assertTrue(get_item_bool(data_tree, - "router_api.application.restart")) - self.assertTrue(get_item_bool(data_tree, - "router_api.application.reboot")) - self.assertTrue(get_item_bool(data_tree, - "router_api.application.other.able")) - self.assertFalse(get_item_bool(data_tree, - "router_api.application.other.babble")) - self.assertTrue(get_item_bool(data_tree, - "startup.boot_delay_for_time")) - self.assertTrue(get_item_bool(data_tree, - "startup.boot_delay_for_wan")) - - with self.assertRaises(DataTreeItemBadValue): - # none of these are Boolean. - get_item_bool(mini_tree, "junk.a") - get_item_bool(mini_tree, "junk.b") - get_item_bool(mini_tree, "junk.c") - get_item_bool(mini_tree, "junk.d") - get_item_bool(mini_tree, "junk.e") - - return - - def test_get_item_integer(self): - - mini_tree = { - "okay": { - "a": 10, - "b": "13", - "c": " 99", - "d": "0x13", - }, - "junk": { - "a": None, - "b": True, - "c": 'Hello', - "d": {'g': True}, - "e": (True, 10), - } - } - - self.assertEqual(10, get_item_int(mini_tree, "okay.a")) - self.assertEqual(13, get_item_int(mini_tree, "okay.b")) - self.assertEqual(99, get_item_int(mini_tree, "okay.c")) - self.assertEqual(19, get_item_int(mini_tree, "okay.d")) - - with self.assertRaises(DataTreeItemBadValue): - # none of these are integers. - get_item_int(mini_tree, "junk.a") - get_item_int(mini_tree, "junk.b") - get_item_int(mini_tree, "junk.c") - get_item_int(mini_tree, "junk.d") - get_item_int(mini_tree, "junk.e") - - return - - def test_get_item_float(self): - - mini_tree = { - "okay": { - "a": 10, - "b": "13", - "c": " 99", - "d": 10.1, - "e": "13.2 ", - "f": " 99.3", - }, - "junk": { - "a": None, - "b": True, - "c": 'Hello', - "d": {'g': True}, - "e": (True, 10), - } - } - - self.assertEqual(10.0, get_item_float(mini_tree, "okay.a")) - self.assertEqual(13.0, get_item_float(mini_tree, "okay.b")) - self.assertEqual(99.0, get_item_float(mini_tree, "okay.c")) - - self.assertEqual(10.1, get_item_float(mini_tree, "okay.d")) - self.assertEqual(13.2, get_item_float(mini_tree, "okay.e")) - self.assertEqual(99.3, get_item_float(mini_tree, "okay.f")) - - with self.assertRaises(DataTreeItemBadValue): - # none of these are floats. - get_item_float(mini_tree, "junk.a") - get_item_float(mini_tree, "junk.b") - get_item_float(mini_tree, "junk.c") - get_item_float(mini_tree, "junk.d") - get_item_float(mini_tree, "junk.e") - - return - - def test_get_item_time_duration(self): - - mini_tree = { - "okay": { - "a": 10, - "b": "13", - "c": " 99", - - "d": 10.1, - "e": "13.2 ", - "f": " 99.3", - - "g": "10 sec", - "h": "10 min", - "i": "10 hour", - }, - "junk": { - "a": None, - "b": True, - "c": 'Hello', - "d": {'g': True}, - "e": (True, 10), - } - } - - self.assertEqual(10.0, get_item_time_duration_to_seconds(mini_tree, - "okay.a")) - self.assertEqual(13.0, get_item_time_duration_to_seconds(mini_tree, - "okay.b")) - self.assertEqual(99.0, get_item_time_duration_to_seconds(mini_tree, - "okay.c")) - - self.assertEqual(10.1, get_item_time_duration_to_seconds(mini_tree, - "okay.d")) - self.assertEqual(13.2, get_item_time_duration_to_seconds(mini_tree, - "okay.e")) - self.assertEqual(99.3, get_item_time_duration_to_seconds(mini_tree, - "okay.f")) - - self.assertEqual(10.0, get_item_time_duration_to_seconds(mini_tree, - "okay.g")) - self.assertEqual(600.0, get_item_time_duration_to_seconds(mini_tree, - "okay.h")) - self.assertEqual(36000.0, get_item_time_duration_to_seconds(mini_tree, - "okay.i")) - - with self.assertRaises(DataTreeItemBadValue): - # none of these are time durations. - get_item_time_duration_to_seconds(mini_tree, "junk.a") - get_item_time_duration_to_seconds(mini_tree, "junk.b") - get_item_time_duration_to_seconds(mini_tree, "junk.c") - get_item_time_duration_to_seconds(mini_tree, "junk.d") - get_item_time_duration_to_seconds(mini_tree, "junk.e") - - return - - def test_put_item(self): - - test_tree = dict() - - with self.assertRaises(TypeError): - put_item(None, "usa", "USA") - put_item(test_tree, 10, "USA") - - put_item(test_tree, "minnesota", "MN") - print("tree:{}".format(test_tree)) - - return - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_gps_nmea.py b/test/test_cplib_gps_nmea.py deleted file mode 100644 index 93c78209..00000000 --- a/test/test_cplib_gps_nmea.py +++ /dev/null @@ -1,254 +0,0 @@ -# Test the CP_LIB gps NMEA parser -import sys -import time -import unittest - -import cp_lib.gps_nmea as nmea - - -class TestGpsNmea(unittest.TestCase): - - def test_checksum(self): - - tests = [ - ("$GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." + - "3,M,-33.0,M,,*6F\r\n", - "GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." + - "3,M,-33.0,M,,", 0x6F), - ("$GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," + - "020516,0.0,E,A*1D\r\n", - "GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," + - "020516,0.0,E,A", 0x1D), - ("$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n", - "GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A", - 0x23), - ("$PCPTI,IBR1100-702,222227,222227*33\r\n", - "PCPTI,IBR1100-702,222227,222227", - 0x33), - ("$GPGGA,222237.0,4500.819061,N,09320.092805,W,1,09,0.8,281.3" + - ",M,-33.0,M,,*66\r\n", - "GPGGA,222237.0,4500.819061,N,09320.092805,W,1,09,0.8,281.3" + - ",M,-33.0,M,,", 0x66), - ("$GPRMC,222237.0,A,4500.819061,N,09320.092805,W,0.0,353.2" + - ",020516,0.0,E,A*1C\r\n", - "GPRMC,222237.0,A,4500.819061,N,09320.092805,W,0.0,353.2" + - ",020516,0.0,E,A", 0x1C), - - # some bad tests - (None, TypeError, 0), - ("", IndexError, 0), - ] - - for test in tests: - full = test[0] - base = test[1] - csum = test[2] - - if base == TypeError: - with self.assertRaises(TypeError): - nmea.calc_checksum(full) - - elif base == IndexError: - with self.assertRaises(IndexError): - nmea.calc_checksum(full) - - else: - self.assertEqual(nmea.calc_checksum(full), csum) - self.assertTrue(nmea.validate_checksum(full)) - self.assertEqual(nmea.calc_checksum(base), csum) - self.assertEqual(nmea.wrap_sentence(base), full) - - return - - def test_rmc(self): - - tests = [ - ("$GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," + - "020516,0.0,E,A*1D\r\n", - {'course': 353.2, 'long': -93.33488008333333, 'knots': 0.0, - 'lat': 45.013651016666664, 'valid': True, - 'gps_utc': 1462227747.0, 'time': 1462302255.968968}), - ("$GPRMC,222237.0,A,4500.819061,N,09320.092805,W,0.0,353.2" + - ",020516,0.0,E,A*1C\r\n", - {'course': 353.2, 'long': -93.33488008333333, 'knots': 0.0, - 'lat': 45.013651016666664, 'valid': True, - 'gps_utc': 1462227757.0, 'time': 1462302255.968968}), - ] - - obj = nmea.NmeaStatus() - obj.date_time = True - obj.speed = True - obj.altitude = True - obj.coor_ddmm = False - obj.coor_dec = True - - for test in tests: - sentence = test[0] - expect = test[1] - now = 1462302255.968968 - - # print("source[%s]" % sentence) - obj.start(now) - result = obj.parse_sentence(sentence) - self.assertTrue(result) - obj.publish() - - result = obj.get_attributes() - # print("RMC result:{}".format(result)) - # print("RMC expect:{}".format(expect)) - self.assertEqual(result, expect) - - return - - def test_vtg(self): - - tests = [ - ("$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n", - {'course': 353.2, 'kmh': 0.0, 'knots': 0.0, - 'time': 1462302255.968968}), - ] - - obj = nmea.NmeaStatus() - obj.date_time = True - obj.speed = True - obj.altitude = True - obj.coor_ddmm = False - obj.coor_dec = True - - for test in tests: - sentence = test[0] - expect = test[1] - now = 1462302255.968968 - - # print("inp [%s]" % sentence) - obj.start(now) - result = obj.parse_sentence(sentence) - self.assertTrue(result) - obj.publish() - - result = obj.get_attributes() - # print("out[{}]".format(result)) - self.assertEqual(result, expect) - - return - - def test_gga(self): - - tests = [ - ("$GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." + - "3,M,-33.0,M,,*6F\r\n", - {'long': -93.33488008333333, 'lat': 45.013651016666664, - 'num_sat': 10, 'alt': 281.3, 'time': 1462302255.968968}), - ("$GPGGA,222237.0,4500.819061,N,09320.092805,W,1,09,0.8,281.3" + - ",M,-33.0,M,,*66\r\n", - {'long': -93.33488008333333, 'lat': 45.013651016666664, - 'num_sat': 9, 'alt': 281.3, 'time': 1462302255.968968}), - ] - - obj = nmea.NmeaStatus() - obj.date_time = True - obj.speed = True - obj.altitude = True - obj.coor_ddmm = False - obj.coor_dec = True - - for test in tests: - sentence = test[0] - expect = test[1] - now = 1462302255.968968 - - # print("inp [%s]" % sentence) - obj.start(now) - result = obj.parse_sentence(sentence) - self.assertTrue(result) - obj.publish() - - result = obj.get_attributes() - # print("out[{}]".format(result)) - self.assertEqual(result, expect) - - return - - def test_batch(self): - - obj = nmea.NmeaStatus() - obj.date_time = True - obj.speed = True - obj.altitude = True - obj.coor_ddmm = False - obj.coor_dec = True - - now = 1462302255.968968 - - # print("[%s]" % sentence) - obj.start(now) - - sentence = "$GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0," + \ - "353.2,020516,0.0,E,A*1D\r\n" - result = obj.parse_sentence(sentence) - self.assertTrue(result) - - sentence = "$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n" - result = obj.parse_sentence(sentence) - self.assertTrue(result) - - sentence = "$GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8" + \ - ",281.3,M,-33.0,M,,*6F\r\n" - result = obj.parse_sentence(sentence) - self.assertTrue(result) - - obj.publish() - expect = {'course': 353.2, 'long': -93.33488008333333, 'knots': 0.0, - 'lat': 45.013651016666664, 'valid': True, - 'gps_utc': 1462227747.0, 'num_sat': 10, 'alt': 281.3, - 'kmh': 0.0, 'time': 1462302255.968968} - - result = obj.get_attributes() - # print("out[{}]".format(result)) - self.assertEqual(result, expect) - - return - - def test_fix_time_sentence(self): - tests = [ - ("$GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." + - "3,M,-33.0,M,,*6F\r\n", - "$GPGGA,171614.0,4500.819061,N,09320.092805,W,1,10,0.8,281." + - "3,M,-33.0,M,,*6E\r\n"), - ("$GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," + - "020516,0.0,E,A*1D\r\n", - "$GPRMC,171614.0,A,4500.819061,N,09320.092805,W,0.0,353.2," + - "010516,0.0,E,A*1F\r\n"), - ("$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n", - "$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n"), - ("$PCPTI,IBR1100-702,222227,222227*33\r\n", - "$PCPTI,IBR1100-702,222227,222227*33\r\n"), - - # some bad tests - (None, TypeError, 0), - ("", IndexError, 0), - ] - - use_time = time.strptime("2016-05-01 17:16:14", "%Y-%m-%d %H:%M:%S") - - for test in tests: - source = test[0] - expect = test[1] - - if expect == TypeError: - with self.assertRaises(TypeError): - nmea.fix_time_sentence(source, use_time) - - elif expect == IndexError: - with self.assertRaises(IndexError): - nmea.fix_time_sentence(source, use_time) - - else: - result = nmea.fix_time_sentence(source, use_time) - self.assertEqual(result, expect) - - return - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_modbus_asc.py b/test/test_cplib_modbus_asc.py deleted file mode 100644 index ed6abe8e..00000000 --- a/test/test_cplib_modbus_asc.py +++ /dev/null @@ -1,229 +0,0 @@ -# Test the MODBUS ASCII module - -import unittest - -import cp_lib.modbus.transaction as ia_trans -import cp_lib.modbus.modbus_asc as mbus_asc -from cp_lib.modbus.transaction_modbus import ModbusTransaction, \ - ModbusBadForm, ModbusBadChecksum - - -class TestModbusAsc(unittest.TestCase): - - def test_code_ascii(self): - - tests = [ - {'src': b'\x01\x03', 'exp': 0xFC}, - {'src': b'\x01\x03\x00', 'exp': 0xFC}, - {'src': b'\x01\x03\x00\x00', 'exp': 0xFC}, - {'src': b'\x01\x03\x00\x00\x00', 'exp': 0xFC}, - {'src': b'\x01\x03\x00\x00\x00\x0A', 'exp': 0xF2}, - - {'src': b'', 'exp': ModbusBadForm}, - {'src': b'\x01', 'exp': ModbusBadForm}, - {'src': '\x01\x03\x00\x00\x00\x0A', 'exp': TypeError}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_asc.calc_checksum(test['src']) - - elif test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_asc.calc_checksum(test['src']) - - else: - result = mbus_asc.calc_checksum(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_encode_to_wire(self): - - tests = [ - {'src': b'\x01\x03\x00\x00\x00\x0A', - 'exp': b':01030000000AF2\r\n'}, - {'src': b'\x01\x03\x00\x00\x00', 'exp': b':0103000000FC\r\n'}, - {'src': b'\x01\x03\x00\x00', 'exp': b':01030000FC\r\n'}, - {'src': b'\x01\x03\x00', 'exp': b':010300FC\r\n'}, - {'src': b'\x01\x03', 'exp': b':0103FC\r\n'}, - - {'src': b'\x01', 'exp': ModbusBadForm}, - {'src': b'', 'exp': ModbusBadForm}, - - {'src': '\x01\x03\x00\x00\x00\x0A', 'exp': TypeError}, - {'src': None, 'exp': TypeError}, - {'src': [1, 3, 0, 0, 0, 0x0A], 'exp': TypeError}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_asc.encode_to_wire(test['src']) - - elif test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_asc.encode_to_wire(test['src']) - - else: - result = mbus_asc.encode_to_wire(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_decode_from_wire(self): - - # _estimate_length_request - - tests = [ - {'src': b':01030000000AF2\r\n', - 'exp': b'\x01\x03\x00\x00\x00\x0A'}, - {'src': b':0103000000FC\r\n', 'exp': b'\x01\x03\x00\x00\x00'}, - {'src': b':01030000FC\r\n', 'exp': b'\x01\x03\x00\x00'}, - {'src': b':010300FC\r\n', 'exp': b'\x01\x03\x00'}, - {'src': b':0103FC\r\n', 'exp': b'\x01\x03'}, - - # fiddle with the EOL - '\r\n' is SPEC, but allow basic combos - {'src': b':01030000000AF2\r', - 'exp': b'\x01\x03\x00\x00\x00\x0A'}, - {'src': b':01030000000AF2\n', - 'exp': b'\x01\x03\x00\x00\x00\x0A'}, - {'src': b':01030000000AF2', - 'exp': b'\x01\x03\x00\x00\x00\x0A'}, - - # bad CRC - {'src': b':01030000000AFF\r\n', - 'exp': ModbusBadChecksum}, - - # bad start - {'src': b'01030000000AF2\r\n', - 'exp': ModbusBadForm}, - - # an odd number of bytes - {'src': b':0103000000AF2\r\n', - 'exp': ModbusBadForm}, - - # non-hex bytes - {'src': b':0103JAN0000AF2\r\n', - 'exp': ModbusBadForm}, - - # bad types - {'src': ':01030000000AF2\r\n', 'exp': TypeError}, - {'src': 10, 'exp': TypeError}, - {'src': None, 'exp': TypeError}, - - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_asc.decode_from_wire(test['src']) - - elif test['exp'] == ModbusBadChecksum: - with self.assertRaises(ModbusBadChecksum): - mbus_asc.decode_from_wire(test['src']) - - elif test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_asc.decode_from_wire(test['src']) - - else: - result = mbus_asc.decode_from_wire(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_request(self): - - tests = [ - {'src': b':01030000000AF2\r\n', - 'raw': b'\x01\x03\x00\x00\x00\x0A', - 'exp': b':01030000000AF2\r\n'}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - msg = test['raw'][1:] - - result = obj.set_request(test['src'], ia_trans.IA_PROTOCOL_MBASC) - # print("obj pst:{}".format(obj.attrib)) - self.assertTrue(result) - self.assertEqual(obj[obj.KEY_REQ_RAW], test['src']) - self.assertEqual(obj[obj.KEY_REQ_PROTOCOL], - ia_trans.IA_PROTOCOL_MBASC) - self.assertNotIn(obj.KEY_SRC_ID, obj.attrib) - self.assertEqual(obj[obj.KEY_REQ], msg) - - result = obj.get_request() - self.assertEqual(result, test['exp']) - - return - - def test_end_of_message(self): - - tests = [ - {'src': b':01030000000AF2\r\n', - 'result': [b':01030000000AF2\r\n'], 'extra': None}, - - {'src': b'', - 'result': None, 'extra': None}, - {'src': b':', - 'result': [], 'extra': b':'}, - {'src': b':0', - 'result': [], 'extra': b':0'}, - {'src': b':01', - 'result': [], 'extra': b':01'}, - {'src': b':010300', - 'result': [], 'extra': b':010300'}, - {'src': b':01030000000', - 'result': [], 'extra': b':01030000000'}, - {'src': b':01030000000AF', - 'result': [], 'extra': b':01030000000AF'}, - {'src': b':01030000000AF2', - 'result': [], 'extra': b':01030000000AF2'}, - {'src': b':01030000000AF2\r', - 'result': [], 'extra': b':01030000000AF2\r'}, - - {'src': b':01030000000AF2\r\n:01030000000AF2', - 'result': [b':01030000000AF2\r\n'], - 'extra': b':01030000000AF2'}, - {'src': b':01030000000AF2\r\n:01030000000AF2\r', - 'result': [b':01030000000AF2\r\n'], - 'extra': b':01030000000AF2\r'}, - {'src': b':01030000000AF2\r\n:01030000000AF2\r\n', - 'result': [b':01030000000AF2\r\n', b':01030000000AF2\r\n'], - 'extra': None}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - result, extra = mbus_asc.test_end_of_message(test['src']) - self.assertEqual(result, test['result']) - self.assertEqual(extra, test['extra']) - - return - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_modbus_rtu.py b/test/test_cplib_modbus_rtu.py deleted file mode 100644 index eeee2128..00000000 --- a/test/test_cplib_modbus_rtu.py +++ /dev/null @@ -1,254 +0,0 @@ -# Test the MODBUS RTU module - -import unittest - -import cp_lib.modbus.transaction as ia_trans -import cp_lib.modbus.modbus_rtu as mbus_rtu -from cp_lib.modbus.transaction_modbus import ModbusTransaction, \ - ModbusBadForm, ModbusBadChecksum - - -class TestModbusRtu(unittest.TestCase): - - def test_checksum(self): - - tests = [ - {'src': b"\xEA\x03\x00\x00\x00\x64", 'exp': 0x3A53}, - {'src': b"\x4b\x03\x00\x2c\x00\x37", 'exp': 0xbfcb}, - {'src': b"\x0d\x01\x00\x62\x00\x33", 'exp': 0x0ddd}, - - {'src': b'', 'exp': ModbusBadForm}, - {'src': b'\x01', 'exp': ModbusBadForm}, - {'src': '\x01\x03\x00\x00\x00\x0A', 'exp': TypeError}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_rtu.calc_checksum(test['src']) - - elif test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_rtu.calc_checksum(test['src']) - - else: - result = mbus_rtu.calc_checksum(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_encode_to_wire(self): - - tests = [ - {'src': b'\x01\x03\x00\x00\x00\x0A', - 'exp': b'\x01\x03\x00\x00\x00\x0A\xC5\xCD'}, - {'src': b'\x01\x03\x00\x00\x00', - 'exp': b'\x01\x03\x00\x00\x00\x19\x84'}, - - {'src': b'\x01', 'exp': ModbusBadForm}, - {'src': b'', 'exp': ModbusBadForm}, - - {'src': '\x01\x03\x00\x00\x00\x0A', 'exp': TypeError}, - {'src': None, 'exp': TypeError}, - {'src': [1, 3, 0, 0, 0, 0x0A], 'exp': TypeError}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_rtu.encode_to_wire(test['src']) - - elif test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_rtu.encode_to_wire(test['src']) - - else: - result = mbus_rtu.encode_to_wire(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_decode_from_wire(self): - - tests = [ - {'exp': b'\x01\x03\x00\x00\x00\x0A', - 'src': b'\x01\x03\x00\x00\x00\x0A\xC5\xCD'}, - {'exp': b'\x01\x03\x00\x00\x00', - 'src': b'\x01\x03\x00\x00\x00\x19\x84'}, - - # bad CRC - {'src': b'\x01\x03\x00\x00\x00\x0A\xC5\x00', - 'exp': ModbusBadChecksum}, - - # bad types - {'src': ':01030000000AF2\r\n', 'exp': TypeError}, - {'src': 10, 'exp': TypeError}, - {'src': None, 'exp': TypeError}, - - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - if test['exp'] == ModbusBadForm: - with self.assertRaises(ModbusBadForm): - mbus_rtu.decode_from_wire(test['src']) - - elif test['exp'] == ModbusBadChecksum: - with self.assertRaises(ModbusBadChecksum): - mbus_rtu.decode_from_wire(test['src']) - - elif test['exp'] == TypeError: - with self.assertRaises(TypeError): - mbus_rtu.decode_from_wire(test['src']) - - else: - result = mbus_rtu.decode_from_wire(test['src']) - self.assertEqual(result, test['exp']) - - return - - def test_request(self): - - tests = [ - {'src': b'\x01\x03\x00\x00\x00\x0A\xC5\xCD', - 'raw': b'\x01\x03\x00\x00\x00\x0A', - 'exp': b'\x01\x03\x00\x00\x00\x0A\xC5\xCD'}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - # this won't have the UID in first place - moved to [KEY_SRC_ID] - msg = test['raw'][1:] - - result = obj.set_request(test['src'], ia_trans.IA_PROTOCOL_MBRTU) - # print("obj pst:{}".format(obj.attrib)) - self.assertTrue(result) - self.assertEqual(obj[obj.KEY_REQ_RAW], test['src']) - self.assertEqual(obj[obj.KEY_REQ_PROTOCOL], - ia_trans.IA_PROTOCOL_MBRTU) - self.assertNotIn(obj.KEY_SRC_ID, obj.attrib) - self.assertEqual(obj[obj.KEY_REQ], msg) - - result = obj.get_request() - self.assertEqual(result, test['exp']) - - return - - def test_end_of_message_request(self): - - tests = [ - # the common functions - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x02\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x02\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x03\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x03\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x04\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x04\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x05\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x05\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x06\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x06\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x0F\x00\x00\x00\x0A\x02\xAA\xBB\xCC\xDD', - 'result': [b'\x01\x0F\x00\x00\x00\x0A\x02\xAA\xBB\xCC\xDD'], - 'extra': None}, - {'src': b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB\xCC\xDD', - 'result': [b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB\xCC\xDD'], - 'extra': None}, - - # build up - {'src': b'\x01', - 'result': [], 'extra': b'\x01'}, - {'src': b'\x01\x01', - 'result': [], 'extra': b'\x01\x01'}, - {'src': b'\x01\x01\x00', - 'result': [], 'extra': b'\x01\x01\x00'}, - {'src': b'\x01\x01\x00\x00', - 'result': [], 'extra': b'\x01\x01\x00\x00'}, - {'src': b'\x01\x01\x00\x00\x00', - 'result': [], 'extra': b'\x01\x01\x00\x00\x00'}, - {'src': b'\x01\x01\x00\x00\x00\x0A', - 'result': [], 'extra': b'\x01\x01\x00\x00\x00\x0A'}, - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA', - 'result': [], 'extra': b'\x01\x01\x00\x00\x00\x0A\xAA'}, - - {'src': b'\x01', 'result': [], 'extra': b'\x01'}, - {'src': b'\x01\x10', 'result': [], 'extra': b'\x01\x10'}, - {'src': b'\x01\x10\x00', 'result': [], 'extra': b'\x01\x10\x00'}, - {'src': b'\x01\x10\x00\x00', - 'result': [], 'extra': b'\x01\x10\x00\x00'}, - {'src': b'\x01\x10\x00\x00\x00', - 'result': [], 'extra': b'\x01\x10\x00\x00\x00'}, - {'src': b'\x01\x10\x00\x00\x00\x0A', - 'result': [], 'extra': b'\x01\x10\x00\x00\x00\x0A'}, - {'src': b'\x01\x10\x00\x00\x00\x0A\x02', - 'result': [], 'extra': b'\x01\x10\x00\x00\x00\x0A\x02'}, - {'src': b'\x01\x10\x00\x00\x00\x0A\x02\xAA', - 'result': [], 'extra': b'\x01\x10\x00\x00\x00\x0A\x02\xAA'}, - {'src': b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB', - 'result': [], 'extra': b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB'}, - {'src': b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB\xCC', - 'result': [], - 'extra': b'\x01\x10\x00\x00\x00\x0A\x02\xAA\xBB\xCC'}, - - # multiple lines - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB' + - b'\x01\x01\x00\x00\x00\x0A\xAA\xBB', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB', - b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], 'extra': None}, - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB' + - b'\x01\x01\x00\x00\x00\x0A\xAA\xBB\x05', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB', - b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], - 'extra': b'\x05'}, - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB' + - b'\x01\x01\x00\x00\x00\x0A\xAA', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], - 'extra': b'\x01\x01\x00\x00\x00\x0A\xAA'}, - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB' + - b'\x01\x01', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], - 'extra': b'\x01\x01'}, - {'src': b'\x01\x01\x00\x00\x00\x0A\xAA\xBB' + - b'\x01', - 'result': [b'\x01\x01\x00\x00\x00\x0A\xAA\xBB'], - 'extra': b'\x01'}, - - # unknown functions - {'src': b'\x01\x64\x00\xAA\xBB', - 'result': [b'\x01\x64\x00\xAA\xBB'], 'extra': None}, - - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - result, extra = mbus_rtu.test_end_of_message(test['src'], - is_request=True) - self.assertEqual(result, test['result']) - self.assertEqual(extra, test['extra']) - - return - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_modbus_tcp.py b/test/test_cplib_modbus_tcp.py deleted file mode 100644 index 84438f0b..00000000 --- a/test/test_cplib_modbus_tcp.py +++ /dev/null @@ -1,225 +0,0 @@ -# Test the MODBUS TCP module - -import unittest - -import cp_lib.modbus.transaction as ia_trans -import cp_lib.modbus.modbus_tcp as mbus_tcp -from cp_lib.modbus.transaction_modbus import ModbusTransaction - - -class TestModbusTcp(unittest.TestCase): - - def test_request(self): - - tests = [ - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'seq': b'\xAB\xCD', - 'raw': b'\x01\x03\x00\x00\x00\x0A'}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - # this won't have the UID in first place - moved to [KEY_SRC_ID] - msg = test['raw'][1:] - - result = obj.set_request(test['src'], ia_trans.IA_PROTOCOL_MBTCP) - # print("obj pst:{}".format(obj.attrib)) - self.assertTrue(result) - self.assertEqual(obj[obj.KEY_REQ_RAW], test['src']) - self.assertEqual(obj[obj.KEY_REQ_PROTOCOL], - ia_trans.IA_PROTOCOL_MBTCP) - self.assertNotIn(obj.KEY_SRC_ID, obj.attrib) - self.assertEqual(obj[obj.KEY_REQ], msg) - self.assertEqual(obj[obj.KEY_SRC_SEQ], test['seq']) - - result = obj.get_request() - self.assertEqual(result, test['src']) - - return - - def test_sequence_number(self): - - tests = [ - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'seq': b'\xAB\xCD', - 'raw': b'\x01\x03\x00\x00\x00\x0A'}, - ] - - obj = ModbusTransaction() - - source = b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - expect = source - obj.set_request(source, ia_trans.IA_PROTOCOL_MBTCP) - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new 2-byte sequence - obj[obj.KEY_SRC_SEQ] = b'\xFF\xEE' - expect = b'\xFF\xEE\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new 1-byte sequence - expect padding with 0x01 - obj[obj.KEY_SRC_SEQ] = b'\x44' - expect = b'\x44\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new n byte sequence - expect padding with 0x01 - obj[obj.KEY_SRC_SEQ] = b'' - expect = b'\x01\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new 3 byte sequence - expect truncate to 2 bytes - obj[obj.KEY_SRC_SEQ] = b'\x05\x06\x07' - expect = b'\x05\x06\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new int sequence - obj[obj.KEY_SRC_SEQ] = 0 - expect = b'\x00\x00\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - obj[obj.KEY_SRC_SEQ] = 0x01 - expect = b'\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new int sequence - saved as big-endian - obj[obj.KEY_SRC_SEQ] = 0x0306 - expect = b'\x03\x06\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - # swap in a new int sequence - excess is truncated - obj[obj.KEY_SRC_SEQ] = 0xFF0306 - expect = b'\x03\x06\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' - result = obj.get_request() - self.assertEqual(result, expect) - - return - - def test_all_request(self): - - tests = [ - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'raw': b'\x01\x03\x00\x00\x00\x0A', - 'asc': b':01030000000AF2\r\n', - 'rtu': b'\x01\x03\x00\x00\x00\x0A\xC5\xCD', - 'tcp': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - result = obj.set_request(test['src'], ia_trans.IA_PROTOCOL_MBTCP) - self.assertEqual(obj[obj.KEY_REQ_PROTOCOL], - ia_trans.IA_PROTOCOL_MBTCP) - - # default will be TCP - result = obj.get_request() - self.assertEqual(result, test['tcp']) - - # confirm we can pull back as any of the three - result = obj.get_request(ia_trans.IA_PROTOCOL_MBASC) - self.assertEqual(result, test['asc']) - - result = obj.get_request(ia_trans.IA_PROTOCOL_MBRTU) - self.assertEqual(result, test['rtu']) - - result = obj.get_request(ia_trans.IA_PROTOCOL_MBTCP) - self.assertEqual(result, test['tcp']) - - return - - def test_end_of_message(self): - - tests = [ - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'result': [b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'], - 'extra': None}, - - {'src': b'', - 'result': [], 'extra': b''}, - {'src': b'\xAB', - 'result': [], 'extra': b'\xAB'}, - {'src': b'\xAB\xCD', - 'result': [], 'extra': b'\xAB\xCD'}, - {'src': b'\xAB\xCD\x00', - 'result': [], 'extra': b'\xAB\xCD\x00'}, - {'src': b'\xAB\xCD\x00\x00', - 'result': [], 'extra': b'\xAB\xCD\x00\x00'}, - {'src': b'\xAB\xCD\x00\x00\x00', - 'result': [], 'extra': b'\xAB\xCD\x00\x00\x00'}, - {'src': b'\xAB\xCD\x00\x00\x00\x06', - 'result': [], 'extra': b'\xAB\xCD\x00\x00\x00\x06'}, - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03', - 'result': [], - 'extra': b'\xAB\xCD\x00\x00\x00\x06\x01\x03'}, - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00', - 'result': [], - 'extra': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00'}, - - # here we have bad header values (protocol vers or length) - {'src': b'\xAB\xCD\x01\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'result': None, 'extra': None}, - {'src': b'\xAB\xCD\x00\x02\x00\x06\x01\x03\x00\x00\x00\x0A', - 'result': None, 'extra': None}, - {'src': b'\xAB\xCD\x00\x00\x03\x06\x01\x03\x00\x00\x00\x0A', - 'result': None, 'extra': None}, - {'src': b'\xAB\xCD\x00\x00\x00\x00', - 'result': None, 'extra': None}, - {'src': b'\xAB\xCD\x00\x00\x00\x01\x01', - 'result': None, 'extra': None}, - - # this isn't a valid PDU, but follows the rules! - {'src': b'\xAB\xCD\x00\x00\x00\x02\x01\x03', - 'result': [b'\xAB\xCD\x00\x00\x00\x02\x01\x03'], 'extra': None}, - - # try the multiple messages - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' + - b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - 'result': [b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A', - b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'], - 'extra': None}, - - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' + - b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00', - 'result': [b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'], - 'extra': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00'}, - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' + - b'\xAB\xCD\x00', - 'result': [b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'], - 'extra': b'\xAB\xCD\x00'}, - {'src': b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A' + - b'\xAB', - 'result': [b'\xAB\xCD\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A'], - 'extra': b'\xAB'}, - ] - - for test in tests: - # loop through all tests - - # print("test:{}".format(test)) - - result, extra = mbus_tcp.test_end_of_message(test['src']) - self.assertEqual(result, test['result']) - self.assertEqual(extra, test['extra']) - - return - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_modbus_trans_modbus.py b/test/test_cplib_modbus_trans_modbus.py deleted file mode 100644 index c94008d4..00000000 --- a/test/test_cplib_modbus_trans_modbus.py +++ /dev/null @@ -1,113 +0,0 @@ -# Test the MODBUS transaction module - -import unittest - -from cp_lib.modbus.transaction_modbus import ModbusTransaction - - -class TestModbusTrans(unittest.TestCase): - - def test_estimate_length_request(self): - - # _estimate_length_request - - tests = [ - {'src': b'\x01\x01\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x01\x00\x01\x00\x0A\x44\x2A', 'exp': 6}, - {'src': b'\x01\x02\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x03\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x04\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x05\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x06\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x0F\x02\x00\x01', 'exp': 5}, - {'src': b'\x01\x10\x02\x00\x01', 'exp': 5}, - - {'src': '\x01\x01\x00\x01\x00\x0A', 'exp': 6}, - - {'src': b'\x01\x00\x02\x00\x01', 'exp': ValueError}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - if test['exp'] == ValueError: - with self.assertRaises(ValueError): - obj._estimate_length_request(test['src']) - - pass - else: - result = obj._estimate_length_request(test['src']) - self.assertEqual(result, test['exp']) - - return - -# - - def test_parse_rtu(self): - - # _estimate_length_request - - tests = [ - {'src': b'\x01\x01\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x01\x00\x01\x00\x0A\x44\x2A', 'exp': 6}, - {'src': b'\x01\x02\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x03\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x04\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x05\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x06\x00\x01\x00\x0A', 'exp': 6}, - {'src': b'\x01\x0F\x02\x00\x01', 'exp': 5}, - {'src': b'\x01\x10\x02\x00\x01', 'exp': 5}, - - {'src': '\x01\x01\x00\x01\x00\x0A', 'exp': 6}, - - {'src': b'\x01\x00\x02\x00\x01', 'exp': ValueError}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - if test['exp'] == ValueError: - with self.assertRaises(ValueError): - obj._parse_rtu(test['src']) - - pass - else: - obj._parse_rtu(test['src']) - # self.assertEqual(result, test['exp']) - self.assertEqual(obj['cooked_protocol'], - obj.IA_PROTOCOL_MBRTU) - - return - - def test_code_ascii(self): - - # _estimate_length_request - - tests = [ - {'src': b':01010001000A66\r\n', 'exp': 6}, - ] - - obj = ModbusTransaction() - - for test in tests: - # loop through all tests - - if test['exp'] == ValueError: - with self.assertRaises(ValueError): - obj._parse_rtu(test['src']) - - pass - else: - obj._parse_rtu(test['src']) - self.assertEqual(result, test['exp']) - self.assertEqual(obj['cooked_protocol'], - obj.IA_PROTOCOL_MBRTU) - - return - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_parse_data.py b/test/test_cplib_parse_data.py deleted file mode 100644 index 9272d103..00000000 --- a/test/test_cplib_parse_data.py +++ /dev/null @@ -1,243 +0,0 @@ -# Test the PARSE DATA module - -import unittest - -from cp_lib.parse_data import isolate_numeric_from_string, parse_float, \ - parse_float_string, parse_integer, \ - parse_integer_string, parse_boolean, parse_none - - -class TestParseData(unittest.TestCase): - - def test_isolate_numeric(self): - - self.assertEqual(isolate_numeric_from_string(" 0"), "0") - self.assertEqual(isolate_numeric_from_string("hello0"), "0") - self.assertEqual(isolate_numeric_from_string(" 99"), "99") - self.assertEqual(isolate_numeric_from_string(" -99rate"), "-99") - self.assertEqual(isolate_numeric_from_string(" 0.0 "), "0.0") - self.assertEqual(isolate_numeric_from_string(" 99.9% "), "99.9") - self.assertEqual(isolate_numeric_from_string(" -99.9 \n"), "-99.9") - - self.assertEqual(isolate_numeric_from_string("' 0.0"), "0.0") - self.assertEqual(isolate_numeric_from_string("\"99.9"), "99.9") - self.assertEqual(isolate_numeric_from_string("[-99.9"), "-99.9") - self.assertEqual(isolate_numeric_from_string("(123,"), "123") - self.assertEqual(isolate_numeric_from_string("' 0.0'"), "0.0") - self.assertEqual(isolate_numeric_from_string("\"99.9\""), "99.9") - self.assertEqual(isolate_numeric_from_string("[-99.9]"), "-99.9") - self.assertEqual(isolate_numeric_from_string("(123)"), "123") - - # only the first numeric sequence returned! - self.assertEqual(isolate_numeric_from_string("1, 2, 3"), "1") - self.assertEqual(isolate_numeric_from_string("rate = 123 seconds"), - "123") - self.assertEqual(isolate_numeric_from_string("rate = 123 and 99"), - "123") - - with self.assertRaises(TypeError): - # value must be str - isolate_numeric_from_string(None) - isolate_numeric_from_string(99) - isolate_numeric_from_string(99.9) - - with self.assertRaises(ValueError): - # value must have number str - isolate_numeric_from_string("") - isolate_numeric_from_string(" \n") - isolate_numeric_from_string("hello") - - return - - def test_parse_integer(self): - - self.assertEqual(parse_integer(None, none_is_zero=False), None) - self.assertEqual(parse_integer(0, none_is_zero=False), 0) - self.assertEqual(parse_integer(99, none_is_zero=False), 99) - self.assertEqual(parse_integer(-99, none_is_zero=False), -99) - self.assertEqual(parse_integer(0.0, none_is_zero=False), 0.0) - self.assertEqual(parse_integer(99.0, none_is_zero=False), 99.0) - self.assertEqual(parse_integer(-99.0, none_is_zero=False), -99.0) - self.assertEqual(parse_integer("0", none_is_zero=False), 0) - self.assertEqual(parse_integer("99", none_is_zero=False), 99) - self.assertEqual(parse_integer("-99", none_is_zero=False), -99) - - self.assertEqual(parse_integer(None, none_is_zero=True), 0) - - self.assertEqual(parse_integer(" 0", none_is_zero=False), 0) - self.assertEqual(parse_integer(" 99", none_is_zero=False), 99) - self.assertEqual(parse_integer(" -99", none_is_zero=False), -99) - self.assertEqual(parse_integer(" 0 ", none_is_zero=False), 0) - self.assertEqual(parse_integer(" 99 ", none_is_zero=False), 99) - self.assertEqual(parse_integer(" -99 ", none_is_zero=False), -99) - self.assertEqual(parse_integer(" 0\n", none_is_zero=False), 0) - self.assertEqual(parse_integer(" 99\n", none_is_zero=False), 99) - self.assertEqual(parse_integer(" -99\n", none_is_zero=False), -99) - - with self.assertRaises(ValueError): - parse_integer("\"99\"") - parse_integer("[99]") - - return - - def test_parse_integer_string(self): - - self.assertEqual(parse_integer_string("0"), 0) - self.assertEqual(parse_integer_string("99"), 99) - self.assertEqual(parse_integer_string("-99"), -99) - self.assertEqual(parse_integer_string("0.0"), 0) - self.assertEqual(parse_integer_string("99.2"), 99) - self.assertEqual(parse_integer_string("-99.8"), -100) - self.assertEqual(parse_integer_string(" 0.0"), 0) - self.assertEqual(parse_integer_string(" 99.0\n"), 99) - self.assertEqual(parse_integer_string("a -99.0"), -99) - self.assertEqual(parse_integer_string("\"0.0\""), 0) - self.assertEqual(parse_integer_string("[99.0]"), 99) - self.assertEqual(parse_integer_string("(-99.0)"), -99) - - with self.assertRaises(TypeError): - parse_integer_string(None) - parse_integer_string(99) - - return - - def test_parse_float(self): - - self.assertEqual(parse_float(None, none_is_zero=True), 0.0) - self.assertEqual(parse_float(None, none_is_zero=False), None) - - self.assertEqual(parse_float(99), 99.0) - self.assertEqual(parse_float(-99), -99.0) - self.assertEqual(parse_float(0.0), 0.0) - self.assertEqual(parse_float(99.0), 99) - self.assertEqual(parse_float(-99.0), -99) - self.assertEqual(parse_float("0"), 0.0) - self.assertEqual(parse_float("99"), 99.0) - self.assertEqual(parse_float("-99"), -99.0) - self.assertEqual(parse_float("0.0"), 0.0) - self.assertEqual(parse_float("99.0"), 99.0) - self.assertEqual(parse_float("-99.0"), -99.0) - - return - - def test_parse_float_string(self): - - self.assertEqual(parse_float_string("0"), 0.0) - self.assertEqual(parse_float_string("99"), 99.0) - self.assertEqual(parse_float_string("-99"), -99.0) - self.assertEqual(parse_float_string("0.0"), 0.0) - self.assertEqual(parse_float_string("99.0"), 99.0) - self.assertEqual(parse_float_string("-99.0"), -99.0) - self.assertEqual(parse_float_string(" 0.0"), 0.0) - self.assertEqual(parse_float_string(" 99.0"), 99.0) - self.assertEqual(parse_float_string("a -99.0"), -99.0) - self.assertEqual(parse_float_string("\"0.0\""), 0.0) - self.assertEqual(parse_float_string("[99.0]"), 99.0) - self.assertEqual(parse_float_string("(-99.0)"), -99.0) - - with self.assertRaises(TypeError): - parse_float_string(None) - parse_float_string(99) - parse_float_string(99.00) - - def test_parse_boolean(self): - - self.assertEqual(parse_boolean(None, none_is_false=True), False) - - # typical bool(value) - self.assertEqual(parse_boolean(-99), True) - self.assertEqual(parse_boolean(-1), True) - self.assertEqual(parse_boolean(0), False) - self.assertEqual(parse_boolean(1), True) - self.assertEqual(parse_boolean(99), True) - - # handle str - self.assertEqual(parse_boolean("0"), False) - self.assertEqual(parse_boolean(" 0 "), False) - self.assertEqual(parse_boolean("1"), True) - self.assertEqual(parse_boolean(" 1 "), True) - - self.assertEqual(parse_boolean(" F "), False) - self.assertEqual(parse_boolean(" f "), False) - self.assertEqual(parse_boolean("t"), True) - self.assertEqual(parse_boolean(" T"), True) - - self.assertEqual(parse_boolean("FALSE"), False) - self.assertEqual(parse_boolean("False"), False) - self.assertEqual(parse_boolean("false"), False) - self.assertEqual(parse_boolean("TRUE"), True) - self.assertEqual(parse_boolean("True"), True) - self.assertEqual(parse_boolean("true"), True) - - self.assertEqual(parse_boolean("OFF"), False) - self.assertEqual(parse_boolean("Off"), False) - self.assertEqual(parse_boolean("off"), False) - self.assertEqual(parse_boolean("ON"), True) - self.assertEqual(parse_boolean("On"), True) - self.assertEqual(parse_boolean("on"), True) - - self.assertEqual(parse_boolean("disable"), False) - self.assertEqual(parse_boolean("enable"), True) - - # handle bytes - self.assertEqual(parse_boolean(b"0"), False) - self.assertEqual(parse_boolean(b" 0 "), False) - self.assertEqual(parse_boolean(b"1"), True) - self.assertEqual(parse_boolean(b" 1 "), True) - - self.assertEqual(parse_boolean(b" F "), False) - self.assertEqual(parse_boolean(b" f "), False) - self.assertEqual(parse_boolean(b"t"), True) - self.assertEqual(parse_boolean(b" T"), True) - - self.assertEqual(parse_boolean(b"FALSE"), False) - self.assertEqual(parse_boolean(b"False"), False) - self.assertEqual(parse_boolean(b"false"), False) - self.assertEqual(parse_boolean(b"TRUE"), True) - self.assertEqual(parse_boolean(b"True"), True) - self.assertEqual(parse_boolean(b"true"), True) - - self.assertEqual(parse_boolean(b"OFF"), False) - self.assertEqual(parse_boolean(b"Off"), False) - self.assertEqual(parse_boolean(b"off"), False) - self.assertEqual(parse_boolean(b"ON"), True) - self.assertEqual(parse_boolean(b"On"), True) - self.assertEqual(parse_boolean(b"on"), True) - - self.assertEqual(parse_boolean(b"disable"), False) - self.assertEqual(parse_boolean(b"enable"), True) - - with self.assertRaises(ValueError): - parse_boolean(None, none_is_false=False) - parse_boolean("happy") - parse_boolean([1, 2, 3]) - - return - - def test_parse_none(self): - - self.assertEqual(parse_none(None), None) - - self.assertEqual(parse_none(""), None) - self.assertEqual(parse_none("NONE"), None) - self.assertEqual(parse_none("None"), None) - self.assertEqual(parse_none("none"), None) - self.assertEqual(parse_none("NULL"), None) - self.assertEqual(parse_none("Null"), None) - self.assertEqual(parse_none("null"), None) - self.assertEqual(parse_none(" none"), None) - self.assertEqual(parse_none("\'none\'"), None) - - self.assertEqual(parse_none(b""), None) - self.assertEqual(parse_none(b"None"), None) - self.assertEqual(parse_none(b"Null"), None) - - with self.assertRaises(ValueError): - parse_none(10) - parse_none("happy") - parse_none([1, 2, 3]) - - return - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_parse_duration.py b/test/test_cplib_parse_duration.py deleted file mode 100644 index 21211d31..00000000 --- a/test/test_cplib_parse_duration.py +++ /dev/null @@ -1,307 +0,0 @@ -# Test the PARSE DURATION module - -import unittest -import random - -from cp_lib.parse_duration import TimeDuration - - -class TestParseDuration(unittest.TestCase): - - def test_parse_time_duration(self): - - obj = TimeDuration() - - self.assertEqual(obj.parse_time_duration_to_seconds(1), 1.0) - self.assertEqual(obj.get_period_as_string(), "1 sec") - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1'), 1.0) - self.assertEqual(obj.get_period_as_string(), "1 sec") - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('01'), 1.0) - self.assertEqual(obj.get_period_as_string(), "1 sec") - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('0x01'), 1.0) - self.assertEqual(obj.get_period_as_string(), "1 sec") - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 ms'), 0.001) - self.assertEqual(obj.get_period_as_string(), '1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 msec'), 0.001) - self.assertEqual(obj.get_period_as_string(), '1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 sec'), 1.0) - self.assertEqual(obj.get_period_as_string(), '1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(b'1 sec'), 1.0) - self.assertEqual(obj.get_period_as_string(), '1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 second'), 1.0) - self.assertEqual(obj.get_period_as_string(), '1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 min'), 60.0) - self.assertEqual(obj.get_period_as_string(), '1 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 minute'), 60.0) - self.assertEqual(obj.get_period_as_string(), '1 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 minutes'), 60.0) - self.assertEqual(obj.get_period_as_string(), '1 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 hr'), 3600.0) - self.assertEqual(obj.get_period_as_string(), '1 hr') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 HR'), 3600.0) - self.assertEqual(obj.get_period_as_string(), '1 hr') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 Hours'), 3600.0) - self.assertEqual(obj.get_period_as_string(), '1 hr') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 day'), 86400.0) - self.assertEqual(obj.get_period_as_string(), '1 day') - - # note: these handled, but have NO 'seconds' result - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 month'), None) - self.assertEqual(obj.get_period_as_string(), '1 mon') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('1 year'), None) - self.assertEqual(obj.get_period_as_string(), '1 yr') - - # repeat with more than 1 - a random value - seed = random.randint(101, 999) - source = "{0} ms".format(seed) - expect_sec = seed * 0.001 - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - seed = random.randint(2, 59) - source = "{0} sec".format(seed) - expect_sec = seed * 1.0 - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - seed = random.randint(2, 59) - source = "{0} min".format(seed) - expect_sec = seed * 60.0 - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - seed = random.randint(2, 23) - source = "{0} hr".format(seed) - expect_sec = seed * 3600.0 - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - seed = random.randint(2, 9) - source = "{0} day".format(seed) - expect_sec = seed * 86400.0 - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - # note: these handled, but have NO 'seconds' result - seed = random.randint(2, 9) - source = "{0} mon".format(seed) - expect_sec = None - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - seed = random.randint(2, 9) - source = "{0} yr".format(seed) - expect_sec = None - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(source), - expect_sec) - self.assertEqual(obj.get_period_as_string(), source) - - return - - def test_parse_time_duration_plus_minus(self): - - obj = TimeDuration() - # check the signs - +/- to allow things like "do 5 minutes before X" - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 ms'), 0.001) - self.assertEqual(obj.get_period_as_string(), '1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-1 ms'), -0.001) - self.assertEqual(obj.get_period_as_string(), '-1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 sec'), 1.0) - self.assertEqual(obj.get_period_as_string(), '1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(b'-1 sec'), -1.0) - self.assertEqual(obj.get_period_as_string(), '-1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 min'), 60.0) - self.assertEqual(obj.get_period_as_string(), '1 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-5 min'), -300.0) - self.assertEqual(obj.get_period_as_string(), '-5 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+2 hr'), 7200.0) - self.assertEqual(obj.get_period_as_string(), '2 hr') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-3 hr'), -10800.0) - self.assertEqual(obj.get_period_as_string(), '-3 hr') - - # confirm the UTC 'decoration' is ignored, - # including ('z', 'zulu', 'gm', 'utc', 'uct') - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 ms utc'), - 0.001) - self.assertEqual(obj.get_period_as_string(), '1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-1 ms UTC'), - -0.001) - self.assertEqual(obj.get_period_as_string(), '-1 ms') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 sec z'), - 1.0) - self.assertEqual(obj.get_period_as_string(), '1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds(b'-1 sec Z'), -1.0) - self.assertEqual(obj.get_period_as_string(), '-1 sec') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+1 min gm'), 60.0) - self.assertEqual(obj.get_period_as_string(), '1 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-5 min GM'), - -300.0) - self.assertEqual(obj.get_period_as_string(), '-5 min') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('+2 hr uct'), - 7200.0) - self.assertEqual(obj.get_period_as_string(), '2 hr') - - obj.reset() - self.assertEqual(obj.parse_time_duration_to_seconds('-3 hr zulu'), - -10800.0) - self.assertEqual(obj.get_period_as_string(), '-3 hr') - - return - - def test_utc_decoration(self): - - obj = TimeDuration() - - self.assertFalse(obj._decode_utc_element('1 ms')) - self.assertTrue(obj._decode_utc_element('1 ms utc')) - - self.assertFalse(obj._decode_utc_element('1 sec')) - self.assertTrue(obj._decode_utc_element('1 sec ZulU')) - - self.assertFalse(obj._decode_utc_element('1 min')) - self.assertTrue(obj._decode_utc_element('1 min GM')) - - self.assertFalse(obj._decode_utc_element('1 hr')) - self.assertTrue(obj._decode_utc_element('1 hr Z')) - - self.assertFalse(obj._decode_utc_element('1 day')) - self.assertTrue(obj._decode_utc_element('1 day UCT')) - - self.assertFalse(obj._decode_utc_element('1 mon')) - self.assertTrue(obj._decode_utc_element('1 mon UTC')) - - return - - def test_tag_decode(self): - - obj = TimeDuration() - - self.assertEqual(obj.decode_time_tag('ms'), obj.DURATION_MSEC) - self.assertEqual(obj.decode_time_tag('msec'), obj.DURATION_MSEC) - self.assertEqual(obj.decode_time_tag('millisecond'), obj.DURATION_MSEC) - self.assertEqual(obj.decode_time_tag('milliseconds'), - obj.DURATION_MSEC) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_MSEC), 'ms') - - self.assertEqual(obj.decode_time_tag('sec'), obj.DURATION_SECOND) - self.assertEqual(obj.decode_time_tag('second'), obj.DURATION_SECOND) - self.assertEqual(obj.decode_time_tag('seconds'), obj.DURATION_SECOND) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_SECOND), 'sec') - self.assertEqual(obj.get_tag_as_string(0), 'sec') - - self.assertEqual(obj.decode_time_tag('min'), obj.DURATION_MINUTE) - self.assertEqual(obj.decode_time_tag('minute'), obj.DURATION_MINUTE) - self.assertEqual(obj.decode_time_tag('minutes'), obj.DURATION_MINUTE) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_MINUTE), 'min') - - self.assertEqual(obj.decode_time_tag('hr'), obj.DURATION_HOUR) - self.assertEqual(obj.decode_time_tag('hour'), obj.DURATION_HOUR) - self.assertEqual(obj.decode_time_tag('hours'), obj.DURATION_HOUR) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_HOUR), 'hr') - - self.assertEqual(obj.decode_time_tag('dy'), obj.DURATION_DAY) - self.assertEqual(obj.decode_time_tag('day'), obj.DURATION_DAY) - self.assertEqual(obj.decode_time_tag('days'), obj.DURATION_DAY) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_DAY), 'day') - - self.assertEqual(obj.decode_time_tag('mon'), obj.DURATION_MONTH) - self.assertEqual(obj.decode_time_tag('month'), obj.DURATION_MONTH) - self.assertEqual(obj.decode_time_tag('months'), obj.DURATION_MONTH) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_MONTH), 'mon') - - self.assertEqual(obj.decode_time_tag('yr'), obj.DURATION_YEAR) - self.assertEqual(obj.decode_time_tag('year'), obj.DURATION_YEAR) - self.assertEqual(obj.decode_time_tag('years'), obj.DURATION_YEAR) - self.assertEqual(obj.get_tag_as_string(obj.DURATION_YEAR), 'yr') - - obj.reset() - with self.assertRaises(ValueError): - obj.get_tag_as_string(-1) - obj.get_tag_as_string(7) - obj.decode_time_tag('homey') - - with self.assertRaises(TypeError): - obj.get_tag_as_string('hello') - obj.decode_time_tag(None) - obj.decode_time_tag(3) - - return - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cplib_time_period.py b/test/test_cplib_time_period.py deleted file mode 100644 index 695af8aa..00000000 --- a/test/test_cplib_time_period.py +++ /dev/null @@ -1,859 +0,0 @@ -# Test the PARSE DURATION module - -import unittest - -import cp_lib.time_period as time_period - - -class TestTimePeriod(unittest.TestCase): - - def test_valid_clean_period_seconds(self): - - # zero is special, as it is not relevant to this function - seconds = 0 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - # self.assertFalse((60 % seconds) == 0) - - # one is typical TRUE situation - see '7' for typical FALSE situation - seconds += 1 # == 1 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 2 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 3 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 4 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 5 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 6 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - # seven is typical FALSE situation - see any 1 to 6 for typical - # FALSE situation - seconds += 1 # == 7 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 8 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 9 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 10 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 11 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 12 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 13 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 14 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 15 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 16 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 17 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 18 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 19 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 20 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 21 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 22 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 23 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 24 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 25 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 26 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 27 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 28 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 29 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 30 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 31 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 32 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 33 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 34 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 35 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 36 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 37 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 38 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 39 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 40 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 41 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 42 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 43 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 44 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 45 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 46 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 47 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 48 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 49 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 50 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 51 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 52 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 53 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 54 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 55 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 56 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 57 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 58 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 59 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - seconds += 1 # == 60 - self.assertTrue(time_period.is_valid_clean_period_seconds(seconds)) - self.assertTrue((60 % seconds) == 0) - - seconds += 1 # == 61 - self.assertFalse(time_period.is_valid_clean_period_seconds(seconds)) - self.assertFalse((60 % seconds) == 0) - - with self.assertRaises(TypeError): - time_period.is_valid_clean_period_seconds(None) - - # because we use 'int()' on value, these work as shown despite not - # being a goal - self.assertTrue(time_period.is_valid_clean_period_seconds(2.0)) - self.assertTrue(time_period.is_valid_clean_period_seconds('2')) - # int() rounds 2.1 to be 2 - again, not as desired, but result is - # largely as expected - self.assertTrue(time_period.is_valid_clean_period_seconds(2.1)) - self.assertFalse(time_period.is_valid_clean_period_seconds(7.1)) - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_seconds('2.1') - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_seconds('7.1') - - return - - def test_valid_clean_period_minutes(self): - - # zero is special, as it is not relevant to this function - minutes = 0 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - # self.assertFalse((60 % minutes) == 0) - - # one is typical TRUE situation - see '7' for typical FALSE situation - minutes += 1 # == 1 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 2 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 3 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 4 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 5 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 6 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - # seven is typical FALSE situation - see any 1 to 6 for typical - # FALSE situation - minutes += 1 # == 7 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 8 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 9 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 10 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 11 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 12 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 13 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 14 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 15 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 16 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 17 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 18 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 19 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 20 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 21 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 22 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 23 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 24 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 25 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 26 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 27 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 28 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 29 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 30 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 31 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 32 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 33 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 34 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 35 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 36 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 37 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 38 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 39 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 40 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 41 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 42 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 43 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 44 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 45 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 46 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 47 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 48 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 49 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 50 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 51 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 52 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 53 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 54 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 55 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 56 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 57 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 58 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 59 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - minutes += 1 # == 60 - self.assertTrue(time_period.is_valid_clean_period_minutes(minutes)) - self.assertTrue((60 % minutes) == 0) - - minutes += 1 # == 61 - self.assertFalse(time_period.is_valid_clean_period_minutes(minutes)) - self.assertFalse((60 % minutes) == 0) - - with self.assertRaises(TypeError): - time_period.is_valid_clean_period_minutes(None) - - # because we use 'int()' on value, these work as shown despite - # not being a goal - self.assertTrue(time_period.is_valid_clean_period_minutes(2.0)) - self.assertTrue(time_period.is_valid_clean_period_minutes('2')) - # int() rounds 2.1 to be 2 - again, not as desired, but result - # is largely as expected - self.assertTrue(time_period.is_valid_clean_period_minutes(2.1)) - self.assertFalse(time_period.is_valid_clean_period_minutes(7.1)) - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_minutes('2.1') - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_minutes('7.1') - - return - - def test_valid_clean_period_hours(self): - - # zero is special, as it is not relevant to this function - hours = 0 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - # self.assertFalse((24 % hours) == 0) - - # one is typical TRUE situation - see '7' for typical FALSE situation - hours += 1 # == 1 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 2 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 3 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 4 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 5 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 6 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - # seven is typical FALSE situation - see any 1 to 6 for - # typical FALSE situation - hours += 1 # == 7 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 8 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 9 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 10 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 11 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 12 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 13 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 14 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 15 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 16 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 17 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 18 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 19 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 20 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 21 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 22 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 23 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - hours += 1 # == 24 - self.assertTrue(time_period.is_valid_clean_period_hours(hours)) - self.assertTrue((24 % hours) == 0) - - hours += 1 # == 25 - self.assertFalse(time_period.is_valid_clean_period_hours(hours)) - self.assertFalse((24 % hours) == 0) - - with self.assertRaises(TypeError): - time_period.is_valid_clean_period_hours(None) - - # because we use 'int()' on value, these work as shown despite - # not being a goal - self.assertTrue(time_period.is_valid_clean_period_hours(2.0)) - self.assertTrue(time_period.is_valid_clean_period_hours('2')) - # int() truncates 2.1 to 2 (& 6.9 to 6) - again, not as desired, - # but result is largely as expected - self.assertTrue(time_period.is_valid_clean_period_hours(1.9)) - self.assertTrue(time_period.is_valid_clean_period_hours(2.1)) - self.assertTrue(time_period.is_valid_clean_period_hours(6.9)) - self.assertFalse(time_period.is_valid_clean_period_hours(7.1)) - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_hours('2.1') - - with self.assertRaises(ValueError): - time_period.is_valid_clean_period_hours('7.1') - - return - - def test_next_sec_or_min(self): - - # since next_minutes_period() just calls next_seconds_period(), - # there is no need to test both - - # we'll start with a basic test of a '15 sec' period - period = 15 - self.assertEqual(time_period.next_seconds_period(0, period), 15) - self.assertEqual(time_period.next_seconds_period(1, period), 15) - self.assertEqual(time_period.next_seconds_period(5, period), 15) - self.assertEqual(time_period.next_seconds_period(13, period), 15) - self.assertEqual(time_period.next_seconds_period(15, period), 30) - self.assertEqual(time_period.next_seconds_period(16, period), 30) - self.assertEqual(time_period.next_seconds_period(29, period), 30) - self.assertEqual(time_period.next_seconds_period(30, period), 45) - self.assertEqual(time_period.next_seconds_period(31, period), 45) - self.assertEqual(time_period.next_seconds_period(44, period), 45) - self.assertEqual(time_period.next_seconds_period(45, period), 60) - self.assertEqual(time_period.next_seconds_period(46, period), 60) - self.assertEqual(time_period.next_seconds_period(59, period), 60) - self.assertEqual(time_period.next_seconds_period(60, period), 75) - - # handle larger values - self.assertEqual(time_period.next_seconds_period(61, period), 75) - self.assertEqual(time_period.next_seconds_period(292, period), 300) - - return - - def test_delay_to_next_seconds(self): - - # we'll start with a basic test of a '15 sec' period - period = 15 - self.assertEqual( - time_period.delay_to_next_seconds_period(0, period), 15) - self.assertEqual( - time_period.delay_to_next_seconds_period(1, period), 14) - self.assertEqual( - time_period.delay_to_next_seconds_period(5, period), 10) - self.assertEqual( - time_period.delay_to_next_seconds_period(13, period), 2) - self.assertEqual( - time_period.delay_to_next_seconds_period(15, period), 15) - self.assertEqual( - time_period.delay_to_next_seconds_period(16, period), 14) - self.assertEqual( - time_period.delay_to_next_seconds_period(29, period), 1) - self.assertEqual( - time_period.delay_to_next_seconds_period(30, period), 15) - self.assertEqual( - time_period.delay_to_next_seconds_period(31, period), 14) - self.assertEqual( - time_period.delay_to_next_seconds_period(44, period), 1) - self.assertEqual( - time_period.delay_to_next_seconds_period(45, period), 15) - self.assertEqual( - time_period.delay_to_next_seconds_period(46, period), 14) - self.assertEqual( - time_period.delay_to_next_seconds_period(59, period), 1) - self.assertEqual( - time_period.delay_to_next_seconds_period(60, period), 15) - - # handle larger values - self.assertEqual( - time_period.delay_to_next_seconds_period(61, period), 14) - self.assertEqual( - time_period.delay_to_next_seconds_period(292, period), 8) - - # toss a few delay_to_next_minutes_period() tests - self.assertEqual( - time_period.delay_to_next_minutes_period(0, period), 15) - self.assertEqual( - time_period.delay_to_next_minutes_period(1, period), 14) - self.assertEqual( - time_period.delay_to_next_minutes_period(45, period), 15) - self.assertEqual( - time_period.delay_to_next_minutes_period(46, period), 14) - self.assertEqual( - time_period.delay_to_next_minutes_period(59, period), 1) - self.assertEqual( - time_period.delay_to_next_minutes_period(60, period), 15) - self.assertEqual( - time_period.delay_to_next_minutes_period(61, period), 14) - self.assertEqual( - time_period.delay_to_next_minutes_period(292, period), 8) - - return - - def test_add_remove_cb(self): - - obj = time_period.TimePeriods() - - # print(obj.per_minute) return like "Period:min cb:0 skewed:0" - # print(obj.per_hour) - # print(obj.per_day) - # print(obj.per_month) - # print(obj.per_year) - - self.assertEqual(obj.per_minute.get_name(), 'min') - self.assertEqual(obj.per_hour.get_name(), 'hr') - self.assertEqual(obj.per_day.get_name(), 'day') - self.assertEqual(obj.per_month.get_name(), 'mon') - self.assertEqual(obj.per_year.get_name(), 'yr') - - def cb_simple(x): - print("CB:{0}".format(x)) - - def cb_simple_2(x): - print("CB:{0}".format(x)) - - # some simple 1 cb in main list - self.assertEqual(len(obj.per_minute.cb_list), 0) - obj.per_minute.add_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 1) - obj.per_minute.remove_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 0) - - # some simple 2 cb in main list - obj.per_minute.add_callback(cb_simple_2) - self.assertEqual(len(obj.per_minute.cb_list), 1) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - obj.per_minute.remove_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 1) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - obj.per_minute.add_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 2) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - obj.per_minute.remove_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 1) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - obj.per_minute.remove_callback(cb_simple_2) - self.assertEqual(len(obj.per_minute.cb_list), 0) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - - # add to both lists - obj.per_minute.add_callback(cb_simple_2, skewed=True) - self.assertEqual(len(obj.per_minute.cb_list), 0) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 1) - obj.per_minute.remove_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 0) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 1) - obj.per_minute.add_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 1) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 1) - obj.per_minute.remove_callback(cb_simple) - self.assertEqual(len(obj.per_minute.cb_list), 0) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 1) - obj.per_minute.remove_callback(cb_simple_2) - self.assertEqual(len(obj.per_minute.cb_list), 0) - self.assertEqual(len(obj.per_minute.cb_list_skewed), 0) - - return - - -def simple_check(): - """A sanity-check routine; not a test""" - - for n in range(1, 61): - print("%02d = %f" % (n, 60.0/n)) - - for n in range(1, 25): - print("%02d = %f" % (n, 24.0/n)) - - return - - -if __name__ == '__main__': - - # simple_check() - - unittest.main() diff --git a/test/test_cplib_unquote_string.py b/test/test_cplib_unquote_string.py deleted file mode 100644 index 31f66322..00000000 --- a/test/test_cplib_unquote_string.py +++ /dev/null @@ -1,51 +0,0 @@ -# Test the PARSE DATA module - -import unittest - -from cp_lib.unquote_string import unquote_string - - -class TestUnquoteString(unittest.TestCase): - - def test_isolate_numeric(self): - - tests = [ - {'src': "Hello", 'exp': "Hello"}, - {'src': " Hello", 'exp': " Hello"}, - {'src': " Hello ", 'exp': " Hello "}, - {'src': "'Hello", 'exp': "'Hello"}, - {'src': "'Hello'", 'exp': "Hello"}, - {'src': '"Hello"', 'exp': 'Hello'}, - {'src': '"Hello', 'exp': '"Hello'}, - - {'src': " 'Hello'", 'exp': "Hello"}, - {'src': "'Hello' ", 'exp': "Hello"}, - {'src': " 'Hello' ", 'exp': "Hello"}, - {'src': ' "Hello"', 'exp': 'Hello'}, - {'src': '"Hello" ', 'exp': 'Hello'}, - {'src': ' "Hello" ', 'exp': 'Hello'}, - - {'src': "", 'exp': ""}, - {'src': " ", 'exp': " "}, - {'src': "'", 'exp': "'"}, - {'src': " '", 'exp': " '"}, - {'src': " '' ", 'exp': ""}, - {'src': None, 'exp': None}, - {'src': 10, 'exp': 10}, - {'src': 10.0, 'exp': 10.0}, - ] - - for test in tests: - result = unquote_string(test['src']) - self.assertEqual(result, test['exp']) - - # with self.assertRaises(ValueError): - # # value must have number str - # isolate_numeric_from_string("") - # isolate_numeric_from_string(" \n") - # isolate_numeric_from_string("hello") - - return - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_cs_client.py b/test/test_cs_client.py deleted file mode 100644 index 16519809..00000000 --- a/test/test_cs_client.py +++ /dev/null @@ -1,53 +0,0 @@ -# Test the cp_lib.cs_client module - -import logging -import unittest - - -class TestCsClient(unittest.TestCase): - - def test_content_length(self): - """ - Test buffer to lines function - :return: - """ - from cp_lib.cs_client import _fetch_content_length - - tests = [ - {"dat": 'content-length: 12\n\r', "len": 12, - "exp": ''}, - {"dat": 'content-length: 12\n\r\n\r\n"IBR1150LPE"', "len": 0, - "exp": '"IBR1150LPE"'}, - {"dat": 'content-length: 189', "len": 189, - "exp": ''}, - {"dat": 'content-length: 189\n\r\n\r\n{"connections": [], "taip_' - 'vehicle_id": "0000", "enable_gps_keepalive": false, "de' - 'bug": {"log_nmea_to_fs": false, "flags": 0}, "enable_gp' - 's_led": false, "pwd_enabled": false, "enabled": true}', - "len": 0, - "exp": '{"connections": [], "taip_vehicle_id": "0000", "enable_' - 'gps_keepalive": false, "debug": {"log_nmea_to_fs": false' - ', "flags": 0}, "enable_gps_led": false, "pwd_enabled":' - ' false, "enabled": true}'}, - ] - - logger = logging.getLogger('unittest') - logger.setLevel(logging.DEBUG) - - for test in tests: - # logging.debug("Test:{}".format(test)) - - # _fetch_content_length(data, logger=None): - data_length, all_data = _fetch_content_length(test['dat'], logger) - self.assertEqual(data_length, test['len']) - self.assertEqual(all_data, test['exp']) - - logging.debug("") - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_load_active_wan.py b/test/test_load_active_wan.py deleted file mode 100644 index 33666b81..00000000 --- a/test/test_load_active_wan.py +++ /dev/null @@ -1,38 +0,0 @@ -# Test the cp_lib.load_active_wan module - -import json -import unittest - -from cp_lib.load_active_wan import fetch_active_wan - - -class TestFetchActiveWan(unittest.TestCase): - - def test_fetch(self): - global base_app - - print("") # skip paste '.' on line - - result = fetch_active_wan(base_app) - pretty = json.dumps(result, indent=4, sort_keys=True) - - # if SHOW_SETTINGS_AS_JSON: - if False: - file_name = "dump.json" - print("Write to file:{}".format(file_name)) - file_han = open(file_name, "w") - file_han.write(pretty) - file_han.close() - - if False: - print("Output:{}".format(pretty)) - - return - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - - base_app = CradlepointAppBase(call_router=False) - - unittest.main() diff --git a/test/test_load_firmware_info.py b/test/test_load_firmware_info.py deleted file mode 100644 index 7b32c96c..00000000 --- a/test/test_load_firmware_info.py +++ /dev/null @@ -1,142 +0,0 @@ -# Test the cp_lib.load_firmware_info module - -import copy -import json -import logging -import os.path -import shutil -import unittest - -from cp_lib.load_firmware_info import load_firmware_info, SECTION_FW_INFO - -# for internal test of tests - allow temp files to be left on disk -REMOVE_TEMP_FILE = True - - -class TestLoadFirmwareInfo(unittest.TestCase): - - def test_method_1_ini(self): - - print("") # skip paste '.' on line - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - - # since we do not test values, all need is a fake ["fw_info"] section - # but module will try to create ["version"]: "6.1" - _my_settings[SECTION_FW_INFO] = {"major_version": 6, - "minor_version": 1} - - if False: - print("Settings after Method #1 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_firmware_info(_my_settings, _client) - self.assertEqual(result, _my_settings) - - return - - def test_method_2_file(self): - - print("") # skip paste '.' on line - - test_file_name = "test/test_fw_info.json" - - # make a raw JSON string - data = '{"major_version":6, "fw_update_available":false, "upgrade' +\ - '_patch_version":0, "upgrade_minor_version":0, "build_version' +\ - '":"0310fce", "build_date":"WedJan1300: 23: 15MST2016", "minor' +\ - '_version":1, "upgrade_major_version":0, "manufacturing_up' +\ - 'grade":false, "build_type":"FIELD[build]", "custom_defaults":' +\ - 'false, "patch_version":0}' - - _logger.debug("Make temp file:{}".format(test_file_name)) - _han = open(test_file_name, 'w') - _han.write(data) - _han.close() - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - self.assertFalse("fw_info" in _my_settings) - - if False: - print("Settings before Method #2 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_firmware_info(_my_settings, _client, - file_name=test_file_name) - self.assertTrue("fw_info" in result) - - if False: - print("Settings after Method #2 test") - print(json.dumps(result, indent=4, sort_keys=True)) - - if REMOVE_TEMP_FILE: - _logger.debug("Delete temp file:{}".format(test_file_name)) - self._remove_name_no_error(test_file_name) - - return - - def test_method_3_url(self): - - print("") # skip paste '.' on line - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - self.assertFalse("fw_info" in _my_settings) - - if False: - print("Settings before Method #3 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_firmware_info(_my_settings, _client) - self.assertTrue("fw_info" in result) - - # if SHOW_SETTINGS_AS_JSON: - if False: - print("Settings after Method #3 test") - print(json.dumps(result, indent=4, sort_keys=True)) - - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - from cp_lib.cs_client import init_cs_client_on_my_platform - from cp_lib.load_settings_ini import load_sdk_ini_as_dict - - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - - _logger = logging.getLogger('unittest') - _logger.setLevel(logging.DEBUG) - - # we pass in no APP Dir, so just read the .config data - _settings = load_sdk_ini_as_dict() - # _logger.debug("sets:{}".format(_settings)) - - # handle the Router API client, which is different between PC - # testing and router HW - try: - _client = init_cs_client_on_my_platform(_logger, _settings) - except: - _logger.exception("CSClient init failed") - raise - - unittest.main() diff --git a/test/test_load_gps_config.py b/test/test_load_gps_config.py deleted file mode 100644 index 8f584a00..00000000 --- a/test/test_load_gps_config.py +++ /dev/null @@ -1,51 +0,0 @@ -# Test the cp_lib.load_active_wan module - -import json -import unittest - -from cp_lib.load_gps_config import fetch_gps_config, GpsConfig - - -class TestFetchGpsConfig(unittest.TestCase): - - def test_fetch(self): - global base_app - - print("") # skip paste '.' on line - - result = fetch_gps_config(base_app) - pretty = json.dumps(result, indent=4, sort_keys=True) - - # if SHOW_SETTINGS_AS_JSON: - if False: - file_name = "dump.json" - print("Write to file:{}".format(file_name)) - file_han = open(file_name, "w") - file_han.write(pretty) - file_han.close() - - if False: - print("Output:{}".format(pretty)) - - return - - def test_object(self): - global base_app - - obj = GpsConfig(base_app) - self.assertIsNotNone(obj) - self.assertIsNotNone(obj.data) - - base_app.logger.debug("GPS Enabled:{}".format(obj.is_enabled())) - base_app.logger.debug("Keepalive Enabled:{}".format( - obj.keepalive_is_enabled())) - base_app.logger.debug("GPS to Server:{}".format(obj.get_client_info())) - - return - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - - base_app = CradlepointAppBase(call_router=False) - unittest.main() diff --git a/test/test_load_product_info.py b/test/test_load_product_info.py deleted file mode 100644 index ed024292..00000000 --- a/test/test_load_product_info.py +++ /dev/null @@ -1,206 +0,0 @@ -# Test the cp_lib.load_product_info module - -import copy -import json -import logging -import os.path -import shutil -import unittest - -from cp_lib.load_product_info import load_product_info, \ - SECTION_PRODUCT_INFO, split_product_name - -# for internal test of tests - allow temp files to be left on disk -REMOVE_TEMP_FILE = True - - -class TestLoadProductInfo(unittest.TestCase): - - def test_method_1_ini(self): - - print("") # skip paste '.' on line - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - - # since do not test values, only need a fake ["product_info"] section - _my_settings[SECTION_PRODUCT_INFO] = True - - if False: - print("Settings after Method #1 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_product_info(_my_settings, _client) - self.assertEqual(result, _my_settings) - - return - - def test_method_2_file(self): - - print("") # skip paste '.' on line - - test_file_name = "test/test_product_info.json" - - # make a raw JSON string - data = '{"company_name":"Cradlepoint, Inc.","company_url": ' + \ - '"http://cradlepoint.com","copyright":"Cradlepoint, Inc. ' + \ - '2016","mac0": "00:30:44:1a:81:9c","manufacturing":{"board' + \ - '_ID":"050200","mftr_date":"20141204","serial_num":"MM1404' + \ - '59400193"},"product_name": "IBR1150LPE"}' - - _logger.debug("Make temp file:{}".format(test_file_name)) - _han = open(test_file_name, 'w') - _han.write(data) - _han.close() - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - self.assertFalse("product_info" in _my_settings) - - if False: - print("Settings before Method #2 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_product_info(_my_settings, _client, - file_name=test_file_name) - self.assertTrue("product_info" in result) - - if False: - print("Settings after Method #2 test") - print(json.dumps(result, indent=4, sort_keys=True)) - - if REMOVE_TEMP_FILE: - _logger.debug("Delete temp file:{}".format(test_file_name)) - self._remove_name_no_error(test_file_name) - - return - - def test_method_3_url(self): - - print("") # skip paste '.' on line - - # make a DEEP copy, to make sure we do not 'pollute' any other tests - _my_settings = copy.deepcopy(_settings) - self.assertFalse("product_info" in _my_settings) - - if False: - print("Settings before Method #3 test") - print(json.dumps(_my_settings, indent=4, sort_keys=True)) - - result = load_product_info(_my_settings, _client) - self.assertTrue("product_info" in result) - - # if SHOW_SETTINGS_AS_JSON: - if False: - print("Settings after Method #3 test") - print(json.dumps(result, indent=4, sort_keys=True)) - - return - - def test_split_product_name(self): - - print("") # skip paste '.' on line - - _logger.debug("test split_product_name") - - tests = [ - {'src': "IBR350", 'exp': ("IBR350", "", False)}, - {'src': "IBR300AT", 'exp': ("IBR300", "AT", True)}, - - {'src': "IBR600", 'exp': ("IBR600", "", True)}, - {'src': "IBR600AT", 'exp': ("IBR600", "AT", True)}, - {'src': "IBR650", 'exp': ("IBR650", "", False)}, - {'src': "IBR650AT", 'exp': ("IBR650", "AT", False)}, - - {'src': "IBR600B", 'exp': ("IBR600B", "", True)}, - {'src': "IBR600BAT", 'exp': ("IBR600B", "AT", True)}, - {'src': "IBR650B", 'exp': ("IBR650B", "", False)}, - {'src': "IBR650BAT", 'exp': ("IBR650B", "AT", False)}, - - {'src': "CBA850", 'exp': ("CBA850", "", False)}, - {'src': "CBA800AT", 'exp': ("CBA800", "AT", True)}, - - {'src': "IBR1100", 'exp': ("IBR1100", "", True)}, - {'src': "IBR1100AT", 'exp': ("IBR1100", "AT", True)}, - {'src': "ibr1100LPE", 'exp': ("IBR1100", "LPE", True)}, - {'src': "IBR1150", 'exp': ("IBR1150", "", False)}, - {'src': "IBR1150AT", 'exp': ("IBR1150", "AT", False)}, - {'src': "ibr1150LPE", 'exp': ("IBR1150", "LPE", False)}, - - {'src': "AER1600", 'exp': ("AER1600", "", True)}, - {'src': "AER1600AT", 'exp': ("AER1600", "AT", True)}, - {'src': "AER1600LPE", 'exp': ("AER1600", "LPE", True)}, - {'src': "AER1650", 'exp': ("AER1650", "", False)}, - {'src': "AER1650AT", 'exp': ("AER1650", "AT", False)}, - {'src': "AER1650LPE", 'exp': ("AER1650", "LPE", False)}, - - # a bit fake, as we'll always see "2100" - {'src': "AER2100", 'exp': ("AER2100", "", True)}, - {'src': "AER2100AT", 'exp': ("AER2100", "AT", True)}, - {'src': "AER2100LPE", 'exp': ("AER2100", "LPE", True)}, - {'src': "AER2150", 'exp': ("AER2150", "", False)}, - {'src': "AER2150AT", 'exp': ("AER2150", "AT", False)}, - {'src': "AER2150LPE", 'exp': ("AER2150", "LPE", False)}, - - {'src': "2100", 'exp': ("AER2100", "", True)}, - {'src': "2100AT", 'exp': ("AER2100", "AT", True)}, - {'src': "2100LPE", 'exp': ("AER2100", "LPE", True)}, - {'src': "2150", 'exp': ("AER2150", "", False)}, - {'src': "2150AT", 'exp': ("AER2150", "AT", False)}, - {'src': "2150LPE", 'exp': ("AER2150", "LPE", False)}, - - {'src': "AER3100", 'exp': ("AER3100", "", True)}, - {'src': "AER3100AT", 'exp': ("AER3100", "AT", True)}, - {'src': "AER3100LPE", 'exp': ("AER3100", "LPE", True)}, - {'src': "AER3150", 'exp': ("AER3150", "", False)}, - {'src': "AER3150AT", 'exp': ("AER3150", "AT", False)}, - {'src': "AER3150LPE", 'exp': ("AER3150", "LPE", False)}, - ] - - for test in tests: - result = split_product_name(test['src']) - self.assertEqual(result, test['exp']) - - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - from cp_lib.cs_client import init_cs_client_on_my_platform - from cp_lib.load_settings_ini import load_sdk_ini_as_dict - - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - - _logger = logging.getLogger('unittest') - _logger.setLevel(logging.DEBUG) - - # we pass in no APP Dir, so just read the .config data - _settings = load_sdk_ini_as_dict() - # _logger.debug("sets:{}".format(_settings)) - - # handle the Router API client, which is different between PC - # testing and router HW - try: - _client = init_cs_client_on_my_platform(_logger, _settings) - except: - _logger.exception("CSClient init failed") - raise - - unittest.main() diff --git a/test/test_load_settings.py b/test/test_load_settings.py deleted file mode 100644 index f6010306..00000000 --- a/test/test_load_settings.py +++ /dev/null @@ -1,341 +0,0 @@ -# Test the cp_lib.load_settings module - -import logging -import os.path -# noinspection PyUnresolvedReferences -import shutil -import unittest - - -class TestLoadSettings(unittest.TestCase): - - def test_load_settings(self): - import copy - import tools.make_load_settings as load_settings - from cp_lib.load_settings_json import load_settings_json, DEF_GLOBAL_DIRECTORY, DEF_JSON_EXT - from cp_lib.load_settings_ini import save_root_settings_json - - print("") - - glob_data = [ - "[logging]", - "level = debug", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - app_data = [ - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "uuid = 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - ] - - all_data = copy.deepcopy(glob_data) - all_data.extend(app_data) - - def _make_ini_file(file_name: str, data_list: list): - """Given file name (path), make file containing the name""" - _han = open(file_name, 'w') - for line in data_list: - _han.write(line + "\n") - _han.close() - # logging.debug("Write Global INI") - return - - test_file_name = "test_load" - - global_dir = DEF_GLOBAL_DIRECTORY - global_path = os.path.join(global_dir, test_file_name + load_settings.DEF_INI_EXT) - # logging.debug("GLB:[{}]".format(global_path)) - - app_dir = "network\\tcp_echo" - app_path = os.path.join(app_dir, test_file_name + load_settings.DEF_INI_EXT) - # logging.debug("APP:[{}]".format(app_path)) - - save_path = test_file_name + DEF_JSON_EXT - - logging.info("TEST: only global exists, but is incomplete:[{}]".format(global_path)) - self._remove_name_no_error(global_path) - self._remove_name_no_error(app_path) - self._remove_name_no_error(save_path) - - _make_ini_file(global_path, glob_data) - self.assertTrue(os.path.isfile(global_path)) - self.assertFalse(os.path.isfile(app_path)) - self.assertFalse(os.path.isfile(save_path)) - - with self.assertRaises(KeyError): - # we lack an apps section - result = load_settings.load_settings(app_dir, test_file_name) - - self._remove_name_no_error(global_path) - - _make_ini_file(global_path, all_data) - self.assertTrue(os.path.isfile(global_path)) - self.assertFalse(os.path.isfile(app_path)) - - expect = { - "application": { - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "path": "network/tcp_echo", - "name": "tcp_echo", - "_comment": "Settings for the application being built.", - "description": "Run a basic TCP socket echo server and client" - }, - "router_api": { - "password": "441b1702", - "_comment": "Settings to allow accessing router API in development mode.", - "local_ip": "192.168.1.1", - "user_name": "admin" - }, - "logging": { - "level": "debug", - "_comment": "Settings for the application debug/syslog/logging function." - } - } - logging.info("TEST: only global exists, is now complete:[{}]".format(global_path)) - result = load_settings.load_settings(app_dir, test_file_name) - self.assertEqual(result, expect) - - logging.info("TEST: only APP exists:[{}]".format(global_path)) - self._remove_name_no_error(global_path) - self._remove_name_no_error(app_path) - - _make_ini_file(app_path, app_data) - self.assertFalse(os.path.isfile(global_path)) - self.assertTrue(os.path.isfile(app_path)) - - # we lack an apps section - result = load_settings.load_settings(app_dir, test_file_name) - - expect = { - "application": { - "path": "network/tcp_echo", - "description": "Run a basic TCP socket echo server and client", - "name": "tcp_echo", - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "_comment": "Settings for the application being built." - } - } - self.assertEqual(result, expect) - - self._remove_name_no_error(global_path) - self._remove_name_no_error(app_path) - - logging.info("TEST: both exists, is complete:[{}]".format(global_path)) - _make_ini_file(global_path, glob_data) - _make_ini_file(app_path, app_data) - - self.assertTrue(os.path.isfile(global_path)) - self.assertTrue(os.path.isfile(app_path)) - - expect = { - "application": { - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "path": "network/tcp_echo", - "name": "tcp_echo", - "_comment": "Settings for the application being built.", - "description": "Run a basic TCP socket echo server and client" - }, - "router_api": { - "password": "441b1702", - "_comment": "Settings to allow accessing router API in development mode.", - "local_ip": "192.168.1.1", - "user_name": "admin" - }, - "logging": { - "level": "debug", - "_comment": "Settings for the application debug/syslog/logging function." - } - } - result = load_settings.load_settings(app_dir, test_file_name) - self.assertEqual(result, expect) - - # result is now our 'full' settings - logging.info("TEST: save to root, is complete:[{}]".format(global_path)) - self.assertFalse(os.path.isfile(save_path)) - save_root_settings_json(result, save_path) - self.assertTrue(os.path.isfile(save_path)) - - self._remove_name_no_error(global_path) - self._remove_name_no_error(app_path) - - result = load_settings_json(file_name=test_file_name) - # logging.debug("") - # logging.debug("Load Result:[{}]".format(json.dumps(result))) - # logging.debug("") - # logging.debug("Load Expect:[{}]".format(json.dumps(expect))) - # logging.debug("") - - self.assertEqual(result, expect) - - self._remove_name_no_error(save_path) - - return - - def test_fix_uuid(self): - """ - add or replace the "uuid" data in the app's INI file - - TODO - also handle JSON, but for now we ignore this. - - :return: - """ - - import tools.make_load_settings as load_settings - import uuid - - print("") - - sets = {"app_dir": "test", "base_name": "test_uuid"} - - ini_name = os.path.join(sets["app_dir"], sets["base_name"] + load_settings.DEF_INI_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "uuid = 7042c8fd-fe7a-4846-aed1-original", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - value = str(uuid.uuid4()) - logging.info("Creating random UUID={}".format(value)) - - load_settings.fix_up_uuid(ini_name, value, backup=False) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - value = str(uuid.uuid4()) - logging.info("Creating random UUID={}".format(value)) - - load_settings.fix_up_uuid(ini_name, value, backup=False) - - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - return - - def test_incr_version(self): - """ - add or replace the "uuid" data in the app's INI file - - TODO - also handle JSON, but for now we ignore this. - - :return: - """ - import tools.make_load_settings as load_settings - - print("") - - sets = {"app_dir": "test", "base_name": "test_version"} - - ini_name = os.path.join(sets["app_dir"], sets["base_name"] + load_settings.DEF_INI_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "version = 3.45", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - load_settings.increment_app_version(ini_name) - - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - load_settings.increment_app_version(ini_name) - - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_make.py b/test/test_make.py deleted file mode 100644 index 0d423c75..00000000 --- a/test/test_make.py +++ /dev/null @@ -1,292 +0,0 @@ -# Test the Monnit Protocol code - -import unittest -import logging -import os.path -# noinspection PyUnresolvedReferences -import shutil - -import make - - -class TestMake(unittest.TestCase): - - def test_confirm_dir_exists(self): - - maker = make.TheMaker() - - # just do the ./build, as it can be empty by default - test_name = "build" - - # make sure it doesn't exist as file or dir - maker._remove_name_no_error(test_name) - - # 1st confirm, will create as directory - self.assertFalse(os.path.exists(test_name)) - maker._confirm_dir_exists(test_name, "Test dir") - self.assertTrue(os.path.exists(test_name)) - self.assertTrue(os.path.isdir(test_name)) - - # 2nd confirm, will leave alone - maker._confirm_dir_exists(test_name, "Test dir") - self.assertTrue(os.path.exists(test_name)) - self.assertTrue(os.path.isdir(test_name)) - - # make sure it doesn't exist as file or dir - test_save_name = test_name + maker.SDIR_SAVE_EXT - maker._remove_name_no_error(test_name) - maker._remove_name_no_error(test_save_name) - - self.assertFalse(os.path.exists(test_name)) - self.assertFalse(os.path.exists(test_save_name)) - - # create a dummy file, should cause to be renamed test_save_name - file_handle = open(test_name, "w") - file_handle.write("Hello there!") - file_handle.close() - - # so now, common file 'blocks' our directory; we'll rename to .save & make anyway - self.assertTrue(os.path.exists(test_name)) - self.assertFalse(os.path.exists(test_save_name)) - - maker._confirm_dir_exists(test_name, "Test blocked dir") - - self.assertTrue(os.path.exists(test_name)) - self.assertTrue(os.path.isdir(test_name)) - - self.assertTrue(os.path.exists(test_save_name)) - self.assertTrue(os.path.isfile(test_save_name)) - - # we just leave ./build/ existing - is okay - maker._remove_name_no_error(test_save_name) - - return - - def test_install_sh(self): - - def _make_temp_file(file_name: str): - """Given file name (path), make file containing the name""" - _han = open(file_name, 'w') - _han.write(file_name) - _han.close() - return - - def _validate_contents(file_name: str, expected: str): - """Confirm file contains 'expected' data""" - _han = open(file_name, 'r') - _data = _han.read() - _han.close() - return _data == expected - - # quick test of the _make_temp_file and _validate_contents - data = os.path.join("test", "shiny_shoes.txt") - _make_temp_file(data) - self.assertTrue(_validate_contents(data, data)) - os.remove(data) - - maker = make.TheMaker() - maker.load_settings_json() - - test_install_name = "test_install.sh" - maker.force_settings_dict({'name': 'tcp_echo'}) - maker.force_settings_dict({'path': os.path.join("network", "tcp_echo")}) - - app_file_name = os.path.join(maker.get_app_path(), test_install_name) - cfg_file_name = os.path.join(make.SDIR_CONFIG, test_install_name) - dst_file_name = os.path.join(make.SDIR_BUILD, test_install_name) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # test fresh creation (& re-creation) a default INSTALL file - no source exists - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # now try using the config file (no dev supplies app file) - _make_temp_file(cfg_file_name) - - self.assertFalse(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, cfg_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # now try using the dev supplies file, assume no global config file - _make_temp_file(app_file_name) - - self.assertTrue(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertTrue(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, app_file_name)) - - # repeat, but this time global config exists & is ignored - maker._remove_name_no_error(dst_file_name) - _make_temp_file(cfg_file_name) - - self.assertTrue(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertTrue(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, app_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - return - - def test_start_sh(self): - - maker = make.TheMaker() - maker.load_settings_json() - - def _make_temp_file(file_name: str): - """Given file name (path), make file containing the name""" - _han = open(file_name, 'w') - _han.write(file_name) - _han.close() - return - - def _validate_contents(file_name: str, expected: str): - """Confirm file contains 'expected' data""" - _han = open(file_name, 'r') - _data = _han.read() - _han.close() - return _data == expected - - # quick test of the _make_temp_file and _validate_contents - data = os.path.join("test", "shiny_shoes.txt") - _make_temp_file(data) - self.assertTrue(_validate_contents(data, data)) - os.remove(data) - - maker = make.TheMaker() - maker.load_settings_json() - - test_install_name = "test_start.sh" - maker.force_settings_dict({'name': 'tcp_echo'}) - maker.force_settings_dict({'path': os.path.join("network", "tcp_echo")}) - - app_file_name = os.path.join(maker.get_app_path(), test_install_name) - cfg_file_name = os.path.join(make.SDIR_CONFIG, test_install_name) - dst_file_name = os.path.join(make.SDIR_BUILD, test_install_name) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # test fresh creation (& re-creation) a default INSTALL file - no source exists - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # now try using the config file (no dev supplies app file) - _make_temp_file(cfg_file_name) - - self.assertFalse(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertFalse(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, cfg_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - # now try using the dev supplies file, assume no global config file - _make_temp_file(app_file_name) - - self.assertTrue(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertTrue(os.path.exists(app_file_name)) - self.assertFalse(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, app_file_name)) - - # repeat, but this time global config exists & is ignored - maker._remove_name_no_error(dst_file_name) - _make_temp_file(cfg_file_name) - - self.assertTrue(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertFalse(os.path.exists(dst_file_name)) - - maker.create_install_sh(test_install_name) - self.assertTrue(os.path.exists(app_file_name)) - self.assertTrue(os.path.exists(cfg_file_name)) - self.assertTrue(os.path.exists(dst_file_name)) - self.assertTrue(_validate_contents(dst_file_name, app_file_name)) - - # start, make sure none exist - maker._remove_name_no_error(app_file_name) - maker._remove_name_no_error(cfg_file_name) - maker._remove_name_no_error(dst_file_name) - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_make_load_settings.py b/test/test_make_load_settings.py deleted file mode 100644 index a345ac50..00000000 --- a/test/test_make_load_settings.py +++ /dev/null @@ -1,328 +0,0 @@ -# Test the tools.make_settings module - for some weird reason, I can't run this from ./tests - -import logging -import os.path -import shutil -import unittest - -# for internal test of tests - allow temp files to be left on disk -REMOVE_TEMP_FILE = True - - -class TestLoadSettings(unittest.TestCase): - - def test_line_find_section(self): - from tools.make_load_settings import _line_find_section - - print("") # skip paste '.' on line - - logging.info("TEST _line_find_section") - tests = [ - (None, False), - ("", False), - ("[]", False), - ("[application]", True), - (" [Application]", True), - (" [aPPlication] # comments", True), - ("[APPLICATION]", True), - ("[aplication]", False), - (" name = tcp_echo", False), - ("description = Run a basic TCP socket echo server and client", False), - ("path = network/tcp_echo", False), - ("uuid = 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", False), - (" [build]", False), - (" [RouterApiStuff]", False), - ] - - for test in tests: - source = test[0] - expect = test[1] - self.assertEqual(_line_find_section(source, name='application'), expect) - return - - def test_load_settings(self): - - from tools.make_load_settings import DEF_GLOBAL_DIRECTORY, DEF_INI_EXT, load_settings - - def _make_global_ini_file(file_name: str): - """Given file name (path), make file containing the name""" - data = [ - "[logging]", - "level = debug", - "syslog_ip = 192.168.1.6", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(file_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - # logging.debug("Write Global INI") - return - - def _make_app_ini_file(file_name: str): - """Given file name (path), make file containing the name""" - data = [ - "[logging]", - "level = info", - # this one NOT changed! "syslog_ip = 192.168.1.6", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "uuid = 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - ] - - _han = open(file_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - # logging.debug("Write APP INI") - return - - print("") # skip paste '.' on line - - test_file_name = "test_load" - - logging.info("TEST: load proj over global, merge correctly") - global_dir = DEF_GLOBAL_DIRECTORY - global_path = os.path.join(global_dir, test_file_name + DEF_INI_EXT) - # logging.debug("GLB:[{}]".format(global_path)) - _make_global_ini_file(global_path) - - app_dir = "network\\tcp_echo" - app_path = os.path.join(app_dir, test_file_name + DEF_INI_EXT) - # logging.debug("APP:[{}]".format(app_path)) - _make_app_ini_file(app_path) - - result = load_settings(app_dir, global_dir, test_file_name) - # logging.debug("Load Result:[{}]".format(json.dumps(result, sort_keys=True, indent=2))) - - # confirm worked! APP changed logging level, but not syslog_ip - self.assertNotEqual("debug", result["logging"]["level"]) - self.assertEqual("info", result["logging"]["level"]) - self.assertEqual("192.168.1.6", result["logging"]["syslog_ip"]) - - # clean up the temp file - if REMOVE_TEMP_FILE: - self._remove_name_no_error(global_path) - self._remove_name_no_error(app_path) - - return - - def test_fix_uuid(self): - """ - add or replace the "uuid" data in the app's INI file - - TODO - also handle JSON, but for now we ignore this. - - :return: - """ - import uuid - import tools.make_load_settings as load_settings - import configparser - - print("") # skip paste '.' on line - - sets = {"app_dir": "test", "base_name": "test_uuid"} - - ini_name = os.path.join(sets["app_dir"], sets["base_name"] + load_settings.DEF_INI_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "uuid = 7042c8fd-fe7a-4846-aed1-original", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - logging.info("TEST - over-write old UUID") - expect = str(uuid.uuid4()) - load_settings.fix_up_uuid(ini_name, expect, backup=REMOVE_TEMP_FILE) - - # confirm it worked! - config = configparser.ConfigParser() - file_han = open(ini_name, "r") - config.read_file(file_han) - file_han.close() - # logging.debug(" uuid:{}".format(config["application"]["uuid"])) - self.assertEqual(expect, config["application"]["uuid"]) - - data = ["[logging]", - "level=debug", - "", - "[application]", - "name=tcp_echo", - "description=Run a basic TCP socket echo server and client", - "path=network/tcp_echo", - "", - "[router_api]", - "local_ip=192.168.1.1", - "user_name=admin", - "password=441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - logging.info("TEST - add missing UUID") - expect = str(uuid.uuid4()) - load_settings.fix_up_uuid(ini_name, expect, backup=REMOVE_TEMP_FILE) - - # confirm it worked! - config = configparser.ConfigParser() - file_han = open(ini_name, "r") - config.read_file(file_han) - file_han.close() - # logging.debug(" uuid:{}".format(config["application"]["uuid"])) - self.assertEqual(expect, config["application"]["uuid"]) - - if REMOVE_TEMP_FILE: - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - return - - def test_incr_version(self): - """ - add or replace the "uuid" data in the app's INI file - - TODO - also handle JSON, but for now we ignore this. - - :return: - """ - import tools.make_load_settings as load_settings - import configparser - - print("") # skip paste '.' on line - - sets = {"app_dir": "test", "base_name": "test_version"} - - ini_name = os.path.join(sets["app_dir"], sets["base_name"] + load_settings.DEF_INI_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "version = 3.45", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - logging.info("TEST - increment existing version") - expect = "3.46" - load_settings.increment_app_version(ini_name, incr_version=True) - - # confirm it worked! - config = configparser.ConfigParser() - file_han = open(ini_name, "r") - config.read_file(file_han) - file_han.close() - # logging.debug(" version:{}".format(config["application"]["version"])) - self.assertEqual(expect, config["application"]["version"]) - - logging.info("TEST - don't increment existing version") - expect = "3.46" - load_settings.increment_app_version(ini_name, incr_version=False) - - # confirm it worked! - config = configparser.ConfigParser() - file_han = open(ini_name, "r") - config.read_file(file_han) - file_han.close() - # logging.debug(" version:{}".format(config["application"]["version"])) - self.assertEqual(expect, config["application"]["version"]) - - if REMOVE_TEMP_FILE: - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - data = ["[logging]", - "level = debug", - "", - "[application]", - "name = tcp_echo", - "description = Run a basic TCP socket echo server and client", - "path = network/tcp_echo", - "", - "[router_api]", - "local_ip = 192.168.1.1", - "user_name = admin", - "password = 441b1702" - ] - - _han = open(ini_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - logging.info("TEST - missing version") - expect = "1.0" - load_settings.increment_app_version(ini_name) - - # confirm it worked! - config = configparser.ConfigParser() - file_han = open(ini_name, "r") - config.read_file(file_han) - file_han.close() - # logging.debug(" version:{}".format(config["application"]["version"])) - self.assertEqual(expect, config["application"]["version"]) - - if REMOVE_TEMP_FILE: - self._remove_name_no_error(ini_name) - self._remove_name_no_error(ini_name + load_settings.DEF_SAVE_EXT) - - return - - @staticmethod - def _remove_name_no_error(file_name): - """ - Just remove if exists - :param str file_name: the file - :return: - """ - if os.path.isdir(file_name): - shutil.rmtree(file_name) - - else: - try: # second, try if common file - os.remove(file_name) - except FileNotFoundError: - pass - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_module_dependency.py b/test/test_module_dependency.py deleted file mode 100644 index b39d9e4a..00000000 --- a/test/test_module_dependency.py +++ /dev/null @@ -1,98 +0,0 @@ -# Test the tools.split.version module - -import json -import logging -import os.path -import unittest - -from tools.module_dependency import BuildDependencyList - - -class TestModuleDependency(unittest.TestCase): - - def test_get_file_dependency_list(self): - """ - Test the one-file module - :return: - """ - - obj = BuildDependencyList() - path_name = None - logging.info("get_file_dependency_list(\"{}\") bad type".format(path_name)) - with self.assertRaises(TypeError): - obj.add_file_dependency(path_name) - path_name = 23 - with self.assertRaises(TypeError): - obj.add_file_dependency(path_name) - - path_name = "not here" - logging.info("get_file_dependency_list(\"{}\") doesn't exist".format(path_name)) - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertIsNone(result) - - path_name = os.path.join("network", "tcp_echo") - logging.info("get_file_dependency_list(\"{}\") is dir not file".format(path_name)) - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertIsNone(result) - - path_name = os.path.join("network", "tcp_echo", "settings.json.save") - logging.info("get_file_dependency_list(\"{}\") doesn't exist".format(path_name)) - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertIsNone(result) - - path_name = os.path.join("network", "tcp_echo", "tcp_echo.py") - expect = ['cp_lib.cp_logging', 'cp_lib.hw_status', 'cp_lib.load_settings'] - logging.info("get_file_dependency_list(\"{}\") doesn't exist".format(path_name)) - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - # "cp_lib.clean_ini": [], - path_name = os.path.join("cp_lib", "clean_ini.py") - logging.info("get_file_dependency_list(\"{}\") test a built-in".format(path_name)) - expect = [] - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - # "cp_lib.cp_logging": ["cp_lib.hw_status", "cp_lib.load_settings"], - path_name = os.path.join("cp_lib", "cp_logging.py") - logging.info("get_file_dependency_list(\"{}\") test a built-in".format(path_name)) - expect = ["cp_lib.hw_status", "cp_lib.load_settings", "cp_lib.clean_ini", "cp_lib.split_version"] - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - # "cp_lib.hw_status": [], - path_name = os.path.join("cp_lib", "hw_status.py") - logging.info("get_file_dependency_list(\"{}\") test a built-in".format(path_name)) - expect = [] - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - # "cp_lib.load_settings": ["cp_lib.clean_ini", "cp_lib.split_version"], - path_name = os.path.join("cp_lib", "load_settings.py") - logging.info("get_file_dependency_list(\"{}\") test a built-in".format(path_name)) - expect = ["cp_lib.clean_ini", "cp_lib.split_version"] - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - # "cp_lib.split_version": [] - path_name = os.path.join("cp_lib", "split_version.py") - logging.info("get_file_dependency_list(\"{}\") test a built-in".format(path_name)) - expect = [] - obj = BuildDependencyList() - result = obj.add_file_dependency(path_name) - self.assertEqual(result, expect) - - return - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_probe_serial.py b/test/test_probe_serial.py deleted file mode 100644 index e3ce71d1..00000000 --- a/test/test_probe_serial.py +++ /dev/null @@ -1,112 +0,0 @@ -# Test the cp_lib.probe_serial module - -import json -import unittest - -import cp_lib.probe_serial as probe_serial - -PPRINT_RESULT = True - - -class TestSerialRedirectorConfig(unittest.TestCase): - - def test_serial_redirect(self): - global base_app - - print("") # skip paste '.' on line - - obj = probe_serial.SerialRedirectorConfig(base_app) - base_app.logger.info("Fetch {}".format(obj.topic)) - result = obj.refresh() - - self.assertIsNotNone(result) - - if PPRINT_RESULT: - print(json.dumps(result, indent=4, sort_keys=True)) - - if True: - # these would only be true in some situations - expect_port = "ttyS1" - self.assertFalse(obj.enabled()) - self.assertFalse(obj.enabled(expect_port)) - self.assertFalse(obj.enabled("fifth_port")) - self.assertEqual(obj.port_name(), expect_port) - - return - - def test_serial_gpio(self): - global base_app - - print("") # skip paste '.' on line - - obj = probe_serial.SerialGPIOConfig(base_app) - base_app.logger.info("Fetch {}".format(obj.topic)) - result = obj.refresh() - - self.assertIsNotNone(result) - - if PPRINT_RESULT: - print(json.dumps(result, indent=4, sort_keys=True)) - - if True: - # these would only be true in some situations - self.assertFalse(obj.enabled()) - - return - - def test_serial_gps(self): - global base_app - - print("") # skip paste '.' on line - - obj = probe_serial.SerialGpsConfig(base_app) - base_app.logger.info("Fetch {}".format(obj.topic)) - result = obj.refresh() - - self.assertIsNotNone(result) - - if PPRINT_RESULT: - print(json.dumps(result, indent=4, sort_keys=True)) - - if True: - # these would only be true in some situations - expect_port = "ttyS1" - if False: - # for when is true in actual config of 1100 - self.assertTrue(obj.enabled()) - self.assertTrue(obj.enabled(expect_port)) - else: - self.assertFalse(obj.enabled()) - self.assertFalse(obj.enabled(expect_port)) - - # this one will always be False - self.assertFalse(obj.enabled("fifth_port")) - - return - - def test_probe_if_serial_available(self): - global base_app - - print("") # skip paste '.' on line - - result = probe_serial.probe_if_serial_available(base_app) - - if PPRINT_RESULT: - print(json.dumps(result, indent=4, sort_keys=True)) - - # these would only be true in some situations - expect_port = "ttyS1" - result = probe_serial.probe_if_serial_available(base_app,expect_port) - - if PPRINT_RESULT: - print(json.dumps(result, indent=4, sort_keys=True)) - - return - - -if __name__ == '__main__': - from cp_lib.app_base import CradlepointAppBase - - base_app = CradlepointAppBase() - - unittest.main() diff --git a/test/test_split_version.py b/test/test_split_version.py deleted file mode 100644 index 257857f0..00000000 --- a/test/test_split_version.py +++ /dev/null @@ -1,214 +0,0 @@ -# Test the cp_lib.split.version module - -import logging -import unittest - - -class TestSplitVersion(unittest.TestCase): - - def test_split_version(self): - """ - Test the raw/simple handling of 1 INI to JSON in any directory - :return: - """ - from cp_lib.split_version import split_version_string - - tests = [ - (None, None, None, None, None), - (None, "3", 3, 0, 0), - (None, "3.4", 3, 4, 0), - (None, "3.4.7", 3, 4, 7), - ("9.65", None, 9, 65, 0), - ("9.65", "3", 9, 65, 0), - ("9.65", "3.4", 9, 65, 0), - ("9.65", "3.4.7", 9, 65, 0), - ("9.65.beta", None, 9, 65, "beta"), - ("9.65.B", "3", 9, 65, "B"), - ("9.65.beta", "3.4", 9, 65, "beta"), - - # bad types - (9.65, None, TypeError, 65, 0), - (9, None, TypeError, 65, 0), - ] - - for test in tests: - # logging.debug("Test:{}".format(test)) - source = test[0] - source_default = test[1] - expect_major = test[2] - expect_minor = test[3] - expect_patch = test[4] - - if expect_major == TypeError: - with self.assertRaises(TypeError): - split_version_string(source) - - else: - if source_default is None: - major, minor, patch = split_version_string(source) - else: - major, minor, patch = split_version_string(source, source_default) - - self.assertEqual(major, expect_major) - self.assertEqual(minor, expect_minor) - self.assertEqual(patch, expect_patch) - - return - - def test_split_version_dict(self): - """ - :return: - """ - from cp_lib.split_version import split_version_save_to_dict, SETS_NAME_MAJOR, SETS_NAME_MINOR, SETS_NAME_PATCH - - tests = [ - (None, None, None, None, None), - (None, "3", 3, 0, 0), - (None, "3.4", 3, 4, 0), - (None, "3.4.7", 3, 4, 7), - ("9.65", None, 9, 65, 0), - ("9.65", "3", 9, 65, 0), - ("9.65", "3.4", 9, 65, 0), - ("9.65", "3.4.7", 9, 65, 0), - ("9.65.beta", None, 9, 65, "beta"), - ("9.65.B", "3", 9, 65, "B"), - ("9.65.beta", "3.4", 9, 65, "beta"), - ] - - base = dict() - - for test in tests: - # logging.debug("Test:{}".format(test)) - source = test[0] - source_default = test[1] - expect_major = test[2] - expect_minor = test[3] - expect_patch = test[4] - - if SETS_NAME_MAJOR in base: - base.pop(SETS_NAME_MAJOR) - - if SETS_NAME_MINOR in base: - base.pop(SETS_NAME_MINOR) - - if SETS_NAME_PATCH in base: - base.pop(SETS_NAME_PATCH) - - self.assertFalse(SETS_NAME_MAJOR in base) - self.assertFalse(SETS_NAME_MINOR in base) - self.assertFalse(SETS_NAME_PATCH in base) - - if expect_major == TypeError: - with self.assertRaises(TypeError): - split_version_save_to_dict(source, base) - - else: - if source_default is None: - split_version_save_to_dict(source, base) - else: - split_version_save_to_dict(source, base, source_default) - - self.assertEqual(base[SETS_NAME_MAJOR], expect_major) - self.assertEqual(base[SETS_NAME_MINOR], expect_minor) - self.assertEqual(base[SETS_NAME_PATCH], expect_patch) - - base = dict() - base["fw_info"] = dict() - - for test in tests: - # logging.debug("Test:{}".format(test)) - source = test[0] - source_default = test[1] - expect_major = test[2] - expect_minor = test[3] - expect_patch = test[4] - - if SETS_NAME_MAJOR in base["fw_info"]: - base["fw_info"].pop(SETS_NAME_MAJOR) - - if SETS_NAME_MINOR in base["fw_info"]: - base["fw_info"].pop(SETS_NAME_MINOR) - - if SETS_NAME_PATCH in base["fw_info"]: - base["fw_info"].pop(SETS_NAME_PATCH) - - self.assertFalse(SETS_NAME_MAJOR in base["fw_info"]) - self.assertFalse(SETS_NAME_MINOR in base["fw_info"]) - self.assertFalse(SETS_NAME_PATCH in base["fw_info"]) - - if expect_major == TypeError: - with self.assertRaises(TypeError): - split_version_save_to_dict(source, base, section="fw_info") - - else: - if source_default is None: - split_version_save_to_dict(source, base, section="fw_info") - else: - split_version_save_to_dict(source, base, source_default, section="fw_info") - - self.assertEqual(base["fw_info"][SETS_NAME_MAJOR], expect_major) - self.assertEqual(base["fw_info"][SETS_NAME_MINOR], expect_minor) - self.assertEqual(base["fw_info"][SETS_NAME_PATCH], expect_patch) - - return - - def test_sets_version_str(self): - """ - :return: - """ - from cp_lib.split_version import split_version_save_to_dict, sets_version_to_str - - tests = [ - (None, None, None), - (None, "3", "3.0.0"), - (None, "3.4", "3.4.0"), - (None, "3.4.7", "3.4.7"), - ("9.65", None, "9.65.0"), - ("9.65", "3", "9.65.0"), - ("9.65", "3.4", "9.65.0"), - ("9.65", "3.4.7", "9.65.0"), - ("9.65.beta", None, "9.65.beta"), - ("9.65.B", "3", "9.65.B"), - ("9.65.beta", "3.4", "9.65.beta"), - ] - - base = dict() - - for test in tests: - # logging.debug("Test:{}".format(test)) - source = test[0] - source_default = test[1] - expect = test[2] - - if source_default is None: - split_version_save_to_dict(source, base) - else: - split_version_save_to_dict(source, base, source_default) - - result = sets_version_to_str(base) - self.assertEqual(result, expect) - - base = dict() - base["fw_info"] = dict() - - for test in tests: - # logging.debug("Test:{}".format(test)) - source = test[0] - source_default = test[1] - expect = test[2] - - if source_default is None: - split_version_save_to_dict(source, base, section="fw_info") - else: - split_version_save_to_dict(source, base, source_default, section="fw_info") - - result = sets_version_to_str(base, section="fw_info") - self.assertEqual(result, expect) - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_status_tree_data.py b/test/test_status_tree_data.py deleted file mode 100644 index 873a1f9f..00000000 --- a/test/test_status_tree_data.py +++ /dev/null @@ -1,61 +0,0 @@ -# Test the cp_lib.status_tree_data module - -import logging -import unittest -import uuid - -from cp_lib.app_base import CradlepointAppBase -from cp_lib.status_tree_data import StatusTreeData - -# set to None to get random one -USE_UUID = "ae151650-4ce9-4337-ab6b-a16f886be569" - - -class TestStatusTreeData(unittest.TestCase): - - def test_startup(self): - """ - :return: - """ - global USE_UUID - - print() # move past the '.' - - app_base = CradlepointAppBase("simple.do_it") - if USE_UUID is None: - USE_UUID = str(uuid.uuid4()) - - app_base.logger.debug("UUID:{}".format(USE_UUID)) - - obj = StatusTreeData(app_base) - try: - obj.set_uuid(USE_UUID) - - except ValueError: - app_base.logger.error("No APPS installed") - raise - - obj.clear_data() - # if True: - # return - - # if this is a FRESH system, then first get will be NULL/NONE - result = obj.get_data() - self.assertEqual(obj.data, dict()) - - result = obj.put_data(force=True) - app_base.logger.debug("data:{}".format(result)) - self.assertEqual(obj.clean, True) - - obj.set_data_value('health', 100.0) - self.assertEqual(obj.clean, False) - - result = obj.put_data(force=True) - app_base.logger.debug("data:{}".format(result)) - - return - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_target.py b/test/test_target.py deleted file mode 100644 index 80a389d9..00000000 --- a/test/test_target.py +++ /dev/null @@ -1,125 +0,0 @@ -# Test the TARGET tool - -import unittest -import logging -# noinspection PyUnresolvedReferences -import shutil - - -class TestTarget(unittest.TestCase): - - def test_load_ini(self): - from tools.target import TheTarget - - print("") - - data = [ - "; think of these as 'flavors' to apply to the settings.ini", "", - "[AER3100]", "; user_name=admin", "interface=ENet USB-1", "local_ip=192.168.30.1", "password=lin805", - "", "[AER2100]", "local_ip=192.168.21.1", "password=4416ec79", - "", "[AER1600]", "local_ip=192.168.16.1", "password=441ec8f9", "" - ] - - expect = { - "AER3100": {"interface": "ENet USB-1", "local_ip": "192.168.30.1", "password": "lin805"}, - "AER2100": {"local_ip": "192.168.21.1", "password": "4416ec79"}, - "AER1600": {"local_ip": "192.168.16.1", "password": "441ec8f9"}, - } - - file_name = "test/tmp_target.ini" - - # write the TARGET.INI to load - _han = open(file_name, 'w') - for line in data: - _han.write(line + "\n") - _han.close() - - target = TheTarget() - result = target.load_target_ini(file_name) - - logging.debug("result:{}".format(result)) - self.assertEqual(expect, result) - - return - - def test_find_interface_ip(self): - import ipaddress - from tools.target import TheTarget - - print("") - - report = [ - "", - "Configuration for interface \"ENet MB\"", - " IP Address: 192.168.0.10", - " Subnet Prefix: 192.168.0.0/24 (mask 255.255.255.0)", - " Default Gateway: 192.168.0.1", - "", - "Configuration for interface \"ENet USB-1\"", - " IP Address: 192.168.30.6", - " Subnet Prefix: 192.168.30.0/24 (mask 255.255.255.0)", - "" - "Configuration for interface \"ENet Virtual\"", - " Subnet Prefix: 192.168.30.0/24 (mask 255.255.255.0)", - "" - ] - - target = TheTarget() - - interface = "ENet MB" - expect = ipaddress.IPv4Address("192.168.0.10") - result, network = target.get_interface_ip_info(interface, report) - self.assertEqual(expect, result) - - interface = "ENet USB-1" - expect = ipaddress.IPv4Address("192.168.30.6") - result, network = target.get_interface_ip_info(interface, report) - self.assertEqual(expect, result) - - interface = "Other Port" - expect = None - result, network = target.get_interface_ip_info(interface, report) - self.assertEqual(expect, result) - - interface = "ENet Virtual" - expect = None - result, network = target.get_interface_ip_info(interface, report) - self.assertEqual(expect, result) - - return - - def test_ip_hacking(self): - from tools.target import TheTarget - - print("") - - tests = [ - {"src": "192.168.30.6", "exp": "192.168.30.6"}, - {"src": "192.168.30.0/24", "exp": "192.168.30.0"}, - {"src": "192.168.30.6:8080", "exp": "192.168.30.6"}, - ] - - target = TheTarget() - - for test in tests: - logging.debug("Test:{}".format(test)) - result = target.trim_ip_to_4(test["src"]) - self.assertEqual(test["exp"], result) - - return - - def test_whoami(self): - from tools.target import TheTarget - - print("") - - result = TheTarget.get_whoami() - logging.debug("WhoAmI:[{}]".format(result)) - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/test/test_time_until.py b/test/test_time_until.py deleted file mode 100644 index fe94dace..00000000 --- a/test/test_time_until.py +++ /dev/null @@ -1,33 +0,0 @@ -# Test the cp_lib.app_base module - -import logging -import time -import unittest - -import cp_lib.time_until as time_until - - -class TestTimeUntil(unittest.TestCase): - - def test_seconds_until_next_minute(self): - """ - :return: - """ - - print() # move past the '.' - - now = time.time() - logging.debug("Now = {} sec".format(time.asctime())) - - result = time_until.seconds_until_next_minute(now) - logging.debug("Result = {} sec".format(result)) - - # self.assertTrue(os.path.exists(expect)) - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() diff --git a/tools/RouterSDKDemo.py b/tools/RouterSDKDemo.py deleted file mode 100644 index c3cbc3e7..00000000 --- a/tools/RouterSDKDemo.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Router SDK Demo Application.""" - -import json -import subprocess -import time - - -class CSClient(object): - """A wrapper class for the csclient executable.""" - - def get(self, path): - """Formulate a get command for the csclient executable.""" - cmd = "csclient -m get -b {}".format(path) - return self.dispatch(cmd) - - def put(self, path, data): - """Formulate a put command for the csclient executable.""" - data = json.dumps(data).replace(' ', '') - cmd = "csclient -m put -b {} -v {}".format(path, data) - return self.dispatch(cmd) - - def append(self, path, data): - """Formulate an append command for the csclient executable.""" - data = json.dumps(data).replace(' ', '') - cmd = "csclient -m append -b {} -v {}".format(path, data) - return self.dispatch(cmd) - - def delete(self, path, data): - """Formulate a delete command for the csclient executable.""" - data = json.dumps(data).replace(' ', '') - cmd = "csclient -m delete -b {} -v {}".format(path, data) - return self.dispatch(cmd) - - def dispatch(self, cmd): - """Dispatch the csclient executable command via the shell.""" - result, err = subprocess.Popen(cmd.split(' '), - stdout=subprocess.PIPE).communicate() - return result.decode() - - -class GPIO(object): - """A class that represents a GPIO pin.""" - - LOW = 0 - HIGH = 1 - - def __init__(self, client, name, initial_state=LOW): - """GPIO class initialization.""" - self.client = client - self.name = name - self.state = initial_state - self.set(self.state) - - def get(self): - """Request and return the state of the GPIO pin.""" - self.state = self.client.get('/status/gpio/%s' % self.name) - return self.state - - def set(self, state): - """Set the state of the GPIO pin.""" - self.state = state - self.client.put('/control/gpio', {self.name: self.state}) - - def toggle(self): - """Toggle the state of the GPIO pin.""" - self.set(self.LOW if self.state else self.HIGH) - return self.state - - -def run(): - """Application entry point.""" - client = CSClient() - led = GPIO(client, "LED_USB1_G") - - while True: - time.sleep(.5) - led.toggle() - - -if __name__ == '__main__': - run() diff --git a/tools/RouterSDKDemo.tar.gz b/tools/RouterSDKDemo.tar.gz deleted file mode 100644 index d83950c17b5046361424c80b1717eb41f55a00cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 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
X5IMCv{Q^A6jN-(` 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 z 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 RXDr{994lC}m-HTa0{{ePX<7gP literal 0 HcmV?d00001 diff --git a/tools/bin/pscp_license.txt b/tools/bin/pscp_license.txt new file mode 100644 index 00000000..64e0dcba --- /dev/null +++ b/tools/bin/pscp_license.txt @@ -0,0 +1,7 @@ +From http://www.chiark.greenend.org.uk/~sgtatham/putty/licence.html + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/tools/syslog_server.py b/tools/bin/syslog_server.py similarity index 100% rename from tools/syslog_server.py rename to tools/bin/syslog_server.py diff --git a/gnu_apps/extensible_ui_ref_app/tools/bin/validate_application.py b/tools/bin/validate_application.py similarity index 100% rename from gnu_apps/extensible_ui_ref_app/tools/bin/validate_application.py rename to tools/bin/validate_application.py diff --git a/tools/convert_eol.py b/tools/convert_eol.py deleted file mode 100644 index 696315f2..00000000 --- a/tools/convert_eol.py +++ /dev/null @@ -1,50 +0,0 @@ -import os - - -def convert_eol_linux(base_directory): - """ - Given a sub-directory, walk it and convert EOL in all "text" files - - :param str base_directory: - :return: - """ - if not os.path.isdir(base_directory): - raise FileNotFoundError("dir {} doesn't exist".format(base_directory)) - - for path_name, dir_name, file_name in os.walk(base_directory): - for name in file_name: - # see about converting the file's EOL - if name.endswith(".py"): - pass - elif name.endswith(".ini"): - pass - elif name.endswith(".json"): - pass - elif name.endswith(".sh"): - pass - else: - print("Pass name:[{}]".format(name)) - continue - - # read in all the old lines as binary - full_path_file = os.path.join(path_name, name) - print("read in file:[{}]".format(full_path_file)) - - lines = [] - file_han = open(full_path_file, "rb") - for line in file_han: - lines.append(line.rstrip()) - file_han.close() - - print("write out file:[{}]".format(full_path_file)) - file_han = open(full_path_file, "wb") - for line in lines: - file_han.write(line + b'\n') - file_han.close() - - return True - -if __name__ == '__main__': - import sys - - convert_eol_linux(sys.argv[1]) diff --git a/tools/copy_file_nl.py b/tools/copy_file_nl.py deleted file mode 100644 index 89f119f1..00000000 --- a/tools/copy_file_nl.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging -import os - - -def copy_file_nl(source_name, destination_name, discard_empty=False): - """ - Mimic "shutil.copyfile(src_name, dst_name)", however if the file ends in .py, .ini, .json, or .sh, then - make sure EOL is LINUX style "\n" - - :param str source_name: the source file name - :param str destination_name: the destination FILE name (cannot be the sub-directory!) - :param bool discard_empty: if T, we skip copying an empty file. - :return: - """ - # logging.debug("copy file {0} to {1}".format(source_name, destination_name)) - if not os.path.isfile(source_name): - # the source file is missing - raise FileNotFoundError - - # first, see if we should SKIP this file - if discard_empty: - stat_data = os.stat(source_name) - if stat_data.st_size <= 0: - logging.debug("Skip Source({}) because is empty".format(source_name)) - return - - # logging.debug("read in file:[{}]".format(source_name)) - lines = [] - file_han = open(source_name, "rb") - for line in file_han: - lines.append(line) - file_han.close() - - if source_name.endswith(".py") or source_name.endswith(".ini") or source_name.endswith(".json") or \ - source_name.endswith(".sh"): - # then we make sure line ends in - clear_eol = True - else: - clear_eol = False - - # logging.debug("write out file:[{}]".format(destination_name)) - file_han = open(destination_name, "wb") - for line in lines: - if clear_eol: - # this is text file, force to be Linux style '\n' - file_han.write(line.rstrip() + b'\n') - else: # else write as is, with 'line' being an unknown quantity - file_han.write(line) - file_han.close() - - return diff --git a/tools/curl.exe b/tools/curl.exe deleted file mode 100644 index 7ec89f0c275bc3a1287b6b6f7b51c4e68279b548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535552 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ℜ5lelYC;rKoFNfJ=m0U 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") - - def b85decode(b): - _b85dec = [None] * 256 - for i, c in enumerate(iterbytes(_b85alphabet)): - _b85dec[c] = i - - padding = (-len(b)) % 5 - b = b + b'~' * padding - out = [] - packI = struct.Struct('!I').pack - for i in range(0, len(b), 5): - chunk = b[i:i + 5] - acc = 0 - try: - for c in iterbytes(chunk): - acc = acc * 85 + _b85dec[c] - except TypeError: - for j, c in enumerate(iterbytes(chunk)): - if _b85dec[c] is None: - raise ValueError( - 'bad base85 character at position %d' % (i + j) - ) - raise - try: - out.append(packI(acc)) - except struct.error: - raise ValueError('base85 overflow in hunk starting at byte %d' - % i) - - result = b''.join(out) - if padding: - result = result[:-padding] - return result - - -def bootstrap(tmpdir=None): - # Import pip so we can use it to install pip and maybe setuptools too - import pip - from pip.commands.install import InstallCommand - from pip.req import InstallRequirement - - # Wrapper to provide default certificate with the lowest priority - class CertInstallCommand(InstallCommand): - def parse_args(self, args): - # If cert isn't specified in config or environment, we provide our - # own certificate through defaults. - # This allows user to specify custom cert anywhere one likes: - # config, environment variable or argv. - if not self.parser.get_default_values().cert: - self.parser.defaults["cert"] = cert_path # calculated below - return super(CertInstallCommand, self).parse_args(args) - - pip.commands_dict["install"] = CertInstallCommand - - implicit_pip = True - implicit_setuptools = True - implicit_wheel = True - - # Check if the user has requested us not to install setuptools - if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): - args = [x for x in sys.argv[1:] if x != "--no-setuptools"] - implicit_setuptools = False - else: - args = sys.argv[1:] - - # Check if the user has requested us not to install wheel - if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): - args = [x for x in args if x != "--no-wheel"] - implicit_wheel = False - - # We only want to implicitly install setuptools and wheel if they don't - # already exist on the target platform. - if implicit_setuptools: - try: - import setuptools # noqa - implicit_setuptools = False - except ImportError: - pass - if implicit_wheel: - try: - import wheel # noqa - implicit_wheel = False - except ImportError: - pass - - # We want to support people passing things like 'pip<8' to get-pip.py which - # will let them install a specific version. However because of the dreaded - # DoubleRequirement error if any of the args look like they might be a - # specific for one of our packages, then we'll turn off the implicit - # install of them. - for arg in args: - try: - req = InstallRequirement.from_line(arg) - except: - continue - - if implicit_pip and req.name == "pip": - implicit_pip = False - elif implicit_setuptools and req.name == "setuptools": - implicit_setuptools = False - elif implicit_wheel and req.name == "wheel": - implicit_wheel = False - - # Add any implicit installations to the end of our args - if implicit_pip: - args += ["pip"] - if implicit_setuptools: - args += ["setuptools"] - if implicit_wheel: - args += ["wheel"] - - delete_tmpdir = False - try: - # Create a temporary directory to act as a working directory if we were - # not given one. - if tmpdir is None: - tmpdir = tempfile.mkdtemp() - delete_tmpdir = True - - # We need to extract the SSL certificates from requests so that they - # can be passed to --cert - cert_path = os.path.join(tmpdir, "cacert.pem") - with open(cert_path, "wb") as cert: - cert.write(pkgutil.get_data("pip._vendor.requests", "cacert.pem")) - - # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI - sys.exit(pip.main(["install", "--upgrade"] + args)) - finally: - # Remove our temporary directory - if delete_tmpdir and tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -def main(): - tmpdir = None - try: - # Create a temporary working directory - tmpdir = tempfile.mkdtemp() - - # Unpack the zipfile into the temporary directory - pip_zip = os.path.join(tmpdir, "pip.zip") - with open(pip_zip, "wb") as fp: - fp.write(b85decode(DATA.replace(b"\n", b""))) - - # Add the zipfile to sys.path so that we can import it - sys.path.insert(0, pip_zip) - - # Run the bootstrap - bootstrap(tmpdir=tmpdir) - finally: - # Clean up our temporary working directory - if tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -DATA = b""" -P)h>@6aWAK2mly|Wk_|XSV~_F001E<000jF003}la4%n9X>MtBUtcb8d7WDSZ`-yK|J{ED>nxD8%G$E -w;SJgIu%S({0^J&P#wbpYJnS!bH_kszWzd@` -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 -30hkj$wWjrOtA -Xau56ATIF8`(_C$-`o2_VB5OR#m+BGKe2c9MY=16Jf?%AaG#HsA3+?!HaoppZ=|rq67N -VU>(N|y{G{1GnR>M@H0boJ^lt7w?<(!mv!&lSJ-fH_}obsT1A=|4^=>(ch_SmV^ncuGS_pOaTK_VMi9 -qCW^>(va`c^9q^5Isnniv*_Bif&xgSEBLnMzOeIn(al@BhO4IA6f_tMM^h-vFh5p+#Dc9BpY0eW(}fp -B>J|t*z*jRn`X15 -3oTFM;>W5OH1bYLMF1yatXLJ9SO(vaNroZgF^F;J4)FvZnS42PXgxBfo9aw`XE>cTtj0ufIed{a7qC| -v|-k#DibxbLg&Kig?Amx%%X404m}*1G4wF3=8{*CNRc~QTskt09}P}MWfd?A51eeN+K0#^Pzbv!2rlc -NctB}_^P=~kfBkg(bMfi+A0Lz1!NOTZ91M$!9a?}Ni%=nKWiK(EqRntnMvlw^N7|muMC|IwD;9^*m@b -?vp>0^m1t`R+3$eF5&j9Pk9%%F -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 -snXJ*^+0I{erg=qq;VT~+xQxF -;%IrFGd?nTNq#M3NkYS<2XLe4?gWFY1c%vVa;=8Ya(j)^)DF~v4&7`HpQaT? -)M=X_I6KUX=*1@t~VUNO6~o!e3)&alD^EiI;?gS1rdExva*ax}v*i(d<>uemw5r+S&urkrr^rT% -QVorTf%&eu;}wF}2Z$DkJ6Qh6tH-jaWDYjGWz{8v9o}+@buYw~S3xJCk`NV5ix>e0urT9aT=cSvNz*D_a^0Y9uDhgmlB#U)*mTS0!S`41aMc9{49OHh)!gc -M`75? -`?uCTW$AqQI7?WIrYtDbSwii&f5jzM^IwQJxSkK9$55>hhp(YTz`_-0CaXp*H)-($aL2N-<#C&7Fcei4|ou^(jR2c^Lt#ZtekQ6m2k>$y=N35*Ai)+lL -C9@2Z+>4@~!7;*@?Idb3pA}JT>B#eQAZ=RS0eLa)Wrm8fK|0zs2G2P2if~--QOhHi7Vse{AB2z6HbM^jJp -FkriV_lhRiQacPj(U>|c2zos|=w3I5SIJS0|83|j^ou<<3l3Z=1QY-O00;mWhh<1P_M~kwBLD#EdjJ3r0001RX>c!OZ+C8NZ((FEaCz-L{d -3zkmcRS2z$%jw)yj;M?e5IEe|aWmeU(%5UR!buCrg)!y}+DsX+$CQ@FUBiLAr&hHmfO-Z{Raa=U43}$#TFaRaewFk+->O)Ks+P2 -3{w)ggXH|ef#Xi=?~A7=RduB{_5=X^{ca~n8Uo=HJ~tu87HcpZR%<+m6`-IiDfyjGGIT;-fdGQnS_Tj -Y>G$#YXM7{#`Be&YlN$tQr2M)&Dy4UUS_gv5_lRmRI+I|O;r^tnYDS5nI31)-@SkH?)B@JXUW-%)9=G ->ZEhNV3*#46n!Ty3WexNEV+zy^AD(UU(!;W-=BdXbH#ICLOuvxu&pNHIWKFd1x?Im~WBA%*-+)_T1%a -RYOm1GsX_jspSzDNYOqG1f&wxAMy?dj7>;us@E7Sccd`A%67ry0le6**x&+E@#zXBe5mpps%{?(t8v( -tZnJ{51J+5m|LwyFi9n!25%nCt)n60qN7sq!Yjmfz;{W>0_Q@pRes<_-Saevf&IELW9HT@~F>@a!2s+ -et0ABmc02eFy7HF#5fKKdx~3P1Bd~n>4F4psA907_Pugklo8E?9(t5rEQWIe6%c29gG%51(D(K({7Bd*Yz{cIL?&VO|Rnu%Np8N= -ZUBFy%-^&`Nss%s{6Mjk0q9iHPHK@}GG|S{dv9rW0}KWY@kg -_g)KyT|*z1_3O$uXwut<+`mi)3F9g7bmL;${wVEIN(QOb2LHXTWh#HfR2duysG{y69oQrdYd?8Lw#Q518f;v97PgMI50s&A+5EO;HmIZZOqUb -c^P?QodeHCw-dAm#4YH({@@*^pGMk$3s?1lcvfMDMv6ayG*$lx%Y9l`Wslqbhww5xfL6}5g56y=>Lzb -i(FkN+dpnvqY!8-HjfPs5l5ZkCSw~jD*E}0tOgltr*o4N)XDx -4FX9rIv_A6+%`QL{PKyZ=q(U{GVTDt}Z%3%|KXE22b?wrVvU)(O-Am~KP$Zx0Uat7(7_va6Z~J -d5wPV6{x8nj^+rYXRwxOsXxdb@I*CS8*?=7^aPw9zIEdv|$n{KS8Ni#@5?#7HEjszG+n?w$WBwi2(zHkRS(}MvLqFT^b|pB-0(3Ee{DEN25jAVcQ)^NQy1CcdC)qg+(2+Z((a50>{hr_+@>c9=(}4U1|7BHGSIEUHm>u|%UmZOL`0P{rtX -s<^XgctRutzj9jYd&oY1|K1YJWb3)E&RzWCzmCasrh;u>i`!hFgCwo?jgkXS)5xs$7+qAI2Tn52sXcjcBN-)?Yesh8Y9|y~zC#N|pC$`}-R;fd?oE!K21PrC4yO>3+Jd -4PRCT^Y&k`Gya*ozH;tuMvx)D`d;}ktkc63iITMb3g97-8Gn-3OR59&Xx(;H*MVUWjqEiA&STtyaBf+x-d%|#LmYQ;4%9a^QJ4d4Qy2T(_fq}Mhy4i4ZwdqSO)4CH~eI>&ZO -mnmsQvg!}H6Op~YccKO51SuH7hZdWc1+MrPamFxvuO}(fX4)INM@Lptj@!^cZ%MclrJl=;J!Q4LCnaB -1-tenk>A>QxM))hk;!y@!Z4eBEkTa!UtlQbi>>}Km$iQGPY;COZ7vnP@~p;YrDcy3iH!8Hfr!)GV#3A -I#NQFFtUnP?j*k4-Y_>U&JHR$`Wj+WBt=~!!)X1ROji|F%ug@r2i#a2B5(@SnQePc?)o%hj8D2s6J)x -y_mF0_^G=h`+(;f*p88RZ2VYpUGRIC%lQS$=t28WwHpv -L-kjLjoWvGJ*xOUQm;l7d08h1KE~ISYbaO!V0meiF5_Js|!@hQ40ckLan2Fi8vy$d*U86>qw{qT+UyM -O|ak>zBLop1Z4P{FmP-vv)MZx(=0tR{o!E|V~pk4}WxX4ipmKt{gN#J4!9uJrEV0|P#o7o1m5u9)sxc}F(eIyH)XDo$V1mq{2)0GBW)Jp_ycX8j -g?r9zf-$u7R+&Kw(=r${H3r5#-YcxDqrWAbx_x&nThQ$TgeraBi?c%dp_`Fs&TGJS4Rinq#=H-p!THH -=ww^$)t}>Yt0gd(pY(HTfz>V<`i_xr|6s+M~{6xhhEqsr -jCF$dI95S&)>dFUcG+xd>k}N6Ktof7Sag5$v0<`RB~i1cJu>-oOU^T`s?0?C~#2?4k!TNSMjFWU<8z& -f`@(7u?usy-;kb-blkjSaZTA|RjDR~?Z1S+=WgVm*}0qfCt1Zh@{1+`Md+SljmoZ&4u^KxM?0s8-XXQ -8e3@GvvttB|0pUL2N;Vz)t<7kP(f3EA0Qkvp2Fo|^YYEOP4Wmo4;cTcow!tgy8MSSUXIjY&{XG^ -}Z8=RFm_JNhjP7eNJJSQ;w8FV5#AgVr)FRp$eJ2aYa0J^V(zrubthD7skWvT8`2)h+CJO6RC*je&Nsb -KODV1@MBb(;|QcGOt4eYd>>fCxDcKyat?da-j%>s$dbuuw2VZq{wzC+yZDduW{qkM#oAPRXvvlI7lbw -fY?Q!NEr^R)+w^Yx&l87mj{bn;a~V7n;Y~B7AXkq%*KmFk33bKF&l4c^pa88t=F&)alZ8=54I_Ekqa*Y -0X$p@qcC>bMuI_M5K9%o8=$0~dFT!1gMV}VNDWIw80Ri*D*I^dAVpyk2;DKQ-*fpElj#KT=D0JO+&y> -$l-O7FsOJqb=-yGntjUI}L3{Uksqe*9$4b^=fh>z@;>w{)}Z?q{9eCVFFb8`N#!7!ff9^zh6qH-^Z?X&0SvAc0olx@m1AfLf%a+qIl@8xvV5Z#X{$Ke5d6_|YTr{_RWfh?N8F -M&cGzl%K{{3Y(!eGpXtEHLiJmg@OQf*s`o>`(QN(2?G}x4CgF+*(2DHm9n33q-sb2L?eS9r7~T}lby} -Eb%=?d6DQk>LTxy8&>LzHoNfT%f(ZL$mrTGlK#RFNG>eK>pe6>b4A9)lE>?nR?P|MB$~B2{#=oO2_NG -P3%fLVx$cY8y`*8H}ku7w=K9ijkLhDN-sEx0+Y*tmKjm3Q)##2({;H~kjg|1t&MqWilxq)G!O)Iy|Nw -+uYYyHzB`M0^+;Mog5TO8)R90#Lsk(o*Eot`c>4(qNXYCH#-3VIEMq0W-%xw+Yp(P;E1*=YYkXBknD6 -Z3tI`xS#r -S)S231b_1Ws%erbe(c?)BY=@iD)jpAFOU1#39FtD$R;*{e;HP`-79Ng~_~S|7N;1KEM}zw6Yy6h!gA` -F5-hYV2BMUIJz!Fxts_zagTgO3t*Nsi!?`?Lx8V`)2R2_JL6{*f}(5 -!AZ5f%w~dYkCL$hU4m$$y6Gy~2Q`eH3ODzr#I(b7Wz8H4Y24F??_&*}t=f9H5{1xF(aDzaT)5*aAhlk -xCeG#3fhre7*{`#x!#>#_Fq2GB}}IHAQ`C8 -Vj_0^9=H{guu`v{>Hgq$V&w`wQ7c_g|8rILDB+&bulQl@a39Q=#Ju};rTsSd+;vS#5Cps0Hx -oAB~NF#IG4`PXug<+6f)F#VkaERg>HYkN8koGDxGb{wY$W(m#C#vFJ6M)l+a*^Zr17oS&NcfANXbHpu -4$V1XN25iCvZ8Te-!Xe^# -#{J@U-To6zj|TmjyZg=P6_qYq#wd6{9L8f*mEMKyZwyIf -HX*)%hdGJT|*ro&~;yf;jh5}lOC;)9hmpgik{BD_gK#Y!+&pm^j~Nu7^1phIplzVIxe=!djurOr+LS# -I?=>u*hV4s^uyrhr#wDl35}(+12Qp2!Ftg2bdUNE~#>e{^vN^mx8lVA%LtzQkjb;KF@lkJ+BS`tG&kX -056lOL}`@1I?x|fjvg$-hI4DeIuf;j>H$@@zK%IWH$&a=LiC_t_$T}{aovN7{demid76tApP5oh^S3M -7Vdo20+(Wmn!9FUa`S;W+sJv2mBXnnbT-)uuN}T1h$!xC#Ti#+_FYM01Uvrly$%$P!Y~vY=Eh?`q3H_ -P@zRYqQ-pX29ExdatWmhEk#73knifXX~g2kZAv?4 -EX){^5YSOlcn^$q}Lx^7cz#pp9b1{>KA3g~&DN(Und!}YK@cD99H1vIT3T@5FNdLve=gCihW{K9Dk>JN0*bYXN1T(;Z-hrB-gDs -GM*>c!fmuVj-o4TfrQ{;adlIb|jp_dp|M~;PD`sAqhJWLE7fB$XIT7fgv -^vo;G~yTRImdbx58yK-sj;Xvq#KBv8$M1|9CB10n-f6t!M|Y}PGKF>|QHdOd6fDKr@tBqaa#&eEz)EH -wt&B=lJExNgqCQ-Az+FxW)aSxlGgFc2T_-q?M+5gncW)6PmlwQv0J6UxuWp_|SIg0&5389fWbu^@&l- -|mFFYl$3dmCd2!y4=~U!GoA~q{B -@!-U0hwll8?m?7s{0v0&ZB3Cg_-?z^L*PASG&IS541Cn@f%bvZE|ar%8I9eBWEXMdf6T6k$-n7FfGKY -Xm|?Ju4tA5nw;4ODwSPZTkSXss2*Rm0P{A%zM+^QPbICa=1l1T!dy^R=roM7)sIhk5=GA7)v6(JM)+N -6jR~Z|+9)R`wOlv3XM8P8;N^HQ}$(qJ|ty=7mTmH87*Fp)* -Wcej?poqW)q$3KFq#DzWm2)q(19VoC2t?hfqC>a-1v_G3g-oj@{qzUIKf`CyVmE94hHqft|Aru@U@Nc -Fr}v5{4F2j(z>oNb;pO!j@m;WSKf`!z&6hAxwu|b(p>x%L?xY(VU>nX85*>m^tuVvxViSv&u@na{@v+ -qygn0W0}N>ZmEgJpU`I~u#H>CQuy7M?vE?5np2;7 -y{hW!IJBw9R^h3*5(Q8V=f#+uuK*M=#B>pV`~6^=EeX*6M*43tYmZGbg(GnD6q$4Pb;s>>PQdkW1DXQ -yQFxq3AHfmgC%9?#Kg4B0b+G%b^rm&U0;2JJ%XU&RXV|OQ5(7|m<$)k?5=_TJ(8yOx5gu9mk*)QA&ME7Vkde7W|-8pk>m!9!I4d?`92K)C -q&vf9X2vZ>((O+}a18GHIbij{VbBKuJk1lLKUHKU)j!vHE6lNjUkdUI9~uewrhN@f`jEdbp+AHH3}#ZMOjhjP?4=1b%8ilGwvB7qSoP|*0zVtB6PNQv6zZW{!NKjnN -#A50)|r?bb3JRG&YwTAy;4@te_L$voe1{FuvADa;;u(Dh+^3k9Oh#WV+!CWE4|Ja3^2sdInjD)Y`zIS6B)w?Y -QJL#MZI1sYo5Qyp++KFwbUN^p4U_*rIycmyj*0xgrf{9O1zti)C7X$tA3HZx2Bj`9S=LS)#l#=Uido3*v7?jyD2`XoX8b>|y4PX%hqDOiFut0;sWSXIKpgH!pA;w9#Xhxp(SO@VF`T)6R4HYwh=CEfmECa2efuPxI-Q&*MIig$l1z`f@ -*_+ti9hY|>xo9x8dl@y#;O@UX?GTb>E -|N~rL%_JSw+ZDfj2FuXz|uzI8IfKBZU_2t0M~`#o&mu((>x{57qsRLHF) -_d0}96Yr%HK%m#4PMEt%C>ZbdseAF1q}L;i&hU-ccWN%5cm;=k=!l309m&=|ul)FF@gbj(=wdcYX5Ma{YEjMIjD0@Fk+KQQol0be>>Ynm}%Pwx -x>`%wgIzML*}Q~}-7AD*4jFNcPxnBC!~Fn|4bXRxp!v=zy#m3B4`=5*1iRuf(b!?Z!&#buXdt)qn#;B -vUPKfVvl*J&49(&3B%=b&#eQ#|Hrhavpv)(tC&j`51?wQ(@TQ^8KOmf2If01IYuvqJW__X=yTnQBhS3 -GUVxMsWXll67l|b29S2aV{^c->v<8@QbMfJai9C8ZVyDJhvr|%%__TfxUAh5miwj4*=pSEVsHLW3Z~h -!Aa{J3_{KtATIAqeFj%%6N&-Qtp(U&&39EB;S! -2WX^7SN2SeT7EbW^v-|OxU=V;W9KkwA9gx? -XY?<^J@LicNpfrCtW01GR+lND5C9u*5y;Bl~rbJs^AQB0mXZ6Xxg*ad#c$V7=p=sP3-x`{eq@u8y%c>b>e3hwB&nu)2E2Pnu0w -nMjvF^BppLJ`Ld6&0+t3-j8xzhx1ug8-n5%DAMIMtGw0~iQ+}Ik&Ct{OfXy@so0iMzH{J2uy2)6?G)RM_nngyWs13pBA5@81BB4f`z2a`ROrc%) -R9(IMkpVeX|UC?*7b0wCZ|aQQM8wquHjR_vy#uY74>9EK00K+fTxk}-=p`WR@Q&Z(FNItD-c4({IH^x -tdt-)ZviG4XxP>!8iHJ$?Pn>kUc}2ED -!hsq5c;JyfuF&!LWr8r+_*ZD<+-Kl!p6^r -xq*?PCW*-12f+G(`|7Ap4m^FSSm%}DG>rVaW6ooTA?YxZ1W+;VuuR$jHL@amAXLVq_pj=7jz#mHI$aDTk*2I_5lKqSl3V(RP%d*M_d6m*s -)ow7xPs0b+hxZvr%Tc%46)&7cd~Z}aNZlFXIxjj5BaW&Nc@c7SRObGdElYq+niI52*jd)sR@C2D-WI2 -Vmwe(*<1Eri~dQ5u8?I99q{A)VTFU>S$|Bo@qYnOO9KQH0000802qg5Nai)y_>c+!04yH>01*HH0B~t -=FJ*XRWpH$9Z*FrgaCy~PO>^5g621FZpgfh5R3&qEG9L$R<=`ZC?Apo4I!^X5Go^w^NWz!|H~=YG`|J -001Efewa=f*tRaG2O0ve5n?$@uO^Yino$5fS-w#JLvt4vgDXY1A4)|Dt_`XE>8{QUfE>1-k9^JQJtPR --{+7o~NTkPC0~x>ED-d=|#(O1a9~+&9D0wbW)RRUPSAtU%#__MRKG -?(6sPrAHv&bo2y@?>@<@PdP{rB`H0sOCHJx|w-vd?oW-(&xcMV{32WoifVFd~ZNxwbN!LbZ2tc=oh2^ -7qhiFW%#Z3mD7uwKL22=Yg?Oae6WT65_eM5!EM*d2r078Y>`T1Y$X;-EXj(ftne`5mphDf>aSWmRVY( -+m%rP8?5}mMK1t_Q*xs|9ST(z*LBghK?L5NCdD?kzWiOUkL*&}1r0d0N<*Tm>6Rf$+os!uuF0Qg8D0f -${)=CuCSE4R2DtnR1N{LOdBv426x3F%ffquE{IlT#aQYyY~|dG=PjXD>DKgi@T1h0HS7X+=l3AX5l2r_##0T -|dV*GS}I^)=K3RHbxfesep;&X<3zX5YUXIpJBc(i40UQ`;@uP*kH0}=|=iBPw-FKcwgt0E)k9G@DLOx -RbDttv4IbeL)K72IpQ&_2w-?EvXZGKXi^(p&F5pU@@2G6FM3S){JeN2e*0rTLzX4@kH=5L2_K)9#DQT -*cSYp<;er$zaj9d*JbWKNsNJhv7K=;@H4`eaE>kewjHg|uxsP7?xn0gv;&s!I`M6_oD!P{DbH;u??|9 -UD)$9buk~LCra%6~lta!7@!e+bignd!8bkCRlOuY;f`^!0nl4Zo`cQZ=b5li4f -OSY!uf&@lwN^K0XDsILH5`q!927DnCkb>UViegJYDDm~p=hjB1D1?+rHGK_iGKG?})zvx?mpQz7fB_# -FGo&gkIXG_zi9z)yyYfWkl~^_>p)KxuxU#oJ;Pv%R*!7h5y|IQ-Rz -F>S-_=7`JQcV4Ww<^$_(g#KWjY(SP3I2EVTKufVwFN -2)LhEc;dW+{k`n%Z*&v3BwZU8q=Uu9MSQx5doFCI7~Zfg8b9i7ZBzue1vmcQ7X3I)!aAa$W>II*o -iFw=ulG9OUhhk_A&!COr-WNUIO2?XiVwcg;Hfi0O*+m_S8WzY>-7G*Qbjc|fEik+?9VcY8ItARc0o0# -QfQF3`n#Q1he25_Dk_k!qjsH`5~Hv~%>_H0U%RG>`_!%Tuy=P7AIrwy~HUsArrX6$%P=~fRgWu -y|}OO@&+MGDbA*BlUB?COBJY(}JPDi-O(it}T?;@qCBE;zz|EEYr`T)_k74`?s0=o_E7PP}?W4HQv(X -362%=%BiSSkv_}DER;G6>Z48AbMnuRyC>$wh);kw0iNNSw9EPq<0NxHlcCQ^abPXwuY5oUK$qk2isiuKF-&&szn_DCz^7M!8Vl!;L|+*PPQ&{d2m%x%zx1K3%@~$K|`L&*JSz@!{jWcz=2 -S=0@Nk-22m8ccVGLGO20W>( -WBQ0rJ?@~Rryfq{nI7B&$_dITYIEM{x)TXnY8tJY72m-y*2%gc=+XEL)^Y^JLCOuMx8Mf^ecgS1Wi(` -cX*_uI<646i1*p-Z0Pw_GtsZ*%b$ONq)#*T+&@pk05169<&Qu8{MHIL7|zcG}JDRX3pYYF48q~@n+8yzA6e>07(D^p>5KQ^BE -8xmgQSV6WiV(QY)|0UWO6!|_V@OU^T!sAKM0I^Q#;{9w^dmA^fE1FbkI(~fq??Y0}oqRnsYcHli?2r{ -{c`-0|XQR000O87>8v@`+$Laq9*_VN09&k3;+NCaA|NaX>Md?crI{x#eMsi+ctLa@AFq6a=oI~67897 -+U+!x)ODQ3=kt1fJa*Ea$yA3DA&EN_sgRUslzsf|-+cfeUet^mZ>!zoa7f?+xVX44TwIJsqj&YbD=OK -FMwVG8bJ5k}?cwdKsVJ&k-pO_}8l9|~dMoDh)xO&|ay}Quc2_r@$QEr~?mIc>zfVro`?6lIi)yX^T&@ -d-u&m2cF1wsYw8^!=`a=Tt^|DDbyHE*%{D8GU*sHzKBeN%-@W+$)ekS{FaPuX%Qu&={`lr{ -DlR{~ef!6E?_Yjvzdf0F&8E5BHFBBZTnlQ`7;RrR*m{mYMx)2Z|J^qG3?LsJA{1`Cu`b#r*z7nFB -PxpPQ^hx~2Pc1^L^cOhZ!vgJ*NC{I5!mIA`2hq?NC41hz1%dD!aV#$Ptcnxdno -<(N#^78e|rm35glau)zCJQ*pg}54jhosxRsH?82%kfl9l>7wY;^6>QZ=jL$v|6WW8S~9|q?Pw}SzvX`>Q}u!VE^9y>_9FK2^z5 -J0XZXLTzmI)BKR48D^~!$Y>TV;Ourk*pIo81RV-+6AcCsx%NO}L6RIg+7gNeBlN+4mb@iYxer@{bC(DK|u4;Q -w2hRUPWUunw0SA+z={FL(?f89KS#R0YU40V@@_NqvJ_4LlPJ4RR_L2Z2fne%#?30VB7Ii)@EFTvGrtK --^R}ZK}IC$UU*!b1JJ;bJRoN8G2UVk~9U44U~B3vTQHD%gRLgYxXUw87PL@3zQkemzSV<&Ozss -sF^Jf+|D2nXaM<-s?JOc2!-S~y|gA6hV%k(0prZv$w~VeJ_icRwjQ8!@mx5Xf#BH$c}%h{6(3qQS5yV -3pFkQ&?rd$4Ft7K`QkppuPsO6BvgXjg0Y$AsSna;-P>1!w5z=`k`x(=-W-SDT9i%4gr$_5q0s7Z_uvb -VEN&@7LTne6meFNZtY)(n%D;gLxQ2cG(HK5}fIxVXc -Lgc8dq5WA-dH!eRvuETs$RUg1l?FRKy2lKW>PjExjQrJda>Sg(0LrN6n}z+0Nu2}EC2_2+4m1fwmNhh -L_XmG9|#kf_*~Tr_Rq~eVLldsOm*Cq;P#yr -+ZHfg_#%Q7;M1bQ@16QR&MZ}^N;9kzs+efl+Ur6Bdfczf7wL2afg%XS;Z -v+V(kQ{QRMb0;F*P~(yMi6};wx(o~=!t}9-)m(^bg|_S{p3-YxK!-=R*uV(84gPS8)MjKrI1y&Ajd?96aM4#cW-b8fVb?*3`7z%3?#0!0}B=)rvQ{eQvjsrHcHh}-ih;I&NZ_ -!ezbJC0dh>dg*o-tbA%(1b(O+Wt`sPD#m#NHl-|Z%;2TU*pobl^{=8TWCwMt@C|}l3u(8#?LYwk$nVK_Ax6;oZmEFC`1tc7Q -nb}dQ~sW^MFp3+UL*BBlzEUum1B7FVCUZ(7kq3@5>zN4Fub|tQR1P$$^1iNn&#epri8OKmq;@!VZXCV -GIR+i>eZ0Luo~f(sn18#R`cLJ~=Rgb@wqV_cGR5P$larE)Lb5u7MU{F1NCsllvtpQkk;Ef9((!sZ>YS -x=U4>!xBA3)T?iMhVq(vtiU1%25XpQiS~X1iJ?w%TL5QR#7Jt?u=^89CKK!*7mBN;qfm8@`cOUn%>FA -XC_$EYTJp9^^86d<4qdTiBdIqb+PXnMt6Ct5d76TTwS%F}K|5nL-&NVo^CkQ9^$II0pcisGwIh*a&2j -_URXZUpjgYN?Ji=$T*$k8n=&5LswvaSikr0F_R+vParSGmHrL+lGMcC~-B1-&9+z+4E(5H&^QB-}n)A -+%)y4v2Wgt#J9kuHV*c-#=dU)T;{F63)*W-lUL?~zpTIU#p3I5)NRnp5hqv0m@^8b4CsP>!`2z>3lpn@iFAKf}ZUjOgJLH -LR^5T4g-YXa~x4_CGEx!hp4)sF;TRzT4K~;mF<^RyolAb1`DE~?CEZ>7EU3^^exUIR7Lu|r#t%BQ?_p -MPc -Q~qQ8UtO8`N76u$k5$mTEi(O}>kdr2-Al_CRX4AxpCxc~Gj+GU89Pg~)gNirqhZ%U@E9d&H-9pFx2tIU9ww)@aisCP3^L38Rx ->yfHTd*Mwkk$qYqxQIRZr>QWLrQDdU_4zDSz!@5PSBi``E>pE7IcJk$3k<`iv)`rKqo$Pr^YKmHNm@# -`87b>+!JuIRT)WCG?Jr;O3? --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 -xy?n8NTzW~5+C)&j2g2k|nz*-d;! -`;fz%df^pCJyk_d(NdQgo!5?!Ld~RDa@tA=-0b?a(`Z45 -s}egCywob^pQEE5J*PvSqjNDbtR<4VmWsZ>3&>_F13K2&W_L4K5EuXS>{+DFUyp`Ez;II19#B=EV*=Z -Kn}jP0qiBuD*0M!pi~6JFy4WF|gTC8iU()vn4+eE;(Kx8_PXJYS6`rvh-4`cZ15{HCgJMTQecR)4YOv&MAp9ObMTN5QsB0I -sGSBmG!ZU@~JeTXpmbQ(EY2&nSJN7g6iVMVc^0OGJHRo2`#&%Lx1JyNlH#yic%M)E7NBes3(-XAnTcL -g%=k8FbURh`>xcq+cY2OJf+)U&Kdj99xmJyzyeLR>QOxq-~>a3LibI4fPjwcN+Rpl#30@dFe?NSbZ&9 -6d3OqeU;!2nClN!db#0QUFEMs|MPU@Ni%Ix5dfbj^2XQ%hNZ+{^%7RAHzfknhyL@7 -Jf?2Ql3YbsE)@W(!axf55jp}k7ji%N2uv+VV_poMgY3Jxe^mE6C`kB(gDODYtd-0^-4?$mOY;Tf&Oi)*lv&kXl6uw_8Ql|Qgu3=QiG7?>9S)dtShQX}tr2_sZx#-o+ISt|tiSe59w_yTjDX_#$g5bkBEmEY!sz?qQKT5{GvtI!0yM!DxOMQ8G%O -KE;ZoKoZ??_co1OjV5-Gk12RHA{t>Izg58vbEE+$Mc_l`pfKE?+x{CI%_cO^>wor!BqSqyP*uFm{vtavbE&%R~}x>kO -kTpMthh)dSK1L41NrTY8n -k_q2I#Qcz+=~Mhp3-)|aA!>2A;{Y;V*L2=-&F7u{Cs{KUiaWyW5-;%)|Dm~R-f;6=<4%#eU&Jm7-PgYL09|jiSEqQum2F -P(>134!*4YmfAyMon7`%?|8n)fyEq50iF{oISCYkVg^Up;VX@ -gt*J94&7$QeOx`L*4~Do)tv1|PDfD>$+v8Ixtv=!}ABbM%peiW#~6)S>AnJ6nh%*3}2Fd=Ea%=28fjh -x|VTdpZb~QfNE`s6yv`EuCFkoZkdD4{SH;&yi_YI;A)FgLHYM5sCpaQPxLLfk{PFHbfKY?F0RFX5An? -`Nj7YR~T^ItM*87(R!yHpB_^`AN}SUid-aD|NWcm-%iHEn6%*dqjv-BycTurOgPAR{ERhx$6|^EVw~z -hg05&h-1m*vE_?s5qmYk}f2cG68;BrQ?vJ~#IZi-RJ^c&(b9VNR_@CeXp8j+8KS;JzHDBl^T9-!-7Tsr=&hkMgsK|4maMAj$q8P;%>~Ip09`#y`DQ83D$Z$aIBx&X<8v7 -6`S`E)O`p7q;QfiY+g!P*K~lDy9hR@Gq@3mC0HF3#z7+-I+_-&ZQA3+2FsG(53?9j7Qz{jlHM}*~v(Q -$RyhD1?ajK;2so32U%qq(rn5xUPtAp~=>hiRyhl>!2h8!POm-?npDCUkLgmp4S<@w(3k#J#!EX#c^6M -bJ-)~sdcYW0=8#fWh%pqJ`Y?Ow6-L=Bm9^;@?}v$jsRv{~oCxQU_Hc&tvrvopz-2>I$9{?W0Xs*HFdP -910D_#DreLvPIO0k)p)#b7OqwDFNZ>Ox=r7vsc5P}-nOvJFV=ogZ=BH! -GskNy6gRQ3PV}_^5fo=*M255N3FgU}03^Ax=a{ZDPJd?S}8Ba;w|OlqC{u}R!I?F#p -)h}6vl2}G<^CjxM{fUfY+A53CfEzM8Ks^C~FHleu+{}pZ@5nQzw;WQTHO-(apzrn_|{-azQ>4!KX(~P -R_HAlln-Zf$@<5$|G&yD-n>|<@8v@bW!e_lL!C+02TlM5C8xGaA|NaY;R*>bZKvHb1rasy;$F -m+qe;a*I&VUA0($leQ@87fa;KaQM -wP!=WaV$y=3kD^+FKVJEa;2f<3E?%76ZmaA$bw`Rsip;-9Q5aXIe@bg^ckQc@R&>ut6M4gh#A;TShV@h4p_BPESNlD$inR4I$cNV%TfO@G@_L#5x -ctY8u`^bwUwK%gmNjX^nO5oJ)w|d4Kd!LH#~L;pBXlo1a);M-AvL^>&e&yLm(t_NUP~=`Ie)tiZ*UQ!F@^4G%#c}-4=w>Gk+sINd{MRM -VMZsLm)<<%WS%p0pBdF_(KL$QS2;;8+1O=V`y-$O1_bRpDbGZTgFnRlnklJ-@N3G -jWhmSGA~;*4T{2hj_{mmUa`h_nUs*Q0lgue3cQ?fQW9YN>oZ1vIV{)8%>g=V~N*l -+sQf*~Uwt5fJ`sj*j=?X3IhFnmu)VcTVoK`vSRsrW7^PCt>WqVanp%~B*Zx!E*qJ))6C^XmQ -6hcI}F_LDVK)}Ae7&5DxS8{f1Y>_zSh1pET2z)Dl)fjfbajUE4HZ{Zz>MM!jCH7JMeh|b5RcL(-H4;>4GjC8xB|_Q`{GgLjbkHKMt8v -Fydv6{s@g(uO)7{&I_Ydp>7;XkVb?szPS_{*#{toYi5;-4H42}`S)v7cf(N*I#yrwS?FF(24wUjFW(!Do^($9*ZQdlP*%MqQe8lWtp%9; -{HpR52)!=h(Y->~JN44AMEMnCCGYrA8FF6l!0wTGy%&7c#%6td#3y8o86-6_pETC3QW*>gs0cr+k+8- -A5At1_mKDLTBQc1AJiin>nz`wXCfP^dki_cdF94^F-r}ts7YusJEi{G)&mN5 -YZnYO)+FA=L9+iFKGPD@k;3Aia9#AJX`^9>>S) -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 -ESIid16d0-Zas*!J*Z;M)zU0oR&F=D^%e(Fdr1 -w8_<`a?TVm3c-(B7ao|arzvk*3{hF34trguNxI;5Qn}5H1Sn#evw?uguUo8I?L$baRtGF~8^Fhd4v?Y -{3!x-%C`ZV!<@V-MuwZ@M15#vm${XSvf-N3-=<7TASwv{13y6Zkz9uzQA^iMlp&By6X}>RbYE;UN*<#}S8novRPYr>%c -=pM!blkoo}A -c&|R;KhS5z(KVL2%yT6^99X$h88WE3Pd#sIe?`n^_a@PtE -nGIg73W&{Lvh(fOR5Gb{3ogVU{GkIm1(RdERhmA_Twy?Dc;mF)2r2epAwD$sT{DKs9!h*eB0;W%pIXe -6%LMP7?!Z7enbiOlm4mZ;=4Ua!VX#+=a;FM6*kPiCad^q72AMb|K45erD!hDn%Hn5Ag2G77dy+7n4=k -_CX@9yep^UP<2<+RBHJURX%05((2d21>IBP^2%H?}p3u>M -6FO?}&Ir{ZK;#ZNnmaMP(AG7|f9yX0i8W`(6~|799X@u6YoKgjML33WhPsHi-oXK$F&zF~Zx66P@*h) -3p2->r^&l4N5=KLEYd3cwL#e`15izG%Cgdja6DB#12-`2muH6c}`uW -d!P$Rp;ZXoz3JIlpjW8?KwCC1w}Y;cs&f2%HRSahE4pjGvmH7&$7T-W4pW&+s8`;N8p&6dN5hLEBZ)4 -Bs!JREUV}O%**dX9_DQA(!;oB6xTQ82C{s$Yp-p}x{+?~ZX?{>rYMhX&3^Fj+d4vzI>rrgG5BRrOrwF -0Z|-c0sEsRx{a||}VxuyMnlp)!lNQE03J2jDfkyut#dfA&$mE6UdeaW|^_6aYHhxF0LvDjr1(X7T_8% -ls9WI3WfL96G~+6YSg0z3~^heN4`*G=}br7Z@|2OE3{nX!qa4>0)W-= -0$p<-G1aT`_#Er@Wa+-<+p~KHWoGDt@R-Uw5amAY-1K(0FDpaJqJtz0oIiCC#h1i{aFb+Sot-l*SpF=($93rY -nAk0YXQmJi=7J7p;YXeI0pE2vx@2Dtot-+k|&vUz(;mx|5<1boeYEG`pPO>A2$0iEEH~72P?m!&V{D$ -+3p3onD&~fQE1b^Bpo)ObtOIsq7N%u7&Sa~wSs^MrtqEp-2JOg6smr(SBUB|9)p^K?BZumb?O9KQH00 -00802qg5NZYJ;_I&^V0Gt2-022TJ0B~t=FLQKZbaiuIV{c?-b1rasJ&QpK!Y~j;_j8IIL0h*jY7;S7X -C%qQ<)F}lV2Q-!{uadU-hZDrc!hXk}$=E^v9heQS5y$dTxG{R)Iy9|B_vvOSZzIofEv9*>;ptY62nli4HdA|TNu5rF -`Mha^st|GxF=7XZ?p?B0uWY!N_rb#--hbyanBVKSK#ogByU^>_{N9<`t=eptfT6y> -PwNtzX^yz3^R!Xlf2Vud)kTvoRWkqnJ5?^KOmQK#N%I1bs2f%5qVMTWpltJPoZP80tLnJPA9R_kwuYu -I-x+E_Ia>iqm$tgBdf38nbqLdx$g2CYsM1WAK{6z5l>nNvpeu3s@VBj?9u{ib=2h9~D&bK8*Cq2rimx -u}x~gaJ=q@et?9a#$uYf*fx>2*>Q`s;pDSi`K*hRHSJe^XQZ -`xV`9<@rdWU=nb+h%qY^%{t~T(?neRhcx~yewU+b17j*T{JHgLK2mBv5i#p%7rsG$1`zF10agsWQdbg{jR!!B_K$Rh6p4WiAPtrwNR%H$(&3{n|j`t| -@#+&L+**aCZ%vW1s_9K!XiF#;*^I#g^uZ!u?(Vs3pTwT6(RH{qAn%DhaH#E30w0eyIixEq3T_~Dh)vyQ3vK#& -V!1$yf>S`F03YJV5l?HwYu`|t!c}eVuFoairRErd-ivt6tQ~3ABW!$vf1wh%LK`Af`?o|LH?k>-i+Zq -9a7Mb$_(gqru(XtLVB~H$!D}YtjY3ty4kMD}AxI)Q&!C9U77!_Q -*m$+ui_v+)e6ccU#(llBCCFZH2~+Dp7hw9V%4X$Di486HL6(tN&F;^V=MsO0xYo@SCFxkDUYKu&0wX; -fOr9P8I%$l2*ADpUJ}8eKx7Jm0+z(6(ZIxn$12NV1rk0naR?npac)6`{juID=H3ZK{5VX}6x_P -Gx&38`SdlJ|8TIAGSiG;#hpoMxR0Twm%>WaH$xRd*KefI2TCjGpAcJ`gU`R?p{d-MI-&5iCCXz92B$P -`D*B+yDXO?7X{naK)H6y~<^4jE3s(Ru*_68Z}|7xatqltosoD&|mU8DtZ&naqN3G|wIl*7Cs$d~oeO) -3Xw1niYfnWgj8AB}wufDnxTHZy2Yq0*9rcQ~5Gov|p^?_F;cvqg1n`IUj1-p|6NwB_=QF;KfJcE^tCf|*wuY)c&=OAx^d)+f#1TbWWgtk -s(N=XmLtY;q-j$2-K%I!W55dn>jl^yo_dK~;nY6&>|@VvtE@PWkI6H`h;ZB3C5Yx$qh}((!iC??{WHTA}cyXP^uht -Ll8ptKAfqJCK;S4NSfBr@`-kA3S?vReI6pL#zx;uF4g_BtjFur0ALTs8shMf{wH;uyz(J^OD{$BzXOV -ZfUVa&w?O0t>@DSr^3>b5gR2;ku@D}MFFd7Z^%E_2Ce!&ecsz7 -!z*qZ8$xjdIK18Jwsd>FLJY>pjk9`A*)RrfM?f*X4k}`r~_**E8v -ab_rbTe>m^RgzyH(RgUrM3%%?1Mz)tO#ox&Iam#XPmFr5x6PQ8^7$I7Aww3(xo_02bBp?k2*9};%cFe -f@Z1y&I#JjcJ`3Cg2?{F_rOcG^~_{MfZ7Kh_-?R_K%jJ*Ej3>$F^fwV*leIQaSJpMwtsNkz&jWznv~(>1TdZ?6QgsH5sEE1%1aMZyg+|ip -geae9n-@Q0a&s@7q~2H-t;S8)l~**SXfxLB6<1-^C(};Mhr|BAQXV;Te -bcRLnlKDV$wE)Ae4vi!qX9d==6?S8S<9w1gCo%|UpgeVIGTsngF3&pmJm;BpU?wM^+tj-)bR0EaQKWo ->K~qOPz;Fx-IiUak&l#=}B11o-;hc+eNE^_*szVh77JM*r!62sn85F66M#6Xm_cdxwb;G_Dfwxg&y`J`A2t~Tb){+ZWjuhBHZ%#R5@A8pbL)Q}FB*LEfCfZkM^0{=xDZOZvx(%O*8Nb+~t ->o-3#2?c8mvqltYl7Ee8&|ZY^?;TQvTwSXXKBC>&*ZNzib8t14Y4`hPE|Hlp{)L}>T-L7{_ZXMZ;}QK -djJ$prGl*Yjk|tXSXsVkL#Rn!t&uv>KIqW;7-UAO2h}U{F~a385t_@DF%|C2tk)nPEyKm2YA!u-d+iVTKdwZ`EEFJ*g$vAv#3mFdlhraDp@u;bF)G_E~dLJ -V7EY<%L_y5f62H~46ot_3HkIT0&8`c})x51`lAS&*qV#ce`yJQ4d4KV?!b(7twBWBL7}+UCmHeB#wxb -`LU8U(oTdXC{IWHP-@=dysa8a-$YPy&-!18pzACF)O^51$jq}jzCbD73%t!veg%%Ef>vGl7ZwrQZfx(cRcdL+lfQmdUWF2~W?Uo -@lk5Lipu&EayN`|YvW@DIEZaJg$IcyHf)9KWKT@$+}X27v7j?|3!m4AT+m@jiJ%>139gB2Nsr?E;8d+sVRLenfWjX0!R6 -xDpL?09En=7UH?FZB%VV-Uf-9573{;vX*?w?W_|oIJot8*y#p#F^&hqUbU;CBoSqcYIHaSJTZ=^vz^? -u^xY)7Po>{kI@k|7M}3`HTp|*v75LUib!9PQDhzTomkv$0X(pVg&e#G$z|eZTjZ_Jlux7UCpTbtW^5` -?V-)IRX7a$Vr>Q}G7itWvA(H&^Ao@Vh;WQub1sVX;DLt{kzorL-j$X2~FLI>Wy}iW?*3V@SI%w^+IT{ -ZqZMmXZexTAZs^t_x0J>7Vtt*VaV81bKT7g;sss-*KJwMQ}wx=8)$U*D6-54Yr!ir@3@9tVn$L&0+uSduZax~z*B^d`e0f%TE2UoXX)O00o&!KXF#m0DyWdt!4{ -|uLVdbyV?L~agPoWgsC9HwR37pBBW&0{CBVu7(iDB*!+iu9Kq^&nlgvO`J@aEHjKn}ZHD0*~xX6o+Qv-T^i647=Kp0M_X-o)P)e43KhT^J)5DSi$9)4qQa2VCP3I -@-IFMgl;b)O5K_b2JH}A^2D<(r&bTw`fLHiUefKfdopk#4vs3 -I`&h9&$4e~qBq@UaI;|2A+X7wnGDeAy`#f`CI~Gggbgf5bVCS5qtv)u(q=cY4 -0P1Ghi4oPMGg`y;g}y(dIXl^TOR8cAe$~Q;?xclJo-6#_n&)u_jLrr3oMUK-ZT_RdmijxC4?NfBk>Ok -ZjP^#%b!18eQs|;)n&2K$?ihej$Wb%hEN$iLJzgw>qsNBwuGfp|c%?sxhHLU*>Eey6F{H>Bb`xMe}Ur!xv -QFuk0C%7do4$hHX4FO;`Uq^~a2S(?DSKPSC4);P^nL~5Xy6L#YjaOpaKo*ZEo5%FOv5)zWj32IC*bOK -4KV)lKdj>U`Zk!lG(tg0$H&Ym=GinRyfp1kAOUWyxf_2+&o3qo?6>xkvM<34VcDGGWxB2!I1b(NQ)2F -|C^2A~jOOF66-gop`HHxbfM!E~`(mGFZ2ZdNjkeZu7Xx@-Xi%n$$NK2)4EDENZSJ{pfv1SbSdEU;u#j -R@Ns$Mbra)yGtaQf|UPn`}JY}kz#PQkE>qW=C6i1!Wze`fHcaMk;~QGozwtzR{!N2GA3PSo;Ho%pqgK -XVZWYnKkoI|y=6lR>V)D!aJF?We`R -i2Zk`|5CMYPt97E;Bv>PCM{SOAAI}08${{my -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 -Fvc!Jc4cm4Z*nhRUukY>bYEXCaC -xm)O^@3)5WVYH5Xzx;>S&V|X@LMaG}sLqAn2hV$RP-{v^18Or9_pa)^UUU_r4(|+gf|mXi*>5mdN?wn ->TN`X__XT>azTn+R|8|oY>$iKB=}6C3W~sZK22svk}-Vyb+xx?D3){DtTLcoy6V3w8EK&e9cSr$&+oR -&XVM{((s~Mr%D=}?IXL|^tu#l5`_sHER{kvP4DGelaO#bY%#6gVPDdBrS#Z@bZ*Hy1v9a+rV)MTyd~L -WNs8lzS9!kaeQznx;j=T=3%Pbi_nz|joFv2hN}Kig+qkTgz8)Xl&LznsacQ<~3?PuB!cVpCy|GSgYgN ->umbV1l)_q%Qq-T0NMR7QW)Xu;g0>B1PIdLm>PkbDJ;B8Nt_>*66mDYGxRYevXfkjy=kK;-mt${Ke!L -E?KBN1SCLaQ4RsZ*cQ!KJ*FN=GnVfIhjrdiB?Dmv65w#Y^!T`4AuP)eh-yWUu{7Xk%_rub5t`EEPECE ->J`Y91xkKjM=u$|Y0JTAtQNi_lhm$X*04fJ_U;F&~<4Et8OIzR?f&zO<20=~q%nn=ekIH?@=OI0!;LwPy5(Y&?davZ{^p3NVLYI4*||VDYTd5GK9Kr5x~nEYD4$HOYME>_5!2VTBN1U}46KcjWhm5`@%6~=T&m-{;G6!0I>>XqU -jA%VH4HPijk^CDpD+DW)xs%R;92Sc3W`pj!U-45r7j@IAoYJ-*`&S`h&r^}eOp6$BYQYBN?<1v!lBHhQ~T1$B$vy<=r0oY -D@dG~}GDSYl$<+o1koNEk%2P@*#h_0(pQx6FY9!JySsO0l308NZ)&#s{?9@#2BaA0`gg(t+PK$r1(=5 -1DnHR(_FY=}J6XPQ#K%MeX7^0(<%pU9Ij59px{OnF(YddomD+S#mTy;lJ-zT#<;KYy)*FuqUL-EFDH8 -k3b%d%&K9^Ok`85wUwdZVBMA=xA^7($D22iGpzi~%(9FFl^u+u>UbK*LCcaoifCcVadb;i`H8`OXxFJ -C5CxKIwt|ze17O4BS;c0F7a`~Qp0$;bhr$}iD$j8{Ej??e%MytGevn5}JQBYQ933b4c;hU_YnRnnnl;QrBthf4HoK6-u5 -_hKR{*`RF_!?s0g?*=+ZmJv;2KW|d^6RXruzI>+3DfdiTI0Ro-i0itbtc%!jscV(zkO$xqr{rR -&1pseTyJo-304m>>dYCkebtbAe!fM9D?;|CM> -Eiid>E&UN^=m^qy{{GVE0 -c!Jc4cm4Z*nhbaA9O*a%FRKE^vA6eS3Esxv}T}`V<)HdPv$7MN%>?E0(g3$4+$4#GX6jB)jW%c$#EW> -X_{2bT{?LX76X;s>1ux&88%KJh{Vr^z(i -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 -V;%80M8lE`Sp=du0aV`tOWAASm1vK>Az -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 -C#sWX?CM9U};xC7o}QWt(IlLZ^D{ -ECLPL(Te$ohUC0d8*h02nz2Cr{P8F|?!a21q*)-vYQ-T`F;C{KHzJ -xbTC1Lwx5t$&Lf%Gd -wUm9)go_WM__OB4kD&OddGTW?9=wLy>-CzEIPUlRCnpDoht?SR2@Et_P8#6_dzXO4+Hf0(WszI>xvJI;(n~;PO|+ha=n*KJ$WjhmD_|^UB0Y#T3_*!lw9TkT;N -9@wPh(^R;Gw(0>1hL-#_Ds4*G#93;);fuw4k+zy>2OdZIB*awt^Vo1&u8{DEIQ+%qu8Bg)j}J2;|%r? -WjKZ{A)iZdTf$fSlqHuiT{egL%+mG`Ef;{u#w!^7UTwQml~gPZRlX=OmB --0QT4M1)pc$0Mc+wwvQP{Hp+x@kJ}r_6t|3tzd~0vK_rY(2U_KGvjutvCW8!*!G!6pgEk3?bDyRs8*i -v{NyTHJ%hK!K#9*7yC2oX+bQj|UXMPW&Z-nhaD<#9C%|8kUL?)CC1ps!-!JU<=a<*92Cbvwm?ynpXsL -elZg`#&;V+RO_>h_{ij2R -e6fVQ>sLbLbLAMOPcP^L+4^IHKMowEIP%6N(+r<)r8goISqcM9GoFD(i-2+v2&5^0yp{=4!3O(6(m^W -QweXj=0 -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 -mknLbT(4l4Zz+cv7c*Uj%D|E;-Q)z)SR6J+z -r3)QJfIAnP^bo)sY?J-c3b3$cp~hjqHKhxLL+0QUC{XT<8*f0Db)KakEB2FuVn$4wOF( ->=dyojQYRf8w4DTTihE;t4QcJHbn@V51SY6yTizN7e9nvHUVi9!WA{X4Lr^G&8hg+mtG?0XZY$&@L>s -jGD*Xr7jcPO1b#!ztsfq;hVqp?s@Yl8egY3ZT7COv&*a5bsnF5R?MN}POJ -H8&MbeFH_x%VP7;&Tkme!`iktEioIjzNf>Wijwg#@)-F3P&7{r=>Y%@Qq9zm57b;sdU?)~jculwF>*= -mnpXfQ_p-uJ&h-ob_&=SVd;c5*AH-PL}-H#)-Yz`>wjfz}hgioS_dm{tI6!MMkc^j^thM&~-af9S~EH -w{M5VfP_87)i(0JF@kv4WIE1(ZR8*h*D2$OFbR*P)lnY9rh2A{lVdeVn=wAr)Fj=qD~+Q!?D~_zp%=Vbp)c$@Oil0m~9T2#HbofVsr;EiP0ATlNj+YLZ}cU4;A -81um9)!*YC%#-u>n6dnkFVzTJQm@$wI^zI**9noMCm5wXn>I)i9XVoG@M43l*_y)?iXMqdz|;Ws#i|2 -A+6_dz|dfB;6)wEVjP0r0TWNL`uV;_7qNrGG`O$(6sx-U%bR*M6CA4?a((Sy(@<*ENKE=o -X5QO#+xNfZnH0DN?-%7Qz5uzN!#wE9Jv>JDK^ZUOn@HS=w60sUdX(f|aU(2 -w0W-+9DcguM4@j?4F$Ls#~oB8HPJS1|?9(nF#s-IevgeMwXjEyQF|^Zj{fY?ZX>*S=xkCqU8Ra_sQf -X^7msXZ+8l*KHW(osEKkB?Zsrt>D0YRsqM1nRNkQvzx;)AjKSP@7qN19Cy=c=Zd8UE)6+0o^tv?Z+#G -spT^^`52Cj>P9O;>vacTg;W(0R8c~~I?gD|vY|odLs%1|tr$tSuqDUD9B7in_%e~n>;f_*6IWjOgO#g -Wad0xpuHu79JkP`vkX9chu|?L17`?uBpigNnS`CLmzNR|Q)^xsvG-xeP1=IyUpru3WX@=VrTbX;ljyMWwYq=G{5O2%-D4;a)pS1yXl;Vog(PqoNY4UT8uC-4R2 -s_%#s2pba1ei9Cr}RlUNgtMRnZb-eU}$mZI|CmW}vG4aYI*Zvm=CL)>8`@3##q?)HNdGYm{ -qQndl>Fai32VY90C2-LYYN;cVNO1By#Q1&r$VqSYfC0R2*9-uMX7L?Y6g|FB{E*VGaMd=Nmj|;CU&uB -*+~j`1iA`&Q)|09=p?rK^m5an(BiWNcP(u)S@dC -{8sOr~$$?%0a-=rhe2{FX!vB$O~>Ui9j!tApC7vNLGICw>E(0)0*IKeH2OZeYw5aYz2iI=MYP^=A}=o -TITI8Lx}Pvkg$2=5`s0ddI_`i{=fBa|HODXXyLJ|pg%4py6(Z^5C{N@KxQp=rbJRban?5*gIYE`24~Z -U%R-vpuTa&>r0v+$}7M?@a;lx6UYd&o`9(d%2I5!EHh+bAz3z2D*tZMmg%{Ebcrh|5+GobKVy2q~%3p -QZH0Q&@WNa(Ar=zJ~4rE9-v9y(r6c=M%^Kskk}g~fJHb~z4^6cTsWR(Xb(MEK;CBA7{#9`j -*CH%!~WzEKvqCrfjUrEMv1b#pR-L#YZO3r1!<%hr=cOd*`He0|e+E8Hu?&j|D)zM+0yRa#eZKPvSRbs -z>4imwRAZC^+6lSq{eg8zk@d{VK03viCCSH)0%Dup{2S*nZSp~6kauNIBJT@P@>A8rkazKXf`##Mhg= -R7X)z;GT_z(7|FwDV1~sJl+~YAkS}vp{J-U>1C6wLXSy&xde#PeKjift*Jt&>zDhZ`ms~75mkl;XJS>@(VrmVv)4IzY9c -W=ng+zn|A*hEo=uP&t@_j9S=!m->x-9EGttv -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 -QZ0MTaRuZIUT$oNwFo~$LEIpzMp`6{{f|2BvO7 -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 -M -kJ?YIp|ImY<_oC}xyIhP9Opr=P+$*gx)S=3#bL*C;#w#@CDnhtIaDlYT#V}E(sI2VAK-LitePRYMY0( -nuZNvZOyT@M)=tL_C)Z_55SkoB7!HSGtx}fR3uK5Kf{LGP{U~+v=SZJQ<%XXz~>YH4XOD_DHV$KV@x+a$li7kjsl_P<;2R`_ -g>c<{-U5-2m?|gP3O6{_$3-_EBZ9S=orAkn*IG14?R5WCuC~9$;R_!!u%T -PHFa#{30pN-UJb0CD!?DqXI1jkP#mHQfy0%~rCWV{mo0ep35ID=pT)kqy1&8({P&-xlkbZ0o!kbq!?> -_a4D|y?-wqG)DS(*?H%z=_b(#qDYW>Qc7hk#U+q|rW`+e19f2xM&x~!rB07t>Y^X~bKb?s_?ZgDn|Ae -Gzsss`_y7^8To-8#r9(FGIe{icmX*{R7N0nxqg`DI$8DCb}A@`NZ`?2$u#x`c~I9p;L-FXFfEk**oh5 -fjNd){#rys_@JgTzd^25}vnioA7SnOxH?BtrqH>p7xa4PL4l;h5D6U!yY*>w3hXVLphybBrW*=HXWVz -p2u6;zKd(vJBmF!T;JmsyQxbRj?n5&PAG+hWQFqFiFQ}Mp5?}(Lz6tu0uv%U%6hvqzYA9xR~Fqn*q_L^oIJex!q=JUc4t-V0rRx0$bcd>8rguF^43-v -wbRVJXA27*T)?mYHozhHD*7HxsH**ZbDE%FD05`AX6|d?i&eg7Fg4sF+y77YH#x=ylq9P2D%31*A#eg0HT|g$U9SKN^=aJ>dlBqg9t`nA8@P;? -v~FzYt{)J*FT2b$k0JDiyFr0^bGObO1(R{mSy)P%o{%^)>kI#;JMR{o~dXFS|Ks8=Y}BiFPAS^K1@&E -;?cIE4i`|kyoA)ZMG7aM_x8o^be+Z{gdxdTg@zr0M+xtJVl$9YRO9NofnOenJ!oVz6%ubAjhCvj8aRHVvloGKVim6m_Aa+X30WdKq1_v} -2P&khqwP|}msCZk{>5dajSjAY8n7yS${{gLo?(-(+mGbSfL&_kmb4(18a@-ijRuwd0A{Y>25Jg968Xb -N<`0Rw&x6`QHzi55+@}3Vuv6(DqONPXzDRSMG9N^diruII+INts4<-MdfspglLES*~Uh^9$K<)Z}QSp -lJLvh-Fb580HX+)45p1A8B2;RLB4OQGG&l(Gux5@;giLN6VU3=176+}7sy4wvNp*WK! -Z#ZMV!XF}8x0)#zK_KN*r;mS29zb-qUd`@iTk&`d7{MDa5 -AxD55>i>F%83`m}VI79ICGAM4&zl$XjI0}lbHE;NX(m-HAPVpXHxd%e*?pOzsI{~h@~Fp>|P&|UXcu?3P5dK7eldqFt~TSoDbD#_}?Z!X0|gA8jtCmV`z3vCYJxPeb1Iv$|N`p8oxy -!tnTPr%mmBFAMuVV3wQ8(~9I;%gdwGMQ8uyRJJgz -yBjL%8P-0d52;BATeYUxamyw(UKkg1Ams(gE=+UKIFKF8z`y>FKR@elp7nnJ^vUmrTmSEG- -|loyPQA!eZZFXTxP>5FsBr~SggRT^O{q$b3-6+FHYP=Kg!%aBE*d2TA(Tm?wUA}a>2k~IOOT2m7__E7 -mvl5R-ZPZ(dVS|6TB8{##;NhnNJbf&v~q)#qduS2=e_!zz$^qMCzu|@0c@y}K&W-1y9=TMv||WA7a0Y -QZLf}g`t|unXlfJswZ8* -Ig`}UUD*$>^J1P~=f!RQvO~FQDS)?RtkvZ(cUFyO$vRJOdH0ntR!m(snYgV3#y+I8(r=pHS+OjG?{Vn -6D$Jn5gIDA_n;B~K_X8?I6i0Nb{3I7qmRlFCx;D)#FwIt`$sMbUl)h3eCw74!b6{)G7)IAfK6L1rUes -F>oYurAj>JNj&W_Pa;754mgTBigly}VER<+DHOY*_WFdbBUdJ(WPC#*wph=nTXAlyz$rKzh<}HT%$~}dyU`mAtM58lqN2@VCwpZ|X8{E&BXlVrCCbr!I --hXX?H=F6pG-p7+m%4qL(n(b$JG2AfxI#TO$+vaTW6|#;ttX@u8{XC3U*^a$xV^rQO_782Fy;S1xHZC -h;*C4UXd<#T;91Xe4)GXo8%fVMkqgH5_R`nbJG1FiheM+H*~7+advT$mL}4?KlUin$3~PqOs|UpDF4BhA~ijeDkhoD0ZT^GWS)0fR5ae891fAC_S+W-|ffdVYuq8qye%TYn -Y&%i%Ni!4`$!6F~gxdcPA6J&Q#4EGk~u$C2}6|)gyAQM`N~!BIK(RhCANl&Kd06cgOoXJUKdYO -7si~>RDqE_$yJo{=c>15hV0x(XK5ZPfaos2a{aw+6hXH*+?y@m_q>Iu$&uK62(IT+zUeRmJ||=j*d;~ -$RuZ^;R5X1ZbP%b|EZW$e<*=?MSHO?$M2W2LU#M>{@5AyN#=1vV6TbQ>{+LF?={)nv-C9~FJHGPdQLH0ZNXwp>#M>rO2Xi -6&Yf36Q%j!E!Tgi);GFZNzkPj&K$=g2IcMGsPSnOLvd=MkLTtpe}ODr6jy#n0y{H4nNP-UGbR$$Vnh(>J7w^V?=mzl6&Ciy`3l -IB4=lGoG;2gBMy?pZl7;`qrDkrPB|^<-sg+FSK)zHjAsq~dyi|vTk9P^P(LuZBZfGlhxp(YUE*EzZ$+ -5kap>+(q6D9(dZc4?3!%sWm@Riw-1a>voMJGP`b(n>GzTxI2v?=!m!TctOx4m6Sulae=sLM%oFpdika -8MTTc{2CfFUUxEgi`M8E^)fJ2uM-bTa-?${R^^aD_3zDr@hz0b8M}F61nex~wwO=y9-+L1D2Z*{6eNh -gRO9^XYAd*V=$m#zo35EqTg%gNmP?-*NK;$J+InC)Db*-buA{Hoe+uwE8^uskHh$`suX#tawVTJ`GVk -V9}W-vz~P>z=CcMsMU5y3~GcDY79e8b)0t{*+rLx1xUu@b@?TRjInh?AuLfyx+X@9qd*Qct+*`u{)PJ -+#I%JN+x%jb1s^* -Wr4OUr8p-Wot5c`Ofw{5DjAo$eUn30@WWtGrIxd7^r5vPMDO{h%S@szXbNMYB2;e^}5*xikdymFHs9g -Btip^?2(I7#O~F7Hd7mg5ROJ0gsl+*VivhSVy{1(K&&B&~dzXURW=aDhNxYYVbs0D#pMg(P;tB=(K7R -z>O_hIJ9h9zM2(U_v61A%0SMLF}yLELB9KhVa9p5jjz$WeM6~i;Oc22{l0(M$0b*$r^>6?cSmUQrGEp -Mpgq#Cxpc60VBtlp|!nOfM|5#TBWMw=SH&&9$R9Kwl?I2NCqJJ)D#|tDz@inbPNO+WDKa(J#C#(QBAF -tSh2~TodbxAd@;G5p+)}y?QoO`+=TSA6darO5O39MJYn_C@_aOH-n+Bz)NAHZLe^m-Vp(><=CW@+iw& -NQ+aILO@q9YP#hZ#w)ANVgTDyJZrUV_!xZEh*9dg}KKa}eL=Iz7Z#4JUJTsk4jSlWs+UPr9P`IGIBy# -dud?{NX&>L3-y0_!TG2;C%i(4Jy06q+?`{)MT4>sS?MmsKE*+rYIctVc)0i;;<#JebZVL2UXag+K@(D -s^H7U;&}CZl9l+m5qs)+R)@}<9BkE;&0Kvf&_n&*_qF%$8U?h1k|pTIvucs*i9RkvZ1<5!DlJ`=m}pe -S0^wo5m>HhrO#a&?oW=lUMFU=H2WBKXk&P&U!iZ_=rsV#yH{-f}UwK!`oI@=UQ-q`5wmvDS*|Hn$TyWa5Jo?q^Oj*O1t34B4C_w$C -YoGiCE!C&exr44_`n{jJ@pGsZf>OOs7f`nturC{)rOp*4lEENv7t+FNZ~a!!L6meBZswp@Ropi%Lkbw -wyNx<~Ek69DjDdVAA(oDCInF51_*!C|{Jn`wh+>uo*%vvg_})^7haCiH=D!eqd*q?4}^ -`|4b@i#Z47LmOUBXX>;5ZiOGcV>LD`q#d-%IA$o>#e$&1!qeA5;YocSZ9l_L)2}qlh1OjgkFhS+Tob> -D|;QQYycnZn -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 -QBm&X4=P=IJy#ae?H=<5Y#)#7EY< -&QY$)_$^I7DDE)DrIEDwlbqM6I7ZQBOGaLNNDNi3BmPR6VZ^DxN7MkDu`b<+TmG)f>KX`gjVV8|lf5R=JE -f<7Hk$X_qe253;i6a*_8PUL5jpV9r2lr!z-D6UPiPjFq>*C8^Hs-gk8MmE8>={>0I#s`{%jG;jhN-W_&{yMkpLwsxyA$YZsdA`e1UCsP0aEZ -)af>S{O-5G^6HYM*y@qGv1G0&_wAB=ejmFLBqSQ4t#Dl|qZaSq6*oQ9aEAdfv@gwnu@W0ca5HA -<%lhiAuDe#mJYr03H(JCBkEEfgqzd7OAP6Nh{t>d(Y6&jXrc6N6%~^@L(oy4hmZwNsU -NS}8?$8DmC~&AFDOu$fC>Kp4qYb-V`s6cYUT4@ -k;rLYDXcfO6QuZV=V{gHMo%qs1|zcHM!fr@6oeKQ9qNanVhsynpD)DCe}feP_N92&O^=)*Ip?V3FQe2k7d0z%F59^t8s_^2_-;S3%F -SqAl#8H4S^*$MK;z)m}Kg#@RXGS1(FCpe7U1Pwwr!&I1G}rAD*-4td`+$J0cs6tYXt=s~iUY?Du`kxk -;_D>41!__4uXS>Ff|lL)Og3G7k=`s4%rZa=PXRGc}yyL?wNW^%W@wTLWTtj^s{eq -F!Y1YR+j^hJ`K0K_c34ngWtWoAuyn>zQndW!s!L2;I_~aEGT9!*#=P&(P=d>|NNLURI4Bw3R8@KjflO -^*%+$O@#DR$ZLPyt=gcfHC?^XxN>WXn)zT`dS*>U`61*rOX=-+rXTI8hz5B!A@!22u|McU#53kPlzTf?D1mvu`Qf+q5{z -u1k&}rFUxIOtcWI4|WC(fahXxdx_rZ`ot?oRbbOEe4nQZ4MQcAFB3b5EAPlH25OK=y -2tIb-&l!A%Nz2?{uqv?iY-)g?~rP+RdBmD$=h2c4(tqP~Ko&o&(qMYsF*-EpHhJ49i)M^|E5Tg&$l(= -dYtwhqe&08~N_+nB1!W4oLv0RwmEV9GgCftXtb6lM0oE5;qQE8CUV+?*e0Q(Aw|p;v1uXTd=}ltH+Zu -hb0rD`Q(nYF)hGS}ChVYHe%A5`%dX9%=f15vk$tATj&{w0ohPA6r#)9hMdsGEQzq`F+SI0=+9l&o-7D -*bfYwd?mgrq+yHPFD{*=+Y_r~2;_}|dTLWaOmd^f27$1uUySc;MYM;0h2q=pshT=qWTR2+eqSs}R;v` -2c0P>_*QSUmRPZaxlYmDVKpL0z6**0t-Hn3{@Er*NL#p$3)Jrrd1})`Yz&mlKC)K(Ct+Q29p-MqZKHW -#`piAv*{U2=_&tY+=2_Yyibc7eLtGHW; -5ISjFTlWc}8tFd>y!%!~&)=K64@`cm+>XPm1N5lb;Y8JS_SV-zPrJT)uhYFX2nNdqa-?0+Te{rf{0W= -P{!Yza)y|u^Lalof=zIwaF`gT&UJ(7Y+l|#?0&G -jWMHBy?a+?obN_{w-i$vr~2*S$h00%iSMGhzTNh{h_Ts6TkR46|HGvUq0xv^YOg1={((} -XHLy_uf-CVG|aB#JneZ6gq(vGK_dU~N3?>L4G%`ND5xAl&~K8%jZp8Te-}U$RFLYmxXM1z`lLRbH-%d -mq>VgpMrDarq06$E&zc#WTn#NcZL&3A8~VcDa|W&<7SzugiD;JQfAl>haa{!1tfbPT7B}tPs96 -a3b5DN7rg_t#mE%cOqO1Cj(N^TKQB#uBBh*hZQTMI!cJntQN=HA!@U7JQ7xrH1dH?x<9G@IT)Q(J(aP -BjJ>SU{0bug>7*uqfIEOVzKxD-=~UudHh_fP>IfyVa6CH_68bOyCF~Wcx_z?qFCdQ$27^wc*zypS8x3L# -sWrdzxdJ^6blMp@Z0A4j^qyAn)2ff#dCwVgU~g``cXwKUCu^4|{2oyAiyLoHm<>q#vXMNnf<;OEo>lT -Ew#W13pJx2zg=Qtub<}O-W^M9yz}BaD4XU`zv%j)~2-_tn8@0+tj`!&4+PZ5s5W!*mVV?qr3^_uGB~f -%vcDMfXv?HFhAtQsht@7=|%8|ekL+t7u=u?UktT#f5YHw_t^ftps7o$8=%9`y>2;BMV#R!Ed1+&SY2YZ8;dQtp=`UZ>}=Nz$hlEf(p4^;nz|aKO;3&hzO$U&d(`NW -f%u3=hN3zg#P-TQmH6S?UY5#Dk(`ik3RaaFSj2Xwwu4Zl_TuO{RleLTDsB#J?TrOt_Awh*t{T}2ruVZuQ}wZlj+ -ITpq&1D!Y#7!Yuw-hS~LJYxjqHhWB3yi554%U50VC5&cC`iXbmYW4cb+Fk>x|GWfr_D?r_Hy<&=M$7e -Li=b7)O*1$W^wu%KyHvmo&k0Hebx6NAJNA42i~)*+io9HrF=zsQjT{G!gO69{#4OdU1MbE+z|LJK0s< -kJ7900u&K+1PYsD00CjpIP2J+itt*-jaf-yg%jig>n^G$3faf0HIS&g)W0i55AxPzL^s_bP^^T6T_$| -0C_gzxI?g6R4|cO=6)QFx(Sxhg1tsDF_}nzs`RIMN-plY5tM{f?rSN;1MO9FluoPY=-&>z6`-@FQm4P -TGv*H97O0QKBu!8>1#XZKUT&{ay4TBtrE|7w2LI@IFLbBQG@;yC{bpSHSlpKF$3l5Ut1IQeD`3WUgA` -q?fn$sG)}{_jiY_vzLny`#+-jb)qYPi_fMuF0`$1x74rQDQkMuJjtxFfzD&K+ap&sKC>?yK#c^qtEnErRnaCg?c1l>IT -p-VQRqUS)+*tUr%Pkd0oi-i=Q%kW$TS{=kTZ$N0>;TQOw1|F}LG0RI*DQjx4E*!m-~bb4;4dh -yk>Sf)ST5V;PIZJ$Bf)#Ld6b4PUs>!gFN@r& -b;3-Kj^3Hn9tb~-6MQ0s0HYq1Zpngx`)e4tL`g99mDNeS?ZnwWYAdkY=^A!>EG5=Wp*F%ndYUmJo^wK -{wbWpQ7jCzfZb$`oRQ?ZVH>sLW1Vu9o{Ba)hCzWC*SoM$guE{5 -;0Q9yHo+1F-9*A`5>BK1;$M2>`_4w^7&7y%VrUVY#+>hH}`@McaRY<7BszIOxJ? -Lq$;ro?&L0AQoj+9$$SY#wIZS;?@os!`{G1|6rT4LVspDzagbP9SGQ-Qz>rBi7h9Ik6|kcYGQvUlaVO1YAw)tC~3 -lI1$kPb5N-XW?cJrrl~5HlHPI&iwx|#C2YFgss`E2g`Oo+`i;v2xv|h*M8beL`e%n>U=~)3(zR&+9ot -~H4=b%&K6CCsb4%~&%)4b&J?vm)$yrUJ`8CHG$`?!Nz#M*QUMWTs_`~T(|`Unz=D}MCcF5nHt#;xzxx -E+so^GP|lIAr(_@W_Iu9e*pm3{(Mhic&<@W0;%PB*(5J*84DhxoCtrx|)B_k{ha=6aj-20F5leOc1j*sRZD1u%Gd||~UmO2q -KaoGlpxH*YUTg1RA8SOHt)#Nk^vI7cV?__6-@vHbWk?_kFET}+K$C)XHLQeDSlp&}M>Aa>*d6WqkyA2 -W$9DE=V%%N%}254QVzMvQi5p?-sGiVWwop5YGsZzt-!IC{VL(()SVe5^b87*h{8k8^r__}YD1($l>U? -$Zl;`r0Xb-;_s~m)}-HKu`_n$vZ6~N%O`L4r!H0B2*B@ee2!H3FXY_bQ)KJsH~OF!oC>fHR4<>{u{sb -^Pq&|cl1=lRC1uF>jZeS+Y_s`<_5Yfn%rs^jSa;AN|MeO3lWRlyRBJyl)52(t02CD11`iB{B&vX> -SQ*ELtQ9L-NYC8Q%D}QkUGB5Rg=RVOkein>6pJ9UrLdHL%}!optKkYp~s2e~?wOv2a{}7@j5oD+j4>WORg&7K`q@@31E1bKqrkWqyP+vrUJ -7*zF!{~13QyP^t%nx~Y-q;*9~7CfTUd0AreqnVVXz;rcAw -E}+yE33#zm|0&_~k@V@mgBM -ARnD1!|aV`;n5h}mlMQtrq<4W9-A0mEL^+)XbvIuU#?dD7iBMK-CLQtP|UrRMM=8)YDWl@!%J8;BT8( -GQKxe&7?pQci%|AH>sX2U2-EU$Hqnmm`-AAXh|(!2k&<|4@AJp=dy}aZpfzth8tW&X>+O9u=+F_3`}Y -I;#k~q$Sn0@!&Cx5Ml!utP&Uq?#1}aRPhF6bT^b8yrU7(Z5@l?^~Eg>A -&XZ9EU2nh#!lg`*B$1I=VLqPdufHp~ES++TV+9{0Q6x$ITSQEA1_25>-NXqFl{({kaXi -^%%l}Q|cgQS>bM-OmCe_LROWG-e21o(3T)LVE`AMs4%benZ5GgQJwSYXJvF4wAkacyL5s(-NJiI5ANY -gy<53w>t!up>?zf@H~pP_oS#97L -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 -e5qzpEN#yNWni8rK9l?L -ywQLb9!N&%PSUcT6c5X&oh!1%ao@-hEVxXE{bNc&+MhagI2o+o-w(^GC?%lSkOQ}n){tJtMU?B8(uK_wXsLQg61FVNXV*4AaSVM3=fC41Z;?Zx@8ijow@aK7I@xm -BON7aGWJ0(vA{q`EeITACgcZ8FTv`1{Kf6IotQxcD5e_ZS-;E?17%!k+EA7zZ}44(oEIw^C>aH3_Q8g -#!>^n(552DhrqI|~odyg=o+*o?YQVhG#>haz)Fq7=`3g|qz#*IAY}B{*9r|v&k4U2Z}t)_e697rbtGc;b+($BX5BDFizsR4Nl -?RZScY$pV}b`Z4_!$m*&WB&^b16y>I;1y<8FD(BIjWp1Z(;bi}uTxm`z$|aEVTMdK3mYtQUU-6<&!i}>RR -%ptU88_kdK5>Jbsa_YIO_h~Mdc84V1XQ5+O8vfC;x_MzL1<##rFKYG7ra?^~7I}ozGvVqm6Q^N3$}NYr-O}ZXxFQ`XHxApf)L -UP(6+nhESM;@C-Ccbh=WFGtF83mwqK$jqE4XPtbabn`YoDC{axqy#FPfgxXo%d2+*6|`KsfXBbC_=2T -~JtneLdQWMlfkLdJW%R%qP(_ofaj>X8;b1Jg~B5J#Mc|k?|8d(_T8N4_;B7fn*q+3A=t1LF -`uqSMn7LvDzP-UN*b-I9s@}mCObRi&Svt83EFF7L4TP*ULuf?SU9fI*1Ts{tcj+szJ$iSe0@u07Z -S{*CDx_}tLtmsW$82SH<+RX?1g$d*N+4iTAj86cU#Mc4>mV_5CF=)RU}^@UL_z=*L~jz=EhdZ^p!;0a -vRe_{p5@%K%81C+P~JfJG7D3!qwN3gncbSBo3U0GtI!xt!$V5Wr2iAsZ@<>>G3)S+K&4i -*?!H438@pPQ1cp8d1y>~dbrt0>@@u6^7{_#1)Xjmk_`p>Rt9iP$s!4&m>8?k3~E0Q1fTyWM*QQagdK8 -iFW}@X9r>uVJTyHUNPf4o4)&ZJ95dm#S-g#vY{bTuENvE^!FkP8iK-q%X0?pP0ar?BNXz&~lf`?U6Az>~o)7a@CtiPr(ZklkbD}-jZXA1%Mm94s;{Nmu< -CCHLLwRR{&?TcQ6|shRzS=9w^dc?M24i34VQ*=^`ja*6P|yZ2#R%w7ga5(Ib)B43%5~^-QNo@xDw7#s -JQ9l*10NNW`7~GC4;js0Zjkrf -Or?A!KfY{Lu;XZ2nPyhcw#$_Or@8}YY-dMc^h6K5C5nkPEAkLbGo6j?~sW%|DxM%(D-W~cDhZ{5KYlJ -q;X7cBA}UkNj&y}*!`xE-z60H6fhShU}@>})nCZSR`enp9zZXG_I;Sb_7>N=BhXu|pNw3J(I5dSZDx+ -Dz(;b_>fHR>`!jY8i_~`a;^|?i~`2<7f)~`mw~IT0A5c1{39sho@9|H7_Ol7~1~H(;7ubG)w@v@RrNt -nx^$tG2Vm1z8wt#kSq=407IXiC1qCM^{fib@?`ij_BL)0U#Rw~coNqw#x(}u(}9W>=Jct@aGHX8GUTS4oO{$)+3lH}frb~ -bAJ)0%FZc;~71Ygf{JUYA>T)>wz$G$~4qd*Z@?_}$n9VgHNvNHks@*B?zXaGxPOv)EBz;p*)4E!kNP1 -AQ3Y)xZ~E`AFmfmPLc`4U8!l-B0cs)rWNov8b?>c-L2G5lBcKjsvkl}eCI)e%)?_lAtW=@b6)Q=4d3A;5A -7RZ~a7t(#E3~mDduNxarHl9S6lj1y?L|5qq_)rCpkO*Oy%%(7eF{w)0pBf$xJ8>tL@L{QI&;jE9o}gH -+fQbRcYDaP5_}^`@bEK3hl@*1IE#0`=YG5H)I=~}sy9x%IOek1mhJ<*N=I*`v*iON$JP%n!w=FJsh+1 -ajF-XPdcZ5AQxTvusBWgFcM3jj_m!?D&z-#!tma2M|BBh`;{4vGiMDG=7wPop$3D)S9v*Nd`uw#bw1hWStfUC$p8VOCDl2S4KEX^9a%HaB ->vs0t#G-O -palkp~@@cf<+%_SVwVec7~dY1U1*2Qo=N>gsC&>PA2psIn{T>Fi>Hl%4kuWvY1h7nG6?fZX@6%?%-o1 -6n<&BBw)d4L|EIIq6Y>Z!>3*bc}-?C5nGvrZ-tJublXk3l_ZVuY?XM8M5wiR)T&oxzo-|7iBS3{UOJ4 -UNvf!VL}7+)1kI4kg;p6yB#aD&I|G|>9y@FtJ4f=zQUc|>89v)_R=1J-A~lvk(Lk-dTAcZNfuQTsIx<{EI(5x)f -NOGYAZUwMEK=+e(fPWmAqCiBv@?v0}Tw{bF9gfTa9L+q-+Odro6Zz+f-{2J^ -`?L+uRZg4K+Flk&}1V-7Af_sz+}S8_qX9ChRbwopFq!SezdGZji$kM7ZDtzTOPpw4LaMNddF4Z$1l^78RIn|3MqGxZxu`-d`*M&E^cNVO^@S3KZdL1vLgL$k&K}NRKR*(5)U?mq_Y6eK!noS!2Z!x{I$T43BQ|d*})8w0 -`7yz!qWY9Sz!rJ+-3B5*VieTtI$O>Z-Jgh>n3yr4dM^W$sixA9C%;dLnct0*XcS!n@%w`J5lbtaSae~ -eUDSN*dLhbrY>yGhd0JR64R%*d2}7XW8QT6>~J}~0aTr4Z*FL?VHO?uB?_Ns7+-5din9gA3qZ;TutM~ -?rzbAa8jdhP4r8@_>E~dX&6D$g5oD--V`PSL`aT_ZH=06T^xzPR6|32c91l;#zQU22!z28SGWJHn7HS -vVz1da@#>oOB@adc0$bUHF*O=mrJSV+v+gdl2uBb7QY|DsK56lS7a?%0(fcMwI`n9!Q_5W6L_i#-k+R -%}KEP+&?H~@d$q0EwK6qmxXd@A{A4)sXZyhutZd3qf!mxg;xn62w&F8!(5F^2!)mJQq6@Ltm;2T=t*P -iSCyVL2gv%>05mf;6$CKuKVA(aL&Tbi44E#A?Z>HH76|hr>rf*!#RV0w;>}TqV-fqo{4Tjo>n9l!m{B -x?93W2sKMPgvlQsx~{5ti4Qn;m%WbY3WZ^rAz(fteB-XV8fE}L*D?g!N)HS#FF+d=a8WIEq+!plhVq*nOX#uqpvdt6Dk!@3ucbO`B!hED(nkZ{Tfz1J0S>M#RGr41UlS%gd?B -#?~>sCM(5UqdiQ7iDD@w;YDJR3txs(p!_!XKZ=eB-#`29YWa|q_inaf3-B_Hqu9F78^QEbLM2VYWFWp>ti=(Z;4E3^T$bJprBEP!xmx9lJbPo9{f9VAda!>XzYwtFE}Czf3W<)cZv^B -y@=0D^ZZ#Lr;A1-wzg}c#ziGekxM4S>eeUXxl>8%mIzo) -#QB0N#86;xPqnKQhoWT5~!xRDgj32x_XS4N|iKigN!HZT~m-Htlp@8}9oy<$408R5WY*dP=nt;Eo+>^ -BS^S%NchswhnimZeO8&(*R6o!vB(`Z5_&fApkx{?k$KQTy*nd$`m7_NWzJ4|S1^PT -oQhcZvwWF5rukJcbZ+-J9{u)7(pu=E2(p?7SnYvE|lS?8m+8nS{J -Wvxwe$?E%W*$ckq3}8s1F@KY2tmy3yngX~_lIYD1`{~HsPr2|=-_DNS}v9=Y~yiJ-JO-7>Q}?UprK7Phei9b-_ --%>@8NcEO3HeLT%)v;2eQtOe@*B!$j^#?zqDJ8F0^S*68$#dGvBjv;K^qYw&qx3`1v(fY>YFaGPxufG -0!Sl2dbe{^k=!HEHW_IC8^yYVE;r@zgL`QrVD^X11?eLp*f-q-j2>^O8+U8yFNJVIfZ-#9PGMQ$csSa -+48wV$XTF<{qpTtoQ; -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 -Dt1%a;_l9SB6ckD4D+?8AyyGq7a9{T;D@4erI -;RBjfmo>wyXhWe^2r4w+q -i~d?4za_LR0~3}J_wKDk%a>QQE5*E0UuJ|`p05MLw(?Hl-p%KM#zzS$ceqbD@d(dIk+(C%SbBE1@ji+ -+VTU&pY46S^LqdA_+Q^WKioUs{ch*gK`bd^RSCcRbA4*AJh4*)Xtk=K$Uq6gbo;eFeLjE9Eb3?Qm#uk -lt404^Qtf23w%kX&Rqwui{_kv<8XEq;Bgic^wF*nMAv#t^6edfTfsoM`9WVmS6^yJH#c#3SMbBcL*jn -A)isz-X29uIxFzbO0?5AZA_usIQ(=rw5b;GwM$%4>(v6m*dW`)Ck4aIr$3PLh#$19|o}@0zr{4W|-@Kd -Si{u>hyg1*P%_BvsfIHTcd#H-^WEj2}SJJviW92Q5sE4-HwprHs)YK$U?-F0*pSKBpDEguce64bplY6vQ!MO+mKdrzME*-!HaX~yGU+m>gj{c -UR0kF_aFLOd{2O^#g+fg+sT3jRLvqof!`|%*pF&=(QM)sCD5z7T#&S9&<(Y{TR2^jZ!rv`d)$Boh@cd -<(&WP%Dh1ti!c9+WHH8=U}*{{u1cXOz>iTQ)=Q0O)!xM5=IOL@&fdft3lt)5P?7}QVZbvF9*SKEvkY4(5@C -Uw{`XI@(04C_2rjQU~V^@QKGzj9$y}egKscuOHj60$V3n_$XjP2~EFFc)0`me-H~Az1miur{+2>rl;L=o-9L{x~1_iV0d -(f(#O6Yj6iVYf)lf_*MD?=@~Cb8fBGf-?`!yV2)_>L*Wr;l6;NTZu4l3iZ3aW=`4zPO3R>SwvgHq)zh -Qpebr~pL`o^lHwoPUIZb0FId2$9ZA;)j$lkr|QAI+EFCs5oU;?$#$MkEi<%%x>c@?;uhgJO#2o*30S|&^P3DciMNeLCrTF1C)S7Qxa=ih6><+(s8nnXZH`-Ru!UEPaBrt{?Dtq0H -8Ldd^ovElH?i5s@jwCkS2n(ZGzzOTh3Rcby@v%RH$7nl*UlYnDjpmI4O0J-v_bi=DVSKWY1r$NKn8Bz -sD5{B1SuGnzK6;n>TE|oGxE+6*Z^s^)QxS!Fl&9x`yujt9v{eHiB+5e^4^vKp~R -SEa2S&Y)CB|Pp;QKwje+JlZaA<;id!yLn}Ns&(RJ#FXAaZK|1`bdqqaXVXp%N<03VbI4KVz;s)$d5Hb -gmK7531+cWOBEFVG@0N-o~6T{JU8bS9*iA5V-le|#Kna(Vd_YQAF@Cj42cg&zeWH3=nRZkA7M^ZE|Z1e(+3kBX4}k@{lH-vi6wAuaOwGZ} -^Ie_*g2^(xT}p~gYjQLl1RT3f|WtqV9*p!16GHC`G-AyFbVd@j*#xKAyne>SQXI%2vKRfmL!DV-sCX# -{c?(t{uO1<}Y`{gvSoQP5axp!LP0S|x!tu!IS&3BGXqXJr#_&ec(PQdG^@n^@6aWAK2mly|Wk_Hi2aRR{000F8000;O003}la4%nWWo~3 -|axZdaEp}yYWN&gVaCvo7!EVAZ488X&Ja$Mr(Ms%y#Aob;P!zx|9wDugfI!;E&q>o#X)K4-ao%&DpG% -j%a{)SE&=C2@6!z4QVQaemgg9LTnW8wML)b92?sYiTdhg>`j^`set1l>(YRI5cWmyzQY~bp3i?Uo7z^ -iv;gIs*Y+!`EKH?+sj)%^pu2ZP%F42j*MOn6pTh&CI_jnFPgzyLDmOtj9^L?c+d38#Y{Ff+=JMalUt)3Y*`#}9XBaHYHZtzY}1KZxBqlnuu)3ISSi? -SKqwXUC?y6eUmLVCPENb_R>Io`KA%@6aW -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 -|N}c2P&~8G)B(tvfX+;QLvA)o%v(>VB*y3HKJ -??nlpaj~^#gom8T7>3_=16U^>SS(CZ!3mgGqol3s?wz1o&v}F(s}lWelbDJXH^pZ6bh!72c7#rEI!Vy -Xn-EXc|1GNl5{6O6GT>c3Ra3bJT2co!w5C%w04C&C%-LzpA)U^`M>htPJf?%sVLtgUP)h>@6aWAK2mly|Wk{J=O#x8m(=qj)%1fNIbCan%RcxivJ%63#H0|YiI1~w4tSOQuNZWdE? -tj1C1wewIlI3_Z5drKj7K_DV@xkSAIQ*OiVUPt}uvMJ0#}uBUJLbhcXW81#Sei$I#Sy#SW^4F4W^UxO -x5MFZFnGmI<7Ar#ck7H<-iRH)e)IZ!`0oeyfk%J3n*gwQ##0eTgI553&C^XFL;z$0!PY$G%PqT0-6-S -!n5|OIS-fK2+D-5Hm}N0kwPgw6vv`@gL4>Tiz+AEgasZpHfslw-*`u3s;>;By_5v3uGC%h64UaN6!x~ -pX2yL{oHD|+x!WfRI8lSr%&;xd{R2Q}-0*hLZ)Phhz3-cJt}#^9=) -t`Q-BE4|esDO)mdn|Cn8#joI|~>-luCU{`Y>HoLe!pG_fmc6oaK`D}LiEBgSLmsdCJe0DLr0kSt&RHY -&|n=X*t#dLo936hf!v-8=_A7dc(advZwbU$9r*@RtB<~Os`&*zglyZ$`CzFJIyg)<<0IlKHghkB+L)5 -{wh>V-Tu{S6Xq@o92?j+Ftm$!BQ89JyqtSJ!{cXTN^BVV|zf&!&+1VG7($KAcZwWze+K^U3UD%+4kkl -V7KVbp>>=g$O8lWM4i_F%#>Yz`xU*+0`XB=Je|FW)8_Qv~_+{Ab*)Hreijl&lV__kMpYwY$gg8aIT09 -U|voo9Ta-CZvX_-pBK}DBs-f<&Vkwjk!3?QxIGxGQczjPS>;)ta>rr81~maRPQ)P$4@ag41C_tZBQJ~ -NQ0R;REKMaN24!@!IMr#fEsC;j!o^_VIBpJuIEC6y*sx)=*iTE9^-Dt5&yLf(pND|<0Og>g67P-u=C% -DA>>;%0v*4>dBvT47TTpQ~6`Uz}811VSm_1Z<)Ny-o{l_to0M2YpGKg03*Vnh~`I_qx|BPMIvDTaiY`LTSwrdla0zMNjmIzD<(q^92X_{=kp -Z|yO4u6TQJ?Mj27v?l*5>enBui4&eCla7Km8CTcc5t$)7x)Wb6vGa|N@?G)?2Qit-91^gT$ZlDShxO* -u(gKfc?G){k#%w0s`2-(digEL`7rz<03F!i>?2P!a*3XX4l03iMK>EyD4PZV`fFhV38~G7<2riAw|If -IEuA&w1@RRNZ-F1F7S6f*uk9HZ -URu)+sTbgLWlAx|%wQM)Fw@37Xd?cYcz3)+1G+F869W@msyxhapdkqdl5zOJt&u?*EzxxW-vs`-I2c)e7lJ1SJ{Qax%zcOhU!a?-M2%o~;A?{Us!>V#CVnV@e3V&`zyx -F0##5+S2NjT($uSzy7#)*Ld4Mg$BLQqfYSfof21N&6fJf$ENPQ|hb4M>ir-a~hNBr^RGL9;pn!~hd8A -K)PBfFqdZG<_u7oMhJu&1j3w%*&Nby$hpXysIl;*U&2amVTt{!Cd8&pxp)q_Xe)&)moBvasM=1XE142FPZTj(=DPt$; -wxq%#G4U)*~ZFQg(gY}tX4b_0gn|#0=tcOOQ%rBDdgR!Xi;PHqx_l`+NjlKSHiBN6SW$$#62O!<%ZXn -GELA5Y~e@$!9f~l)&HbawEuzMSswpQ&D -PQf;dN&~`xq0p0YI3Rvb9>Ep*Iri#hM77Y#c;_b_Brh#g)DCJ8VgbreawyAcY)VDV&(Er`K;^AG1{u` -9KoU!`OvKSR`k9$S!f~VFQ(;D@@eT6EC)=>>uP7P#D708VK6RQtKkxO^|SJiw1QKT4;q5tJCB0)S#*` -_fh;9sbVxE|NcLtHgqtJZlleiG5Z@V97Ciej0(~0>3lSO1x$;sR_gp(vif&6w1@D&#)ZWr)@U$<&RT^ -b4ceSTpI1{^2li`w9b?j_y5)o6WwyInZB+mUcXf`DaNRTA)!2p$+1>iGtr}Ljb^qYo7Kbi%1HqXbWmI -epX+%h62Y(*aC5khKmFU54iqvpc5aszTp?yvd*4H>9Txb}QX>F^qWO!yHD_*NKp~_`2gkQGE=<`4X5$ -*(f+@e8Y_@T9RsU!>kw>e==YfgZUlyc$2lw-E7t!kLm#8MeKfp8MnyLaz;dO({_{F_S}S(<~|2XcQC! -F}D;v_?@R?Q)&|1;990d#qrA*D>wjf;7P(rYUaUiiCSi8f`&lu|QVl@vZ%i0hb&t?Yke0#jnYrYUJ7# -g?HM~Yvj7&$OYHUP)Y>FO_g4G%;Nbw{fFa?VuDJBZ;o6PobhkDK*03(OlU@J$RFo#{MmB2J -o6LFq;%894eAUT1i$Q4E2VBi!p;7R)&s(o8yswIVxEFstY*rB(eownH(y5p5Z5aa(v&S>0ZP@EVf;1-Ru -eTyGuc5qh>|>$OAf`GT!EO3rtYItz{!VBYEWO)LJn+67tY2_`o*LG@TY?WXrK4!BTy{L|7C7oKK7$8+ -wse%Wfy+xMt6LN44(=h`Orm*8xvRyNjbQ}U^!H4ns;Q@sep(Rem8YL_u9x7=LTJvVjc1)=dV1@2t5g4 -kxl)I`S>7*QyWSh7@q}C&jOD$&V2UbFyyqY*vTq_pM#^TQT6klsFFX8T&DIwfBJ@s@ULLUs89g --(@ny`t#B^e-(xmvkY>`Pt#(){e3&h5gZ1KQ72G9w;6s+~l+xES-HwoKQ?5jwY#n@VgY%ag=Pr_?8=m -nOer(KY19$v3X^f&_-gNWeH4j@qNJmbW_P7CU7)D0*mdkcn1X`g@KPXWYK}T2^~Bm%M ->nVPJ_9N72pwBmGDg^hX@kT4nlZ}S0(hJl0$?DsErW9e!982Uhwomc3U%txm!&2l1<5`vn7!xYT>zs==3m*9yz5P-A8>@7?{1%zptujcK;$JUB!`7#*f95A`o}XK^k?#g -@Co-GFIAiA=4k?iZ&Tg{mrUtcXnUZ?{3-c)b~6M!H&u48c6G9GwmnRcCuZAP#AI!?<2`^t=~&hLuisR --A%HOSZ`Smmub9=v(j0qB^6_4ZX2zqO_(O0;kL*OH9^QkpX;LVMQxh<{o;IneOgX*icmS#-Qs;U-)E0 -OJ4E%#yM>8r -Y5P#)4&HzVZ%ZToIyu?=LKJNpu2C{+M=aEn?-1H5h`k9!P0nkSmLtyIq&4CMLBNp&l!p>@O2pq(!&)r -<{C#_1*fRlQ{AV0Q2cnwr&&3re?gMf2=p{Ah(ZO{Wdq0I$-yh9M!dyHbH;)diR3RQ(Z3+u(+{}JHDoGa> -De3k=+^o>$=VIoSiE;0?3NUIof;MV?e6~^{frw{e>>Z2_5bow6>p|$Iyq}Mq;?1<+Vdsdtt^;RiMm)=%Iyi0G3wNM+0oq -C&cFi#@;W}2($RdrWo?ytRo7biSwS3q4w=NTWk|6%AL0p6j*J4oP>f&UT$c+iWTdko;M>c0aYppG?-L --6l-mZb5M+KPWJ_FNSo(()@3+F5|t8@epW4iad8&iKj&Z=dYPCpYrL13Lm~&ACtPyp)bS4Y^KZj|*{N -+W`A%`w~WIJN<OUIy(8yh)y|U)soTLWsKSn^4m2I}7m -G@>?|U+fbqwemkaKiobXX0o=2F5&p~gKXtt|e<6*}5nWV#sTj#_zRXeqRLUX69}b#<0Llxw8|BF%*x< -d^XWwUZqZ@hK7g4~ubL%X(cqMWde!KtL&13)_gp`=a2`87*_xnt`LY_k?#&it_V -8y#5=Y-~^HUS7d$cllf0q`-sgKrM)JfIRp^t#;g|Xmk@IVeFfbST;1h?ChEz!HiLWivO9Sjovz|kO)c -MOLP2A@A3wDR=~h^n-Aj|c_d91@z)?lDmwLVdeoVH|8#M@Ct&|KOM-5>DUcb)UV?(>fHchlM?LuB337 -+LieIn%BeWvz5>6%*liQ_;o$o$^2A!td%{X%#nnqXcMdErov<(-0v&0v4@E*RtCSOA -BecKv=i1YHjER?iyF}-bnP`&Pt{?(p%dM5_))I7E)W;yFgTsh$PMlS3FVV51XFM(>;B9WfgMAeP_uSb -M&G-gNCZhTP9kdKlndM@c7-9A&r@ry -E{vCMs6bQ#A<8$Es!a$s^w`z{D8k3C2AJu#78HrDCR8#y+F+(}$}aT5^&jxUgoC%PG58L>Yx|T9RQF# -(?-~6shfNj33bLj#2r?VVSfc^{0MR;@$%E&Hp}VBFWc6cD{Tc+{cx_hfMq3Lz9k+p1iPH$ --5%hy>W3OPe`pnQ|Y^35MpPxUKOd9;l4$ai$)5KCn=8BhhXvpt&H9Eq#m13OWHZZ0T^b75&=6}+xZVy -M6-UMQNiVUa|il^rOZH$znqZiTJXy1`)!f34k7Z)yok|CK=rMlTRTMD<`dO3 -9DmNW$E|%5mrx!gHBB@;?uPCfH7l%)&G@eGNzjgtoe43J}0Tou#Rq1W=GhMNkp7=>2g3 -p?BO0vo$iYl(Fi@kgY@vU4dc5TG33yR>zdKtp^PNYB+|;>&DYSHQdq?cB3koHVc48>z;3gg|B`8?f$X -N-T@uoCLn?^^cl-2D9CPn1=dC(po?R>2uP?l{4fyNZhQ%4;y(oZ5u0VoPU;M5I3NwNbZ9`!Ms&l=aub -8N?na~-JL?>NXtHXUYAI0vqzrQArjr_k7sp<#5Q_k-_Fnw&+3o@<{6z*fFMp`3t -(N&u*z!`CHN^Wu(f4o6MO)sAK^YiNZ;cKE{7)G=DoB>*o{Y*CMA7KZ`&wPujePz@K?hAZfI(0R0ni!%pG_`Q8Z-QX2Mkc4U>q(yH_ -_V{g_g>Px>{mZ*#@O|*0P0zIQ1d_>+4(76c;LJE%Viw1s!Pl>T7U2YUpI~axz{P!)Ulx@%E~XFNcp2d -t_>DML`YSEp=6AR&}{YWoa+KP}%2c<6fFr*t+Ey{ZwR@g=E-5azKmnoXYWytV+4saH%yx#hmz?o8AdI -5#p2Tfm%2u3EGgt$f{#k>N1*paAgLKUA4Wep3WM~Nq|3b&oRQ)$vqtX+A~NW0ZjX!a@wr1vP4a3W0oy -jqW8!+c&(AKbcnnxu|^FPSO?+l299N!=qyy>vFT$HY1Y+D^0Oo0;^QTkbV`16jj6h_IJ_$v&+V50p`8n_Mvz@`((Ed -^~#JQXi6YaL3eA^zhk{-r9RTXP0?RS(r*zOUs?u5?L}zl5J)5=NIw0N5$p{*n?tY3=I;PL$Y3jK@dZ^ -T{6NhQ79F;Vf`|{VW27l4r9(o{PBB{Z9^_G%H0g~9E#X)?_Z;v6+*a&Lf5@H!aq*E+ORsdeHnT!>M++%PiTnCVkjuE -ou6W1P*jENUycAY89;AjQI2Z@bPY7J%xq0YV{-;J?KY|WE4+cgWS|L8nN7)pff3}tSiISqzZ8m~8gWI -=l+qFPc#Kk< -L4&Lt1&0Z^3;@*NQz37Tm2`8K5l`k6B*=mlZy-^F(Rw@?FLr`Zyy@r*CM~xa!#*;H(HK>d$t@vzje!r -2rgqKRL7$_$k=!j -sf`+`T%tEroj#6@$S2wD`G%nUG7m5a;G=Fa{={2Vu_Nct6E*XeKK;&_*qlbeX7^5`t1 -uVq`mBq208a+81eFXmmnepWBsHAcS3O1&%rgO6=H8+5B**e}Tn<5;H|Zo$Me856JB_bP;k_G`9?N6uC -c?u16O2;`>#X1|;{HjwZ2vN!TwhP;&SbHe{d$QXd0Esi5#))FpC@WT`h0yhxtT5ux$81XsOJ{9hc!Z~DwYg?lB#bqq?WU^Lc_qpbYy1X6LdHEL*)gA;@S@8tHU*NWn5O -E7QUSd>7UA&kvgz{jLW(tbR+sU!+Ua>mU!i!1wMCCeZabI+BWbrm5uUs1KLhoL78&Z$gNt4gANVup#tHB;CfYLm~sSZ+(B2&ILa -0iPK^5vkUIB~ZzR+{;#h%lCicp9E8)RE&*f#V!ieJz6C*V{tiE*C-9`;{JUtAh*oG^u)Eh%P;1q9s0f -!84l40%Oz^0s$Op864GpsRrC5%*rWWwSXE5Bl}beS6+e|D^ZgUVX`1x(I#yGq>9LoBRR)<)_2Mv-PV0 -oS?G6SXbX)cAOdqJe#%2raLD9CAL6GNRK!~WP65V9E|z>m?6aBo7Qg7BV<@jd0d>%Eyh)VMhH3RXc3L -r^&+kIDuY+wLE1saJ%7h^W`Vt84Oj6MCBnh|r!yrZDlaPh9LnEtQL -a47UwV3hd2WP6!FNSI1MaitvZ(Sm1lGS3fZ(~g;99EDk?t!k6>DS<*?0Z4bUSn`+r>a%gEh6m}KN_3UvJR -w+B_&X1v#zV1VX4(OK#WG!Y>KY=DE)6Pt0K8y8H~ye1DvuBX=wL*t{G;q$v6-Vg>M6H;-75yKSA2+!> -8k3X_s=A7d6_!Dvmux04(sBJ_L6!~%>*M#G3xlz+D>N2~CC&H+N(JF$cmhT9lr41swoXfXNDqfPtfWHy8>IpXjT5B{u5m|E}L~ek*WiIbMma)9mcL{l=RGbyGSm~#P=EW71SNH5gWp>;2*OxiL7U_(ODAb4Bd7%!1oQPsgC52!4c~G~8=yy0k*O`dfM;4oWdZ3@x254ng~_0RQEdUXhpl^2#qD4Dp@wpJ)FyE -{V>UbNYfzoV%cU)X8l8^cdki9sEIvm6h$Lfv4TCI7O^yuTxUmP73T;wk-zqLFj|Tq_P)h>@6aWAK2ml -y|Wk`1hg2n;?001-s001HY003}la4%nWWo~3|axY(PVRCC_a%^d0FJE72ZfSI1UoLQYjZiyo!!Qipa| -!|->;QodP#|N6E}gmyicPmdB~hSgCqdD>SGEbg_;7SGF17phYc4i6 -;nHQHzr^mqC?f~>{;3PaNV}TeKONBvT>S_+4i`!o4vW7pg|wy3b#`jMtJ8D8~DVLZ4%q -TnL;BuR1)JH;6>PE(U{a7RdF0h3Ykj6Hn#hUswS1zJ#|{cvCJN0S7c3JuV3;X;Qv7j>B9lDv0qS20|X -QR000O87>8v@E)(3O#svTXiw^(*ApigXaA|NaUv_0~WN&gWUu|J>Yh`k5X<{#JVRCC_a&ssU13evtqA4;+3F72vZQE=wm_B%j6^wHWKtt(JI2!gzB`hVB}YZSOh8~tyf@xG_waH6& -z?MkLX|=;j$vi1XRqi>G?`3JrRBQO+``-WTX^x^OW<-Xw316MEi9S7d_4`8a0an#YEHRlcF)78K(NA~(wu{_8Y?`7THJAnkFxLMDJTu`M#vXOF_k-t@|g};RN -~P7Zvj(m8v9m|~zTl08QztXmT4`@WRJ#JtVDdLxvx(oK=Ky|l*5D|63AfD9d0?r^Rn4bxv$8z?WXygB{!#~d1lB62b86k%M-G_PG?K8e<`fZGB^FMVShwk1wj;E8 -y)$gmPWWJgb@ND?I}Ix0d{%qTWW2^(Q=`w>1qQor*<0*0L*1ETpk^?yGh0VSvrR)cKqwKhsU?)FiI(B -XZBuIWb=Mqxwh<8bQR;P+ND6g^kSGML$0&TGJrTn;kzIf~E|fd^?D`N7!4!6&=pTa%<|*En$&lLQLx; -OHc;@KdHa#$50OrH~x*IK4*vb=yc0)C41}(zXCH&^wR*LN)F}2*UpMdG!(&wYp(7)?T>wVtShqZT0$w -c6{(@6csfy22L*Df4mizyK`YXXXmQq?=_Q#(#v)5PQm2}Z(;L1F}$wuO2M4E)b@ImcCv1RE`n}-0F*^ -eR0B(H3|n9yI>nQ-vx|@O*C_1*_yu{5Y3v1h`B|y@qVek!i~WoZ61L6>bZ&K~Sm{@nR(n=I0MZ22aP2 -B@2A-Y(N_{*;G?{*WUF)<&LWh@0tG<&l%%i91|Ys5)0wg%qE{Q;7eH({y(kc-W7?I(wAey~O7o+P+wVH^@Oq -7C`h-^EHwOHYID-fE5M8e2{y|H#ylssJ94CChj7c(B$UMvu5>*XQK2TGqRV4bz$#E&qjoh*Q)Rw*E;F -W+aF8CbMlhExxa4@@=03F~nfA%2Rrdjf>7@wc?CiZ>QI_%o?-@Eu`~*>VdD@xcW~*3x_%~Hh*#dKpT@%+_dDPAhB$f}B=`1WqJH;E8I43uf2yM6_`ST6N -iUokU5hva<9)3KB7t7_cwyq6u>p;8Ix?KKi3zpa4Y30l?7=kszhZ5-Vbzq#G^U^Y{d3S9+=}BkMFx)_ -A*qwVLGtsydcU$?w9prtjo<#!7vwX4ilhx99jgPiK(d$hY2S+1>XMq}d8rEbFOL7_wuiXu_E3J%r$cn -QM(O?sN=AJ5%cKXL)0RFNMEW04O9KQH0000802qg5NKODQP_6&~04@Ol03-ka0B~t=FJE?LZe(wAFJo -b2Xk}w>Zgg^QY%gD5X>MtBUtcb8d2NqD4uUWcMfW|$q#JgPZrqt@hzk=v1DVtT8lclmi^SVo1QHi)|9 -gM(M{8Z8ZK-6RgnMv9U`cTIiKIqLMyV%u1TFz#{6OMOsf7oybJwoj$)%RZ1U>r(JPs5?z7UPlTC1wUF -=MGJI74w0XW@Yo*%uknfUaK%WpZ)sg>7e8ni;=IVvZK!V2(#~DwO&SFq2>iB-^V0XI2AW7}CCRUC=77 -fAsrqj@1`XO9KQH0000802qg5NZM3Jr2_&004N0j03ZMW0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD -9ZDcNRd4*F=Z=5g?z4I$v<$#e^&V3~gX;L+ZbX7H*vt_|7SOwd)O``VKcl^b&P10}y&%Bv=^PZ8j(bk -hm4}(-gRh_J!iIIl!XHdPiL?(cRUkfzX`%0M8vbC$%cWi_JfHPV-$Yh+s22nyx$FU5TS-TtqSFP3`Jx#s1@dX-|#gxY&@u)#u`hACTpw -OY=gJrfml1}1f?S9ZNaYEih`WTm||26M@6aWAK2mly|Wk~UmbX@ra003kV001KZ003}la4%nWWo~3|axY_HV`yb# -Z*FvQZ)`7NWMOc0WpXZXd7W2LYveW%e&1gqE|m3##Uxyx0{hVBa@RsB2i@ZyN-$(z-E80zkb`Vw`~3C>9?o-)B3N?%DGfsM-MY&{f%k{I_vfJC2OP2x%++ymoM9Q{|cDTvIhGYN1 -9c{Ye?fib3(nA5WiDd{9t;78)*hJYla^#=B66z#Hw7`@^<8TJf?GljLC^f?d#wm+y7u|0s&Y>#9?O+n -o#-MaM%5?IXRpP^k58?g~G-tdw&Dl2t%wlf42T0zd(r4tZs+m=Yj@mggVFLjCgQ-Pf*3Qirh9joG^H8 -QywQ-IYU^PHRP~ND{lVPE0ACgxL+wIu;%hP`SFi&1pge7* -;9N3wfS^B&4x?Q3EQx$VtJQ)yVmV;fwNxVKJDahf5!?DkL|rTxUEoY))D=$PNo5=RT92Y2G&2j3ApuH -%pzWD?yd#vgmx%`HO<3y;Bw56T747n4mF;%QayQ#GWL5Lh+FEIFX;ZG_XMYp9#(}zoX9K%Fg@+d-Na& -Y5=XFM}gb<5as?P47&&^8EL3(&_GHuHcnIc=l9_u8)c!ks9bp+x{%{b2w_PHwX)H!I^+d$Ojv`IkXQ7 -$qD~v3y^cdaG*cDyk>tj5+Zw|Cc=zL63^(jMuyczUI`LPa4O?7O4VYT&%o;hh&^$OEn$ -ri2Y}kghza3RBi*i){?3FMJdUHx4Hzx}T$@ypvtRK>V6imjmdJpf7mmSUzp+!h7#Bi=Vx@JV4Sxq`ZSFvdn7&6gixsTBmk!i=M+svU|g}DY+;TexCwd(s8)b|*$f*4v6qYnA6&6xZO+1#DPy)bj!!-gLGf@AI2zX@Bn**@>ySpE-(P-E#)K!B7-koPymKsV& -f12hTA@Fg7ljpp&K?bzDtb$TiSVk-?^1N#*Z~3@Y$-d4KMT-bCDc)4PQ~`P6R}&qkAMfr1!dSi_mjrx -2XF>9mOq^)_lg(tQ6tiyFV>qLz;|y)atLZGBPqr6Zcb+6b4uAkaa&?VY^?i40DUOp#FU|F-K7)DgdSf ->1Fr@(;_{TF0eIa-`aMph*_#QP_2Vns}QhUyJU7DqZ?6JI4ueP!@V&m --XjEN{4`11b$f*W0XF9(Q^=y8v@5~{}VECB!j76SkPApigXaA|NaUv_0 -~WN&gWV_{=xWn*t{baHQOFJob2Xk{*Nd7V+cZi6ro-u)COCL*OgK%@-)St3PIhwjL=kKo4G$Ua&{QQp -00NCPYttp^a?eZS7KOuW?yN-BQ(_YYJAkFPtZd;rt578`VA+;P~51*C0_mFz5mi6DXMfKrPnD+J>n8f -<(xgEoqccQTv{k+Db>d~;h(Y)tI~!QQKr5JFiQBRt87&q*a8e5^J?03TL^BT^pGR%#2%KA7UC!m&d-t)e2MMK_u@@eFA5&J_^k -j<{nz#rhqH)4Nyx11QY-O00;mWhh<245=-#T0001>0RR9Z0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K -%eV{dJ6VRSBVd6iGWN&`U*z0X$!yi}0Acq@1m^dhD7zD#FRjh)@ZBvZD3@3`(#3wm%4VR(7(R;G9(-3e>C=SmP`l!l!E&Np!f-eW=P1;a8W`t-U)9+8?SunFgm<|a^)1GkXS -R2KUg63B9rel0XYrgZ}*Nq7empD(m-DW#u|M4kKdGR1?57MU0hFu6Zutmv~q9YjhbZgg^QY%gPPZgg^QY;0w6E^v9(TI+AzHWL57e+5rQu-eP6?AU>?XTa^HP67l-n<7 -cCAAIhDmbkmB^{Pnu(Zl`kH!~z9Qjd+@76;q{iS;0d!+HK@s2~VtpLc@ol&Z4y`k3)-Th^)C<&srptw -h2$Wz8BX*d07&wfMCWQpso*z|1tqF)S;$+qBr)+gjMGm}jC$cx~@hnv2<{E^{Vwo@P;_(o8b*vf{NA3 -0GpRew*o0Ra!;sTOd)^QMA+?C&GOyB1gmv(97+(H-cKFS~)$_&K;+ydB5bp8 -zuM4=l{F$!8f8nKhb`VDRHvoFGL~OJu)=iy;@NaQ8WAFoc|A3Dr;|v#VB=E!(?5-ADanH7}^Ma)XdsS -5+vGksO%gPP=`1XRG{QaxbXhu}<7fKL8E|!cpYKO{xSi*{Gw`3sU8g4c<-{zuF3)q>@isgjCGN=9nCC<|4WSq2&?uYVD->O}Jjx -2{CJ;jv(X2*w|&N!#)I&L7sT2cw)DAl;cQ(56}cAgSd7^qX|sYwD~h>pYAzxn!MX88Lh -hue3LyQT_PwJ<2hz1$ZQwoa7t9Zo~tH0~|n%TIu~6W`#dc8EA%SN=8o|y^dY7ES^GCdUGF(N~L8H1|N -#-f$?iuW{tuPyaQLMf%hyc??e*ej$!3zGGNbW_nk+W_0G*jgcE8f&L`g-Q -WXuK{lCyu|5=v-?M87V+kva8aQqWJy>hw9lI7Fdg08+hyxMSM1dsTf~7}b3&|Li%C6NLcVq5dBi7MR@6G?rMRWzz6MoFegx^nQo-_oCRlxhXMTU#P!@=Y33|XL7}6v$7;1h -fa#8ztsw+&qSm@Q)pns&6Nz>FFz&q*JQ20@ouIv@SlbyoGjr`MvoZ>wgXl@z9E3){{aUc#fK(znE%7<`?Lxd*4;>)_s9%VF)IY;!IHgLTrCDvClH))aJbbsd67`x>(vmxSvKBvghC_gy3&(HZeJ$@8Ft$Co~g?(W@_xWA)okh={` -3{z>jiVapFn1Hq@ljLaHlYF*t4aW1xR+Ehai2=uSkd{-$BUk^YfNxQjGgS>-&`Q+FXgjz%UrW -b+TH`{RjzASIhL7R#N81-F#=F5)w!f`RX&{){8OWMHU#`13g&a$#mC;^ShH1J3PlcFpj7;iv -II|cxkd+u74E6ow|7stM9`5XFZh#G&~amfNZJun+$*AEp0QIYgq&K0)j-}9W`ulUxkPiY{IFWbjgXqr -b)WeaAnVRpda=ID2^cEBuMO5hSP&n>Exu)AYenNV|S0pFcq=s`@Dm`1QD@ofpk?->)K`f$V)(v3SKl? -*}NJ}G=(nq5MG$835F7QwGG@yN|y>_mLS?sfv*1f3}61*ClN&=%_@j_1hA?xKT&5O;VYt(h(z{s#aH3 -5;&$j#E+#bw)6I>3GnfWCL3h$7+fjNv}yYKFeZ}HnGc0RjeZH$DFDWRm_SXDvC?4ng8&d#!2Tj<9w4hT=ax~?ECKV -VvIGE<3bl#KdV9E2d3IQD;=diAyf}~=imgtgm(g)I+tqxQA|^n6qc~w>wa~EwjhwIqcn&z7gvo$e+P~D=8?-S7##Y#g*`@h0Ssl|mA7!&3N3pGI- -SftI_5VI$!d^JLiGi>EY>`rn+@V$6xpI@QJ%X2Kcn`B%Xa2w1#mvrA_!^EZ7_F)fgWO~fUh$Y>#CGGt*z%T2+K3q6hDG+oj`$ixX}>{*Jqqa*7h{GA$kc6L7;m`mQ7B@Etm&a#_? -s7De(3zLxpoMAmI-bk)_usofYX;Nd%OEYR(_XL}BVRHAd1R77&pKWMVR@sxGe~G-5g{(*)6s;)P0e90 -DT&Xr$Y5CN2%gv|KbWEyK`%gA#f -;D&tw#>IV_rPMW_?tveb_eK_=GwtgQ7WNEhhk;nM}<))AxDKn68k*tttG=+GK7@OWNmz7v3QD$MK5hD -W0{bQA$1$FV9q2#%)DT+;=W3;G20WA$S6SSm(wMwoqayxs+K@c4nW(^1Pe#&9%8kQ{MtykA1Vxqh4Jo -T;Wnlw6BHcE!-(mrDVS1|Ssv9C>`~JrRQ0-b2#tra2PTD58asEZ=czJQ?o75d4v0_*%t|0pNbYr=0tf -_n3Q_2ex22u+?r72_`UMRjoS|YSJz$UV4B#d9=n^p3o@04W+&Bbcc->35Z!oca8`Bflqby`p6x8Muq+&}BFFC7n&BR -MV$0b;`zod%a&#l+AYM>SIJ@U%RCDRezryZ@@JIA{N-PW(4`{L$~v1DJ)HBVaQYuLAXRlK`@jCVqOah -j6^LmMHtmprW7mK8-k&6CODO!fKWYK{W7}sb}-NtNode60zmUCnqwnIFB^BE{z4OhsxRI9v9(oHIor!DoJnYH?akk()BJ(9Hp+;xrO9a_D<=- -S$hD>{of5u*ucWeB5d -~}K}GK2LI5#YORNvORXfcDN>$WI{RLvdB}V%zo|q;L4xJz4AS0buonAl&8g5g?=Eqmv~&!K;&_7gv4T -B9x*aj;!wDr-(txo3UkoU$?le -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 -=Esx -zoC%XzjO3W-iI?%fVajZVN9K!vpI%Y!U5o -KN1Ew*-N27I>Agqxk|?UbrTsvYQFeFZ3z#b{&l<@~~bnF2Wpw+XxQit7$RELi4=}=L?rKMAFp_DcGaf -Ckvtn#1^IWW!<9%VPpnnWT%Afa|cQ+>r|t+#yZiH1<^70_)Erb#!EjBx1WcMIE5Fu(lli#n;H(RZo&C -3DcdqbMeL=5h2?{BlJ|tE*U5h0x(DT8*Pg;kTl+*%`=^t^tK)D -6YsKvX14ZPWygeF+Y8M|O4O?>MU=&&Y0G2%;eVR0UvT`^9o6) -gts(#cHO@T5UqyJc8gnK)V%ofbA`B)#jpZ_`FEglTmCe;oV-XhuNbjSvH$JNDXh;IED9q_aTqp@f9}X -gmVcuIBZDM@%EK&sqsLW8wkH-C_40PoVC`)eqO!gn%8@QVZ7Vn9PEgP5UG3hc~qNQ!|ivNQA2)tPpfXRhNfp5rf?3Q;k5VJ%>%ot{F1bc -)MnpP+2n=q^aOWGHWob09Wy{@ob=UVi)dYJLXs@<1p&2c^9{zdsIfxN)&vb}T>vcG;hG{MY+CVVJj=YA4}#zW7FFKPS|m=m6c^e(?fWQ -0C=5?i7f66ldldit3ijX=`&;-FQ}GmQ7&TF*cfjgwWn0UEN{{SD>-U^VMb5;=LX^@~k_VLa3?f`U8r% -BbOL0+1V=Td8+~yEI>6+iD&7YYbZ`Yf4XuC#)dNsK4nZzrI~nJvpXzvtHtFoU0=mjS%r3<_R4!!o9?_hnc@j`R(Ka}^+3(hys@Jrl -O!|!Go3$!Ag3H2gROQ5?Przs1kM~4;rAA)M#7UAe(bM_YePB@&;<&uvC|Xe# -`+W)}I4_?t9iSaDpI&CSk35z;0U(K#J>dv4^|12FcKPDosm(}}yIddKUAg1nqLbsQg096Gn|@e%80rR -FGSb;3VQJ-Fq<@#-N}-N%Hf -S4f4UKIzs*5A1dHlzG$-|NXQ%-unyAn_pN){{m1;0|XQR000O87>8v@i+jaFyZ`_I@&Nzmoa`m!9c$30C -(aCNPV4rqrXBNpi!Oq0p6Lk;L$iTIsj?O*k;Y;a$AhyMH+y01@h|mVjC0sv*U9~ysIOy%Nxrm$FN&9i -*u-HiFt4RKq6_0#j%2xDyi~1oAipmi+-xO9KQH0000802qg5NS+;5{L26U0C52T04o3h0B~t= -FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPBV`yb_FJE72ZfSI1UoLQYeULG40x=AQ_xy^tU0L`6NS!Jwu@ni -hbgH7nC#>Ejk>jKA@0;W}1Phs*&(BZK?j?>;y6B(S1Rhfqg(puzjZwL749e@PYTffdKhC-nEyB-2J}N -MDag-Fh#l04)Fj0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPBV`yb_FJ@_MWnW`qV`ybA -aCx0qZExE)5dQ98!MPtQXND4VTL%~jup~`@0%;7S*|MT21X?;pj3rVa={O$x<9A0=5@jdbFnzHo-uv_ -1krqv>v}F}HRV`K%;g`xxCZ$#lYek!8Paq4W(^}>0Qq;hL&^4~FaQ(Vu+N=wq_w_!}$6ncMr)kdfsuw -xu1}^ABzpJFxs;)tIB5wPl|2&yY3Mg4-Am3=nR0}fOYGENE*OE6dXJw-bm@Os@pEv9tn3DC5ZMn3}D( -0l=#a6;F(wZ})7+GS%G9iP6QzA>wPFeE@!%nec=`y>&UEW-OnFI&!)5Y!O*&X}t7ngrtT(hmHYgTemG -f|>1aIP4yHSl7`;8_@Joae3g6|8wZ7tN7`?U7S6>5z{eJpNUR~B76qCxb5>ZiGW_C?2c -TacdvLn|9EqD`{i|ie!uf}4yDo#1(%ZA=s>&(w*qQF+Ho1kLFICxI3$G$rVuRc0knEIct@ui8uc{v!O -ZQ!a}KR#$;aiT)=JOW^0Rx10)NBqI(9Z2V;!t6f{v^mOLH#SBT1OGXc@0?j{>KZFxcK65v?!tI9*~I( -G^MePhAsJ7)#HCG0k%fLdil{p(G;GqIK#4y9IPZ#``ijDmgfjZO${=;xbqQDuMU40<rIAV02T!0+uXt@JX*5F#pPs0b_a`Uw-dq2mZYS_73J`rV{FV_er#FhQrPs`by%~fhRv>JM-X!K2GN{H|i%}RZarOtVH{e<)nO<;7qQsSv^*xJLJpi>ULiAcdV^5Lp>HhH<85jqB8 -1TrFT%wp -H5GsN?&st=4WhGITETN69>CZn;NTcq%0NyxE91twS>9bPa3*4Hz5A}~3G=+-^1&Ss)b4m{?9d#xBh3W -7KBSQy|9l2mu*%xjERK&KgsnC!yyY~LwNxW3|F&|)G*%ZX}PwphB& -elFaLG%%eNW(k$v^cZ!b)dmfI?QRKk}bjau}`8H{R$EDp6=!!9Znh0#Su^`zaHr&O=blfUmId&Q1IA{ -q}I-D08K!IJpl_*Spp&Zz2T^`drJrF2xq2%9+SIeVi1{kPyF^gi)5-nINO1Vf92i(4-^n$h%N!g$vKR -4_@GJTAzc&wf7Yj-g=x;iUFxcc*J#r@eOaZm3v?69#XP{&I^a0MG4)*RFX-GS21;7i_ZT@|lkZz>B!h -gP?d#U;6rSM!g5;z=rOg{PeBaoYU --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 -z6!xSGyBI0#FI -?1^UBGYDsz?1_hLdLe0_=X+vVVhzICHhUr>(+1(N!Jb%}l`oCMmq9Q*GU{m4lRihkeM_42ZQa!-4`5iEG=`^59>9P$X=`7bx*6Q1O?L3w+GNa!EOu#AA8l -SHU%xhWNwgY>}7SiRcRPrf}7yV}%4#XYflw5f-fyHjTkKYd(F%q(LEyE*=U)Sa_ubPDm~hSAjQAhga)8f -Vjvv>-{j;1Q7|3qmdgXAmF~pNnW)dZpC6Y#V=;WTlc#$bTi&NknTR`9!>Nnah2i`5H_`^=H5}9J;u`; -KFYWH?7-Rg4xFV{`!?A0S-=JQJDZe+)Q8!}^&{=?q%}gZkcr0|{HCy>3cn86J)Lt -DJ6^($6S7c*UY>MdiWU$C<9KwWA;vPNJnZEpW*@e#DUT5;G#M~XM+T|KtnwNUF~V1-i&Y`YT!y1|^E! -O+#y|8N>^fuI#MUK?W7BXYa>Dj10iTn<x1Zh%hcFbJO -RJ(GeB&fh8C;UL*F}k7i{2kV(HW7u@!OZAVePvms2N!G9Nnm;awW -Y=Um1mhY(WofcZ?U7+d3?Cpz4m@R)&HgDZ>Xt>wQsD3ixrvN_`ooKXalHHq-x{ZHK+8+;|$i@0tZPKx -L&{&Tm=MXQ7*RCujW)?cv_UENtqN*h%|fwmW#0GvO<=kI1W62FaVpTRibnTdl=dK_!c2Qm~ -qp5Eg!!e94(k7as<@$WqS!#|}_y^qa$KcFBcI_4msoLZ76_O2v9zz}1p5i7ON9%b#+@)XEM=3YJj?%a -fKPycQjwG>2pgMr9t63;4ef&paYCxB~9Om_pIKg&SNkx2(QLWDAhL1yk??3Y;AAQAC0Zd#7(^cmrt1c -!U0iNBZuM2OG;{Z?0^f=;G&6st`LG%29U~#05?7N^Zxx#(etyKdfu)>PpY#XWHZu6kgxr3gEFv+1nFz -4PLEieC2jIfM2049dQux7VIzPS1-*v?sW0Pn;*K>eFzie5q|#XD_EGO3T8dsDI^&7P|SRq5F8h%PMbc -QlLn`@UWoQr&s6qVo_ZeaR9)n=&d2fTj@iSlL5)?Zz=^ZUvU3Rz*1>-OP)h>@6aWAK2mly|Wk^x8u5? -@i001Wk001HY003}la4%nWWo~3|axY_VY;SU5ZDB8IZfSIBVQgu0WiD`ejZ{sK(=ZUd=U0rxVbdx^u) -QHg0!k4ew3l7M0Z`>_Car~QS7V2ge~;}riJjf08>y;2pKspG_yw%hsUyBW82F+jGY2N&6C)$AgX>qXS -0%i^{Q#?%Yr$HLAovcY#sV}VeEq!M+}v)U;R4HyA5V%5FoS=&8E!iz?cE4|KS*?^v#cR?gpx_kjXHC= -x`v>AXGM4FyAx$urYx|nHnnOERB)ptjv^!)MA@0x>4f#nGLpu|J-%&iFIM)E32lX0jSUcLG+QP_zIc; -?{UR`V1Z7c1mcf@xZgSQd+&CCz%f*a@+% -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 -U(0$P?VJ=h0@dJmC)6WYkar=ip1H?h%ybq{<=` -uGSWP8L^590LTL0!RQb@Y$Z^sSE3^dN9XkDGXfZw49?X{Re=E3)FwKnEJ^LUUyQ>qGb{&5|2#MSBXo% -QxvWH6dgqr3(fjmvs^mDW08c{p}4=l-~E))!NFK&5rom@@ZBy(BPb7`g{^fM#W4|)RXi$BC0G!Ar`I` -XQekNs-FIHF{>0^_4aDIV2x2D_320>pEr9Q{A*!t5yKoqy2OS`!5&!g`Lo`U?$zNZczBxX6c6QteLZG -n`&LG!DhNZV1jsP`gYwK;({zFox^A)cCTI^!OT@k=+;{@{#F;W14q4&fC!%tT$-5-p@Suwj!>hLyvR_a#$)hh!7+M`OoRnf$;YUs!50CiiE%UsX -{qj-7+f=Cd}1(@VjiVg15_5LIV@)YR)IJm!t*AlweHZo!cox+3QhXC#sewf*bOpwt%DW}Smyyg=-IV6 -jvc;<94r^=$$qnb34l7=j^a$X`HbKFjJ?&=>?dFmwg7>^51A#T}9bmlt$*asYE|L52pbyklx)1IME!U|v -DD_(9z4JW{h#iI`WjKm(O42N06NqMY>{=? -0IL8)Q+MN!*>Yht|!NpENt-r=Nc6I{CO@d1;XC2ajroA`4+6c~l)NTX2g8+JlGKz?uuaZ45TEgGSQgM -^Co@EUv4+9`38Z%~Aj%WT0A&z_H)=t@e&{JJ5^zp>HJ);v%W?p>&SaiUnK!u>rjJa8?*Vh_%*#=)(q<5U{5#z>mcspp_fcS|0T51qJbXl7U{mPsq+Rc|1V -dX-DtYhRGQPK-jlhg0q3v5Hlp;4kZ5AeM9iB`UVBzWgBGu`I)%J{0*$Lnd(4mnbgUm$?6o4;zeDNsgT -i_GSpt6ln0oC7gSHD0lVb8ySMjId0n~t5AZOYPUCb2O~Ymx1E~YqvO_LTAS!xsB=RYQ*}-N;jLA^tp5 -IfM89>|#bTC_hW3T`RWl~h(i|Og##QzcS=_mL!rVQQ$le9Kn|C-(b-6E0}a6Y*InEa4Pync56o%Tefi --r0QVL5>n=1{>Ys?^5hHNiz-=v2^FB>)?vC?XQ5GEChMo<<7`6Ss!H@-ssD8Rr=RdufEu{6g_FB4xK? -@3w-k8W!k|0=JLu(z3|OP7DyQ!H6)Mfw2ZrLHd^|gb+D<3P2rD*vQW$Dh)hwL<3J#pmxL&nmKkLBS{U -Mml`7?&q@X<$Ee9rxc+~OwY)8V9ni$bCEETnM<@Du_nYX+#J^z1_%lcdw&}Qo -_@h@u^xm5Ro~F)8NJ)q)S&l3ev1|YW+8Q+sn&-iNnm;`l_`J;y-9;VUqPWA?1XlDcF_uQ?5?P8L0D=D -K6Lx2!Fb~tb!m#eixb0zJ%@`r6j(<9*MVcV{B1EW=%eW5_1dm~gpY#9^s6QBtJVdic#{v)5v!((vvke -75P2Pj=iZLUx1cpv>EYYaCSsa+ieVSz=!Z;NCSDZ|BLz`%6Icw6I?Jy5FSdygzeUJ=XP_T@lF?vXh(3 -pdR8n;DAz0r1Jp%Nvq=EY4U7g{Gepk`fe!VGbts3atiGUl`v%uxL}BIg0AEx8RJebGXiabySZF0H3s| -IBSK9ufTRI4vM=k|>ucNG17|SQQPB3|&g51%};~$kN+HOB&KA0R}<2sIKhxz4!n%@mT_{ -iBwnf*R>plp-)9?G>lTNSqW;g+UKb5@su$g5Ah -`g)5t-=aenxxSL#}60`6f-h*F>N1^R>t5jx`z2UlrzcZrP;se1QjZ{rLWMyNUS${LpIyu8LsK;qk|!b -BwKFCr`;4O-)sV>_Fmzq>}=!wyg&jwkbA@UMKWGf+b1h>Y1>Ls8%F4)YKN~^uUA7-u5G2JS01>f1p(LCc}G8kI|aK7|i`m75w?JIoBcBiiPj=#O -e7%$BI2f9*)KBFlJhP3K#V6f7+l3OZ&?3<^mK80D1ke60K1d5Vf_DcQ`aZ}Jgucc@4FP0i$4%~i$8h8 -)IJ!bCZo5UatHC7ZjdYLrBNCY1x)PO}5Z(&B1X8M1_raYS@LhA8W^nt5;gPiLeR2*(3Sxh0Sk#s) -KC0AHR%x`JnTKq%MkH9Xb?II`U0#Nr$X=ac2$lY=jwBEjd-pAxVLh9{tUm1?}Yr8r41@h-|zE(EF)WHl*m3pBubg{NIewo-fQ0FCy%S{(Uo$zGLSQ{9%@J -~HWy8HpCJ)SwS#2$ASsIwo(qvI==>y6six{h-Cw-<=NTM$q8*oVO5~46rh -nkz_656F+d^Ettdb&r!p>_&^P4`bxu$jM1IQ$uz30&5yHPkg%Ag7`2o_4w4zE}A33_4(CNIDM7fjI-G -{IT8-DmmDZCH=R(>3YT!|IHqp^n6P0O)1FmwTSaI*C(FFt8qpAZEGbbMeC(3_Q%eS0O*S};W7b}@C_B -?%1605*#!Id;fYa^wO9*UQkC)TW1%GP{43+(dUNm{VZnBAr!M?f|nypv-HhBvTT?WaK6$4x0QnFYen_ -!==g{+oNaT&9bk7r$yvYeE2v}Vxl94wNAR9i1@dS9HsMCiF(Vkh-I8B`8TaJ`znuq6I0}X+cBmk=1>! -HSr%7WvXF4d9L%1tyHX7s -#loN_fe4E=xc^w8c=a_y;&zf?HX)nACu-N#sj=(F9X4J0UT(8J4d9l-!L^|bbWW(7^QpLB>eH`{=>3% -dt-hV}W_k0mz7NPbj|hCAW~mWdSk9adifO8+kYy!Vax_h_;FA0nw|p%cdAp&k`jbMDC(xf@~nb?P+t9 -hyHpz*FUVb&#>7jvad7u#Aa9~H|2|rNM*5)x>wDgG1ZYdW1}zIm9kFuH -IJ{mavjzxphsJqHhdihDPn-$tA+cOtZXeV+85N98hG7`Gx#r=})*k2&Q9#JY7H%=hAZ&DO+h(2^EGfI -FMcx93F=S^vS0PZqi#}9-JypX5c&b!?^VWeZ%W2uN`L`lD)8k;dF+Oi3HsVhD -OSL9q*+5NOfZxc#YV=2!m)DB9zNA^gL8eWeym#R}G}ItcAgu&$U3f$yz8;4t9kP;B5eAwH%JYE%f+z%oz#ZW{oxuot0?rwkj1F*!s;_Rj|IrGu=+m -k@~8wT*WQuN(7)WxcXzk0ICtF8L(M@z -BjOxP`<>hOSLHfi@|fG6T%DG+eDvPm^mQ$!FKo%K6(NJ}06qhJu@Y2kJQ=^y?cXCRlsTyCfTn{SzxeR+vTe5`qU=6e!SEn9NmNk<7b4{nMR3&|Egg4oVdAt#AAh6BQ1y2i2vOeJdXtQ*GHUW+(Kz -pF298E@f@RX+q@?b;iK-h__K#Jq1x!wFmbc@kn+jd9LGQ>eG&TEvf842D6^6#S -;Pgy8p%XZbuGe@>SMB9)5TNqD3+@ooYkUoAo%Km8$Dl5UI(!-S}jbz+zfGD7$H!lF=2G}pun7Bwd+?o~3m5-joSIK>g7@tvNFF_)i -!*lG6ejE}AuS4SXdhH@~>yF_|Huu{#$Gi{W6X -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 -QE6oU%oTy;n`8+AZqd2b<}?74 -3WJ?xDG>yb;j=E!!I9O`Dab+ExueRcli%@PBLVf9+L^fA-2vMuv9 -uYSPSroMi5et!Jsm2h7A`}g2~zW(#F1i0_N!I<;%(dh8;WBifNYJC&#j{abtYW(r^>MhcrW$4`$r@ -A-`E3we%e3$yU^d~Vj(^<>R}@gr+KB&1ViO6b!14|eto%*Rk1(*LU6(3ZjBY<^ -8m;D1k(k7hFI$3!gB>l?7MQC_R?D{2iFzkP{bSjIVrEWK*|7y5;EC^6ff&NvelOsD+B^8yv?I0{Rb_c -bA$=9swQp6t=r!BPim{a6^lqA0SvL?YnUwwU6Ne{Z<8j-v5}gS2ESdAp6y6Uc-N-FU2GUK>lgsxVwTo -V8u4^_AdvU#OSl1S32g+-ZvCr)CQ5h%T*C;wv6v+Nrwx3B;Sw#=i}h( -JIU=!@d!>&G=D^7>}J>IIeHs?%9Wyw;=Js*k%2Q_{Wriw(AF5PZ#yKR(YF$_?|xy5yBA&Z=lqA25+~{2)VVC?(TAQRlw#-OZ_)|h{<-j6{24GPJ-+ -tD+vGgqIo)5;nT&jyW_uw*0sJ%&rR)s&|b0iT5^oD!rn~|2!R~5=nXA&)Q)#Qj4(9H=m-E^uMmne>8; -V82EKQZUKQf_jOvA`D`Vfn-4j7)&fFK#UE*TBBPUn1u`Mk*V!N}v*W7K@Q`xCPWydG>mkyl*bl -vSbTrte;!_~>*_2WtzzuzBM4zCf}cmCDW?d&Ew`sct&k>5UvE)E=F&^xf)palQ4y>jAbX(4(r>epm(Y -oKDPMe?@dK%BJYkUtOos;+gjB${p*OPeMP!dKH|AgueWaqiX4E`Sz)?m^2%O?mh_`s645MoCG4ZW{1- --VzYc@TJ{%)<6k8Oiw7Q?5WJ$|%WFr~loZi=6Z^JKv$S5dSB%Ry$f&{rwxd`fKx -VWfAztOPL5J6UTF(;v{|it{0|XQR000O87>8v@l_%w*!7cy*2f_dV9{>OVaA|NaUv_0~WN&gWWNCABY --wUIWMOn+VqtS-E^vA6efx9UMw0OF`YW(jxjSzn!Gn|^uxM|^W|cyO3KYu4Mgyt?kQ(X(; -(#b=*?aSZ?YI(vUDvNzlQx~a2w&9c8MT9JLzZ0bePmrXr|n(u_jzI*ZP?A5!oX@B2mMZL(Ly?*un?Tb -Hu|NiycclZ*@9XxvU=*`)i?8|@pIxAP}N~}cPGZ6T4aIkEfRW_R~H~pp+vl*6Y+CJOVC3INKsTiE7*Zi04>{Rvfd -D&rGXZLfl#sN*TR&>p#or_MEoHr`~s>;9XTWI{nYx(h3v>nt^U#~*m*hpGo$8-EG$RRxJL)rOw*6 -X=TNg=nI&KLe+dJe^0WPXYZdrfBOFE?3)+goxOVc@@$g*@NZ{l-_3##64a(ID+Ok>F4|7aTJg)KY-yS -%*}Q-rEoSSsS&O#cPBJc27b`J?37^R^Ob)W}X+^P^iF<_IO|rWdX43q8_U4xq}7|p1pqg^69JR(UL$gE5NHNdhq&fezHxz697J$wE3c}{=*-|x@fy+3=N`*Q=I-o5_*?X$CYP|oi()O`1EPv1hdF*p9=)imm$VFViyKrhHJ0O`X*a -gGtfEU7GepEqO8k)HXC)KTFU0^GWfiJ5@k`9oq$HN5{aRniz%`+U}9yL)lIts`q*YoEwW|PW&-+``BO -iQ0>^fzI08V(-~Q8mjbn(sz7jRCFj&g)?Hgca;y@2)UWuX|8p|^*koDIRhZBI<_lU%@M`V?Kmz6x+42 -Ic@9i5(XgX6H@@h<~iFBS{x_=ILG(fy~3MOHXdioMpuF}*zjzEZ5HgtqcGDUE}wR>mbWVBOoHzrv_J010 -dK_W3$;;NW$GeQUMDBTl_jQY*GZyI=~2PwwxfCDn1sUtF=vBUIlIv7KN7=v{!QPu)(o3<3)G<&h6sqf -ZeUM@?qi0((3#vC#MfVc=6wy<=9K;O3;Xt%#EJA;n9vZ`PwXl{sgARB98jBPEk5N}yN?mWYI?gRjXe? -ia!c7?JHO}Z4Ak`%87fphE9xa2`f*8@& -J*bk3rg_KNKK<$E>+yR2-&zG@Vf)g=eBb4A}w1`x+s)Mc3V^%dnLvDPo)@||49i}qp+isNV8*a>)@|D -H;|54ZVAG13rpAMy}?ewP~$s-nLqvA!qc`C)nevQ`B3Nn9~QTz09Z{=U{Os0{D|HpIfV`8F#ADdwE%< -yr-0tgZ*Yy=iTqYTrv*%I1GJ)L^Q@>)GzCt6Ddq+60a$SsEGqn6S#R!f74>4(Wg{`Yn(~L|;<7C2C*N -Og>V5+=+rqED8zX{2xBxB5hO}K(Wqkvy{JI1I14I&7=?#|5mSrW7r_jWR`nGJF8YS+jg>C5gDe_Ni3X -tRQ+D~qB%d%dOu&T#9}fG$}t%2bGQLAL^=2|VE1gKtrXAd|h8fFkS_w+w1|3L->zSHg_g -lJ+>>2xzEX2|Qqiq{AXK=t%o3d>^7v5ot=D)R1wsVRP|r;iCbl{Y5F$)1RBNW-L#_W8hS2oR3ab@g0FOWE0$N!k;?^)&VC}Dq9ydJz0;7)a&d@ImF -B;JR68V#QwJs)X*fxD|}%RW~8S5XjVQQcTb;DuqW_@QCQ)NR~dzNP!a|;dVrjz=Yuwb_T>=GC7p35u@ -Y|bS%1gv4%2048Tgush9%PZFX^yALkbrAWH(!xrW(_bydtQIwN)ug=bip1v^*~ytdG`1f&IDjnxcFVW -;J1OVq>8lUWBp(H2ZfH~vyq;(D{X1TJGH`9zPHYMh|xW=4%B6Eq3ci=th)))az&xs}5~b9ju*=s{$(8 -(;|yibVA>$gpb|;ASP-a&DuCFaZq$v?`Q?^dk{#>D~QyEoA>YGLOf`Cvh-1M1?1YGR@wt3$(*0y8;i0 -|0vQg8Z=1b#K01k(};sjjCBy?NYG&b!5r%bitbvV2^^86(76IlwOkJ&3m&eCV_t~5(_exZ19UqejQ -u*3G8qLsCtDOg(Wc0fiepI)cQA(N$tm8p750F4DN-lMkg}_NfBy;uiLiE}QQFmZG#qO@M%L0`M0!u0w -!hO9Tu?EOYd1z@vqT&hek6T+fUa8*OODo-L-y0}Q!hyTDz-Ek=32EMQzsU|rS=DUQu$&4@YAtn1SXE`uhYOd2PA3?C)eAlVOj5_<=wBk8FCeEV*Zo3l5^U;g1M;2V3%or8juO&`#}{F-d74$F~jMZ0&zEUJCG4N2d?vky6@^7SZx+-0N3-8j!4 -XCqfva`i_kgZ>34ll(>^tE|A|ao>Sul$SM-Kq=R3V@=!Rb^`y0ruQ_X1RZp2*bX-hB|wjrsud#n<5Vr -~P;yw4=~5OCN4=hLuh!_dLI+_nXO_`AY7$nnleCb_a@@!;zsDycGWk#3NSQVb1g#VQl^tg~8qwGjg3N -=u<%l|{QS;$~&0||pfm(aZUlL6AEi>@mI_xd<*#&9pakG*%DMcx0b<6OeW -UnMf=zm6pv_cvy3?K%X2@&$rrJ$sX4`K`v8hnIs!7wsTWAcjR7lDVSIb26&7BGYjAdZG!{`XPǖce>fm -~Y0Uhhys5uNQnB|ig_o2C+ED|BQZgVrbY)9Xpci&$=+><-Pd04;hqm_uh#Kt;5FP4EElFr@&tS1tO|h -75+NukD8?4TE>_thR{#CiiXp)ngD*zcX6(Z$GAp-X1LJ&}p~oEn)4oJTA6-|)wlil6C=6r8aL -zDT$q1bV1C`wiz9zw(o(sC1)Z5UMTj~kdT8AcB^oiaJH>w7j -NR*E%HR9gssfPm7Uycd1O$`*W7}}*rkhxZ+mCI*u4?;!vfkU-rOgsaxkeOQT&1qZuLP8hmYWKMuc{l9im -IUo@(X-p(Zwo+QYHbi`4pL&s5CI7kbfCjRrO&)dI8IlDQC#HR--EzkMy^bYbrZtvj_I4VjqsCv%MB+x -!sKO#%7uNH{rKaLa!)>9 -H4DL7VomOUqF5wNk&;pHMPq=ZUNn!PDQ -^)ftfaAcFz(-rTav#-_cOqmgAi7(~{-v!n0ZTCw6obvwL_}R{tFQ*Xd%Hl?K`%y(VrAN*S00V>Bu6N~Uxpo!eG3@&*&LDWG8; -`~lo`tKLkF`DH6uN(cUY06%FMPTp1<@i?P#5hLOQqAaiz4%FEN0l)ICj6Ej%*7&NJ}U(guhaaa`u?7& -)Fpd2}LA0HCmTIYhri^qbIr&=;X&g*7g9!pp`Hk!8t2L^G&%=2RH~@1 -nilpWbXQ%P-l;Q}@KDFtQHi$L)=gbo_|Ah|^m5x)( -k)9mcNKv?7+$;Z%^Kf=XD-dz`;=NA`AU|i&jFaCgq~ly(FB6Qiyg^vUota66|0T{$XcqRP@S5MZu3Q*XAVXJiqLI3ybtqnGFv`}Z)|vb=PQZNJooY$n>$pBP;P)fqi_#u% -S?P5#&ciZAQ+}}&v&*mlAZpCUGU5{BX^X_X9$f?~YS51e}!b4EVQO7v7k)O_E -DG%bbN)8f+#17fp1|K3)w~wg^&vx(N&W{S}^hDf;iMN(kWkDKTFK)N3g`m>DSbzfSTQJ`y8Bt)SeX69 -Qh*fQ`Wlx;P_Oobh|D4^XH*L3y;uI~oKx0J@f3OM5HH0PYSxS#^Oj-ap*?~vU%;WCS?lV^F>~D^~9z& -)IrC_L}DMqK~1OzcXFSIQ^)%E+0lFyl#S*cpJb{(0SL#A>_=AVrGLZtDNkM~iS!TGY1Y%I!9T0TT^ZlUu*E`?C`Z)D% -b4N~j!=uD!Rd%Er!)(1$`MXN0Thv!#REc^7z{Zp8%W*vA0aGre3F$V-Ymp#NsRzGT(4!R(rDL}mUfIC -_N1kh|J1Ln?$U`-B_}r6xf?zrkaW(d9s^%!H&Os&f^*96-Eg-!KMzK+k6XwuPMee%E|1|fJ-j#bCVsP -3S_Qglq(9WrQJ8+IHCpwp0p+{E -7oeZ^V`dM~+|v+{R54w}aXEN%|a_w@nz{<-TZAFphQ_zn#*9lUpp*RIpV^S}>L2atZ>7jKFZB!hY?nR -#C6?-*8s{Tc+^Wi6#Zu``FP!MM -~xg=v6J)5z*Na8R*Zx>PAz|BeEtG}R=fFOt(FmM6Gapx08`toNvn4>CJ7Pp7BeWG1IZ#n+e?4I;@X@b -6-4Oac)q({0k6fl8OB+R97I^&R!SRP+wAl$kC`t9fwGbYn@CcR%V7p!}#187o-<`hRTf^bi*pBcpRk` -AzCglzN~lYY}d?ott$a1QG2l&ou2JrR#Uc8mA}ka*RoQABmxeM9y$&P#l{J{ACK|hM6g@ySD|(r%=;Rn%Z|9f}1^#W4Nx}}ZMM -K)-degJYiHn^VqBc?-fB8>eM{AQ)3MXecRSIh!GO>ZAQL@fsVrpt&Fmw1Jk`U6tEr}t_Ir8>WN+Rntz -jk}8NQBPEmuu2VM&qzKnby`OQ6xV?`6wjlfrH!l;{%uUpGvprD&MdT=wpisEtPNpOlVX7r@0$h%$BjC -wQi>>Mc@$g;#DKLP>+an&7n(stps?AsR8y{^@n18jg2T6jZ;3)i7iBw30=raRf|@KhisP5$V|bOM18c -~X+vYDggTu?)#BlH3Rd>UlGX-Q9Fy}v+qYu2DMrlV7 -=-I<}U3I2{@CZll4;5lC#(W`xWz$MNMz@;MGV&x$!BR3*OIey_7*NW`|Qrx -=G5_1KiV}+3OTjN2*sAVYbqc@v|e -6*7_ZY{84POrta8k<>}@(;SIrS4n&v2M#VQ{qh0GB>Oz@&NqD-N-G<2lk}hTR-6Va(L<*(!B#AH;<(R -QDJ)yq(# -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 -(lM-Qz9$9 -F>AJU@<;91jvt}0YP4f0=w}jtfT1Lsu=1fwvB_4>eUpLcR#>}x5a3-SsOTViExUCQJEQV6I93?D##dz -GWKBV1E+yHZTjdc|}y -p!aep~4auZUw-~Ht-qajOfqdSj$W+MNePuvzHh8$q3o^68QN|x!tL$N->s$nn2<)n{7x?Q-ld~aC}2H=E*@J#K*1rte%8{jBi^NO1yOl9K>&4l1z};0AQcp9D}r=Til@U3H#g(^K@bgPA -TV_yluIHVgLADQ@V#D5f2zhMzGct6+fyl?@4e>Okx^s}=gHoMzl0p)HqhDRLAq^1E&-m0nJLVhpYpc3 -he6wfv@&fWSZMm6g52k}Tna>52La19PDHSnD=AZM|`{0$l$WP)h>@6aWAK2mly|Wk})%&Rhu<008h&0 -00~S003}la4%nWWo~3|axY|Qb98KJVlQcKWMz0RaCz-K{d3zkmcRS2z$KR<)yhnq-gfr1=bOp8?$$GD ->apG3+sS4mii9N86v+cX%i5d$-}k)-fCRr}HObs`JLP0ziUb}W-uHU|_?(@7amtb+75RF`D!n@WJw7> -ke)61M6y;uu^+vPsV!~d(I{S+KS>*Aa-NrwOGJ+OwMZ$B%Q>F{1H=JGX^`^+#ZL!k3SaSAlQRQi@1w4 -ZrE?EpiSt`XKP=j`p(#pS!(%Sbp6R|A|so5r0n@ -lX-&#YLlVG8bNq1>I?R9a;9uWDJ!BH^ljulcrIiHx6Uxu2adxK^^*!fYguktoczyQ2pu{4wFBW>@s^Q -p!SloziN%-OtCmo=}^}J^e-~4HLK|fIuPpIw`hgtX-qF(wcO}QoNRbH2a1(k>iv}cU6k`wK+jt -)AGo}h#pC|u1ZfYvJ$Foq)?B}(XW@LF$6G$1Pfkw0x%~Fck8khhSMR>L{2yo>Y_u-b?B&aHUy7(C$%z -WNrr$x`{O0n_+wZZtd3=&&FkN;XC-?E1Ux83PhQ;zHp6H2T#ItA5=oU2 -q|B&IlL5lJ`WYoR#W8H`MV3pd>I6rQ_628>wQK8OqT!W-%bf6X9729dLn#4(s!u?#%Y<0WIHc2{ -M?K;#d=h!jPvPy%e)e#Ty?fW2USbm&QGm36)`x(qWwPPZE=mCZrDkTb&#*5!Ka`FvBrtcG67GC@^-+; -`uSL6cJ^J1_QoEqQT!T$?&ReYWI=}Aki4(2zZg)&yzUI!uP;p& -?K0@0ul!w&`hO8rOy$O5d$}VL0>K<^_>j%1tCFX&e^MBObJLs^I@gHYY8HK-+OEQ#SgchujpPV6P_&q ->p4ebClgSR?H1&OWP8LI{E2JQU9>W2yA`vYh)p8bT*iq;Z&VvN*3vuGX!A^RUCDe#04fl-(L*j4Q~2eK1N^GNEfz4DY`a)cKm -c@hPBXG0h4^$ -V7^}XV&coelCMw;(T1Y7YZSFDhae{PB7-;USmaYr0-#Z41Nd5Cb>#$h+|OHsEqMxY6$B&7W9;Xavbh3 -Qa3?@5v6;3d!{bpO!2>M1z{Y@K+^2h+-o&0I=Q;9dO7Bf*5I44tyYK*g3xpTLRD^eJ1prQ`yM{U1p4VgjeIU82wHW#Rr(I(CyR(TL9=!yf`kGS2N8GFNKlzhw<-`i)4I#Ne8A>IeDA -a5Cufj2QjYK#Xr$W0p&vAo(Y0bz9S&hgi1gQ_hLfN`|(L-^Y1W2S)Qg;uJBxPZe=!o>s3n0ySGuL|B^ -;IbEHGwI(23P65L+f9^*F`E4?Z15=%rM-+z!8&1ilX;{7da4K&hqd)DN;VSPs21 -4nr{Jv45Y%fS9)4GrSJB|VoOMfy76!9DwzKI{v+t%W5l}y7!&_M{Jm(`dNG-V1Vt30>j=y -OUMNzAKauLV{9d1QNCr7-3WReooQPLuPm -XvJ*e8E}Jqk`)Ruuf-F6y%OuZmD@lz4`i@F;3XBOu#xis2lBpqzNh%$P{riNs1Nc|=oqU#ev*VEku@e -P`aekgLl_+xryn{lswv?+X>7I7UAeA`dmli+ivHsHmTzQ`-sqk_Az$5-;@apq4^Fk!((JUIxKfZVPE -{A!v=WQw&&xVJqYe7PK|q1CvJ2q2BY@~T9^>I1KSHB5JxnY -AN*&4Q2SZgfkCBgQid-YVNMReuj6iOZ7+>u;+s1oHTgl3IiW^DB!GD> -OYOluXRZkn6b_PhA2s_k(64&RZ_Fw^K_|AN= -bc_#;_MKt&$yBqT9m(_=E&sudcV7rR)rW_4x^Vhgv<6KfvJ$lMs+^hgJD^9pz9xX>;i8Fd~NT;4*L-( -tuA*VxewIkJw~M2F*`J}GRBm#WCHdCgFd1u!kNBaW;P*-^mOM}?>}vcO{8y;zg9)&X5Ncl!9OY4CC!^ -Rz4JDwD&-4?hsupE*~`4ho5xm^t8NsUeBxctU~W3UVm7n|71q+f%vOlhnN -#0^E9`gX+?sQMO$3`vJg=Gh=>*d4cLoCgZ)d}z4$whjo7ib{fzA7`b0BqTxoB*&6tV|$ui0l$cHre_i -jT?dTfh*9-*@CgY2!e-Tpgc%g?S`%M# -6BfyH8pKjvT#dFIEbb|SSTo0&LyfXUcxWCjUSNHa1Ee{tdT06BFLv2S5;(&6sz9?WA5Y@287iYiMFKm -!qiDUq6CtX=>va)*`&vHQlugs{S$T&|#5_piHu{ -F;R4#ar8MY$1hrc7?dQuC3to%e%IS0ErE$E`xR)&NIdP(7Q256Ec6s -V51*sG<%SmVFI}{TaZ?r{YTKkWFqIx>?HHoj?&-FQ?WKHEOwJ<1P{Zy*Cg8TN7KaT(k6cWyRZ9Q&GV; -vr%_dsP;}C4w-PjC0YNZ!xl>3AfNeS{XwR3jtqvbFZ#U}XfQ-8_C+ -(rk_Txxywd6c>kiq)50sB$rk;{WLiH}+#wDD?MBo%JHZZ@#^fh)Ylt-gn&$rgxTU@+Ok@6h7-Xs~EWF -&u3ka^&Lymyef?(bUET6m75=dyN8Wg$;{^A^k>gagW#_5&o5Yxqx6&hJ8V#fev_bFS-JMF43PmAdSJw -yK4xx30Rhfioug{M*a~I24Ms}kBTjfD|GVh#Tn*B)77-7`_Wc?V*~B3{hE?kM}Uzke;9}xv(#E}=d^$ -n*v0y+LE{G#!;N}op8*)9FmOJo#@RFQgI>bS!=dZ7K5PjM!k=OWv6^D`hji9aYF{vKViClx`FSYR`Sk -T@gVdoF={|-B>Wj^?$>BBC=BmN>O`%VQ&o!orPMO(K)fw>Dz5w0u`nM(MqnDsNZS5wnBNX?uEyXrg#9 -EMg=+9t7j7)Foy#9lsfjU$w!I6-NzfFD>lAV%XC{fCOgs>|2Pd_^|FDEH8{jFaFF~l{e)Dw -^)jYV~#7Xd%fHHG5kf2u3P>jhwNRSu)xt>lW^z8UQOBAkuji|)yFSSJh3ogk1;i-DJ^z+cV(iI8PE;_ -A(KU$l-@2%;IRj(H$`!O$nv;?G9Bf8;JM(KwwaR#WP{wWO#ox}jplg3u#w7lh1}v6O;?M>eVerBqv=w -olh~%H)}XePln^&&`zAmx%wB)QX$$$A&3oWiC?Xy?cnJ)@QC{1ZEoLaYd4)sv_-e3%d}+C?Ha8t|P>w-o;AsV0dWW^$)e;)egws6%J6 -%5zk%pOV_wVML8cE+Dau0F^--Zo=gVLr#hC_RbO*+M48-j_MA$p!Pq3hm!W?TZ83RjyG=Uv$oAB~>CD -@$Nf@~PRwm@^szBpm5{Q&k0MtotDFr*@S1agtj&~-ZNDgE3z{-(^w4 -Gk6Z=ZWpwrw0vu(M^`bXB&g`kcin_>5J7hwJh^Lv_ycs;gyrErHw5xtqMu>FSHweqDNbZ&RJ0?TFKl{(u17&J@cX~EZMvE~X -dNm9)ueO6PK?k1My2>fAf2}vqP_Zqt!)K2z4kFi~ZTJ4!g@y6f!1&Og8iqiPg&73gybm4H(}pBd8n_R -5>^MYg{+8@i*smdup6*6DqE_SQyN8c%n^^!OzC33@PBYZ-Fd)o!)7ybYwQcOK__ZL}7H&Q10K8fj0Kd -Kn*%6;&lbPhtWtCN}ft42^L~mc;a~q&Jv$8HsjI!Gl8MoUC099jfd{;uk`QISw=Ab3=;=kzOQSo*Uxx -gC280<@qb}i!?f(t|k4;--Wu!efV!6>qM6;~2%qWF -U|Ys<9<$DfS~lM#MDS~DUni%n+1 -Vadan&XGEUP=g&ORip?{m0i|z53eQNghkxk!$ZmO(a|HcijMacW>!SU$?Q`=~`VX{4}YCY5#PpVc`N! -=I+Bus|l_9P?3?|_WRS6T-Cep+h~fx>1n{etfxB6yD)I^9ry+M&IN730|d6GSSt7ft;n4}d!e3zIUi> -K{iM5PcX+I2Fmh(6-;<-L-LaH(cNkr?(iGfc1X -(f#*?_Jm3(e^wYs_yvTOCm`6MIY@CM{nd%VcAXIz&?V=`j3`U91b)t#7ug2extR>v(OMqZT-8v-~|X4 -_Zf|I-lGcEQjqd{`=fl6{-pakaE&9*>e^ru}HA$*6Y6O)~%D^^uyC&UZ# -1moCMouar$R`b98ca5Z^cFOpsGGWkcoiJ{mx`8+G?EDf46Xs)y1`L -4Mxi{NFsXl|1#3%)A1MVd4@yn_!}6(rDJ(Ny_t+m!HaS!LNeD;k9LGRuN*o;`W`-OHzO^R@|+A`PB=| -J|z>&;ItqtM6aD#FtR+=qO)r%Bl&LzvP>vMOChYybR>s-*!z_Kl@%4`A1zA>hr2xE@7bRYgwyLo3hT| -Zj$C&y{NLIrrJ%80(j(Ab6sT#&eKu$cAjmT;2FJtT2*B=34)VgQzgrFG6{+j2KXkc%*yF@z1~eVh#;v -Acv9w!;KrOriWdFW1mpRVdn4tACVvF%ICvCaLO-K5dKk^BE4VNY?O8eL92JW9n -n)`FWddq2$lovcc*_R?m|Se5zs9isiJ~ZL)eC%(nR|otB%d$f_PdU%z_w{6&`LRW@(FhQ(ar^4G!Nk~ -(u<_W*d2L0{@-Ops`*$H5OTzM)SenG8U#WCjq;IV0?X`5If_p2N_`!8*CgrYXFZ`s=Jo5QeJ%t$dfCq -2@}@^gNkgXX$iP!LX}lhqDP&Je^lr3MiZ>E0`CchHaHi>s3-;dxuqTR(UgB+fSUT2ve{(s_ -^agf(jM!8C-ZuBIoAv5lvVnz|6KlHvHo9&`U#wTq^p{V+di=vTucptw`||0JP&vGAnoT{qe}A*vllK=81}0d{(#@eW^}2iDxsZ}U|S_z6E5SchX -C2Ti`t%58K0ar|IJMY&s2BgU>xH_7}aS;8ycHU(k%w0}Gx<2+njn8}%jzabDwH@NW@g(ZOiN -IgYb}*Nj?dz^(2-RJV4abl;FMNbShrPiVu`gV`dNU)B6tKyszq76jOoo;0A+rdZHs0bd|zaFmCr|U@C -@cZ_@-n`3$B6di*PuRDX9a3a6g&Nfw~%KGGEofESo1=WNS@OC%c+D!$cc|q11j>+gJlT ->gG2e@#WR@g;0GA-BCi1Pxpu5;7uhYNF`~A9i&by39jNKm4!B7-B-~dB3Mgg-_ykwm>Il`M&rN*E# -R+{I%%3Jl3~JpRoP~h%(E%Kai7qQy^=Q#K<#}hF@nE=XY3NU2ZE_4v>tXyx`B! -p(u=-q>7inASuwt*)M16GyMhSo4>0vvtL49zZsYa)vg0CTP~?!_BNxxx7RDF04nurn}TNLR@tPBa4fT -WVhFS*fzg4?Bl!&q_3d>&zYa)Sse@g)4Q>;VN+1%}Ni)BWNm>F2OMt@&tT)LDI2?dNdgEfiN0Mcd7j; -8yk=kfAo!~Zau9=r^ivksQ2E-hb*nFqqpoH=jw*@2uY76&qO0a>!C2G+WLx;wbVxA#{q#f-RxFRsk%? -_C7I7ntW{8P=ZM>6j2fC-$@l<+*}s+ws)G|+o$tuu*cdClCD8aLkq3vXaK*7ewcb(_ -)10gnRIHrYB1s)Wb@xKR=OV+*Udt#NF?wy{8LcU0<}TLxz2>V>0`(dx5>X+%XM6r*!cgkVm|jA0Il!V -Ejkv|ecxGyvi91C3H8r8S8O2If{RZVm;GH72Dh{TY$doQmrmvSI8AsPZ%~AXXI`I)heyvgi~@Z4R1h# -cN8`X3&}Plhq5x?G5$`VK&pUJ(M?1|HUT23UVzp_^5r&XGeJQ^6!No(D#4=PmCdtuFl6 -pW;d8Qy+EFU|M~yQy77f?TW9mAHW;Se?y9l(`=Zp(%q_Szef62ff= -+M&wA06zq{O#a3M%xvK=77wPhWa>$_t;dtaiqV~AR8ekt?D^7KDY;ee}f3##;0bmiI1Gs1G&+XRWf9kQ5i!J9e`z) -TxiyrtD%HOpXc%OZILid!8hhbIpL_cG`eycz5MwfKvI4wX_a2y21<7ktUKkMgLnj|z}VO@6-0n_UnA{ -!UEc^w6y(KYqX+ -?p9`xdYopUjz=NLxquxe$k6XqY=_=M8{ELl1N|>SIK8BD=yRD(NGzNs~FA;VKNfXE?UN_o|X6|Cplz3l0qp>dZ5fNgNir%gFk#xj_^i?U@02Mv#`1Eg4Vw&pCBg#!rNSJ1 -UPHqnEQ8g}q&XxF%D2n=sd9^P4&q4`=R8?9^>0q%W(owCeEwoVE&n*;q>stWXnX9()k^50~;IylDR9F -K!zncCx)ryQ%PJEkQ#hFLiNYpZ~c*^y#^^)Cxy4(()%InUT2Qa(EJHKefTwAmA7dB$!qo1r7R#(uC8{#aHz9lrZrgK&T!x87Ofq9xQ)ELyq0NFeoAJ?>kS3^d^E{ -jIl=}J?!pJ9>20h*A{roO|Hy1k*>6lOgojyy2icYtO9dnQ6^#oQ0e^)CO^I%!2$d=1<*JEt+t9$i -CPZOxNq}d}l6kikKUHxublUBKtZLikQUt@EUO|!@@13h2ceM?r$attW31e*>3tm9=>ZZ~ygs=_WBIdy -P$$MzhTRldY|MFkF{5sdcfHPRh^xHx@yN&fu%jziz5d@+GSE`*L6XIIxT59Xs(K~~yq9nt`AYj~n)xq -4j}y6T*>s!))-*hjtU@l$aZfW?Zar?F2w^mJR`^f#nw>7V`B2~UWvgp7Fpw}DjrMeg_5IU!252vVwy*X!ei6n}6kY4ln~Sr_ -o)vPlUk>!+SL+vv2hu@07~;~ee%&S&ZXQHoUc5+* -ox@N+B}FaQ5}Of9mbWY*1wQ5;d5v1gwIJRVJ -#Rahy1BV)p1Ba30#)qK1foCB*P1e4=?J4%O%kPMi9IJI?)J%8mMoe*5dQTU4TY5Wo0G|?olypgx~Bl9 -jEL;#-d_Vp?THkXcI3h=}qESHw+ojzj14j+^!8;s3S)Yl0>LLs+KKXo-Wj79- -Hu(K4dIV4dlILiaJkc=ElQFKL@x7nD|x4PR6+PEqrk%Ag^v;`I&T<#yJGOUMm%UEi%i5Gd1tkjQ$4yH -4B#KvsvQZlNufi3&H^Opaz*S58-ugg_hQx~gsVtMD5t1Kzn-5o7bDf&n(_(FTElnc*v*!l55e -`vk`!afL-bS(~NA_OMcaOsfRMab3a@bUtF_i!w<_0m`(ArRaL7QBhmf3u|Y&Tt=Fzw>5-mzBZ~(4)A{ -8VRC^+9}MMXf%qGG_|d1njhIFla}4Fs`ZsQZV6O&C3OIl4l_pAw~CHD|0;p??%NK_*+pvwV_1%9CMp$ -IgGFhN!|0=K*5Jkx1Y-P%VXWrvr@`AnX(-DedKf<#g-C*%th!D%y>T1#aFs{r0n{1?p9g37=L7uu@hE -h=Va&z^{b*NLXm4I!jd2gIyv5&7rGVb(8*IHPabt+5KaGR$Tj$xGLE(l%L9Suf+h)Z7PH59}a%Jv3Ug -<4IRE}UwD0{B1SjP>k+$zdw@1cjiY>z<8ZPk9osRb^q&y$a=`w --p_<-~>!`*p(Be(SDNXS$Ppvv9}%DwvfVTMg-BldK8Woz%k09ERt`dxDBCKko1nSup4tHw2E!}2j&os -Dph3^JPOVx0XiX(lKTI3tO_hnXl@0=9J4~N+{Z -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 -W<&BonW)-;!C4f1R|zLYcOaM@9DYu6C -J$j?{dQV$n}U(eBw3mr1gP7t)-4$U;IJR@glg1LkT4Ihwdn4gfFrS!yp9rRB7vU@V#`!dL?r+;VEzbP -s}wbNHKwr&##WuEDZApMeMUXW-_8dalSsq0nE#3}#Ntl^KCu0-4}2GBOCl%@6I+b&zuIVW_Q3}R87Rm01u -m_{~~82^&)^5fk2fk4B&^=-;}`kg{RJlpa3^lo+1VWgCHYw89uOXc)1ZfVkFz!Bh>!@8Ss_oUtYndRt -6kYp-=XGOMvYU!4OYg&5nfM_YC^J6E0wwWPCGO@RrP!8aaGSKsG>XP@l03m#i*GFMKbQ!tMgK|h$4oF -QgkN~_ba(L#f6W;dYez(kYw{n{!R6 -S^oT58-E(2mA4IS!GK)-XWd1+M8kvoBmB66xRo$0QM#5#;IzPbo-ns-4jjD6dz#lqXVYGC`Z*$)DG0` -jbn(bf`Ux8F}`0!3D2`Y#jbev$RMmXd_D0YGH>8!;qE;+Ch||{TbJ+YHtoVlDNK7U_qrVY>Zxz^(*pv -B3-zpOzxL6a5L_3{_xl?uqdgzhqdSWeIxU*sM~7)vVdyC34n{ptDRp~E=R;NUccUEzkX?{&hyDqC0RvHn$P%64rp)tpvek -YgwXX6i-B+wyr*HzDUYc}e>yw|KHc3g1iJ0_#m!~#4zP8w=>B^OT3~&!(zItWduK`E0L@cRDtCsgSBG -nOHo1ETU>%%(_-A7BCPxp?nU*0k|W2QK}=ukBf;9%xPnD55OufD8C1pbgdp5D06F8VOaS8+jQyhIVey-~> -;XnDrFuK7G32diS}7^^2IjZPty_Gc#U5C9RgCo~t9+X?pG@yl5K-Z%WJ>fOT{b}6}OW`KG -S36=ZOx?>mY`~|39~da+tc{jdByH?`%!NGfXEEmi2v)*S6cl#=OPIHOt5!iBt -(j6sVc=ol?2z3XGj5T1t(iV=9ori&LH|b5#JQFDYQ&!H!Pg<#Z_;O!M=n&x23SJ`3*ir%xWlM^11#Ot -8mD^kR;==g{N!^Jh`w!(kYyzT4z6Uq~94)$%^y`*HtH9!c}E3V%IuH-)X@Ik4CTS5BHqSuEN(5CPqBR%!H#a5CE*zql=$LSbg*-?3MV$ -w8NM)HTiRPej~}GOy?mTqOxvV(N+5Fa2YpcHoB7mKISy^<_TuJL&%ZjeYe2$+l4I_s!x=D&srtBM(;g -swq0Y`B}tmv9;Mcu*E0u?)6@y>(8Y0n -`xJ6K(OomOp%X-usfo>UTcbTZu-xhb_LuAa_z#0W3&pN_M*Eq5XJj+p+cQKvjzoUJwmV>Jgh>$ENm4b -=-jNN(K(;DdgB^EAe0xEaT$IztE -cYT^>m4=H6#RCiGB*DXI<#(ARB^|sL{4mTZj(Da2dd(_I-PisoP{^=Hx9s_Nm%fQSk@ -@ApVvCT=jS@JKCdh&u1%!+RHw1s&sjM6r$d4Hk7CG@7(Hvry@@1;3DcDNprf!BLlFma&a0ZTSBhj%gr -z3g}squW}O3O!{e}hX`;Q#k1eVoLz)U6RrP*s(U%0dH$0DtO?^lHxy#b -!U6z9!63IWuX}kBtuM$_23*@d|ca<9Sl!Im{a4ESvm|c|)H+bY2M8Wfm>>UvN_#+rXU2T6^mv3$=b`a -pnnK=Fxj%h}}Nt&gH0z8+W~1!-O%|1RL-^uP&AFS2n`3)Oh_~yn{?)mC~OMozoV7nZgm8BqHvCeVOUP^D}K&0e;6jt)aiasIx07a5cDa)IWwd6_ES82DVYV@~ -&Z^Ks3wkNub{_Ww&Aj+>O3`Ff*slo8|;a68`JXcrHhZ>`7P-Jvzt2V}hWO#K&BZq22jCGd}DA>#k+L_ -~AwXjOE;jiWwr?exAsF@Cg&Hux?Vl`b|a!51o{6$hlxnXNv_A?7bQ|P> -=-87S~(t58^2nFiVi#!I(nea*coB4MIk6v_uAb7*-(2mHk*N}F=@TF%iVOph`H5P -goOUhu680>95vf%)8wlLt?~*h+2pZNr^EIJ{2{=Ie!)w*nn-tS2i*xicA4nyAz -zHqJzysy_?ULe<>XkVgT6N$@;D$%#0+2RKgnjy1!{;YmIPl1asxGpxoZp$oirIN{5Y7*w) -qOoynQ)n>M}6T;%MoirTBIaN&>*iD -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 -4G*N7*wg+FNOKGVnYeg*e -HcD7DiuIP0HOc7g@uYk*na9j%~;94`%#R6KgR?H6&VWUikue<_h{Y1f!{gx|98N%XB`~vX1rkch-G7!>XhX&3aLHx5~&k-= -UD7b3}dGjT=}4&8+vWYVvK+I=v^qP99P5!lUe2Qu`R740y88+rnuE1Gl9~vkD2%U%ae&~dMZsNT|bQ -46;3lRx7?$JF5QbA&9EOQIK@r)A2A&D@d@Am(}?2ePKMNkH`^(te-YPGEH(Pa>17+ -f(#h(8v@Ap;C{p(6kQE -|&lR9{>OVaA|NaUv_0~WN&gWWNCABY-wUIZDn*}WMOn+E^vA6J%4xH#*P2$Q%tS;k?ZVkE!DldZmVk* -d!6WF%YKraI8{`dT8<=EyX1!CN>&qp_X9A$IYaJBPG5U{r`N_3IfKDqFc<&>fZJ^JWW;7=mKT>3wrVa -$|AkMswzsy~^KyAt<(F3ti=PkJ?$e!Jc5=np+q>qfEZA{*(cGpLXD`cDk)=&u7Gvmi%sG2?@O*lBJRL -V58 -}ORc(q)XRa3KcK4%N7!y<);@y__^knN0j@ISjlLSc9Ol<|*CUgb34d@x1~wl1o2!II=+)vPL>BrIPbT -(&B5APGU5dH@vFh*Cdf`XXRpH$zs_Z%K2v{9{AE%U+ALx&}b1TVBA-mKAU -0>s4ds0zIpA)+Fb5$u++lvP<41^h{2CEHP5;@qInJf~6ed0zG^7H2HRVbbRpUFgcoTZQ-nW#rD+n$I$ -*2J&Tj1NEbl&0T5y~PwQH*{_DK1q3yJ)$|`PCWiZ)d@B<6D4@CTNl~+77Y>?M%A$sEqw*fydi;HTy!O<+ibZyhv~5Ww+CWtB3;XD1+1MUufJ4>F7$k+g~k)rw# -63b{ZMXw1GYm;7QipWm_D9E8L!+4t-Cl9nq21^s3Ls -bLCN0Nt-#)q(r@L -%iE+j-icK#Yc4%>9XuR|}8^ci8F$uV+S|BHn%f2j`Es(F1kT*MJd)$mIGjn5j@UM-PqZq}) -*zkV;Y9;eInBb?VoI@haabH=)n0-$}~XiqOR_|T=V4Zb!=^QF;(`5ayjlX&^4L0^!|%kuUE$vDHO5J -dEF?A#X{*fYV-?WvsptbE4I@}WqipCQfuK4d@HR5RB}me$NmKVDymf#oJGwSk!rD#hX{sOak -b#Nlh8hiQRuCLY^Ms+?3S-lo(`uyMf{#V6Po75lR-H8RgV0E4d4E -KORDw)458?evUhbVNDY?&prS+dZ149nfgIpG(PIqNL=Db~EBbIIC;+Bbe=Y3~LjzR+4bei`WA{K(Vvq -i5#!p>C-d8kmw|1zcSLR8|qUFsw1&n*G1$x2jGx0GZnlqnI5@&RpdXy_Eb`$7AT2H)?kG0D0?wE8$=0CtEW%!ne=`Cd$sM@|qV+Dz;LNov -#`O>g#pQZu91f9HLEG&T9w44z4%I!1SifGw01NfceO44HUuQX!E>jU@B==lG<$b!C9qQhR&c0jy0a5> -r|`*41$gmR`6RzbK2H|y|9J;bJzY8sBQ>OG@6yGc~(RXUFB+yt@JmEFlYQ;+SLNZ7NK%i80RX=ZUblCP9NOS{N -&B60l>f_Xdt{%ZavgY0pjCrd>2M_S_`kj)^j9;U%kzMsO`Y(WX>ZUy`9|GU>1bqouTbbhDQECt67lxo -H)$38NZqqQq+(G?iL#m%?eVA<$ -@!f{j1%w1$EI$s7EiUH*dCJ(=TRry2NBYq2it`})H-?h_SMuTnLRqX8K$qMucwD -6$LbJ>Es2Ql-yI%2fAhiyVcb%#->Jjlg+N{(93P8IlkyygkMZHlgICkz{g*9gLUj7q{n202(chnrem_ -3@!uSmEmXB`h;NaHgFg_S6jd_UX5?y}c<2^Dejir1fPCit8P`Fe%s2X&Y1#N}yqV8_QNqKPLfFlhCOx -K}0LQ|$*jbOIvQd}M_v~iug{cQ!~B`8_vC5%XbQ4vw*0BRc53e?IHRhMFv&X-qdv0Cs7G!N(%jUx-r> -?*~JQoL5h3&4uQ(K!P=geJ!D3KDdvXcUbZ+t0Eb=bPe{6bxg5sh7|TZ{KY5Q(ot?a}F!Roq-AKJ*F3M -T(8b!7-dLrjAf-AB%!8?*b?bDV#qk-XfSZ}l*jexaUHS8%w1}8Vf%_-rn5VxpTvT{%&KF+z?_;GJEcS -`yyA17)?6;OzR=fty}HAvO0|0 -6k!)g}BFEL_IKz+Y@GNkVKE9uMjZSS0`miRkN^a;DnL6sNpM)Uld%k3ow)?GoJMl%zJRR9+0atVw31e -rR8?EnJ7>aJReJ9XJevjsh*l~y#C%K6Eg7jIZr&S-)(4LJ;5;UXEOM+W^)>1y7f-MwWTQAu9pO_Iblp -I;1#1bgVX88SIt`IiJL{_>nm62HAjjuE*oqEiH`A!=Y}AbwV0fsvz#{gLgqbab-8PVSam+FcG5nwpv_ -?nC}@Hec1SG?teECpAu_6Ao1EPwpG7q0n`+@qd}F!lB2DSx)Z}Q@4d&m_11Wd)CBG(&2<1-PuV5(k#Y -y24!*+s5!3hO{mAReG7`BPCpdsa+Zw;egn`EleTpd4-5+h-(ydU3G9V9_3fH7lva+%)$U-8l~6Q>crI -C1bCncT=#I3#sN(gQI>sQ`ChT$jLtzUy>R}IpryjaG^|l}h>lt{2BQ%YL0Ji$qf&M;fHkew1QLSuf8K -3uIL&Qkr@gV31f(HmGPVU$}9-8XTWdeZiE{}m{b_1tS5(Y{N?ZwbWRquRiC~w;ua>nAoFWg;QR-Ux!n -q#}KjfB%Why}VWBm&lrOweth#W4Oz!s9>YSjDq8N}|DdUf%L59<=9bxd1c=se{}gEv0EfEU_MIOHapR -PCa&X&ER}2v8OZu<;J(L5w6u_4w`3zp*Q(QiBg-d^9!*IZJ|Jy1hyN05X2@FDkC(QAMoZ+?hnnGpl+@ -Q69nOI__S%NE)I2gL$6$LSnPl5ZXU5e_8X!7a&MPx%cK0Q4!x3(x3&d_&KU$ou$^}F{ -xb`5NA|5(3osAHx;#(v}j2c2ge0$@w^YyhmL3Dffp73ws?E~0y~xRsa@$`l$Fq4^b6X`b-EAG=0TUIfxii&8eF<~*B7db0 -7S=sGR2~3zsvW;0<$*dg8)}<{XMRiplrp_5KL -ksroP@5&CfhgT74s|9NxAd&PHAW_0JkxW9M{h`h6yP2yY0sGaSImg2!2;$yi;dSc2P^?{%0` -mDfUnVPYR~b59zN4sWXZxwh>QaN*Sj5~uK*T6Zf@F+~@B<`{1hFlU|;%My}5 -yp;G@Z*5QY3j?UmV%~tjJA9Ndla=lYrf8wME%bMh+w?Pss6h?82+pmK|RW?rjBDY+Up{@9ya^9Dr^luM(>LXN)D`eS{1!cO5& -#x4V=577yg1wn-tqDnb^Nu(d1cNPF_+`ZldDYgYms^Cql^pin@6Bdk0oC1Ie!2LktjHkN>8so-C7IB) -ZkLOsa2_yPTl(#i8-f-1V|FTx8xe8AX=4gbJ!o`Cjf{Bgobucf{EX0%1Ld(;kWQ>@7pRc7|2OlBGfFh5vZ!QzbAyBpu*<5(r;vrI!4t4_kT-%%lFLu8&-!e00tpkwLF}7UBQm$%=X=%)^h8jLUG`usHA>)u6t3Bs`!mRO^d(O*VWswFs&g*G`;w*bvR< -X*6{BHl~@Zj*P*6=E1!Qv(5_HYj`ef3~6F=Oja!qdt$fxY+wV>0v_P42pfRRg>p<+E!cf$3sX9A(dT!=LDJHDQk{HD}@T5gIK#9t2Vd>>qoX -KytKiVFfK-9=v}&6-ks8$L6)VjT@4K42eX!)_-bon7v%>D2@$RtAnN>m4Np#gdh7o5r$ -D;IjCpKS~dn+$Cw^-WQR_lFWWWAf|5SRNIN1HVvztwX(>hlZNkC$WM%L0Z?i)M@lrvQM@>86ELX>li( -UziPFGE{O<`~6mhWr5BhLngC(yS%p9`}glzeT5YihjZ8Lr1| -wc0w~sxMkY;tAh!mp-WYq->I?#?G+{vmIU*cR3fAJ5<9pjgrqSA#fY}({yjZ&L5aJINVV{)XkcsvMn+ -Ij7`akp(-z}9*%40B4j5t3MW0Zbt*@(pE-|DAiu2PfNs(m84+ZDK#Vj~NR*QM+oF`q*Q1Yj{iHbxFv7 -0=0v5wDmin`-<0Iv5`wK}MxtkcJT5v|(E6%4$f#6oAmg+v*WD*{aCxyVk8W6$mwhUYriNOOwYdhtfR) -~Uny9Q(6|Rza14Rn_j#kS2pa&gpS!E^sK6F2o4odm{Y9EK{!@tk_!Zy6C&Age@lEBF>~3i=a`*Cu*^G -|5icfZ%TAms)Glw5oF_@5CwT}l&YXg%VYRb_~$_`*QOwhP$og@ff!iT;@)LdWUv~uvf?9(*qNp9qHgZ -yRzx2#3Y7%9U{`lbIKxJZ{3Af2rg1*zW2UoM?8aK^4Z@zrjZQNeotNxTVw`K&#(wV5FpxXcV(nOD5vj -5Z-dhV)CxqI>o~tl)uZ_v%0N7HU&=Pb43=i6H1lksBxA_bfm0<7^2Q@n#Igv-+euuzDk1a)Si$n+vPI7j5YfA#CBsj`D*Ygrz)y;=~^%zYATEn|IhK -8Lm|C%cd8?)%Mg$sj4IE_2SZpdc3Y)Ov|8M3I)bBIegG$*UBO;2GE7lITLqSCB+RZ>4cxJw4E>_%qKw -to`zO!8o*uO_KmYne_C@@|82&qW@@rMH0?F9b{`BeS_xq#2oW=5&WIQ^1q8<+Z^y>)4-S|L4@&^wTi^ -Yb=?_R&&Kl;97)bUR{!`-LP{_~Tc -!r7S=fFK+UxEa(tX(>VVA@MQme^6mbs16t|UA_t0Z#9iBG2#ap7x?&J}%M5J}=-?b5Y`BZXRjn-&>LM -8}N$PnCv`A>d64i=DiK^Nwyit*Ru>ISog36@iP$p+0?dHvMJhx>f>}7WT2mB9taj=Lsj~$2d+B{4zK- -nNgu0pI&A%Uno%^?d#d3ckNt(`_Pmv3D~ye^D130pbfiY;0Q?)BoSrWf}GjfECQk{0>EM^t2hV~n^;K -{>|&s+x7_sbT<`j~fU-kc<{~b6`)IWE$v?_s;TGEPSuJ%?@DO$n4dnq4bR=B4?GY?{GfLNs>aBaZCb;y(oY66WmN -5y-+P2<6&153gHOojxA^ab?-vC$-YHBtz$dk&o(ec!zXJuBg;xo(xU@PUVyp@8YRUHn?YHeyHP4};9*M#cTY({r=DBHp0rOYQLmjYEHj_`;0>NYL9po -l26l5!@~OIX96W$uz|>hM#aToC-S*_BUgoPL3*QL%&~H3A|oKv|VFIx%R~IPWbtz2)(?oz+TzP&O=mbFo}qzKiR4vslV+SJ*~U7$W;)jOSn95yQ8fzLN`4btBIqEcC>Lc -%#Jof%_ZEtl0R*<#3vHEAkhUBm3!$Nid0wi7D;Zs#r216(D~ZBO+aLwnoMm(>vC1ixU7d2w<}MR`qd& -+TQ3fk?zZ}UQVQkVnyJA%kaSH+(OT`qNO&VF1?%eyM&pi7k+nsvBSG-%`rZ~_`z1=H&yi=Y1fO4{@_J -35I1%s3v(i5MZP^k$59in2ssa80e~NH4y0j&2^4bdg$8%OZitiH;rJ>sR(M9t7dXv;eb^rVTq}bS&a(!2k;Z-qIjto%&J=`;R>crAz0iwtbG*c^Nzy^Zru*8TMe@u~LaR& -oQTW--IW1SE|=j&9F2%pCcz(PjP>mZ^|_g>degk}W*R8>*vGD0lH12lC12brQ>+R3RD6U+~68IFQiLc -8%_Tfa&E(Yg&W30T1Tn}A&KNU!VZbbfv22_gJx3!-0Ew^*lH7-^!ejzbuB)PdMogJ_-iz>U(+>Kyw+_ -S2_M&1-{$Jv;Tz@bH8jvTt^HixbdBymfYmkr!xnQns7Ay<-}txaXLg9C~_J_Q;H$bIPKsDV-f!)O#lg -;E&SaWtM32lRfT@6@dmCn`$Nw?i<_L4 -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 -6xD?Oh<35wy`xFd1DP5$mep~?eY{j8_ -?0pvJ8-qFcm~lflm^Q$igD}4k->7%GpCKD8v>mFkwh+a<}Npxat8O<=(lX%)$4$@$l`L7duepJ@~|9- -1}L}t=8(zA*yJp#!keE1*>|b;Nlq^cvT7PBPvt-wCyas$$m3r?L7Lt_ewQ*X35Z&6aD7hb|Vnn8BnL8r6V+3-}jvU~zy7H(oz#)6RaxJXFpaiB>ktK -E%&!0wq#rT#4=?0(=R@*#~x`LFAX`Cq-D7vWeYs#IZKnLzH22bJh(RO@3@h(1hAHnCow{Tx{+oN&%3U -<-g6Nl(4aFD*94$;>iUxnA>4+gp~A_F%EE6q|6cT=OZK4hL!fMD8<{Zg+jEl0n*Rm&PW6e60bHSoBVNet^SQ*}uy6=auA5MOBeU!uq@a3SgdYpOL&yPsTti8_G!QbOmZw4&7|p -tevZvYSoTQwXy$(=DcMKx$qx}Y8qB@WNe4+=086KW5JIq70+GMa3)ysxp;2G#%y2K3K%f+pC2*e$fcC -w$z67h{m{73m0>Z&)<#Hl7G1ql_r^`7Oa$U09c2v1Nlx(hd_S;@}Np}#Cz=4nIL?}7qL1*`x9hfg7S9Y(FvM^Y)3M -Q}o_u6HNdi3=tk8WSc>si|@EYl;WwmDTsXOzL8SyAcBl9!rI@7OGJ$jsBw{-qYVoYlSy@Y~7uI?VMNG -luaGRuieJUtS5T8IdZx#0vxbs^E>l0#?dP?#~I9-EWng-7=^j@xWowC*LDj6;x^ngf=<0E|Q&bxgBa1 --fn7C8NNVH9o~fJVp9m -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 -T@ -F`a9vO)U<sA)9F4Druzi6fzH+@yzz8$!ap6mWWwv>M=t -qmEZO5G2*%FS`D58Ba{ezFoXcF`GkhCCaHg|`+INVD(DFc=s35`|TZ$q~3ecF8s&2?rH?VH9CXGr*cc -yCekEULnAMt{=1^)Z+kgeQupRf#c)HL1Lr^rpN)xraO0jSiI;RAF4cW^G%0LTdVhKX5&lQOMll|Ca|9 -p-}j=H4fyq3K~h=+RrKX@ii9-57510CJR^tu8flFBwXuY$b=v`yEy>WK9P)03sUTXmBALFIUrn_YJI& -oLy3NCvcx}L`3>uM;Lsn>+=Or^M-sbZ-S2iw{YJ2R*Ie#h?0zw!UxCs3#uC?&9TFZ(GjG-g(7UuxBKUCo}*YI -O1glzdh-x1`$;wJ-AwN -kA`iR8DRB}5DIEDf?cGVX>3X}dAFl9Vro&T>*&_B5Q%w`9+dIn&#{rREAb!vD1O#+0UW8GHlX{aLG4T -ALaNn3hbL3obP1oBVBM*(n*kOXgaaWKTt4Ck3A0!pfXO%YmRq4RmUTFqMK{g`i_8XifqYz)Tw0RT(}e -SV@*aw_I|XIx|(x-KndQn@o62Kmv!kmLH=gQ)%UXz6Rsc43#~>vQ%>~)5Q5Zp=nUFk@M%^mdjy2qsg8 -jq%^T+#nhC4L9Xpai=l{A3mmM+-p+|f8G8EAYM48g^Zz$|%+2C0EvAK~faBQ1R0iv*upe5V7c4cPHB+ -V-HbPRHDMJwe|H_Y5rxn`lB-Ch39o}joLo=_25MYM@cI32PXlezY)6}SD@GrNSvgEYZO0{K4YKk(|Uf -T`ID<(V%xd3`UA_fn^d -vR-~|L~^Ng|Yjoyz1ayI;?PF+`M%ZRNj!in0qPH(eyIP(F{*oM{zH`!R?puGjLeQB8&cx^n@Oj%1=w} -hXk{!U2(`D}+#BT$wI77nBgq3<%C#p4-U3f@h2Q4?vMMfP(QQX-D+=&awbgQK&CTef_3fp0OgnKk>3PC -~AlF>y<8_+~%z4(ubf}VB&j`y(QIUtMoaRQyo;z!g=nPS8!hKw-svE7t%dc^R6J-mJ*`b&t#8A2A_+_ -CyHVh`Z53Pj|`+)k@erxIh(8NV!*tfW*@ouHCw^Z~34>52@7ZbY`*GFyt#Ao%cK&9(n0G4_M3;?^f{!L@oUw<-`UB85sdU6wMr@K= -PV@d224eaeC7`X?6$}u?tY&yZB&uVs%avHb4tjH{O82C2Ls@Q2A7jmFUoLU7t-J!IGxbNUVHDd -EPgA#ib|4@+}1xJhKZN<9}oewU!mI{*W-b`8*2j4cTJJ+6mP6AQtd~950^}&zl>r?|WbT*u+~3kG7=-MN`8d0W>pC{{Q -!_w9t9u^O0`W^AI{s|!o3JU|HTV?Y_6&%A=dgpglF7I&eEUmBo)RInTr0||wo6;gQ~h&)P`JYU+vO7o -<;JkV`GKrxP>HujE{`X0`p_ssWDh{jDHE1qDv$=#qpHP>5IRO;&U&^uJDXPFwv(_3nB@Tuaxkf}hu(Y -z^B9?@b{4ctp1#RBX8G8d`%N|$>DQ+jGdO--C!G#M|k=&)$VY96@}NirCGYKS#PC-nw7nAjli~c>BM@#i&7CbwZ2FmDrjQ5gj-IzEnRgw -)%(YR78#IWg5dvL@bcm%0v4-=PuDRL0!U69fn$?FFyH7(St^@B{c3yqhCLiApM_Uup7NF~08d+;T+lJu`IqJ~w)J& -4y;@JmEe%3FbS3gC~esNe#>2d$y$Kz=mPLM^2jMx*7W!urz}^&)x}n`$3&Wfrdxz~;AW^2J -eoIAs5w~YizsrmIpYEd@4B!-Zk;*l?AvixNO4$}Qv>esCsJ|tknU1yVky=KrZL!T*U0RZ+A-i3!FoS3 -}Q>z;>z`e#uL4@XW9z#FXAzk@CWYKDIO9~tyHTrCDL)hyGOysn?DU93sy{{pI{Rzf~+sh0ytQT -0-)!fHV&br46fc_~SZ)1n<(Z5b$!(1^Y;&LPgUbeNLG1toPg4Gh^k(RBV!;dU*Gj+3XDhPR|@e4?516*M8+QXW~_tI?aaC6P5ZE&cM5qhA%+0#8U(OkBaG0;6MDB$!&_A>OoyE4LoNkzjaH_MWIgA<8`uO)6aN -a7k8!nl#gG_>C|%3H$0TV-8%HZOI=BJgTPc8fSz7>&GK*RQf1$Z>eM03rmOVhn+KTKUXMj$?-f%vjry -->`3_=O_+M<5NjFa#&Wfb5NBTbLN8hLCGXl&rv*3p~IfzWzuU;C&NeIE?=P@hu|L6gtR?Sj#E33*Uj7 -%Nh)+^6~Q45JG}qKxk_!CiB3n>X6jVseA_gj4 -l_fyhtY?=eouLEGe)?l@o#Cuhu*D4XoYT -a|zbOeaMLzew4Z!1LSZB0G_6CH8Ne{TTLxg4Dg5eQF3q_Z8^@D)+4coufJ7r));lt;>G?NTD&}Toy); -oyVSwd!QZR!$KLE2nt7H!v6u#)$W57CX4N)NUcuy-ha!mI~F`{@>G?+f9={%F)&~d(tDe5H^v}jq7&TsUPqaMAMG=ed#i9~R -F0E%n5V`bMT^We7y|*d8e}(w|;jtn3X0^VN -&yNnpxBpUne|%H}YfFNWA07Q}_)e|51mA$^zv#}6pjq>S6@LqU&mK+Sx2|d!e(6~RKXE6^k5xCY7wvkd%+b%Z`xnMwMn&(in>gnPpt4S!39XTcWDZd=U=ax*yS9Zx1e5I8zj>il_3h5e6?Pw2}8Sj -HD9lEcSEtD{bZ%t+B9Zax7A_HD}t6a^>VNbD@&k{qH;LCV|ZI3p5*&L>!@Ora$F9uy1Tx{T&kY)?TzQ -$gkPZ2EQY8E#`W1Td@pjm&)m6j^GZnd;@HHentIhG6H_LQ%nM&5F(xTcte70S|l4$I&Cxy;C0)|5QJF -d-p5TD}I&I+QIX4<)|w_AKS@l7|!DIKE0<$uAS%=rOM>EeR&R@fb##SMp%u8#il}YfFBS_-@7Ti6y&@ -`gah&vrAsY?=<+vtw(jk8Xv13tC6;>QPQx3%kZOa^-6l+R2vaXwxP8w;MzJD9W-a5Q=rF&I|O-1gShu -Sw}dw=a+5h@VC;i@s-ZR29}-Uc%!@pv=p?m)s*y_2B@ih7O|66~#pWhykfCW_NlkEtfuG_tR1xDz-1) -%m7=FIH%0r*kvh~HzPDNPeK%Tyq&m8MX2~jHgf-q};JHVM -fWkov<5SCRbXkY$3OlCVwSYTcWtBi_XP-I?g^PYnDby&ik -0=1dXHa<`I&Ht*04=mhlPXbhC0kvG!Hjkhj<4jmTGU|(Pa`D)rm7MielZaTjxaFQ?K_J>>md?k@RS|_ -twQ=xlW=hU>po+??ytAm&z0g|dMW@Hd!n86y$rhc4k-AaT7?xh-rIL_Nnx;@1ckOYAOA1 -F@P&UTDJ+u4>0onz5zXBS$Hq1&o7Yc7nmJ;J9!-{#~ACQ0a*tNU>)y{anM*h4bt9dc+%SAs{_>u_C@RiMqGiLW)T{pdHe5x0?GZy`Ih1 -YyXgLP;RU*w((YwDM7Xr;`+PWBbV$&%O>szSiWzhm+U% -rp#_};y^O3r*!RlRwCPdGWik`pbzbyKHu -bO)V3P`MM^N@#I$cqRdHTL68YUOLua%wx;a6nkyu$GMfK2UffM=q|mr{92u5URy<=PdHX`)G>=#XRzU -!W>SM4%AuLLl7hmV%8%RT}!=q6zMaNi+`cSR}<*vf8f?2)mhy`@B_n<=L2myPVJr5+;+sxQZwlNO1hg -&e+go3y-?G;5WfmBjb0mDah72{=m-ACBX}4FDS*ZfMC0d&A(gtz`{UGvpa7RZ7y0XM1T3GSeZ8Z7&D6 -fa+Sgp|>jmx0p?y8AeU)in|E7IaXkU`{b!!O@6Gm*p2te1O_w~_`w|McM8|cC*O{n6URU9!s%|jON9% -B6F(MBozeJze^Nn6%J-YY#M8(qllCDi05r&)Dn!P_FvX9Orjo;_sXCNjA7aP~#Cx0?=lKys$T_u+eV) -F5mj$F#8O8A@z;?NmCMd6AxBMPO}2zZ&l?0N_zicq{O|gW$lO@XnYbv&=#AB=O>e9=HTA~QI>^)$bYtdrxdiFan|3=AG|l>+dSpjpR+lB{`I_TNdM+AH&+k!M9*4 -9%qyJJ`#!D;H$a_>&tXnnc(2fTn;vI3iP*!Ez|@_o -VpHAzYgyQSJwEwuwuZ9M9HOEcm;!lz5M@3uKrtCA6QzDu`oYeBg^1@lR>isJ$wrs93n -O(5Glt-{DYrXX%&1v>3AKjLBwp8L|#uE4c_@W9u3A -mr02{%$~b5n2scf`XYV54?<~JD%52Dzk^T+W2X(Fc-iuT~UI2G5jqhcmua^P1H$fDYrlXZ)jE)Lx -5JWpoB>Qz?mfsU<9%r;IAeF2NON~_+X-kfrHpXy39qL+ASSv5TNY9X^lF&aXT*%0tRvozAglXr1X~6&My%e94e3ZYNeE^Cvsrf-WgQhs`7<>4Ax -}^YpA6qXrwvQD?$ -DyDR&6^QW4s6EV=l^}8PSC`<`<@}Tqymx_q8MQAnLp577BTQ^_4j7a?5Rdobr5ltAG9b>VnBmFjlb7@ -V0dGK6p&bsXv6Bltq1m%g#&Bi01n0HJ@=GX}xW^vm0{7}}Mp5qmyYT{#xN$?a7&mVy6yqseU?m~|y^mqUj)9HP6*31L^TOJxQW~y#dYmadL2LQ`HQ_$Ioc)YV+#~ -SC~K&?QGybtJt3!uwDb7SY1ue`s(`8Gwf{7U0f*j&tDGA)SRtLOiw#I#z<66vlacMt})+CEI)e_k|Jt^Jp#W -wG`#w0WH{apJ}BWDU7;;WhJz?Z|7%dOJp&TxU9 -ahGFnDiMo_-apFp6B*pWyPp*-uSeYJm5HBHqaAm$eo*j^|;*Mw5W_dG{Tj^%`S} -dYnSwbFaeLtZw!&~zV?R^JgZ>^DZ(Db9&=9-CH4fdsg?n+Y1bT{FTAH!)6{KiivZu#i)qASkE>~Ithx -tzm&p?l|FX_<{=+O~wkKr3V3ez4zyN+SIj_?uMt^(a>l_EeEmv6V=Ni)G6|Cuf`-O!8EL{X_$yD*SMREREy_ywhOrXm@#R2fQ* -av5OtNz$0#Z-IctpL%M?i*<;9ySBjD8lsfUEid&#v*U)Rmv=kRjVIk!QvZEkOCiTHuY)IU=HRR3@?NS -VSahL5_GhSX6qCLlZyL52$%DyxMwqLt#p&Hjz@2~E0P_wkR+zeBjDD=|%A#R{oS5)-d4w05P0cDS%J0M1&Dg`o=fk#!29IQ8g2k;8s2q*w_K?F55&y{GgLm+&KJzsa7}RL2 -HEn0w4}g-*IaCV0aoWLw0kbfUSP?Mj2>8pQqLZ2w%%L)q6=GSjZD9r?=@o^1gpHvA}_ZTFJpxi+OeC#=&J5wml=5MnY(%|CYU23i@mL(>#oBVQzc -tx53f(bWO|#lIt$Ct_9^i81TVJr;g^#Rj_ve7BXjFwK39(TjHqc$fj<`hAS^5-?^D?g0P#>Ax0i3h-9 -BvMc6=z+>c(5;lY&UDT9g$Wn! -6Oj0+lsZy&uYLqd6Ou4Zgug2q9A49H-;uZx>8{VuDvNO@9RM~k%TC~O%B96U@3mWLnQNu=kN8aG)vMR -S`WZ_BNKcU?|f%jSTt0(XR0Pa4@N^20RNDi<>xgEZ1?Ct9-_EKN>_Vq?NVv5)!4V()%Em -ueM>pMmV7lOptFptLGq{s5tg;k>~ICHN~wX|{pR4BS*@gDvvg4wOUw}Upu$!f=E+D50(?8_%F9iVQR- -R>dzDKM->DZacFbrJC@25-;yS-dSsr?HpNof6Lr^t(R$FLT#t${s)+A%99B5Md#T3Lky#H5Ij*I?cPA$7z(Umb@cR+^ou -B;PM869X-#ccEqd%8o^{&=R#JFiVi}4{>5{*(p(^^!Vg|Pg57t$*RJiD=g?YCZ=qa3*!lEjUiRvucAB?k7Nu(2{ -ZA?TGO&^Do2L2%BZ|69}q8q1T24r!W=dxTW`$wpfSo6`Ap$g+#XA6y~N_#2i{h6GjCcfD0qnjdcLs%74%aoHD -Ezj5Dk5(XDIOBnYj?8k*n -R2X8v28L4`K~r*IQd!7XZv8b~YLrTkQbccwau55NhInEdI`Pv74mZhsMZ1V#f;iBz;Y~NW@F!GtUwCf -N{T#bYe)}A5%O;e&<TmnlP0Zs0xnPOchMpZy>ZTnNwgqeB_+;L;;l95}XgurgKI`XzDFXGdFSmZ -SX-NpQ41d)^@nKA}1Kghg!Ku!YN8f+27IRk=#6GaDU<#W`{rAW4H9&YVKbB=#TT4pbsGvq`h^yv5j&7J0&xKI_8~Y~(v1T1`xk}^6#<_sxdOJlD7q}7Yp@katcJf#IvR1exnoe#S20Wg&V-9Tx -wg$LPF|Cig@7zUb7K?6**{!2An3h|(nR2#N#?6U+X~c`Yku>KZX>NzlrhP~=j1<(0-iga9rLDZxw~!J-Fi-(cd!=>#Rjs2ImP$|Hpf#P(0H#CR(Z*ys%3G|C^5y|`6vH(9Mef$J6m}!Nr)gtIW4? -VD7h-i3&On=PZ{xPvF)mU_8G;?%$kw9sz|>^Zja=Z*!y8?J#?wzDKA`Pd%aLTU+B$6fLT=9}(}$+Fwf -2k9{;`JL*nVHu%6chJrqQN0!)`1>d)7-C9}mf5`d&O`k=y@6e4lSI|ETGk+Tbc#CN_0@^>^`lh1)j-5u@5Ob?cJ6foBdQJiznP`eRAKHRB(M4C -?jS%Y0Imu#kHJpl1mr)|7d54!T(lvw;){6Tm41bL;rLLGxK_Q2H`fSp^?Tcs8wNRO_PtUL5vqrf-(HC -Uq4p3cb8=K~grDhlfZW$gJL-s3aVGc8FD8gO-2 -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 -OuAk%ArE-cjA_$_S+(>{e)M -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 -hyf!K9NogDM11@kr -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 -Vr<^n${ba|}Pr=jlQeIOT -8op7_W_}Y_81dNggdJFKixx-|t(l}-ayM1j&1)jOcH6nEa&*uCnW}x4dW@}nZ650GXpVJPRqqh%gTZF|AUk7kiqt(Q#m?BR*?Ggm -6&BZ^FneQra%>fp;$U<&RXCbFOQWIciv -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 -D76zBnngipU(tgy!2M -C#-B*4Oli$PT_jozZ5ZOIJHk0J^N62|+%I;Z=iQNy-17I&wo{Vb~Ief8<^99?7l_D@1X4ewe0WaER}^)X878pxNaNP-+JsCn19v%ZvKBY{N4Qj^Zfni&-O>yH+UT6M -~SaGtz$K(bS(E<9n1S(C-{xab9+2$r{~+-=J(FWy8D9vnaB06kBt3YpZ_5Q|C^t?Yl|fRyK9^Nck%uw -pa0i+Kz{x&X9e8jV`uNE!fkU;&zw3_Rw=SKzL(6`*GT4!?AT0D>n7dJ?!3s0lg|xDm7=a3yF#pdxT2U<9=m9lK6oAvi;D!Xkw~Oy -*vKa)ONn>j+j5EGAe;FrT29Ad}!}f~JmjWB71-k0%&Fpd$z%&=B-Q+5{?snjdxSJi%dta)NaPs|l78E -GC#wFpFRsfq@{CAeCSg!BB!&f?$H41f2+6SGU0C_6Z13*RE)}TBNKBmja| -cZ?8J_T0gbpL{ihpo$1}x-A#B~}-o^dpyST5ti~EOnao>9v_Y-$098zO9DbRbF-s7hav0H#=VSv1 -2$vMtOJhvtw&jb?@bU?O3`~-Fwdn^6ysnemH~PUF+VbJVW6f>)y{4+KGK^%KLyKJNA@KemH(uO`sE4D -myS6e|q=s&HDH6&ytdoSVl$$Ga8LjMHLs*e=&Rc<(Ju;Z@$Ss`sgE8US7_={`zZn`}S=nH{D_pm|k$4 -4^2d$+h5#*x$K!d`H*-$#IMvAx2T;wdD=7txWf0>9^(6}$$JmItLWtl#ijSjlksjjw15A8@h+wnD*Cy -?Ytw}PC?N@r~BGGwsij?A| -VasqdM{KjMi7AITQ{)QvFfl)hc%XAqp`c#igo!>lM!cDS&vdIdEuomv#F^SOB?S4h!Zr6kV(V5dH^O4 -c%W;d#Jcvgg?ajAH%lS)CzBer}C{_TEm66D1Rhjk-QOJoC|S6@)qd}+$3+Nnkzq&H>>SjUUbHxIFwkR -vkf>9*cCIWqqz&%$>D6{h28~<2zW8GBXA&aCU7C>%)#fbGOzy`pZoauu(-H5mXMIZo_Xe(dOW^x;X?N -I+i$at8#f9bKYsi;yKv!xmCtjr+_Ikf(DhrKQ4`PRKFc?!ZD&Q>uWV17n8S*wiqf`oUbMX`nK)r$(a* -mnZzfC8YZpdxek*PIz6-;K4cnd;>+=qo$rEEH4dQ%LGA}Icv3=yQWLCsiZQnEu>3y^S=@)VSQ+4%vCb -;-n#tJ)k=C012IdhPK-2;>`&N8@2<%BZQiE_I4*IV7Xbz>eL9!#Uru#k`t78Vx9qNAfl*$o~%m?b7Av -JoRju+gJOv%=IUHh%ngHetd9mX(#o^78UT|1o{~boRP2l)dvz2>YN=%S_`V+5Cy&Y;jH)do@qTKA923 --Yt%1ugn$#1yCw6e=xtp`lU7Y!T&ROt5&PE;JEc{E(o;=Cf;O{xhCm42)vyne -?Htq~(V=r?yW5x_tT3X5$En380dg&#$WXTe?bm>yIV#Nx!X3ZK=zw6hpXPY){5`EdHpMJ`Y?Oe}h{=( -U&tDJrI*=KCuzJ2V#fdlNwkt6KOFTZ3bPo8Aoe)}!Ea^VC!_A6&+&z=>0QCV5Zu3x#tez?im)vH%ob# -=Ai6+HHRXncrgtO+rVY9V9Ih;N!xV{b_fSj`_~A>5OV6kkX2pQ88%ioby3zeVwPQ2Zkl{{+SVj^h77@hd6* -6^ehuCVrppjK!09m`l@_g$BmfFQ7TiTQsKaq(*qO72_v78UJ=LU+lEt%j)Mg)L3z-KsTR(P)IR7e(X1vu?jC6yJ~H$5 -Q;U6n_fEUqJC!Q~VDo{x*ughvHM7i%wJg3l#sVHU1Nn!jqIj2Bk2EQdmPN?4lITQVLgFarUbxXV(XFc -4HD})r&a0`95d2j&N)IjugKa#Sf+ULn!_@ieEtS=TiJ76#os1zmekap!kO<{%ML|WfNZ|mq1&J-;v@! -O7Xi>{3j@WUy47R;!mRZ^C|ut6n{I#KWP)c{*x>{woc*U{lfZ%iS>OJ`*_c8?p?Zc?{D=D>lYIp9T5= -|9vT`Jk=(0ij~?CJ`}gmvq!1BJ-t-?$mWYUCkH-+8e}A>?9}^cI852s$M}~)m_6tjX0s*>p>+-1VA04 -L)iwO&l2&eeKtM?Ng9(|MRkc^3oQJ$!dZtaqL_m)y{@A9a+Yk$P2^kZV8Lt~O3Zr$FE{3$?BIY9ShiX -R$=$l)=`9b30$!Kf($!*)TZvAA42;d@2X -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 -?;wnuSn)#WB5~lFZiF@+5*T!Xmbi33N4@k -(gmqKqfd%CRo9+DgVLTsgVLVSC-wY9BvaiGf3!1JkkdDUMh(ZgVEk%KR!?Ym&-ZNVM))b< -lAcX&R^%DR3cZr5%qG9BZM1xIxj*;7Q*fFV33OFE*&q|-vgJ|gbNu&Lez@Oy%`M$osT}Vcm1^m%3!UW -HN2FN@LEpWqFtH@>W!*~ms0nf+9fqZjeAb+1|c$a8cOEi4CB!^$WQh8sUO(oHpMRgLOv}aky=&`MF{L -x=1{2vq))E#x90NN|?25!Jzp#^_8rseC1hKB9=1?rO)Wrgwi6 -Z`SG8R6VCKAab&MsTz7DgNEphXoC`GDdG%#<&~))ZYvKCwvwFZ{P(JI00|82jH#L3Ho?j`55CbXaxW7 -oZFXgB^o{?8a7TR8mKLxJ%fgoG7U>)8Ww_v3H|t-bfO_Gf)}Pn3L5aBPYSY;F?>I3od3~hU<`vC0a&| -sEq~{ocR1uC1#Ii&UhU+MKmOo{UrXT?CV&3v45ESB!UsgdzvcFfKIwI1U%o7_FMl~VlrPTK@#iwbxS4 -2}O*G6T8m1EscpAzWV~#c6{{VmD1;PKs*Rw#&?Af#Vx^?RWJ@-S0LJQ(rj(os(%<|{uM8hXUgJ{o01N -tPTJ+GiXX=z?4e<@eTpC=j?5DoK)h7#hV8G3OQsOXczY-EfNsv7VAfxp84TCKJ_Z~%UD=gzg#(2$OM( -elS1wft{M06yxs~?9Qh>>YT>k -MS}+qj>*o>{v5cXJ)#X178VK`Z29ZY>I5d*RKqz|W6#&S-m}UWXwPMGdv5UDQ~m+|sQUo}2B04JTW`H -3WG~1vrKP33prF7?!@cOZSDoNNpR}>?KH4+U&`3XXx2HYIY2m_!71Vd~9zA;S*ZxlPja3EK_N>SlOXT*vklMnZ;s5EUpS -qB&GgQI9SFc`vX=!QMsi~<|)Q^gKSh;c~A2etXPe@4MWo2dj#TQ@Xix)2z_+Wkyd_e=o0*n(19hk#_2 -K1-kLyU#UW0yICAAJ+}-{7CGE~t|+3M3f=?HPU2D^uct{-4gjf`fxg!=NL -^5avcOySffINqOp@<|~heD>LAf**i8a77&{e5KR}=mYOzo&&iKb%FMPHZ9sS)q`z&eyc%y-oIrz)@RX7^`ql%>#_~@~bTm -FoG6u%ycczE)EzghVr@q+CZ~XS#F{XJ%%Ka;JHv;3d$2b^ -$tp8|Y|A3)Ubo4ukJ8Mx(7@Jp%JcxIsoj-GP=y9wPtdcPOL3y8eU6)OJ_o=H`C??6c3_2A)YtNdnNO6 -&fCY{Bb^c@?=pD7&DZ$9fc0y3;dNeU(5|)qCKFEpglBf?-;Xf=N_0pv%k3hhPDO%CtiAe#*7(XqMgRX -#PDg;ripq04Zy!&zkYo9@ZrK8bpRR^01e8#7jrSl*Wi2L2@^a7+H83XG8Mv8U-B<^cXz*y8#g|OImF+ -=AG`?wFJZkIZoms`&PJnAwBPXXaIVwoc<Ms -QTME86@Kff+ihO^L~w{G1kXh8X3-H_UcpdlqCg~!Im3f@}1dbPkGWsNe29eAT1p#On8WK-}DWNowqv; -njUq>Db7aKBCI%yM&c(^0*z+_h^Lt|*1h$N7HoN4~c5k5aAx%ol+V)h#F40=tSud!YK}#BYKJFh-$_l -{m_JBKlF3Df<5n8#eIw-g{4sf&c#ZzePNhHII#Ax|gJ|p)^91k|#@a^K^acK?8%2hIUI%;+UP76p4ZV!b{C~aN>)~(9|L7wcjTOfu -e|b#;Af=`13W -PP9Wby{=qx+ascoa%-y?pi+&enfc6T02mWXW#E+~0LEHuYw(FnNPgvJ~Km*23$S>&szy}zQFm|GhG3P -|tqaKv?UDN~K(dVPDML$M!3Zd5^n*V9s1^(dOd-3_*_}#WIg1@qEfpP|o;C14o+ax1csID-scKC;J$A -jZY9{O(vt9UInyp;PeM$@!>*oFD&H;Bqe;hkoHabeG -8g=X>P;F!kZ9D9;*OeY&#OL|H$VW&Ya)*Qn1uM*Zf;NEkX(=o_Kuf_?>S;#iCQ>N@9#f4whVZ)fz=Gi -T0BS-g00B5;80g!u!;NA&9$i_lj?mW7-GKiKh%wAASfq2qzR6KmSg?_fHDB7+jzCHrHgvcl?MDE^0(dl&~VQK$^_%rPZv(|H%*CR9dm)a1~~R7 -&XX@mdeek+lHOO@KVZv`&<{b+7)<6@^?9;0#uS>rrjVSQXuA&s^$!^sxM2MGWJ#7-1H*bS*5sA^0b?# -ndQa%v1V5gTbZyY_fFGfwg02&K!VzDHsC$+CF^x -9rlN#`&PS(*t*9RRF_|apl)ITWsL;kVVl{VDB0~b8&W&Ome0%<+=`jtz3#xM1806!)+;Kxu|XX-8UV* -@>%$e-p(DNB|tNwmcSd4tbk;(@*mYpT#MU`=@QOSyllGraUW=Xr!n$Pr1`hBg6xr)~a_E2d7Jnq5>>G -{IK)3LLO*g0jGa^>yf)-j(%z&@*8@6#NJs6LcFUS-&)GoCGh<%n&#Temq>K`)-(jLtSt~9Wd&@Vos>g -cR^Q#HBGFIEBuIcap+f|n-DrKIsfUYQ6jJYHvAZ}zkdBgCMzv1OO1n<_HtRjfHndB2y}(T`UqFWCJUzwkw9YW@})w9^@?odvDrZYOWqcpd*zQY1?wDG(?uC$enoB3x|ZHh -7pBw=>f*CS@%-xfFZq=pj@R*{p^hJ4EgXUD8y){CeS0PU#Kgq2p`oE--4(j&jEoFEZ{9pHzXMK6U!e4 -rs2`NgHOonU@b!uOBU6~z3!w1h%BfL&!wb2*>ilWW?;`*7?c3K|r_)UZ9fgI3Ib+9;-J{WH_{515#X9 -hU1q;O5g);X+nZrc+D|;JJ9u3E2JV=wm9VOnnr~KEeSFd5z?!`P1V?FdT&@GXi#Yc`DDd@i2T64p?QO -0p)ZzUys0_%xD -(~iw9+(tnor#hE4@?JJGQ8FXU~_zu_8|?V1F}qrAL4(KlePsUsV8_29pss4PmEw0`n;AAD=#`ZodX>(BbPyFRs@i$l-Y)%*4q@Mqub+J3uhjmIQtc>c;? -_-Ymi%a?ClxpL(V>Z5*Mvu4e|-gx7Udi~D2b?dHB8aZ#j{kCwYFpjHMt%_c;V#T( -1-+foqr!t12o~cbAw~Y^dT17<#)>&^+8fS?AuA?1dZVY~XkLDl=r=)#Qp(J0wdQK#@MTw8F;AzNkiae -vVDfDH@mC~FE^660$Ykc<9laCq3VC03irp$?KWxrxt+i(~GExgX|zn0E%yyc04EWGdi|e -hUxgFpw8Ncwv%A!}h7VC9UaT9RYJTlppE|W00~3^^@6=Lf(SB2U!oYCS+aAH`XmJ6=`73F@W$u{f!tg -Lg=~ChoKzK?0TJVE)Eg%NyzSy+c9sz+-bVLzsMuud(PKVxxD)7t3n>c9uer(P?zABhO+qKiuFS7pFYk -ibA#ATC_fq(M85@{9QF?=V=12Z3;Xg*XO4;T#2l(5L*#G0(FVMSz8-vvx*RfOh$vI^)2PeucC6$ZX7( -5RKbK8;l7Ig3n~1+jiN9^zHX*Ai`*F~3L*_z#pg*<61$K<(w)~IqO8qN)l8_e0N#u|52=fG_jeeQN{v -zA>=%;}<(m`23R|J|cW@9}GaWT)v*u87lu6l9t6gsa9b0uI7GO&Aq62@5u7r5IoXQo!WiqoEO;+h>!b -QNznZ_S?JoK~D1fYa6-7*2J?8_rsDWEzdsJK>}?Cpn~AoU_(M4yhKWtU0sbl>B^s*4WIc>M2>7+4&(| -jCt8X`Qy^{Stcq28G4P&$qGuz&+1*^*+rd|lAV#J&o?CM^YSxtvO~If_SSUi`#>|bI@pk -B%olg7+-GXuQap;8uODa3%P>rp-^nFUKgmeB=u_kKG72&>_2c#VR!>{+NO5r;Arh-E&}XVM@f*@5B|k -d5AZMaJuZ!B45jGANOoVhvOUcaFcj+74=Pr@!GVgQu+=Khn!!@{%m1ueo?xU1v-}tcju!xB0f&GUMmo -5K!|L5K@2;;+(W|}a~Q<`TqWtxqeZJOhnw>_JAb@ht#8tawqHOFhQ*V|ruyuS1L&CAXEVee4yq280c7 -kDr8e#d){_hIjg-amO)dpr0%=+n;UF&}@QV4r7wUh( -SN$&f)%rc>zrp{I|M&i*0y+e$1HA$l2ks2q7kDDDUC_fp{y|Ye2|>w0IY9+MB|(dVUJKe0^kvYwpz0t -yZ4d2J+6--;_C@Vy+R=Sgq0>T5p=(0dg+h$L!j8XYkfu^I+Vc<3%U)l3$NA*>6#2~edD&;R&)Ytq`t0 -&KsnYm?V@uM1w6y_$GG;2q$7lIn+hNBNBLN%t} -Nn0*%cEcZF)bH?X4pYFclzR&q?^*!(Vi*L2>qkjE~+R1*O`t9^P;n&&!G5?|dnf~+q-}C>@|Em8Z0bv -3C111GL6EHhqYryV+qXEqW+fcm)20j%yE^uDpOGN$Kfh9p}gFXm49@I^nsm<3;*FL9xL%UJ?vG!Z-dF ->zCR>AFp)xqAuNx?4#R|PjGx{ZA=hh7V1LScnls|z%Rn&&mIX#&A{-X-20ePVr%_|EZL| -J{Hs0ZD-`1nvpE5*V+&sIAd{6g(>AnUEDBtglPo$NMsIIRoxy4fXW(+UMQEC%|WfPl(?O0ZRgw1-u@x -Cg81rcLUxJxEOFPpmkucz~sO=fo+3^1dR$Z1T70XL>zWhdqV3G5=8YfEo5uR-jJgqKZN`o@?Pln&^@6 -CLXU=?0KQL4brhkA(WGe>XijP_YJSuFuIcEh_6+kJ;5pRuDbF;|Oi!cdv!1g&7ka+v`I_fys<+LaJ3S -A09`pRxlY6%D3i5i!tC-r>dauo1`@PP4HS?b3{igT(-j&|JcnA6Dd=h;|`i%3*@X7Tl@R=^^?q5DHQS -Ghu+353;&o<)ay*>x2F2C{l&gUl|2j8Z?t$ZKyeZ;q`uLrd}f8QwICw&L|KIQw2Z?W&oz90L3>wC%f2 -Jv|l;&QEDxZgm(8viK)KLp$eXdBogFeorKaDL#rz!|}-f=>rKgmew*6%rAW5i&m{uLsT -5%_-7#Gs0xJweBUnrXXe!?i25k-_@lVIhSfUx!2j|6)lm+F5gj+L -52`;PI=@Xhy~Piep9dw}|y -K)+aOYv1^F@n7V>-oIObXFx$fT31MCbyRE4dH(MCh*uBaiGFYRSNgXN@DET2nW^`Ap4#B6!ON -+x-wggF_+aq&!HyxJAwxnYgv<;1HpHp#BYlJVj_x7ud)9c?dXDwV@|sIL^Z&JX{wz)eV -Hn?oh$&KB5i|!WQlto&Vs~bL6hR_faYBkK -6b?L4;fgCF9J)n{fGMts;G0XOpJAU5Fz@_%-rvJCGi`FsKKsaiu??Q$X`bO(u5*)^1^${hd5gDshaV8 -RKjgmV?%NOT@AkQEJ5}es^Xj%E4rnKi#Agu*lUQ>DKjF(=nOrhpygKXaY=hlmlHFr3D97HicU0{Q`@w -#*Yy2iT)a7^iWAmx`C-=mDX1}y|>^Jr!N4t8=c=1qi$ZVqAA*9U-ZO4jHvdpIH6oR7Z -+kG=3*ftZp@9lNjL3gUDKrjCaXIxR9*#?RT;0~)x3t+^ZMQ=FYvV4YMxO&qnmn3-_l$9P(P*pywoGa5 -*T@^?HhHfJT@kV#!@WLe4<8|4X&PlU(@1it8?(JDrM`Y)w0@Fhf=C*^{hT+)zBJQfe75GJ9Fp6%Y~~U -f+%8GM;r+xiOFg5QkIg*gaaUtJ1C%t5+0z83Vc*i!zQ-y9NXAI9eZe?i59x(p^pKE7~v2{7~`1Sc!E= -W!x>Rzf(rzgVum>`v4AEcGAd(oUB+cXCS^*dWkzPDE=}o3$UG6JAp7!=xO*l88B+skyCoR9)?c!Jc4cm4Z*nhWX>)XJX<{#QHZ(3}cxB|h3wTu36)<`xlSw8o&L9i~5Q#8oG(Muinm9z~z ->J)c8Hp7%RZuh-si4wuMzMkk*RbDEY1oGe+@D)G>72ymAH26p+JaX<@YoD2f -SKII2@80jb-_J*8&e`w1_S);U*V+@jWw~G#1R)*%3_}oB3jCi(`0xJ`@Hc48>OsQ4vo@c*(h}Hw?)14 -oURbc8=Ki~D?zp$0>W=&FyI(1|^R9xL(0v6zzOTSL?Z$$8@1JwmC3$(-F0+ku|M-vR?lRVOCI7l#pV> -7Bz8|^s{;r4V`@Swaec#eGAHL^5c5~NkD!aa`oYLQye9#EjeBFw=7d?5&D|JRin@NbVGG^Cw5`x51@MGAaR*kld}=bnCInF1KiB{g&IQ0@?fPbcs; -g&)A*_7lr_;QuAOm{4De6=A?b;oELGxm@EV3wS}ABg|FEh3~UZDd)MQW?@YgJQGX+Ho_0#yYO`7?wWr -;6ubzLxr48T@Y7SuO*%6q{?GguZV%lXU?2MVN@(7wMy5VYAjP$ueyw5U8=jyhjE2#J3Jq*{gRU^tg=6@*RAn>NXjnJ&8=QC -yCjW%XbIvt2q4`e8?8cDQ6$fVBsrla7h+cKBJlc5WVa+a`w_mC?+WN#(XkZi`>^?(iEie-RY+mL1bOW -Tv=EW!5aSnb5zwuHg1&>c@fo?_$Dh}>1I -?X?Sn#5RQ+AUzl4rEtLWmY9SS -hO1w7k;B#gX{}}@k`ipbf(MWXY2gz)>1!P2#*iTe)ffQyL6j0OPV?B6x{O2Y^Th64d)e`p<{KN&+G>XL87Ks3GPrKBs{)IKGHHM5X(jCd;`idPYUdp@jJjZ#P&}}?WHW|y_$I>nHYm#4wBDnJQL --I3^8(n_bG2uH#INc$3<`maJ63&td^S3I)JISj>`k -7|RcwKxg;SF?RvhMHsJeD6jJUe2RIx>;_34 -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 -OSj30ZANSSA(-T05yxK!x|DqjefYXb{nQ4G> -u!Sg2UM|_BeZL#w# -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 -T06p06)_zfKnorXh$`dW# -F@}IGjzmYVP`-98Z#Pt;O@t?Jq(HwQ-1tyoOD2^Xt(|ue*9?8X^c-!(!PEjiuhRma!Q-PCNdej&lg7w -GZh_SP)R(e5aySEw=K_ou6h!2tJ!S)dSQ`mjflbYqtGc>lkHQZ8qmEtUu{N;~5VKMC?T&erJnd0EHO9 -|NjP96484-Ed-W_v@^%0^}lO5`3eR9ManVJv$2=dfDU#o3tz>)rret@A%wYBf#xEhOPcc(H)d!4_{hP -O}-h(+O>Xh))7tTrB=f$@+uRv*P9(jw$~Me_jdCRv~pHrZvgMJC(BhaMT>W$U5(^Hb1yM!#8YFMtumu -K@%{FS~JSU!QUg#a#jAb-oN#7yYzIu5AaoHn&O7gtcAw3CvTn7bwF^wzDnd-}BCNq)rJ#tpA#V!=^fx -d0oW~7Jb+|M7Yq63W~DzS`l^aJ}!pWLrL*1w7PI_koo=W{v@8;BH>}f_Rvyo@cFpqCWF4TypeX_5ScZ -sq^GHN+3o!M0ibxpSZy05g>Ccp0VwTS`W={W1*Uk*muRAyY*$8+BT@qu%kyHfEG@5++O}g>H?@!!8md -y6w3f;F7ClpRqUQ)!{tjIgvl|ARUbNlK;uw#Bh2X!xt{1~@7Zzjr$PGX@Z -g4<74}5pR-yWzBUmE;%!CxZOsXuAjm&NA6@CP;EgI9rvPW+%s@U7uT7k(r{9bL7#E+IbsbiDn4rp29z -E@9mF*K4V*ylX#g<@gIk&P;Or=}8pVUv~_8zUG0fR$nI)XgzasG~ESsI7zmVN&~4$k>!~{miTbA-At{s0tS>RGYQtpf+r8-vhd7nic4lU -J3yLGWC}uLialv3CX)ACc<7#z|7hrTtniJUGx>@5@+H0WDVO3)ryXg+Rylgb4}0;XxKoZDwP{Uu?4VO -pzZesox2rN>J^NEVGY}npTPFzE%O=}hk4}6vWD{54pPyH^l$`rQqo6mt;)GH4Od&@|@+cR*u?UV+G^W -|bw=5XV77_KKsC%e;9BQK@Yf8R)w_Pxyds3`MWV*|N=Swqg9N=6}8@N)gib<@q)wc)L|H!PpxPT+Hcl -R1bi4iH)p4yvagz@zmfT{){X~SRP$!)tX0mD+CrW28_080d-c~`z+82*@HQ}>OT${z16xE9pGdEJ%Ey -qDQuw21Zdp={kz+|LgT*KUQDp@Ru~lj|D4Jp+NYAH5l_&cLMkf~ -`0i$J!@aYOc4a8g%pBI-)A6E3c~SkMFTlRhXPfU&Z__1rrzB451ZFz>Yt%|9C}xzl=8L45t98&L9sKO -E0a^v+lI`T5TNFgoR^IH_v0mp?R!>t3L}nIyk}rPtp|ld^>uzr`(AN6j!Q-+(ah7ydn^^yIWI-?;bi0 --s1|{oA>IOry?(|1*viPF2d%O+a;w)eNA?40w0cfBM8c=Qs?^1#d*{OQgowCscRT5aGOsWOF?~(y^uE -IK_q0Wf@I=n(JRK+@1C6^@-4SwuJgF)_Pbjo2k^(VMxr~w7&su>>x5o%bBez?uDyF+~JC+TE`p79!Nc -9|mZz68%(`2J9;MNun_eXse^e@i9;8OjO0Mp{QTVZC2q3{GO~6_WwtWL+b}NK@-km#gZHv5-R*aO8p^@!kgd -gDxlr`4&OhE54O8Nqo27f -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 -@UzgVs^ -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 --Yx&rZD!mLR%(5)({j=oudLEY^VTW -1dEd}&#_%Wtfkm>tS#7$%`JMhga;8?lBAe5~s=U?0_NkLs)WkCm3D_&j38PQB?*7f$`44cn9!=J4B?=!rYAO6$_`_4SW3oWP45O0@ -`54M=|!rz&f=q_yfRb>3hrR0n*J#j|4fNhqfX#xML&DXjkFG9aHEdzHn{d93r8}8=?xQ}N*4=hHZx6c -$cm2BUZ@Pedmj+k%mLpLH65;!GPaqw<7Z)$s2ZIPo-=3!|cYXtyRtmFWq`*=89Sgze$)M7Yi+(-l~#| -nyv*WI^tr4Cxkf*&GAD-()|`Id(kR!E -;XmOP2p1+Lyh&PO)Lpo%eC;SrO8GLO61AJ{K@bK)N^0ht5UzKL%(5_BZkN<&YBQ~ -Iqp}YM1H(^Fg(AkLfn7*oM{WCIsRr!oC9QH_2%2yR4u~uuA?I9hzrQ$)IR$&1;DQUbI -O;M=6KUZG{+&@pHmsyC4c@8KCF}SJ$}}y -Ua{qbc*TqE`>*keS@#WyS8Vwo;}z5UhyBE#&J?fM5_j=bf?M;Onlr7T%2Hje`} -_HYJUIT{H`|x7+wG01Tbd$(GB(gUI1g^QyeV{@Tm240gPjSqz?>WZ2gY`jGsLzoH2m0^@IS%X(t9Swq -1JK0LCf*e+yvj{FU(kb^zlw2ukhBVW|Md-~B%eU?lXx0LIpn0~n|90LCc;0vM-I0OOSZa{?H5KmVTs7 -$GI^|6=b=0HUnA#_>BWGAufSf`X!s3X0-_f{CKZ$e=SgDDGAkpbSE>Ov8*~xqv`{BZh6Sm6ny2t#7Ma -y^8yWic4i?MP~I7mQ;#p>iwT{?|p^=LGAtC<@^4>1|QG4+qvi5_1rz~aXbgGx9I`KIs^G19$;+qI4Y& -<8J(66Fn+xf-AkO^Z#cjh|C8ff-GBN3u68={Q3NU62Q~It{lv(D=}jTOVi~#SSzMbUM&j&J -Q$}=8wp&o)>bQrBd2L{nn|WSNV6sL?O~Aw1KF0~LOzaV$U6i1tGq_7_z(1I3ZX-r`7OH -*ut~qd3yoP8?}$BaSrUevTH7H2%`Qt9clEacjQVYk2Ic@k2HSiIMR4jKGL}FW=9&iG`ypK0gp5mJnc}y+C43 -fG(KGKyiY?MXT;=;f|jGYyVx`0E5$u6>(=<3dhHBI;wVhwk=VAO)}9&1y0Iwq-T}soI^F<7@sEd~wfh -~18f)=MuNDq9;`lA<#(mtk8fR5L#RoR)o^p _Qn%dC{YiAgNPF?A}KE~2 -}-O_%4Q(rb}pdIH{t}S!x&hAaa`@4UKW*U{>Ex2KGncMIZc4;C#01hpl8I$h^=KE@<>C4vV@rUa2`9p -QRishl0neC+f)oyUZ`Nl-*pBzib$3(&B6-M%b8qU|0C};&l8okqUahWc7I&^zxkZ)n|^xD3v4Koxv)r -JaP^p5!*wPDb0SHzbY-OPCH;QJcs`PVU{_qr_eD5|g>w~zH@#E8 -8Z(=ToY2)6wntm*^<8Z{FuGXP`JOnbt^BT}028a$V^0Bp)|PI^8h6gC9TR|1)`F`8N*Et=W^m9jC_&1gW|4GDeRg0nAX@s{4}dHe~OeEybRfWe-tG1wmtHQ2usb1$ -sKNzWW+=aJ+agWInF<*9?da1&1a6RW4*z6$q>)n@V|Cf#3VdjVeHCmJw?qPu>x96XM}!BUqx>J1uInf -vMz(s;DNU0S&S<8a@w90NVd!rI-}FXviBcpc^2`FRZgc#*PmiORC^8fo3rj^%pC8EsbAWAGdezEOBgd -Kc8n!jK2?<#s#{9J1Ga_DlR24fQ_}LrDHYC_L6F&ikoq;|l+{W^2FKJ<8$pCGc5$qVSKaHa~1bHGAEI -gquCat@dM1#0QMsKe -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 -^)k*Hsg*<2fiZUq?RD`Z}_v -#dTy?t-O$Y+{l{pvf?9rC0Wl_k|9TQ#Xms#zsmM(d+MUXR7I}Xp3{R+@^vL)H5Z{e*nHD;(KWWwTE<( -=-yjd88?@VSU05}-0jX)D>Eb?(E6GolI98HXMd{bL(tioJKk92;b#}_H!@ZQtufyeuquP3nFDX}0|21 -K3;j^5tCnuEX>_>1p8LU9x*`v1~*Re+_soLDQ~l8dv2vlxMC_QQ2y!?i$-bf0{^?&{F$fC;jBAnq0{ji+Tx#W(8JNi -DSG=KT6|eFuADbK#^7Yp5P=>Is=;p;c%zEfL@f@%Ma4YaJj}OKOK0mrad5qc^{IZz7RGk%00s&V;N(t -BZ7&C-Ec(X9<)ig5uaXo6u*j`2)(|)YsRWC*?EJM@HHk$2|>SptGakoNdst-FBF9d^H$UO?ktI6nv3oLd{`(DNS2=t)DGaTyx6= -W;GA%FZLpMqSJmIZ1n7LGPX9nakp3-*4N;6X0bM`uQ|wAMSA_keYZ~Z#4_<)Y?`Uk?b1oMDvUcR9jnD -aS6(g7CtRP=M(?!VS=i9aI%IPg&#+#b2XMrX74PWnJd$)@uV=n}=`cL_{?Ar>kjyF8PflQ-MT>CaV;8RyGHo3a~!Z6Kq1FRC8Z;~eVo|s(gM2 -?$Eg1XHYElm^o2gIlyUsTJO{_?=e5AGd~dK=EB2R`a$nNjj)1iZ!200mwgJd`U;Uh;pyl^xtUGV?#Ld -?AIyG<(U6-4>Hb{yRl+=wZtg(p|aCYXZh57&KV*7#7{v943GL{Y9QR=i(ANd38VG9>V_z+uU*+fri;- -h$&nwdL8;~k+E?;<}C%%1i>*6Rw@MfmV1lzTk_y*Rb1#@l^<0Kb81>W}AYn%tv|FCpV(g`Tg^vwUO{k -0@uJckUgU=Nq2;{_F}y1M5Et=t*?o9D@CU{0#u^X%9@Zp+O(}3z9zkJbbi9PAAHjt*Mpb4< -b$HIDczaMCP9(4wDA}TAyxpx%?@qjN;^L&L5FZY%k5wvE#dt47;lq#^Be}@oNSIml(3g#u6K6s%etDs -;EM0*LWN57`jTMP>y@>aYspy~j@9fD*!;v -_eYK`_Ykd1Bz$m#9UXrpVjeed>acb#iByB(<(?{1ulwD7&{N1>;}E6#P%Kd6fF?IpUm22U|>!M3L?ex -Fp0JDhM%lHI_npMz^C>u^1z)UB$}eF0z^gWab}U$C7g%=X;Qdtz`yMEITQj -w%u;W8yLpaSMpS?pCo!r&KEJN2GhMVLqvJpkn@ro;Q1A0)17;=69M+aIq;h`2_Zj=cSD>$`3oLTKc?# -T@6s& -Yg0>D{r^SPoN`rkTdw&+RwXqc7D~8}V6MyUwc)Z5!A-wc0 -u(zEOJuBI{m*Hyk?CE7uoX!M!S$kC;}c3UKpM1?aqDAa}4s12)d-3u@5ErWlq!K0H37YNw|WAG$T#jb -3WB3IL-)jdlTOr$M_=d;u5jtI=LUd(If$hqiS__6qJBh5`v=FcdVfM>q?SN&YhK=Ie~zX7a;VZgAb#J -cIOfznn)bgY<4-mG6?M49GN6%P-0^S71k&*Ow?NgRLxwM(QEPv`KozL?J@*>|kn|S_gcgi25h!4}Z0n@h*?Ig6rOfX1jSB-Wj(XI;kVmXA -_H%X25j5D4=n9aU7%bzXR#U1-;I6H)=So!R8vccYfj}^12XB(e-##v{V9=;J3HOmNJxpFP^qz3*T+dO -}%Jg4!TaZnC>uq;(?pN5YRS4$Dad=^?;_^=;Q731+j)yBA}&6KeD%z5#6^u0Y^UfGr%?ZqYTZ4gEpkt -5FnOM?K-U(`VCglR!_j!SPG%ihWCybw?d$IDFnO4qU}ElcVN4B4}B3*MpzRgtOLT=O(Am$YH?;(Kw+1 -i>g&MgGj2W5&709j8o9p`dz>chi@}h4MWc?4X#jEG|ku@X2lz!8?Vie|1-WadY9KP>?u+-Lm+l^~F-x -+BMYw`Z239qjIyHPq^<-2-~M!Mq*3c6b4#RB+i5XjAfu*iLdldmV6p~Hz+*^Zg__{29I+eWpm(K`(> -@YP8wOr=fOj99$Z_r(6y_rI|%E~=Ej}p#e3}$4>P#4Rfv{m$ek}T#>=7XN41;TOScgf5<_{0;6_?& -uau>`xIC?UIAKEo0zu~!We!OjI=a+i`m!_)(-QF{AV`mmFz53ImxO6p$~gtJ>%gUV(=BeO5gz -L)yD;+Zv|0%@VEztP)2jZ-D;1?!i$^R+Y|{VLAM -;x4scN`_2)R@&X>Ep^Y7?-tY-9-;Ui#9`?P#%f3qHYK}(NmN&7bcP(8w&314oCW_BJU#R&7gAM(FPDR -b=_0!e2K2NpsLtuTQ2nKE^tjQRQd@|$;Q=`!>EHw6ApDs?ycrTb@a@Gw+`x!;br8SA?w+r?B)2g}oSp -7^*AhY!_>m`rIPw&4_c=IbnNATkR<&W4Lg`YWE%**=v`)3PN_+GQw4l&7T4w?TTPwDxcu`;|LKkAyAa -o-({g`~CLYWUb+rcsUsU)fZ%p^)t8{W)*DYJK}4FHouxujMtyZfNKA}T+w_)D7yn{}&IX)m4XQV~Kb2 -ysUyFhi9>kH>2ZI!Vvo?-*9~0hB$pSnFkXzjGm^kHUEmr#g*YpDLF3Hu065eX6222%BW8mQ?wew)a+J -6KU(C+Bi*JHfCEI?&f3HYGLhf((tJ^?x;1ZHYTXq=FPO|1Gyn=hoj_mH&cAuKnts`9fdyh_Cg$@t2Ve -PYx~>B`#}q);Y}91)D2oNHJ>fn*p{u7K|re;{C{Jl{JtT!!YJQ`HSr^UvkmbIP7Z7Ad_rh07%Zz{!EWSqbe2jQ;;uqOKp)kYl~U`92$mZzorc?!>|jir9UM -l9b65nmdCT7WUEDnT{oxXEY_3c)Gmgy`eB9n-W0XGmQ_*>k83X!p3HtquBi2#aM3B2(j@#c590dnMw^ -c8tFCUifT!ed!{+S7*mvINaZ@FO5^$?@f-N3HD#(>r-rB&&)m7TD_P;tXWiSxLuJ -5hA9+j2s>JW9JQ>i81KE -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 -*n1a;y{T5 -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 -G4&RO`4b2{kQa5YOps0_bjp@&LFJ; -N1zF=UD)kOoj3Z_W1yxn+Ek7!vfqfji=Qvfa9lg|3-jaXF%SA9}U16@VQ~R1^7CAK7hXkP&*UqtS86| -ux>Wg1*L+)N9J%kB>?B9LLUtN(*XvXxap -HK_kF1nV|mxO&!3fEJ!yG1%u`+9xuZ60{;-;7g?PCX@D!UfezR|2{0gs`$0G|hx3Lo#|-I)bO8Qp7Uc -@yYY##l0sC+ZltcL3AYLoLAQ(yn1CH<)_(lR=2e9YEJb!}$j#$X~90~BmLeVxZB4o}YQC|QSEaLV>0A -GVI5B#qOxLepa0PL3!?I6+txFny4#e;Fn3ZQ&~{c?aW7jXaU0G=w~GS&fHwG{XVKM2Kec&9_9J|B)|(RARVDRAUysU$PV}kfNz#V`w9440DmhNX$WxVbG-cQ0(jSI -&f6@2qt^gUu#W-w#2V3V0Q`LokM{z={O5VuKxkeIx*YgN*zZMXub_PP2lxqm!GI$iybkm-z#{>+e--K --;C=u{zRGE4zDCIR>$xlvz|pVscw+#51YaKb-vn^un~-*ZR{@NB8~g*F2=J-5d0eXiek1T|fSumqbOH -coyu<5JCcrj-=k-VlaP}7HF91&k==(93%MajI_>|DkRsf9rg!75;3-|)S-t8YiZyU%0xCY?V9ng*ejx -b;sA+JuxF5j$+I6}YE9LK$vkplng_y6{fpJ{hx>w}<@=C>nkZ7mz_j4y_w$%i~vneRhXd*{zT!i-1g`K$RpSLe@PxDY*@r{A%9noT>b`3_2|y{UwU;}<<-i1q=Dw^lV=&g! -_`cn4`%mI_WSi+U3mmVNW=6|o_xEY!+AajfDh;>uN4pRHC7%0AImYhlviJWc5oE;z|0MYj;!nXRweU` -AK0JMj-(9`oUK^{|A$|mTG?>*NPY$Le}vL&)3!BSWzOgy(zj-H17*%E{gH&kozXwLF8m~SX7m|v+?gm -##E(0ZtKBP>RJ-Pnh9c12>2rlokxzI-)5@n1{+z>&ZskMOnC24&e6H|$z^8(*JH>LY7G?cb(Z+BQm;Y^zOzlJLNiUoIwX0A$JY-`_*&A8CvBe?M*7v~6j|$TtBdJrMukL`pwOqKixWY`bS#5 -?MlD-uBTnq_=qm(qBU9&zCN}OIRs}@y6or-KpB6J0-5-BRBbEKOW*!@pQs8iec$=^V`xwLPAJbSQrTp -4=1BWjUrmDmKY2MmUfdSO(N5$PbYWXbr-q!-h0X7)Ujml+_~ib`|l@NSy{wlv9R`I(V|71*EjJl&oC2lKky&eL}U0dpFs?e?K{N=ny%2^e8!T;siN$>J<6vtFOp;P&|+SM -#;C|e#^>5O-&8CaQ-Lq-DOJZ>gvd)OP5$#!Jo?@=pPbce1Kz37$bQ>x$%a|-VQ3ThPEf8=wNaWokSMU -2gxeBl6*wpBPZxlxjiL*5WXjb4~OuhAiNR6-v#04LijxDOO`?S)e!z22wwr=k3smePT_k)_!tO(H-xu -B_!SWTbqK!$!XJh3Cn5aT5dJ#|UjyOKL-=~9@Pm4T4zGo>eh-Z8tc1J^W5FXZZmQb}mGGD^p(h6u`qd -;t&pt@#Pb&$ndymk1r|^Cdz9)nahwyho_yh1OPw0F52tE3ZQ+N%8zXQS>A^dCzp9kSrK=^eK{sRcV6~ga@@DS(9(-8i92w&$2-ybN92MQTL -;ZdOQ3Q*Vu6ut!tb-tARHkgtNlPIZwkdjL)DY^U}C4U^Hj__R|`~V0)8p2P8@N*#iJP2O`;h%xXekO!}5W+8q@UKGnZ4myHQ~0L8B>r=@ij5tk9i! -DT+}JNPB)DhK-s2pu+A;A4gH9J8J9@NMmoy->PoI$BapQW)6m$k~hJOY?bh@OlzUX1xIE`?RPl%0+9} -VQ=Vzr~kXp{P*hmeq-J%qaU -TD9owNp2k_u5m3#Q;q= -cjdL!98!aZ{5aHgZhtAUB2A1mS>bWzcCI?n%Q3sXf~$6ux@k5Lrx!9}NYm(Oo-iXn2IDtFpZT9An2oS -&od1jcs&KN*be`7~Rgp{SH85laRVW*BF0NEP9z3-PXk;2Hj&vLvf8KjqaE}P{3lmecMe;icJ_D4P}iG -XZrl7SNjf6&_X&IoSc!qjyZ$nXB6H+k}8rjIN(jdSQ8ujSoIN;2ZeDoZT+aA_QQ_u0i{*gnuHpq< -lyPRaB$TxZAw`1I3Hljoj$j;vX;hP?RVi)7upbxc?I;DZmCKDcGe7N#qFTJair4)l$8L08zdYZp0u_% -PEA&Yt;(oH=uboIQJ%)YjILbLY;H-+n#Mbc2f*FOqB5u920OD0vUeNB?kYX9x9wj&2xqbWktL=Rild0 -6MzIprd=0_|gx_V7iq|qWj2$^f*~bPm}lP_t1aWIfaJ~F%d@eX6S6o`$PCUAbbpjkB9L0K==nC{G$+l -4TOIm!taOhjs4tTddgpV%Kue8MZV{|bLY-I5C*b~z&i(o3>q}3A7Yx$odY`e=+|A{u3a}MXMsIKLqht -54Dwa0`nCmg=N`TK^Z~!V>h6QW28EHJp8Y}xb@dwL3m)3FZQCuVM@Z-(Z?Dj9!a}17?KeoN^a+J9ecQ -Kd+c}_9zd_zgrI)9>yH8)0s-=568Xl~lh-o{Tpg3!k4a~HAxCw~9Tgg5ewTmJpKckhmgiXUDX*W1(66IvGb+$dfLk5|Y;OTmr} -$SMA>`nd|aKDX%~(-pf%EdH7oUU*>!^gAD)KY#v*Uw--JN9cRb{QUFJ-vj*S!i5XxVO)Cl^y$;@?cKZ -Au23k#MvfdgNXQf*=-?3wOou;{ewf$TF}LsCyLT^um{#p>Gi<;;_uMo34)_7y<@3)!e+uK4MvpJ+uzg(IDh963V2_~Hx3C*%*~9r5bwYWn4uUotb -wB!8guFbHMt!mq#n+5qM551=VsxpIa6_S -iH{!j+_!#t5c)TvV}55E2OTV -_Tcu}(l8X7Kp&M*81=Ewg1``L%Q@7uSJ)s>ScPcj^3z%~HO8`cxdBjjzvFO-^2 -Q9AlCrIGt79kiR$uhh{L(o}b)QihbBxmHBa{xSq%>k5$gqpjejr2de^AGvB9sC0;Racd7c57}V@q;ix?`GS9$~q`@{jEB8B}invHU}SMDc5$CvrK*bj7^Da)o6>mILcJmNP8(STAIV^#XrW -zNK^m$Pf?Zf9&U6hEY|N4nM?Y2#31Re+Q+Z+x|TN&=#)@2?-er`LF`(8MZAg$$@3Pwep4OkM7tnU^r} -NoPX2LLLEgJzM|9sGQ@!l@BU10=l3go&$h<@<;#~T^fOI9ltKPvIai@3*+gt500 -i!=fp53?*4(&Y2Q&gshZLRl;I0epP|f*lb;fM=K-JaIt?vuOYiD3{vn^2M@B~Wg!a4$`N -wk7Tn;SvSgxDPANo1y;iV`L7u#6Pt6to%b=TY>rz);U=YSr(K -5`-9fX7V?knwK!$mv=*7C9=;v3s3`rovJwJjBPW3rn)M -xE+-X=vI;{CJSCiMXsdVSntyTteh{eJn-p+kFuj#7mDW4nkD%M8kZI*%+1+F@TS>t*PM{VnPY_}h{{o -Nib=oW2J#ybUs}2N^zjCWl@)UvpcHO%2GI1$h!B*Jq()^x4`n|JYv0<$uJ85xp@lfEY3cF@#?X?CSXwwYmM%%vQM>JK`t|2 -kOa^BiW1!G6TH_zudshB|pB2bA@`Vt2LcXy+Am4JHU>onOA7lTEGGh7PS#l@+2gtAqWcY9q$N+T#>od -yml91sUAwxOJaQ_(kXgbJ{rlX5f;ZG{rdIv%{Skqs29nfbDrF+o? -N?jjaEIMLbn$Vqn{Lj3{V$702%%+>NB=UFWT;;YbVSf-ZRL54>_hNU3GB9H-p&2^0Xj -^g^?5C{NvkcR>EFyT -^a+q*1<0@rWGIGmRAACEMzKxOI_Vf6)VAFIBmZ*wkB*M+jXWTKB_$;e8Jf#+Gg+=(yGp;^{w&?SJeF= -NjG`Zl`ux6AeO@PIcuvUhIFzFm4`^v=2A2VUOvix!*$Cg7A6frlj5_pvkxGzSRb -(tEMB~r$>3bRZj~npu}(D~W3}}AeAhb;9RurgnW)dremB*Bkblg3yl`sO6Sd+=a -AuMa@;IW@P}>Ehl_8cK7$M`v@@;!0x_M+%geVz+e!QM=|hu}lISb1yh5>G&dtrGR;!gRU%s5x>#x50i -nTka3$-K*@{N51wpFMLp+1V^0sLWoKJu!KUcCb2jhE*+>a(n4JR|CJIn;$)@&CyupQu3BnJV)?V8DPo -($dnhQ&UrGp&e!U@X|{!(TNi$(kWA>(6X{J`t;LJ(QKlP7qZ?Mp$oX1pLDST~$MltKQQ%Yq-4DVa95t%ugkrk@nYK>y5j4 -D6rZTog+;J~5Ymd2j=*zj*ODU2kbNCxgA*!!DI_+d9;~&g0K&%~_v3VgV31yg6hcpzZEO8})JRl(uXb9oa2802$THfaFE@EPL_l6XKYI -)fdsqNTQkV&m=Q);IXi=d#*sKe>+bM~I)X3dM3PXF=DoSfXwE6q!20#;FR)H$&YY?0> -gx17Fb3$q|Ni?`QBjfpoH<|&rZNT-_Y#ZYUnBR>NsA0IHn(iyQ*plNk|*!J`|c@6jvU!R3^5$~kxeSH -M828Npo^SyO-+qnztg5oQ@OdhYSN@hdLHLB+lGo?X!>Q`+onv -Jk|sRd#Ckq);)EUp{2^~B>qC#h=kuvqvu0`8I(YD)rXOCzbN+{J)&cs5&+$!>AAD`r0c(IY!F|!eLi< -g*&!&`=lw6tjV0(LewaRpMK)t5~lGnQtZXrey#d1&_@&CZC8Ng{SEMwz -f7EjYhQ%v~62o2d{-s-J;tTh>ffh+FzE>8a*-GW2pFz_TTV-(EqX?w{y&TqlFgcn>8zPs(p#_@^Y5*-limIh|8rmFi21;t%XoRi1$uML5NVIo@0L}!47+6;+87ry#9C-F3i3ltM1^+7)zs8Pj?o%Ddi3qm9;e^<|HAK0jKS!|zQzH+(LrLnb)0}qVQc%y>1+C -#8{mc{Y5a47#jfX1|Jc>_Q2 -<$UDNN5f5rA}M=r5JjKk#n(I4nK?2&sM@b>7@qiXNoy;`2l8m2OClbgqH;ux7R_<`um=aQ0=J`e42`r -UTX?Zdczn}OzpYFU=Po^f$LV}o8~3*E_B4DI5d9vY^+e};Z&k@cnJU+niL6Mqdf7L)Td_#Jb@XUv1a< -d`#b5m*8k6k~yQ>0>y0W>>0Anlrdcm7lK -L_Gh)7_goAFX%ty0DFY(gvZ33@Sb@v`CaCLV{|^c7Ck00g~l~x%p*;^rXSfINY49{cegI$dy}_-&x{d -S7dg5qK0>$56?XM&BTPGm*Jpn9e_ZK~V_1oaIr$>VRbxx~d?I@>Ba@u64z0+w^oi@j5*Ey|EEK4-W2~lD8B6y@qu}U;U1}J;%{7C{B{f{ -BNqzJ_Z=sfd*QlLe|TT1oOa#+djs_U4bkBt>9fa;r<=VdCV%eu{5Pdu7oB@v^yZ7)7|ayB5u6Krg`7C -K*f(w{)$zfQu-;Vk^o9)^d`~^~R3S9rI}tx%AJOaBB6KyrEPe{#@jqo=_bt2-j0e1voHqClIe9R)!TK -i#kQlT=;)Nw9z9-J5U;JozVqzZrCU*fZ`@z3rcpq5Vk!yXWE_#)#3G$%(ckg{j-17iWuwPgH`KEeqW1 --GtZg+Bki>@g3$mJMr`tYR~?rZiBxaARi2%Irf+BbU3WGXgA;#Z&exrOe17|cIDFtlKQUfNTxb716y$ -;q4ksXx3N!#%;CI$A$X=Mu^1l1Fs+ -5B3Uv{QU%Z%ylptus$#*lwiIaSL_UtKi(?Q?JIV}aejhrg@0y*KMyOs@#8D9QasVbo*>yI(4jWq$@>FyuDV)g3P73kAKd%p#>h$z8)&oxFL8IdDWjgx -$PzgUtmpukAM|6_@~EtKymA6uv@qMv$oc(SyLhUe~G~dhzp4A;0d}1Ufk&ZlX~^11sW$HKi%r&*AKeZ -1US=H2Pa$S&_L1hDE-ct`qqDXuYVJtu@3S1-8hRIyMs@IVMga)wl&5AR<}uLsCTeNSNV+oqyMd2xB8x -W=9xmUA^dUZFmbinHwYc@0)51H6!6>VnpB3{;D_M*2TzVoFX6A;u_{|dq>e|~E)YX4nyd{q-Zp -q`m`nh!9r~Q}vk2d`m78d?JCnrbeUBRYHOH0+`k3X*CJ7_Yx!01Zm2i{!oep9^`SgL-xajM=6VB|5l` -a#w9^fLAC+ixk=kN=aMoqca^ZtiNvQD0wQxoFX%SJKnd)zYO)bsl*8_U$@%VPYS6P7D9d-bVP5Xp<@2 -Q_g!`WNSeGZ{oy>b7bA?I1pP8E(5kCewLayZ=N1^f4SzwxiNO!?5&jBv+sG}2mFQq^ez6!Ww1o@#`*d -AI{yj{%azUfk$AA1n18UCDivM{?{}7zl$-_QAxA%F&K$*DfUk -*Nj^hRJ-N>QYBVt;yRUZpKee+v -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 -=Yfcp5~k2!!xoj4Dqw#kWsedc^&!kBj -J_rsCis0U08jXz0li2}Q0alpq=n%+KKI&DEK?YMLcwnx|A6rvZ77{o -%;GOzgU?s?3(M+8ukL!;Xy_~{pViUef3wCnl2xE)hDYhm&w%99Nk4Wf>}^s=d{?uY --sMV5NOUfFhfDh%DuBlACq`huOb7#F#&g5cO^mJJ?@I#v!05>eUkO5V-rGcm`USCzWA6bifQuWq?Ec6&iE=x@fv}3KQfyKme^P8c&-wkC92 -;&ERPNDERHp7en=+;aJR#&xq<8I!JPf&R8pXzfjC?^VzyXGYb33hDnkf{nxkqAHGfAz4`cI@9q9^k_1 -@_3IMWTx?+{QyaQPV7H5T~XO-t!p22{ljW%1P@UTVA5c#w1))zsUuB#d9|I3_o#gu#87mN)5L8? -0*98jaepsvVvLe}$(!4%E3a?O;ZNss+nrmNqv<6_QAeLJ$5S*M0B<(;CjKzl#+wsg*wc -x2uBX1BS3IXK!AITdi#n8El)X6=y}Nb(}(83;Sjicyx7Wqp%p35*1;lQ}vJ5`H}SajK#U^6i!q|VH`|8T3i9N2-n -1Y(fivbcYTB;R0qlc>@Cm)AJVn1WefJi#{xD6^1-qck}K46^>-X8w~OkR=o}-P@17%< -UdXhKa7JpZ~{8DF4EZ*ij6YAOlNmU9WcOHGfBG?S&CrA*o2^{LO^;WBP`1Al#dlZ-wP1vCXTUr12JQ8 -s3>j$RZrm`d;MZ3}Lu27!1ocvJ?(tfN^k*y{M?q|ioMn*5F_CxHTT(<@{}p1$_)!htv%~m^encJ?8|Z;f5(D1*qD5cs32 -%_RrFo+{{55*b${LoDz7v9%<#s|0%Q(7Bde-mj`lrTy=sqN=fL^WG)6u!qluVNU6#xl@4a)1ZT;~E9^ -E=cVxhsvq?pjrolON0RkK*=CdL3s4>9}oP&YiY!A|Nv6T<|GtHx2Yo$zbuX#oPZ%VNC502;)aFxFMhz -eOEw%SU>#w5LCz<fjc@Ms#Z0nR2upiZnK_Gw+_ -G(swEaNTK3>DiI$hEtuzW5&ImB1W(mw+@Wx+IBEjDem7=A1U6@L`P4pojQRKcC5I0t+opMYPO#I}*7z -NtSiCF4eEBp21f`77%1%<5IKub*$`OY)L*NLq^j9k_1J#L>Ia<4rXPm+dE>$!7KmV7ed$&+q~FJ`u-x -J`e9(I#YrNthW4ptRXmmia2B6UC#gz`;@dUV -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 ->dlcOvEa0OU%_J)*~7)=hPFuvlUd42l#_@l; -Q>8yn(v)jHA(KwDtSlcN|HLz`XVK>hK^YtV1r2?yoA7+vk!Z=wz_>MG3>myK&pQL`;P@Q~460uj7Ea! -e!|&ww_Ia6Dg?oa)&8+21TC*5@&gEnRl8ftUS^VER$<9#>jKpT*H8A$1ra>#e&{SyP;=gg1Ldm3kzWN -sLDIwN&y7LoKV(Ru-M*k+^|xbQAhkE323gRIeUaQ#Lv<7L0_a&^+zDh3queAwdCHnZ#Pm$#PpQ7s+}x -5)^X-qy@ssX7X)!DN#r$!O{9fP))=uM4_fIf1i#p+U%q7E>XBzE>j$}uHW3HSTTGsbJ_-0@H=v|op$` -Ji&H{u0pD>0M4TEmA>KdbHE|1}(?M9QPzXL!0E`@Nw7S2IStAj_!hyQ^|-afo}zn{GM@O6S|#10NWn2 -v%lnx@-7?ri@dIe!*m-aq`AoU4ahV6tyN)=KDs#m~0SpN-g-KNxKs{nzQ+!w-H8ns9q{7oBBi@$0kfH -Kml}6J*FUi9Fj9$uE>=0G%M@BK4{6`Oh@L7d|av1UP`;D=IFE -^0H;uk-%lGWN0Qeq^m+=;!BDq!3euP(k8L$z(jqW?k;)fKN2=nF*k@t+8*xlt0se20q^i0QYrBp93-+IjQoDHiZ5ga~p+$AbJ*89@oO3mL5$}w+*SkCfyQC;NIMAuSZoR@( -sd`V4Q!Gjg23ZX{4u^a#Wx0)*0VS~c=dx+;_ik_&K5frJ3ff}OexF^RXOaDN(q$r(zi{S7uz$~WFDWL -Di!eD{-qLPidJT3C<;Stswf>NiDlMM&zd_1P#SWc&4yd<4%E++z9q -HLHUkiG;*$-#9s1@g#iKQPjtZ=xM@2zJYYkpkXeAOUn&}HG{0XY7_d;z_$PNYuDf43u>hG*fF}9F~X; -(zTr3Dx9maACrYu~t7s(n~=p4qP-ACs6>;&Ets&81SmwJ_Us -`9HGZNO!0^>o4C(0FOM}j%s8lzRep}N)Y{g-SR4ZIkWF7*PDCS -(&Gi&sDgk-9r)(Xov_@Ylp#BCV)VwAAPyOAK8OEAp_oQr=6J!pVQa9$Y -3b-S9H7m)gUfX -EJ3e8r@0UVSi{Pc%C5znd8#B|On*vVoO@?hMV+W!ki-T3qDd)>6(}{heL$^Yf=dd4WyMNsqo%}{N|Y5 -G#x|4Z#z;xKxZ@pY5!iyM@vuciuI}j5NmJ+lSfj$>vCq_Swp||@FxrQ0Qr@y -%rmQVUl1jJwD3r)J^UEQW0{i&A(`>$Hnib{bsmz&>>)OQh!NIG^)X|Zgyem33-lWh$#fpRC6OGg))z1 -?i|6h70`sC=NJ(pXqix}4N0cS1ej{?Qsd}jK@+8QwY1gzbIu_1v&uMS<{Y{pkWvuFOg5`>VxdM|OYZf -lZwZ5=bwg<`;v_`}hZidQugjO;JfS^kscYI+s+~-B0#!$it+Je>LG|m0q4gRv=TsJt+=@D`(%u@Q=IX -I=&P{Sm<>40xvfkIK`ez`>g<5WCUks;CgK9ilDH_5=XzZ*d@yDp8)As8M3?mpSSyeDPCxOb(cq=yc1$qp6V6O9ZNfhB{g!}se@Ol88@wJGsZN+m|X$viyUdQo1rc@*m__|^Y@Z_QxwjgdMf`@BV^-0~v?JJ -ooi@=4gGa+4^tY(-X+|X5iM|)_$u9bmy%pnzKoTbNT6HcB%vU%3#R{VGs6_uk+RgMOj;1ksb*G}&(`f -QC}RxzkFqU;Lsq|2B1IY%s|7mMYtm7UJ?p9r2IM*wz(;;+YIEX5B+YxETOM@-O#$-rn9S7Fs%*rq;=lpEueNlm#(n^;yJ;%E}@EMs)RUHt_=LEn|nW(Ca?8j5$ -HZlZ;+=*3xh`e9B?D`;Ovdg@6@_vzhmgS128LqWJYYhq!UKz*Raq&Rt?m?y%0~Y6)n1Uo087GvAo&}l -@Zt*ES(R~MUYeFUpeiCFZXU(upxr*Z{nIdnUW@T>L{&1G)lt@xLe5(0+;6QU;>g+YWI)6-?+}(e?O@f -1Mden8q2i2aLp2Jg~qDJS-XA^qsnuL(uaour?>H#>294lr2ZMjNJQB>C6tibBxUXyIEyKfwafUa@v*w9>YGaH -yjkm -2lKK|jrqb4Qu@FWNi{qT|e_7=2h;6bBEzW9ETr;!6D2U^j0y%L^geLE)PE;Xm$9x$rrl6J1PfRb)drk -HURj!P2Rjz6%N%Yx-q5Gw#xuZzzd|x?fn>ytNtkPU0mh=OD2q=C$GK^M4rd2d@YY@*+bPr2q-+3z@Cl -xYA1^(!q>1(^Dt}gNNx=QBiw{)mY+|t>7{v5h_Q(P6RJS)<;ZZ4nWuji*}^L<)9effI|Jp)kXodkwAw -$#fNsG^|lCn~_RpT$*{-zIbbhql|MJK7xUFr~0D?aKNFU4xdsMnKF*`YcutFPn6=Fjs*7Wlso!dSt0? -Lyv58@pFj={~nM%{0oEO<~b;mqJV0?E -;fiJy26UP*XjKPWJYGecyRz=pDDX^I#r)hebIEJHY$(grx+FsMV#*yrMW(bR+>*_WEk$GtuXzOGuAgv -!smt_^#K|Km9;V#C${rz)v(!tG)m9URE>s13HJ@+V$iI;a2({Q7~ELY1eHAS)p!Zrg!aXAN^ylff_W! -Pb1A)k{wQj550YG8heDelLc2liR`Y2S?%OL>DQAmD|j9GQ}9!0dzof4OCA0-hRU3`5i$|LZUb?t83uS -ne)|>t{dZF7HIr)OrSG7-zyp{-ns&TZ>X*<_J;Jjp)K8Yk`=l!j3oa-{kr5t6*!@_nDDgJ@x%?6ST)> -~3MTwzPZ;tog9(=o>?Em$2{{u!c@^$Djl#VZdq$^VJ>&1^R<#+lQAP)Jau#~KM!T&;AGE#Ic5X~d;Z_ ->wV<3*CVBRdwCj)@ERjNHeHm*{DKJ;S|$^n8w(a%*BFy`_6-$;<|0iu7YA_MSKAC{eikb8fEmKtfrVw -qaLO5D3*d>e+nY{~ -!84K@+$-1+<|GKQRBw)#4*}Kr6#gBCi*JorBAH~^?CNhG*P@yZ7xy-KG1w#mcx;xNr_m;P4t7MwV -|A?sa2rf@alCmS>74MR`uxnd%Q&}^+|r2j5fn8V&P`vG6aMjuG}&G(l~Bv?9~N`63h4VAZ@$yoXU^;D -B4W^}(xxxOzzc{)o-L78rc+-#?h?-5w2^ypvEqkgPD6Jtf%obUFtFZIjM@PnChb2HHO#qVEy@p*rm9S -t)QP&2;5yv2KCP^OM8K!SMkwoeN9Pm8ie--l@6WqiwCm}S1i9VSk`ss~arDAg2Za(Z*JcW{8I&=4waQ -*NUZrp!~mw+%N&ml*I`bQToMJxYuHnh_Sa+E6S$drufN0O3`_P3;SPLef#JbU%=cz4tOncc~H}L<*jv -B};zv(#(+R=ipK%F%yIbV_K8?RLaTa-HRvhR8X0{d5H&>;&ik!LaUFpfmcT87A3o+`06ykWUKALp~za -}oRTW)SdKq}|?x-9 -L`EpE%4j`GvwSR6}Cv1hw(ax`(_w{^U@90K^GOwf&(uyW;%w$=6pL1Djy$8B(tHmDqa{BUr}`XH`$f5 -t!W@z0;aad-;yfBy?jNqjq5_iU8U|o?2LpvtbaOEv^9^ZjxpAUaz01pV)zZ5i^F@Z3$%C1yyK78zAU9_KmuthNuIFb& -oWGoiGX4_jtxf_iiFM>#6Cv)o1rG)WWkvzA0{@t&28_;olh0V>0ciIunijpV>1_jown0+O8j6Zm7e~w -*mrnQ;huosPMq}#qGp?>Bnx~_VzMX8nDhz;QdEpBkPQCJEvD61gp11W-!e}ei5-scO(_b^=TGCLdSgw -}?S>Ct}G4(90h-GkqdR7@|1AgJ9N$I7NmQJOq_uTv^#B~UhH+X94xHcX`b%WQh&AK)_T|+5oAl?bKf_ -|{K)$ADs&jUqW{rNzHPe0Fsr%zGYy}r+*fmC7LDar8OB#b3tCY3);B1Q5s&deQ7744h8{T!VrREKEu` -t>gT*OOOnr1NNt;21N{t8auAq;F0Sy -6zenTijFrZZ`J+3n1D%(3+C4m9xcGBzHSJ4!;YJ;lcrk)W>K!2I(h{elgo91X7->zlZZy2pw#swoCOs -d$2Y4Ms$z!I(kgV}`k5aN!1$k9TlX6d1GTbjwmhHIX=sJ@{h36#wbet6_L5{UwJ!fJ{)fbTve!@SM^@ -V$W^7vryZStpghhN#J#m|04K1#U#n%q|C$j!P90Jx&?gFqNji!J=xlN5-c$dm^@OImLNK -eAWPpxUVK*vH)~<3)A85gxGY*awN5eeIV#u96&Tv#PjsP9_)GZd=*i=8_Hc<&be=PsO)*;}>LFmOSW> -(Fgx;y7Fu278wx3xOlT*BKlto`T5C)%*t#(ztUJP|w{>FjAl-#A`3v64wFIpuf^o0J2Z2f`^q44D^xr -cC6vM65+8{Y&@H(cOPQ&!P|`mH`mk3`kQL*d(H10&)#TFA48Zo@jwnlvkBX(>GF1X7X&a5HiW37q?Ux -?$)x-mk^6vk$$uSK22shXDTNZT1Jl)D&Ae@Nu%9%DoW1AC|>2_;yU(^G9tp*0yuTWH&SQhtCh -{@$&)siQ7WJpU$;sA$|IqWyrCUorIx6$1FV9);v?!s7)r>`r89+JXG%(~yd>5C{8`k=zan -*a6bZdZBCI|s$oE_dwD3I;lx~W}h?t^*Fi&QSR33)y$HW{m6Df7ZLW^cIS|8>|(KyMpJ9!J;{ha9_Eh@`wl5I3g5yzq7(6C -dJo2J{_Hz&!-hl7D>ZFY7Vg8BmulOW)LBJNHJ_Xv(nzTU~9OV~#o|Dm-(VHzoXa0>;jy9 -S|0QV3!(mssXmo40k_$#p0bc{c_si_p2fey#F^e;ZVa@ho#z-&B#1;wNuE0xNv|mtz;LzLI?fs{D{@Z -LEcFIR{MiRodqIgW;<#X5mX|!q3xgCasI! -IU<(BF&<9U;ZWvM7v1s|(6o#(dFMumG=q{0!tpjfr0t^{=ZhVQu-!Hh&r%Ck*}9mmF%7PCcNW6}(Qh` -O3~Fj0{IffI+eYB+cp@P0uqLaQ{EHVS*on%wPh{6nr{O4mbO6nx(p2|pbvsC(}PZN$l@eg-j+e${5d_ -3`)}2`no?k)TSb>EJ97?`W?*&-ji2SX**Ts?^p#uOplNwrJGTHVcrv*60fVC)^mo*^wwkSpI`gLVGnm -Ave(sIi+KReERnijf*Z=V!nqHBNXha>PBKD4q#+B)7EN`kr -Z6b8b#o72hW#?J+w-Gvp8oayyY1tnJ(1Oi%`mcIQMsd_nPB3^(d@oF-`GH>U0-MtL@&p|@1!-W2xXYP -`c<~>YL7Eyg4^=QhaynYvz`hGK+H<+?*PrRonV=#z{bc;^lFE%!__aaz~`>Bf#A3&pvA!tkY6iJVlf> -P>R-gxECSFFMX#Vqf)ms9|Nn&uOn}n{5W=_7?XqlEGbDq0HmvyxR>ZvYlq@aB2NOMZLU$a9ojv%bUVB -=Ltu}Pf+IBjwNxJ8v9~Z6l#W={}|JyHi{vel8JcNj)XhKA$xW8|%$d92NL<>cOiQh%y&1z)XaV9Bok=NQ-U-HPr!+BG%!@hANFHB&)lxj+^52-P}$CiG8- -=fS!uyo-yU`{5gxq_angahNiFcQ*NY4!qQd*TB4G7xb)NionQKnci^}tj%njXdJ7He{>#{NDK!dff$MOD&LF5&4+2GYfJL%SVrBMAriYCO?C3wdL1JwoGMtC*Pfq;a*Mb^9ei#IBKoBaE| -sc7_7Ut$>xW%QF9TGR8Vy-*aN|@s(3%aWS?=fGCa3Vz)+<=TXuUbenc8Hq&jlTk^lZv)=?1 -EyMRWD;bH}*Z_;v5?h*WbvXgZ>5_=V~+!vUMPTVfxk4A% -kIHBfbwccMevM277uUiF{hw?Ip+N1v187q>l^7dsc)=kxW^1uUHhwGDviU5jH%B$g2?u3&( -5{soRZIGha8y^j0MGvF|FTRvmcwSttMQ%hp6i$q}R))4<^at`3DkXYL_>@q`>NDNPVV95Xf+KJBX;@S -BF=8INMo{@fC{+Ny#)q3mcK@HBC1 -_)jDEHEIEYHR?vxJ4`vOn;pk!23>rph7pbNefwxD2{bK7a`G=wAMmp5TF;(ILblPqc*z$QZN%OT;@UJ -Y2*R0wN-&UwF<$qYXq%`8&SWSjCvdoA@A# -`Lxp@YrK9?a4j4fP)zex)u*iAT5!KFyVDj)AP_w_d|!;Y<)yjw&}wLH4B2n%%ntMpX11RukFs=(S9d=W_~hsDX?euKGS*-yh)50t%! -B!d5csD!=n-6xtM;LJ{M-Yi+tpENIU1t+Qf|`tG-}fl_4gy>s?~gqgBinlu*O;uN38uC=@^RLOIdb{D -GeK7Wps@9J4y#`-3wa}hv#(MC3O{K(v+Lz&>Mq@!f+37wWy4SG)+<~X3mwx}*Aa=FD_!?~pdxEG_$2M -M)FJ7%{9-*erpt4ieD7I!h`927E3SKV5sGbtKOVX#_v{i1uKDtHpLdlo>T^97hIoV|0b4lg=uAyP?{g -${{t=4*BEaiYNJNfnjeJr1N2CPHKevoNQ44Mzn%m$#Uy&V{1m()d8qmmA}0kA;LNMQRWg^WN!0 -2_#6%>CbMWVu$A@DE_@Bov-bn0|UvLwXPeaPz8F@>6GkQZ6F&@t1Kfj8;}^0<0K+a=3@>%uw)Y*9P(= -E-NDN<SNomPH$3_d>&Ha1G&#fZB*Nq=8M*C3{- -Tqrdm->s`S74QLfh7Vs1_%9v!tN11@j0Rt@L^f(!Ph@z?!+dNMi$XjOhl)^$F(=05S`ws}ZC!RHK -xdU}1+O;#H&9Ch1QY-O00;mWhh<1^8?}_M82|vETmS$b0001RX>c!Jc4cm4Z*nhWX>)XJX<{#SWpZ9;fiZ{{R&%-$KpydVU?3=f5PR}k*z5F_7el%xqzB_yW?(N^cfB)UP3;YQ6I(vJ2oww^`#n -(K_sWpoi%x8-gzYb?B&bBNVw^&LWN1%oBi^{GR10)SBiu3C}v6>C|7Xrc-vzM%G!JuKiW` -GoSw;y0BcPef-wXVF;<^c3AmieZ!Z2aHBO4ADSy)$T4Wu)u-kL-$#;41x}}F8mHKB$@8h8sWs_zaPT~ -ZVMr=?Q2Y&jv!~O@U-RkI>2x~5%Fi;^0@eP(Uu`%&IzvJO$ou{>%ozOdM{H9zQjEMiraR2SD9 -imQ;5OBF88Fz2*Xpf!Bq})Ug!MWF$`Wo3-_#E?&d%bz;D0_BRJ7pThq6!=urPu(k!@x~9m^?!PhtLok -JFOVWk+!ite|xkE*SDFl{)Ovv3RT2D$#lm#S)pokD@qd)CH{bCn+taC#l7rFrzmetttPhn51eiVh(DE -i)tl#U>&ECIbp{FmVDQ{i+F2y5)h6-028>$?lc&y{EtWZRV&8J_TDs%ZHY4BCh9SecJ+anBe|0r_XTT -Ud|#-``#}|2;xf;Z;j?G+ILN$&bcz?J%V#NH@RY-%dj?9yU&nL4+85FQKwbLT<#ei{CO!!6u3?3Rwl* -oopi-Wstu6PSWVZDL7TliVb?BVd;B@LKspuM##{dqWT4C#rM4K-_vn3!&ZVCutHce6>1BrtgoObzf-X -K4e^x&Cim4aL<4O7rc(JV#^;_)nwxExlP^QIY# -OlDR^>)?=`_=L7$?@&0+mqWz$G6A74BW$CZ$BM7ugBR_d-P$PxswCuu_b^+n{^Y6@%+FZd+^(N`q(O1 -Ym1r))eaAlSch+s&!r6lcKC;}pmJOF?Vvl{I85e?6P~Z0oYXWyz3jVRZ+ -kwzWzo*MUL7}90?8I2UNw++RX3p@w^ui6-KW|4aK4B-vUJ35g!*G1mT>Vke`LF -s4YSs3j&}apjybAM;%-W>UO4FoRA6deKaB%}1AfYg&Uscn4*%WJKLCDqNt#MK5mINS+!hC%fUa**val -`pg>Q@cMGL1J0BCz(vqit0YC5}FpHAlTkv-R_l-zbE!fwzjUKma&m&e4<(fHqyQd3cnCdAQ|L^@mv;W -d*2U1%pMSccPC{c0HJwBMqQs4#SPe+8PB4G0`1Lr=p>kC95#EE!T1;28^Pr2F&cmm=L>UH8opDJ7_xRPqsva(ix(lm(7p{evWQ+3lQZp(Hx<+E -oI0($Xg#o=D6%DAF!^qCPC!+Ndn8jw&TRrU^#7$A9-*#HPs9@DYr@2$nLe-QjRMAyrKC)r|MD#BubZ7 -z~Px3cfsvmr)WO}MEtdCFrp!bkyHvFgbqW{^@SRYK -d(0$x;vb8Wrg=rP4jZ>v4SF}JDP-c~@5u}*$(D0eet`@43(lW!ygst98-ZqD_*f|IV9iaJnp2~S&)Bx -f_UNmT$3@rj1B^rs<(g<%Ch!&FK35h+sq)3Zj(V$n_O@6?p8S!#H>x6G0h;&ZOr6xa;v}^HH__ZJ8Q` -uMD2lmMC{`_V4f5-C)qNBYzuK@`8<{hF#!jmZ -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 -bCLw{e5xzE$E-7qpD-i%N%3+Z#SE3Eag>Km -)jomRVy)_Sj6hC>_{>}|Tr(c!CR?}NO;n^)iAL_O1ghe?LJW5_?cU+fKKpOFqQfdrmD9aDw24X5FB74 -3y1w&}F7;S!=1bf_r~sPXP&}cFYMzds$bC`DKd>YyU^QtO1;B{FBhyZ`dZ4r&orDlZgsuT*kCDgx>P4kN{`_WwE^9MQ -wP{sW*8}awRk)#YJbEa5YDKN*9`GL&#~;OW$1UiVGNF|^-^e~$~B|ELF-qR%I`UJqhIOJr -@J5?9pkub*xpZjR>oGnbM%64M7{IoQ5cphPgmg;9%37Zr^l6J!`h8ocuvsxEL+pm(vw+Sz@$B6`P|Vd -N9Wj$OE=89FkHTBx9w*LjOA)5o%_0n2871DM5@W0#b_jU4;{_F4gRGLpW^L84dc+S-uXV0cW7xYGHy@ -cW}uJvUa&>TSM#i~vA#TN^t0xh_4+Htd9$$z^wmvO1fj;vo3Xu}4gqUrSF&EH -SIJ-sL$`7&Ao-nO|;E0GMheqOD0JFEEFvHveO!z|&%)O#5o$`Wc8~I4`2c!Jc4cm4Z*nhWX>)XJX<{#TGcqn^ -cxCLpe|%KMxiEhAS8|eUau!H1{EiST8r0|#OI(5rWJ6Sfi!r-I2J-qWLRrkysdB -RtrY3it8KYe1gqjMYqLaA16sv`8rxK7JyfE^WPyj6%u;-kad1mIBndf=td1j -uO)ZG3sXW=-`3O`Nbxc!{|&&~bM|0w+Oru`|8doJsZOZS_Wym9Gmf$y&`TGw>n-A#A?py+#d-h1zTV$ -r|cRn#QiTlD>Viz;uaE&9QIYwo%#H#fW3C}UsF+TWiJn$M?xcNG7h^IyW74nB4MpX~js^F!?YAiWjwzeto`Jx>8*rDw!vVjD -(F^!(<~SQ?V(FiT5W==vFN7)LxI32D{w>7E%xLb4exhq -;i@68aKP3*?B=}7sBGsr`Bgh0IOzq9B3Uk8GLvMu+C)5jNi8518Q-0x#Gf(XkZ;cETh)|GC{LnlZNOOV?j*9+c}2g9#uTlHZ+Wg7Atip6;IL?Z?-7S$yy -)4CK2r17zX~L6$rW(8YA)abRI_Wq>nmT8;e|VaSG`R+Ump2@0{LEn)#Br#glxL^g)>kkSp8)U<#{`^3 -dywr=LKjz;67T5#jd+GV}tY5;F^R-ng)VxOG -c;PT4G`hx!nbofN`p;F1;_1VpB2X0Z^wqCsL+c}bT0uSxxqKNHGzU#kA5aVL)e4p{@(c|~cCBC@0wgm -eQx)mdX^qj=*q!Ti8qErFkYh5VMYo>bn`}Laa!M!1SCzKnV;ok@!)Q4*zh9{=o~#wj!Ag#WD~lc8;5v -A1@&>bNwSw6Y4aM5!&Bcy&k_`$~&CW>R9oE#b(A3uL#qG#Wr5smZ&vJ@-P9Aaw`Wf73LqJBAt9+0+$M -2<0E+p7|MJ%30%H{%Ca6o(43yEuJKa5P=TAY6zvpoyhpvxpaWpY+5fEb)Fl( -G>XeST`51EMAFomsU^>bpdc8=9umE`~5J8eoX|Vv;qgD!DoITz)JWolt2Iq7z<(xcVYKJql$DW=r1qg -t?A!|dbz;eELe;!-_DBZJBNrsv_og-!!RJrpx;S_JL=|M+yg+hFv#l6a1{@7LfFSOLT^u#lhehCLEcM -GleO0Kkn5O?3=b`F*2GF$aK!eHnm|^eOS!l~NEPt5$UB@~zl1TD~FQ7g(Wvjq=>-qBU5g+J -e*Nh_!y1mmaXBnh+25K(BTKNvOr)b!NS~v)SKJow64pb>VRUMU)T3Y{4v6K?R1Vi@dUz0*sm)58*oqk -uo)tM=;>*YExk|%@yq}XS2o3 -1+GI)r&KffBGu>5uxy2xt-dxK>OYTFWN;;eK7Wu8B+et9l`@8PMx4i8r!mhlmZ$d&jzXi-CSj)f`tV+ -SHKQ_zna$wgQMlfM7BosnI=r|-CJd(5=vV<|8KP+Cu`{+|Jho%QM(ES1S^`<0DF^q^bM -kd`6AsL8AHqnK&)2_?QvW!d$au(^OK)d63n8c41@muXxl1ado^)}+;jpL -A8$e`eQz4t+)txXOIDEC#@4&D_@$|+$I16huiwX2z`WR%5;auA#z#zwn#^x1?2ca>J(gG-U{3@lCZig -?@sTK!XIGoHJpp?+DY)-Z-89*6UXh$a9k5C*;GOQSwFB(amUF92HuZd&j2=FT380wPx8p|Cb2owV>@K -O{ts@wEwqag4M1iiW%1z{WDrga;ji02`wwH_mN=@{hcvWbW}eB3udZ-S2&Ou=c^N8bhWz(+mf@cAP9{ -w;g{aw0z4CStD?t{Q1Iv_b%B;vjjUF43$Vkvpv}$=-A_)g-y%#MA{GCr$|9o35Av6(V0Sd@!n>?wAfr -S^(M*@WO-cM08P>-RAQLem)Ok900Jt8qy9dfk!<_x;objBom4;Yu$3(>KbnPLayk+dRDIzCk60}elcC -I$sWX+9=Z!-u?vGm0mnyB>cjakR6O-y7sz)F;apyBb7;V9Z8&%DvcqSG$MG8;-g2{@6GD&UNS3_=<&d -)FI7z)rjwub@q2ppeE9-`6h)62U?p76YJX1fYij= -;T}kjggxjoOF4dwHl2g=#GXH^010_V5WNFusANc!E(_XMmD{WkDdyHvc>*I$=_z3U7eG4&S@B2q!l_@)uc -iNj0QBF-pqK))0|;|PL+mj72ilUo7BIe*+*Zsxk9Vvrwhtb}1r~99N49*>bnWY6lT1zGwR)`dnM|!sW -Bue@^zXdoBYZh5AE}d8gW4eGrE<6-hxFx&7{dO8WIJDfMH?R8VmTv!p*i1@4_aG4=1itmv4`9=1kf|C -RmBO>gabb9@M%^Ltqw2LR>Z;!hgakCJbMnolXYX*Q;1z6ezBt#b1aCr&3d -NzIdNH$n4m)_}4-{h{MR=rRqBvi!tL$brqEb>o=moV?&_Rye&(z`h1vMfTX;??C+zIa8sR484^N*ADX9~R!LV@|vB(gV3R4+oOoBCy%Ckn%jTFZN~O1=R -8$GxhREO~f{RB34)72A&j4}|$-mFKK% -IgzBWMbHcrPvxtkK1d5$#IRuDuqB7C6y$4scO()2(|5K7sBMcR?+n1yx>&vIm-%EMIK}t -9rFHXsY#5(>1JHK)H9tgze|BU4CF_9x_RM$zp3_CVY`hatlw6mAtPs^bZ`gi1Wz1(X%#^|H$KDF3F!v -i+++ZP;oY -ui)9Jy*c3cir-I#-Mjdry`()Zh-yVSY+aWxc1Wut@KVjqa|B0m_#^&8Pb78kOLu~w^yMS`{j#7{i^7S -GVC)gTanCcQ|L&)bo-pcK#vVdx6zt@iZ5e3ionMxBKuvcqP~{TR3ch^zh^^u6EN4Snx@+Xea_sj@#QO -Ac0|UO1L}x7>3IrcIMlWtZ}N^e;fYCXZdd%fZ$A=s%#fkgdKgaz8Kk3;~Qf{z;QK_DNpMdkUK=WyY%t -u?uuU_R*XY#`(vt!c`;aDBy76k!W~<2GblgcO5o2o^w%izn8{{W*E)Afk+OJh1v43NwmqsX6di2{Z^y ->K7-k&84Bvxd*MHFj9z%#dO!Inb6F99{A -Umy^U>XwRCDP(?ZUxEnWDY}#ro)%mUIK_OxfKpkPvFF+4ph -YLdkdV?gorZiJ%CuQejFs1GB8CVC|{*wra!dg&qt^A{Mx0ne)@F$09+A=MJhu3zT$1+Xo2+?Qb8dV0 -#GUMa&%yS{=h?t_PV74e)TJjqgOPI#Bm8`*+ZjNC6Ypv2P4fD&W09Z*i7I? -2YT_2euVtX;D>5K6hl_$(;G=ak9#EGxukMLs+mw->nCD|ZfiO>wZ7&CXskdG@-}3a?-N*ftkl#KY~H& -ED2srSOK?VAnhhGiy0++r%_x6Sor+cg==S+*Sn7EGrj@+lmc+nl0Wap<|F`C(l07q}B>ra0u1`5OnJ@ -Xi+`dC!29a>m6p}(!V6|G2b3Dy8JUW!H~Fi80y3EdRWn?j&6%Wg7p4T -QUOE>`sNeNO9$S5%8npV9GEAe>E=aHiCoW$FbNvfgu4>zf(Td$HM~hGoJoE6EZf^5u!QoW^Q3Mcvaxj -{-5o-vi1#(vYbXxS&3}VehJ%k5R0nJG=E7w5wg{@~=Aj9T2S34uCVzhBK$F)?TWd)2t%gWHM!n$ZC64 -{7!VeNDEHBE0FUI%q=oJig*ITSr(lcSDhlz>QTU25mRz^+%b<<25tvo`3KQP#Aa%x@kqM;uiSd*u1d-Ci$q*Il9P9erE;=KoFOMSikHxBwzRan+=hZbaVHG;izZ+MHP?A -ut{F0^SubXpP*e_?_4Phy*8+c|>!8r~E<}g#-})!q^a^zeZIdA^?2E|BTH(h(Lo;HlOpAoJ0i4Wej(B -UexJagj;*~PZ7B2<+KnU$L;ryHwLWcn+?nxq<%da~UF?i>Elz0jCiI`gm{f@=E6Hha+J_JiV$`Z{&=w -UXg49R~VhFMU4-JBDL_9t4HMVjO!FTF))!C(*bB?9gM}^P{rX%-pLL1us!J^grxRlQq -lR=9wa01sVo}Fi?FG2_x=;h9g5g-`B3Q0<5u?2b|hmZcvWn__ZWuigX@lOLZWetW0rl7(y$c$HkLAdI?oOEm)8?FMD;xd^@+?jo2Nlp?o`QmO5jS~{Iw=i^0zuC@Zx7UH?5c*oHCSJtwMH%MlLk(fa%RC-=l)!3AxgnDo}IeY@2j~v72WAET|Z#O<)K8%at+aF1?SNJ4*J$8t_La( -yd?g)GR?j?Br>c^qJ^Em5T!!=eVj7#TnRv*rIN{C|GjYCSf7e9bf!iX2CaX<{i&un3awp -X9qaKSJHDyPxtrB~tb)eNn6zOjOSl+ZLZuRv`&a0$$KzMz@@Szj>nT`>C@i;!9wcCA*hTwndPG-y2+n -~-cd$rRpE>MP@|h -2;UH+g;`AL%GjSg4YM%B#i%V6HKa!wi(J6=sK(Ur%M_kIhzc6%qc6c*DP5IX+rfWXYqT=l>?4) -M4rOhzBMiTio?4%uQOq@-A?KgH%3Tz!ClH|q{VASg*weRW7v_tRn!YtkE`HXp2EHZ#Xjqo2!kBsr*>V -e6&pXSkY#Pt#^k|$RBf}3khFSmtO%Bn2)1ygE5~borSk1Wzt73*#AF1Y{fmc9I+%MJ2YwbeYEgJ5Luwq}Q3m_>m0f`c -KDQ_!wz)1qK`}hJT>Ifp-&&U@f3S#pQ*P%`Wsa=q+X`kRqtj{0hZVmXZMQ@1%?YPLl0(afl7W20*!|i0c*H~{p$a5e# -{LX<_ydV?gd0$!k(R`Z{wtmIImok@43tFihFHFq`qPcf@rm5$}a%OcL3x -3WPV5!$H`l)CNbBqz3rzfKvKzXtyUA~R6j_U_-O}4vuUnaPe5qbllXWBAA2kdMk)6sxBnd&&vLI7#K0H#4A?Ca4>H=-*>v)rF1w|MU*(Ffw_!5dY}3lH41H? -BZKG1ewf-y)5b6cZ$JiD@&eog70ul?F>r0~IbolY`gKudO9W>*vDFDJ`mygSVw*gZfKooc4L#@*`t|V -{M2JE8nI-X>x%ScS7f_N?HxZTWL_WyTcTmlXv9t@(8bdrOoHB@~TUoru8DV?lBSf(Of>Gb~(uKjuNKh+_SVk!i0^2&pT|*o -5>|xu52A#!V#()=yFc2|XS@Bm$fKQ~nh9+rchtegHzBIs-80=gX+ll;-X7PBhR@R+{)Vk$dOwo208|i -s4Y|o(ipUVnJYyffxHt{0qeK-h{NdCdp-Y>9!ylUlg=ySP|=TK;D$yc_l>)dt-I(Jd$wwr+p7R9Rqjx -(T$<`orC!nd|zE&URhuYUCK(H($J45|e@p!i~RZ -vinzC!N!!0lKT;&YV_;EhI_$DrW6w-L*8353B*={_$eAFkT-T5U=;?kXqT{QT+pBQ5XcnCppZVdFiN`{){qsRV^q&omLJr_a2+qsHuW^YAh3+uu4uzy1sOo49Pgx&b_0Z3&Fh;2!fWL3pb3Ge}7fK{{ -gP_rJIqlfO(L-X{|oqEWvhidgur5^I=p=v$!T|Kn20*47BF2e}ut~bvbqd~R=aJLJZ@RBZwg;otmOa! -TW=5M2V%^hPVwg9=;B!kx|DkorRDgcNv@`v_;wWJm&Fg@1i-04#sra -N6_vv%udQ4W}EgpjDf69Z3ePBYZ}P1I_NV%-qBNa%Gf$&@;P?q&Qt$SCBt1DCV+1npqP`ysHk&nAL=P8XIVc22@-tvyNL#RQIjC8ep%*XeJdYzoW}F7fyz2wdri`tap>NrWn -GS$4TKPdr)+6jb02n-mzM=KiDAj%Ydp>k?2k_zlMo*E|Oh)Xd2u1$~C_kv6`(}NW(lwMH;Wt3Y+N`Ee -R?49FxHkZEgCVd@or=?n -K)FjXB5rP~0nE7`_`p5kRGJfvJt+{IBkZLnMJF{M`MN7i{S)`7m^1K3Fub90LaS(_OCgVjrGk37|jYfo$sn&R5&GYiz~>!+Y|@ -b7r;%FfDNMbvIY*qxYopiT2bY#FSGSOjF;51UFzcZ^IQndIbc+R?iL;REJ953|fwy3G_k%CGXdIsXMh -=C%qgv0g(p~EuWu0Tb^1D+^y}!CPUn>({VouIEqX_2av%}C(qR#+*Z}%zr_8xoYAip%w_tD>$C`FkR~ -p0Mmp?^+qc{JVf31uyjbMj6=w=L_f2P%T89q_>XN%s=4qWYbof9XxPD=&!g%PloI+%J -7a{&S2=Spt0fSI95lfxcd(u#Xd;yD$tBov8y6{$z7B{peG;<*z2otu5%l%AafVh`T|cs0K(*DX0aFIlFwrLELJslx>Qe}f-hyR>LrDK1 -8|29*jYJW;}Cj+-0aY#OXyZ3&rB*|o$pgdO+mpL`H%%w^}kbLp3Asy6lSwa(*Dn#A$SD(jODp$$8NEal~%VI@zg!otu -$;E)-<0RkrSr_jqtnoY0m1r#Dhu0GLDFJs?sSD%!NUZc~N>O7O_qp#P%=U|l`Jw*IMTMJWPc``p-ZBp -{c(!!GDjmlE1>)e(pesp`I@g*q-6SYP@R0OpmiQP|X?D82+oFtza7RQsQ+%t_FiJrAZdonCm=2oKG_A -eiBa|3Q`k(eJe*VZnhk5qEpjDtXMNKG@L){Yv!oma<$0pLep8LV!3y1Me_Au-G7Clx(4W+HR1UXk*y! -*v4kMQ4>AIq-XQaX*Y9G^BbhG^08IZ6JBBT&B*BCAo8lfl;g1NtyJ@5;P)7mDOdNdma+UW9!rDJbel# -ETzf{u>%!>PO8F<=fX-+tp&>8rp3mAAZFmNGFCemQPG{APS9WTb -Kz^K5dt-uD_4I8q+E=Sf@Gs4yzfWOm>4W#HD&C5RE<%P)0*^HMpPfv=S8<E -avFk!hELWL+H(;Gb-4ei*LgHW*g9$lA&!V)Hd)wx+ask>D-;6(?7Zl3T@ag%rJQn_dToZ4@%2?^!iN0 -Pp{NRuhPGV#bVH1E`>leY4e5WvE6h!2ExFY^~jW&^{Wkz>~LF)ADs7~l!+VPpl7#kVeUdw0XE}8FCv& -dNuIXUDm-smpya9fs3glh4msk;0x{5NMMs&DiEJ{dV*?)?UaojfDs{aeeJ0V_&`WX=AoFQj_5p=AgGy -J6=Pow$uCf+DwrLtQe~QCG=_e^bN3R>C9@N^( -^wr#-&O_zw2$GEdvS}h?<4ad1zmGgIz4^s4OiuN4k^ko?+oYq&jG=7bjFpdF0?=H_Bi6Z^KHRgEZKch -CcOQ^;l^FU7^>s;FB~V^!`KB)a%H>BUGtzxS~xK#p6H%kB&n-svfcfD@>)rCn?2(Ucx?kqciTcqT!eF -hyH9n2PA*TBXZJR8(eM3 -WCLi-Qk(^caTezXSTGEFu8;mQo_0M{b4;d&y}Y!=$k%mqCtyTz3)*;;t3YH2AtM;iLj3ooWLfCTGz9T -Vgu9NQJ@FwL7NwEY1B^KwOdyJgV==;Opsm^Ig5?K-r+FucHo9)dY?)C@_TmTXmm{#SpXc^rVVhcZV@? -Lw@jY<*z~zMyv~^bW}!0932R{FY`dTYRC@l1nl>YP9wx88&sMtD#TIUPCSGJ&22KH+ST;b#2O6l-S0!MYr&LmnwigzI7Z -_-jsK<@O+ND2rTadcu>@>c1{<9g?h;W2&171C`f6lV&bzzwH{EoHT -FF>KI3a_S^DiE|QZLDHXbGQOPlN?BKCSgQi>YC?gFpmjnlx%OwqcM<~wAwVKoi`t-=TDf9-8NOMx2^Y -yqUCD)w9%_~r&ahYmsH?CWGPJ(n2LWFIC^(SQgO)hbExniJ=TOv@9vSfUz+6gp~(1n^H -0&_pDl3Bc20o^>Dt2`JC3W;GH{2ZKQYk(T%=TEPszply|_6K1&If1H+_&wq>?!-*hHo5>#tAv{Ve-*u -8ptQ=;mZ>U8D9f2NPJ9!OY**3&5i0kH$b#eVKACDH-&m*NC-^9D7Fj+m3`V27FNR=P<0M$~wcz61%(9Y7z}SyO#d+Ov<@by@bBflde17! -^%O=&eVdB-B|Fs=3`vyY2a(=_PWvT6wL2)bGlwSt;f(`h}$tT>F2|wkKQeJvg5ns=*`U5%gN8 -TFoTpc+hd0#`qYTJXI#@c5*!J8UG!&KWb;NF9PiPJZi#{rq?Sx`9l3;aQyPrCO)~X*p7Rsp`+sW!IZ8 -n=G!9D_|~(is5j-w6`OL=(6lAC_&|RrXXLZirfUY@mp`_M_L3v*nR47DCrr`+ITY>TEm3?q;PsmPH%l -~O7Bfyi4FzZGaGxO@RIoY*Pitx#U*ZdUo-=$)UHY)K*4g!eq@WVKN?PA{CYzB87Tz -{P$vB}lvw8pqw}{lrWJ+TS&mE)0M{5e$#+<|mOG}k$agq79Y1&$ -Wdm|o!*mNMS>6PsTt}LY%5ke+#pd6r8H9Z~wb1b`P3U64)@oOx#^on9LmgS5eTX#!QC`Y{F6-9!fGWr -!5I%_mCjj+Z=IG3TnZfYz40UkrRaUlj8m_XZy^4f3G!C>XUiKudi#5-X>)hstoX5#&EP{0#`VMHIRzl -qwElaH}>JK}stgWD0*n$Jg)$H&hwumW5zVaGtGD%s}#DyVEobONL=44isG9RV`2}^OSSvVJ1;gkOwPU -399N6kjCcm{ISBKe#}*d9P@gpIjYa2Qusba{ey+CW-c_R;)hx}FM}Q2qy_q={PNhd5*mtm&N;rg)kUr -5P>;<3g90T0g)^1u{%x%AesRs>_rxo*XDTZ+Le*0^G+S$+!R$N9nRzE3%JRdY8^b -VS!&Z7&Jx}lWw9jUetL}l^n@;Y7`s@PR(n^PlF& -xl*#L#&cmY6!+6Z8Y;H7zWWoJSXV+zoJ)yiT>Z9uYNzlh^9f3(3_f%*47vX&jmDJ-w9O40YBUQl)i892HQG -eEKrTzfByYZEU@Q&owgr&e>4lUUCaWC0d{X1jE;H#f5!rk)?CB_K>U9(wq8_$P9CZF8%X}&-cOPI7d2 -l$7b8vuYjh&m#W2lS{&+ -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 -gB-vQrk@OuV+9aWYYN7@%#~o8J3Q-mw#I=?S%j -V$4!_NV~LiiQIZx;MY;kRfl8=J|{*OTF02=798=fgW6-VS&>;BAMu9o{^=d3amlZM|@8^gdb%&o%H9; -n%)))Yw#60P9g>!NM1g!|1pR#%^RoSsW`te(hcIBUB=BX~~O$ -{i6fVjSfUc0^!x(xQ9o%*!n;+0=zF~5sQ%~KQM$#dW)>7aLl3A@Ddd84#3;6NQfPAXG1jbnmSbD5w(} -t8Ik`>Xo1|vOV3Abcx}V2Q0H+!*aY`gEC&ly43KSz8bqurFO+U4+xF|BOCU7POUL~l=<0dQMUO3HM@P -0jcLBhcze@uwWdPdq>}bzlN8;c59Xk-aEuv?vgp6*o?Nta}IgE(X-va>IhN{LZC^A7krN3lR-9{+P3d -8*L!QZiol5E3(jW8=3(%HF-CpIrIY3yA1QSWinIL6TpC0-Pdpjoqo3my5c9cuNoXBrN4_$BbUp6hkoYRLwZx7U -KZy$Eu2(?8`}h!UjqGIZvQ_KE>GGDfoH&`jhSBTRvg2|^^zLWaaXI?@E4Z3tr!!wo9UCk|e_Xk9t&i5 -TD_Tb#&|ym!2LO6%40B7pu`8bdAqG`Yt9Xe_b47c#XmLhj`|-~H*#5EXi8qJD_K&f$g*uq@``84HSMN -{ud+DAJai0fN84^{tSd}fjvc(?#*pU+rZ*e^R^wTfkAvu^Z0l4JNS1@BozNy{ezC{`gZ<~TEx*Ut+A# -SNOm^!S}dUCSuf}w2E$ChYtOMi$h{kONVTln3scvF8z=yL$=3}Hl3TSP1kKXwWtg -y#V6tOi{i@>-T;OmTE;*9af-YZX!8=XF<_8o_ftAqPJ0>2GM7FSO` -V_I7*M2MR~hpMzYZ8_dGHMmmQ41r3cE=4zG -)#`4@*O6V)yfk(+h!sH8!`2|d8VcLb13 -p{_zFv>I`Z1Ogf<`mPI$fwIHfD`6n8-}U4O;XW4%z!Jzb@W)D!+MuRbKS>5)5mxw*#*B{U^S9B_*-LZ=IkejkrgXDEy8;YE(HQV9j!- -bk)#R7%m#iI{Jaz96UB8O+3UKn*QREK{s*S9HSw7QaQ~gitATdU(;)7jQ;t;d%Fs(ixZ@=@`fYr7E?& -YEjnnhRo7M)dMK1)c+_i!*Lcuw+%Btwe%sWFMq=rAwNKo5r$uY)S4cR&W+*dD$OS-UYbKz2Vl(U5Ah} -+5ARxJ725nb6h*-FbmFJT7so=!g|;e)d;zba0+t}>PVbgyu)ljipF6Kh>mFQAA7Uox33dkD;F2+$k5LHo!ee%EaFw(ly%yUijnMa -W58v!jtLS>$L`?4HRG?N%vEsX!uV&h1!IIJv#O^qdZp6T6$ -aTkg}G2j!^sDRwn8B@2ci=e2FUVll9n28JMVnI@XmH^K`vtfeFx3ojT>f1OW%4H;jCv?(5uHu%>|fNF -@x?(@T_&@T_@Zm4p_99-5=JXC59>^X)*@+-D0iA3l?6T5<)4S(Vo8wwO1?4SiZehn&PUc^yAQE_p3F2ag8c=50_ev%|!tqz*h?9g#>79t}~2 --log7PNyjUlufZwYTw{-+(7+lCoNB9Qfy|ROe2_#pR*ml&Ur?Ppr`P-=YWY?8EX&5 -IoOg*FD@%$B5Go3hBy6MzuhY3i!^eirhq=PH?_Fu-K%fmfHH{34$&i}QOQt0An!KH*K=Zqe9(N0)DNx -twB!h`*eKR)kYTuRW4T589REs#bPzJo+xL#Rss5*K>eS&?+xb5Ie9uwIQC`Q+_b|;9_tAA^#?fhMWMa ->;mBtSs2gAdxc8|i!tiD4I%I7qxkbH@&R)|cVfy{RR8Ff1OqU1|qpFN{d;c?q{chu^vaPA -y3JMUHcJvx1<~Y+5+BosbiV$%6G6Ug%JeQmqw1CZkj5eF>kTUXDm|wPP{C(A;w-xt{$N8J)4#b|N5*U -7X}vC-7tvv^T74mjn+*$WK6qRGvOp>7Y;<0d8rsT&T>hXtc;kJVH`{xSY&tmNFPC81Tj~B03;7+40cn -7I$!<{`y&NgN}*FaIIYG`UZ*?I)zibv^ED|?zTpZ*-QV2Szu*NCHsTplGE>L$T2Ho^FS? -q}uK$$>Fi3DEHynOu)U|TG>~EMn$)0`ed5AqJdmd)bC)g7&nWJVfG-&4^G5jkCgJxGk_x&;5KexkY%g -g&A1?|odPFtu8p-a%6IqU?LTUzC#Nl?M+|AdF3aN~Lsden|5hvbi^k-q4#E&6eW#lDxFVKkH11{M@=m -41nE6A&&xwO-FoI))9Xg9Gm379sRQq`(2!heF%k@YOL+*~@Oz+skg#+xrrGJ`T_JM^3@B?WoZ9$83&U -q&$W<=an;HVY`C2059yBw|t`@95^UE-%|8G;MpTEArQtw?uldx&$sbzh!65nYF(v-Fxu5Aw4Fk;A+z2 -U6@F9%-dBH -6-$*TR*2w~l$@1_a)X?cx$nquk3bESDPP=Cg8H7bJLABE6_Y3@84{V<|U^buDKDVr9$OwPIn**^NTzF -MO&&=vJQSL@?J{Y5XE15@fzUhKZ;7R0AA|U#Gu|56?YVM1fI;|wv2tVG37C>8_8Mhc~g&(6Mg}6kf3q% -JH4-ybxT`h#31f8ViU{Rb=B6HVZ%#f&se1nV(O95*kgn#aGRG~etex7$8S0tzq^F(_=gYW$%}`SP#f}?&ZpX5CONcGMmuXTgpqt_niO>j@sCHZ(9HWPd^g(2 -vV{FzgVFi~MTE{O~iFRowNvcyu&n|n4ZlQ%=AqE)IL~BUf`jNI5bCH)(^COQjU{(ppST-X~{3<0^`1* -SBD*e+6g};pTs1x*}L4z&5g}&H-Vc~z5UuIHLA0SZ*MYjBq?A5#CVdTMm8Cn=WyupmHryr_p$AH{vrn -#ktWS6chXR+c{+TQkyF=cren(JBBSQb}bFa1`XA+t-DHFct%0rc1GM4Qwv1Vv10CIoHLU-c_5hXw`^XeR;r?$_v31d% -Hd0qUj7DnsMsD#|H&@y0<~G3ZDEy{wadTI|Zyo%8v(>HNp|NZkt`LBcpm>sCQTcsfH_*S}DayCBdRJT -;L*M>w>L3Y;llRn{m=DL$GUj#6j*ziGHY<%w9oQAKy!6kw4yC^J?PtfJvO2(*t)B6Jb8|ETIne(Q|7c -ndyZe7wnoNVg)sM&AGJ->lyq(y|_P{prE}LB6IYH`r=(T_h`=culO-y^%?C*td8oP3|n -Pv=t-wE_S=N~xL%w^9~c$POi*ol_kXW+RPX&PO=8?W7<^LM8WuaBS5Z)zYJse?Iuj_BG`AWWHE{7-2`@QPT!hxulc4z756Rsy=th3~GOO3-Bak~x)+jcWY!EmVZA2{vP+ -pPvhlRY{hrprWk(UC$sJ^i^C6#QQ-BSM; -l?Ry}gg|K{$m7c(@>v<;8I?pU!D(rJQyX0Z$=_vYHF=WijUTmKd#+nVlTQwF(H(ddp+~{JRB!q6ndRU -=m15fetVD56S!qVx@7XVLYc+6#ZAT}Vb%2|EFgJ;g8b%{4$6r5qiPPA=D7)$VXtw -GM0JIIih0q)*RM(ue&$OCLiP^UcG!2&-doCWgAJQ`qjpxL64j2rj&tU@aQZGt;P>h0q%pB3+Hv!*1*k -z+J~2NfxVJg~%@w_KmZAX!-xzdlP^ttFM3jvMH`$S)y4^ic8@#z%Vn+unYn!2#TVjxgg4*D4Q_j(pLo -oN*Xo&wrOdaOWAJaQmF~h$0nTJcDrmq64Gy4iMQMCIa^`93CceBvy`Q~+)7!BOC8Gkg0lW1q*T|tDfH{4w3ZT44U)5#8noQfz-z;XO&r>S=6&-kE2u)wpO0ky%EVMI!B&n -z5yY)M(;@W9*L)gYode@i@3GZFBE+Uvt|@-6=5trCV7kr7FE#N+Rm0cIx)}XIIW^0T&|wYm!sqMS7|%}c`wP|f4_ -9w&&17guvkYh`;W`+>>F9@T@8IEo>k@anRw+gN6J;p8vIOr+)K(gvs>?~xwcT;yCP0Iw8vp{pe^3BBm -&z$S`@}K_uLa9j&iDKMKA92BU+OeIbmXDi|{N=ac3ni&i5VNw0hacJCMQdPN!kcUG{!8cvdVW4t#U#4 -rZd>g{U`;uKj_RqORfVf<$CD;s --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 -zn^+i?Lr0DiaD*8rybi{&>>PS9fbN_v{Vf -Pb<`)y$>~%zMcaCB32Klv2DEe}5Ky+w#t)+{`k@Qhm;r{m}|e71CILy0zs9*dV3x0<%;nnYn#?@9!i( -^{105w{q#C#^s7sQyp!<c@bZhD%c$zKbp_^z&CyG7?HQnsstt1V%)LUyim -qa1^Z3nGWc#}VhVnEpGkz6OD42OYBF2FeXoh(vdXz+-VJv$aVt*g9usSeaTuBHkSLk=k+E>MNqit@BJ -%;bli7g`{VtOj;T+y+Vh@sedOMBB$lOBa3^G@c`6!u1WI_orlT0k&j3P5$)Qw!xPow_@ZNo&{ue1u0% -#Z$5#JSp|t2nZaqnP0K3_*KSnGZe1A7dfJH>5m4gvylrUMV)xnk=|Ejef)AvZ0ppCvEfQFL-L0=fBxn2m8;jTSN;0ijq2ZTa -^~Xd=I+s`v1gN}&6>Ap>E+$(uDe^`b8j1;w(ag~fByp=R1bFSX3``g_IC03(VM)VBJRD^?n6TqJxI92LA2d=wm%yp?>Vd}cWER`ONyRPsSODPne;E9O2D4t)f+HSbvIK!`ji -w5Wr#Flty!WVBXV-nMH!~#ju+ -);9+zuP$(6#SWC<(fgY=Ou(nMNF2We2e8At>15f^b-Vv5C@o0=lh=#!f+Y(pkmbMs`kBy(z(S$-K}m2 -C0ZS;8UFDw`=5#6>)WM>vFmKkI8&)~1uvvr@CCC0bG}>Dj`4Xr4KD;J8WV@s^mZwCvnW;gLl7kY8L%o -+V;Y0do#C2tdXm? -dvtWP2c94`)mH>m=@W)G_GCJ>Iw_$s4c}Cv$?zOIaV$NIP0yK5k0*s-jhUw>8J_glSZP-p6%;&PFsFb -raC^Mq@y7~Udw5U|#l^+c0IJmm2?cX0bhobhgrowBPnjenU}K!BTfy7{ip40Ki4!M!dN!V(lQS(R=a% -&UtGkgu=*ERsU;qL12Kem2N(C7h&@(lIgtMkxhNNejv#pj0lB*O;N`@*rH#a+1m7b-FOR;8+pJ>Lsah -z1&Q_?fcsVYmhDm%xVr7}-9kGEP<#$`b0hi1V7zcea%RZ5mBC5Hl~Qh3w?5{RBoVRFqWsj9Tx>`V$Rq -O(p9N<53r9!GgQ#7s5CYR;XJo;5+0CNjUpKhJEjIC--?ODdtBYR$<=A1{Sae1snnTE8dxnR9dN_p8Bs -JRxo|t8%28qO#^8>#m*ix;pV@g4sf>Nw=uRXQ!G~*=b5>%;m9`CAIa@({rdoNiigjQTWWv6tWT5kSvk -WwI}hoD{Ofa&ErzYF(W<8+*1}Wr!>sDndw<6f)PX_A=_h$HJcD6J~QmTs8{R^?eza-E -#-Ah{Yo2&!cNdgxVfmSoL2omyd2&4P{2{xaK#4(ZcFe`~s3J9Sm1$e4rswNkDJkFF1PCAu;)vZsl%>~ -sse>xt7a59%q`+zHl9bCxAf)y+JWYE62Y%AA>Fneou=^BHGWDMFV5ogBnY5fH(IOmk*7^&=fwXX;5i( -)gycSYfRFE`xF$No)7?t>Hk4>?r=o4{IYgRqlX3d$im@q{eMxl?$8#RmybjB#^N6=a1 -jmk^U%*ik(XUOfysKMq8b4s3hRNtX7iNZ^1VS47IqJ>%5i?Mb7j8#sk9~XSj1M`?{D(_$Um}>c#*74t -VpXs*o$Ea@azpvx%{SS4zz5hGDwf*Nh`QO#W#JY5;?SHsV{Hxt>pZ<4&wf&Df`G;#vEK+lO{&d$i93S -RcoylSU*~wlv-0I*OzjaRby7&$WX*j@mehX4AB<65UFG?X7$8&2;VRFWB2rUx1vVjWaoH)UGM6ZY9^j`FnNmu*%+8|ZVW -wG5d@zg5$j(#V`bQ5Q5FMwC)T3PzExGg`LzE@HMC3d$bUcPm0(bIdKL|^*df<`=9C<<> -4$wH?9v9GbcwcHDw!cOauDQcN0LS##i##7fHBlgy8a;hHO_?b! -6%bHjYrvI;z1?E+qRiv06DF8*6Ns%4jGtIEsEN!?w-D1Z5~+LyF2Qbb=9H=CTim~MjmaXXl#KL8>v~3 -Hr6%U2XGLaPDcuW{t~0lM+y`4ShGx+~FqIu4PG*=bwg3gQ -xBN4Zgq$>!9UESgee3hB=SU!3G?ms6b@G7&ST7@CY!ILD^KR$_PdNFq!{EnuIDl9MEw>ZaRZiYq)=Hu -8|9MPdQFj9lOeIbdn<$D6_ucK59{j3hfnvq+dDC?(@^N{rMlVwcHZf#?TAv1(L&d9TvGcl2k$P=`XjlJidm|-^Ou&3m@4UZ(2D^f{-=(35h -M?@wtrb8+NqvK(3N)kwAmYynF8k!@sV^U2ZX`((sswYyNrqFLXy%U=##1r75Q@i0#>B;zJ=k_sU9mlL -lc9Kh<3~Sy*pw`=(mPTV}#y%6d4K_`{3<-PZZ -NZhsOfoBfWPSQLSYAcR0qpdnBbbR$p^_z*NFU<6fPn%G4GJHa`E(*&mojuRXsI81PWU@yT=f>MGl1nU -Xb609ItEQeo6Fqfc!z(SBgFqU8lK>|S>fr+3yfr_AsdyS0y(7QK*Cjld<`ohF23G4*N3HB0vK(Lx%Aw -dB_20<#pD1spbaRgBWAp{zN?gYLB?Fm{FG$*M3oYEvXMR53YDf~_{KOk63@C-o_K@Pzvf*}NP1bPB*g -6d-?Nk0DbBCYo+y=MAb-(A?PxZ>OZ<$;_YKVo9Tj}nh5uDZ&^{_7v_1|P{^)!_5rfZTt>)3CNt@^4sM -`9F*I-}(GsmjU_tUoHx`p5DdP-E%edd}AM*@tCZ7X0LoJnJ=%A%sIclEl1L@A -WDVZkO+;E5CBV=>6c9GLp+I9sG$J5`VQ3I^{=ef-z?a6Z!^Q~?)9c -jtLT%`bWuDR0m#3@{3!T%NHj`7$BWFp>SGU0D06Z13*RDie)YH`{jv49Z|O-4?kq3rKRl4FTZ3rZ{B2bRV@&K=>;cb(M0sA0|m{Q*Pdz94vE)8{8D -v6^Xh5SX3j)_OZ-6fA%5UGdGDcjPkOmTap`^9G`!mn9XN16ykpA2Jn82WuTB&G(`HtBUZlu;xBNcskY -^R*r=?X(@A(LS;80rHp*`|@wd9X8uB!1)=~t6K9tx8$r7yi_To>UF95}RFa=0$i{}%a6@0361wnI>=! -VUOUANuuMdb#x7g)~{bLWc-USzF_CipL -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 -pF?Afyg4bJlQM`Z#Nb*kY -(9vblk2?@SsgvKl={qGtp2_JJZn97JOQ`aA6s>oxE$;t~@z8nXg&1hNEB3%gf^yi-pgdH&4{-ufP6Uv -^y9J)kh2PM&E$83S%LRM=>A3gZg~v6)Ug)jpiGxraJ1gGR9aU*XM;)7ybzUEnBvD(O74Qf`5-5J+x_Q -X<4bMsTI_YigH-FawQ))a3D`iOyu+D&*#rQ_Z)xbnP&t(nBN0m(15-G{e(gX<}jcE?J49CeIfGLX^Y~ -Yy$bxV@%^i(){HTxN@EPvXS7K#Opgcpe>ndN2?;5QkB^@N`5{?fMDzZj4I4JRNp+Z$AD=#bI;T3p@!r -3Ge=$bbwQHA<2jC7|QAUbfDdhqBAbXhSU|ff?Kz%@+7WJ9R!MQ%aR;NB6*t8tuz!&dCc!Gn2pINeGiC -70g-f~^$1qB6s*sx)|Q>RY+p@$ygG`1GF01wm+X8;Wf)TIRgnNre5+xqFUaePa$iTY=0jDi07jaiX=) -6*09$xk-&YgexxrSiVx^@qia7xSW`qRWdGE#i+o_Sn@&9(jakWMl}w)4Wp15@Bn2;gR<}6znQz1OHCI9yI_0_Ilzy2xAA^r;fkWBz&3G2;p17 -28jwpy*C{zgVda+Ar#d-m)p$^rg}Q}h5TTwje3AOfI5M6(FPOlHz}PW -A0HnRmHWz_J8`;>(D^jJQ~Z&y^Y};MD**FF;6r80X>5UA#iBk?d2^CCAp_{6z+)wjvYv=`6g)-y|K5A -=@weZ8Tl9hNyz`ET2VN7O?9{f6rap2e;l7>Ra1%N79(St05#u+Ef6)F@eO!Qd)Hj&G1?7!8OL8j45}B -EqqHU$RF8VjLHIQ#b4p9$KFHt6t6O;kkWase^>_``7gz`XtPW0l78nl}pcZj{wNz|3<13kzsdzGngC5`7TpP}cj=exR*Gf8;7>M#IwD{J! -@H{l&Jqv#K)&3x6(&Fw$I-GRSzzvw)MaUR>;u1o+cR;&>5K^MYE>y -pS{8Rs3q|Co=M~kxNsp#)eHgH2ZC^|Wm8QLP~5}<o)qf-I0)OZAPiiL|>p!3YeJ92*X#XGw=#S8Mg2$M1g7+u~WqlXrfOoX{X -lv1q(VRl)HHhZF8+U;}WcPM*-jKXIw?*(*)-Awi&1Ur=#`qg%SGwyhB9Lc@^#eh7p@8NGb -s)rX)=dx|uv})Fv-wdBN?KETIm6A!ezu9z?O&8f@f0OA_Cw-@U3uLqO@4!D_Ho0WF$flcYHkM5<+3X; -j;j)=8n_MzoVAlR_N5%fagZ({?W$<9P87pGFk6<6cwL0@fyhEc>cRjG72YLC>*jG(`eyrJS9z^5)C~E -Vu4IA6eFy_98Ims!~{<@0usb@Lw_l2Zm!&)$O3IRJfA9axPFMbiY+ztoO+TO#%Lq~JFDO9Jc(4Ntl^D -4Es<@w$ve&#%Ur^x@O+vI;gwc)EM& -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 -1-=)!D=Y}#5J^Cs40|*NfquC8Ll4ae>$ -L3;K0C~z{H?!x*fVbRJwA!H0t7pT{&yZArp|CawAf4hIvfJAB$`UDONyc#%O(?;v6Yo`m-^)=XxyF;3U28AYtn!<6g?{u`8{ -_ps|@4v}^v;Q{#9TfYd|4;th-!~vRAeY*e*8_eJ=o}ap_z3j?>jSq1{up>8&|MRy8K(KSW|L;8=A!0- -pe{kFLBqA9wG*_9wC_@z`LnjSzMp=G-bNI32<{TRGWa!WOtD>U%o+YyA8 -85BHzsKhuAK{|f*2{CE0)K~((ae|NyBfU5z!0>d@qG&eL8sZ~0zJ+F1w4b_h#Y3o3($HN9S^&0mg-BR -iP+98zEDF3nkss1_s7XM@Z$NkS4E*h>FstxYO=El}kUwx@9))+&KQN}ouyHUneV}{W}{YsH>9@051%~ -w;yCWd*2cMI)A+JuhG_c2!qWdw{#j)jsNOLEVGYL7E_aP)Lv|C@QF5P+U-gc8GSb_JH=V_83unirU_DT06DB -mD(%XDs46OM(#RKU2~ncuC>mG+F}*8#@(oIQtLE2J+;Xu>Sg=s;&chRA-dtZQM$3ZRNX{fhAu}}pexe -N)y<<`>lxi*-BR5O-D=%h-J7~~B-aLK~S5y1$uJ_b8*L& -+*>wQT6ReE3Q$>-`9>(`Rh?{>BJpVlZJpVlZJpVlZJpcLg{{c`-0|XQR000O87>8v@)W-_X6}12W0B`{S8vpyIuB*H2V|VebyDKfI*tF0G&r(r}C{#h5a6t-aA3S=0=gcH&dAR%i{r>& -&p}BWv&b-c?IdjgLGjoe>Um+L;K`_Cet_wn~!2h|0|NXBA{sxU*Gf4PP>gMxn4gSsN&zk?sa>v55hwm -@D`$0#^-48wVu;RGqK1W&LA;&Kta(Hf>>3Hzrd+)m}Gc(N@E91P&U$)&orU(0z9OuYl1(&pl+9` -?L#>Q(Id;MAG$oH=pc)Vmn$(WyojKQ{*d%h>ZF_PqI*CG)YopKJRJuOQs}RI>2=?!mL;ah<|AAw4Ng5 -b7cDCXdUz2!5;_B?ck(o+Jon{1N(}LWhANam0QD#JDTtnc|PL!>7Fpa)v>ej4ulf!s|2OInN;MOC12v -Y7p*)Dy(}2Va)#?n*M(sg78Ap&nI7|+_zYP=XG_l24UY#r^7g)HJ6p$d$)2o)O{r{Q@9HL8c&CF!~e@ -Tm{6UE8KJ?$;Cb>axVp<0azNHc=&O*1^&8GEudKYR1l}1=05`(T@Emn6xce4741kv)F}L!u5Eh&TH|6 -Is@&C_%!4@%yL+&SE`9d?TMWI4_QE0kj=B;w&K^br;6Z1EsL6CFT$)PG|jtL<*tU>Jh!i9D@?04pP!c -+8IT@HDi4m$g4$P&){;vjGn+r(DP-ws9m<4PzZSQofN4(?K}m&3O82Qg`*ZacXZUP9(z3?Q9FE`vyIy -gzJSg<#=X&KzmARWJy-ElnQh#M*R0C=D%fI`r1nIKaB?YJlI=ut^Thaa!b%;s|Ov#yki`cN{-9q -NbW8_Y4L}roD|o#`bZ1?d=Pe|8LCvWi1|GRw?%Rpe4=NkPmlPr0oap&Qfrlo;>?ptgG}Z)b7Xa$<1Sv -073;Cf*o@iIENQlMi*&0@4nn(K;3d^SQC_vy -M!04D5lCgrx#*M}i;igM_0hw>MHNv9NEdlJBcx+Kacy}5N{2VFW0`+(V&I1LinA=R1y9X_&|ju_0IGH -IohmEDdV9SiN~z&eIuLJ3S3xkUG6pOTFyqE7-IKY|HpA{(h8lh+DW0#7^s^^gW1*#TIiZ -&(q23l{nq)CRqSzD;>?@qYz;5PP87`r=t^)&Wn+Ubt5T28*7rDMJ8zt75k3n*&ly6khin8}WWcg9eSVZTxrhShD~SCmRlxY%A{AfeYXiJR>uoKmpRB~*BaPdf|fM<$wry%fE* -Lmdz}uT(u+0=0%->#&(LkBAfMWkEP8e$ffaN5ngR6XM*30@P7JmLhLFrspq^lhV##gOZOb7`Efx<@6B -}YQxWs9nEr%C4D`2`-7}#|EMMiA8dKW?ybK7!TblVe~u#?^nY4r+$&q*MI8EaBmU?ZEly3GebKqiALm -pEr2SRjQ>FD)sz1yKA^6h>{!30J)MY78fr@w|%;i(fs=WN}A~_0G!)~EMg(Bi23vtSUOgB>ADWc -S~#Cg+#gtm*@!OsB2sGD_6MH%UdX)qCji!MEgYyBfdU-pHyr3X1p1Kyz0QGJ5oiVn3UQ!OCoq)xPl#N -D{b};P4Xgwz|J_DD^2L6@rHmL^=!LEVGTbr@S)PEuIRgAl6o3k0Fd6@GaGtYw1M90NisRh`_5AC&u6t -k<=gVZ4vl#H<31$5w#{i)12ul3UdAjY=jr_G(-2jb#FP2b@JZ^?=tKntZdBg990wEFNZ-w|xK!XHEwH -T;yK8*ZAU_Of-ob|xqFEp~jzcMYstLGW9nNG<1={RU{X?~t!4&T_PrHD0KWwp*E)@(y$y$7s3x62bQw -IKgZ^@lHQ`JQv%`AOPPiEI~Zn(6)wMjC^B>iQ%}tnmt^0K3;8zVeex4Zg3uiK8dU}Xib -K?-RNqyx~4@G7eZlH~9+&KXHK6+>6t(rC`hG6*y1d)Uh@(CaDDfphrYUK};m#Avz?iPY6zKB6K&QxPl -j)08w>kI1g(vL7@f5IN)z;)sucA~5rXkl9^*H4dpe`-Gn~KsQ!LPYHsDYz-}NPK*)!JZLG|!dP)8R$k -JBnGf{ndTB^m;>LO9F3ne*ZUvY~5wM!=^y_qnh%^}xQJNnR0{ctVrNVgDfnLhl`5RDxCdM%LHqVfW8R -CfBhk4Ftd47uJ2@K4$_*{7ac;fenjLo`jD-7yK;~1yuK+gV)()@)M<&x6;VvBNtSR-53Sdho&uyO*!A -nT$1xM2I87TxxH$gDMzEk!{rbKicBvLCy3-KVazl;+PB0^@;Mj&ZUEW_-^ZxE<1Q+?)WE#Co3q$^V`g -@d1EnLwMC6ro{|! -NNK_atQZ%wd9Xg^;IauT*``hInJ9|+NF9icGT90J2-xVxQ9!>~Rme_ng?G}RIi=bPRw)zD_9F)m8IiV -4P$W -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 -g-=FS~h_EgMp;PK;w?qd=uzez`o~) -0``!1j3*SZ_(K7xXgxfv@Hdewy&y&>tZF%@^Ssk+PC2=|!qW}(Eff`Vbu=@&3Vw3|Xr1AM*#44kU`}@ -qM;ab~P}&+ie#rV8s04X{Xd4>mqCTMk`%n=H`RJ6FFe4du6r`f$le+FFSwn{-H!~ -f>GL#INv_cZ@Z)j#2sZDQ+J_?;&U5wM>=_|Rl8~5+cU)oTX$ml`2c{a}GHGdOvb#Hr@4ZwN8%4!gVWc -1Q;2U%VJgs@L_o)9!A6!0gW+Jkv@8+jM4C|OkqLdKjx@f)2+vMNhhuTa?qx!lTj-MN51eN0RstYH2s4 -FlAFz%a8PXMO^_wV_{MnGL){4!`ZRqJggRV5gZ0IX&pIft#nn4ig$gLG=RBzE=mH97cWUUgtt4hAW__ -);^0hZW+#(vW0TkYn8)AR=$;t0-bLA;2rGA-%$fci4T@Jw3brKi`?>fb!?LvR!ldRIuFIi9DFNA&lCt -u#1f0pP~dkuK)`GM6U?hIG6`C+y`dm4IUZWcMwW%3iwl8Z6glLr&~1a?L7|NF=r;Xru1Cna?cm#NbgV -%=kfEN?L5ki;SLR{~VeGt|yNOEQ!C-}7aw2wMsRr4kJO`KQId^e8%0$jS*NgxOP72Eg`Vua3wzjuoaY -!MsegXep^!DleyI;oztuhJ(a-P`$_}=M5Rp_X08}T-3q8t4vdV@-|8PRpVAH`gMXcqeYoT;X>ah757& -EsxJcj`B`uFXV= -v@+s>jI~Vp?giy}YF&f;fguV@c3_r@5wEB-s+Qzh4PRQaxLP8w|ux! -V@7OSr*;xPYVq-Kf1tmp^k<)6;Cm_rIoEi@X3Cv+lmyK;B=$VqjX#SpkaE@|YFH*%9D+yWrY0lBXMq*ve~>tF!2UFWi&eClL+RMvcG2LX1OErYN+T -7BGNK*JV@<=4H*(qNVKErIQj$@K%KO=oN^9aMopvThR*p22Jl>^-+pL@ohg(%f|j6^$0) -YRy3Yb#EYEPsh=0CTf-JT+2Or3N|wJXas#bLlD9@WKmCAT#^3OUbJzZkc}`IFMSyb_NhxwfuLw2joPE -DCn8Aqq{RM)NFRd5D84_S6*DcEmI~b7z_SJ}jj`xSZ}1HjTnwMy54!L#`tx>anZD4RQ-YRE7eEr^&a6 -9xnT`UZ(bRJd%G}fJGSE3WTyPM1s&N-AQhS8JVER)Z+c>m@<-zpOci6FvJ^i*7z|}J=5gjmJ?qJNkx| -MIYC?Eh|wp!`A=j{XY9i## -LAs)>7AF`MYgF2lEkX@$N&x`Dfi${5&jgb2aL*0^?*saOg)gS4A(a(SJLPSL?n|TAAwiR4b!0#>m!+u -!6W(%(}5;D!J`(zLt6sjQXakw!wcy4q{L>C1x>$YY@cHVvj&k3{u1*?p9n(!Z6;+X>U2yM=>TP|9vx% -oX~A+cf+gj)_``RD+I)#q!}&=KthR69!M3%qqq^m<-N$vmpzQll%Gx~&G{)yxiv(3wUkp5XhWXSxi -8&0nvbalzxdWzslcPKv9cQL=s~FR%$09F4M?1D9Iff -;NKB{B$QV$FQxk+Yas4R*Qe9(NDs4IAm1IKm!=ll22R&I -JOOp2HmQQ44irQ?*kKG9&#izoyCBs%RDrdhl+V9kB8>-(8WBokcYWt`k5c0f;}i5~Df{{qtbin9;#UH*U0!;q|+(U^Us-%?z~jfKPwGh9~7Uw9| -}?@~ujl4KEknKfEY0#+Q@KZW1`JYG2 -a~B=6#i|6c3GL_RqWU5!@9phYRgmGD-l6QqGcT;(K#`a)ch<#TUd2N8;rE3QU)48N{G4a${;=I;+hRqCgf*DM- -FemR8;_kw3h#|f7Z)j8Q;!{zq`oVzGsF4nzhEvucRs~`a=4niF%v1~3d@Z1_)f`Bu)KOLtt7@5Edg-= -aP@+E`W<*KH{Nr0p)J7lLxl{ShxELH}z_d%hL_p@)UmCjd^ApTMuG{|gGI|9qaefc=Tnr^V2_TdJ(C}qh7nu5tPxj35z=aAg$nz(<`-blV+K2FQirD{uQey%cDuV;4VhNQ~lKLSe2zC(@Q?XLchGZ$CWkKEiLJ4iE*nBPH{eWk#5@!F_V+aM**+>^C^LOcjZW{@u(L%SJl2W@Px!bIm3 -sW$;WYx%)%21Q#$1CBeJWhT%_*K0ou}BS$waTmk`ut(bI!-PVZP`hx)RizVHl-pET*Vr~l0L^h?!((G -V>tBXM;!cQM^&BbuxJ)nvpnwKp-4%mZibArDwz*cl>zerQJSt|HRmN4v;TIb7842^UU8*PLECG`E$`F ->$%eMxQ#IP%(zWD{iVkQWV^$nB`!X@{OMq$$sK>uSSO_zv~-`x$cV7B2Z*&lb23mfTb68(;gMq*V9dubD^P;T+LS|2H*6+a-2PBnmx@m( -P>2s>JV=KJ~H*+gyS*in&}3UNW->>-X=VGZXf%m -sxtddBJkmN*KXr~-C+^bjjIkW1+y)FK?(MZvm9CpM-qs4Uuc2*(Wlsv{!n57Z$88Z@MpYFa?sp?w -yd~;Ya+L5(ZBX3Y*`%7faCdqO}R2#J6pDYS$?-xE>(IRk%6NJyRC+TbvyO{N6!bXq3=^-4<9zL&wmmy -%2Q36-@394V6hX7vQIZtYb6m15PrWRG_XFG#5tE6@mVEITvh*c^nGG`Gpo`G;@loW?-3P5G<8Ou0XIt -3nq235|RSLR0fmOSZFtBDWWy$n7GU^(8u+h_Ci<_)gDXPOmS74Z?z%z&nLdO4Wiv;=gHkW)o)UiWPf% -<4p~8RDk9B3wc|QpB$^z^=YbRm7?r`LrKKxCRYX613+{RTi0*%B)q`W6sa*}?Shs*c@ZVS2i^rPFa}Y -js6Yz_htdP$Q&vy9hfc)^F@Ye}{J%M)Z*_gdjY#0oGkOO{r7I8%F*dyW3{LB-1WiT1?vd0cZ#yz(Eu}DQasvO2vuotez+w{Ycn+{*A -F|`2oE_sYN;V;Ht2QjgnGGkAt?A17n24~Z0c?BU37&{-TLiXUIwdrxwD14Gx6iPr#t)}>a}S-xxsRO9 -xp#BUeIU-cx5PR3`WWY)K^tj;bAMDE=iG}2a_)r*W_xptb1$STXpD2C?T9`}k#k2Yn4OI>=KXN-K<2% -8AoK1o54Yn>J)s46^$q0SSMag}SI~`B9 -j?n+@>F*=-74d=qNHGLc}c3@C|=PsRO{X- -=8kY9-CICk52*X_ole2FB`MgqN;q_9p{(VTPj?zPL}uz;`Urr%b{?JMO}ht#bIvqusdc*e*v-m}$KQD -`=P0y<>|W*j4N|j@hlH_`_N6ehHHA@Ni@%RR%oO7ZSB$sAsAjR<+KWI?b-$ZxLeHJ>AzGw<)Z+Uom^;0Ecxpfs5smh(y|(yd7wG2+iGx12~e -F?Fa2f59Lwc{`dkIU7rl3ssoW$zYcFMb29W(R9|4{y*mA*2UN8k?}Mrq(aq}qvD3*jy^g6M*+0-#yxe -oSWhLl73jntA1kUG2Mopn|)>Az`Uh;Bpakc02RL$jc?GB`4a=_eZ -Ow+P~V5FEnwLz!1fK-f$P-@dVx~_;g+)5mzw6h;d-e>|iE7fjvu<1@?)x%V4bL7=%Cp -fFbhncE?U&3C`8>(|E`>lUAD@*4MrmgLCMe=r}TH8?qy%u*?T_nBKdqFC(#n!F4xE|P1V -Vl8E+vm~UvC_hc(h2^WR4+(P=5N1+ozBP~v$)@N#0^1&netkA=wsYD<i -he7@(0ZcLQyu@!F5S39JJH9?@x1!8(hajw -AS-U(Ai$NLeA&oxrIi!r}!J`10jXu9S(c8CJ88BZUedZi?es~m1hk_sO2Rr$7LM%&2WR3wFcx(@uNnz -I{T0@(7Ce28sF$3*L{j!@69aTX7Jr2SzI~jBfFXSi489&ur3GdLV$*A%SkzJpaWwJx%U(kbD(BqB#xY -LTGs7G`u>t)x8@(lVR=4Zm?TIOeRmcTPmChy;qs64oW8#HmUnL$NggFaf}Up14>^iC_99lK=Gn%G2sA -c+~(oVdAT7SaKEn?spH*j7(#xmQ-}Q)Tt~ZoRZ=iY}yiLS;sHn&E>g`kXnhYk*EeX$(A -zMB_=o6hS=W-}y|dh!+LJz~`rjFX_#I4-~!ps}~a@ev9n{_uQLk@35HyXd#OHj3e=Sq}>ScqrC-w41& -vaS*MknL`aaYf1{IXr_mxZ<8k6{j^iCv8B3Q_gN|3$cx6y=bzyK3h_)C6lc5L+J -L^7u@y45}!KRsVnpG(Wl%kb$JDYayvdOfk8f!;nZzq)y!J#l}iqT+Ohp0G#$MvWU^lUE@pQ)R4f}WiT -H@g35=MD0_f3I?X~E(|2)mbl3yZE@@D8wu$trj3$7DOs=Q=BaB!IvEJNoBb+Svx!|sz^eM(w|-({(Y2 -9b}4Jx;yRmdPdo7kz@#8(G>lSmkZV}fkVjR;$zKwBAJ9R?wsss4U&IH5!ElS2Mi_2XFpM -u0!{(wyO_{m{k}cv!DO%W -EFD;c=N4{0gk56@mTs`Kj8890UR)~rFYkzXWx}2*^y1`bQ&io1+MFsm_<&xisWZMY7Od7TuNKnF8)lb -huw8^0f;)TrhrHa?NxP;ifYHHP@!E*VaCKQ%!G!1nxv7VG?ae&c3i)I1n|u?ei6bI*xdX1R+t$_*@0* -FV3|f&t&Q|1yd|cYJ`cfsvCg0C|d7-IW3D`VKVQ0y@DT55kU-6$K -m|Fo_-s*bgZ56NpkAXGrs{@3s=KNdt&D**S8pJz%RSGajG%^Dv7L9ko8ZTp$PpWq^Pn6$Q{dNQs87aq -ikqIqd#iA>7}Ceg#I=79ngk-fW;6i6#M;3wrpefVwty*(o{<*N4wVe(>9`$yF-rZ>eJa8Uw)uKIj{afkUH;{4$>j06F6tc-&fi!w$gJ}bTUQ(dntv3 -H+fJ_#Tdh6=4{nT`1spv*xGm3i#&P`0|*ZVF5wZbt#SSt_=I^YJmLU>rVD3Iz9`41r{-!8G2~zyBNae -fxmz2xeCbLM-WAK9Dl-(q6j!D_CT5TjJZg&z$B+mY=U!NDH&$-HeMk -kt{`6j2Dm2qZFIz5BV%o*nN_1Blz$=4|b;%KSeJh{JVLE3M2A4~WB?@3f -mM^M5-a4(%G+wUzn59}tJqA%>Ue_C7`@=W-?;aL0?DUr-NN3z+HS;}C6G&vr5IpiiDdA!(N^dfF>ojzy^zEdHkGu5p1>S -O|6T**ek#N-}+S7F+vK|Azls>tq0jm*vK)y1=nBZa6%*ueMrHfFlQu=sKS@V#hW#ouLQKXdLeUK;q;A -JWP!&`(|utc#hG)YWO}p&A>czh3b*m%oyoOKa@SMh#c{e9!b3qXVAC6HKZm3-)e4CQv9JLl>TxL;kXTkaX -aK*H4cUj28d8CU(&tIPb+1)u{uT8o5WSQn6icLyqOK^&@%xb)m_!4jD{uY9d|{aLrI3;)W9nUliD~<7 -c`)Qjk#TbCb4R-fVg%j<_cG8z>LIkgvD~oc -Txh7s8y8@wM$!>=!7e1h&TUa`u-=08CpV_dfhJ;;Vg1*TJd_)QT>;Bvhcaz)s!|9DxmsM?Oi$j#z0*e -HVanx5xU6rOG1g5j9epVw0pl1BU|qe9xzDhAgcx{q7{sw%8K3HO0%Y?4I_S^VDDE=DNq@>QPWmU#W2( -v(U&nn`kge`$G+%&Q9=dJ85;ik_!XtX2g6Fre>4}&X0!9!9*{NQ3Qv`SLh+V!&KS5`R5}f(CVUPdD%B -~~jbL0{~ZYuWbFonYs%J>ltw+!haB -tcLNRvR?lMP;R6ok-?s@nzETd6NXQ6K -%i%;@_n=>%r^Vz*dbGSSbTP@AU@L)Q-_)-4!7q9NQlzE?mn3o}U1J5>pRf{J^V~6o;9*b$|y6yGH*p7 -%Vcb9In4|uP7jO*rk@rVZ=!}&i4`jxv&uH|D5G2`3i+T2)me%Bs9Fm!(?s}ySUb$Y>v;6)HoteoARi3fS;FTYAO;o^LA_m_h3$T%FMz@ylJzw!oT?ZIs%asnE0QgWRP -)cub}{Cpd_m}7L5BVY$Mz;Q#|(KIj#nFO@r*Sr;5fNmCJEB+E|#ciw=$DkEIO0FLRYyTH2&N{!Rhi^1 -cZ42lS;k%4n^Vs}@AS}I4E`bHt{K{@2c6blyGNY3z7gqY$Pxyvyvfc!mgHt^*Y{}&Stn6kYb|*h1_tY -YRofF`ZN9czCuyb`c?ndd$c}xHn{#&kEEZ7VpZ_`;v;<$c`M}hd=9kWm0K&w26%2BQ^eOMupBQp82$x -HFJKu`F7LuhHcyLxG{99r7xt=gEcOKcd>}4pezvon(jjY`r#EBHOeKiF~f -5fIhAzksYLQwSXI{v)7G}NbF7^Wvb+=Q}PRNpHsQG0PoXR&MUw@PUVsUwC5@l3xs5N401)3tf&($KIA -)XsPr+~dbM=vW8DA4)_t=YI}<9}Bn3N_;mghEK^MDP$9d>pl5DnxVR=dN)p%nU{yDmpe -YcKy%N{#&nQop(qnM2>;v3rEe+nSN(#J>fdnc~!|T$}WO6>8*AmC^RV}FU;3(5(tBB7s7-Q{t}bRPv#Wc%jgVuCeDV -5IdyXN(K}fxJE9)3uW)$$sAP%`1gRG*NC>9KHc_eIonbBXS1%;d*FxUMgMGyDYa{rn4HLpas0Pp?qJ1 -$c6?_uyPdm3w=FEkZO_0PG`$&7g}W)*OOk7SAX%!|>ef=xgl2+Qi%e#BkaX%U#FY(eTGbw}DYjh%^?B -2JusW>PQ@z9ja%=iI835OzGb|D{I0yX -u=wt(W}u+6FeHoB;NM%^#N1*5iKdb69&B=$i1)trEKM*0{nb}GOhqWo`BQA4Uh8+@S1+6=9+{+mZ#cV -tc_TW=j>w?ljf;@uvjx8yWulgta=+avbvgpCYRQQmNtvQzhVSwVw5&MQh*dDR%JqD0plhMT@f+(xFNR -3h$pDLuJ0bPO6p0|BbUOjSq#oa)8*QtVh{OV2Nl-_L3jqI;_Z>%X1xz2{6XlIftUtd+;9O`SvJLyQ*c -4tf9!X06gTs;?)3IO3~yo;o@WP2QAQ(;++De}`S3@d3V}>d*xiTSj_yI#vBuk6&*&zSVxA?>pwMaT@VX8z`%*LEIK{U}(>=@Y -D~?Trihaw@qH~W0e&v#(GO1U;jZK3#NX}>^05CXjS%g~aI#Mj2!FleyrL6%6WAdZUJ#qXNizCKt -toFl@k-ihJ#rJ{ZUY*8u^Q;X!lk*#_3L-gwWp$RSf2X^LLj%M3ILSMVhuz5l5m70$Q~z|CY*6r`5m-F --U0YRXQRHS{ly=?%CvG9$Dq4!Ds@*{LpZE*3yd?2asBx1%AsJ&P%y;;n!a@vN`ILpHGcHg_=TmVSwsG -q*#+6_7axmNGnqEtiOZYli5st>ZK9V~PHi#8l51ClP7H&Amg)&@)riqrcMig!RmQ7e7yuCy@xdJJCy8 -{UBZd&KZs1$v+Q)F>CXI(ypKB-+B(c1T+#KyI&9mU9yfDrZzCOx+O4*-d&&A*!v*@9mk!>=vy(Z`x~} -t<|Eta4PT)A1QMDzzhqe8Iyt*rtQm7{sd_>xOM~Cr7nw@c28URaQmXc_s2&zo=aAK=Bw63AxJyCHbCt -TZV -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 -0s545$T|KWzRI^!c` -8A^9hbGtrgynW94qw1#eTy*WK}fDZX_`O1zCvH!ZgrqM$uJCB~yJ=GeuU;)@>Q8y=m#HI37S4xookb! -LO!XbYf*@hzdr?p0g?`IhqyAGyN*rr7)O9`O>sJoT!g;6Bi5^C}ijFRT~qP8B4#R>!hRxl3wz3Hs#Q1 -Cuz1zrnC(4-f7fFB4k`4LBd!TE~>u8A`FM#DnYO7$Xi$k8^y2Nt1;}{-uc?IO1DpC@aMlpI<~}@mXKP -no3NpD1(>&E-GLk#W@OhV6;-+-HR*+LeD -7T@V_75f#@8ZSqw|5ML1^4iW}+^3d^)2r2GRlLs{sKwiHhj@8j{Usxp%@W&9Ji}D{12i_nl1E~GT6+fNA)($OekNgEH|eyvPKxTyGc-Xrcws=}1PGy$V`(~DdP -Q#kLLT3p{T>|v*6L1SYQe0f?>^2Cu-coS;?2-c>I7r$;Mt-g=v}DkU(Pjh3SCVCrNB+&FGy_eO5@;rxtv2T>Y(wa;=e)ocDtK4qFI5N%BQ -(etwkbI4vX&pQ{NO>`Fax#pD39=#Ztl-$YU2sz%XIP3Jz4~Y32g<-uc2XnCiY;XXY>BL)Cc_ple5U7t0=646%daxwoS`^xx -J$g5<*kHu$=Qpba8Jt=dS3yBCX1vn@nXvq4$xgnA#Say4$>*QuvKjmckGD$d0YXkQ8c(QMgAmhI_(G{ -UbRbQU2<*%+w-W$Q*jOJE}@3$p|IT%Cyv*f9S1dxW#!&w1{dnZY!3CmPBKGQ#k3> -ViZuZUZE+kR2A$d<864|^gP%f%4tu+8f+CJ3FJ~ytn;2=aUaMe24y^&~>==tk45JPJEMp2&H1BHrOaou!wbO9{ilVU#;}j3u+MmQO -$bl7uHY;)kQ*azbxhMf(Wl&qGyP)`I(9rvQCE5p%g^y@f~2|{?}0tiXOFkG`WY7JYdbP0^J~nzn$-t! -{23{#qby1W}}S1!)92i){%__kMi -G!hj$eHsG3a(_#DH01g%_nv~?9ml_fQbXtLgG$pYi9tZgbs>7(vK)wIV6u2wD`Ji0AbKsK4mMV3%Mj} -8T{;3v&R(cX|vGIiTU19=X0CIh4 -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 -h$-C`4-MD_` -Wwi{^q`qIPY*gtVHMT-uJ5?k9aI7~U!U^ISvm8=>-X0q;-b*t@%Wu{0a0|FSQ#Nck8F}`itrZWR(2i* -eg@ty{a#{A-Ah3MS{-~YVlFz>UJ0`oql;{VEaLh%vKZcbGTvd~BFd^`n;?Wpom_wDj2`6o -Id>YBu=ZFqhflbBZ1M?rj&Ckqh=$|1L+{+Qx>?_V%4uk(e`?Fvr8q52VK#llA?JmxX5 -va6dY`*_HKtYSrQFqAROdYjjbgcD8*yk!ls99QhBdn!yMz+zMp41QVW*lSB`wj24IoEwxA|y<+P~>sl -H3HhM(ByP!=BBd=SYlk9{;jAl0}^FXE#$eB@4ruErJFt`6UY@8FZ@qs_m$R3hxzjT{_jVDa(M+3+6n)MPpep6cZ8Zo=YauR!C9o_udf1dx_kI|qLaFBvA3f`n(mV$RExKhFO3RWukv4TG --s1KB|w}K-Tyk5au6wFnySiw~aZcuQ$g5N9X5hP(-1-mIYK*3Q8Uaw$^f;I(LDfp6tyA^z2!CD2q+Ny -jM9H8Jh1#eaG4h8R3@F@j1D!4C-QCSUOcdQ|K^?tJ`I`*h+*<9dW&>AR`j*>i_I&r6lL3z3i8r23JV#V!wOj%%VPyBgMNcp -I?G`=S{ELv6ZsueFpYi`oK0m@*myROMX9_r`w%vqB`}K%hpFs(7RO@Q1ZEbl1xQp;RWY$@Fs%qxmv&kE4{YZNZo1jAAD;lL*yZm`Q|ZIE$bkTn17Y6JceekaJi*K_k6+^xs -a@0?$N|V*;7LrF7wzDbk!H!e$Xgg=9*l|AiuzS;W8j< -$$!kKBEU8(R7ZmrnoFgnx$0(@445Mf&hJQoea2SNP@AFUJ)_rZ|Xv;slj4)j8x^DC`J%8>K682VKCfK -;&d6SA@wU%8equ91&hpmMU`A_%u+^23}@Um<+<%$U@m*a?PRC`U~zs64G2ax$`r%Sx)5&93eqzqI3!b -E(MKZngvdY6gOMY*|fZey2?A3V%UUi(X- -1aN~O{r87m9Pl3xvayn0N4|Vn5As`a}=bvz>lHSUTEpqMG4PRT)iAOzzg8%o~D-GHGi -@^=Lt$LU+2{K$fmr~MleGPXjzbnTVA*76=Oy>x@ -tyz4--OBIE(@&-Uvnhm@a$z$is-@r1-e-z3lC@3tSovhn7AY7-@0KrI3WQz5M#f3Mghw6<27W8YV|r! -ZSR?JNl|4z>T``qCP+8Y~Bke)T9;57SmA$rF+S@7nDrFB*cB8U)RQ6*|Y44=$DazhiOYduG@1o_e?A? -@oy0UlI^7~5Kjaq)n-b2~LPf2@`#t&tmujTipwBMoOr|cJ${h+dQW#6FeiK6Zoh;a$V8z_q#L?5TMda -*2wenu+k#v{rEGR>lxkP?Z7uUokd5QCTDP*&^f|HQtaZAidj!1k9uVV??~BxmaAayoX3XsZnYpU -HtmbBOl`>zfjljQol=oR;n?V`;|8HYaC*U+fR3eKlk`c-F_Zd_|xJV|EJmizu>vFOtb#GB|z8kyV9qT -1n3%m9#{BlkbwW{@Av4(uRZ+WUc%N;8!R^GE}^}YA -4x&MI&*FN;{Bac4z_!H}%eCp}-&pi9whUfqG!i#@@=^q;iAR=)AavO=l@^kziC{o -*)slGYh3(w35nNFNSZil@|3AJOq+h=O_KjD`~R=tKlXe4-0DMDvU|DNA82B)AiLhpzOsq^o+kEHP3)_ -i*zav(zpsgXlSgCwYfbFfX2ck`l3sr|cPsry(g+A+phB@yD4%royP9E*NdAm2m-*_)g!^FOK3KWX7@F -Mhm=wfg7PB(B&W0J6_FPY+u({2+Pf%+{n(JhO`D#7JJ)}v@JnUl5jwfEs_vX9OiC6PN<_e!LR`+t0Jy -DE1)2MHg&v*(uORQNnj7McUSjA~@mGo%%Yxrt-YIte*Xn4r{=DYCF^4Id!@a_0yU!E~?e3N+=6nqyCJQ{>?Wuw;nXi_gmcEvrmW~#mhza~s(wq}lRdot%+x(>zS}+4e$0Hr}2i(u=p}ih?) -g7i6Oh5>pG(T;-fGtH7RG;9^*OYOb(SzQ_ydBWti3hcNIL@vhC#_5h}3=ceb)n`}$9Ws^U-Pc6(Sm@w7Mp9nBJ>TUn-DGksky1{boiQ%2NXDE>C2FDB6jovfk<=&94^OD54 -OornFYUSZoSgnH@nfypn(**xNj@~(G>Ya*pOTeA4^2?> -i|El)2dgi0GX|0Nj?cHdX8$i8p>%(_MD77yUn -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 -9ArC_mwHU)EdnTNT`>;06WPD! -5F+A_Y?vv?>^-pi#jP1p^h-E65bAuUB|0=v1&u!IKIeQ}CdIl?rZDaIJ#N6fCN5oPL&q(-pKT7_OjEL -A{3083|7*__2Zq6=(UsSpNDq+6LFZ}Au=lj<_fh|7L-`L{w ---hD9^=bL^pY(6}^x*$2-hbuu|GNw{dH#=!#JYiMea6E}Oh?w!$R}m#{G~mV|FfS-_~bJZE_tF#d{P> --s93-a6n@v!A3kktA^jy6C5%zXDc7fbO3EoHV8)RNXa4Wqr{yG8w7EEIpa(|KFu#PkiBKIhQ< -2uSPDFheeBWn*GD<(Lz6JuUvP9gXzy(fKi>|KHZouxUDU|(g9Ay}f!r3ANh#+fL}m*9`|hI;DQF9e_N -BF*awMnD%fg~=g!Z#Nlt4Z-8|E+F@J2?lqU?jZz^beHsgOR$ZRu~G^XNbuU8jIAKEmEaHbzDVX;f&sm -Ves2mxaBeS|W)Z5)8#l=5T^T=)IcEF -$7J+aZZ8KBzTbCNHPOXxJL3Vi{SN9G>#?rB!X+AB;NqH&}$?2tpwkTk~ru`5YMBrU!Y@C2;Lp7WPsqd -Xc^`Wg13*Nxef -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 -s9}pJSJ1ne6n4qr -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 -KJJG+hQI9rzI`OJnWsodS`a&LK1M2mPbk( -H?2|^6XepgbtzRHrv?X{)JmdG@9)lBd%VFmpi2G1mBzd4ow?`Cx#ynO|IXdn+BC5u^*(X@MjRiexhW~NZinjP<9doZ -!16)6BS69dBw{^zxWm9hp#J(!xjqR; -X4kd1qSw@H2Mx3M-b9`q563ak^HaP@EHr9Fy1eq7}HRgH~}(+7J6Km -K-#KIS^qfyDi)lI0W9`DNZW|4D>(+nf)|M?>s)YS7SNH&V0l6JA!S*1F(ZN4jZ~nMQ;sn&ElTLm81=pMaXWH%HWZ -N7bXi^^q-KWIy&c7$mf0dsx4~hBRIEx#*LrybcMt!gUOkylxb>9~}G&xwKt9{D;L4Wt|-Tos-j`+Zah -{xeW<<)B4AbcPT>=ED5z;91%nV1uI(npuB-O>INV{hHMwQ9$X9hJyo-@bj)?qPTFeb|3=0ePT{&~{@^ -H?Cc_hOb=_b0S3_EAq#&vgzpKQ>b%L(?!PQS7I)X*V0q5Ff}%e#jl<#vPQ07wr>9Y%7i{{n$XAgrqz( -YqyHEEKcwjUe7?Ws=H|+}E7)`}7_@fn+9mTlcv7}N*-FL-+1wtyYQ5FD(R!sNU#hS=O30Yvg@TRclTi8|BB<+Dg$q>z=27z@P0>1Z@$241pz5H!dtJl=WA5s -I9G)a>pJhj6~^xsv#?V5Pss5ii(O-q03kH#t5#Wz1^Alq%j0+f -a#wn&)`+NA;j2Cp^8Bvo>!`@jhc)|=jhR}8s`1kYu^sZJmWvKjO9$6rezjMyZ~}IbaKG*RGWqGxLITX~;m;c!`(6REXQfJsi3R+T-+7Ygq1@1pX)#3Q60*T2)n7WW10y_l --^N>+3sykF+Iy=m=XQ?f;$lP%-eylP9gihY!nIF}9JKlfo45leVM}9p!(~CGJ2F5}C> -CBlkYMtQy(jLG6yQzUyj= -JAR#JAF2DV+{1Ibo+iu-!-vT5rILdILfd&GLgn#8)~8}UOsWgp}m1%eO8Z}sZc66eN- -A%}sBo!05*Y?)6IyA!vQH;_9u29`-0EB|U)T|zGH?d>uiWQ_>88e@sRq{iaC7m_mWZ!8&)xw+Ywk)QA -j(r$stv3@}LQrgL;9BXKxPs)=V>IXqde^iY>x`(YtPZ`S{%JBsr5M6ZDKCQ1AFS`h4=V!xBhd!8h^DWiN5fY(8nK)Y;#%@-eD}qR7bjgyYnl_!PZNjsuybhB9O|4o&hdHvKTDgVc|2)ywXYDi2nI5^z+8iy*9}Wj9*H<)n>MJX%!r7UdLsgH3OUeS3{_ujz -U`ePtT)kn_f|BaW$Nb^SN9z`4dMf=@!3}}1`h~&l%teoSGjl%oS&t`cQ)qKo{ubd~_O{r*PFxudlxz+ -KH#In)#eYJ9+RcJW;Mt;3ur62;C=GRAgX@tU=8{HDd{tc6ORIYs$J`Ae4;E?-t$?7VsK`G5DB-)W|(os4ux&P -RG81ChZy7ot24aJ;k=R&FGv*p;M!MlK -<{4gNiIHa%7)3_0vCb$nYK(fL*=RM|i~~l8(Pbo!ZsWYsZwwfN#)vUyXy#lq%}h5v<~-ADE-~}W0<*| -0HrJVDW{p{IHk++xn|Z+OFuTm8*=?RTd(2+5-yARp%@K3V)Z%mFY4P;9Cq7Tycel9bv3R<;(;9K7&Ej -6$5}Mq=lHarM?d*;83ptHNG<~j~rl;#3eV*>sm*{zVfsXXb^cuZhZ`ND&Hhrq-@6a -WAK2mly|Wk`L%oge=s004uS000~S003}la4%nWWo~3|axY|Qb98KJVlQ`SWo2wGaCz-L{de0olE3S(V -C&5z6-&%VbG?0j>+U&;)A}~C{cNY*UB_i839=bWBp*pxQFix#zxe<_fCMGkZTI%xEngc;6fgh=gTZ`Z -u;UFM54~|VNz&^*Z&6K$zsEPdo!*Z3D$7?za(z>I!K=Ra{OPlAhVaj~-j7Kdue|g4Q<8^J>}@g@X(=X -Nm3h^T@J?6NO_qA+*|b{5h49{Fi*yoK3A}?3qVQs9FRhAXw5T%pc3lWD7iopC&V}&a9=$p|K0ger&y^ -Ra6Ytf@@x|HE%l8*2XXp45%Jrs2Hus`vx~LX~h$1hU=UGt!`~-#~qFGXjBA%7Kp8R1Hm*U$O>Km3Bm+ -BkzO;pKT=MsxC*-ohV9}f+!kzuVH}D&BM=Qk>j+;vg2$HjeB() -FiX?qdf@#v$=?9Xfj2DyZ-Bc2H2b-Vs#T6JlNlge!T?;xh-(GqC@rgaHWL$UlV-ebZ!W4B%d4{QBw#h$oTwj4hV~Li!{r`m$RRwW?>wSuu}i$rmyCk$)I?@6&RTr@FL_6S*d5ns>aJ@^gC1nN- -3RxAFa@=@t~k7yJo!Y=ooU-eG^0)+`tE8p8SYWAS_{F5;Zt3dDI?9~tOyUkN*EDBjcKP&`%8H>Ol`Y> -yeZ@dZR8-VokXe~a@PoM-N0gEE%gum7_j&owoLp7BQ5=-g!bddqgM&FpKiI{p3tf}NqMDZvIBoKUZYy -&`DVx573fGb^uNu;Cir>p4o;mh~m`vy!6H;nUKq?5p(KzFtR_tVkE57Fsg-W|Msd-7^M%=xx3p^NX2k -6xX;K8((f{(9*5k;q@H1HCXn7Xmh_)bsuDQ>xVBu9_duG1v^%O6R&JLkMA&6fC4-5+5_j|z~ -Pydk4zq|Z-c(vQ_4e{$;`rU`gF1~r(?*;T~WW4JCk&ET4?>;Pd;dSsK(+Lcu5sSK`CZaW6|K(5cW2dv|zu1)}gt-{loqpq0yXe(Q^w6~;DOixvLbNTa%}^bs>T(- -tn0L!3>P_yZ-D`~?m!{t!0sD;FxssvA!BWIBFwWq(A9J;;Mv~oz`OI3)PP_!0+`NQ{9X5RuO)Th`qn> -R-d@$+o+jxenrD;6O!a-bn9Ue}*qwb81B_unW2(TKHVaWMW|bUhjRH+dt#a5(lYjA#bysIu+|kuF{ev -x*t916TE^(=9Uaje}*#PeU>k(hX3CO2MB&(4W2An#LM>B!?3*x?>RhnxS4D`6%T?WDl2^o_WluE`yJ! -SPI>#?|igi(Y5L;>1NW0LSuJFJ2c7G(}v4hsm+`b~VygxX}h@4ROYB&as?czlbx3^qy?E}vd?&3bf`W -w%gHagds){Dcd}<|to({Wbl4MFjx0qeU{CkXVwiQs9yFOjS{d5TzHK9-ewHp8sb*)F9{stw$y8K?j0o -dd#SDMYlL>z&FdA`1yZ)>(}&Yu{2Uu1R{@C5X?++o$kK@H4#1o@MOB;ZwBqEQQ&g~pb`-5fqLSU2a%4 -2wot(v3(?t- -h~e3v*;*w(Jqk<7#{psLHKnGjFdH)B*s|JiIP4*ldz9tU15mDrOFo6bC<@8<zzb~yMOJqMM#QACH@WMFCDXKPLXqVs0Y6 -)<#tlwFQzxewYVJU*jJ(6+d8_-yi5X4wyD4jj%&n)U4yFpmooksau_4FDG!_M{H5O1`N#GOqzCf^^T9l|QRh7YmoazWK -rJGLo6)x|fuwCZTC*gZ2P0}V)Z0Qt;NJ9 -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 -yaL#*VzIOcBSGP>O`pc|#y -2`3(sK){a$)C5JLw6k{RxO*s}vG48f3W?Ap>aRy`}D!-5r1}hgh1%4#2R)={7bO5;%QZ4uS6!if8B&8 -zzKvp#pSgbLUEuy+5`N>(fJ1(XJiVmx21_PVV4#}B#Ml8l8C$wq+@2OwmWC5m_KHY)qY?A~U@g`Jbye -JBhRv^Lg_eqALIBSi>ZyT%Hz@F~EVPt$FwbW0`mixqfI_+TiAgA8fTvoT@X2@j4U0y!FVq0rf1ohNM< -kH7on2U7xrz`M=q6+3oNx^GGj`unhgpbccsvbtCu@?LIY)v0Inuf*ueOX$`F#By8#(b=uR`p|DG_rc6 -S!%S=GZ78yppAB@#=x_KNgSh>wPCJkgzLN2HC+zXsI{!k2nUJpiUjX>?~11%YJ8He$ -)<02IJJ#r%CxF#RrR=$Cl@L9XUk}{Gz)V>!uyIo5c>-|aeD1VuYA+X=98-vc)HKw`|6;U)tff;yE#xT -I}ig*HOdfwf4xv@8uP?lr~@Rgl9DCqP(u4nQfWQjOs?~mmZ3)iiNdTT)2w?l&(n3~@Px8zz}3i69Swz==i{$zfE~4qJe1^JWJ|l)Z(H1 -a4sU8a;#?*-yizya_}2Y|XmW11ky?fnUJI%>ipbU+qhrZSFBX+j8~?adq|hAm)-%@bC>ngW`>1BPn6f -{+Q-o7ByL9zS5)#^ZXCsIjjHg-=v%_RaL*H@B3&3dLb_YxNs3YypGrK8R+Yf`^wn ->r*SeXHy^y*@kR^Enuqpt#4RY9H*sE)5rq~gXfAEHeDjfeuCz%9{!3SP#KgbHNl<oOLmNIJ^xwwwBuwB5AQu}nsRhjoPYD -dG-7K^j3R}NCd%P$RboQb4g$hwm!lZC~DAg`{McU3N6rQ}VF)q|fax%n -LD1K&`zC%f%EvZJ{X22T*YrPG_xfkj-7#g+9nA6bWH#0F%qRP$iD*u5~|orYSkR*XhELcGZfMs`mZz$ -;@@mTi~0(G*N|64Dg|Hc!#jhAh)Z&S@7RP0$URtJ~H$N_jr;^_ShG?dA~PtZM3*Op7Hr5xTa35!} -mZ9ZhKe{M1CtYR9Q52SmQeV$QiB`~E!l?jDNS` -hX2rK^>jZ*|$qy#)~wMU05YOPFgO5M#~#e;3g5~?4n5xWF)22zpoxx4S6>uwv134P|hyL&Z(3g)!}~> -DpV?aLOIX~B6-%oy0@99bErBYOKDGIYy0oaMQ=V*3=p+ZR1V2BQn~Wnsi+DWIN>k_)ArJ{>!bkLA^Y) -t6Jas03L%sY$vA);(eAK9lLRH5X=azXo@JwW#`h}dm$*aIO$N?0uB_gs6sUn7UW#wcy!b9lCLB`=8+z -(J4?pjbX+Z`u>^y(^?8Q@Ci>DhX8ce~y(IMy$$cyaL7>4wN-``9V#{B@7d*3ty!_+kmbk9UUX#(``l1 -LaKHX3U=_WxX>vpTY&+uCsW=ZnK*%)feWhUniTLz+%qVdOrzXQZN2zqz;3bF1WCR#I_GYjGQzB+YPI& -*rLf*I^chxWhtHLysy#xFcbCtGURvJ{T6?cES+Xdj4!Fw+6dL^nfZTAK>9Jvx3{UhNtMH1C&lY+1b`N -%Q+KvZ?%UgFLbe;zTC$8^P}ddWoAcgWP_{)eJ9)>HzkmpyQ?d~V~Xp+uUmAX#;yVNyLzze=2O;Pk98QFET; -xH@HWvdJ~F?$I`zY(Ow)DG1b!$cHaC%Gs-2{a`0l1;G+Udk_O(n+L3Vj{tR>;Zv|L*rI>B=WiuURIpZi>Hudf8ilxJ>l0BHb-LZ}0KcK -6f{4Ni(8&B%FnH8{^I^E=cr -1)4@|$Z>W0fVv?qy*gBEWbrXsFnXhh8=`!$s4S}&&&I9qPtGb99D*LgFi5HOQLbJe#05wP39tw_%xlazj#y_XLDAY$R+-2A&xTFP_FEAAK_Rmhmd2HLDtvhxIftD~p6 -o6u{||IDx|$(GnMR;_*Gwns3F*&Y2*SY7ChJN!JeD)CQ$FhKTcyjLK}bsF-!IVSr1U0#DHx9e)9iQRZ -1Xp}W##`Vwp|5juYarFx_NF!y~3*yfL -=r$Tp4n93lME?vI!;Us8s=Jcfv-Yep0miqH~7Cblfv5a2}NZY(TT7!Bxf_>$DXqWgDfW7wjqwDE2ukO -VIXLk{XT0WK1`-%7O2E=$EsOVmRf;kBVA3$%K)cgi@7?r8$#qfKjI(IF55T?fjMYxb@W}SYe;6zDh -A`$ikeiL}fR?k~ZRb#x?G(k`1&g;@I|J@g0?H+{PZX^hb>*Z(ntkQ}sKq(?dGNT>Tv)r0ycj%aNy$11Wq?wy$Hd$9p6!{Jn05L4@kY<#vnvd#e6~f0RoJI;aVGcilh?O^frw?QQhXDs) -ADWPyqELSVF||0>@&<+>n~<5ZRW}9_;y(XrSFsT)k*~>tl3_n8C{?$Coek8WH>Lkod(gdH*!MQEsETZ -EhpinQpnNw0her8Ln@oN^}SVm^|$AF1uuDx)OIIwum|PQ5`uYqau)Q~`+#0cyo7Oyy_Fgm#_j`tc=mWePlO^rkEI&(FKmIbNxxFgThGo8@cXo+Vd -Nl!^hdieayzEAgw-aC8{AC9Zp=M_C<1PmVr3Jnfxmo}{F@hmGvFm)JQx_PiOyhovL4fpTjf5!kUuCqH -UHl`su0oIdXr+k%_I^_lRG_Mk%?NO~26+6_f)|C`nbHp`^jH|U%s3+Sa -Q;hJNCaUh=x=2HI{&soW_h*z2J_S4Sj7bp5O(8f64K<2vnJzbd`yx`+k~lFCMkiqemVXVLllH*b#q%! -<%F{*jpvdY2jfDxmh-=H#URVCa&~BD2I|u4`mRA+5+LHho3tu9mG;lrB_0#PY2ERma$$q$_s#FWr5kthvCF -q10cku=2+Vdw_&bT%|?{4`hqB7HNX(IBvGLyg -`o`&;NJ(E(;Ga4{|L)pCs50E-H@?tN%!IbrB;$>C|aTT$V`Vdmj1WWH=MqVmtR@UUixmIIIOU#37o5= -(ip3T~=1g8axKRmn{kvV6O!-WD+Pj(#_op8}gEH!CCKrfJ{Tb -qAI%0NP5>Kb9mI^9i{EDae!lX5i;-J!JI2iQNt`G}r7p1S^?I*P-kly?9KC#d7+oBEf6gaLZJ`8Zm09 -z3k0ls82vd3?^!;)YDLMm|wwB0(6o+D7x<{(XKELNeeV(kC?%eQ_%13vdWtY)ADfvBAgYFCBc!Jc4cm4Z*nhWX>)XJX<{#5Vqs%zaBp&SFJE72ZfSI1UoLQYC6B>Q12GIl@A-;R -&JYB>@drI1@dqfIc)NzIQ^gL|{yi?e&5S&w=NRKhud|V&^ea=vI{J>!!?rFsK`l$oqoVOL@?g>@tbKs -RXh?3DO6by#6vA05|8kw4mX=k0)5}<=6yq-L26=gU#)A5mzLs2mu6f%9rO0N%LTQ=u)iph_Xe82$iIO9KQH00 -00802qg5NUw@7WzGQr0Luda03`qb0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|kX>(&PaCv=G! -EW0y487|shy;b5Eity9h5|XPK?VdE(xFLD!yw2qooG`eL!!6%?!#Rr5l!+vJwC}(SiD<+w3RZ4 -J7}q1e2N)1Wm8z$rgQ3WB*<4Yxc%_)7WPMkZyg=2ft{`Ck8lWIY-=h(%9w?Y%!c?$ -&*zO-U_fPwW$6ZW@J~o+5?uGo-SVtae>p+=G{Z>^gG)OJHN8e-X*2u{1i-2HEogxCPPm%9DW1I`EIfo -^D&!mt?FaCftQ(LO)^EG>rs -K8JI1lBrJuErzcg|-6C@u{4EQfkOY9=!XMr1a7ZgEJhGjJh;_YpHzo#qNWDNH)I;)ElW{e04Djf0(O& -Q*eqW*IWMEq{*GUZg0mj3;4aU!OnYXRpk>SR7@$&5WlMNvV(QD|tR~1Gov!Nf$*ExuWk={o -eIuo*>BVpTFBVVk{~X0dS$J*50V$?KNOY%XM$RXAZo)kb>f@aU0dp{x;Kon -j<`wpOQDAv-sNg*A;a#!6P)h>@6aWAK2mly|Wk@us(aK01001&%001Wd003}la4%nWWo~3|axY|Qb98 -KJVlQ7}VPk7>Z*p`mb7*yRX>2ZVdDT2?ZyU*x-}Ngx6bueG^u*R37I$9g4vyDGj3jHrkL+Fqff|xcYN -Fu`GY`x3-v0NiXFq0!lGX`uh(6dPr@OkUy53zqr{?iDkIkxD=jHa9>DtZX|G-~PPEStFi)w$U^X+wOk -{2^`_T=fA`EYH`+e3R@mF9i5X>YUInpagIK45Oss>#42SA1ef_^ergW>W1F=no4V -S;<8+_3*G3*>%Lc#dxJ|js+Limds*1ugg8GxK>#|}{sRC)U8i_qQY3swY69a$pVEN^YzAk?M*R#d@k8 -j_;dH3Pv_vYMus5^UNKdxRX3;2F9!JR`+RLj3j=Ei;1&%0{vKI4w)XZ`~?6DR#jK5Y4xQw7Ql3{egOHM&DOsPaw*o&npIW`+!}yHFmX5QgTN&v1O6OCRX6_-u -<|ws^M&TonOd5Q6tP6$PUyrOOz!zKX -!j{|i`uyp)-#mSC_V1n~vgc&5$=cx5$3=c)4FCY^Y7hpB&hP<%MZ6IXNDPR=(`QaQmfZ%h!nrB(IN{Z -2?s>l9t?f3?LX9#@7=7b@!6nk$I&W4_|Loi(6zbt3 -L%Zl(%jI`iv0_Um75+paFvDW$`8-DugPH}8WT>Om1V!H7OD3UQbFB5ToTG|$ZH+OBTMW#dW)*F>daDg -=s>kb)`Mt+K|tAH-K8aVa=|B*(mV^&|HD4qQu(Ipt;d#GSChz -Y;qqMhEqRYXBf^@T`T(@+R)~|fzE1mW7`G@vY+x5gkfnqi{Jofk%;vD;`RGiuV1}MKsB0nfnIwSuju( -a@E6STyou~J@)=pfnvC`f%vs5tpVrIi%w!FzvR}rJBHJ>()lu*@MrPa`1(JpY9FsJBW|n!|+#zmWw*i -mUHB1S0I@*6!4flj#pF5uZ`OWt)LzcR6Fqxn-rTokxuVBZJhro-VgRE{UlQ>%D20X>i0xbS-Q)Js_c8 -tPt0v>{VpEn&Y7xD(6(r-+e%op4Q7=D?JgB!4Vj8WqgiDDEOP~0>xhKbehQTLJZSF` -S>;&#f)jiKP1}AO%wrdNx-8Gq39s8a1{}A~>@!aOxA{MU$ATn+E3Ouq*QNra7m8Z7!&tV}L!U@e3`Bo -ReVBV}+Mx)>*j)Fxy28F32Pxp{X0lMj*JL5IpM@VvY#BAGGU0cF}-k1%}uM4ox^(e7zA12vZVpF4YQF -n_~{d_7EhcmQ)5kc?Mw)00W5uNKI8XvN(Xjh^!(w5UeOM2<4+iHajNgr6hsEeh&on5T{wr$eB10hJ9T@45-`iKUGIo0VF)$k7 -L5d`vZ)?{Xr9Ws5*}Bva-eB8=xC)M0*XKb=ahkMz%TqOnAXFaE>5j#%?y4@>NWS%UO6J*9E0UK(Pv=5 -lC^mM!Q+32MiThv)cI1r@2k0$siGMsV)R6)Z)nA2fYwG2Q-@H@R%Ex2AK> -Jjha9#V}+O2?DRC5;sSS%oc^=0kt?99Si8TGX+W!+ZDD(=J9{Uc8-U?&v7F{EAL3Iy^RpT7qBXOC%P6 -@X1Ekd|JszRYtVmD -Q>HV{Rqs)W4`>&u1M8mb@T)~XE(?Fv6^92!k(et$qmmw{=TOQb?ufJn^EvcrNq%hD$D(jxASPgxt-+z -c3NO+sZ73icos5BzyAHc@XG2$75MbB!Dj8Dug#pyLjgzlY++b}LFp`;*XPO4 -jK-W?OzseruvG>m40*1E41od -mU>PlZ*r(mQ#>}@lO=tDSg3f2ZfW@5N3f@K9ht`leCs0NEEhL=j>ArRSIsq;|5ih`_ue(kbr*u0nlY& -$fRhi@s^+~(rRv2F*FZ&0IqlJ2CH?Qp#M!@+RPY@o4KZnb!VMrz~_`DG1OLRldLBl+DGGZni~<3AVqi -+47*=iGE52H8S#6lj6DuBsc2=X(W_D8!TqF5>1$_(|*x>40bUC?QTYjuUZ5$hhf>Vl1Td6{b64Iw^o7 -5`45Hz-C$l?|YdcApw{tp@g|pmhWG`OGb`Y#5(GVJqzh2ec1HdpaL#$r~S-;5mgWvgjT~6mmrZK@mq8!gJVcpsAwDB=);3sm;z(!(E! -DJOWHS*6YpgQ@X<1%PnpwPLvuIu9Y`UXB#fsx1YdO}w=fLE?1Af --VAFbI@qvKLsB{m(P5Lu8TDlY{r?#CO9jtL{98edJJQib&WxhQ;ar;;-;n}hM8xSM`kQgs-N{BA(xB<;(wXgAoAYvDS1Lp4Bab2q?ua$8Ek&f=URvCaDA)csA$SJASFFZciat8l(i -Sxm3b=<6^shcrVycQ`$hZ=c3wfZNH-M0(6H9*Q-v|*U -J+TM2w|U_pQpGz(`Uf#FVi`Tw3$wSq2W4o0XR -fs0S_3WS`qi{2mM9yY8O-5^XVmkf{$lYH!xf$8kN#8$wR0QN$y>E5`byjI)iAEj&vu6<)(B>eJgKrcog^SGG&X1gZ1YqLWmaWjZ?ZiKRo>GE4S)p}8 -eSL&i211x2NOJ6K5eJQI?#wNkETZJVQwGe&_~Ze2hB!`NI3S??vdUDJ0N(~obUu(Q3ZuUDPcUd83nP= -b1)HbPLjX*r(}<4<;3yMiM#`(ezvE9uRJ?f;*xf^5Gi}`w*qs)hkmSB|ltGdF3^owid9HVhQfh?_r4M -^z{}-dYbAhA0mH`(ysjgD4_cg -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 -<$nUn-7w4`CSj6HCTxeDQ7`Y37ZcfLvY5={gs0 -(>d&Abt>o9je73Sk*c*PNj6B5p?`FnzmMDwZrAPEaxa_brG&E%Tr0`|dtBccUgavLnozM3UGy?~XN@j -07_aLy-s-F^JuK(1!B1^CH%QRXSL+tFLK8AoGdBa9xjn?NCR-1~sv@~AArX~Jd0$??h2e;w?dPTuT}4 -`4?WSp+}~h`!&z&IU0UtnoxBNc{$U7KJIBa>kdd;*P=aVSagi_TqvqfFh=xrz~28=_Q{LCn(;Dg@RS4 -1Or$Arjf_|8omRIAtG#*XP0@nWQd@15)GtbPOvM{&CCacaUtLV_GLRetd|x&LZG*bre&PWdca&Zz_Zc -o?TaAEZg}nw+^g0ekQVVv7N@?|cBmK)5b3kyz4edd{|H`oqI7<~iq6lkT`0YL@u%a|#BKNe{?_KbxY2 -^0pNGrY)}|B5&3`45l6_*K8IiEj0|B$LISNYV_r|~oE1+mm^oC6RO0p*0Kj=VFu)j$cbb=yJk{^FA@B-FzvI82{&e(V^5&Prcl)petqDMrXnu){GK1Hu7fA}9iZbWbTRqpyB -%1%B+(P*hXkJA~*XWeWXMpyV8gkf|QUUJ+m5^0l3kc(9k7rqyGL-uk2 -OkMSwNGQ-)e({@N26aNjL|OAv&x#loxF-^8Hbbn74#6H&l -QEd2rMBw_E_WW4v&!TW=8fNM2h`C?#FhP7vQMvh_U$! -dz4JsKPmj3%(RaQ>iU0g=O~vp#XTRWl_Tzu=Ep!745owgxjv)TH-{%2eDb{Y-+qh)AhOaU<13J9Kcc-hI0zj -txRR920%(4d^*^BpeZf8`nk8vC_JaqokiYjACisnd9?UpIJ`Ck7DMNSAUtO<=ZQMN9wL_8{i{Dufb14(A030u(54sXiTEK2L6DGGX_3`< -`;kqjkRW*2t>`=m@z0hCt?5F@7gxNS4djO50+vunpum4uZFAFKeRp;@c;m|pi=x!sHN3@`_Jd8PHuAW(H~*~wOop1h@SX7EE64 -i(L`!HuWD~<4ErQ=R99`qBMDGLBrDUJZ=!CS`X=6LOanjMWHh}sVjvbK_*-tU5)v4t@O#qLKv|EX9vn -<0ZAG344&70rnPE8(#p9LtC?fO^!9S?nGk@9 -&=O_6Df9d;i-r$wg1zNhG4!ju3=OBh@e0}e7g1{ugZ357J6I6$9a@Uld^6>VA_r7UGjQK0V(25iVueq+G1t(QJK;g? -|Kff>a440@8Ffr%p8dZNt7;F^e+aT21z3-f{=Lj{1$vn-jZ<)BCwEs7Y(u_oHnnB=#%L*Dbx!qGo=NB -@1H{(Uj}&&kE}!MS+01ONHKvw@;;ip2n&mn|51@BGQR@1H?$fN`PzB|y&x=gs~b&i=o3bpPGp+sEj1@ -H}|^E6s}f0X-qRRi;CNY{gT9-gqjrIy)X^bwJ#444jLdo+#nVWms@7qHx7~6eyb4C?w#yA`Wwk645W; -FdXm!nU?s%vJmh|Ai(q~1R~~peUAjAdY;ECe?S`Qp#Z@WeG+4n1Ja*9!m;Gjvf0ITd$i@A+Rn3-tiwkLN-I -;+oL8KJ)z=Q2skF&QlogH4i9LVda11*dlXo^WFmBHOi6d&~o=5|bR?@SqiXq^1c)rRK=|Q7wMUBi@ND -_;}SBt2u`%2$`tlANagvuVbQK-B^DGrN_$q1l?Qq7m_7>X&NrUToZU-MLfipjY&nt(`_Vw;Q=jaH~|3Y3wCFJ}{T -#e8q??YrF{$GBVX_N%XZ$H(%!TE3eF%4iTIe${!vzGp8CivqY>o5M1sShsY00~N8iLPJX(8CTLc5IoF -*+oko3^23z1_S+`EEv5fmG=!@Dq^5Le6YCr^**ZMje2ESKPIu;nOfA55!njM3`--?-{Gj2e1?gf(u+v -Zn!)AvJT_OJW67(|55k+Sgjl9gHbdTHR%-2H$8^(py!pI@pY#t^FB}ydqQfIUh?pp;jC~&cM4?ZnA?O -5D7^Rc0&Uy!E(zavsx{mGddazbPq#7)W04gu!dkI{H`u6<6Dm$RwXZ@ObVe*GnMSGy- -aQWiJ)A~z;_`TXob=6rSig^^-+H9c%R4~I1p8bWzxXX?rET%+3uWpBMRj%o>1U=Rf=~Jim(9r4aOpvU -EwsIC*h@)-BqEPS)5N4p?mVt=&5)rJoc3Ntvt?R<~7i;}L1eYlkWIlMyjk$H-ed)eqJ3&Ga!tXwN-6yX(l+N&k?D|LxAdb#2Y8Um_|+UaFi%HGC(|M0{!b7+q(YNaCYRXI&yC3lYx1^kwK*5uLEz0qqeIsP -4@*N+X$Qgu%|`rMZ<7)5`r(C_mB!{GCIs*C~ft@ykRVEydb1?$sGHxPKgeqLpNWS|Da6?XI%gSV?Hdh -6R+%&ed`wy>K*!I7#dprkJ-cdvI(&p9y|~8!b -tujI4A5EyKf?UHFI7qJ(+JHpLnt^c)Z;xP-`8HN8j97?VPMuRZQ*H4M3%WKg*w=KclcTtVvy9K(PUo!xPbBp->JMr)u#^(}!$i)U740N7vA_D{1)1B;;^Bs6t5>R&+2I_0Hp8I_~}vzA{Yb99pc^ -#I%Ymo&ab;~J*DWdeg#5g4New>n_f_8q^~;C_wMS#~4n+{gPcVn<^jRu2<`%Q9LpvBZ8@vs)+> -Xwt43BRk_<$;1&d(IevxtqL -Pf0jkGs-#^?r&1PAvv$JT|4G -N1}9mF8J;-c(^Xxuy6GQm3BuOXj;ny%&CDC( -gH;Uk44Gz>PT?2ATlj5lbVT*W;tZj0XE?eT;NlvKIXJf8~9jlNRr#KlPW56p>~1@qs-=G3e;uW%3>-rPPekZOjcbNOwErx%83r7r38H?U4#rqUXOwN6K7+z|Du0gCh+>ijunKZ -<5dNo}2dIuJF9>CO<1H#{0ufa%^a{5ajq=w>E;Abm2{x6x+S&41)QXGGAF?9HfNJ>)Lu}GK?nkm -mM6yk%R76v|(&3uF;KDoQm8@f8vr=OYDH80wi_ZCt$lmfTdwP!f_Nlq8bO7Y6!vuL)RKdO}9a-muk>( -L1h(d7oRj?bn;#MYze)y1w^wl){~X74dHXe^OPrA!AjVr^w&X+;_QE>7TQK({_9{fcx5BI48LT#0Rv+ -iHsGK-Oo}IV+NEMPgzwmE7h!;zs!Y>Qz?LvC&R)I0cWBi6c%(IL0OGx76YcQR9?pcO6r-Am1&HN0LH8oVH6rcDb -pTb9b=FR*r;bh*`N!ZTAhqVU}?FWf=LfU%y%T@wbYeGjA+#*v_1xk84!;Yrd)R)35VEU?$=A -9d)wqbx<*Gdng<;PHujTf@HLsREDa;#@pGzj=Nxa6AV8GZKam_Se+J&i=;Ei;HKEfYHJfNo0M+g+` -wJQ0}i6O!~dP6^*ft{`6qx(L*}VWQG5bX+t{FU#-}4~oV@*|IarpgACs{|GFPt}#f@Hri+l?VjxYBx& -g}MP4K%tRgJ~KnFqn+cH~c@2}%Hv&TQnbtVk??{n;fMN$B$vr9LlImqb{1CSmtO=i$AR%wS=)rAV6<~ -hu$>55nzib`3~ao0-FYayPp@&3<}ZdE-dc-O*JG1x~e%rMU~1h&QkbLu(;e@5~?0>Klr61JO5$ZeU2v -4bG`PUXd=)8t7Rdeyc@&Di~o5tc%;n3&jUhCUae -$Q2Vct@EzW8z&8l>}t!^KnOP$XA7JXAWoOv=;W%Lr!of)u#t*$V+gz8HA$>cYsqfx*lypHfni9Vev+nTmNFHKH3asUc~Ex!V@CorV5L0K?v`;z-6%WR6lI31(Jx-xjJu?T=}-Xjz>; -Ua(VwJs3-o?A4y5H;`f@Oz>>RueaSWcKas&eu^4RxTO(1Xo27mc=ke|6o8XoCduwyF6>R8?j7;HRhOx>vr^sj(65 -#)j=q4}bZ*5M&%Fumau5=X`?CMp>ZeMRrw!p7GObedimxK3Po2Ns@i)dhiibE%)Ls*))T$)W^Z2)9Ii -%P8o8!=6wNQ6T>R$@^h+%g%ysj;f$~tx^{=;+z)NiE)v}b31a2 -RAN$Jt&~*$XNUC|E`x8Jf^OVcLKk1@%Rj0{b8NT6MlYS`pUo*$@4vVJ_XfQoi)+A`W^3Go5>7MMlwDM@vUnF=kjzOoGRZ9rW3!PoK<#?@j -sf1N(4_q((H3Fn5s=hXw$h1{Li6*6S;5a(ui;Ob|SbIvCh_OO&IU!xD2)?AKYDlf1w@F7?QSOrS3^Q4 -F=aJJh0RSosEKh)$2C!|H|*$FXUDBLbtsTHd;cS2E@xiUF?b?PCx=0-t7?VR1QoGu~f68iRZ!xu1urK -<`Ku#xoyzp?8d+afvX5FBYnjM$Umyq{O=-u==dzx?w}t6H?#mW@t2dlZV?8xREz7$c2tZY=3h>v2+r# -J(DVS3%rR&(AhE)`|Csi07e1#bRoei&oJ=-lO2r=0P(BWTMZ&;(V8SBHa^}xkp%NYlVDiysTj!$U0-j -!LO@qzv}Xg_AQQ%H;<+XhOo4t6Exze(8yweX<1z(u_y&8ArCMPd7E@Lm)>CSy*Wg(KkMHsB0f{e0ck6 -KnAk1G?^m?|jePO2L=U~)&Q@g(LYfQApLwwJq0F|BK};DNihoz;73RwfC{=BP$5zl{g*9o{l%OHr -dcV7OH2yT%KRAAO^w;+XA5JHyyC**$kQ5iZFaQ-z12Uv+4r%Nq<`G0lN#ZE -PD2tsMu3|ERU1q8dN$mp(NGxGTUsYx;Z}eGh*|`hnT6jeBOI2Rm@;~am4Wny1bEq22phOpJ&&~tc1+o -&Y-Q*^`6POD}v$oKOkR&yz^FTW5spdayfT&M&&p7CkB`wihoz+q<${co$!b9kzNVOf<&Nu)!h>)h)80 -SasBAtMp@K9ET;XbdZ=!otwm}L=_67g9B5X@LPg)UO`u{x3bPSsz!DD$j|54QP{V`vE|GEBouoNWVi^RRalbPT;nrEg)>6)G}~Xw6BC~dh?G&`|HQ4iQX|**IfY -ecw&8&#_!T0y?wgp_6lz{)`P0sPgU$k>^#lM+@~MICV|p?D|B%?al##SESMjYm+;8;$mnLAo0T$@4;G -Cy)l8eThV*J2m{XNFHR7fYK-ghx(*)*XJ`8g#!&`wT7D0Y*JbU(PCG*F}dmW*=x-j(6eYXnMsH0sw#Ogby}Z -NQez#fINo+OoSpU=SdHbmW3}RqE{)x=I_{}_ka>h#omr`&I1ka7VAO4V#twSN^3U2B=UX1?QQa2ix$n -%yKM$h+Dg+6(39a>HqJ*1T`L+K8P)h>@6aWAK2mly|Wk{hzI9p>`007fz0RSif003}la4%nWWo~3|ax -Y|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCzOmeS6zBvN-y`KLuAlIhGPxYdJ4Xee2%iBu?t5j-AJLH -tD9hDkae}H!`V1QgPhf{qA?(0OF05oV4fO^V4o)i3A1%U@({&3}!aBzx}hZ8C7v{na-2J;&x;6kAe6+ -U)&by?5c{o&wJ7C&dzRh92aHuYFSosGEU~v4|DkaUo-W4Fin1hdI$4)MD@z3NXn%6oJhfYao~PwiKbof4!gyK1! -xA4(k__r$=l+@(QJKu=3?s$P@F*DA_IVhvxdo1U70Do$+{>G*{2FTjjJkt3E0@b60|a2)sN59(D|3Jb -IQ%1-RQ!~hy3FVE{04eWcx2NQdt2_&Twg$ec$|MusFzGeQI=QG3&sm)j4@-1kay)(4CE7y5icH9Km?` -&pGse`^UE>NTvnwpQH#8wc5w(0E!7*Qxr?6;qw~|37w-YkilM8 -`+3k1hc6#c4#%3cRDkbASObqt}OL&wqj^2hWazgb_~7VuKYDTS`ry?e*F6PjfC?66qyfgepAPvcG=BgX96Y}`Iz6E-K0iI -VID_AP7=^Qo8p6Ay^F!$G!P(I{pbs!!o}EHVIP6dj2lfQ(o*XhLoDzHLpa}kcdyZdmJPCsrhX=<1?;N -X}#c}R03n1{(=yF*ti)1v4(rcuYXi=nD1y3_tyBiywPUkF%rx6uL%DgGkDnTL#jtV4RT*p-u7n7^>b5 -ahl_{PR)^cj{CR0pv8QRhF-lFupr{1131ZzBA_yPd)JgPji4h?l?@3aEfjH6Q(TxwDfzLSEYScxex-O -@V`9C93uxFW}c6u;SrxduMlh_i;4*Ztv0V-p(+3umcP_>b@+}egw~7CSxkri~a+lOg@+Cl)xaAqv@Wp -T|`fxK7RVd0{WPN{yn;ej&H-Dz-pQ&*W+a|6L>`etG(pz(|+(dk51C$I=M}XK7N}!{p&|(DRT8`bdlc -xAIqi#7_3cmzd51_D$R#7XXS0FzUKNHG+L?eNl|3E`cb9VNnNN|PINJ3Me2KzY;07;?cN5Ctvs6*3t+ -%E(~acIBw18~(P2^K1($;Y&|@e8|DNO-fPfvT9F(`$^ECSu!L+|ivuS=)BAEf70xEhk*olfbErD^J

JA?cAN61#0**OOxNTse%p51cN0S1WI-mm_H -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 -GmYpvlpi)$G_M -rJZy>b_T3r2jsC^Ip2MDcp?+MPy*+te*ZcPeZ0MsYv|Ys|9>{icG$fvmo*kVWoc+>q6mdfDU;7M`i_{ -u7^lEU4o{>2_$93x-q7MG#$&+3^7?XKkCNvU86Hu{!4zP^!ByRG+;SprdRVJ{mE(2AiSPg(BNP%FtS- -;|ndV3l%OZDjMIlUz#8Xa|&WbXsLdKxd#(l$=2neyeI`Nirof<5m1QA -%cY7l7*M?@5$c4OSBX^OmxenYTSU_Js?p8se1N%xI{ZNaSEMN~*~~8;xY_5fkJL#An#XN^28GMzfIl?Om2zpL&X}5`CrZk{0g -J6-$1svjd_EAM=bwwP`JZ5wJz2MDLUOYA!SN#?yB3Q&+S3o53nPWe5@OCYtFWdY{7BDz}%MQoGub1sWPv!U@-S7Lxix-D4j}I;mUj!W~8$a7MfY%4_NAI2;U7 -X(yf`!58_2KK$@!{VNkM9O#r=D~4lPjy3yKNqJ{eZ_`cmj_l2KZ06*X!A%H5!TWvh(ZC!|#6G9X|YZX -Sjp^b)p9b=m+GEzq9-6!|%T9SoT!C;SE3xDsi^DodK|W_moWUi~IHW4}04WYdL>2I(zwi`2FMEsElt* -JbAfZmK91=(b4(o_S2`2zuz9}L#mhLfNmU!dwnu7<1^H>%mobkAr#4C9-}i4pQ)}Pjsvm1Bkv|Lt(EF -%iv^7^RjM&+-w%y##GqZ;OUk}}>&zZ*)erW?38uNhzd(ak?DEJ`H3ch1uM!iEJ(%WF9)0BiA!;#R?gb -8?B{wYfn@FXs{@#i(jm>~`-Ll$|wZjOM`YE5w(1^(UUi70S6a~gzu~UO?=xofa_A$U^<-kFew_5qQLY -*W{4W85RIPyD4-?iZ@Dz8M1F%g)8e2x~e6gJ6A5N~hdVp^^szyPl{Pm#>BdS|`q5W`=Kpv(zTgmpPzm -RH^0nk{%oVlC6tI3Mmtzup4G58n*W*d>94K3tJ0sn7bb_u=j~8mdvLnBjfW@v;g4!dZR8empk?TAd4& -oaX5ytw1-N#AT)KCXlI~K|c=w!fP=DygA>;>5f(NBl@f+}BpqT_oYzl@#A3ck4?{lQa-%~0e>xE$ZZv{m+=sKy6_u-3DOMtdbPHv+oU%LtQTnW -soiFi&jSHdM57xEDQvVxC`JY{VGz2)dX#;XSK~8$^8Yi0b^{AslWM(ut7JY8tlBd+4%hP07GJakK1e1 -j;fGD?j&c_h-c&bNCdnre&fxj}j@{~cQnfT$k*hFBAj&fjff)w~)PM3F9;ef3lWd00&^bEGX~y~EzUw -2{;+$gF?OWoTJ&lf&p69V*%}i~A55lU;1UyH4rJwnNd9K-!v5Lm9bC5u$?HKG%Yw(}O$#c#UOgAZ?Y% -8{*Y8uHsIBt4u{L!ud5{PJ+Z ->AU$P06!p)blvNiJrBh=YBB-yTD4{0g8v0aRyl3$~JCc#5Y|u@yIOCh5eBE#@%CrdTYv@VIwtpy9nM& -=QXRm4UT)RQz)NMxAS+8^S%Li8O`S1BPGVleyliH+bCUlfmHl3xZ*1aRO=-fF(i^u~l+A98af2+6pXj -7f1?b$<6pT0F6UfG>mB(G8~+>on4wZv0& -RXvVw^5Rom7zY7_W%ZAVp+Fr`q#w8i~=`0OMpd -CUCQ6#fc -3vMav^Nr?w6Bcy-Vg>F*P@BqB3gVZF-$3YHj`jsYzfU(1UmBMqb%r1d4SggYxBD72r)*2NJ~09HrX|9 -PpV_EZGBFs=ozP@(BR!ZT0874hj&Y%$WnGNRnfh}zLKrymzO2_lHmgA^WK1A|6Hwp9d^&4(B?;9?3c3 -P_?|w>ghb5Qqz#QrSWB;8gSL+M6p1l?G)=mu1KM@GU`sBKAAFh`vv0@WGM=RyYcN7Yb+_s6+bYz) --z?;LNT)IuYB~w9$hQ9Jdb*1iTSj>=zVf%CdDM@x{Q;d_5A&zW$x -R_kp6cz}}J6U8W%Yt+yv5wxs5Sw!BUUQJ@y(=~DkqDe~C?N41)MAxOsvM3h)TFz%{btv(BgSm8sP*&a -23t*fiu-6zwCxOrDi{#PxaxJ9b(zK*fp`LlDdn-yMb&|Ktn3D);ru_+WFbj~); -l8-#$D{q2eQfneUn61l>;tmd7-4~D^Vdf%_vtRbqx(|~!rp$(Jk;z!+=HKz;u=g*Xb503H*Pc~X5nu~ -SqVch2N4V>PZ?go}b&8RvSzTnsj2n<4dUwY_M==Of_m4)R4uZ(HQ@#L9}4SiD#f1Z+P;R!kT%JONq&U -Z6)uS>4|*B3=fY23cmC-=*6q`E!(I<%#?wyCTVOp(6ep4u$Nn8KS1>8-YbMiMkW(tzynBU-C>sYeugr -wSBL)DgTzn^t8gs;N~#^l;E{?dSR|pPi+xcQVi>rj93oCAe8{#Q16)u`7Nb+KbIy($ZO43LDCSbgDZ1pB~}ZbsaG(>2{L?OQI -LREssv$iF&y#DbNtb0GJN-g(jvVdIn=bc4dq1=V_Lhw7)$JP(J$dNvH}e-$M36=jM>GKX$gQT)*mbT; -+vHikVtnrXEbAL)$o8MA7?eoUs0jwupIBF-HHBYsFCQn5uNBwTxVKhi3a!*mEt|L<4S?-0)zcS-^H8T -l2hmZ4;fQGFcRXvm(J)PM+vq8+M4a)26fP^+&>KB|Iv386h7H)7W{L1n%F{;E_!0Eq^C0UJbOCBWnX3 -!SPuU6!2|~J_kY_-ZwO^zx2&@TQ+Nmc;--6va&Fx6nTu`Vxx*pdSbbpJMIrnq(~F9UmGilj|2_F_+~G -lO>k>Ut;bScuer#dq!s@;+~F>|HnO!OnrIXFK&{CRYKc=7G3_n*@*fXc|?!Zq*>7;6m45ZBLj{H0 -5s-RT+Hv$=-`VLyL+=1CoFCO~OR`n@?kd9h-o0At+_F(t1J3;QO2FKcea0Y -seyc3hz&D1iBDZ^+EC-n{`cfE -ybt9(n`BFHR<4S1RX?(&o14QPlCa6>i{qq3*OVo@gYW9gxQMc){!!1EMh5fnpAN*FEP#B630?uZtLsO -48CU^WfP;csF-~yX6WHnA?X&N>VUa}dNDw$u1BCVWfH*aj_8}icrN7C84S?U!>*^4cGtoI~`}08^+%S03@?@h-td5+3F(B<4a${d*FtWzczrwF*n!HODe9BhjkNMImSP!6Ib`~njL+BS) -E5+#MrV4n$FW9fxuZ3$WSc_grExVdFteYc>6l!ojc7dYgtD(vxac|hEE6a{VFU;BwwQ!~&PK>A8mWMJ -$Y0cFg{h?+C0N|hhrn*L^46~w`4~{aU054N!i|pv6`I*F6rRb!X{BA1sIeSN4n0^jw_5th!AGI0e^kh -?o(x|}v#x>g-T!3C+aXeTmP7eQmeSYT9j7g_bZZ#7~uVT -|$Y%RkDW?uUD2bgw|e$-T`lKT>dJLS!_eEq^qEZ-~Wc)Yl`}PuWsno{|DClEjUp0;Zzul_K2BLqy;7Hj-%g2{Q)1?okn}9Ngm0hMSzjWPb30{3 -KG=&aPVE#T(ZOhoBI?*h^eWu53C!(zJ(4vucKhy>nFY#dsbtUQy@6sRur8H6!N$%}ORESj -GI2EOV-xGQtjT`!Zbr0Xoa%d=l5}wkHWej6M4(g5acL{~IuX8Z$t6Uf=)xmzJT*8+bh?Pk>i5E$y!OC -K64R+Le%K1oP;9Vb+z|!D3QOnS|UdKVxVd%_EY|XbJSQs8r8aCM$x(GIqal%$w>xSy+>?@m@Wy`N@q) -zmy$WyoCwSWOFLW`0UYIZ*M?M13?(NNw{&^_j$P~a;YeAsd}k{PjP-K75zp}Es( -(B?N!CdP(0r!wL|kdr1GoHM67HS3Baw>!_VdE7KI`i(Pdj-ClHke{w;G{1%@)<-FX4kyrSL8mr|qc>S -2vD7?l9a1qkOo&vzcD>V`qzXjmjLuao?N{gTz|eenmEb16?c@0wn!_d4of9Ke6P*c%@24*plHuBv_V3 -PbR2f^PaJ7s9#;-TGsmSUEt!+N)%fnp)H*;)3_#9}-H7Z`I3|__<` -vyi1{$c2KcoBp$rKi=ce>z6VakFJ&w+288ieAGZht#Dva@Hw%kZn-GTZ=?Oi1bG%{fm)3$*LrG7vE+n -mOi994c8crG5A0OgEU${s7X84k*-$%Esf9Vm*|e$6oUc!eBK|yjbEXeGwK6Brw7OPs^ -0@^-hv5lA1!la -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 -yGZm|dPVy4K6x$(cni2ep4&x_$>B4B=Xq@ -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 -wh5opF5=oQdtB&dg|iIWWQnl0TP`6HN -C!bzgxl5P?1)($#PvJGYZs%)%tcqP<*t_R~J}6r)XZ`hq9gnLh^N~e2p!b|71Z8JcWyCizFV_L6}!EDBn~r)`Mty+6q|xi;+;4g{|i|5 -DqEcCO)ko5qU8qPdSDsX*3M$LY2LU%svxI`GLldaDkOD91{&V`o%$wG5B{(Y$d+WEP6tjg?HRO93KBC -Rs2v?dZH#`iWlOGhO1JDdLG>*D}W{-AY%}usV%X*A!Y#T{e$2P -N}g+dnjnwn%!rLuC3gcBBPR4hacrsi04o4f`OY5-eSeIy8!8kvLG?*e!lRN%7d!3Z<+nG%LpAlufIWu -nS*wo=7qnNL!pQk{2G*t~fzJGnwnnZ5&WJpY7G`GB@>I>4zDES!$Gxu>4X97Xnb4Ye(`DrP>%{HCiW8(h;_os$PW>P&JknKY1ujawoJCJRGCThYK_^gj8;N1#e12GKQbn=WgAYb-Ag -o(hxLW7x3b12~MU(hu9N}{RjwSLAp1GEN6WNqmok?20ELV$vN#)f;br1H0)gK@o8I<1Hp6q$H;MoVnX -qhiB`{c6RK^wSbLjgyDN0pKFtcv-kRrEGIn=@MVXG8F@u+PfwrD!SB-4)`A*>PFy&hFTp#}0vWsp&gq -2lo1gWQe=1nTnEII(iv4Dlz7bv#TvB57ZWczA@smnWtHLn|gcI@5SNJE>BNbz)m^p@{j@iz21jitW3K -lV7!h_aATYe~NuDUZ{7F~ouI1te=7_eTVD@af`Q{Cz&(A*zN751pS>V6YG(tJYLGbzuWdg|Z!QtWiqw|X -&pj?{!H9B;VBMH@V?2rxMP{xE%n-TZ{|pg&eGCXt=AtrOmVi}((*1se8Sr9g$H6bN@7`K7iK-yG -%R8~giARK)Q(`|TfBNuCD$FN(<)Qr`hBjG%;ln91F+BOWNjWJ+qg3rSw8KMROG*7G~JO3^_=t`VET+u -xoQybBPXin0c%+J4TykL_h0+^>e$O?$3M5sl~?@vPiHkEH1iqDESghNEE}KDm5NbIo~`!+>?tRK@@{k -9Ri4;AJ{<99S}vf74F#kOc1kjxgS%Qiou}90AJn5r60pUi;BhSk1`Ji{VfxPM)O8oP3=5p;GDK_v=>h -L$G98ElC=^n=oAccy(5>mNvlm)+r2vWwF<+F{(^LEFH%X#RhNSZ(sbxCfKm_N~<|Cb#v&HeFVdk)Y=yX3|ow(DvT8+GO)@QyAkEwx@TfK$XG`k!8I -aAX})vGQRhS>NrQwcpJx&U(>Sn}yq+h)w2j1|Z=dD^*hy%HO-GH{vUru9%a?O=MaoYi++M)WRG(Q`;G%X5m%GtEKH9;}|snR&kxsG+{!NtE?r_l`F_X9j_p_k0@>Seh4JO$3%-hrrT -6V7U$g{(|kxG^8USF}qPiQgKA>$ -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 -hRs^I^muH ->3u)ySSf>dNbCse&-e^EfQi&u4WzXR7Z>bSSu{4>hRw@Y_c{D$#2=Q`MHi+O6{}%+Gf5O`7cDvv^k~< -!8xWL)LrxzSofTYBIamub-pxG>z9mdUliSqU@$P8w@8yPvsXCq<1LVDw=Y=-C?^_!~BrTtJYR=9`C~V -k!dFkc8dROcOB>DnJN_LN$6?kZH;O8RzrPAquqnDw~TvDVZ}h1(FET|;fI)+PyhaJ4>iq`;?=Hv)Sul -xa(Zlt&sJG}cb3#h=5e8Z6un?)hQUs(-2KUT5W5oUM-3+?M{P_adts$X2~olEz9Ri!u(PQ|;WL?w(?$w^Pfxx5^GX)VK?_s=7N3ho -=0x!JxW3Ym%MU9GZ%PQYj*(n^+-|F)RoBhz=gE3go-NhFxr~KoyJ&0Gt?455AUycvgYKDkYQH+fMX8kf**3^8?^65! -MD4wYFF(F{-HWog(9=mvs5tDa{a~MGVO&(b)rImysM{*OdDO|+9at!`ZCq}2opD+iDR*jYr%Km+_pxj -zN2_vYID4ub|mz5bRyK}Ki=->m_ytG=oQsNo0y_Am;{;8F3wTG)zdy=r{3;%B -wm{x&hD%3<9sDJg)~@N^7B@4{J`RWq)n*Nn@??#8~X*|jd(Q9EA0u{YS5kyW=fM~8iygn_EW;JKz}dA -8pxHVqk7lSyO446@coY6P5R{7{H}-K8BL#8(Gp#Oi51?5+-(r -_~4kF8x8zZCeKIwe>>rOX2y-R)i#Vw&s!3U{(G1E=vJzRE4_Mg11L@GgV){x*co!?PXj~ev}=SX?#`< -!PhS8s)pXfzukXysuis?|G`!soNQ#5)eRJXR|~!wQBGGg7mf4MXz)8KZ@o#Fwe!b2%=n#Ju_yf7BW;< -MqM+C)vrQTJQ5Ke;_kOG3!P(gZt)?D4d-wF?&p%u|_(pl0rL~a}|I0vaoHgr>9O-s6`(d`-#?o!1F8o -Ww`q`Q0y`^>QFZRk;`+FLw3La~Od`Y(=c#sX!mb~MQTVim$j%t6=o%*WEdJoSYdB&?6oWEnZ9;j)r2d -k2RYQFElI<@h&+@CqCna87^_o58$sx9s?#+9u8165kf_Vl2NO{VR+Z6>6-2@o}LAzG>Kl -CSH!qw7PA{}HT{PH7tIFh#wMeXZr#<9AyExyJ+m!40>8GE16{7NA)xPP|PDh(=TdO_7m==k0rFC;>d6o&0)xe% -!LWPcmE#t~tS|xd*gPei#mAz(mD@dn>^x~M1(imUvvK#-D=Xth^vqRA>LN+&g0=n!MJrK3Ry(cV0WhE=j1Hu(t5qdw@FdzO<{w`O6;}UzJ6woRA$8KO -ou9!j@W*#I`kFNrDi2i##XS?t624UMlnBTSQ#J}wA@CNO!jg?8k -=={?JIB=n%elI6b~AI4fnzoKqis!gR?b+QzRH6N(8xshjV{zapR&8XZzDqU@9dw$xc%Pc#KgFLm4pd8 -g!#IbS#v#eJUlisN~Zd>fGzSeYK*E64PyK{ehb9IM)+4B`d*}e+32kUqjem)y~GdNM>b&{n@2n!_+@x -C{B%oDU%o9a3b_M6_I3eu^aqHUm8H_!{xwG#YtvpvGX@SnoM@E>7e^iN@7^!Kwc{$~7DEQ~u?7~h=*c -Y8an(MWW^R-f%MpSu3INs88<;NEUjExXKFh{SVi)3m%-At2>lcW~a2`|KQZY@kZ__NrxXXsfHevt<^2 -{s$Y?Rdlypdm_!2SGRecWl@%Wh1sjyBY~-#)yISJt+peoICtm7FE{@nA7PxPcaq+waz*YR61JkgLYj5+9!; -SAdTPEk8?B*ZT8mflwVg8Et?%vK(uSRL{uu -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 -%lQKx3C9CQw#85hD55!4te_dS@m|8RZwANEOi -Nh5kygeFXIhYlvrUx5^0_RzD2vI5afT!6(&-LkHGn(vao)u=~17gonq2TL4t7$|~US?x6;Lm)E>X{Ox -JlGgDH-|!d_9xN;==QS@3`Rx2FxasFELg8&BizbI0wRaZ2LvuQq>RnfKC_m13lFKJcKWdLGb^0uphA#>Iy<4*=8^Th9NQO)vQJ_Jae -{`B~Y!l3T6Z&_0uN~vhqT|3X5I650vhE=UQ7yI)AG*=4SUK&$AoT4M=`X@j70W7DeBsc(0#xv&hCS*~ -d8c31f{{+Qw<@d^Ph^xecDL0+-ZBHkV{R)`uPv;(cfj_A{!r&C`Vt&IKe;_V9q9UC#f`1rD3)mV`Vv~XbT$IT^l;eh4FFhFDE$4TJAg_5~ -zCijA^J9rBh_GV$0)&;wF7Ifi&>tiJBQoslYZ!iRWUw;0e)8IcSC7YXBo~)LFM6F9NSpYKO6b{g`vkw -^6ez7kSSYvAQG)qxv{NP-|d9PBo$dHgpnk@6=u!XFnG4@wrZeJA177ZEsyx=|ENc06f!zIHO4p2X-2b -;H#dT;m2%&a!e3v8OEf#)nVW}Q8^rNap7bN&64$UA?br0JYMBe2h%iHd;ApQL2`^np0!iBj1)Y}t{~F -3-h?8}JKZ0-BL|@lnJ6h@T7jJJ@b%N=5=683gQx7cv$zFbenud1?wV90I|<+5k1NHHe0JB@fMrys+oW -jPHvz3~MuiFPuRKpVgBexio&J6Ce6@3^RWiEiIDghcvZnIk!lff6PJ%h8BTn;oL6%Aq{q=wPx*p$W@D -#_QKu?sBQAOOs8HxdC%tg(2VcPAdJnnF@y{LGN`NhzYRdlGnUy)a+u-nzf97llJE~Ya|URzBmB4s;5_ --FKRc7YPT*EfuyS7V;-Ko}<~KAu#LL6BGN1In(0wtZ-5ZfbUO2PH(Zu#d|P}bnFe!E^ZxWf|Yf*jrdvBGm11&i0Pe%@ch_&>ms6p(`2t&NG_0Je%o$(%MG}bE?To`AsO7ka8nf^aHI%on^oHPHXUw@MQGHm@>#5qkpe-^u*k%>P -C`#p`a5xhUkO=>g+f_e>dyVqud|LpYI$i$zWUYk~43vSKezOMG@|G>|M{4GPYh#|iYw#$gRxddWocEx -k#UA+#fukEo}0h9GL2YC>2@bV4X<8b3tN> -e?JtEUfI?5HoAuf1i5#i^vJ+%wBRMD((yvE9RwpFntrbEbKoW+*>`#nTZJnU5U;i%0BhR=i{wj4X`he -2y)&?HmiwnB -Ri7{jI$~bhYOKb_vM+~Gz$6|6b;@|V^tr&YX&M9rM)~a0hzTsC6uq|fDTW(N;wW&h6xJ`sHgR1< -ozKMLJi%_N&eg>68C=Xa&Y+r=^+x#CC~?3hYu -J7(HgnVSw{o|}guRtJDWVf^BwpK -eHyY6%0wv+xP~)ow+LU)}Co2es8nyRb!WiBWU=y*{(vV?Vgyv4Tyl8On7i_abOa}AwfN7mP1C%)4XX! -xFccsDUmsm#yKOUF7MkYJAkLf6{#Yc$_k&23Fpk%%0)^B&Ic}qFDBx!(J3Qclrl;(cL}_KlCIjU&55V -IBO2h;TpL|#(}#<)cxt)Zip$(DtL$~6^R7;FCe7TU1~W)^|9Vm(ZD*aluoYaUn_kLi*ia0T11RFu -`?Q2vm|O50N2#H{bZO8x_PI$A=vx5Jn#d>>!y0EDxwdCuwsCr410T_h|iQQu)r&|0jqMydnW9}dd`p3 -ZRQc9rR@>V_V&z3wmNySNNWN~_8d6I#3twR(?+4uz~@CfYiLq0Z0;cHqIv>0WwRZU}wT?W@odZO@?E< -1`z2I_Ddq8LK}_;}2|?&^iS9Wsl+i1j`KbA%uODy_a$S#^0Pp$iAh5;Kv|g$GRG+5p*T?@VwsnlfzR0F~ -M%sqW+WsKVrA0*@jGN3o+3q81waL!eW8HgSRcQaW4vK|cXTX+J|`a{a*aXJ+*WTg;4T|G@c(rdvM{(8 -#Lxk|+)Fc4=0geh)!8E%9EdJvyWTzrubtQuqS|VYvj*+IY_c8)fghHr}Is&qJHYQoS+oN+vL$7$_?*u -usiq`z#kn2aqHni5vK6KR9BKfhcGajC|{>2^I7{Llzduo^B&s|0!m|jO>3pY?$$S|2@Tf=Wv|gU%Y7C -q?kYp2PVB-Eco{#^t=R^QwaMEE>o~!B=x;?mJxM(FP-HHm7wzhGyu7UD(kY!mNtPe^T8(iwD*wB;Xb| -Rvo)}=$sh%0!PU_kZ8M0^OfoPhnMoM#T*C*8%_1$-Sdx(Fw^kC( -w#J|t^O -Pr@lxm2y>IgTU^Kk#~$;4DnS?cK`@1v$qBk;msqUaqzp+KD1on^MOs{xX*q9tD2#t`m_^#LV_K005Vg -O4~G*|#k7G!XIVY95thSBm08aC`O-$&p16(onShZ^WP9I)-+bHzz778aw(cQ9%OCjC219M%-9}j>a87 -tJaHh_WFWyOvcBcnb{H$INCVy{b;ElLJ0MPNVrgXfZA%t49 -ds$l?0gCW5RK^%nWenRAaKz|HV0s=d8kLY$+kgob?4wMgr-Hm`ntL6)pkCj!wc1<@(7AaZLj_XUVRB5 -(jcP+x^5bkU&BgE|}9kRt(P6J_19-4Bn@u$lQqu&Y7W8Gpe5`%(4`~g$pIwF(dy;hFP%pf3k(j4EHAv -v&$PMGRmf(B2?G1QL;~HWF}gqB+CRi!?Nxw|{bk4wKTk=QbE|-(zS -YU8?{WiGBA`=7jaSOX$j8*ypya|$@J;RNK`TxaO~R1mim!q61QW1jB{$WKOl10W) -|3qGLLMmIWzuWHs(XDA0i`%q -csh(Vf-&PW2nht%!uG$9LCJt|76!^WaTG_Ke7gYavCuj@+YSeGnYT}BMrD`_%r7+z4sK7!Yc7=VuK@s1fg<1g>S*SHov4z?IwIUS9SS0)! -@q}e;VZivDStuZUL->;#(Ox_cY3kQs$e|hGd?=8Q>!5_AxzPmW0AXtOMwbL|M1p-l&QgHrf3PRB0yDK -wAQ5l`t5=vb_yHjMJiGO>p%MHd3@XQ)KM4E>^yUvi9d!&<(~R!_0O0f1J0Kd)j9~8Q%od3q0iW3t*qE -}&>JMPb67a@;;{|ox5IjH}XDKrJ41Y`IrK!5G#^D`lRBV~>$ob|a3xHmD7-r*NlDgabM&O$WYYnXKTx3V$&&kVklc<5b?tQk72>ADZCPFhr!C9c{jFSSxhVbp^Y^mew)d1a_Ig%Ylf!G&-^0(2yK3O?51Vie^N#Gi#87T+8%wFf{b@A;ZUj4+u -UYIMtJdrv3@C;g*em{0F^gu>~mb)gigYLKxV1Na+Y^0!wGx1OxQk6~Z10T4q}>;-*YU7Qk?J`|P#p2p --PR@b`d^8J+?@Wq1xa@p=0a;68&*2F_&4)x7)!_?+Pp;LOg;1K`a5C+b$jaOzgTaOzgbaOxKG^CQ3m2 -BW)EuI5LuGv(3w5$sHPcz)afzGOJq#A$$r6Pqi7FJaltL*_rC@tH83#)lh-&@fBrZG?vV++pzFXYvhA -J2$(bX=mxgOI(wos2Hdv=X!81e93gUz8}hu8#trybVuzTz^!Uh40_YoijG9yN5~fF1i7%eaWQiD?(%t!0PtR}h -PjL#)>; -ey4xmlzGzWok7P@B%OKV4DlYdzctKFawi?d10t!yAOfUUx2Tcl7KCIz&MXQuWW{v6^?jHxFM&6W>hf+h}p43TzN6=%OH;hsBZE9A{Z1K95xMJ!O6s~s}Xkg=|CcH=?N6sd`TI&JK(*q`fe}0|FY17%xtO6&$+)QkFEB$T83*j -pvYL^bn~YAY~cXdTI=$7q&=vi1&0!KPGsA1s72psTifHMBrvM>Rr@Dzlf -A(?U8I9v@#C=a}^2G+iMkdkmN5l9VyZ5Zm?C-K!jk3;WZR@mYY`iE3uML0qhv;q=bE{}JOc#kD?;Q?R -!bo)hzbj3Mey7NCMI~$NP| -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 -4Fxr*un)SYtD+s2WNZLTBy`~c^T8RSO*JB* -lVJ4K-x(r4Jpr>pqv-f4X1FLZWK3ktNP5_(LeRO?gb`Tq=c1-<^K -2S!qu0=d56lufoHC}oK{6Q(nf=zSM(=PUjsP|tl~1J(yQoo-BLQ4EP)hv@0EAPtBvK0VVYF{9Y784ZSvDh~MyD4PC^PE8{QmzfvQHBg6~bUdWqf7_CtJB=7CmNb=XGgtnn0P$lWD`1)^@O_3XBq*2nCzg -OScnGk}b2kH&%li|CiCkQYFuIjLBsv_`;lKeQ#izn2Kt#B-NFTD!otqRRpg3D_&S1J1F=RNs@-<;N-< -P0@%*_Z`w>jO6U?@AZLk43(&(9}}peqv+PB$ZvV`B$l8O~QJVn*;)ihvP(l_F#WU8NWcuEbS}F=O~Dg -ngn)f1>cDiZj_OCDbR?#O97^Em*T$#tS0`IV0@P%WVpCX5lam2Qs7cRE)T+yS)5y6 -yFVuc-=&}eO{f;U^BpX-DDG0A+9;J*BT%utWf2K@?nQ7$BZfCdio$@@hXRXhtxLwpYptRXO*xv5Lwti -KAaL^nDGm{H^8zWstmJi+x02VvqP?3y`-zNn1Tk`vkq$#Uw=&YvRg)j4_BW~~qnmvIdrnh^E>hk=83_ -X46_jw`BcVh)>W3!qT|yZ<6z&a@P|$cUqRa(}=Yk0-6HVc}VM5K|fjYVsk?Z@Z&Qn_$CYj%lj-?{E7_ -Fp~LJR@167>fXArtk1+=-{;A-Xa*J|Z~h#uL5BjfWbLdF4}rTUOABP$I9K+OYD -_0yCS`QR#Tifv}}^1eEZ7h$Y&s(O-_^!|Bmr#5w{&j)6cbc_CBPFwR!0+Jq5gvWfyi+Y%;hGf&PLws3 -*XhlCb@=(k_M1%@%UUS%Fk8MX7mZ;_o2JF&1fYQ*P?t~cFuzP_3CDYCtajr=6boDc-Yz&N=ABY`>++A -KEh=O-cpEgV>~rsv_1rcl9GKnw-q+Kb?GJc5c0%YYD+vM^%sl^;%T^u`RP&oK1~PS0pX45mAPD}qy+C -Nf7ATy9Wf!pO(1Fb*Ae*^8~3s$){Q4T=pk1^lpLYd=a0E;?jmo51ZHF`RCp2Lz>%TF79!Y#z!RB1N_; -S!7YHIb`^j0Q8BjF@rhUkGXKn1(ewb5qO&7Fsep~N2nO*J3c6`_yb$G7*@gQgkxm&n?D>ngsoA*so2; -qCbD5x0uIT;t<(x3vO!ihiq?rNNBju}DC-24eTCqLtTI+ZR1Tl+qfNy6uBb%7)*$J-I(WeyagV~W!=N -lX^?K)e(BFE+sU0G1@*A)MyaF7uROUgImSTSf*`eTLn252hD?@jvgv1O9%IQ-CW<84p7@1HtWiS^Y&3 -{NxQibZUI}d;kNKD{PPHDqG><6`oFXs$fc!2GT -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 -)yHQFGHoC~1bGo(`RlKb?%lh -$&*N2cTeYm*YSrk&>&LyzM?K}P_AVdyu6xO@w+ps$p~t59CMn}>@$iu<+7|rl{Y_c!zx(#vo12?&Zbs -i^`TARJx_w)DE<=UyJWY1_^F8V=I=+}Rh`)@GDH5px} -Fc!Jc4cm4Z*nhabZu-kY --wUIXmo9CHE>~ab7gWaaCz;0Yj@i?vf%gp3XXDSBj2%Jvle8lXxDxzByT1gk+8>QcY4; -)P4HDZ&d*x@gzZ6cAUPglM_oMPyh;rLRF!vFfWT`^y$-lU9U^_=~I+0S4CMz@mW=5>zaMyzYn7%y-cg -L$Pc4+p3aJdeah0Bm2pdqbUxZbW9{GysuSvJjA>$< -8-7B7uAb#cM+^e0xDRiH3CTc=sVO3{z0`e^#;EUuU={5mc#Y!K@@m1Ah0&5FFL3 -LknGeAOh7{%2rP5-`HvGUQYVgs#sE3#P{XU{XXWF7F&S)8Q#qOaI2iR)MvI*dx~x33Z*^8_d0FnZ5ca -apnFpJ!}U)9mK)lF{h=eXEz*%e-cbGR7+JiZrj=J}l$7zGA&JOQH&8NY`-%eh?l3hPKDc9`aF%=t -)M(+@K6h}a_03s^NXr5+llBE|cD$f4RW=PX@0VSxl(TFP6XVH;HxYGrzPvG|x{(G#vJD?gXsDRy|_Tc -^5p{IM!ryNGfV1eh+YN}wQ8NB>*pknPs87~k3FAEs1<1|Oy0V@~{MQ1QtZv%FGBX7QSpbmK5d69fd*s -K8BFUpqrjpyrphO0r0lpaRUctMtoktd2*_(5QwKILrl>C+ft9P$b{h{FikS|y%5OJ}uG4?lAt#aJ$rH -&mnf2_)Ipn*tACR%4?&e$sga{GL|TjE$Sxhn#g!Ux=}s=$%$SZHq^d9C`}~@MTtLdUdMx{Ug+G9%z-s -tYMF);iyt4yum)q9-j||lK2vCmpi`VOQW1dKQN$!nD`TsD>8xg3^&n;SQ2ps*vX<|9*tK;Ri$Uyw(0# -c&R~v~EIFVCku}_DCq2#68irD_Y|hsiUry~dc+`BGV)YaG%dz5+H_hs!7qC$?-@?G<2Rl40s|7Ep%&6 -pAEv#q~m2rxUFOQhqIHJut%VE%jo`{ttP+(foGFihuP$GsU7(&-X;7u%Lu^MoNl|_~zJFU+dO)X-Os? -_H(3KUruowanpCz2)82pI%2T#b7~Gw9_R^mPV1TE!9oQWopQc~c*Evp;6(*|d-65Tz@FkT|E2@ZM7gS -7mXTCPWu41yE@yQ1DT;O-&nsC+C2#WxU1SmTZ;5Bqg+v*>o{QU@=eyHMluXXXl8jOIE^;R~1VD87~lg -+dbHTwK;5l+>PGbvj_jMWAn7EYB782)HMVE6gd@Ca3si~g`A3cf^i_d>Rf@|baQsGiyY|9DHX>Z9K0< -rC*~8Mlp{rY)C$rt@%`z?JNlc|Ir0p6lfd}Kr(@1YW?3bcWYe#M1Dc`cJy4&M70M3`_#MF>(_%Z2?Dy -k=vi$i5Em|T9Is~}DZE(x!h;gw^7~fBeVACN38htb838P0O!A<_DBCzx -85Gf1pV7-7_&rI*yqd%fVWEt4omR`n02Mz6}MTAgKMiQ$NZhK9voIb*z-EV)a;IEU>yW7U8Uz3utTav -jk!Z$bMB6tMP&L{tPgBp*`hm-V*#hptas1b@B)JPT3=x_0W{p-Vj&$P{(C`5-(u#iG=-YQG1aU3wnxt -tH`r0PE0~tCEu^2C6J}U+eSaG)AFJkMfamomM&p^C6V$dFXS(ie3z@Z79_5gQkk2*9(1hf?e}kO0g -3)ao)&$Dh8qx7w>>4JQ0x9SOWE|YANhE{sGikwT_MBFLB4IPGIKu(K4K=!iQ8hAD$-TL$0fN9|P#GTo -KODsWBWVa>0CnX>4b`EUCGdeH+Om3jN9~r%WUwqC0~H=21Kew9?4F@%2_=S*W<0ZK7W+EI@k;cZKKR( -O^|ZoyH!U`z1B{cI(m3>UES^pYpRkfgaSnZ_%9GDPzaU^H)>2R_ksyaPTa(l2h?|c_AKfDb5mEGhge* -%!ixp#$qfxctw&-aK>mzJlab9Jxc*ou?-n8%?_=LUj2$|7+R4hh^fR@!NOJ{_a`=9aQ9}qhSU8_-!*2 -31IhCu8=r!`KU-`9Xx&=ehZIqxhF=|+Irujx!9uNVuowWpFoD{(-D%)=p!u>Sb -_7h_zBh=ObBdui)_0($87@F<0440{h1ILe# -i+acVw#=uOZWsgDAnfo(A<-}7o35yTysvQ&2Jap5j}Vl6sAf`x{i*09QLe-bNE@ -3!!B=ZcaiPU$bl+XxpK61I(~4s584u+oJxUMirr9hbDRLK@F;+$1c;$s}E{Y6<~H~QdC!)G%X~4?kia -aE{vyHQIR;o1?4s2IAo?Ya{CS%EhC6?xaA9JT2<-pA@i!_-CIe3BwsR<|%DV|(Rsv=91b!A&+tG&Q^?TT!w3^=ws#;rl7g7JQ -=qv3$ -PY8H>t+b)H$b))X||BA0vncP6Mi^IhaQSKgdZp2c@z2>sBQ)@X5oY&%#HE@jhXY$m-K5dO7D#F7uQnhrCV$TpZq!P32G_+y!7NLrN;jSv}j#M -hXR{_(**z`(uVR>n2049>zr{a(6gydh&|7eMGzZ#@F7wI$cP5 -tOF6N)r~N6#`~+8DFp#ApFb|^upOr^#SwqCb`3n-PY0-NC)J!a-j6F?Tw;9OWOrM5jTu^blTo(^yBBJ -4X}^V?^|$=Esk$T!ViQtC2h454gXOR)vT#U6w!Jc&}Jx>h~^5A&ZXSJZ4xM9xs71PQKV{RkjLcO!_&u -)Cl5a=VvKavA!AZAQ0~{qHT2f4&of}*6v1smM<6;8na~Wa%M4^F<-yG${GA?{rMXgE&B}CD% -dv@vALyZLe6m)(&6rsUpSkKJ>3j}+Tl%09CGtm4ts3?!y -m+$4v_wuCy1#k@|0S4CMKcJ4gRD)Ok(}`8GSCwpz#pwHc_->Xd<0J)y(V+^;3shJ9|F;_V|r-RT9W_!IZGGk)B^wgH~!mMwwVk5(>W9T)h10iV) -@U1(od^obs^T00=T*m<|_~M>Ow2*ES0a9#SFGlj$!!qR{S!`A@^u$0Drk>AKu{lGCM0CclB2k(MVrB^ -HRQeZ#LtGPjnd9MD+Z}as4k}sjXV-|M*J%q?Y=>Rw;BPC@)!@fhJBR#e-vd;46(nNlmh;R)-$Hr^i-J -qTfr_;z2%fVgi^DAp!nc>q`mnli7ylC>Q`E8X=>)Ck?l0wCc;?EQMX_j1v!$d3GLy{+)r83Cpq|LjU}fKl>n`8FjXfI@_K)KNSUPVyl?u9e*9?$vgPf6w`(EqD&Vlh&ObK1fqDB -R)&Hx#jSU2p1XkPZdO%AWrt<=av_d*)pDmQ5L=4ZC3peCmjAnf*s6eD-p~rH*rzbfpd)aq6X7mgUlG- -F-ifQCTLE)zC@;BlENS0wNT>E-yFC~vxzXBkmDOGF3{&;pNOwrX0082#Xv|m^Rh?}kcnAwB1#UKt#xK -$4A7@p;z0y)T7f`@SO8~LdX=|TAPdv-1FJ~Leaf=TdUxLOuH^6D7aQxmE44&pW=t531*A3Sg%B(B3m!>ALxN=lTaEo-?x2sb)_A(>#cNt< -RxCnUuFyFYKHnX_a4ReJd8C*qga~z{BX!>W4HpfUNE_If6)uD&8L;>zNx+>hsMP4;?SCW;4rPIXF+zn -f&2)f){eRyz3zZ=H+p)`W*3AR5UG+>*v-%~Tb&o{Ea5)q=VT`o%gqr1!C}qJqkS=W$sWgYT^%aKbtvf -LP|Tv^^wEtCyQP|Agr9S2o=?B)@}Y6KY=M50=4<9?qaBUp9(Hw=AXI+^S>sfK`Dn9fN4x@_G~>X+8=NC0q*v)rA7iv|aGEoOfiUS%Q7(*sH;BMs7h1@)NM+Y|rFuLMMxDLyo8}xz6{ -rsKnbK{3EEcTf{G-Ik(xei>db~Yx_zhbwi{T-SNS#qMIDVpK -D~;-7Qa%nNkidAT8GJd6=wWxPSrZUHZ4LU;+^tMAj%QOMdrJgq{|Ck>Y4KnxSRe~Ibd0!#u73J7C6%v -27l`pl3~@y6RuOsw5|rrs=z+(Cj#4TVL3ecPy({F2x{=QdIsyuTpQ@^bqUXXT|LkjhRmPRidu$6tSfB_R+P?*UZqzFMC*v|=&4D0Qc$FzUV2xWJO0|q$U;IVWCABPaj^+h|j?ap9{WxQbc($GJKzo;&!@oD6cXsaD7{n -;lF1v%!6eO!+go_g7lzKeT8%Q`Z2P;%sl3$hJQY(hkF(XCY%%JpSZg_ArQ&zjm%&GdAbK1tEKit1xrP -(qr)9n8Jq)sS`6p1>zd{91o7(M*!U;q5z;e&_w@B4h%N0a;atF8|d!@ZerR-|TgC-|S~}-vo{hDpj+1#bAeCE~mIpuco1dfs(?l`M-thrq;H`f(itQsB!bE}4K<)M$U=GRmK(4<0`T5#_HB{` -BDCp`PPdLDP_Z`F~u -a5DSF{!}88fA-?=m%}h^~wkr1^xT0?8BDROSQt3mJOb`5d7*uP5GxLZTOH)p@G|1$7!c1AO9z$<7n`w -Hs#N>YW(Qb!5yMOuc;eB{WnV23<)ZR_ub)R8E&l6~-62uSrD~xxKgOY=kYN*k1&Xwx?~#eV$0DC#jDY^SWr{4yTNWPnXX?SW%>;Y%Mq29>3MH!A9Lsy5%lsZtN-G-bKE$yl3TNMYQ^8>urr^AH3%*@;gmn&@Ip -8qeuB83+wCU^lWuHktOxMnKk^LsVRD>_;yzGUlhu{oy7-NKqi+mdeM=rnoc(+ -m?-2jypq}{rT$0l*hF+?!rd(0h`1ZcabmbZTt$CBc`^A5cim3$&b#w?c7fO765q?V(T2%TTI(8|7AEq -^_zchqJS+M;zh7A7Ry?F*9?W8Zp)gv!yADHS<-sHe{QgFMsa;$jMlf)wjD6<4jWL)41L-rm0mj=aN)A -bh4p}0c9AJdUAD+H^IjPnwhEp4Dit?hGIziB_LPzSo##4#CCtJ+npplA9;yvXpjz{ZyKKYCL1V`R2W< -a-aFvc#p0bm=mCLTsy3+paAg!&1rho6$zHiUuevA4o%=!j}n8*z$sodGu#gurk3NrCP*=M498e9{Cc5 -ruLQ5EDEnX@%ZGi5>GDIs_3*>lp(d!5;ayJ8sa>50$sn{xj!|R%#7*ysfg+@1&o~I9wNIf^@Q-WSUl( ->~iN?C+*N_L&A)hKNpGt -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 -r8@P*(O6#Va%?y}&?texS^V=xKOAHn{kdJP64^ -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 -8CqyhOekhaceShD- -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 -o8nEAzMhlK!vMJ6R!Lc&RIITbj}BrRh|8 -QY4YB|tKJy+XFJvf%mO>U%fIF|ax`P82i$G04^?3*(o^%LS4pVN?mL%E7psfS`R7zak3Fiew73nzsZC -NNWG<03Fq3ua1SrkV9QqbV}$b4F8SdQH=;7#nI=!cInrWp)o{gjnVo%NZe-S;R6zEb|Sj86lQg#4>6`na44 -_^HW-ZEu)RVbZPXaR((@_(NxSX)m&hLau_?a^PVVX;eLV#+|8;T*KnI1#znJlJaD=G7fpJnq7WqRAn3`L$EihSJ&btBdd<7!lpR%zmjDbm>2c4Dp -0v_EO08=1C~Qh;e?>|npkk3`$aQZ1b27|IPAWi~b{4ML^kDp4_dCDTdbm9%iBsV<}zIF)CXvhot*=%d -oB<|GqXnSf-1!f-;83H6#*3SMetv|d$M7-0Zj#a2Bb^(-(PT+s3(*9Nmv`;!CbD!0Np37cBWt0*C>!n -YifDKZmRNiwC?s>pI>Emx#fjc&}n`B>A+mfC~zBQrzefi|ZaTYl)G%cti8-(~vb_uZ5@l|K1>+84ez* -Z!nAR;P&NQJ@|$P8O|LzuoZr+eJgq98xHtWoA`6X0|V%HT0}=nq$sLzggea3-#=xo?3V#ABDCaU3_}L -@a#DN?3E3FuF -NdqK|c!<+@SohK7aFxy*7?C@^}!VDwgi;~fzWPz;$$>%Jvw -IlhQ1zW`*Rf?gx#Y78#J<E+<#>#H3bEuIBa@&&k!?W=l@4<`&hwAj^e$z$jd*sI1Qg`CM3d3-YHV1^m0hn`y_`>g_t==nD?=OrtNQ<_3FC7Cp`9Fj?`Ohz)9wUf~)n^~EhWO8dKCp)>7DM+TUc -1rqwsSIrv(ANuPVK`Ko$dB=U6OV&fwdPh+uw>)f&kI*KJZJn0Y8;Bj`cWohG&b@`U!^F$u`)j0rM^D8 -E%`XQ+ifi{}`MGKhG -w!QSxiPdMozDuPzT1&JH+N*V2eganU)AH1y4|k>Py1{$kM&Q^n|K7YM1*v-EPB%f%q>&U-0)Kb<+PyjN<}-j^q{7Y4a*{jh4k#n#Y9#`sn|-YezlW?a=R5M~!UD -{wcOA*FM4r)u)qj@Y6bB^SN3S`W@w>y@}TSjx@&bAEp>mvVY}D;~dH|9Lf#t(}ly==|+w{czt;XV -Gjg(}SWP$YFVDQ|ne*n2;~maL^C=1CJvBae<_B^+V12uJ5C;sou=+ijym6*f0{o!J?-lu6kyncRQIQ`N`FV1*4xqour4qSTFVn8?CR==|G2vP@$Blcj^w{YHM*gK6dsMq280s^bSR;D_i$81a)3v<7Vz<#R=$?zb_ -7S_TTC7D6qCg{No-j|0~QRl`Auc8GQ|2Zf~|QF=iWqSHj6j5-{&r4GbIgN}e1iar38LB~}m^wl(B2-9 -JhfYL~W5t=k)=pe2T7=^V^v;n{ILE%z}i9=DNBhcx5)rsaxIPx(P`D!EzX#{vi5hjizbZV?lR5MVpU^ -!|7MFsdmKnSx$6cGc6%vDm%Czh{ZX90v6fMsDw9fbvp06&Y=LbBLJCxKW3Gf7J<6*6N;D8>{Pj4L--? -SUc|R>Mk7GuN28R`4^zhhfPWEg8d-v4%WrG14Z~fo6*-1^FjnxkJ`**8}yb6M)v#Q99g%o7_`w^0{)8 -`%v*A>&Kw*k^>*^D=&FK7J~?sQHO)VOO7PrNK77L3vvL*W5mY+90zbbX+Yr+0OJ6R12A4ghLGYwiUS- -DR5+o+u}`?5Z~y`CutYUhx<>4^+Y(DnRa5LWVy_WOu0!aA33Z -?oVlp}fYG6=P^3(}t0|s?c6H5VBGYl|n#F{0bu*ERUNgeyF<{@=rP_n`yR>MmIu10dz4VJBL;6;Ow3B -MXyRZ~{g0v*Dy0e%heYjEf^o^r1NVh!@7A&?s6MiYdf7$#Vn5K?r0G}y)s0nz}Fh5%^*NCQ9`AkhGc2 -I(A(FmFlxzSK;Ew)FC*jmKaBDNN>wG>s0s9IY37QwX$uBG7G -Fak}eqvmQUxE8^+6r2E#Vy?yooo)iBo50l~=sXqJ7b5XNLt;gs43reHV?=`a1%oisL~y9{02F#0ehEM -*IP^Fs!~rd8vVo&h08Y`wpfrHfRJ3re^J37kqei+pb&v*~AAu&I~AsdrLh8Y=+tIaGaqYk|14Rs(^yXe%IM%{gq!taKn6HpPPA -`nGKQFQPLcc9k-FTo%t0IQ%8fsxLGYglzj1$8hI&`5xhfJT5;2V}aCgEpWFo-QV#7((jule7gz$X(-s -VgR*?{D5p5pwnWcZK#70L1G;=JB)XVHAhy=-IhAS1ywt8?#)Bcm^uu!p-v0hp`+ZCm7hY>cU3A$8i6K -YsT#$1eWDRq0Xi&1N9C}jHFX-$4jm4$t_B4Qsp`x5WhcOzu#PL6yjGny<_dvM{$0P6m9;IG@x9*jHS> -PG{EsV>b^RM({l8bi82*RUzn@st0^}&54o<_5)v+yniUbw4m~5|hZ9vD`mC98B@tbSYoeGmoA~I89{< -fm>NSzo%R@aHYxI%i>P3rp -RYz)s$>k4MkJ6P#w~+r*e)d1<*}uDI?CR|5<#hJy^!)Y3n?L@`?>>L=r{CXvMz8IfCGUIZ&#P|Ti=kR -92eFy1>vy6t-x1Syf_Gvy9Gh}8`R?+n#oNH}H2iroep9Hv7QMMytQNz~&9oQG?o=C6zV~m`>#-x>aJH -NEy{v^+{TJ(oqa=ER*LTl}ro*uLs((`Mek0yX-;4D_y%YuSZ}at?3g+V)QZ^k%>2lRRDL)2Qtv7d-5U -u^9^^JO)_Vfhb$TeMxe|uOD0;@_BNZ9T7vl6)TLrmlf95SC!B6PMjh_g4zlPF2eC&!MP*n@4$z~0E73 -s1s`gnMG_co_T0S|9dDj{A`F=2oHnra9|kcdwR#&*w7-{%$m`k8Ym=weP`$ZRdguMX -H$(qnG2Bikk4olZviAyF|0kz&)tF9<553dym3kLji?@rFqf9ukFge}-e^0ybkjL-wm9twfWTdmxqsb# -(-AiH+p8~dw`pbJ;L3rR|A*IynQF*S`E@le= -9zkLWoHUsFOv0m{&*27xf~_(XXPm&{2X1Xqc`1JRnb=0J{O>EvCX^qh1+L;aanPP%oF|jhIhnvyTGwt -#};v!TIi$Oz8Y$m>k6e(@I2~Ej(U0f06mUapZk|rjp#gCjS)3aBv+*OLhN3@8rmjo!`CaH-d*{#Cf+^ -wS2jp?%6w6?OJrS8h!)dul%&Tny? -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 -2HbrK+PAaM}ooSAcrzBu3O|l -m}Pb;I~?>qJIwq0K^$JS8*q;?tmoyRlo%yu<(gcm2Qv9NkIHt_llXx*|_c-#1$ORr|zZ+OT~=`c5f^< -(;l5$@YZ$cg#X6y+OTa%B5lqNO*(_m!olZXfJG3FOK;8<-UfHR9jCqe#ur%?B`Aoy -9$VXh6TWXP|41IrquyL2y7JUp&tkt1if!?<1?FJFreX7AMI|f#s1HIfp0sW5CoIAwM}oi9OAp|N)rgE -i)c(i<8;vAI`eezGmjl%;|HC@Z~{3(`^kQ1ir@B#&YKD&Bd^bH*AK^b^mP#BEIHhK -@-GSoVxc|5-SBS`XpjvQ2r)xJo|e_ax=7(1)hl@aZEq#K)>gBR^N*ijKyXpsNQ?;*%Ci`g}rciY=gjx -fTAlDYIZT7OxVzDMufAeE|!Wr>Es0(1*xk~tx4_l~p6A8JqOWj{nA_ENWNeQSe=P@}Kqz7q>ysdF93b -F@n3fWdaRth#PD?B~_8{9J6XS*CQ(-!oGxnna8A8tW}p7dxGxZ#<}oW$g~p-D%n;6|T@&PG<1PKG

+d`s#M{_rL#rUmh&M|5gjEEyMEfH<$$3!S!R!NS;oCdv20DSvq}7^$;UhLS6CkZ_5U -SZ0zss1>f2pUjpYMD&h~>I_nxiz#;}Lup1kwxW|1V%}?O;>L3aEq|GM;%BCotU>%FCD{yiyzd%U8nbdD7@3C?^jb8tG5>L6$oFv1D%3X~TDD -y603GECwX-Qah&xnfcUye#he6Kx&8FO!-O**~fA%Ic(Y%WrQa2aQKQ}@@bjAE4-lL+;3J+V#pJA^*q4 -1QCG@H)M)IyQ1#IhtmPmuSXoRJyGXxiQMh&ZAr;GStI3t^tEh*7(OpNQatjXm#ZVq;qw@kZWN-xZXXi}b -|;G2j$W}@=Au8H(4cq4!uzjikFg&N$Bc9~G`*H>Iaq5^WVAJVOpjFhOc5SKLM{mUB5bdeWyZ#;G1r7% -a1LQ8|M?xCfq_`gZ;V35uJWf*!C@MRQy^VZ0KgQhHsZ+D5De%PGEBJc_@?DWG7JD{l<1wcE#iKy -cJWnG!VA>J^q#fEfyI2xi|C6X~HLKB&8O3p9?sbh@DLjZ}3Q^746)f=9WjedpsI~dQULmz0x#n>%B?c*Od^3pID7ZTr$13)m -43;*?jvz@`63{I(xApfz@nnNlZ6JFFHin>$p1($=nVy!%pm8GuVdiBm1`IFRP*oC+@HqxD{%BH?fjp -8Vec?wMIIDOJ8qblwB3%5@DQ4!>r3TcQf(@|W}C7lPJg#J)p{Io5p~WbP%|uz1Us?W?dTJ*@%)_i!e_viEzdELh2+myj}^d%=`XR@U2_miXZf -W_t{7C5^#E&n2lZG0rNt==N$y_^PFIZUN{G4$SzwFVEX_JV%)CU8yN9MLjd<&Vgy#2=|cdQ%1dgpIzX -&Batjph}4nJaq&+D+IlcsU1#Z)nSLZSfgWC`?qx3TQzRQfyWwwn>!=Go&Q9yOE-15_?UVHu2s40&nj- -)j?*MB08Wyruru@%k@8KQar*|2zBbNog27yTqQY@6aWAK2mly|Wk|%_@PQ%|R7lO`v2+nJRdEkr^RYQ92{vefZ@_q`8*1SOGFc6AaFAc1>Z@&dI{S|#zwD`Mp*ft-gbmzfCl*_r8+$+IO=+eYC;i!J^yausSzQ)*wN5(#jL -TWhtQM9D^$&5A4x)ncBCOiNE_tW)`n+fVZ3PR8mFnb{71zj^=e#@;lI{3O=7i1U&v^}5-m62^N5Pjea -P^Bn5)Y_;_+Verr=N>wNaS-;;u^V&b3yBa+5-izE{d%`o!JY?p*6loeNU*sUlS5IH!y;ohN2CqN9bVv -MZIu_$U-i-h2+4w&ux93mm)#1q_i+7&C7Mbv29X%~!(c{3AF)Xf%SKWiUfPXKL0Cc^CvNH@A1wMrT3! -&v-z8el-cMi+*9`^gRGB|(!_4KU`l8Q -7J>AH7WD8h*gft{9bKUJV+M5OFti85Vc;f=V^XUO5`O=?;qId99DG=m+N1Dq=kh0Dh^dFJ)Q4Du%tZC -)B;RePk_c55fi>I(_Abl5$m@&6BBQIHCGjqzVi15BH5D@{+9wE2a^;7TT5A<>p$Jr -hg#~@768kRc?a?Jx76&<^!*)u|2uvEg}#Z1qOXYNsN%H9xu82p-^txd(wOfSB;8OfSiYfz2 -YicY)1V`f(nZDvUukl!9HJrwy<}C01xY=Y+niUIZzn}=2Arh1(G@DIPL-sVDa$&|l9jcWFZe|zEh1{9 -!KlshXs|xNYejV=LK+?D0?VON3Y`j{*A7Zd60H4Bno<(4x`-EKkeX*oE`bV*B-l}b80H`+Hhd_nh?}5 -Bbx_aO)Dks}3N+H31We0T(7ZN+?r*?VB>h|VP!Tw_D6D&@NR)!Z$Gq-YmQe3#2?31?s(DcTh?GG4nM! -k7l!(bC{JmjWMkzQv8E|n8Xd;Q)Xu_(y6f=?w74GRui^Qcb89yS|%q3iaX4>%BtW9LEvYD%_>Sc6}$a#xY|671@uO2$W=ZiFa7_vOA+D;P^2ru-0h}=xJ=I -A14ZW#WOCiNw{0FMq|;kK&~QmnP<&zqE9ga%{^iFvY~0}dj(+68ZR4eZj9Udib9tw?;wH-Ft7@gZ~$9 -WrLjS1_Kw!z!n>ePzcOJ6rYlom8bzKU5)Y+OHK;EWzhKm{RUH8YXfK3+hfbTF16BGjyp@%mKz`jzY|Ra?%do^{saQ!3z -}eP~y+cvja0RYK6k$ie@(9!kihLzL(>Pvcm5J5Ljy~AMh7D|;aC^qZpp!%8unZhyj|lOLN4ml#&UOYu -tpE=jbVfL>TSjYX^=}OkwKO591Prj&@SLuhT-qzx3b9+8VAa6`a1@bZ@I){#GGJS2gU!GlSg|-*Zkd- -#-NC~S$%5_>(2NZXVZzQ1uRd6OZY!rO0JhVBXH2Jib1|zKiLJSyp;?##4%xW;b<)itQVc5)Y^1C%HYm -l36?>fMwFu13`%DYZXAp`q=`2AlYZgHnG6%rJqPfU5&L_LLrIB-0R -{$19PYRr@+Flb9~;Tpn(CeiG!2b4Wb#X)GPbi!5<1UNj~y2XcuLzVIhZc$MaWKG`w8nI<85XF!Z$aKq -)G(MdSEo9g9iwgqpk&Xx`5qdw&P-&+HC+hJq4(1%jImYMdj*oM)_L#cd=2pu+x -##CaR8^@J0NZ|JTnTIfGh@8vVziXa3bhbtFW~wHvuIhVrMxQ(<%Zo9+epV&9$ -KX$6FJKO_RtbwG_7x?&bF|HQQloxf6g_%#(>g7pPO0r29sdzpuz<`ba!J1wt-o$akcJnqku4Dw`brPa -Zqz9r5)7!Q0g1DJn6il(%1JcuRg6f&?Z0j+ -`BWujCFO3ujQL47ul4-)aSaoro!`LxRs=MBzC4JFf(!7^6lGStirX(M2WXrAe%Irmdi4|u#*5Jn5K%9 -$0lT7_F7Qtq`t*Y<^{rQdok%0t|A=0&?@O#%x8i3_T#5gn%s9dL|KZn{40Dks>20!wKecXl&ZJS61PL -C2Ja{ce+jJR%O(N6L=>nqTGLQn>C6ru5-bYZ)&a)u3BTZ*^us1!)h=qSsQN*kG>EXIKPRI8_}n%1HQx -X?t)@pCR$$%=O+6i$ugo9H6qk=aJR(J46FPx!8aoHFCOFdE;wI -?cV(xG%PY{?zICrh#0x?ni<1Z#%!U5iU7aXwy@zsl8)QA!raDLB+ka>YlyI`wX-VwPn<<)CY>c!V)ss -t0|5{=%fxQ)p4Fl9CN8tz0tel8zb7hox<>e}H&k$OZkF@wpjXC8y+a|s1A8n4r!Fi6=Iqp1#QvInd7d -~W4k -{Q4G}GQXk$+1Q-+o&`4*<@EQE77{^Rpyui7Uqd4ELzRnG&_wZHNnE8i@niM?7HA&4u;HSS}&jQTzkd7 -VX;6#CJ6DKawPR69*pw`PoD!0F^nc!CdKiktsq=c7kSSXA@mjF49dcR2$|xHZJo@jd}GdBUEJ*s!h42 -x+ilhq&>_>QxG8%nnP2X#v%F{rxn)ni%gr0QX4d>h6~NikernE(a5(K7f;BsQ2f((mD8xr52rN`6NrT -KwVj*@^B-+yzVU@aE7Sd#5e+XMDly5QBIAy%DB9^Cz7ue=FNZmM^lWyua$4?o^2TW&Ps;mR&#TNeOY9 -F76->U;)Q$k<^5cy4n3L4wz1%j|Ly@xeR=2*6G-mq_2vb();I0!}%f#~ujH)i>vIZ)vUa&gw9X5X(QN -9-s6H#L2lQ=bl_OF8DCvb8$^%B)<>}+!>U{wte#4Sw*GZjVSo3c6sYB?55n-`?&LV|^G#?ZbvqCyq^G -UcyZA&Scb(4S!Q$HKTeW5D&ei0}+qbt5feie8;B+AI2!2A5k%WD{+KCu}BxYJv2VtXz7!g}JyB7v92v -g$k63>IC8|CYwb0($Ni@Fgt1{V2$4Tz@&(%0S0glu?#c+`d?DY%dmn1tpn4@9 -WMoDh(K;uJZ(;2zPLj~&;uh*i%?yN8rD>EuJZA7eH}W>Wh$Yi+Gk12s-DtI)h;&n0uDceI^c2tR8lyK$uR64blT2>X9Zd%nAQEI*CQwXW51l*52T`VX=2V5e -t^8&fV(}y{Psmuc(;+cJr#-oXFS4*!vrORVRMV5hk^5ob7#q)zhLFcstD>YiRyy@}74d+MRKb-F+U28 -NCFjyl#JLu*(?*_MC>vCYijpkkJ=GwXqvfC%LC$@6 -Ee+AAY;~VSe@Q>iyNvH`gOPpK5gmB%D&uq{ylFBj=>*K7}_oH=lm`{+FAp>xp-bILlCRdVsg|=(u=5Y -&<~+e*v>V@WDgQBV?LNUo92fSnLc1%i-o%^dX4~KXg43;et387@;7`mdnA=d->En>JQ7#-sLOr-@^PwV<&uQ`!%u@9&YF^d%uf~;Ip}4u&s!uii -pbzw^MsN)OPc_s#QX&t5(i`@?uCni^6w@Gli#I^I9fGF*=MsQ>Wdtn{UiP^ptBO7I|v$D2IuK?L>J9$ -;SXKw9nvYPpmcaKl~M-FbY;m1z%az1y;hTDq-Z!SJxcp!&_h1k76xhUN@+Ghu2xt?u8RHM4NYPkYz6Q -@;_b-tEYx)VqoUzS|O5YVD&m-%*dfv0C=i9_FZfw>Sb6_hjE|UmS4CWDX&(-kR5ozDLfy>PPxzsAW4j -Je6}QMH$vbcv+Kq?=2_@jK6nV=a@o3b4ctD$P9)Eot0`?ACse%wUJ%8Yum%<-9xETi#iwdDCnC5aASk -%09Rn-ZA3UEt0=3`yK9-J%;$D`aWQ^=+tM0_gme#+y1X94b2-gXR#N(W}scB-BsHUqW;5kmBCIg#)yM%@ZbBUVCpE_>*kkgAMbZTqRcL&uU9+g=Q^L^bI+TB4zM!VT9w7Ud{ab@=z?5)C -?eli=t*YxuvF!|}{;qCeB+3<9$hkcg!HLZ_(iT&U?I37KZ=D{sIu8qlgUr>sM>;&g7MFz^%|6ERc^5k -o#;Cy%zF1Oo#*n*#G?Q2cR4yY#WY -v(5hw=l2aZ)sIh8Y%+9YKQ5G({J_H*dEPn~JNh)xevIbyBti%NEb>M)6W+#Zl4TZK>6VtqTNNgyp3%MCs6n9)-uy1=(A)dKl!B&335a -qlULI7=dT4L*CQ5!J{dtxEL>Q&mXeY0?aBnfBbqh3!cFDYr4#auODW?zn+c0{h!(7wJ8n!=t082?SqO -RqUa&@AJY6G-99{i7(LAJ=kTbnW?T((!_Oj<;_eXLAKhx>=l`b%P1;w_UjE;;Z{HJwC*p`l1R8!;KdA -l1h|!VX+#C6!Go8;BJeki+M+)+bM&;j0xWui_h*OU5WiBpnvI76cg_h{c1DW%UL(!6Ce4*tPCr0uX-6b&<~=BG{?|A@xDxH$5MPF8?lMAHHREz*hYo_mC#vYdRE~DR -4|mx|t4NR=S%sBOOcJqI92kOW0iqFymMoko^`1K>P<=imSYMu9&i*Vm&ci~@RnO`Pe>4?<$zFyD!lu7RH2!&L!4IM7g~_jMW?J;c#0*Redcw+zQ7?2thnD_sGRtv(q#@Ec5`XysfKYAp&fq#Ll@SmRiuK(!KBg+MeaB{qp&L1@B`8U6TVERI0hGCG4iNl -B}8G?x6vl&q0kHk2gKOAq&NemzHDt{x4x}%{L1pze0>GJOh`N4N>pfRDMCVVnOg0w|ZcTR375}O6SMH -!=ZmLl*hq#05saBf7Qu7xByTq!dy+OGY&jj1vc&{;Bi0$K}(t1Pz1o{@^T)1ALb~+I0E!9EJRpQhM8q8uk`PTMkpojkb0L_eO0SM6VNqn -bx8h$0|9R!nlP;iwN;I{cU)HvCaYElpqS7d(?%>sQ|5fZ{=2?E6BR)?Q^x~3X`f;EE>&9SDPk-9jz&J -D=z-aj0@w(~{%M5Zn~W!l+qyK~pnY@CZCo7@1N9k76p0RJ{;YT0|4`P0l%HkI=ZYagmySYJNzq?MQ~E -lZ-q7F--Pb&ZU5EWZ-)Gg9YwalVcx(|fo)PK*Ujy>XXXoeVr^F99n=R>U$qir#hyh(vDj%C#&JDR}{zPIXkvb7XGG4vvbG${?)dolu|{_A_17BN -f%N!qXWA-{b>fbze08p^@=a-#^V3tEQk|ck>8oT+8m5PTK*UDF-X-tv^CPT!ets7JdyfA;=3mqjAU>i -3ula=}^@aTA?@ej_UDo`Er1cN^%|Dyc`lqbl^3;E4yQ(C98=9#2*CcimvO6xq)rejG=Alg+P((qXtx@z~R3B>X8Ey7&VetoFJC&{m=56lpQ`R -8#~%>&TG;DwQ2Uc4QALEg;63B;~9k>lFzP-Nu5U-%wO#P0pzmTAagB;fFPmpp&l13Zfwi{0m6q<2T2K7}~7-zT5RUtY*xJ{6GB&jdfGA^_)O`c{p=$xj&Z+&c`D -B@rNE2mwEM3K8#<-}!V8Lcz?;48v=Y=HP?F!XoLB@(Lp-^2rGX{7<&wlCxSlK#}@UIAC<@Sib9fMozQ -TST%x3JH&uCof?QaD$1fT^~y}T;@}xWzBtW==|@b#I5$y9PxvfXvGxPjEUgFDBdd}@X`n@$MDg@NIp8YQ!iVmN-KiYpDDFORR#Gv>0&IM>S;>A}1J1oNG7gzfeVqJb(sg( -Y$}ft=y<3-z~?lMMMhCTawvmQKgaW6exQfwFO6#NP$txr+(of!zmsPBc9=AXy8xzd -{~C-Qn`zqF9cX=hX;=ZYmN8F)pv%*H;9HYEuw{s%C>Wy$hOTy_;@2i!;urPILBXz39%b|mYDB*GA-_t -U$y3ndVz{iNJ==kj<5oX9*2#oUF*8YK3}ae9 -$Vo$(|T8B)*0M1kn}keta?t}HQ3qp;8qpkz#G?D{vROCSPq%p1@YL$3Z9S(ks1qa+hHN+N;lus@w)BL -c+*oSTG2H^4K@*5IPhgyv|)fQ}Z6EKl^OSn>H@tkvB94O^<%Hov?j(+Cq|jcFX0#PsrC)|8hUq{p(Rb_GL^#B8an;iNwL2fo; -|s$6A5fipA|o^DD~#OJQzsE3N#_Ux`2Br#(9O7bP2`;d>4%^2pgb@xI@J$Op##;i?RD}v!#t1BFxk;t -J*-$$wy^nQ4HsUvgjAbKqBsZ=_TwePC_;7fAKDmc!7e&Qy>V7&_{_FNTtbh7<|3nSg=#WmJHy;R{9jnss+|01obP8B-6#RtOF}+l9ag$AEM~5hGCCW5m*RNJf>Vx@6HEJ-A>t%z7+bJLmD -jAujLpe`Hc=g!99AJsz55P+VC?=k1oQpoj5>gtGlVJmj%$x%`lHmdf8AZ -d&j#oUB^x{_}VmR&3-8Eu4zAF9^_YuIgbF>3%dAPMlA=bL2!;z=h7(bMB6bV1 -Q^LOPX)3!+ATebQ5IUuOMf7bMoCMg8^nJ2ZN_DR`9{l6{aXvJ`S|vU5_Pv=>h!69C@tw{g#Yw8R_w!D -N>0ohbNQMP%I0FdGytUeDyrS!bSsYV{o73iGG%Qq+fbJTNzt!iu|JYKSEf30m0~7XS~P>v<`5cW08)9 -ZvxUgmd*)uPM~uFwVgmYNUrD)6riv023OZ(sAiR@exmeMN~fmeRs+{hD#3MX2Dj1dlv*x^>7a*I$-v -L6r>d^c=*8l+Vs2@;VpR<&>n8@dn}Vm~Yp9G^33$TWPnW7LYgJWq;!lJ@Hmvr{y7l~fm)c`$OA;R{7z -uiSOC5`(@wBi>@ZGz2;a!Ztf^Vrfk9w*z#=gQqjm{@vBC-H`>M{4(1|Q9hsgrub9!6EH$n+xz#FBN -O5t>4Cc?H(TE>zWN5ZFYLfdRq|nV-ThAr57QWSAme37xok3h)3_3+!ED0Tuu0s-K4t^7&D0Nsckiee> -j+#|b!(uecQdAK8C3}4|5}h#Q@2$8;@ls^k-Bknn`gt7P&^9mwXz1@hHy#{^8oKVM4}wDrLOeYe7tX; -}#@`mPv{|qOcq=pHxjt?fhD#RDcO)bcz1z!}MA-pRO9Z@_fUO1I5FzEu5RXNlJCYu -RNY6J0t?M}N9oTMErk54K$A*|>gKdH_^D&6D?0htp@9LffR4a+43#<0RC3ay|7g -nvxp)Rc2NLaNj9Ooi})dH(Q`vJ~i$@u2fWRqInbPJqL`t~t!+s4uCD7Wp8i_43gNt3rnVv^lUB=!5z^ -d*vdZf&_&Mh5%z-blG3e>7&r9`V7nx -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 -QTCY;Xh9;h=dE%~j=eOuXk|Gt1S`fSw -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 -`V3&aIV#*sUa6=GwsbRbD;>yznDPF)-e^50HAI -Lb*12t`gGYDQ)<-H&!ysMH2HBrC~9S8ax`FRr!66Sd}L{WJ>(ef|3NEqjs-lBlAoXnZ3?HEYOFt~YiU -4O=qMK5oH6ACVOABQUP4`$cc%DREQ{ci3|gLjzFSNxvf&O6($zz}J^{gwJyr{L+A#{F%v(jZAuI8ki! -}`NjskU>;+4h1`>3T%=1^ -4i`u-CD_YigttRM~eg(AlkO8sEmML=T!`G{U&5FS8T!jmRlBJ4s>v_J$x<@jc)ib6dBj264Sn_^4X3; -gOkYc>e}b&g6L=OkqbaY?2F)`(a*cA_U!#e-JcO(cTqPnV9Okgr1>ysclPgyf24^)6)Rg0BN|DJoyU* -A@7-GZ*1GME`hn4^4@qQ3-ak7=JZ7BOLd6J>sBRm8TV!v1D4$MiFK$0QVSe#y(5Qg3@LffH7!+-DEgi -+bN)fSKE{B?KSef?Pg-D51|xj0&a&<>Sjoh1s5r1bh}hAA`bdfa`DluxknSp;MNdd29vZw1!N$&mJwF -Ip6$fgGUPxwc^fT~s($#EpkfJOD{;j{LIi*JZWx-Oh$9$EIn_Z4QYvXqH>h~hQ=s=QQQpT8`-#=bsnB -n|jMn(L!3Zk+%hmO_uCPz5N;jzWlCP{+JP1MU?Vi7-H -g$zewCfQv7o1OWmq-0^*m8CFLfVPsUaQjA -Ag0ow1Wm_^`2~0p?Y{i3ioWZKv4~3+Nq-(G=hp%A!30d>|jSUq~jgojip2(L_ao!7%q}HLnIN1WUmML -Gq4hPFtQ=@Dl!qaK~4eCQ79fM3uF72;Tddmibok2LQ7+y4%9Z!3RrzPR*s=37lq1x{IgXS2(Y*LpmTx -UZ(gVe{MFP7hf9${RVoW%WCsmcmq;L7D!oqG>JH9(IA6l~3eMMXzDa50j#Mi+L7Q#JrQ|S;f@wC?3WW -WJ%q(@_EnlGg;GHdeZl|w+$t56pN>`~1(8~UZ(#ivLi#|xw4x7FsY5YTYuRKKe4m6;p4U4&^Dwu(!#~9SsOzG4ztdw}rm)I59GGz)mt8q3SNKKq)geF=YYH;G -iSAPL@Tx54)ru(4Sz&?tueNJv-uGq&ZLjOi>d -Q|8fSbbv4C?Xw*tAOLeLps~uA#K=BlWaOsvg_mU8qmp?UfvBw}sur$c{K@njR6yr#@ -et%a@m=l0U_9l@4@U2dLD)0tdXtYf{Hc^B0xtGY73$FJyWXeI@OnfH^NOfAe~()JpvxNf$?&`5yac+d -VpABjNf#nEoR$HRyPj!qK|4y^7}S5efU0))0-a#RV&l{3s6e~1QY-O0 -0;mWhh<1OujHYz0001B0RR9g0001RX>c!Jc4cm4Z*nhabZu-kY-wUIW@&76WpZ;bb75|2bZL5JaxQRr -bxunP!Y~ls=M=MSq4WTPTXA7mx*yVJ0)uHH`G|UYo2C^D`W6H8emw2n2#7kxo=74s52zYR^@d5G>x7TCgfU;8hSQ4)K|(q}l%Y&G9{V`p6w+mehYlTk$!Z%|7E1QY-O00;mWhh -<1(wOSR>0RRAY1ONak0001RX>c!Jc4cm4Z*nhabZu-kY-wUIW@&76WpZ;bcW7yJWpi+0V`VOId6iU6Y -uqppz3W#D3L!S@n)X`AAq2PA(9NN+U4+&iCrV_=NOIEj*LUQPWaUi@nS)@y-g`5a+&bHV5bY2KheCkr -dg}tngSUDJC?>yvMm;I7tSMkHs&kxB$K(;qY*L$>3+LtX$6_&Z34lJ8*yTKSNr1LpYz*=Fr{{<5*yz~)fY~1na@qJRD+PQ}Ix+Ue|R^D;=mDDUIO#|7hxJA#78`%+T)D;z!? -`~_QD;aZh313)}Mt!WSGR>$e@-I#Qf&276oU!4pCPKZB(4v4|b$e -COF#+HBL9k!}C2l%8uuAJgDjfIt3(sz&|w3(Ilt3*Wk6)TJ|2rq%ceJdCL2uP|u5@R}*jWNjKg8`Aa* -be~E$PCt3R8kX^t<0b?Ee3s6e~1QY-O00;mWhh<0tF~j5#0RRB%0RR9i0001RX>c!Jc4cm4Z*nhabZu --kY-wUIb7gXAVQgu7WpXcHUukY>bYEXCaCv1>L2iRE5WM>pD|&$l@c<;$Q>7l-UJ|w3EC-gbim}n!Zq -&ZM1~;TpeX+(nJ2Sf;*iInj5PV>i5@?z&dr(Jbb?_(?E}^GSa%4>j!BA&=l$t!U(oTqB(Wt6xuV=)I( -r4tYHu_0BWKx>Gk*~z(!|Tg_dlf?TIKW2B$;=@-FLF(W%axTdSe}$`vPCgMG%*XAQ}bpGmICh1Zg=yP -cJ{8QSH=UhZCk^Bv_bc9LFiOBBKVQq<4Q>Bq4_&XbwYoL@MDGfQYlt44ZoqFX&~jQw;(Qx+>e?6Pqnf -!F6h?BiX6hb(gB~CE$5m4nh~bpJRA{Lm(<4?f6job7)>ALQ{1$?;8v@_wk -KOb`1akH!=VKF#rGnaA|NaUv_0~WN&gWXmo9CHEd~OFLPybX<=+>dS!AiXmo9Cb7gXAVQgu7WpXZXdC -ePZbK5rZyM6^qPhzT({R$m4V#lY&4R^?rcQhqu^I%8pC8IR^ -MOBk$8$P(x>nm(7Z;7d>fmPAfN_F_#78iLfKmrxN#RMMIh{LLjt3fm-}n;#W+g;YvjnE{}tf^P9YwOW -BN5mGclOAaz4o;Uq98Tn4@n-%14LNQBhCPh*!(4U--Y_YO0Q{E%6$3y0$F&C-?#H%{0kUdO?d<~gY9?^nhh ---kJRzDDVCWx%Pk3#PYB`eEK>4$kP29AdVT2hxq(CKe2HLjZlu3k+Q-?zvq1-nrM~y*Af#2iJZ}H{?C -qJ`(31c|`m*+oIw(&(1!L$E{5Xok>dks!jrd@r0Ogt3kUQ4PswqREb3An`SZfo%L?gn~}y<(u!MzMx# -*}L)$|BasB$$f)$*`{CCK$I-bG03h#)}s!t)ml^JZ=Tax7xS}k3?aE%2B6KrT)suWdkdi@j?gym!JSQ -l);f+Z6&XgpP0!myO|mWW*{>9)ZuOSla50*wOz682VteGX~R1nL6YayES&12olHJ(81WbwxAIL_M45-vg($24Ub2x4=jalWQYCV2>UX{cQj -=P9~1NSLI`cW4P<(f2xG;7y2E`xk#X-0n@!9I -sF;W@ytbnVkB>{*E1`K?`;?;zF`|aI5EpCOCD?QJ9iFj -(axAy*Yv>J++Ia?4?iA}d}9m@LwmK>`su3;Bw(Xbe#n#%09LYC;bEW*Bv!+pWRB)= -aLUYvb4e3Wif2K`h9fYTO|*Llt?-2*8oLnZ`)YR=8+Ui?Xmpth%}Dgy^ssz)fLT`OhRcxuz26r^h(w{ -8sW}pBXJOIgmi(eh;HzAuvT0B^awM4r(zgAv1n1y<^Y9e=nFZwU(k*7YleNCr``MMPHU;9`Y{TI2dmrQb|^y601+6jNl1YxDpf%N7FYpTMd&-pXjCiO-903`9h*!2rf-RwOjGh?zJP6@ba$`(;srX(;?FcQLEQY^R5VVP_CXN)wQ#J2Y -y+u}gu%334<8Uu0zg>01_zP02NEln<|8;b^3{PE=D-a}o|gdLSZ?(UbTi&&0V!Pagr+Jp!hDuMa#wK$5n7X)68{=_T4cg30iA@v$ctkO6baKRHuZ`*V=!I=v -}xU!4HOo)pBC$^kPNnoK_FJS1=hG_$*(2kM$A#I*tPc(?qaqD!-JR?Jk3i;DO^z4chStNzIm4rm!K-p -ZoypEc6U`fx9wl*3z!fc%P1um}+aX0;sCDG3JDJcAKO=4Yp;I -QC3$vkZ3l6gJ0cep+Fj-t#+t3Z=8SvN7%6$3B`lu50iyN~e3J=9q?k)YLt(G>ux7WhA7KOy|@lClScB -XZUqu*s9@LFWh#3#@5uSi0@B1ts@`xK%b8`8+B|9^|WY6B2ap3HH9z+Lc`@-XH^J^aLdX8V9?Srct*wNN_$zvxySQGbOxqUywrE?C6xX?(|u38@&&e#%m2sn_6Mo!Z#FD0E -%jQPUYnwh{Ie)%htxIvV+=Qs&xW#ba!*T=3QPzz+(ffn2MKa;oRPOa0oaN6<@DRbL|zvChgk!d#7J*QO3XLKg8-tyyP{JNU6{wEpJ;iWPeH+JO -_w|NolpUGf!JLSbz#gJ04dytYqu_2l{N*)o3P3jvGb0|9P6g3DAdU1Byj#2Y=IYIh>!07w$s>U$q=qz -(ES{A}Z2B4^htZOUFC*`h`vA7$@nlAh$=mmTfA#VO@qov1&7>ybIM}T@i5(20$%8m~WbyOjdj8rQ5d0 -817bN&UjeMBy$K-NGp7tMD_al49-XUcC=wwip4|RRydkaO2@Cau&_bt5ttt&{_m_$RRn7*8ueuI -Udn1nz!bzI}3a3wZU;tsLFS5)a~m#I?|Xz9Zgmdba8qxgq-2?K4sfn5B(RXsNIXJ=hx4BVxnU-zah$( -+`)87>64ij#bG}zaJYerk6xJLkc!_O=Esaxr$&>%4oYMq!n@GXh-l7RF-3iUR8+mUp*)2bTAHGLjMd} -ix`pexIke)S=RWp;hr=}o6|19GXn&}7ceUhjJC+_bu>`25>TLA1qJEFfcYV5u#iuF56UbN7|<9oT2j-wCm)Ae2-Oi$3G)V{+_BB|{i@gO`~Ke(25$toyNd!}@pCn-ZP3iP -Rv87J$T9<}vff{aIW^;sH{gR}&hzbM4(Dvw+*Sye<^4SRPyWavnt@CTUowOE#pHoQVO%%b?lS{i@lY$?&i(9wd&{E!eM%*5@y-1L)qSP?!6m!}Y -Jo^IRpis`wo#zJ#vwy2q- -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 -(9LTB#lkYS`2B7>8YAE( -gqF$g5?cNT-`;Q=kpicw5&fpUZv8Wcb5S!b{#JsNhtNddD2srGo24e580H%}w0#Hi>1QY-O00;mWhh< -2UpC$Vx4FCYoHUI!G0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7Vs&Y3WMy)5FJ*LcWo2J%cx`MhaC -yBOYj4{|^1FV;mVqHEm02fW4(LSz65F{LNYWs2uUEJ}Vnwbj#uTaJl6G{x{P&yL2f4dkQnHad0&Qq=- -a9ipGh78h@V-o&oRL*o5#DUKWmRXz4XM|Rq-lJjhtvpKoX>UG)FfQF1#6}`!T|C%PZ91w09Ng7_48^Ut7VMRSD=!OBGHLc0AV)T| -QS$)q~K`MZtoN*~tTHY5NL?c23kStS3_dt;rMOg#FwqhJ<(mZb^BB&w%E8$y~WUDNJcRQiPs?7899)+ -Z!>umuHP~C*0!rQ6@+ztPEGPz`5YXas=$_)z4QC*}An4BnsR3-4&8l9ENZVNi0B}h>c)NnHSZ4ElnVy -94m2dE)PBuP`vQ4hAsYC_2wt?4_E{x@0`05J)IU@}=%V6!-0HFZ<5I40Q!*OJgBFY~5mvHW{Z((EqdS -y{|UQ)Ee*vN+FbR?(bKCJN_X(&hT^is?JPRe?xJU~z6`vymE3SyjXVK?n>@e7XA5#!HEdGTo48^(?CTbuR1BovY{3V^;Lq^tpWm*Z&c21w(^)W -^Ow^LbHLMrF3WCw8d>96lr@<@&YQQ7ODdz-Mw!wFo03VjiFD$8NKTil;DO$>Vd18~&9fK#x2IAw7c7OyAd4aAbjn2-lK>j6}EkzD35c#rSpiC -ewazZj`g{$&LKjiGew?L{gT09QauH=n#7&iZG}TvHr!lW_nSvKToc(fo`TNIna>QQ-YpgF!Gz5l9;4Uj09?q~(K*z%P^skS@a+uTsy!UhK1-pr^BVL&4F~W)rYGbk-LJMjFu -@xt*%LKRpSlIa9Eq9Ovy%|EJy9`PhQQL`v#|47@hvD`;!V^3xx`QnrDwSBc)`ot8$BPAdK9+RAtNsY^ -Kf|-6#k$?b)!rADkm!`~hv&Itt*!4L80aOZeAePQ7<(ldo-3=z}SpzqrLdy_!yJT@$t)H%SEt -Fx#sikAT`bMUa)QXrRM=g*5yz6XTYRo-1{1B|8(Jr8UE#I$X4F-Rk$?yd^Y-kZsf< -Q=f#rpQjBcv3*@n;h?jlyt0rSK=WS&*_l`OhCI+BkVzbg3k9&^8d^;SEXV{b`hJoVd`RntURrvGD;e} -HW#L`xkMay{WZk{v41usG%d&QyujV)=X-|IC)YVo1J$-imhxpLvOx7d8GJ%^PNfd?ZmLXuLMCZ4B%>t -yA{A5UKjJ|DkT!F_C?U>utWxti_S=!!{lk53h$ht-jD^SQB7FzQBTrsQN*9D;Z`xUV7PtAEQ?13EG82 -gQ!}6*W2*&xCn9twO=MTR0j)bYG*JVsAqfD0(O -SKW<7|-(y?fZfhFu)=re^LB6gt^v3BP8J^EO0(w1FcN_ds1ksl=E5hoo?N>|biB6{q{Y2Zvf?c#O!bD -lk)uI%lC$38<=p+>!H%S>s8r{9U>*G7t2X&4fc=)$p4(Y4w!v@fLSi{NX`}B^TE9j=k0vWPz*AW@<{^ -$}B>%$|it3xx$=Qe%U7SIo0RJ(RA>a1JQjZD>sIU1{N#bD?+KdACR;Kn~vaulvMob%;+RA#J}1KQx6~`FZl)@~}h7)Z?dtbuq*Lk=fd#7N+6JXc~S@4t_xT -wUVzKwc;G}wQMOuF)ojcCwlOzn#fauv1rG$`XxrE`|eVwBc+*s-%c7;X!oA$M%BwK+iWE{T0`@#dm>} -T+Mi>e+WGamBTedT6O<}RICd8f$3GBK7{} -`E=s`eoG^N4>_6*}NuJ-?niwRKXmDq*el1k|%@&&Ut2@ejG3~M6h(7Hc&f5h#vbYiHa9(sW -3>e0mEf@(#e9`haAxJBF)Q;U?PIPmO -(^WFy`mA2r3IPMY*3gs@Jf2|yHb28fQ?{^7{fX&iEvlQ=W%pIXTMu7YSh*xH>=#kMR93&$4Lk%j)tQ!gODvekNQ+t7=$55OZqibEn=CFit(~*t&&%BB9+XTZ8Lr`;Gf~t -k)a(wvk>rYMc|m(@nK&xjt0`%+^naky59tsEvmgAP#g@E}D24w+EoCakv0c9ZYXJ6oA)F@C@F?AdSw~PtrW<>4jqlQ?kb3D|A+^ic7VNqJ!3bQs(2IX{a^3PXRUIA&Xcqo -~Ko1I@B2=F7u7RF;IrX~pK~ADacTCuRD{jps{q9UUj`EDUyk&)9FSVbG$5#RV6?A4Zjz=i~{low=jz} -pW{Uo@yMie+7KnAvs`lwulH(`M1&w8f~3EOPzoo?cTxqB$io#*w#W!M2__Dw%XJM=r?y@efUX43d!;Z -gEnMT@dH#up>1+F80))6`nz%g~U@dq{4~XnIuZ_>!H&tO8<7D|q8pFy8FePGh@Gq{ret&58r)gYiT81 -_!ZL7QxAve;?hGXReN)UHeA6p1t&-HKpkn*l_S1gwF0uwkwOYcdV6u9K3}Tmfq#6rYJn367IVo?rB!{&_eVi%0N}NNM3YQ -H^keQqE6C!74lK1^OOV;WXG^}PjPgSR_3zWUX1-U<~V`!$EngQlLa$y2Qz3&)`>W|Ks5FAd7BVvSD5N -%R7Mz%u-|188d(Hn@q8n=}+oRW{fzJ7OcDo@}|$GFNQ~NP7=|JE4k}*l9UDP`cNnVWX=Sav}`b*{?(LF)$Q99 -y~+wPAyMU!pHPK4nf`ima`OBy)4{V5KAlI-WVXIA)gRXdfkzA|jR2S)@o6wfYUFF8L1G#Vh1bi#jh|k -C;U;fYOpn|dbcz!{W1u9>Rx2jQgM^@!j -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 -XHOty+lStvlt8D>x&Z3nt?mQL@w@)N*PI^8n -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 -^jDMu0RjAi3y9;jNF7V4 -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 -erC953FqmMFA(sK -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 -(EpwYa30PVGtH)&=iBd4;$%0|pvrM -m&xN^Ug?b0%65H58LmlJLdF1kQ1S^bVzhpmQM8Xyt?g>~iZbZ>(RtXDambvE4lqaaS$WA!SWzlE!tLD -dJ7F9WV92<+EX##D+!r3-u3I=fx$jB-*)!Aqdb5G&kd1D!#J`enp6*laiW57<#9hyGh(_V9&Ur8A&tKPlfo -bsp*P+{4^F^13ppRC732xdQ$OpCi>+A99$kre5r|K<`2Qw*wgVniqIua3&dU0C*(C;U!9#TSK0Nbn`T -2C_mFN%Dr471KkMImzZz0#`M@?jL5;)&zI`=${yUY_D?(?2pQVhh-5rtx4{! -AYS5B_gL??H6`9|}t&*(qAs;t6MVmNoTZlpPJOz`-HF5euHIaEo&Nh@Im|=1nD!*czvchJaO}YMqmZ< -#Og~3xEo%w{eJO@_Qc1jlX=kHX5Ekch|=N+-X|>15ir?1QY-O00;mWhh<0`70R}X0RRBd0ssIa0001R -X>c!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCYHUtcb8d391vYveEtz2{eml-|-zTedwcENs6H3uRfD(o0# -4Cs8J19oxuqA^(1DCu!%>9O67#PkMUM8N7@XU?78#&OT}bhB~wXdx*A21{o0qc?#f$0`9!-(($~cHSm -fY$l2-)uG`B7wCzjU{r+*wX&Q0E+AoM7jOlYft-2 -_SvQ6i&KK$CYYpbx>BD5w_PKu_g4J_eI$FVs}lwJ=D{&S6fz`)p}6vAPK_-r91NLK -ROa+i#E0*@-H~LBhc+3w^Rw5xlLpnvB$;w`+uoGuHc$>eI;%|&dx^s!<+qZ}o|Yx)oE4@+On<6$U+2! -ezVLpA!fVNu!XH-TjJz6Yh%Xi?uTd^}V%Orr3gPf1$n-NJdO;T%3?SN{P}O9KQH0000802qg5NP% -{i$`}Cv009C303iSX0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFUukY>bYEXCaCuFTKWoG=48?bU3URlz5J -KtRp?_{D99^z-DaE*n(im(j$nwE``#MoBtrzP(OFut*5AUPTF!+E__rACQ!FQN4_E1uf3^F1Ja?C)(A -|5B#)$OQl4SXPHPs!}zzP)R}rG9C9I=x(bS~wvt=JECU@OC<^7pBEyB2jitz&KI%LVT&bffzc9Q$RuJ -QJfFCH3L%wYlk9*(OU3vA{KDpnL-h?svGG2+0VfmnAj(&1F4fas1jOh-8U8aBitCMtJ+0IVr!dPcQjq -t|BRv%W6hxD`b{cwiP7;zg?I_Gzv2pe_0RfI)|y*m>NTN~-~m3DzTGyrYi6+#RW1-MH;l?_+Ff(ytRe -Myi>dP8d+NZK`2|o*0|XQR000O87>8v@=4ndf%K-oYTmt|AAOHXWaA|NaUv_0~WN&gWaA9L>VP|P>XD -?r4Z*6d4bS`jtby7`h8!-^Q>sJi+A$Ac)1~ykcO*F`DXlJ&X -5M@AxrEOLo1nLjK<;ir2hO(S6Lm28jw0}ZfGG|MLSH`bMr`G}t1t~;C?*@cTEeEe)PTM#u=o3$XG{Zo -qGG)JaDDr6e|rk(i!Fx0Ra-KMG=^k3#98$E5TOmj=!gkAVze$bs*hm+WBQ4wNXCF2#t<3sJ_R>1nflk -z*`v*gX&9sRECkMOS2z^ -Q0ZN654ViSF1hA<*?XtUdF%DuWGM*a_U7sxogIFdNO9!x}?G5ARC%D%ap#!R=j}c6G_&{7s*vcpMmOy -KToN7mOjVVaKV(93FB;vM@2wfX~4O9KQH0000802qg5Nc#Px5_16n0Eh(u03-ka0B~t=FJE? -LZe(wAFK}UFYhh<;Zf7rFb98cbV{~2JszlY4uvi%<$=JQGml+F*DJzA9kRl1GT+A|SO -5i-JskX>D$g(n)Kx~~+H6icT5u|b_8(|StR%-HqPN)&eSfYe;u+W**lJr5 -hbr>{I1G#aPz^UddUJ{t!W9>hCKxnDyLfmCDmq{h7~c^)rr(5ec!uEB2!2i>zFpdp&s2N5$v$jsefCfJq=+G*F~4|6E6fGS9rm}&SpNl&N4JFE1{&u7!brD&?WAEprj0Zt{)3 -N3k7L?MBjhJ19UV0Eh@6aWAK2mly|Wk`*sy<}Gj006BV001BW003}la4%nWWo~3|ax -ZXUV{2h&X>MmPZDDe2WpZ;aaCxO!TW{mK5q|ft;3^N68db<{QQ*Lc7szgXilDijBqu0p7y@I_v36xqh -oq7XvgvO>GrUNotz3%cA-1Twb2#%2y+^Lsr6jAeVgx>mmR6)Hm#mhoAZ=YRLDZTN#l%JuzS0jz4PC;= -i6KkL4HL5D^=OZL$_`RO>q3)#x%!8r$;cIBdhz7=>+I}mW);?YO>nM^Y_LGEhRafM@d)x(T#zN-G!;{ -f6im^wlG$h__=e>9s#UFEc}~hr!-XRBR`RMExY0~JL|ervg6#g!KL4pAp1>?v$EmE?qwJyP>OsC6;RG3Hb`Qe$MU9vdbtg ->2ZeT$Ql#j_As*q~y51r&U>WE2GgU&uLY`R!zxVhbXc%r&N4rB1%d0JLKA`tXc6Db&FE+I#{07_od+V -hSlnfZdjBWIlTa&qY&Yo^@KpQ0OiYyN=X8Z@eQq7HWPx2WMU*mk^VfYAuTl}*=SPo03lj&I14FhC3-B -^ysZkz)D@l%PA+B_ctxubPcrP!u{y(O?f$vp~yvjY25a3&)h#l2xnJcx -sKqKU~d>`&0AMXN4@aoF0o{P$O#0;JD{bd^V^zFY`r*PY2KO)5j0uIr$uASP`f)lJZ=;lIQRZ21YgblECs;Dtv377e_;Il4SP`f@S@S4~wpiK7xLAx2au2OMo(ccX;-bQG>`<;|m714+o? -Q*OyZ7Xm?sf7QaVeNB&G6{C_3zI%;t11$uya_}7#TS&VBYX$@YZSENTbuM>YVn39iQ38e5#Ws^n>Ee8 -(`$AmN&22#m6zM7@YSM3>njb81Q*UOMSI6gP`Pb76e_y84sjnz}`W!qR22US?r~ih00h_jabb568ui0 -gOj@o@&ej*K?#!?4I?=O7o7;cVEe#cDmdqfbvA^md3aeO-LMoS&a)tm!?2#tW3~5+Nr5B`xux7%bU!MRtN`>75KE{BpA8O5$0Z=h5b_sPA)j!Z0TKxC2vEnpjX0nIO4%ZUN4JR-a9D -%_d!v+myuV%cJBu)@QxDLHXc&o5&XKsJvfoP#kiN^F5tLzQt6zUd`t?Dpbzpq^~W0dm34qg6J=(R$F|ZxT4CV%{X~0BC{|VRP+Er6m-Ip&28{$$ -o?)PX_>Gu>@#Ds}J?lC-|0i&=wtbJKQI_wbQzR*2Fy#WLMj1m=c5Pu|b+m09SA%i@kXu)dPmz35VzXc ->&!=l9cqK`*L77ARPV67lX1r^n{Ty@z@z<2qsQz1~A{OE=t<`7oub5l0E}L5VQ42+LI2U^W@q<+#xo= -^Esa{7Dl8lS7r$9YL@JM{eN1Vjpf^=wKr}4*N=;gHVvzb_$ALm$NWFArg&PgGnT5wJ99clM+Xl9kR)c)o(uYkGy=m{+6I<_$&@PPTF?p?Z*<|X|ZLSe~N)Wv-wxe -&!00!XeUGI%`&a(L;JR`JzjA>QHh=VK?)QG6Ie6D!dX6_H6&`ej{l@7B6p@R;YZRj@+r3}B7b@y#4_; -c4WHLqs`o25A5Zr@o3<1n -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 -1@)^E_WoT-VHPB^I&FJ||Uc!38T8grz3UF?+Sx -D@h0B$8nBFX!v3Q%;wG^zlsmWlia=!<(}UCQ4UYizz3=Bv6|ffm?0++p}y0xC+XeU?5z5qdwh-4lTm+ -bm#Wgp(+WY6B{Fx+VT-8QD%JhATrSRk8t%)r;v^Ghh$G?_~4qW4nVVvI^ugFDR^lA0H1=(7*sk4=_4tIh -Sz2r-0DV8-s>T=XJGS4F`7mgHeihe>EJ9`x_gxA8X5oK1|*LK-pDjo|!NfO=Ou|HJqx!6xbV>32(=i3 -KePBdO_pPlUKRWWorKz|61N=}oCx(`E8k)bN@`ji%6t^x&Gpn~%bBfOU5=^$7xmL0;0v*BK!y&*v4mBhtm*k -0_oc_vby2AzegQh!a`lyelbJ;lKU`e~`aym2S!eRXs8{RX=x -_c?1{ArrJFQ``^D@7T0_xa(+eB~8Z2wU>Df8U9Wr5r1k)=zLmbz!h=Y25vWOssi)(c{X_v(S^7>!@%X -vXXkwc!G3JwPXx=<)O*=)6U0(?Yqg7kSwFj>sz3u3pQJ9?d}?Ey08Wf -eG^lc2(E7_bCcm1JX6h1{>YZ3)dLN66F>)VGJB?zQ~Oq>q*j+lufX1`KsN?1(J{EVs_EmkEmSv>%dsj -S93nFadLEYwHb9Cgu~<%OwGFP<9Z#L1^L-X69fTOPO1hqNdz2Q2Gltch3_#CRnc}O*Se(ude=aR4CMx -Z0?W=LuxROsswBwq9XO*vFzL8_b~@V6kaG|q+1aQ>$fwsfVBS=$RxWqK}OD<$~kPY%XybxNZj~@S}8@b>2KnDFdCh=)ka4kVAZdsm93c;E(!l_X|cz?TG -NfqxZEUxoM}lMThRlm5IKlsnlczbBP2CJ7Hz~^0~`ywxG)PvLvY{e?Z|5$Od7uW=A~8dC&S6)_R-|_<>dAR{=YpLwXFJH9eI5WUMC*f -XFrbr`@I^SA7MBGq**$K7RjI>%m=N=wn-j4$rxwhI_ZrQnQZV5{=Qb2b*a|4;Ff(hMlmp+>IG+ZOSmM -P1#qNVi3}ARNcb{;npH(r(#xf&uP|t$y@+uyJdtEYrAXw!eAc|j<88Xslwcp4w`oNJgf;uG@_nF7&Nj&x%GP3aF6aeT)+bl -8}#Kp2kr9J!^S;%=wu%_&4Npw|^duXS7 -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 -c4cyNX>V>WaCzlgZFAc;68^4Vfzmef$X){_rM -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 -o!T%#*cqET=TdtO>|$PY8%hJera*1KXEBOiOd4 -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 -d`6(c5(z27I{RV4~;e-q)+udaGd+_=DoJ -4CUo!xzw!yivIeX_r3nVL7%VcJLU^G3WZBpB0x+@+o^lMz6g3OSv_1eAa<3UN#_)C%5us? -I!1YJ_$HP--e3LheK(?x@r8$J)MAC@)+^7@qD+u2-km(eS_<)k>^Z~v^uVg4Uufu)Ph7d&7fDuoRb9ep>uvig7bb)-DHsr -^(~7_A^Rht_uL3@I!!0&y3_QVEzNBe^oRR1cPgUP)&e!Sv -`xMp&;-7NeAbzJPEdW0j-;J5-^i=zB%yQ%B=u9_a0k+yFwlFqh$hAa|fLY%_lc0t3jQic>%YfvvXt&~ -=P+iA8S0j^YU&{4^~J{67yy|IBXR$t$>*J9CU3Fs9Z(dk}6ke@fB4HbiR6S7;0%(PS8o1 -y4uTKz(SVU!RptaVonHLFvkEVlA2X6PtJ9Eb5}IhHGQLPX;8(CTB&C5mf_Yz&J0ji;4o0kqE7{GzB3K -BvSM`vB~xIU#Bmg{^zSV$fR7r*YUw;CwoTVgh!w4DTx!lKiN|vCwzar=gFM#%cDIlbixn&kJ)+_lbBN -VH^njPv2L|tjo(dXVVfDpK3^90ZMM+N6yzDNmG=`FtI*Q{U(n;s%K|veZFKQ$c2zGn%K`&$_|55T#v& -eW#K=&{?_}*d$R5Wg?mAEIGqn2&TPw%PWI=&pvsp)Qp3P`3#AjtJ9!rm`?y;IA8lS^KI!mT`k}~914G -1qCQzne7Gb$MqN4+m(V2DF?IG7RoF(j&|v6hv(yGB_FG8DGh{*m{?*?YMzaIRXQ=h4whlDo;Ae6x5>C8Y5-8Yd#jxBY|jab$9EN5?*v)7+eE62s=!f5yr%m2 -$A3m#_;%(7fm!Oc!Gm#K7dS~c?flee)Ib%CjN{!-i2p4%vNH;O=q{HQl*95jFB7xenlv=F`C;V<^-;^ -GsZ$qcU*JN8?%Or+q7WRPld+qf~s27eykSER|%8O~d`9{m(_?%%j9Qjm5jp?-4#F97ji&R3OeHYB%hp -#ctzQ&@dWD`_vx6N)i1P%xsN!8zU&+OBW&poo!)JihYlz68w9Jt3-PZ2aXfe@ULPf -q%JWXu|JX3>^nSYc|{Ibiw=_RK`knJD~5n%x8 -KBdSIU>>NpmghQq!e(t?v%ZLP3&NjM6wV$Kwsj)}4g`tEkNE*;suZOK5515cG5_mr)NvI!diGrcUL&C -tXapO3gXasdozG7)6GApf2IFKf9Ymv42F44q$Ua@{f7%Yv5dnm0b^_4)Xq@OD9>Wiv4H(@CAK|A!3<9 -B`R|REt_HUt=3RG1j6vk%421M}%N$C4>8Nga!H1+2EB9WXev0(?6I-j*hogrP9P!QEC#xNw#O$48#!XaialR#q|6+G6JXaj-TC$!YM|f -N+n$+7puwOK9t6Q{dVbrSJDEk(c0^jVwbtvtuM5CqT}ZnPW^ZiJAE3J@TlAY(+wJs`A4Y*h|s+>;9|4&7bcf^7u8$cwzv2dg1H1)>nS&R -AMogWgZhTwptY3xtq(BchsyP-6QHE>6@kQc+MzUN>RAK-}#XddC{yj^c!d?#E%g-qPgibYbEaHX_z+f -nri9F-oC>fZ!v!Q5wJ!d{LNh15RgERfI5DvfJ6+jk_QzNf*O~q;Zc+?elXuR&d!KZB|{FhhSzB*34AD -%>D!SEJJcKj`E1+RlIp@+whvd;!c+wXfNC=KOzy-+?M#APtO2mFP?T-K6Qaakr9g#;V&Qp64?NxpMXa -?UN>I;rF;|6A?C7-YP39HKJkQMFLCMJvYJ2bhlI#((j%?u(y|qV|@~@I{=m+y;09kDo((5WB<)4Tl0w -SG4VkHP8v2aP1Yw-llzg_=?TBp{*6W|5s5M0x*eas(Y -E5uNvYQ;7|fy+*h?{JX9zpSO8A=*C?U>x>g4po#Ua84JRCcqs<4DK1X~nZgxN*W6F5sR%9H};qMDpN4 -58cT-7|fUWjoEh5++SEFK&@k~*-osZX0j@)C}PcQ9Ud-wh6_^gv?b1AV~Qr|}w*^J7OzWAQO67U_;FU*(Nnzjt4|Ra(GAt@Lwq;d-p$RZ47jkbl!(kASmJN)>4P<_iqw -gM$HWVo8t8%@@Fnf&yJAaDYip>A0jVuk|(}uBpl_cr1yu`X1#^A=VMzh%{-j@WEMSA;IkZC*ODkVZ6t -`3Xp(E#go*Lyyh*bBew!weMTUGi6j~F2 -h;;N+i0O_Ih8#JEpPEY+@J3=}IM-Evu^IkW&yNRDEH-Mbi0}41yCgj*$*qAg9FXC)+7z$GC(S`|y;WL>|n=?IRGiN -@uzf!;`PIxpA1W`iWdDcfm4BL;r1#ELezOn9_eukOM6yS9o&hW-H=Vj!xrrzHEIY+rM8oSY?Y31a7P` -ACCsQ!AZ=Q+H~D9c1w*ZRDxWEsi}#FZKu=FoE$ajiC)xvM7?#oO~}P!YQW(6K#^{V*U(bq@re#8`w@Tc24 -SZb0iL>wjcIY)dU=fp%a4F774@DfGabc;BH@*+OST;vfqg0puQqor7DTF7WlKTih94Nump^@vBbcXtN -5XKntWG0UWKq`P1{Gl*vOtv6RIj#V&_IE#Ga&QB@xck>O8V-fO(aFvrDOU*WaCrB3iEVK-@~qFGXonP -3h4T0ZDQL!eM(h7U^eTfO7K+2WE6wLkMfOMP6ETmf#cLbn%4~w!m8$u#q(s3o$c6!zHW(Oz$CG(Q!=B -6*oOs_FK==uO%u33#J1;Zq)LCm|U7AkWD$Jap}N?_{GW7YI(=3^&J)l%-B)_fA}5V)GG`a70$3(W0SKa>F%dbeJ4V9TYr(uV+}z1+DjNvod3&cpw`x><{T{r -0d-8oO~fj%bJIy!%vChlWQJrh^)HFMYcz3Q68HHvaHX!TMh|4U={?j*`j?v`cQ^2S@(MfXPvZFW{>-n7Nk&JgB?NXkxmGl%jHI3 -QT()TRTF=2tkU@Ic|n5!QkuU%@mq(50JE(tu!J?Wo2!e*6-B$cCX5J8xxg1(;Cj>>{Ltc|fE?*RW?&6Q4cD+6+hT{39_@_SK6n=CRw}~fcZ}(9dr1cg0 -vb)SDaw-Q^SNn?%N0?iV8l!)=;ZRlMwIjMUC!&0*qy!BmN?@^up|8!~6e_fUBxJ#$fU3 -Jq9`D$W>hK6k!J$ax1RW8KCd@TK3@V!S1m&HvDQ7lek*Ooji!dZLvn`7RO|_nvss=dA%RaNVGIX-3tU -NGA*}*D}LJ=TnVkQDoE6c9jt)q@tz+OI-qP|k#2`t*0ybP)vkID-4lAmdUQ}neSw!XZavfzG`QzS$ny -pJ-anONzN4u?L%W?CFdeFZDQ*vb#IPLcv)dgD|GpRE}+0Fl0_mS|z0nI*#ooOuEa^+-b+laA%gTP9sW -=K_MDzd5C|E6J>kAkEuF4rxd8(Tr#F6pNi>>;s?`Oa#jS_Rz^3okbg%VAYk&!C?|w_q!qUulr>S%0_jbeAn^d)toY=@x_8=?>u@t6lYgpz8yz1U>_0vUK-Cl?i0)-_&PBWf?y)B}-Xmda|4 -W}ko))Bet9I+!RBb5&M-YYzuU1I>^_fq-wHcbf%ls_ja{Yw@wP}m9&5}d{PN77&RFghGMO(T}^Up$rQ -G)nHUviPjW~Vx3FcNisa*0iir|{?zbh*k1D6pU6Zd+gMQ%pv{X@8^;c?Xc{Z$9d%oY;_EJG>e(k^6{` -z4>+yQ{@ov1?&&3#-)eTFM;bH#fX9{8n>Rvz>EbYt_$Bw$k2x5O0?neK%)Hx?I#iQ@QQ&D#9gg9J!3* -Vq=7|83YK&@Q;&jvW8|LbQ>+%T0Z -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 -7NgrPKL2(H2Gdeo&86&k@y?{6d)ozPGw1eyr5X -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 -yr?WMc>NSH5IThLFDONjO9qkAdmRU -|zw`zL`U(*%5MS^&li$OnTh3FjpMV2?`El64si!JtVU2T?=$nhpu^QNBq^ELVisXQi-JVq_-6*U8tXgdzla+1%t`F9) -XVxD9qs5%#{fP=t1)d1IxDM&u!{lsyZ+b1&n1?~QIC}VXYO~7yoGK(cyTi6QwO4j$SvyG$Sl`h>lQol --h=z^Dvs5r;eOg+2rIjVy!R}!M}3oc`|i!r%Ws0{{+{{E>lAc^+=hH4CVeqd_^UhYsPZzP>S=JIl*aS -a-lj}Mr`aAq_AV^?Z_th7N596)90ZWt>g!^go^LS+JcbUGtYcQ+>$1bnOFQVmg*ps~|O$2h9n`QEt`~M`F^WCv ->?7E~E*YEzZxUp^+1RliMNeZ~WfwwEVFg5@CA2eHXYa=^sYq9ZskGY>GZMzt#l3$qmDdAMvH95pZa;C -1AthNQK$PGqh#Q9PrnlUF+3}JCoa*)yTp(d%E>fy6@U)S!aLTg3@*Lio1;^9{0f7F%Fkl{c)2=gZ7=# -p!)Z!97Iy1`}%|TesOYy0PTWX-e^qO(TIcveFkiHN{!TQ2sDU($B`KFS7!>MK)>JjpgR)~9Vf6m3?@qQ>RoedPz^i?iHUeQR7ieod_<~Ne3@$(;uhIuw<*c8wKN%Vc9VbDxXk7X{T+55%H-nJnamVH)Apojgv=XZ%NzLvRtRMl${B -B(EM3S%Meixa2H#>$WpNSaOPxAb2@jDqV_Oj*{^gm%lVL6%q31d1lMLRL+ssEHI&-_PGw(o`3GQ9iVTZX0|4!e9G+pBRI8Ki?J?J#j_4D5JHG{ -C^}ka?>!i5q98Y3e7^{%T7g>KujO)SI;%TRIwg%V1W@C|tNs66`nj^h_5UczAwpeoVaQiDi?^-}OoV9Z_kf}jmCB@S<;qPpi=la;!v_+BQZDl9Zz9z(rjpV!Mp7`AOYm3a)oqE4U*G -Mxioj^TD(M^FVvDfFFWev{1IFEw;H$QRk_R?lO7MK9`V+Fv;J}j5%B~(0ca!+}4G)KuAcj*KN1IcRD3(!0K;}A~hTT)j6wX3+&miy{T}0|Pj=EqdUO9ZuOUdeocE*^vn`->nDPkpRr^GDQe4QAt|+FP2kv#p>Bqnz18F4PLL=)J{BU~%VPAA6M69o{s1281sm8-I?XxP#6LHNKc8p5^QYJ2$sj*-f&Q+2J -3A$>AokU{*P8Mw%7%pJOtk^^U@JB9Dmd>L~e-OEAsaHOpzobCn_ipb=9KsaylQVaGSNdvxefU8xk*y6 -x2Z8?N9cZu7R?B9Jh$vhjCm`JJoo-*f{Fm45VJRT(;W=u8bir}78u8e>I{GNo57lHy1;>GtdS_1yLk9 -Eb*+a99CGE3`bGsn~{Gk2I-2ZNN|vVucq)sz^l5QC-k!vNppisBje=!n4!X*l{0`Y^aF?F^HmJx7^Bg -m?Vy7H@5>BD3bW#xOAUBT~Y+^%5ctv|90)Lc^(LIOx-iaj((c6+bn^JL!GcKj?O5H;KM2>eK^1161#L -+5*R)D#zbh8*s0CE+^DeV~O#nn4iX+0!yLeuEIbS%xpCLx80n23ducllaRS0F?QywvYn`Ya@oElR15L -8^ERvlr|}RcGk)iIX@qdwSmhOvDdK6{!o01)*|$P)eKZR8F>^#wzYS?g)Ume=QKK*RNVh|8z4K}ol!+%@GPd7UC_b_MAO8!T7JNU$w^|KP--7 -FR!h6RT3lSU4{jFucARYKzY7)YPJM_-Y2mmZA0+7`a;)q>*7WlD_rH4tyYvi;H5k!$p^bO=GJv8?9Q- -@Gy2O7{3%P?f`^K22rTA+HmBEfvJXh0-rAd1O5vX*PlV=#LFVcZG};T<+z)S#-W^Wge)szIt2ggrZ0_h4v -$o-&#+*MK6$Qd2_}xdc&u*( -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 -!LbF>J{Gp=uV#S5Z5(LtBpNsrv --*jCVF8t%J!AZ$%nf5~MaeaH!WG`Dw{9F@M(Yz8&Y3s|cwGM%0!=X6;p?IApi^M;CcoDwVAs8FrwRlv -?LPdF9-OJGkHUy?y@zn;mXbgDp%OEH7upf(i`ZuGbyGCn3sqUi4wASw7Bk)Ojuh6jttqDIN;F$08A>%j5NTbV=koP;`%N<(AnHbQ6gB3+mV -*(E(8N8S>IbG(}B@gkT47l~$;VDb%B84z`mnGbbc@Eh0+(y_rjoA*mn;%S%JQT++z%cOlFunp<7mG1C -KpFntw?{7zr-v_})Beg#Y1wA*zP+E`%kGc9`nSO-{bx#KRKZGp1pec?&#%rhmqIczmLMu-mJv -r^zWeq>dmXzAkz0Y|2W>yPDT$#3d(iSWC=y~eSi4o?a`~3u~+{v`RX5E!v9Yu@Sjg6|M)+Xk%D-C`pJ -U;Dk3F^J-)udYrZ&m>)ERpFP=uAkL`P}{`ltUvp*lci{aqdwtBXs)roEO;??u-zU^Z3=0W;Cga3~1J5 -(Ni^UV}*fbknM7cv_q{p$4}aJPPW{J-~49*h)U+Q&zL#qJY&y4vD%3MGxVurM&Q`OEA<;06C`FZfgbf -q{*MQD(4me|+`!F!=|5Ir`@1t2c+wp1wUC@0l6epiQ)ZzXmR~_AgBbV6WJSjkiJ;ZBdc07Z`ND!0IL? -2DM56^kY%o_nJR3i1e -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 -JU6BH)qHBJoLzw5eg5>_Q|3m8|Lg -F7g*8pmstmzaO292EF{i1YV((V72^sPTwLSbukH3ABYTg1{4_JA7ffk_d9f)Zo -%S57TNTO9{8)gT(TLa$!IQ^*+SpZ+V9^Bw0rn{IQ(ymvgia@@DFpY={M!j2{^OL&Rquat`!+HMaOgQ* -TrZlkUu=Di4`Wpuj~3WZ<6%!=!@hu|7nQqBQ?KHCXZ3l#NXYZ-r~uL8T4gSS5&Bq;|j(oKcU{i7u6vk -vt!ZFTAr0uiruMnRe^WpcNjrI+=P -n3H$tU_ql=rn-^pnre)mEfa$^e$CJtXC+|NSjBU&4yXH?9#gz^zf6DzZ8oGokMFFXKm4j5Y$0tfgF~@ -;4jJi7Y%bDlbM0t5tu8;#)i@M1qo@7~`icp;hFT>C{`BU0B6x?o_Pi97sx>i^R8BN{PLfF$Slky -7^d5nE>=Vh&6THI=rtuAQC0hP60PwyiPY>LNJG|qds{|LAL`-(JI$~Xgm2k*8&(G&_6#%G&%fmR0V)= -L&GphI@5v5ekv-Eqtjrdfv~-};*=;8_`(2!(!MMf-A(~=>1n%9@h))^=nHnT$%;O~TyaH)6Uu*V*Jsi`1=Tn&R46?1bo}!aDIpQ&V8)!-{LRqhZW0BK -$o7O708y?j55cj6sg2LGbV6)xk+Ha-s@zM(YgL`%Fxs6kzjQv3(B~s3d1E8hTJ5C0wagJ(l_GGzh!a& -unz@tz;a-_HaC;jO%K#U!UzS`MSDaAKeB$kuj=s#A1PK9WyV%Xr{^;XyRDxLy##mVYr04^jZg_2GvT; -Xu0w$jkH@Psym2XNV1s?UIY+wY(bdoASfE32~)Yt`etlPL}^}UCS=ONc9H*aXvL4ksqNA6=??ucCdY} -XG^-eQ`glA7$`N^$3#)kVD>AY#QMD$oOR2RxPE6Hczl-Ea;0YLLU09WnF_4ebdPS8p*q1L~I7Pe*T)?_NHC_3XPBhcDk9K2Kg8zWdXw=U -7UityD1%$uSsHw4y~=a-tg>#z~?6gPqx-^p-VSc)60!n326Tf4(gOA{>kdEPWjh% -pV`d$@YX-7yooi>w1m!PgIBh`j6};;KH?J!?OB`U9&Rwf}m9^=+hims`i{FaHPLm0HfDr9)e93_p%-YP+v+#%ddys -$AqTXljh%c1r0t#Tp$n@Vne~zKN^0*qbZM -q$2G6hZ%K{#>_Nk$%(=9IQ^p;t?g*|*)f7s{NC_md=jR*!t0k!?`29(n2+wWe#e)UELI!aXbE0)ZM10 -3chKp8Oq-K-=orRKtrHl)E^Wg=4<>jWcqcX${wh$J?oiV4U@h@-3*FBX5MB@H>XV|i5n_BX#V*bNhT6 -++2bq%SZD4Lv}L=yH;m#}x5HC*UfFb!2{Xh~}o*Oxn!kB4V4sr?lqJd08BdTe#;dlRE6FcPaI!Lf^7sfEkD5x)Z--Q-7&jy -rpvd<7v{beg -(Zk{RIf!G6SdXFi?zn@>EZv%i+DCNUt3j!xZ$CtcgHwQCK~8W=)-1vCE}+o$I_Dyvj4 -3jgpg$xePiPXdq)@F`wCzW;l(EC7^w`9>NQd9y^7kph|OGbyiW`~h^`F2?SJq3u)>7|XO2*`9SC`0u6 -zj@kuk!`SF^VAB&16=NBm5fK3%i4cFwn|xkp_R@jmarPP05Ej&#=54ts(zCvsGtT0-HkeFM=;l8Z9Jy -hvDlv4X{HaLKC)N#Qjs?(`k=*(B#2^}Dw(@gi*o$KM|Mzt*y9vWU@ZPUL>H#XX`2!9dIaK0MsRvXAXc -A#-IasiUqCVuV1UeAO>Nkf@BQp}t3soP(a=Nn~s+9h}&H2X8}*sMQp=eebszhPAgz -oXFeC|lKO_Uszh2`d9PPc*BJyScafktZ+*j~pI@#`bA -!fuD$tIc}0zwAS;8aJc7c~Kh!V*wHj^bs0vuR$GEg)JUiz_$)U>r=8+)2Xq>MqN<3WKcIis=u@+7&OY -TMN!5`bE`OajG(TAZ{FG4iG=k)PMNH5N)xWpZgy@4gGno2xNf7}8N`e0#e5CjX{-&CCYIiM<&_M?EC- -{u^@NR{+)tFF>WeuY1F@%*QkKbYljKggGG(5?U7Bgy+v!QMN!qLDtXd(?1i=SF%k{^y!QfBxYMAZ2IN -$uIuXB^@<>&YGb>ailJ}P~CJ>u?&L_tippIFF;xS<;JGR?L!Gz1(W9tS{r#C6*w6wffa1}DKv`6F{-0 -|^_r$xsg?ADqFY2ZzAZIR?UsbP7B$6jO!2V>bZ3sW0m~yVbG_16Bs92|lw3{$Pu0X_Fe=x+A9C+aklj -qy8VQ2)p_*wvv?{1!hLlWT0h3fZqKAP)h>@6aWAK2mly|Wk~v3ag34#007Sm001BW003}la4%nWWo~3 -|axZXlZ)b94b8|0WUukY>bYEXCaCxm(TXUjF6n^(toSHm{S>l*HZf&N9C@NJ5S-?!q6Gfmky#bo-ZjJ -u?J>4LpiP@d1^&!H!eCIn?a|L5o?Kxe)NHEd?+>LJUU`82VGXYNo70D|V@W-}({Jt&{nh#S}eCu8HuH -cdIf(k)d36jA^5ED|wGofG^UEz09W{^=KIep$p0`djH1Y60sgcDdXjs|i0iF-`lkG(i&J|3D*MkkNV?DSwO#J -|nEbk|TkM`KHToXwL_Bb*T;qZhWW8VwyKbMGxHZZXk)=bd|v}^OKvYJ~_=ws9Xa|@Slq;i-B{sLS-RJ -36k+8Dx$Eai;#L&Bknem2qz6l=>OkH?Y3uK}>*Z~${VQJjyX(NWc-iosV;&`=@8&2XFXi+gPadx*<%}isEvOFiLM1g26$ln`M -YqLZWNegmNsppL3GO5)?g2UaYQbO}uD)udukQw2;7N6tvdc8QtEmUNX-aYhhhj)FHrg%Z$CD{C3pS!i=mib>$z&h9LRMgzJQ_1%6$>zNx1MPa~jyhzMkd2%} -T6kO`Nu6sS?0jlrq9)|^d~0x-NXeVr4q -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 -G|M|kox{atfjiiLk_p}K+ZD+j$O|!44bYYrd( -T3Zm&u1YqhR9y}rIfYoD&|sE3-}4*ca(G7)lKx;7ZO~-&KQgG$Ky%WtV1G?ck+s?azgIr2WypBH6C;uQoju8Gm0&vwl!~X$~~yznc!Jc4cm4Z*nhia&KpHW -pi^cb8u;HZe?;VaCwbW&5qkP5Wedv23Ztd2U_Rn6a-08u1wnmWXU1vT?9!`Xf4VnVv7PP?Ph^KL(n9L -yhxG)P5Ux^k`8IDciU5R;D|Hx{mfWCf|L6vurj5t*H58qtCJ@_6GcamnC9B*^`?d6)es&(eDoNm+Ss* -maHgzH9j(mn=jaH*3uSlOIc;ia4RlV$DAHWVutTW|V^Nn-YS&tQ(X|TN4U#!iwO5 -5zP#KF2*T~a!wlPk@m2NkHSszW;LZuWSVxz3OxQ4YY>QrXd+8F%Q=jhNK(S)0!W$yq -BzMUqXMbUnVbQqQ^FCEBM9kksk0UU+zxm_AU>I69_?7><> -a4^6#B-3gQ&Gs5s)DX5i&h;wwXJ#u|7h&^|K}e2{(B$)>f_)4yMIUSe*sW -S0|XQR000O87>8v@9yhpO`m;?LgzaDlxEG>xUg-H%iMmmQL$Oi5XZm*jhw%WkHtLf+liH_y)tFW?!->%lIvtoxU#t6#A -#RbT^)y9EI5qhzK^FhXU=(6$Nxz?^`v!|yg-iA0_o85RaSa9ov>ufGpe%y5U#E(pJ}P)~vw7bD7gJzDj05_l*i7)3Cn{8X_R6pK-mf6HGu{K -nXNkD%QiO{{p0l*EcsXb^1I`nq8SQ?Q8eX&@(B`H923PARB#+0~R!;iPVuPrid+675*R>0n0mFF0eXQ -nv>qcYC*jtej907eB)003WbvC_LPwbYD1IDOqA;aRqN%Q4-80pXUL{&GqHg?ZZ`Q!CDj23Z0P3^4RvQ -D4cW(i-HO=?xT-M{D{U9%&1uMH+KxXxM(y$Zaew2rl93bvNLD(VhtUd|%;8c~2bA7L6aaM9q@D#n!I3xWYEzx)j~&+gpeDGXC3!81M$|NI6E3Q%4|N)LLitL#d-6 -VkuhME^r$KLNj(h_5*e92>A!C-jDBMcr$m=-i>9&4dAP_ChP<8JAK_={9P)h>@6aWAK2mly|Wk`yB~fT4}2t!;zb~U;vt&Jq`$qpdk-9d10}g>I&C>)nZ)hw?d|P*4~OjN*%4c2u}p7g -tgco^U*nU}=-}XBREWRVqO8i0$2_k@QI7u6{ftI8Ygw{Q7T1XYJZZ&cTC!>_SXJ<}%(J3mW;#6P6}!? -{SzQWvl(AT>WGY5HjoAifBL>8jie)9Uv -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 -l3nI60qCBO?OEqM#UzYgT0FMkXwFf~g=@x_XQv -PEyn^59(ql@|FjZi{d-dMY4V8helIUk4LK0!g3>Q{E>N12@@8x4J2w^Fxjz9clLi*{nWM2e(gAO(PR* -3k~O<2v=pk$;bR$+zrfV -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 -i1PM`eUdsP!@0P%6=oJ1gls -&P_P{Wx#i&U<;-q0nt4Fv$)o5xlD8!sgOQCXue^mZWH_x#Oi@tk3UCx=qx0v)0I2svBZRex1A+Ec5ud -fc8kBRoW$J~5^igG@6qXbhefp~eM$PF{DryxFS9C40vY3;36fhiXP&GP;6eA4GqM8a}P&zJR;Z(&HhH -P{sfX2?9HOn|0+d`UB&Qf@l}*wm&PWyl!0UFcItNt{>M{1BealcZ!Sd)mr*hRRO8;8UpAg~H!)+{e<= -5L05MhlA11_*iXQLz~eiFxJRgAydC&wkAJvUeqPMrJf*@QE;^vR(Uc$!!uaOi`iKpQf><%x)asAKi9W -^nOJO+yiwxK>x?Y|(hEIG=yDtmB8n`zLt)mk0ac*k`wT9sk`4tKm&?UgEU-6VAT$WCH<)qsx --Nq_$x%M|89(G$7<+c-cCXgbNuWbOAyZf9=VR7skNp;z7pa#RCo_%Sj}>n89Tyy{xz@ao+Qt(o2Vd -pPB*>t?it -G40F+viZRg5BxrsTLSo{xkI+$nO~>rmYe1$@x3@_EE~zPwfE$cIN>VW -uM)D9+U2yJS*>>RCaFvhv%mAV$`|5acvtq&=(Q$6m6M;G^eqQ0BE;yS@CN|yEg7}Q{m^LE2U)+R*3Pb+e@(=|*!$Pa;sR$81~@32rkXMBEo -GSlXz7DdsTn;rb2J8>S=Kb{90A=Qy*|$HXB$n7+bQcHCQXp+d3 -pYh{}+sbPr||X^0(IfM^^TJ -QO`zpm+6p>BdRR*hx%7w&@LYxJ4;9OZAtp6M;|fhHX7Wknj|nh&Ky;;E~A=FlwLc1gRxIcR%jyz5$k? -e=uD$Kr^KYb&h|>N@ITr-+{Gc8?NXNFk?P1>NTL3U3^{qsI}$W?4}8DIFDe)Re0%ufwEra;)pB -JX^b`NxafgMTSj$bq_4$UZhls8Ou5HWP~@-eSddm{87a5n95I1fS -@{Dh%6^=aFL)xUt%&qMzOSpV0D{S&r7kNekP4Nyufq=WG#*BuB$An&kjA^7rdvUp>GoTLDNL(u*utO4 -heWAqYL1_Nc;CW9A0FVMjN#B -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 -h(@$VAJcWcXcXzMvR(2S1uLFEpe`7e>pn -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 -EO2hC!NwOu_Qe^8RXZFfGvsTL+kk`-pA95H} -n-&~qf@#zy|99bjDhvv$XxV*o-AsiNAbepG2wN25^D_4{-Zbo5(&zff0N$4*8e&MU2JKXXO-N -0+~AyZql={&w}i_m}_oD>wY$GK8npQ44qQP9^> -E8x~hUA4O@99!ZdP(3B86V792Strp05%WNYR^T2ej6~b>AybeH63bh5R?$1IU}ty17iH)bI%wQ#j9uX -N@{r?&@-wNPpCgJ{@A2+KH1Z-Hewka?KCchu&5G|L+R!zBMn}9lYs?Zwpo78f3qToWKB>!6wb&$4%jI -44lGg`?1BEf&ld7N3^9V(Po-9rXa -`>3xMk@5nA0H^-Yc=KyNnCoJBK}ymxZzza==r!F9D5w~dp-Ah?u2L0!8GXQvVDCvu&dZqUSt6af9YV@ ->Y@PWRJjwHhW7ipB-6z4e96GiIzLGM87mNV(T*#XBhq&crJ;Pd_fdGpfFqZhG4DPZh-lB+1+<->D?}= -f7@;V6Z82$Vp}^;|l-{8`+%yQDn8#ICC&iCTsfz(>z;p(r82{i+$^ACLR%oW2N{4cNMM)w(-JaudbZF -V}#rndcu*|)EGoYmMphxFu1VB&-Z!eu?L##d;FY8KjatB`U}fEu=;309~zDuwPmmb`QIQQ -f(ToR2-QQj_JOLq!{`gh8ch8<7X;dCab7UlIOE1Hd++^sYaODQoDzBz^PS<@w*gEx$GY-Ta(Z_{)vIg -4>r3zu0?!k89+LT=b_y($SVD*h(Da9)HtYDLzED5F91$tB!17f^4|}A-j0Vh3^3+;Fo`x?01!gpb -FZBUPDxhco`23bk(Y&h8U|gcnW#O#4f-aY+YlhzEmI0%FBXaOVg2bzl1 -<(7)Pf96GKd`eNXG$2knS2TR%)irp&fm2A81Qk@K756^}t#o%tr(InoAtjSTeRo>9+DSKDyY+M$%@1HRPXNx3VP?D*Jr9)NZ)rIKOrvS -zMDqXE_s^q^K%=u;E9eAtQi2@_%-9hh8yj;SgNt|B?F?^x8dQC5glJIxX&rDx=<3nck=-HB%1eC9Ssj -y}M*r$$p)$wqQZ3C*EDbk(rnW=|&%~7FS@OAkB{Y58nK -N5X7YICha#v*{k%v-!<+^*2cuT8Ry37i(Zm4`wR$_W-`VggQ3s#?%Wl&0$}x}=~yC)#;Y4BI!CmsCAu<4s2f8g|~J&va5 -V#rsPru7`u?yXwvC08(aOHSQkFv(e_c-Enuni~h-4&$8_I>J`6>O`ZPF8izD-v#so(8z=q4UBBVL$9v -n}-}Y$#j%3EBSH*1Vlp(wYD>SvGhl6NCgUu^w4{_GjdyP=2bwT~yyJ!szHjQX(i(S_BcMWJ_a&IDIwg -Nhd?+I#T`$O*G4!JMQ$<}TBD>R_Cp0oho+nsk)MU>iF1lHFnWa~D=>AeSfZ(7>`DBi|n;E&Op-P94^^ -T_C)mEOV^c=vl`c5M1<+h%0%krH&23ZS2eRe>FuNUD#F%}ScvAAqM`_J8R1b&<_CD=!5z4 -7FU-lxg1oXcq_Lp2+Nc)YZr%z-C@J(4up$Bx=~y7>+Ot{0@0GaHu+;`sE8hV@P9c>mJeRL{NhIRP*o8Ztb{3(Yz|&|)KIw75&kT=Nn?MAcshP;EPGOuG{D)rM2M%)E_qlTpB#6Db#q$wnDU3#{gA9M^-8B(z7SNvRgi$i -Gi0Cuwtg8k)w?~3Lu`x9~h)Sa`SlTLL0w3XHq#D&(N79LR4K!b&!hPZONAe!Bj9Uzlzbpz$|>d;6)fHeL1 -w7_94HnX3C(asjXC6r;^TQ?3jebG9Ug$~;rP*R%KiN&nu#K+$I*DPa3dUKUB1Jy!ji|C*p|E^4a6IyPf6 -q(RK}S)gk>QwpNxE2;(QShBbQ!f3HA6dP&b++(E_yTspd3s?$SD$mnQ@gCUUaTmYv|S4i;`%h6fgk=8(unWQ#rgst{VZ(U|7t$y|g{MSGYq(Au_{ZpXc-TD3vP;YVoU!@^*88I -p!bLZQ?0Bhj$=#ras{BVF3p^fl_Hw`By^g$EKg9*ks{0?MNOwH<^o^>Fqu{j~)wj0wao-fvQ_Rh@1WC -&H@L18rLmG+ZEsye+ihajZBU>Of{{Car0PeI2nfbz7c!UUtVq7z?l -p#g%5gMNBXDW4XY|mY2G7Jgu5{kXg8Y|D;<53BxYwhv5IwdfS>&d%O%g{$(dC!Aj%QwrTLT4Xu{q8{B -t74kQ62L|SN8jOVbfSPCdzp`69x|xo9f7X8Y&1Zh(!{ -{WWQjJfG?-lj2&NRoVz&13U8Pa82JS%;BR0(Ej%{~Ke_Xrjoi-lBb#LpoxPQEISbFngVlWakLk(p!5a -93RbP4usiv7M -<-LW}YcoFHLrSGODA6QjUu7Wyub4QuVj{KkqFCX%SApy>L=PdsRm(aGSCOGqeF=N%t>440)*~-R>e@J -Tk~^a|LpJuzs5ah4?-Px*4i{-aAdrYwrSJaDqgYrzGo@k*@;pBIyp*Dg#PF#TP*8O}Srz-ZIsHk;Zn< -sCo}xN;p#t(H3EshjP(tWc-?V!*(A*M8sSr-nz>*z5A&O;T9HlHBbomE95qrnfkCKr81hxOg?mxly*C -YHh++Oi;g*z;m~O%BHu#Ed;tc5LJzFcTuaLiDB%EyB@-)8J29pgY*PtBPRVXO*K -LNeX@rJ>6Dg@sKp2A;ESFP6rZ>rMUjP45HF}@A^rt8kTRnvOt6}qv#D!BeZ_pY*(+-jKH$>Ij1@`nsr6STf#MrW=LsXlST(JI^rh8 -p6=^e^_pRpd|l9&=SL>!Km)GH>jv9CG4b_s(OO`bZ%mz@B -$_Gy2r`$fb^kV8qVcWqeda`?R{3d9r>8c|CBxq -?%36e8Z+*Cn)#5^l#y5-0wa~v{%V%H1&F}2Kd*|$J@9Fu~j8{w6mR3H5;&<4Jbw7)$l;$LC+dcXsV-V -3V%Ht_xxcK@9N0{am^sndK&Jqc=wi&P$7hPP^7Y!$oEMnAr*M3!vRd|wy{P*z%&d;C4`G)$1VLp}0GR -2^V5Ihq;%JSdzgcL$^4uIroQ;As -%A4p2AYTz;dN4X)^v4$=dxATu7ogxGs1ic(8VW3@ME3h^x`<8Vi)NB;%&(EJN3s%>-S0J*@N_dOl)Z@ -Rfe8q+F+>oUUeZJfV5X{5eQIjB=xx7q;K~B=A=h&RH(hBw;!YG3B;*rR>cDFCaxM|X_Hz+EfS6Msw*E -#d@NsLid+!w$iACuSzDJ#ineT_Gk%F8|xuZN3{fi1Y5RBqP6V_XUJ^b*Des{jzr(--e~*J$?_v?HZV9o0wY}2eB)2Bp;5F=!W+(xt(&G)!T(e -$aG63Y}ZVEF`!^}VzP-??MDgIi1GrW5% -YlyBDc-zygazm_f(-#Y(oR<8Q~z<=`q--M^uc)i>@h8BJK5T5#YE!tlLwio}%1vKL)87wRI7|-{tXEg -r^<$(H42W$E!S^1}ml^1+Gel@z9T?_c`$batuKXC!z&vZrxR7NWIM7q#I(sgt^-P=_3xv~mvYtRvLf& -3>><#_3eY%A{gI1)x1WYt+iZKy49sd -in3++Q$V#qcQ0OMSqlN#VshLItecq77*7csWfq;>2Rlf&vP}v<9R=Q^=bNqo=Ayx8FqP2=;Bj(b+}&| -Svpq^(Vv6c3JCrZT@Xg-#&t8(xfE3N&HxFNrdx!^w?e_>S6RZ>{HgCzPR3Ldz%@*Nt|vu@P*~>xwJ>i(Xzq#8iHf&J6dmVAl~n9W4P6~W&2&!^XTg -}Iy8GBj(E{?z&DI5Fmev6{Ft6*i&V_9ycD%ASra9P%J*%nntJX`SGG`+Y<(yCCdHhNnDs=Pi#iq)*7+ -WL#Tvf5=|W$B$si-JGBY1#);FsC@m^mWZaIfUsMD$PAD@v((e5h~u|Dbm{KoxU -bN|N=dR5M=%zWw?#(UatRsrg23V1_ -a5(eb?h#Xo5$t>J&;4$MQ6#4ObafDM$Ie)Th}*&lxD%a`c^lcf4&uAI75sqd;%yAbZ_WhIcBuKh3|5p>E53~QF}`swz0&OmIlO@5sL6Vwe**sB2vGh00DmGZaim}pJ^NZAP}(C -D9jR`fK6)iccsnmSIFOM48IpLbX%;x+vdY;=))^SFTSK*3USg4bEQ=(_9gAI>@9O2ukG|p7oBhG8Ssy -&){jzf`!>K&YtuiPxnoT}0A&4ntXP;m2DEVS+fl$3wJpcn-GbEz**z`wx*T!2*YBihwP112{XiKAP~k -H2s!c2Hm>V)yS8Ayscb8L+R4`;jf5_9pZNn+Y_^j)pqy(w4mAgrJV!9?v&^?9%JAepcB|guk)YPrr_PeVXi;1XNWx+v?XM4qdg)0<6tMZ%M5 -QgJ6jN`j@K2&yFnU#|#Ib|(w*Un;B#9VTN*9%)r{3yy+$W*$c-lwR`%1zRw=&OJ#&nA8p7a&cP1f~fi -l<$x27q%%$`k&(#h -XjtPKf(MU)DXnM{Y3L%hI#taEHU^<4QOR(9DrV-F-8mCh1bnGiMyuU)z-tB<1ADjjE@$g=X{lCarXCc -^y@Oc^6*9oca(<-M0$NE=4V}66K45!LT_SW|ecA>a8C>(cqLi%}N2Dy4d?hJLPd@75y)(Kl}%4{N0%J -$0qjRE+6QNI4+uLJ5(>A085)UtCyW%;l6Q|%}PA`WaDq!l9KimqkVw^eqLez=>h}%yuy52V47bpZ6Cv -Z0)CK6GzGZo-LwxWK90_C1AW`_&!Vy3Y$NaMLg*?t3B!Bks97&ZkonlnuXiSXzdS=_ud1;;fDFnFh)r -;`VvJ**%=a^Pv(6Lds7jq4ZA~!y*@5mTH^!Vr_&Nyky!JHQ;*96Ydfx)61U=srQ37xk>4ND^_$(C2U3+3nbLz$=P(JaAyvtC(UmGYrox+T-1A%(Dg9j(Wq+cf@m -p0u1h2lIDZZmR6(8Sn!5n_~_Sukp=g0!O1iHh6xVh2=S%FH}I-@0#Ju6&I{1hMk@NlDH|H|Lu2=2BP)__)hh(w840ddrBJ|$ -q8f{_*EAb+B${6fNOv3HOZFrB`{z*`~$=g2HKm=RnZF7-}w{eEe-96m1g2=|qw(i>Tv+v7ZK-SHY}*M1Qc;qcOLe$~=SFHW7#)#Yd9 -}}Fn~CND<}Zuf4k~H|MwSWph6C{Xld|t|j5jarOq9Wr^!FF7RnI$!^%RN~(85G2eQe|eWCQKCU`j2_6 -$(+3mpD!fCO(C;9(!{wB{GN3s!op_rTUre;-d}Jw~?gkJ_x9j(XYhrp&wRc=mx2klR)U?kR+G~R3w -x>KA%KhXpTNmkd$g~S+&!90)%~flVtp+qxIv2U$m08Y}Y#7o$H+ikA>E(k?gzD_>90E%5*PYRe4V$r5 -`qZIK)K+*o1fzsU@ibJI#q2Y_)F5Pau*7^vaDjdp?H>^^BZOcj-hrs~e7KOfn)T0Eq2k|8*cE|f1T`$VP|su&i)^P}1ytaTNh(l1!o{Krze8KTqE$I9$De_}l(akK9k@K%afB?I2BBJ|uh5cBwW{5 -~_9iJt2HDz#=jHfe9)`)Eu$qQ(eBpZEd(kbB!k@mDHlE)+%O%tL?r$klk`^Lkoc{^+rb)zNzBvd8|}# -*I^#*765!zrS7R_(3Q9`)z=)MGN!7F6&w+O~1;9Wg=^nXm%7Aay)ATgWlZNtiu5Hj-F^|gni2kXe^j3 -;iPDkf1D5`bLJ$kAzxMV_A!v$Ox(sYDCDVBng@!TR(?rpAVwM-p}_7wEbps-qPZ@#VzfJl7jw8^&+a) -U-uym^4-!@L32mhY32*mx2^cQN%s9pXc+}7l8gY?qbga~#2b5aQr#GuH1M)0Q**Xexeivk&bO-DR6NwP?+}nrjdnKu -_R&`_S3hXbKiA2=ZRRe#SfVtY*XW^6)~B4_fk;TwhPRY)WT{VJLi_h*uV~H8}x-&xvC|+3FIfZ``F1g -!(2GvdY&VGak~9a7N= -)mrhrV{RD_lY;O1ja*xG-YBW1Yh(v3%JrQ=-sl&Pb10>`Z5%9qB#;C54h9GgOh`GzP)8N0j0cy@Gczl -R_$E^0{EUZi0eCY4o7(Z_Po)tt$a9c2WjJy0fjYKnNN_TBWv$M;t6iVko!FE;?!SBIbvSlbJ|!zIXjN -88W3eF3qeAfG8s6E)gj0bXwyzs;SGF;WW{plBCYX$6iDnXJ(I&On7rjoe2LQjgcb(F1GN`?gCBF6<`V -{--Z>AYf|K}p|C;g+BYcnC-O26OCfi{7N_v35%cjKZwi~Q(6^lx_m%5wi?!=Eb2pIbm6TXA=#xMZ;L! -<9yc#MW_@61!b6wKZLD168|+Fdlra{zdLyMd3zzQ)cVnVv;R+h(~+VSF|;K!Rh8ONbKWVn^sq}B`ANH -g-mt>img%{Z@pscZtyPpwO&JrZ|O{U7efv3t#ln>8xuzM?B>dNF=qEA+H2Jmy)o~V!{fWx@yfi(t+4% -hRKLmA6cc=XJbWHE2^^2>>&uMx-8Rdz^sl3RA96v4vg-0QK)5uZ-g -hSvC@LLzoPq!8ZpX3ks3nt=8Fkj2MUh*sTS_2xn<}Tiy(e6e&^%@c+E=aMX6f%I`fhFowyviiT>wNaL -bw@&Bapvfgy#`a&d=nZ{rY~+a+q^#BN6BYO5>({7cY8qwV7i#v!SKsvRg1TR?zr4ik4l14b}Mj@>L -Duys*qqeO#9;g6msg%#w#*i+aummjD@^8kLLiw~dK^UF-@({`oo%rHvp&H+qOf8JP$UGEi1n2FJz=8s -1=yqR=$Dy|<#Ha^^9#v3#~ZlNT-=Y|=S0@XMzQFp)__3DEP27tE~IaKiTdZtbDi4Z|G-mf__@n3b0)Xo7fh7G}&!?(oHuAr?>SOPd48=BHI2*ZoYKCQj<)nt= -%Ufx12DoLobqXBGE4llXv-H{JOkUp -`eoIYovnG`s@=a!WC-HK*&#|)Q7vXBI^82opTE=Fo;L5e(I{9IH1kuIldwPWd-|l -YxoQo*YIpX(3mevu!2Ehe>lr)$YAkyGMPK{7u^iw}MISWwdMUhk9$2I5ViCOi7$oM*a0S_;?NGP}Ho% -RnA$FRKLZ)Ynak=1N+MF&Tg7y+kXo{2+)H*P`$~tOYp|^&EFUYPCTAo8YzCL<@XzaoTz5Wo{@F_1I&+ -A(>Rv3U>0v!Uquj7+x=X#S`_kwm!N_!%xN5p(LfNxr)Ismh4*KW3OJJw9Skl0XjyxNb?=|Yh9cz8529 --Ub(2hGA&7PTF6Q^|NQ>MdtM#R3>kE%h)DE*u6#WIvz0K%e`Q#7}sEoQb@7QcZ*_(nKNmYvyv~RqkOc -BiFm45Q^9R4bTsN4)a79ALj+*il*1juh_9#PG+;nO_WD^0vnAj&VEzkadSs${j27~vh|JwzYu+}z7E# -%nWI#prE#G`T-gn(@FGzlV#Fb#ZnCtKF -xiI9A~A)6Z|Y3L^9%&=i^Li4~`oIKr&jKfXlLs**F-U_fx{O#4I6Pmil6A-c^O;BVP&5T7wR+TPS$Xu -D*j-0zC){K9GQ2lF71$Yn8FwtlN}O;>wsv3cf~{N$i)yiOk*)%L=%whfzjc;BABS>kqa}ir{fuP~g@& -e#^dUm-k_vQNuB|Ah~#*c(R$pexU8yOHuo%RMm5A4MzX_%YPpP{cmy7{$?cW|Eu5;C*J~rZH@oz{hy) -XUmoKdZ2Z~&KcwH`?LXwxn1qD4X_R%@U)g+=Z2H4+v`v#l;WoyZ>}>^G5}n+pQlrnMBi6+oi8tWE_J- -1Rp^x@vR3_X4ob?RrA-8ye*n)@^Pf~o>qg$7I{8!Qu`*`abS8R<8(bil+Fxx-TU<-P-I3(G-Hqs3}Hd -nmeO(@#+B)p9O;m8TFh2M=DRvd91% -)0wmGrR4hAVjr&5BH8W_pM+2QTy7>IU#l|OLrjVxpJTPtljmy*7+V$Zf$Shl0e^thQwL7qZLoo#SnI( -p~}unHIF>|af$!9c)DPYA0K{qVw2>e?wDFbW?e6vNoe!a;O{q)LDBZUA=@1hQjo{Qt?$3-GNlHzcQ(u+-GHXo><+T>BngtI7nYkWcbh?N$ger50{np22=0` -Au&7eH~eK%6BOgR$f&;1Q+CNj`D3dt*pydaPlNt~rS=l=fvy%^~bb^G3vs(er4f#Of^cpCW? --r8^~a$${2&=ypo7fpx-e4G21Xt8(TVt%XkTe>QrbawnA%{_*rJ)OH{=97sb7rs2|A`9NV%KWOlECB>=UF5 -_n@zUVrEBG{@B8FggQMo>6z8$Fw4=L}JosNJpW-+j@~&wyiB0Ha}!jg@r*lMBWTgH&z@&@mWUB7}D}H -D$Y7o!JagaR*=LX)OiALfHcOdQZ^WoS6Acpr^F6fLu$_^oShaJnP*?&%ld;iwe-G>{Pjib%JW -AyM#lKAp7okv1t7<3X1){d!jR!|0F7MY~#28`b}VMmT%hUZx@+gam>Cazd4t6N6Wd`D^~Sm)0SJ_?cV -p#|3J_bc2mK11+W~(#+-IX82u9&3gA+JP(>O^pG(jLFMNkyEDa#_8)GYjIR2 -E`eAKoTvM{V9l6VH^_5|DJdK7FkBk3Lot^dS{Ev#E%Z -_~+(Hu#On6}f-iYq*{oO?P>RcsnS%*Q~cdk=P9RFmjWYT@Sa?ffexa{cxKN`7SV#?BOLz@1}jbR^W$2 -;1;A|o4M0p&5K?)M1_NIin7)b*K>qr)zGxy`Pp!KryL<7KAcTzO_H!e;;v+*JbbcaF?xk^Z2r;J=&UiJwBz=-*S7Bq7p%**{h1%&x1R&gZ9fNdk`~teGD -~U;m2nRhGh3Ixc9U}0yRyGvJ@5tWoj`Un*EJ-kvM%d)XQL#s5)V<`eW%{k*|PlOS`Wn6y+pX%JndtC_ -KyWC*R@V64`-GrIi_O_(Syw#I2OKg0pRbD0SqL3@u0S0brp-2ep}h&fwS59nD-{pk7Ym%bHaL^Vhk#=>MY*NwK5`_+8;Kbnp61Pm4z*~utpn%LFsRSd6gKj -U)1Tb~mZhp06=8NpfxT8d|8#GIF;oWt7cX)nA}6Gb-xsGn-k7AGSdS>~6bzjqgIL1s!Ma^n=(!a0Fs_ -f+@pxpJGd`c^@a!KYvGNkA;RF;TV~OJPiz2y@Bc+|KVoOb)?|nC3e;9ol3C^r3*L#7|t_dTDQ??*&|PadFQyLpbz?+?s&<9rcg -dVRDLI-vWGO5BFV~ddKQ#)u$O7~HoJ7*^inl -Jc`l(@O-_hRo>&j{~KNmp3&^&SCrqdw9Dt5?TnUZ2e21*j2>6d^xoT@2MWev6h%o2#uyYu5E>^i1YxL8g&d=;{8P+)&K9ggR*=``0Q4SJ9j`_2X-%3UCj|@_P|A!=9?1VquSZ)k -|(R -WR>&)U>Qx}f$?cDNe|#?MBZUruV| -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 -f7|VoeBe{QM!v350+dl0g|7Mo=8ZFbXG -N1ZRkEkx?N6`ik&3xx5hclP*pv3I&Op -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 -`EGP1qkP3g|;cQwM -EkHv4WI*R0BGF_u4U)Ar(zv`Up@Lz;O8y}|EUmFL&1fexbQ-e$dzgpeq$z4TYG&pR~b0)ea%pc?)Zz< -}4R(VBXZ#iWnW14zYus%ri#wj=y97NV!7onqS!l6FhzapJMmm_wza3iVi3JqPiYps~U6W?y*hyiJ7X{ ->nN8R$eSMDW-sBW%2Op@hGRZ*~=cD=0kOZKHl}1f7>+-1>FkL$x;%t6ir5la7^=w;A&@URd6Rq@emSyLljxfc7Kor6;ew#dbkjF=h1guh=uXPo&*FCej6B1q~9dl@28}Tap@_6m)!Y$;xIx#GA-i{mIVmxs9aWRbFCWe=GKPXfgQ1Bk`o|X -mb*BQ6GCWPH*i`RLU>)@zeJ)!I-Iv(3&yG2h9!6rEblgI7N=?`?`9&zLZU+NQiBC}}N -N10zoF6S@x3eZp^Xr1|Agou!Byw>U=Fje{uQbPRK@D4+x)&()%$#zFe|5IZzwCh4}f -rQSMjtOw;6R^x#IS}`nEGSG-P_G$+?jTZ$~W#|7d_tY`f_Bh4==8qm%#34>w+h*7K0 -Odh>R-)$U!L{Wq69&jR;S4+38-hqIHi;`Pt^Mhr`NAi&`XbohbRI*p9FEO)B%^EwBr3ar%eo{2#EH|H -E_s&3yjyd|xdoMi3Yd!!SkS2)qQM48l+-PGK;G;TS~&y=nSe7MJ9$hL8e)IuQecWMKZVm5PM`vQ;qwE -b3w(m#FlkQ|#|03P8-V_L5`RTGU{GB?}YKNWNG>X6+AO&bq{qNC;>T<5fliC4Pk$!B=bt0febz3^26B -t2h?G&r`r=F5&WWmULx@S!^`D@+yKF2n+&EAc+-$9yQR`PW?%*q%_Or7YmLo208n!Azc}ryH7@EgYBO -2p>9;;@K~1Y+kC(JRq~xbEO7n*mLcsY#rR+{Ieay3^76Tn#oa5$oEflVfgbLi^F{pm9c+TGM)W=6d~X -te{4ZV1}hto_jtB#2*aV)gJ}VxV#HN6Er?rwLnkdP9xAvA29;+S#X8{%{Y#=g(+#_W;5fkm ->ke)U`p!_^*&E;u})MXxuhd@XN9}?uesbmTa-359kths0m -K@jnWC_ov&?vM1!RAZLYD-X@S7uneB5(?4R5N#nrQ2;uhV%XV>-1;(dKXC-`@+73f>C6;<3!=vCOLjK -n6Ee<&K6eK41RABFdZ@I;;rU*kd+`j0#RLQHb;1>$`kdYGQZ(CszLLGH`WEJgA;!<9Pi#%De!SJrUoy -+UL6Ky=-so^|O~bdlRoY1;XLU(-TRW%3238WrJ)PQ*!6$$`P4l`GYyd1acme(7Ya(`cisySAQB^6i$F -3dRXI;z*h+1{8AHL50N}wNsdDrhl1_Ss9rAYo_RMPqNHLYt!hW_a|9AU-Y8bq4`s42h{Fseh{)17NhH-*f3?mK%qH&U@NEoM=@RA}J0$y{Ue^1BKph!=@(T%NzZ -7c@R$&3QoR2Tz^&oEsTq|wF7d}|P?H=raAP?8i1Z0Qm~GAPhYS_0R_vMqrhiUG2*B_NDZ0CZ$lFhCUj -N|z}Ex!7eS^eV>$TCqb=gC|HJae&|;ZJZFm&?X4bc0?i&UoJZ=;{=V`A@~zPgKTcHN-ZpQdN~!gYBj{ -sZw=xV04Q&t07{dUUB=p;eDtBWOly0~LRgvn-{^sX-#bAk`$zbqS;0}i^9KwC8tPoUYglY`wu -(!JgmeH(Aqh=$W@kJ2yp -VEl3?-5(MVLBlCpciOnvX&l*y2N68j(f1_e^*h3QKsz)jjT=y{@lwi2ZqZmKhL?cRUW{5Q1Y|gaVZ|4 -45OtI^;T~{*IfYn=PQ&ndelJ-eEopwA9r~Q`CGrl$;d~$(nmrN2jd>WDp27YQs__oH5r!#uZb3tH -w&Q8^xqW&qEjfGnG002wnj~0>nD(IA!TxqtA19k2`a>N?c@>Pu{g7c*>kRHrb+YNQ*>zltA{pc1;&DllEYgCjP3(e8vkkuqxa`?DY4dI~Vb2J@8bDpLV@Yu -pKA9G`8=q1S+`oxizyWJwPHr)$MaXILE7<9~A=0vHwrxjh5l@-%qqUYuEc*6Zfg#VhOtkpUKF -2;{Ms1&jsHnRXR8gDqayQTaJYux$&oIuz-Xl2xEdyP|;Q)G!ZJ<#62jBeH&w=5;JM=UD`{A%3#f(vgp -_Yh`A~1|$mLC|g#Cs@7G9*F67`4QE1o5qyF#-(OV%V10Yq2PcNh4rjDv*`U1JHA&z^;%P=o^TMZ*5x= -0s{Fr$}M6|VPj57ozPM7e -J`NGHvQ2)s)9fSe0&iD;_27`<(Xj_Ou_I3#rVG2kx|IW5qz_wkKzr>7{&6Mlmz~`VWl7qMW -RMuVtb2p@EQ2gG^2bYB{LQj%+ -14(h%vGfO$9g5Df17u-_|Dv@<2f}UlkbTi4s3bx~)O?8#b`RNT^_p)70zHJFNw^PJWXFYsSyDq*KI1{ -Kx?Ky0=^LaNx6c@~h74^s6nJ^fE-kL>hoc12cxM7XM$zy1$M;!SWEjsL_yQ4MrJe3sUv1NSHLjej?!> -FIvZYV1c-<+A6*iLNq0cg^BZ82QG$YHJ^C+KI1njiTsty>?OlqyLiy4k5$$=g0TColdV=H6t*MlU)EAqf!Aa;?rQ)S1`p{`b9#4|k7@i1f&aJpV1LYnB-qi39q;5o_(e -*IqlQtq>o6o;x|f_WeefW=0>!wrCtK#hE6wO?4w2Nd_wGXOVK-y{PVzl)I*RS43E -HKRT3A*n7t&lbOz=Qye`{8)CqU;{(N5;f5q)JJ8Ql53z${v)6n0A}sP$SE9@jf$Y&4+w`MwkSCA<^Mg -o_pRLUV@ov*MtwDC7Pg7+#g)?N+_kPye(S)l5j)Xds&<8QLT1y4K%99+nrK6$i+_fDfQ|e&6>K1o|(W;#(y8|eU#6_Nn -^Nqh~u-UhKO__l;wzzaHF=cFL(P?i{^5RvrfZE6cpF{^@wT6^5kwSc(9Q6vo(vm6|)$;;*J1Odb_c?z -1~NEnpumQTu7Bkbisa&_a1NsvNCau84A@GlLoco0<#e<-5`j|}-ols>TPj<8)`x-B6Td-&kX&fpmB!#_Ns`mxK9YF34i%R^P3Zfs#5&5D3W_v-c*rzO6pu+!#n=EXGGa&jnD^QOG -kK}lH1j)DqZ^2*>oZ5}+9_5^o0@=?dDjf5Sp%2Pk~{EhMF;*2<*jvyX`&z(1<=_4AoQ?v;cC}%6R==- -e06XxopxFN;-ecW-U7lz>7b(HxM4<84e4a0%Fc9NII#U*DhyD8zj8jqmpEb4imQUp=?l@bo)afn^b+z -=_hSLO^K;$FU>OUNo5UPd*x_V#+wSY6A{NL-5Q5sE60&X1=~ZzDVD4xUlQVtVk7SISJ=A<$l5r;{kEp -(@f(vxa|8F)H#$hETND3?U~eTpu~e0ER83>!WPfP=dW@&E+=%ugco7A=RTd2D>$u^IZ_aaqN-P3^Dm( -pzGrbeK&dVeV~1)d>v|EecLr3o{S-pnS11$gbuGy;sc6&q7F~R$AGl&qD}s!%E$9r5H=@&Hq2W&OH`( -At_4+mC0x*-Du=s6P(7j-O5+kS>&wM1j9}xTgcS4_t+hzD7-N%R4jI)9lv_iVYHN5ZUi;cbmexK^Jj~xZ9~ycZd`gOh>2amduP-x$TQF2+gD#pQvWyeA(lusa_6tt -DTUJDyzW|%+7}Td!jS1=V*?n`yeG1UR6$uR^zBuDjeMPS@FNd$KL>zh5~#{`dc8?~b;+K%&@W^`pOD${OGy=r5|HFG@ML+2e~ -7{qsMX==IP4O#b13~+SqYynejvDL*h2SN5iFEa9%)ZqXE -vX}DLI>c?$FZlb>#oh-Fr$(pl0p|6%s3Km_>6|6 -b6wuBDCCeW_w#mDdcmT1*n)Mw=+46}#IB93YgGc{eq$5bSI}(!vIf(6e9zb%fi{-Ra4QE_d0!N9TM?P -Gn3sJFvW6S&h+w`7JTkjdmmt`e&0XcF*#y*&}wu+Q!n^mlI9XZH*GJ2&jJ`vv{%hW+jo3}^`%JM%&bwQCyV) -CRm!DZcVJNY__0*EOeL#=ckFV>jF~ofk4xTZq>~>fkb`ZkH^FG(>Ii`y)loQgFGHDSMwkjL!aHo<=81 ->&JvYPcJ@k74Oh*WW=(MaI5XqX>)2qF+D>zc409c1RdkShhr(1hGVwTYL -%lAx-J-?UWqij5)TN*c0q#72VF%c( -v%L=Z;L*vWJguc5CLi?+4f(Lz6Q1T#kh^K|7FiBhk{?_S*5LD#Ck8{3APH83H#3?9ZlR0R91es$5dEq -Um!DGmGw2?xhp8oApynm1c6pigXDCD7Sf)k19k&e51_qdOGoLoVF-qe?xd5z2 -scj;4UhKdnwk5`jK@p(yD{tVEWa=FJYWWhH)>OUEEwJC#+Cex;_->DT!LO@0d -9_zn0)@zUS=D-qQ!hsIHKMsPX>X>JIe6LM9KYKuHQo@kzSbHEpG&)3 -m+Wo073F&zf-i_`-?m-!R$)t;!&5{~}+3#Wefn-@eG`N89uI16Ka5P5L*E`K}%MPy2s|%NWj}AjwQ3G -)yuKg3_Ow(JVpy0&gj^!rnS%9g9Jm2&l2Hh0i<(^GTN=9SnuXKF>GPK!SwPpj-*2HoYaR<97l;t;!;t -05kwwGXcyhF+wSzm;D^7L3d0F1VR}D5PAV!I07kfECcePWj)y{g@OsNS}mtvA(x41CK~3E;%JeS6^sO)jzsa1QjuaVm1T=dAGCtep|&!Kjs+(NBCae^xl2E<`|a1Tr -uo-`Nvw(4Uf>bOSMsEH3+sG_MwW&>!U^auR4^Wj~3;AbA0C4do7%`=gnguQf*OnrzNlcoSrp}7hg9z^ -fKNOh?8a@R{3&o4|GdI6scPyNAsF^JvLXm5;wusXZgye6S>2!YDYbprhII@c7)U-2x0x~6$P+(Z;n@AQaY((%y`lQ<-oGS?r)hBz0PUv{re+Lg7o^Iqpo0+F#n@91G>?fur -jZ@Gun6+?<5t#2QnJKn#e+fut^cD3h9kzJw{c2gsvI=d;ksp6XmWi3lbk7vHy%o$dQ+qlLWSB>?@Zu_ -uBL3%Ye1AVA{zN?F45=p)vlW}#~kJR5E -9?rRFUYvhfyDIYgC^QbdSp(+hG}NJOS5#-p<2+tT)1-;l^Oi^}kMW$b*gDkg;Zg=~^3;!p!~X2&!}Q98LO`8IDUUp{**C?U%zMZU7EUQhPu%S`GS75=95A6O -_Bg&5iE^h@7p$O)T^Phg#^^;~a?5jMs8crC18|i7)^s%C+|4pbojC?W1g~uy>2I?U0hK{3M@x{!r -5?-#j<30g?~y&COZjtYuy--lbGOUGPZ{l}s?MaS+G -ZskTfS#}PO4ZJ_pyZdg!!#NPU4$@Py$;?DX+gs+$1hy~Pqgp5nAuqE4<$BYF_2tETJ|z4RSLo`F_>W} -yF51Jzk)E3o3JsCFJTJSed<%s8HV6*t;KU34e2Tbf$M8!g4h$~&q<*W0azFF~GO!z#-_IPnIX@ndmC) -QhYw?#KFE6Ng-rsDPuIt*T+Yy#>Zc`B?9_HGAfv!1aGi3eWC2YSs>d%zz`y;+3Z3G3w7>&UMh9DHdFa --Ij{w;%nj2l!r7|>Rgyv>VGK;b=sL3)KE)Yb2cUhinELWWNbMi%RqZ@5`$hQ(3G43w#HyUH -4srid4R)!8zL!CqJ7TUmSe~SG%QD}oBBfA;s~hBWDKK#Di0@D(Krk!98k^WYok~WGBWTw -L?uhXA{P3%aLR?hrN8EE1E|c9{s(7MkJI4lh(qb{{Zq}G{f%QE1T=3JTzs#hmj2*mz=qrYW*QPZ8Ns( -K3IcVISP7e?{Dvug)pWCOmNT;oo6V}}{&Cv~**_Qv{@v9;-;uh{R`Uzq27PNSGaY0lXH4A46a1A|LhJ -77X`9jJCfz4-r&pvmE8g^Mcevn@IBvqm07)~PzYO9k8WP^0YhgDDq^`6A^DK!-Z#=rN#csY3Th`H)K` -xI@P6VeX`PlfSNX0!A94RX{m3Fi3GRj8b%Z){RQg&WjZh7mG5?{C*;!*2(y`eD8#kNZzZ&Ypx+cbGBG -YPuHtk(#76j+FI^f|uoG=)^n$d#(DygrFjq$F6_?36jYJmIP?r~o73g6v1;QcZ~hk?e6tq1Wlm9NEXv -y2S5FB@RxT -wSTU!NM?P<3;(TKx@#&n&(_DozS>t!r+(HSh2z$7=6$O26smizsC*jOJh5JlyI?e0Y<4t3gLPV1b+}d -sLU5L2E140VrTI5F!GOk>4Cl2hc4+5S*HkEsMiDI|iq@Ju#t#e(doOXLrl`ywLKPenD&2BD@Ay2ED*j -6Cr$ldMzwKH+wiR6eb=4zA8^%F*fQQ1DSK##g^xL&MWj%7uEF@X&`_vSK5&eM^PIaHa_^Uh&s4yRS6Y -m+2v40LzG>`Bd2Q?f7Dcph(RWwDPLg`X{f8FFRF1(`@;FUBN9lv{kpLG=Cw@;V -duO+V_VB?M4_Fd4sy<*h?-oy6o2AvpY02M?EDwJP53L -`2CY`p{{nA=SmhuW8GC_C_<(Efh<6>ABkcWzFl7+6a@5v=px7GHpdwjIjw~}l?{U5=_wwMJJIL3Rq_# -!mcD$wocWVNT3KWcyYX1`E{R2<#qAa}neT91q`*;f9~%LH1U0iOw5ZK2>a@2-2Ei-!F -1#A@~%HMiK8%E9Xt8UT||gl9b;S)TC7qwt@0R8q;Em!4#U|#9AH#Pt%bZzNA$73+;aKcDfOwIpI1FG+ -FEE@Ja@L-w0)YFQjs_iWCE9_on02=61dy@ST(fEsknKP|90i -gnl(jksy~e6xq%41Tvdu^tV%1*RDsoi2FEFX^=qD8%~R{5!$~{Wa->kj>>pFhhEn!%+ZK0WyE8oxzigcQ^XX -5C^g8TJb(W5MQ+-6$hJOaI8VzY?o$Tj0NgIwFyFe4S(B9}yB8xHxzg4;{SI<4~v&4MwN|Yy_zs=j^?E0pN`PyFa(~&b@cLhV^ -ejsxH!fCz^cKyv$eAf(!QVflvBtakxkzz;;LvakjXqdz?lA)31hs%FIBYz7+LRa$iX88isAm0W^6$U6 -&3coYLWlKi>BhEh`V6%2iAPCUQAnPQXm|h3Ip`bRFt$hv%447C-0!qfLpRlk%=4Wm7%a2oHJ%$9iKm= -WTFk(PJ!BkiTXhgHMX9EnIM*!hlcFSpCr;{;Y9Sao&jfpX!h6n=|lxAxKKD^M%UkXHXP+M!i*48X}_d -=op=^kg74A9qr4!wB&T$U4jCd>J5`iqTv!-q8U#~G^&^}0ge?(l63!Y_>bzjo3?MwNWmN^e%6>=nF>* -(JI5Rl^xec@%> -t(z;zr4P(HqtCqi!gA(nsj95_3pu-8M9c0s47v@y&D@IP6I&S0xMLvJk9XABH)B#9FFJZYhork7OuuB -=X=bWt)CD}6!9sO-AaR!8o|5Zxb`&vtF1rU63x%qeNG_^QR7T>;sp~D5xg?q9?0ITu6as$akD)|3qtu -LQ<(*2kpBn2XAk;V|qXh#=_3W)clJUKyJvz;_Yxm-G ->nhU9Ud%;yKs|fy~}Z6b+m+^Sjw>Y`y9G&{AYgbqR`FdX$TXq-0}yrm11Xj^k{g|3_|^jx{}n5`D;!e -vwdKK(7rj*#-Yj^eG*MfR+Q`h3M-cm6GjVxNIpBn8o#aWptdVwcf8}h^l)|ejL{03m2B-!N1B>9#r~3 -o$T50cqG0av!px6tCN~fsQ?7TC1M_&>)SKJ0cXzK^-WFS4GELu@OZVcpFtwYOP=vPx487+=>+iypiaf -O;chGe=z)z(NUR4pcN%Oi~D$^lfgB)?QSYq^8%VZHMk@t$Wzik#p6voukn`9W%$J4;8Z8=C{}7EF*nsZ==B6O;;CUk0eWryP~nuEKV@PA#JIO?hdIRG -XLop`Mx-)XCxxM`uFQfk8?CWvacZXN5}fx5B?a5`aS%76>$jVP~MjV!Wj6MAW0NB*kBY*Q3%T5Fav)IuM0vY(b{~mPJl} -?P<#S2UeUFm5CN4dWEF{|^a69A=T?xl-C@nDU>V3@ybX+{ae#6-4a#Z^v(8#bK(2;NK#BuQo%>lmj84 -G<&>ZZypnQUWA#e!{RI^A5uoWXg+J#vSabgslky&eI3lG#fi}=> -=Ja@UWvFNd_8d3$wmkC5n$qavEc4G#q8!|RP|a|YnhiSf5l`HOdd*4W~0i?b0P6xD|FCWqPu)7^Beg5 -#*ytCA35xMAGu(J%vt=V-4O(*fA5|^Ki-tTdrzPrZ_3}jC(w^K<#+DMx2hEA7cO=8>p`Fj>Ed3Dtey$ -q;fDsRaxK<&$ajWlp|>6*>0a?j_mo@1vy+7Mw!dW5`ZQ7wXGp?rv!=bnpZ@ksD -5_TmNlQ=GsUQ$cD=ja6XlC^sE*s8%QJ)bFEibb?o=xe>~Ka(5_0P8E@Bg)g56CI7g#LQ$w^J7gu9Tl& -b&e`Y0R56YR|2U!9AZl#w8T<2JM^|gKLm^voTb8Dz13+4lUkA`JHf_AmbyS&0zLHZi>q}xomv!l0OM~MfrOPi%t3P=>YXKrDp>?)#vW^7)+T&Qq}!z?DM%Ziu2u7;%lg=Mz_06Pj&E->k`DzdSfjoN||>xDD|>Mq3vyAv&_GXGR;)egGjG~Xi~;mR*#KY2z~J4!)JEc7^6d3$#UC=M -qIXKMMCf}6Ko+}iH`v>g;=m@af>YUTEXcIoX3}hf=2d$VHP}&gG+I5Km29Pg&CHc -HLXKj7~UIR4H(=sto*aCTM4r~aJ444BEBp^Rn3VynL4vqt1Z}u}!ASMFGFJV8Gt)_S@NuuF3hF>lAmS -~?@t&A3Cl&$`HtfarDDKKb>q@I6d0nFaMlp#avkDcmO<}BZ-& -&~A~n)0eXf#k2vDhnhxVY6V|T3`79%x{DIB2cpv9Is}hFMH}H35xeNapwB?cAovs -LUX<6g;O!YlXCAmJ*w*8`Z8)37vbiy0UDpXxh+n%OADW=kcOOn6cx_UQP+mi6&Y=R!}bKYK=4Tt1+3O ->YPt9n7g6hd?iu%RkOR8y=S=w4 -mnQG>jPvS`OuJ=KJidY?si2lna-H&n+^ieO0t#4+WTB8^ox%}#(g+FtlAtj?{2O4la2~l?l(WW){B^H -=j1>y>~7Yc)y3(KuGr=xt0?o~kaBfVjxhpo!|M9B_5YIaclF1`Qr9+iXtDlQQ$?hA!kA&vgnmT!>uLB3`ZwA+0yDkJExr1rSk0w#Aji##ksY^Wbhz-dBx_ -8FDUOB&|!`cH+*uA7h+~1ru)A$FnY{MucmL`N38fiF8e8Fevy7!2pIsrGS5=tLtu_{{#71vSc9;39_2v -uL757m6R+*1jc{`6OhV~z<&a?FQb6kq!^$!G4Z~BAX&kIz!+H#4D$pOC~^u^K#24o)GsGl3Qv$Mx$%F -r2p{E6XJrRQrChg)c9@z!Y{iZc{G+YKJQoaPJTFh2ri72-7pWqPZEzwB(v*=g?L%nxfN#W;6656QawZu22oC}AH#W%?48QB -r%@vG#u%CoP)(hJ_H7 -pK^ERr70w-N6-$HU`pX1nVWD??iFEijs|m?!4<2MB(9fCw-^Yj6=;up9ymR$ne+d5{2Fvoa5vlgquqI -QtWw#Bv3K@HoQ#*%vw|X`V=TGaGpqQSR}9L1c*CV1h|-(QC31+xZ)9boHIf+0N5RGSjjWCn4;Oz#Hdn -JX$%*TK+{xT9&+1db5SFQ#YJaBVi63b-^?KW_i;~&+gi@cs|tWw#Ag>sVjLKPqgY;Jt39l6G^(hBfIN -Vw~#>8PhJ;>t$#VR_EoF0{pIo+G_$fPO*iqQ=AJq>Xq7&!-73rjIS(&}E2Zpk310^X;twyCj7UA-h$A -DUn{5)j&=Sq;h04c!T)`eHyfyW$bqIAv4rQ)!TDnqq!7CUeVz41heJIbTOd!5)U2g&$jvl`AjVK -BK6D{-4l$}tJ&tScdYAN%ul*uy+kiGQPMW<{qDANs$Igui*<_gMJHLEl+7QNZ1v1cPBP1SSxIz)=iEm -XMrYf^m|eXoC6Frgy=t90y%30Bvv}U|isF32zY+MAr*E0;q{V$0+EF`P}awivYw?s|Is{E?_zcuhXIN -b)F!y7RNJykW2!6@Rv|MU%P6MpQ$o|10uXO(BNRdB_v<)ZGpi!2G#xrQc)O8c?RAaFi;YJ7FS?5xQ-f -3fXEa8DG7@A%cU*Qx~wc+u{c_;?$^#u!wQCf6y}#$s_gcaTV5NJ;SMT&sBYcoh56mT4u*fY$uFoTyq@cSryO-UeJaJfcb2a328QgS36Q15{{JDt5uF-V-tS|9q37-y^3hRWgL1P -GyP!V21FV|OSF(->(J~`u9PGCiGD&3<)`nnxI2S$){ysvxh` -n5SUslnt)`bA@p2_SCFxDXmmbWS)V|ktmM3&7;@6#cs)^I)a@s=*TQO -T9-Nm1!D47&5Qb&fK5-6v2q2;Fjc#c>S>+sO^OP0G03t#p^!B(Hzj-X@P+U43oowiZD8*_WFq$+l{eL -C@f-;K#5;gf#pQ>T|0@k^~v>1ydIc%U9cZX3c6ZQC>;_dwDon -?Go3Ph6Ut+)GY<}ywp!^d=ua(m68Ci^EYGq{2vhpveXNtXKQ4OARwO&V#OF}*r+vuov#-B2$&KKj-nF -)*)RdZPGl{$gOv8KT_O|^5shEl7_8$}T<*Ts;Ou>&R5-%cadY@tslE8o#urwy!Z?*+9<`K3JYip`Fb+O;Tp>Ivv%r;*uhhf7*qGKp3(|tV2NT%rNAeOS$llAa*|!3xWhvsA9 -s_@BV@#_J`#Q?(hc%=m9AV@D*&+>KxH!tqV|lYQ%RRUly!#>d%f7h>f1O4DUF{sGlENadmzZAF_JBcd -BE}x;1Tfid$1K{Nj!$JnJ=M9uDt)HqX5h=6$A|snPF=lhOeJZWGlZ{QgxlU0z(nPnoWc&}`_ajjNEqR -#(Kfb`NqBs89LGtKXLn%F$4CjDRYNNpS!o*fDyAs7okJS3h`Z-g+0)dN4I-ro)x -H$V(J*Rv4@LMm6+2N&1un58w~4D9kfByhn2PTK89bYukv&(Uk^TxUH0mLKlY_|9ptCv3FTg_4!4t|3C -+zW?<}&D=bLldK*DizQR4o%+zY)kZ}3rzNjPPGK5OCU?D32CFncWb`0y^wi@?4#- -A5K*Oj#t^f&(tw$p5L9S)~C)EnLmA3pl^kk%g(R(FUstPuFTqP5R+*_Jh1YqoYVkv(!D~6`-SUmwcFr -d9~tB2yyS%W#S=2=&IqJYV|!aKbn#fEQ%v)Ry)3FXj^y||J3uPWa3!H6j_A{L5@*j#*c)`g>I?cG_t@ -oSMbr|IF -f2EBmr5&|bMs6;QQiKJ_W6#Q5%XQ8+-@1%DF^z;;HhrcbNR9FKu>BhaQNKw(betH& -b@0_QaUN0R*n;1L2q^+F1kxOh4562<~6s`W4Q>URlK!0!@)SDoML{n#Pq~j0DwHbqA0czaPT!S2Q?>W=N2wKuhDqn*vMq`+ZX3y -x%Sgjg?|iZ^iCEAN{-y~hJGV?tEy&B^0PXov){2HqhMaT-9Ur^HF^be`uH|XoA3bG`?Xv3eNP~6Lw|9#{P#UPK2GWP^C@9$Xr_50v1+tZcQ5%c$2OYghy!mlO+P<=gI9!TE -jtBUndUTE1!xKIt6wSW;OPfh}r6p~)>Aedb1TkL3LRk>6R5H{!^c(tF -2jXk=BEDGe*z30;+0UBh{+{xE7izsp#(#pN>;7M)s4uQxzCCvDe)l6Ty3}7x_6NBB|NO%~p!{!r&@UY -u7f@XAFCtcHIts9vTE~Mg@h+8vbTCP+j?L)WTSk5g)c~7uP+Vowb@E#Ru$f%P%u(5gZzBxUTwq)ezSe -VrbM!y5pF#C<0J0_qz%-v|WdZ8}%a&zT%Rhh%Nhcfa~kV ->ho*-)g?l|y2f8!BJ`_k{M98wzc0WNo-ySxS++ayyqxV>o71vQ5Bbw{tZ&of^1%3sC!~foka7vGz0D! -7^zxEk7ye6DBKm47p_8uW^>(VR-4wC4LhLIS66!6Eln$)~3g(H-3%ds?TdBOPnrS!wbUr;4uv(F -o#dR?tl4dVt?;yhk!}8<|w-y>_~D7hAn^szY1MyC-+@y&-Ts^wlLTjz0yx8Za -`;}iP+fM!=>n%Sz{qpw2g{|}gnyELLR5~Y$Rt4|n;15+h^u0gzcNu`Tv1<#>%5y^~Ta3Ge56jxX7h@M -KkNy4a1Qo=o^371?OYv6+++?mK9j^T3odEsL7v`_NFVOFNVgBm-0{!|6)2?1pKP#0(tX_L}*RdB`r|w -_`!?$IWy%KXi?WoogcDWpct`U3f9_@$Gj0hKNl>7ORgqe(FMhb01K|3fO=3yPPF)0`^Pgs+MaD0a8{< -5&iQ5866nw*!r;WlR04&L(1ZB@A{^O@|H72wV(A`CpcUq_p}*S2u52vbRRLIp367GgS0byHsDBZBd6k -3P0Z6e-)yDcMrgefBR*$I@tDX0JJm -3{?6|dfO>|W%bcG!E?Mj+!p2?wI@bD1g5<^V>=xWjOzurbZ2m-&eb{c`jj+Hd%T(fLS=Z$^AmlwS>;U -QgP)EY-~1Z}*YC-Bk>~&Q^1$Ce$qyxhzc|6Sqyt9?ibiRSCMlRENicna29571vWng*2BTr-Q>8nwa9m -v|DI5?BY#kCoWI$tvNAK$Og&QClr~;rrF*{n1#xp<`me3wgLHM7o1D3FLfCK@r?e8S0tkc<=npiUqKh ->BatHOR^N>l_=5eN=C>KJOBM3I87LC~w0uS&JGaXwx<^T6jVAB+Je6VqTF=*p9jbuh)UriBlI!>L~}6 -TSq@q}Y5-A}DY++**}QB+fmua@L~za96QAt|%6^Qtc0*=r_N;m7ss6Lh$C6^k1kD09DV|iAw4p6#~hE -jpCDTwojN!F&bcM;9Hg8Lx{d?Jc{_YLi8Wsyq{en^s8(9)g?l|y2f8!BJ|@mrWI>(Me_dZQaK@omi01Mf9)=iPOKxRm3JE*O5jQp6%K{_APco9A_g*lq?w1(w7jsS# -F*$xTU7V<(U13{SNev`1<=tbu_Q6z%^_oveanC+3kg8Z1;NLRlcP>Sz_zm<|edIZdLLUxia$ZJP%I13 -)ojWcWpi+J` -T4$dIzyEetWqu1(NC#u<$bz{J?BN|p{o(!l7rTADVb@*0eTkwtfxswD;S}|$92ZVNOq8ae+zF&e5ins -(XwXg*uR@XGR+L28D1I@q-kX-HLq8Pk3fm28dHUi_31ms?q*L%FW+YxV~+;w6&7zKcW$P_d{uVa5O^p`;#3- -YbcuX9nQy)8+iW_{`jR|M{NJ{u5QhmK*bE=z!4sp1&Q?*p(Wp<2ET>yF8h^SFh?HS;%x#+^8(7Ibu&q -Yc}8!@@`5qjzQWL<=#G&QaVO?D$bwl$_;jrNiQ+&g}Uk%!ELk$y=f?$<1XUY;1z2bzBl->=2h2^H9AF -KaA#HU7<9+hjPE|22QD`ZhkSEX5&v57or?WWZw&~X-UEGL%U}UR~%7K(6d1 -$x9fzi%+RwZiiQY17F4q4Ynr|ry$@aBZXkVMA`QsCE!)>Arn=SV~LTQ#N4v+iGU;cAVD7lg-KD5MH`$ -#<}>1zcjLc`sk>j-4RyPK>)QdKvl|BQ6(qaB6BB+SpNti`f+$oTn6-8lK$}`N9qQ5Zl|Xg>&kaBC@rY -Q|Pd8?Z<}^36_lM@n=RP_xEJ&TcXyk-W2JO;;3;r+Ek;8Pgx11Qj^XG -O`^14o6*Vc%)BPJ|rB6NHX391-2l%@W~kuh$_hu7}8^)e90o7j(2_?-kq&i0`{-t6lF09TOgOlV-dt9 -gx6n$2r=}ox1JP?sUIe=ONuUg{2;|*Elp-vd4+Tn4{5h6P@TN*&Asz)y677Q}uAR&YP2qiI;Ss`aAi8 -<2_!WV|wpRf=-`y*@ -bU-ELD -bsd%dA~3hKzeZYXl?mjn{a>w|JzaU+Bmb;YxCt2sMS}0^_$IOz$kuc(*?qo_M3$2=XK8Fh -oa%m6~qQI_^%H3i3@we5r)4`Om(pa2z?%)4tRXw_vHZ>^-8=MeDPtKafaSAD}ZeSsqiB{dCzYm4#_Lu -X1rPpKD|RKW(dJ(uEX&_Ys{N@>vtOgqy|5<$v6!=X-BsDXp>PSQ(A)tReJA}kxT+a9Pw!h3}E`Hi<4{ -f__Ty<*N^#rs`r+{S=&iPpc+}C(fAv!k?jRhd!^CbMlqTpo%v>!pCyhjJdFB#U#Tf;pyNqcQCvvOyTgFx&ED4? -g59Ef~C{c!Mfcf$Q&v!G2f -X6ucedqQim7cxbG_v3Iiy1b -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 -o+Rw*XS++qvF)q$X~jEqc@J>1 -kZqV|je?H$>l4@WZ&`twKM1YMbras)0{1Q$B~;sr*Jb)DT(h^2#tr<$}Xq8ohM)z7zFFTa;1$s_POzs -=GqiImpg*^D{>Wq>EYn3<#>J8EqU|sUH%{P$(#bZJMj11 -G&HH`*1wopCb^hN=B1pv_i=m~*%G6Zu-7{0vyRkM+`oFGntkITX<6J}M6tYSpq;l=MA6GIS3Ur0`S5I4U=!JC!<`VbR*xARs;{i93Ao1ORgY1y}}sF#u$-3FwNdFAD9I+eaY##{N)5xafEuT({4`rz^XJvJeb%jMN2c$JwD3U(_ -Nujga=L$j|pj+>Jpr7%mq-I;S|>zC&wxqzrj}U$%c{R -$&@LYRDWWX8w4a*$Z^G-S%dFb2zItMJoOoH6ip#e2?;SrzhRiDdHq~ -v^zUMc|rU%2ci|k@LqD<|71$KI(Rc>41VNw7H>6Af!@u4Vr4Lw$1`Aehl`R72sx`m<|zJ2tEuB1C3lB -2cm6830=>JIo~YqkUU!yJ`{{n8w827v-0Q&B3`aY6Dk*a>zYQhdqufb7B**=H*##R}E1}bULBaIMC}n -5BW+4YN+&FH=xY)&@T1Gl9KsgWeYpWR}% -^k{%#ciB3ChnC-{5(FFNQH&TSSq-DgNqooqiDW5J&;Xw_F_IG8$P_f!m`|Tw;}Vh-5&01c)C^NDZWG| -cZSOobUGj>&DtAcl;!wAv#QfM?A1UqG{XCrh(>woz!ZaAvSXOEJf3Wk5y^Z(~ -}_5p{#UH2y)1i0C@-GpBoa=(Q3rSpXmRPONfD_8vzG8vn1u|3k7cjX{%76r$0XK3Cq) -b5ybnOuidVQy$OpshLa(S_U|WHD#u9HtnaeUa&-&z#=jLZ?mCbuCBC-~-9-iCy -K(fOiY3CLDy~=Q_G<(1&@R85T6Z!iRMVy#Mc-V-x&~aapHtNVx$nKoQ~=^gTw -Jt?$GB?NH-D#$l$v-nMm_-UE8!#{QCw$5NS40@jqQw8oO1hV(^(Hy(j+{*I6un466hhq3pNPMqY7>3; -UxC3N=C#JvbIrZ)~%72B$Z$(ep3dZ~j#+k_CwtJ+mSXc-;;?rm^V=(D7XbexZOQSkG4PqXY={?`EGGt -GF$h&%{_{4qEU4c1qx00R*sE*qlJxjgy;BN5PD=nKtMJZ1;X771RY2-bnqL -y0J&K!`ZWXr2ug)=_i!{=AMbxj_#XtjL(SEpWq -(J@Bz6&E2_p5~ -#x9$Thka`Je&qxFU9_P3EP%t}l`qEU~1N*rO1OhUe9{eum)4y^0~*JN#U*4p4&o9LX}9uzlnxOm#;C7 -qDMBUoBVjZGQX03S0`2JEyr^n@0a!jAtcI!5!kPGL+zaphjcsgP=6VX=KZBk=T5EnB0 -R$Ot{r0nP73JzZwtKZU3$=+x6ZrHiR0T|a+_u{?!G!}ofVK>Z+=ucOfWzA9J>EU3m#Yp?_J-b|1VMN5pcMD?7t>$HOm@wHD=b&m`CGa>Dc+%2Ck;;(F3mp?QrR&6@llr8CcAMYn4;SN`esV~x~-Op_kw!`)Alb0Gg4*tz+k3!KbG0D_$9%f3@ZN95UhWpdyLB -}WLh@PB{;K$_^)lHt4rR4G2(=5{q)e+jC`>QKkUdxVt>RlPrH)}U5Giw?=&1${Z5PRdJvwJ^<&$zLBw -lasFCQdwGRQ|zlq3o7oWQmcR=g{Bn!ZnaEhHDXYkzsi5q{WB=*L@H^bS*9$@u;7l;iIf?Ji5lnoos8Z+&Z=v59Y)h=3MsH-GP2lG;k1V&s=WP -z8~@peOJ!P=lRB;AnWaYYw?U?-SYnFEQ%c!iZ(e3mJroVp`v%lSo>Ub9bcv$pS=jT~B?zvs4$;fT_Jrk7H9-wdQGyj<%DhbyYA_=o!M|4#*CDG+8=!5?xlH%b489sI|CuY>77{x$lKf9?L`U;p^ -qANIfh+vDH=t@#66B0Xn$T@_RE2UpZZ(*)ky3_BjlYJI8AV45QYJ)av|0uAYRzXpsTaJMrp -gyqtdkgNPn9GFXMw*eYTG7a06D+TMYAm+d!SAWr<+v5;r&?sK?mLzv?qNVv{CI}OMq -O5QZ-sLxBE~J9BW5-$@@oeu4_fy-=I*c`v~h!VG8;!xk_4ojFm#1hkm=lSMU9nl889?A6%rt7}jPrPvgsp|9a>}D?NP0*WOuFoTEt!UC0g7EOqx0~i(2m8ZhP29Ny -G4kVqb4|DV*lA|d1_}Wi;}2F5EVRUyYBD@|pyW3n_e^&=w_1b4`Hb`qJKNaP2nAl$Vp&1

^ME8S4Z9H&)n*NrY+{| -q14hl}l>@RmbZq|9FN7%gG;pNh}sF8Oq<}9bb?-v?#h|hZj+`Pj=X+G`=wA_@@7C7nS4j&P(i_bd98} -7nohim$$sUPceBK8Y?;ouM*UqMr?&k6M7gJPYCdHGi0fg0z58o-e}%k4SK`GE@#Ltvx3KDOU(KJ<3?c -XP6GI;38%uTGk3v`bF;&?A_hBedc{>~F}fp~-kd90a8;z@Ih2Jsnap!YTZo+^ElE#%tqyqeCFX` -0yr`Z!>B&{Qmb@>aBI%h*oVWBT2``fDp_2+3l+}>k$Ziee9v%({Htwbub9m&@CKtT3aGLXTbjXphZLO -Uk^b(SX!G=cYyO=xO*?`i0orZ@7S8lp_qY*8V?wcUYtMusY^Gsvz`;flERATPtG?MIcT|h-nllhquA(nL) -I^yt6gfXlyS*6PUghSHC^nxKrq-q?r*E|SZosH>b317AClh^6H?y4jK2!dBc*-ps1zq9u{c~G>1WjLU^;`4hkOt|uB@{?u&@E_zd{CSmuj-5lOj=PSkR?*9x5qCm4wsl -=Sp~Rht%{8_0#ZmS1crtPy4o?*s{|wlJp*G5OtCEsV{o)zH9|^P$HWLsqM>WbafyR~8y5_$mZ^0H5a> -B!5Xt}}X9kp2gBd#p$VSitryQZ-%wh~_T=#)*uG -xA-v^I0+ICp}V$5R{iQk%6h8fAwKKk#5D?vdooEzqxlzJ25RLMwpqo*lo>v$4QpYtTw}Fjm>6_<7l2& -!0>dor?b9NY|f^WO`a}IN7W@msy(?OtauY8s6%U1%b2p_*@T{vpy@L-mSj{Wo=LNJIfE~r`EYjM|1G` -!t~o_r0-1Em39!8dFj<98+l5L&MXXFOUKbC>Vi2p>_7_-HOV9Rak^EGEh}}qne|u -O1e?5-@WM -DbKh(rLCsCdKFE*dS&d(>p2`W?KZe*ILn4)BcB3~I=X(%TzJ$4B^u$yoYkj{mLZl52>J#FkUMCPb_3+ -SB_QQ39(vERFqoRL6Q@>8+VZPpBvr^A{_UQQb10OGyeB>xe?2Y_;0tX6 -F|8M4LWwX9i*zgfnIY``GU}>f~>()~E*i$*7>i1#dG#$*ytarCaeS85C^G^ef#;xpX+?JYi>-f}L6pL -lI-Mb(H-2mqAA4q#wEXZ_@$Bx&>hW|KqrD-yiC)68#@R -kRVWkA`ylG<{&VN5Y*QeS`qN9MAv=-Q3%A0_}a9GUP*OG0jG~30Sq5Ter0D#M{8+w08#+}$3kG#vHXv -Nt^x(7)O=zCUUTzF-* -(&UewzF#kQ=uXL@{1Z7JvP>zUU&t}}H#w#PA>YZ#aJNOX-QbNSNOr)v*T>AxPuf -AltZ6FeSOnoFD$txK&%}Y2_(;90H*r(o9n>FtsmU@S!_-G%Sof%FYu{p?YPN~HO-2#y_)PlSc^jvX=XKt9G1vA~v2GJXC?&tJ^E@J9k~$1 -uqN$sZk8zb+wW1yDkX6}*nckr>(rt}}4{kS2HmV^VEX0v^8^{r)=|a?b^o;KQ -zO|o5jo|IH-0o{|@AMNo^1)Hj?Y@1UdUBFuvLNUtI@F>uKW1WvHkE>Q_IbybVxuE|`@Cz1G!C&MLfUH ->k#gf7nLFq0cuzYBntrP!?PZ!{kaH7%gAM4=2F&@TTgByhJtE%xVmfjx%w2ukEBETDtJ$&k2+?Gu>ve -Y`}e$XfV6e1BcB{|#So6-f_9|;4G^Ee{{ul)EZo-c2t<^JE(L&>evb(GLWB!GY=+bH6>m_)NV!A>UjeB`B!f%eaX(1NWEYLf_m5o1Irt8&2wzmT -bI<7|sqkHL1(Pa0`xD6q(EE3iW;SMC*r;y*3tZLPF+` -QqF1H*4u1H;%vAF71@a1)$_fR^|F>Q*+NB1xY@5)b=b1hf_x_&J4MChI9KKlsqtoa)HNMfm5bPo-T_X -q8`1IGN=6HD?9qG0S-4*9QN_&qi=802AkX$~^5x9~L3$`J5=r<#SI}=7lNt_QSqomR~X_a&u8-9HNr)REcyjcBf2@jaCUtttAZJ3tpqw-ef1Bbk07EanRgp>xd)e(;mjAkfwEI+gSMQHMc(JJBke4 -9Pap78aO3~N2=%cK}T%7=R`rd-^%&nNC$8!So%?YLi)uiUA&&m>6y;-ek&d6D~ -_dahNaQ`JX6Zvy&L^92&>%l?h(Qjg6)IjA0AG%Dcy(S=caVaJT!N65v7CL*^)OJw7Z2dPK#EGG$eVV=UQsk%Vic>Ynl*Jb<(5wbENgQYelJcbP%-p%wh@UkP -oN;dcHe2(>Pl5KR5#h*JlM3-*@9B5VG7`(Q`{Iwk($5aVVU8TxA!#%EgTm -6IV#Rkr&J#;9~^hQ3%M9b90(V85s>X3PF&Eh-CD8@aT9dXV{ -Mf=Tml-Li!u`tI$7NIto)>LNWv}tq+e=Ug-PqM0dX+gMjNn|R>DM6~dIzbwZW*jKSVIy}B_>`p0oj8yRw2zT|KWS0#h%zSxuyo^@t89%+JlelFrxftuNeA6 -#B-#C}>I$3)p>HI1A8lSyr4LZCZG~JIoO?^!4H7%m_BISR(a_Q+^bzb!dgP*^xwmmNEBRF9|-^b|y?1wyTZe%vv9&T6_fx8f!t>?T-#(e)RtX`c@PIFAPU~Zvgn -V@Y}NT&qw@xKOdheh;s)!;*gGX3cjpxCi`kO{5{eHJmc}Vd9({jwG36C3tV -e&OC(*36ytQ#9(E*FKdof@5!#pN -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 -MlFg2^@jp4XnM05U{;{~+A?;5R?reXTD^cU -(Bm*#jrM>&EA{s<{5wVi1y+iKV1fVN~#6Z2^eIK5gO!nm#Bk6R-Xn6;5%@pO~L> -4D%@JgHpup3;25AZD+Nsxfxe3dc?5z1+a_<;UE19sWEUd}P>+iwm&hf-Wn^YX#IU#g_tR!2Kch_VH|@))z~!#@FRdx0&!0h@$<9F1E-`MSTH_r -woP8L}0>%5U_3)C6~UZ`r=```Hkd*ucpqZFULWSw&ppr%Z$A&Z4Jr-`YKD;H;q^Px}Ye*Fl`Rp7G3EtSSAA8||gagTn)ZD1Gyt&Zhy@yVnuL!!uDWPs0e34>98r{bc>@``ZDSn=AQ -qO5&-ZMw4)CEXNxu!XoJOs~WKD440l?xbZn+}j6Rt<16&x7Y1`ilhx9V%rwGC-`GWH+QtnvwF@Mxow_ -03EhI*b3@(dNaNZ@5^`9!7--x&;Z;njL}bqTL%Pw_EG)$ZVOl0LcM-I1#!W! -$p0!@suM%hjR$d02L$*?N7PBbPZu?KwNiqdO~zZsW*xgw8&uJ|3{6x~9HIo>u}bBJmYpjuSDlbyAk3= ->Ah?rN15!u`dSRpUKfOTE2=X>HZLkSJ5p?w%>@@|6&mMKXWd>2Z^6+b5UxE6M=%4AW0fQ8D{PIw}1nQ -QVaK6a092PFDc+MvLYdHIbFtAIsk6p3vZ<1pI022T*3alJ2mlOTATfGV>;HZ8>i3=;8dpKyxhYdHqe>iLtbMq?-`1q_i{XJ5A>(aL%MGAevPJ -nn8UEbHx#EHS#zeVV>{0oQy2(t|G+5a@ed?=Lv8pOMbbv(WfUhyiB}e -S?_qef~=p$Yn*!KNReX@>rpq;~h9+r#k{qPtg|$X(dB -aRX&hw|U9alO`{1Q`%)9>_$V-3*xAce%p-q)2X~&US5f^{SiKB_okZ${&+Zua!lx38oKy%5m8D}TRTD -8ZN)xk&LMlzV95(Kl&!2lOC;BznP&9)VCp4}VdgP#;jEn$`4L{a111;U1 -kwW@O%~XD`emYGh4c9s$tYuJyY{(GbUvBPjvl -=*M&st<*_Wg)4+svfJjt?VTGs8xV88<4=Egx8WR-6nu@=?oTAm-Be6ff=0y8%u6>(;g1&2`1liqLN}v -8TxA#E!cyzfpzLIWt2{C*b1gZz8s{=LWT)rKse%_w}<-Jf_k126;Jp+XxGHOT05(^|DtU&+Ovgj>3Z2 -;@vl;HXy>oF}P`C`G`JQ>MKR@?lx@WOQAQyVCNva3k`A+C9&p2WHL!aHwTyfwyXQy -YYKa66?j_|_jiy0aIWgE`jwVBJI9nQkDj*cl3^-xEbT0kqi8+Z3t(k58OY4TaZSe!_rv4mhK-^GP8n% -3{hogKHy9KfjMSZJw)azVw=-jPkUoE{IV<>@AfcjIx#u+g*Lm~-AA3qDpJEO)a{ojHcoV|qLvelu7U> -CGsGXF60kGET#T( -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 -c`WWqHss0cotjrA<%4@ -i2A&@a8*Bp6SX@x?6O}mYk7uT%oTR -b@6%PJ|E?Ayq`{6i04+UL%4mqkmc#ZKQNy0a<=IVmmlZMUZF>?O_n`I1TGK!-gDMp?&?k|_1By3qDbKi-T=J4$jJE?3=D!b?yS{J!yR~0&khR{2d~|KPLSB7otF*29_6O+vy=S}w>6fFw#Z -iV~5E{W?`ZGKY! -X3JJ1fC1@@#}@EyRLtcco -7ZgOO6)+v0~j^B)%Xkvj4u-3dE|?bSUwKW1>=5VLQ9Uv)K+OIojpA6P}B~^3A8s2hRBf!yJtx_sf&xa -GjpjHaT*TH3Sz4>oVK8_prXv)D3ZBE0Q8dYCo7oNvdpIrea*$SiVKNjI8bJ8UbwUGp+M^wLmQQuphHh -9L2%Qr@m`Yo8OodS;~QGdwwRf&E?dz8Hajy5mjNU-NelZo6KZMHb -<#OdyujgAQ~*I_$&HWu26=pOX!d71(>CB!%v^%Hc8a_Q8`%QeRQIp6XInnfLP%GJBt4}*K(t4CtAyGJ -?;q5YUTJZcUl_GnwSx*&L~LFlx&-X(~HSa=eiVBEGif-UqHtCb_qhT}?&FfQ -p>q$ovJ!1r2T~=oj$hnLp+U`;ClH<<~EhA}Cp0M5;Y+`T~IAA@w&GIlm=8EcvKah_loQZ2-G0)dE0bQvAPk)!VfFyQ}39Gau)Ow -IxdT;Dw|AcM_@{DeD?(KK4j>dXz2-(k$g+31cq;y04RC#kgw3jI@`d8_Af%r92-qmU79BqNK=;m;~n6 -@(CMRN_k#cR;$C02NDY&I>mGI744ky96s=)RwlZNJH(Dz4EAW$0Y8+i5ID!KbLaAD_NbJPu`KPQkoFp -v%rX^O|gTXVvqm)m8(6ny-aRV%c}cjb4W>DBPm){qt;r# -QmLR~kGo<)w~z_NBHGvPKu0KioI*A&+S-Jr+0U;`DX5R|$z0q=yJ(j#+y-KQobS)MJywPOAfM24-P2* -k7S-5;zKeSP29X0!JHkjfg+5t^ -mD6_?kfu1M;$Rj06R+k0-zzCwftam5QvCVU4pR^hI+(spi)c$g)?@A(enId}TpvfDgaS&tn)Ad}0zPG -hpy00cLRO9oqw| -%=-cglx0~PWx`)6;s5#Mi*I#S4x|R3FE~?X&EwLMcHwdxK_Y8HhEXC4L^u7|Aj5?pjn}Y>1!af!QD&3 -}V -^IqAMip)Q)yTbt)laNe#w&UNm5!XbZS4fB&rnI@T5M<0t$RQI$MYONL{Y_RZ)xQvv>x?HhI|mqn=a>ZQluuGp|mhYkyg -HR=&11UATeTR>03G0!MW-;wE%Bg5QI^*&cyt$4SRo&9kq{9N(>Qt%g`&tPNv3)m2<$UW_;OTk>z+;4f -P7DcrbXBzE>emC_zfj%UP3pE?}a+=zWgZuRQ_R&WvAzx7Hw!e^GJ5>uwS=m!lF^GCx?pMn1yE?uh`(U -><=ap}Vsd3rHYCVVcb{9%^J;h1fIBC%-yOKq%2EO|{3W={Abie3aA{6dr+z?uwUR2h=(8s93Q(WNc=A -7E*P>4CderF@1G{qYsjf~2rg?Qrk$*zUO!mfNDZN(j*77|a#PM -Y-I~Fm*-^d*||e9HC5?rwy5TofQvPvg>gUyTInyDzJUoYNUA&77Dps?HCU;hbaW%ig`Z1n-rge=OMa4 -Y&`_tKYS&y{j-8ulOS`2T*Hk1GDpOZ@$)X9`HvLCA*!-PwBCrD2d=%}@| -erZ~V7U>Ab|wK)2Drg)7dWBgAh14{8V#>_CF%nRRUWu!na{-yyCx+w=^j_Fr!@$d%Avyk8OY}D?uMhK^7?_zuUqV8AjUUV8yt{r;Tfe%@3>ehqzgW%Kpz|&t4}yapg -amZn&EP)h+dFkB|H)|j8NRU>gn!E46Dh<#=W%9EqT*6713F&zAG0Y3hk1-Ij9iL?P=c6m${JaqYLTD8mw%!-hb4xzih -Txpg(i6KzmcqI+{2dckiV3aW4;hmycAbbIfBxiun-UW;=f{kh8}S&Ojs^4yLV@Z=7u_qC9pEOk^)_o7 -0hEr@D0eH58ZOkvHjwp$5)89ax`D@3#v?>#^X)>#OT8H@!L4waCj;4By22prDcIDv -Al<(Ey`fg;;7DP1%!fjHka>BU%ty4d)wk*Q~PVt86-SNW&Pwgd={KL27jedpr0Dx{(+bHTY_TG7e_9r -wP)ffvmA57J)xrNGTC{Jio}W9AGT>i$Z9An2~I2g?m0hnZxEKf&tp>!?V~WtEZ4G}V`KAp6WtzTGxJy{iF7Sa+QlWxLPC{O{=e$7!$rfJ1+G?8i8aZ;$)VrV~aPoWU3hjNhXWguy=r -p7mNxzsapo;3Kj|0|fE%ElI%->y;e@G_M*aivFrZnZf|D*60F#MJgEyv}Ys@QmQ~{h5^%*6_XGeOwuD ->Ds1`%7WA(=(t(BdOTMWeXpHB?_2q|JAvM}^3zUKmH#D{a(yIN{T&gPtcx6tgA$-NIdn?pZqO -ykn$c&u~gq!9s+x4AYOfzHN7FykY!f3zBNjw*%YIYF8pDs7k1eA5p<@QTdx`cVx -EVT?u|n!UFK-ypKy@XTRaSR27C(mW0OUdVqCY@J;zTJaogIK$CxM$>58o#kCYqj2WNXS*ly&a!dAVcJ -U!6;F}N8H`z+Rt;1UyI=(DKNPCDE6wBJq7!Em4~jpv@*&`2g72ai6pjX`?5VG6e^Q=2Bki}- -C26~a(v~K;4#Qn}?0XS8s}O2sC?@7n%iCO$9Rtmttx6$4W{&h9&ZcjhBH_Y`_iFDF0NJ0jAr8vU% -E^J!L~Jrjq{DZi0CBjC%EL8WBc#$@eW2Lf}jj>v-HlA=^aOsIN3k5x53n0XVk7PWE2FognkblNeArg* -nRCs8?zP9+ImpKqn7?O(}FbMiGW8V~mj*(3UUx|w^HJoi}G6ZEM)+mCt3eYoIO+gMR_j!F4>JvkhK9j -^9%GCmC`iytK9kLFbD=Wf?^$#M^$4r3^{7hWqw-Tb=`6*z&SqP(IwHgMBIvVR0Uh8B;p+wpw~l!uDojqf<)34jH-nNaF5UeeXLOsgym3YBg1?swD))+GuB`9^T^<2tRp$pK-K -3%J1)^8(jpmHXfJ+=M5V)lu9F<-<1l^uDIn_O}Qyw`*LEqK=MZc{93EM0i)bYr9PCHH6@8vyDbO-A)b -%jmu;&Qs--7V&*rdi2f$a*KQlDd>tSou9SKe}Mk6-{L%SJ!1M -g`~+1u?8NY8{K61sA&-iEzkLy3A=p&3-JmZC6>gZibmsB^4Q0=TM4#`1n6!&y2LPTo`xYBs?uC$q#Jr -Kj1Q2kR4YL>{PXp+KS)Yv8ckicDSue0`%ykVbbdUG>&NMac#3$fj4@|!p{eM0L2RtYvx6F#zbE13Rf> -h*ck?y%)-SW!sG)Iw^ut|fv8BS--|_Om?p@^{q8o8O)~PeLZFW&Agn7;Fo(Io&JKvVKESpt?Y7L5!e!ipo)&huWEPp%07ocd=_S)#-7rE$59m6Ax(m$ct`{Czhb59;E>huVL)#+e&qG>_&&2fygZ?-!QWY -l{3V3|lE$sEZX-uiUIY4$g2YWmMlo-A>uzlGI*|`oezP`R(ibotFpw)$9A6mk0gT>-(LT2PO7D7)_gQWX!wISqvfd4s; -Ncy{Cg}UQJg}LEdeKunnn$V-3DhyJ`*1jWQo_%7p+N1fxM1b_^Rn$?D2{F+b)xRseOqZ0IzJUpLAA6X -?BP^94;fbVAdC4zEM_-y8W`2nt8MFjVPDzgjIR_*WvyBg6vIpL`wIN-K4|S?o8JsvA>*3VH`!*CoV&* -E*~fH4Zr$WMd~bs_vsjlkucFid@6)|KT&zn6YVa8liXhnxX!m@k3gHo`JhF)z- -@k+e)!C*2Yi&jj%>3vfsQhxI_amlM=btW$hT*`Z(2AMew-`%^;qbWgQGWICW?~4TDi$RqBc7*TOKo@6i8!qP>Hwa;TXw*RWbOF`c;vf<%Gd;mm0@vR6&&NE- -!)0YUJa%}V`g?CEc-CCaB2C+#7qYXuJ?b|KPuf(jpd{&Y{AxIDbdUF;;WNdaycdRpFCsFF!nWJ6QgY2 -WMY_!!ZCg>6dpWE2nBDNKr6>aGX3<>MciO%2H*u$?@?vqy6OH9o7f(l+_Y*(mhC_C|XY+n5NyWxtnuD -UaxW$Ad6+`H$M&%XV`2|L2N1OF7A^kM6&;>iq``fN&mdF$BbF^HB3@hzB35UtL+tCi_aw0lN(GQ6E#1 -Srx(6ay+)HNDsU%hDOhx5b)A+vVZ{Kk8~?}B^1N8$CADL;PqALrZueeHiUu^(-0|IGp)KD3`7@!j-L8 -Y3teLs#e}7>ZzUlmrvZUQT+S^~5JH?>qcu&j%AP9~T1T&sR7GnTc0pI+lW=q3Gv5@ySbt_GZNg()ch) -XRN5Wu8k9*)*K_CRE(0~R7CVAO}yZp{4@O3?6Np|6_ekxBNQm~qA&Y;G6eX&?r=rhb)j`RkT`jjd(jj -iJxu-i)&U5noP~c@d?YAj-RXlLOJ;W)$oh^O0`6_86bXP>u0U!|m!{F(!53Y}WQGZvXzKFPPf8*OyzTF3X+*xwEZn -2~C;ryN`k<46tZ~7+X{?Q$0>0gxL(1-l{+m}#&m4>hQ{KI44Lmu>(n5U1|f%bn^)A7+&43_9f%Gcr(Xs?HR~|HG)c7{xP440~KbV{_s6Bw;_wyBFh20vQILA6p)NkjkU2HilO2a?;JT-mt7tF0V&E$dh -QFCEJZD9XGuy-sr|*UF#t7x+ezExw)KI5{-4J6{gJ^PMN2nMm0+CmfV#q?`fREsIP?zlhCQIrM&ol#u -xM{w*3MJzw5(Nx1)t^?vPeFRZ}6xrap!jhPq&8PycGj7i(~uaTr)<-)v@f85kmPAk(R-YtHVBa9%%{p -}c3~Wv+)h(Q1=JQCXV9PJxgd_=87`yIiXZ6BEB -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 -_4Ag4IuY@IvfKV2!i7z`XA_A)BcjYF2;H(`a -}DGLG7$eW~bgy!g^k;mLliab^=>2UC!@P!Q#YZuS;=XD%9L=YJzZ-(Qnv_3|L4M7{KQtvQl+O~N -(63y;iOs-X@hvqyL|xW$G@9f+;gcLs-v%8;H!Ru@J=&>|>%rYk++Knp!{P!~keXWq&-xU3S*eIk8eMF -1F66Kir}-8FMZr@MOEY%92P1n-Ib -~8hL7Vt%Vy7oc>Zy+o|nNp)-qAvY1RG^i$-=$TZbM4QNFB}o0iSlxKIveUEs*5lBi4Esh)WJVUP^tmh?gkB?iIupf|w7kCRJ0Y^X<&x} -07g6&aq_F@BXMYFFH_^hwd&iW8Cx-mpzivnuN46bIbO-cuMCDTJ8mnkeDW^SHq75$Dg@JU|R_pj`+U1 -Nt=i^!3UCu^wOtz{eng`~o9HWM^P-J*gr@4){7lGp}%dp6g?pOcA -p}vL3Uk>w~9LT3;Avs8n(hS&kLvUaexl;Fp1-VkNuf>9Z0L=h20`b4-^NqL+5bpHlHiEreukzPLE281 -dYh&-#A-Dzv7zMWU*0EC@;Ma%w$WQ19d@ge^ftAh!Y^Fe?ANJ}=Bws}wV0-PQN(h1m6yP5Xz!qR60<; -N%VhA{a1TurjD~Ae#k(C6jVaso8J>(W_#1Y4@rIJ6XK)dqF3hN&bL~&R83Vm2Z0o$l|fLjp}y(LfSWb -j|mV*jc`tT@DY8sy$7NJBJcz2?pzsuPC#hIqFXch*S302O^7z8=U#fxbB4GD0?A75LW3;R&><>jG3Wz -B`P+9eh7F1wZsz*p2ps|CZT6-`sVUpPcvhV(*AGD4$&80MU5voinj_xTkRpCjG;CghyXk2CdV2tRck{ -2x9=`djYz!ziF}#+(*XH`CcgFN1Y7lJE066lUpKo2x_DDmtizuAsY}4@j{#|VzR~r6BBQ#`wSaHc}V0 -;)Bz-;oY7v?Xp%?|AJb@5Z~K%;Ofs%J_(rbyLrc%4L}v1U%0^IaIfpza`%cHryI7GX#4N;B#l_q^vU@ -s7=Xh$C-H3a}Ew>o2#1UU$oQ94sR|m5(S>A3!>(;XOMuIv(EK6U>KI6J -N{;lTqVlRU#7w=RLo_(gJ+F`nh_mFa?-$K%4y%i>-rfk+YDIJX#-?aBoQ@dcNyqNMiRV8 -zRQp%^;eL9Y$7*!U2@)%2qiP1SdB~3iyB}JYvdfXDDrXL(qQS&5|v5-tQ!?3;u^mf)p -Pk=B6<~i~ZuzSNI)E&mDLeCg7C9Z+a^J(Ag*mp?2jomV+`So4YZhh8$_?hk4inVeIYL1T3bi3)2cSFU^h(Z#pIK}UjMb0HVU4QvD|41T#H3$ol1+NtiQLwWj;C&agaDdxOkWqMz2Z_mtav@lG8xf{Tz*)_@b%n7(n}6tJK>m{t| -I~By8wO!Q^)4*2^N~Poo1JKqJ)P_6+28KH$erFiH#rH^XB*t42-Tg>3fW&*E$(Gk^7(%1`lS*qIN(B9 -%^2!1Jnr4RL_1E}v4)Rg?s;Zql&^!c;XK$Lx<2p?QN-Fl+|2&HO|_=*?po*cS+EF!CdOv65saJ|<0}` -(t-q1A6DZ>ZL*`EpAPVt2r>N~qVcJ%9u0PFXh&2?_ -iTQ79{WVt?wi$9cZE2YL{UlOK@JdfQ^WaGF#CX?56THj$z-Oq@`dn+54LF^uQ!B(@M{xe{dv!Wc^X-EP0GD%?S+#Ze -jJvxsAqfFM#d%IW&)J|ifcYCERPu}+CSeWxD~dkH6nM)P&ehSrdYbWVwm($0Zj!%8MDIBz(g7hbpz#F*-N4s0mA_oR2+24urGc_XP|v0B0#OwO2vT -BDgv?~E4f@r9-6#F+TN1A6xbYJspWe4`ai((6bD_dzoBkQ1>~AfUlJSA9yvA9Pn|9=`gZ+Ml?-y9Z|> -Ib^v$<1Z(R9I87mC}1VO!v+=o61>R!jdkq#hZ@=oWJHQ>@A8x8p%w0*w1ol0pFU%Vyo=UWP-%;az#*c -(?qRK}OL+y!Ka(zMbwUyjEsTmoPN$=$iG}JdtAe0 -IXt4BouAm-pizo`s0naSKG>(_LRL8DK;y -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 -8uu@cMrVrW>~H(kffHlVCcr=h9cGLC?EO -xv&#$@iEni}zLph~6O%LB0;F{V_01cL2qTf5G^UgH-Ys%BJ@~FMhj4$M4S3?2XDBq!Pv6ExIiNA>S4j -Z!e22{zS5!8{pU$48AAP;$3;0g#QXm1!M1UoNs>urv6)Pv-ts`99WqFhiAD@h_axnNu;^i5k?Wj%PDm -BX|0PQiQ}$LeU3IX+O@cL5y`s=ZKwnTZ_vCOA7K{v!}NjAOvmz5WinIF;k=iN+S9T<5qD$L5N?6(hbp -=4V$i{Q4#nk!l)F*G2ICEsy@m=|F+`73OEh?2cG8s67!Q+f7($g5_q;o -Fn_C9ety>+sX1{jHS=?1Q7Vx#<}Qq&c3Psu8Q>WkqycIIci; -x|x3N@g}WlwE*LCm%6BLV(#PV;zOpuHh8t_Mlh37rf+2yq!8v8oT2iP*kMN%DDnpFKq$^}C;}5Jvqa| -DHZ6WVaW9h~ZqO=|gL_i%-W-##ENV0uMtQ%;r5>lky$6zVRc@Euqz?je68f92XgMTbR^FyBttd=baqZ -MukrC@jOOkf##SLE)a-U#C9xT -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 -dgB}-FUWDUh$RVwD-egfwI4q1Cn{4);<#Sg -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 -EyKD -x`>@A-;32PIayd}R!#+}S{}xkZ9(O_Kkn7Ax!iAW>J-N+ -Tkn%4XRAQX*V@z4z_N9pl3<%lVTWA(8+bHJ}B`dDh3PNv>W~22ux8kL!&IYu?qAl`yUXa7`4)WCf5ISYC1{{)#ik0T$@s; -IPRk>kpmmmhfmM>3RkE_!+C)lO#Z*RItsV#9#om1S3ku(m#88Q6-(=f|u(xQao8czl_`2Z!$@T`QytA -TAGJ~wTv5`p+Nc}5sm)hfsv$}+|;DJpjB&r^8As{b8A(oD{M#u!D+>X4To+Z$J0F;s|}Q()Q_vj6Y?& -QGCTq7P?94(n=s-nenQ@!&mkr}d1SkJea&XgwFh}Tr~g29?!S0>le>BPo76m#xcQ(hUpS1lz5J=YBix -5KJLvPB&%Ek1@4w2f{=V0TUJsY=JO8Lm_doSYUt8t>omC?vsA2r+aPE@`-IH -uTp?0@5E#m}{V@ORTWveTe6*{g#a7fZ9fFCIbnY!>31b+s!m1#d&kJ8w~H~Kzea(9~a&Mt9e?kyGD_j@ZvuzsqV$}5urpR%Un_XmG!#`60V;5ky -hk?JuFS+s{>*G&z~W|t?B6N#=*;rvPFK55i99+3NJKC@V!k9?F2jV}hf?~>szbocZ7`#ZM>{Mr5eo!b -Nc?Ee1j_CAI2epYk*!E1q|v-5E})#^*t$TGjjeUYGN)eN!Wu$llR=p}*HO3)C=t+6xDUNm|*9@C@a4q -5H7mMK+tk#+0Wq}6l4&}U@=8QikaCE}+8;OL8Y45iNNA@lWON);|GN2UbnkvA}Y^39gF-R+T=6@46|) -(jd%%em{~(-AKUE(TQ32&tDIN1nzSn0F$rI#j9rv{uEgK$2!co=neqd!1u?0SI@-NCdll&hm+7?+Db -+t_c>z&?~bAb-t+HhI#JbC^!%-Sy8-m2+NuHs^$v(8G-q0cPAGHm_vqGh{VN}_LRh9$1IZnI*``#D+0 -5tyI#=O7W>o4-CBT9C&sIWoK(C3nM9iWlEb{*PL#+_ik=^%+x4l&bP88!4BhW4g{Lj1#4=hsXZ|3b0a -$WH7r(t!+s+q1ZX255`f8Z&_=Fr!f~w(jbUX)Duxx6orgjDC4|u`xP@Cx);Q~D -$ujC!dCjE@9`~cu@uEW%zG;ohtpRd6uaDg@Z~x#F@l)R+41Ig8Q@eH!neB>n*c*+CcQZbc?;w;X`#Ao#1Mzb}P3 -awullPd~2CfvepK`AOq3?zna<4TZ_5SFdhPUwT -{FE`g3`B~?M4W84`%$`+y4e&8s9IoooAy6`;c3*e?$JILV&>RfI5B!R69_3{2?EQKxSY;*V3hu6KT71R=P+3I-pv#ln(aRrNLS%uaHr3)`oh_w(VsN1ypbop`QM}(J_gy -o1rwEVPU`M-VasNx--5>AloP)yUwUwium2CL@@QO`bstg#3@=@b)yGY*i4FNjZJ$8=)-#%C8`fV~@3Y -l1lQ&4;erR{g$an+O7!6j#EhqJB#)K9f_h-GCX0svka&}o4_?pyl%1JE0O`Tj>v23OoX_yr0$8+faR9 -zPMg<+AR7<`Wzf&QE_tSL-^eDykiq@l}ABKuH(DsLE6oR%0uPP@*2`fd;h{z-@U*X#hRFX4rJ2Gw!^Ry*#gLTHvPPJ>zZYzS|;iE -M*6(BP+UI;aiq8y_N``QrWpy!*5#_V-_(yV(;ZDF9wHFKg`yKcdj1pIJr;JE0?4H=8e2GgM)eA2YMTvKD6jhv7eQ?P)Yh -d%SzmA$!^qAmGyW{D&BarvnI6C}{|imv}am8kcPBakV*g6}pm4+2^(Cu5pKDtaN*vc>8>uS9}CUw=sG -DrV6KY3Bj|@8kcKiouL$WGO;barXWd#6b0OCr;g7$yffCczNkH%mvpIwK+T-=;d#~-?&6~tMDM&*^id -B?`h~LRY>r-cab=(FDJRjaT-WsFEL}=3%;h9I)Zqn40jHjfwN+LBIQ4x--Du=$6h@Xx;e3YvK{Wi|{t -rj<9N+bR6W%@}k9&Rn1k-E$n_REAeE7|c|Kq6?2e>M3~|M&k|- -+p`L`?inorT_MSzw&!i|Hpr=znrYuQ1&B_BSaB<>un6}HIkJ2Fk0DrJrL@>&lcDI+^=v0X!5Pqmk@j -Oo25IZZ=@kc_tR`IZ6W;@PH($WZ$0>(rO>;^5Be*sX`0+MeD|G*w>Z&<^n9`tkT~Ai00ix?ZtP)WHd} -yCzD4i1(0p$hA>O`(@0~XeRJ`?w_Gq5?VpF|^d4I(lj(f6y3I9Sso?~CDa4>l26XB7-uu{Ok4!++6Uc -haU>DxXe)SXY1I|J$Vbj}50640ZU6l+f)50uGV||_=`Z3)S8g`uk4%O7#D~0J$88k=%u;Iq`P=Wnn97z&BvSht1jP!mye3{n(+B)Vdnnayh2)Jv40eh$En^S-xu8Gb_?lGTpuInfV&;kyy@1)_~Y095|gjE)1oH=`*{rYZDx6+==LCgMbPU3$Vu4C$wf1Yv_|OZSPi$7V+sKU4sf7BMe57 -21V-Q#>dYDTo%kST9yK->l!~f9JtNS+4RoG^uu2Q89^{vP>8_cUMOV7zX80#Qf*3_NEsTeR -e&HPzED@BHhm+|C!pjO;4Nj-YWf8LfRdPsnTNzfD5;|MCH*-zCU*h20%H=?%~MPouP3BLBb<{^_xw5d -P=KeXk9O63|b@WOn)acXuU0|BK4@=E?YN0Zh@mp~@Cz?+prX6BRVug6p4W&#ArlAx?ImGW4w;gT4pjs -rS)agbgQq?i!)@WOz~R*TIV&cZ*-m*<c@!A$M(hZWQu_^}Z^dGq+=c(szaj3sKUe3k!9LHOj_c3#vJBxz^DsvQ49A~@=?jiBv+!wA_L)KcU25J -i_GBvePGtNT_dl&pY)c;{A^i2U)4WR#x< -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 -)nn}o2;{bvcT*+GPAMH5upbRqY4T?$!LAh@ -QL-NA?fdWM5=vcXRjO?%)@j`TyvJznRbfdl&u5TF8gJnYGLs0F5n$NymH4?ev5$nhx=9+v;%*-t;rQRxws-);7zjE(r0b!*h&#~;5l-1F9 -zr2mvMSNu}j1sEW@9M0`;#a*|%+U*D+KLlPsgv#j%qGPC#ljbUmH)_v&BW4~wUr%HjNM9th7; -ahA&uhb6sPafE}=e3)i?#~#_+wcD?5yOE;|ETO|e3bo|kFuY^(+z@c0PzBegw -tZnOJ$`{SPvdq+Q(1Wsw#A)emywCpn*q76Orq5@9iyNK~ZzvdzA;J(?zzG%lc;m4)c9X?A6zS{bJsI3 -AjQ!wU5NeSMD;%xm4Aqdc0NY&?hI`~v)?#N;sDm?8z3=Q}HynMKv{EQnQ^VKflL1Rr?SmoH8SIieZoY -c%#UO#4=_c>WgJE8$=@R#g>%D_j5+R4i->`@=KJpGX10Ndl?h~Y|VN-v5!^myR8)moRx#-l$ZXs_S9P|{ORRI(S3G?Iml1Th@lgZ89YlwC)aEA@TvLe_>JljR^}bK{ -~|79l2J8a3(1B4)6pBe^8xjGE7ne9UHjkTh5VHk@}oqPN>^EnQW}PDwT(?rk+ZCBcyd|&&$RmQadP&> -Euew`B?XVYd{KyTzK1^9_1FBm&g=dJ_3;8fpfvLAiyLF0rwgN@A?|Hf9QG_axuPp^CjuCJCnT4IVKR$ -PDNHlNv(#PReO@6&Xc4-;2hcsS3yDgfOa+zYBT$G_wC$4~$I*=ek|7D=d=h-3+yodN+h^C)ooa<) -tOC27c@#j|ATae2;yX?~hfP!DUNc#?v;1MsM>(p+a%lSs8bIgot8IH(56gu%Pozw~!iGKJUcJ%<<$hq -k{lm|{)>GT7qlZM`nQ)=^XEKxZ1cgV+tenvR*gpJ>;I!#R=KS41c`E`?8P8oMt&KnUv;UaVHqYDF0Y9H?AZwIye|NN~K%-8(!Ux}grH~acd5&e&Teo~SFaf$@7kNPbI -A{0u&B#A&641q8LgD42&F!kG*Iu;(Xw>Wk9kb`}jLk@PqW7{Q<)Nc|$V%5oqH5xx;ZGZ0uCywm7eMdf -MqCd^S^zcCM2XXY+D!-Jkh2+tI!j3(Y3=YAV4$Xj$eNFi5^?C0;TC)j#-AAZezComeVdQ5qqr -_akKr9OJ|9Lz@^cFKNxX|bS^3a@U(nIuAO-rDF?9hxV#MTkJ|9Es(GKU!6-&-s%6EyI=k54=j-Tq+lD -9J8c=Kyy^YCh3?nvB6h+2j)_(PfWU`t<>S%BY5vwX4K_ic0$H~R6-@y^#O5_sx%2nT#otvB|~{EK}1m -wnczVWl*V6ggC}&ET`mevaMuZT8DCMKpf$ZUA(nc8d8`pzH8Z%()%I^%fnz;{BQmt9(Kfd-K -6b69Lj&FT3&*A+R>S*Ibg{i)IWvm~b!QT~o7QKGc!Ug^vG2Hro)$%K3Vxw}!rE743+c1$>O?dM!pqxQ -&>vcuW=u3hRTdCW@wmNwyWI=uk!Re>Hn;3RCo+i;t=MeW -w1lySl~1( -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 -;B>~QO)=wCQ=l+7FkFX7<>#P9x_+T1O -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 -%=iX$NNu-^zCxI{RJrfuUmeDN#9 -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 -(1196J0c6+}l<<1gtzgtl6v^tGvl=f>F2ez -bc@IGv`(W1jU>5Y1YQa7UtmO&b+|htBVeE!&p9CuYK}8xCIz!s|dt -PdUWbU>h7pL+`IjqiR2wm|Cl01*yHE{a+6HJ8Xs0<5XoTeAsIKjLBfr?H)79WxtcE-l%0pdWYmT)G14 -O<2Jb*sJUf8oGTB=+sHYjhV==fnAIG5 -l5CBi*}>z4p)q!XWx|x85BH!d(_cjs@K>0gv#m^#GYTAzX*_V4GIr_Xei`Ng8K|f=J)d#TU~hr@%tY$ -4zYm8pKj8@sOV1(U^0V-c$gq)ya-flV{5sdIoQWK><)qq+DSb;X-JG&%@rFKVqbMgC0h)Yhs)kf8My} -lnuxoLeiFr;?|>;n~5%50S78DDPBBZZn(?R9MnrtdT-UYpHLQg$&l`xX7{IV!`!>B+11TXr%O?Y&!D& -_@qFfUnE-?;=mMtJ64+on{)RcoZG*Bxs%Zz3GnZqpEODZUpwf6>^`ZJnv$uz%?6JQcZmxC*);(UZ36$ -0zZthR_PpbuQk -@_)gehXH%WK)Zr__E!h^5RfPOUs>&OKb*k+J816|*6#s(GSCA@zM?V>F3DlpsrYyLgmhOr2CZnMBJ-Y -Vc@CZiwH>J@Ve4m~$?u3^244DB~##)g58k`$v{^6O%B91fH|8+l?S5L!^C873ObH#JK;(&F}doPk*jy -{z~)im{oEA%Vj+ja9;o54<_9mX1#u;J%8xt9WeBtdwtQ<`z}ZDfA&hhq$&U4D!)lqes_Q-ITD8SXXb@ -Wej?Hj{|fXIi5!zJX?kEslKhOS6h9H)pEbtm50hW^sgF`0=D&|(Jpmup-xxoDEQ%bHIXl!$KT`5;b_d^7e(>C+*)iyY;YUd}Ne}%%82e-;u}_lqqt -A;Rv^Iar^gACdV$WYXMA_f7{C-4s*xR?Al)Se9>c;e6F`0a~M-Tm?k&>>g@ZsL=*d6s4zafM9s+o7BD -1ooIOZe@2cq?Bg?ITfar3is=`Tz&-0fiZJ=#too#UY|c}@Mxwpxb) -)AjJ6{{H>_mD>aU=>Go7?E!yue}8m)ACZY~<;Z_76|-MT#r#n!W{)Z7kbWc~SZ+-o#-Vko@TRy^Na;t -6mjTT4vbAuxNss4bs3^sy+V#SA?>IUsvNe~_TY4oEHXX!J3PI>xNF${=Q}7;IW-hBUAUs^+IxzBbx9e -N(8gH*T(GC4JpxeV_PQvug9;pT4cL=>Kc;$HNz&n~=7w%mme5C^5Qgy>2UG9x6fN0!FPYa%>tl -q3b@fxv7JWmTv?k?yJ7PWa#`U^*KE+NO$6R11&W)W_#3)56K@bm7EoTJ`s!P)MNUkI%wwQN;6&x#X9S -Z_VgT+fT>2d2buXmSN+8K!Q9v8D<>oyw<)_!PVh%4A3@c;R<6Sa%_!z*yIVqIENJF&g>D7)oDre1Ki= -5AO#c=DWD$H+jCx2?#C>!bt571eBpR!ZpfNOw-@z%lEiFKcvk(quXW`*{>oq%M~zQ*AeuP9IVs_774* -dA!G+WhsJ5Jf#@m0L$~p18hvpw>E_b+;H|vJ5XkIMzOtAz@Sc`Z2BWRrSR&r8RZc*>j5*OY*Af*QI>p -z~=x!8~@nEB>t@ezRt8&eFi&HGs&43Xvz;#^~J?iRpaa+4>7_k8;sewG;@Kl`ja -`}iaTfV;o*yQ-63XDU-D4vu2(tqJqHXDwMl(1i733q>;xBWn`c8F+ZNR`t} -mxzQ5=d!%1(#@fS~h*)$z-5Td*ou!<}v%l<$?DxZuv+DIr8wdOk5#9aE -FWa@kn9)Dsj^r# -!q=n)4JKk6Mh;xOWReh>qR}=oh+AFBi%}dqOYKn`&cDVT08l<2CWF*WXtrj=_QX!u{4G*bVe6x`2nv3j&Uli&_r1N-BKzE0)2g8!?X{@KHN(=V)~Z@+Ze?k-7Q_K*cNxDVqy1bn+u=WpLgt}Di`s1;Ox -VVx|XgD7zN-RtT=9KikIcE2GO{q;^?!zEVc_?xrof2*_hHr*M!es^oapCMLRg|{oI=oxMJxZy2!^np3 -gb`uLVqi#)QM(CO;u~r72@dg|nEPIi{sLbBrzp>M+B$m^ye~Kgrajh@2P#xsJU<|WI-CN7JyqKF5?{` -c-8ATijJH<}r7DzEl-w2ya!g-@M0!*(uo|?P)eHz04bpZ$}EZ#Gb&N3ol*bOU#g0NosfU#!EI#smc7W -}%Z(CKWs8y)fr)ZMyzP0s3W0xypez^oa6-mSO@cVB+HyORJ3tPYl!2dHHa*?1K7Wmz0Fz!`+a#KgKKg -m=g5C61WWGwcDc953Tl#?zawL<6$>j_bQ0q5FI@TC~u4$m1&a@fK5owI3I%1H#&cM{Uq=N7Qoq|1#g!k22i-fEI5QAzQ$XvZ -AYbtxXr(`nyS`D~ittX6b%xh-pW8G*7$u1g|nQ101!0~giG5EkDQI_6)wY|_r5&+P#>8KVMC87JPAQ1 -P*n@;&Udlu%8;ZJ-8($%fVNRV1QL^X_pQ4q?bNw-E)sw|81NXUQvGPWYtgn(Un?mh(ihS!@||1h#WM^ --4B# -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 -)U_K1CxeJqWOOF9>}(j5rENaPo6U=OKf8)N -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 -8BU3Z9L3-gmFb8HX__yXF*iVACi_w;b -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 -O9X!oJb9Dxo+yheq2Fh%|B>a7k) -IRn{qsyA`^yPS4Y;O;@}$cM%wv;&jtPHSC$I6}qhkph!o=>}SwLLNztgI@NQBbmE3&wUZi04YL! -KX2-Uky|M&$br%T2#DAs|e}d$30(yd3y?SzIXZI21}#;gXp+c$9~0T=qnu7)UMnr`PMAzi-p~_GtOh> -&!L)*!RsoDeDOu_iJKIRVxiAnTW%&D1>nujv(6?1a1;+AYKD>h1@apVCrWnuT|h0xKto|Na8J1pHCKP -DAl?1e9Fxo0+xPt?Tj$Orbi10AOm40MHsp|4_t(+cjhvW_689d8Xlw^oy}n&c$9)Na6SPR7?j7H1`Ua0MxwqUVKAb(wHVRz%oV8(lnF;InQPZwMk7 -|)@GPzSTB4T2lF*9)<9xHbB2BDULnpJSAJJ?^Ub99_S=NL16PPJ)jqXD3j=_W}kyKiFT>~E{7*y}*Tm -hiQ!cv6d_R}gL80%P4RkO<@CrSH`#h~75Z}a{V$Xhx?!kP=X$EjIjLOz9onavWjmau1mxj&NzhY4|oO -+O6`9cz7jw-owwSZCkTU-svkj%EL%r~UYN-M_(y|LVRzVB$~h=WB@~6kFjTfujToffz}U1V%w50j=A& -jwiW(`y-r~rJG>Sitbim7!e!BLy*mPlYn>FmF@mQ*oN04>_;9DWVQjgPh9#HsI6cygnv!I4G-e+#%9l -mjVqt-7D-9?SqO>z(Hw6|Z1nk<+5jw^ZSBf1+#06ouAYtTi)-ZW%d|d$+;J(suOt%a)&eD|eWV!ONGt -0WJlWu6jBI3$o#r9DH-Crn@%O&eZh%}>)NKPe -Ao&7Ev)!S*yt~?;-6h6@H5x>XO{{5%ys_RWdeV8oj-#YfzN=E=4;2-bAp4%Vgc33=lrN&tjxAm$jD)- -XbVPXE$GfB%ee@S+9hl{syi|Oa*^yV2?%}8O%=?-a~zWATMhbnNM!+BUO^R32K9NK-{#@04B&b6WQA5 -P@6#jE?pL5!Bf*UEhBQ8Q~QDsOmKxHC<*)H@qDmhV3cYAEia~LPDQe8MoFt>kI2xT -tCMRzL|KH~l)VQ;MUFn--FbH{)s*MkFCH&q{arT55dmnsa0JC&@l8Wq)#fd!omHxA=(p)Ltg60PNclj -PrWuk~!LtlLrxtbV>K5ktD3l#QUQFRws0%(H&R|~&SHov2`0z*?^-`cC{31x5iLt3n!#bL%?%4>%l$1 -t}$QtRzCQul2%!AXc>jx6@rL1kF1dXb$(w3n%FjiNZB -xf*}K(aFuN-y)-3`FEg^&h_)}0Hx$do`*Le823uZ_T4B5)IFJX|!m3h`(0nouxGW`^2$bc-g*Uhnb&R -^0(R3Xe^{$rGKYRR06h$bCzz7&Z(C;$8!f -o7a)70K)<%n!Ua#^yWHE0tA-`bz>PN#xbxCMQm!LXBw<8aq-*yr0eld){Wp(}{PiH*3h;>`@)n8({*< -4x6pSdRn#XizTO`mZ>+?F)@|5Qy(UGuuuz+jX8Gc;i8%yS4l$;}v9o6x})1QL=%|^;PS0@Ni>7B=BZE -7H+GWf64qRH|E#vH|Ccwzk|tboheZ!wN0^JUFU}|#Se5T!k1u%ZB{)1`H^MyJk -rAknh}^b{s;;&O`+s(L!97A#;kR$$G8mr$obVNloM~vP^|CJM^Cv(+ej0_RwT(JAa^sZ)*6eS8%KpxZgV%(=e -Djta^~WavMVB-j;JnA`%e@*IMsn~2>S+wHEbrF13HOHrJ7+^SQ+Fby?0J8usAs&+$D)&!>Ac)K2V^ya -d#be{m4c#LAbO22kq4N1@TRV3JaP+4(JRk7zlKRw#Qb_|&-ch|gI=FKDFj`}4{!O;H-J8oU_Xx)|NaN -(_djj%^Fs&t-+nRCZvyr|y_1hf{U^`*Dn6qKPCzILQz!+)6po@KNMaNS!_aQrKoJB<5h(H92n~Z<Z}A-4r+|{(ZW#=BcSvdv+r-AfT@%52+90+IV#Hey3XZo%6TbI*vR&VTKz8L~_ -*XLis|d}Y_8OtD=|_Y%)v~xt%2j1_jO~h|Vh=f3)ABd8N_liR{tjrY{HcdAX^{zU`eQ=3PaGGYg2-nY -EoWGCzaAOXOl{Igi0zMn{ewqRP?LlsP@TSI<=oYGe8sWo3O?2`L-W7YArWn&d6#0tpyl}Qk`Pp*{Qq-5`Dg}Z-DA-#0nsE&vM11;z54;qnn -+L;ki7rq%sCF9SwGl8tr@};~Qoc_qMO53tl?!7}uoFGZDZ)GZeAULGTQzQs& -#xxX4Y+7aLcf%I7Bgyq+5A95RDBYI$HdQZTTf{@iZJ}=y0)ux~^Y6E;H$E-8HI)%?Ye$FZ#_UhCP27A -9XW4#)73(F*Mub4|o%$bb4~5|m!WOi*xud;#zMc<~Y|ENpwztL8EgT}~7W`JYyJ@#)+u&h_?f4VgWO_ -E6T4Ym5fRJA^e53hp{dRB{T%*=={YzjeZA+1%^(Aawg-Su$>-!D)7~7<3oK-3;j^DDu|EaJA{r3%9e> -k*7TsqbAvddj#Z++%?eNxOzduCp0g8H~SdqJKp7GCNRW3I -#vp7LzR$Mf-mFph`q!P&A|v9G$ZdRa61oXbFZx%W=R~^3RWFvja%DxkldI@pnhJb`CF*$D}v%By*@2v -Xc_WxGx^}Lfdc)*(dgm2`1{r!d!Xes#)|^6QpkGdm<(=HV&H)U<5<7o -$jnKntNGnPqwAWl7<3xo@Xlc&}VSQ72k0g+ZSy(9ROzH`%KG?JJo}A_kOyf*GVc|(;F@ajI)4>{+;7K -Dt9S5yG4EtY_^tG11>;F~QBx&=zK(vdaeD_J;#KM1RM<4OyOR~PH# -}B+MaG+(H3sfAEwnjYtpE)9zA;2XZh-}lHnkHB+NPl~YAa(mXhv*f(IB|7#MaogDGl%AI-9Uby4J-%5 ->koxk{H|?HQ4Th8X?_l8@VAj4+{+0;%EwOy`o)ncngkMvJFbFIBpG#o0Ma=4IQmvcv~shg&X0Y -;GJ!QI?((P^>|t-iu3o!pu=ybpwEE)J4bFdA6*AAZ&%;Q1JRwg%5eJ{iNbsR`qr#&R6mCfj#cbL6mGy -8c<%dzOYN>-mG0_c_rOEH4wst($)~8dY*A0&HB)j>tM;fTqn|>dynGIYqgQ@i0o(WAJ9j@c!PUX5CxE -hORzO@Z=fE?oxSnoNZB|jqzclvCm~`=Hm-Iy(d7Gs^?S8B4%`E=lUe0`8vAxjS&CVa}C)zSPKPuw_#F -wt~h2|A$*4;@9L492`tF-4%I4)cl#}`*i3;OneMUr~OYP!fu!_27^N<7{mo(IVHtI(a{euCbq+T-z&d -x=$;K>{3Kv6)g>dWx4rr0Hh}JwWV)h}}%8r$b*ZcS2}=U|PsDrt|TkFG2@H11Kvq9}ZUT-Gcmh?u2b!v-90@_iW!`nE%?HnMZ*QaEc~ -#vMl@PA|9JT)mepZnmhaLO^N@(g(=Z)X_!<)OtAaX8r#wyRCkKO?cZVNz62KjTOq`QUxP{Bn0sD9^2q -v)$f+&MmCUlV$!c)&CmclqOF;$P9wW6%k0ktI3yb^$(FHexL)rhGWC$Dc(#Iyr?8e)OJY5gc9kL5(c_ -ML{-_y9D`$*&QfCcfbY~x>%C6 -F!>}QD&Jmq@Z|a`0@5?TH7&s(}KCIHer_c%fSjUM5YpT -k#wv6C}=VaK^(#^?A1PDNA9n#PdjrB&NC6c{BEc$v5)N4qcH%@8jp*D%?ey_hp5oY}#a)3+a7mxzJ%B -MHdQ47mzOt6J2xdqLOX3VZg%te>hIadAcIVNamkok#{b(8wATkM)a*Id;Ua*b^(7B}dRZaaZp8(DO&>0 -pMlBvMULVt8d<774h)7ipLsAp0H^f{SV+6qPVH!1I%cIP*WKbaqWF=I~goOGy)>uYlH&-~K_Ah#|G-?ke9O)V-Dq -bQXXk;?C(#opZBGor;X)xPBk!aNBD!k7BBE0YpoE>OjQN5Bvy$UZta5tjl^%Bf_AZrUXWqY>@s-nsq4 -W$juT+?=A5yjODenmg)O=+L3UCK~`yC_~6z+^og?&)1;eM?1Xx1@QbU$m^$e^XIthw_SXTx>nGIe7A` -aZ=H&8*E~weO}!|CHs0B$#6)hj9kFXOt)OWw=As|S*Wued3XyKeXR9frt=?O|UthH19AX=n*_N-ObOT -;6weLIGp7z5fGIVz-rJxPRq474DLt%S21mCL0O_OzpP%ENZvDXT@(tQeMtt{c)k^Ci~(ov{kITza89G6o#N&FPMC55w2p+_f*3IPH{yG)%MOHTaO)hT!O; -xAj9#Lz=d4yaBJcF6`|tWF+5{MY6Vkjt;w@P^q@}8NCE`MBXhk%r9B>^HOG!?xO{;((s*1NA)A6{Zs- -zWVvo{SZ+0Zt)9cy!Fyg%^apF<@3A{2r4cDA4au}n|!jX9N2{VR?K^jlC7)Z6m#d(>z^Ux?<^4dm($& -}}pAjrXxq?H%r~WzSF7J+EX@?CgmOq7fW&y__a={1_8>h)xJj~@gih>$XYNu%|=LuSLPACP -QxU7YEzy`N0YPjG^It?os?Ev~foS!d4@Yb*jvzu3)5U5I^(Ne^BA(8{zHto~_6H+<5NF(EID82O8_*;Xx?1H8#GiG{hY4%l4u5l>yFKonL0=h2jY?XI4#}dXB{wwFy$_OeY3HJAA{Egcuo{O5` -*UDPuE&HG^s@NioW@ZiE4MyzGnH4JFxm{jRH6>-(S)AYGL+*zi5TMHib>L@fa3E*St^U7_~X^2XmC)* -lOG*nWwk=!pRTX?0e?*2%#AxbaTwXIQ`y)#;Az25GTvU -gv^E^c0tU3GGSDYqr=sd@P0Kr*V2(kHSsw3?kvd+l7@zdl#gB=Trf3|5hv<=gU1~mZSepgLi#>@MZK_ -dNiL@F)u&%}OBt1r*^G{V`wzM7{si1rjNrRj?ZyvHz7|xh6iIJkt0Nd)C%ga~6l&?ebBHxYqK9VB*5b -bO0Qts@($zY!e8EMo53kC*jLnYYKfvzhdkHPn>#c%@(jzSaqb6;2nCgYiOZA3Z -lmkV^TD=WDp*5{#S|F##DM@lzp8%fU(c*NDirKK@^{ctQQy_~PLGB6n{Q6onNW(hxD#|lqWD2_*z#?M -m&-#A0kOhmyy8$VRXMY`pHR?@(ZGYlfDHxl;J+TyB|IO3`h`Q-K{y^R58IpqZ4p7)IHxBd6)7XXo5ls -cibdOVHz82DneJ~n0fGHsrH|)n3H^sX2&qyyjAxzmtUtk7A^6aol7QeQ+LMnMRMyh9%-1E56vgy}wHE -`=TX9Yu9fMkENQ=~B|$o!B -~Img&(Nu&tLQvrb1wfBw+|dPzuEn6huNTf9rLZ3HGv|E>Y5!R7*+)9W9 -{DQDh-wr}b0IS6r#`aR)GYprxY$X1HALX@a7=fu}R&016W#}fI3DH{p{TuFiAZJ`KW3mDIxuWa>CVQd2(ux78|s+5;cLmtLP|Nq^_l2QNe83Es(($AdH-_fmX9HvPx*qwqnT_ioqyk6D0bq<#Rt& -*Ew*#KgUk2TJZM;vzzL=6s+n`H8fG2Z;-NVb_95V-{1tpzW|ONG)~O)Tv7k$I&`J>G8zIHb3jeJ{saS -BE${gAPWWZ-;|5oRH35)*>Ax|*kYia?plS7L! -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 -S_*O5=LxXor|mQ^jwpzLVx0EmU0(V_IgZcX -xeiAFBc>j)(K@@D>)Oa;WUNR ->QJ5T!4^5ATG1mwVs)S0yWf2=zGoE6CNZZT2L1?B<9hA=+avV%N`BB}HlN6X}Uv^Q -}chN0FAG~Zj&*VZM8ih?bmY9kX3)>YZNL}Uv7xmItq?YQJ2YN8_GfFavie5~&ekpx>bDViC{Og#?8wv -z3!>!NV{Oxm5nGYBb-3B1`);H~q#YTr$2t>|;ML>_(RVa@7ohUjA6@MXZtY!K@sjtqXVE>UwqfY>qZV~Ue?|vW -B4ch=Hu~_HdcRm7tC>xih04(QN)%7Lhf(MDPVBu{NfzhKw2JqXSx_@LA7bz(ehl@Qn|vRYt4^MaM8K2 -56H{eFhY6CvNz1MD3td{=W?*y^;ZUz=cRXQc7D=PYrh9DoEi#0Iw8tBZQU=DVMoX;8N!XL-E(q1opGZ -%|ifXSf%qRWig?5&BFZ3Yg?h=S|9rXz|T678MM=Ls-J4-Aid<(3w2UYc`#)YN>l={1wlN(_a_pG3jgsRRXG3SKjVM=XZ -Mf){6)exWw+m6%M?{!{PK_gr%Lid70&J7*_%4c!cdd~1 -73eM(y!qH?JLNsu9Vd3f*3I-D*+k(Wc$YESX0H!C;fJCPf+FaKYCm!0S9qAj+e*SFcehi%Ha}K -u+Y-UQg5>7Y8j{8_9X -;Cp17U&y6doM%w2egurOb3LD%^1Gk%+RS3Aefy?30ogmzhm4ZW!WLW^6UGF6G#2n}5IvJ_P7IX$C~pZ -Sa%)@@NeJtu{F%KYt_*3kO=X|0&=Ibc|X&=lyjE#7{xu+FZ{HG*<-1;uqBBR9RN3K4UTVC)&rjQvsch -A^K4mRRAD=Yq1J-_|2^SHIyq@4|Qf`p;ry{ew)l(BLLovSL}}v%}fEZCi0{{$-;ki_cx!^2)zU%6=xI9lW9Wdx32fhsmx7WAP_x7~x}DQngki7TFsy)5*=JgJ@BsH^VdXOldWKvKK!^@i~ -ce9u2FXMNEeS`2gQy!2EGTXp=Q3xIv|n-GBY$*)9GhN!My+nCR1ME$z1*B|=NKJbm)fu;2T(=Cmy=}K -Bty#AByB+oQoxA(=`HuN+?&wq~9Oer9zmXChHMps=@A1qUUe>{}rd$BRXgV|7Rl -vxtx60$`4Qp#&3(tU6c|RcKJhldrvG%r2*_?4ZUtf|J|cmW!6>tZlo8(S0{gRUdA5i_k#eb|(4vB~l{ -w!Cqd0i6fY0nVNw -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 -iHMlPUFYnIm+y?D?)K~qD^cP2ff7f0YI=KFYtX -2-kRth%nqEh5H$YHj747USZT6jeUYz>zUS|!D$!T%;_R|2u@N(Zl^8>gZ}dL2t258`|nx~$vIjD6x;w3u?TJseP!Dw(qyKe~2}Z#OE}a&dwH@SU6F;4jOSx5ih8wJ -@VE=Kg*jHL{=uCmtGX&+jScK;71kv*!A0bmo-UnN(wa4d|0c!rB%z$=MiUP~C -kzC6)XrW{ToFb;)z+pv|-r)l+xbK#C*)mW1!UV}-tP8|fN4PHDZa$X)%tF{(>7cV -rHTT7&v{qaU-gcjAj^nH*Tfk3z1UEo`Cr-zZcL)D;vA$X>#Maw-WE%hv(MvKvH{^rX-;ruvuTwT -72Z`Z&|HkZ`$)nw6mx5F*GYoFi8q3~k7+8$x6)wm6TKhD!}adS8nbg3i=A~@)byAc*lz8N4Q2!!;?>P -5NGwf!pp|V6X2k4;!Zn$Bt5hg9EN1>PudL(B8!J4R>vMPCM_b0q0!2qj#)RawNi{Q$yZIQmePk@V8OK -B=b>d!GQ9eGF@bXv!zr4-C!ru``+XXvMB{u@Mo~`!k_M9&A%)bn?gEV$IEvoCa%r7=}gdaU+R;1t ->B{L6u-R+8v_$VsKn)+G=ZyhdOed!j%=jUWe;3d4!GFFA#6O- -E;w6$2qmSjll9Qg5zw>+!FD@dYoG-=r;LnZDFLh^)ar#iNooV0+sgd|GbFW#eaOW!?wGYw|m$=sxnND -K(Ig0R>Jx?hPS93Z^!l;=H<6lcAEtK$BRBT|NU3o@2NdL-0R(~V5H?o*8ESKvjGD$jV8%HRWrtunGD& -x5?E#fGc2c|1rb9tGbTT;)0xO7C=6PkXb3r0vxy-en%y*HR7L42eSv~)gHjA~RRCcRGz_>ro0B@Wak*jsvp8y8h9fUM$ZAmqw$e?kEirbgdOP -O5lok_9=)2i|{*OwqN92*7_J0de1>s1UDkM=&^A0vZDHplg5zTfBRQe77HS*`=+=FHEDxg8tYAOep#F7GZeZu)WQ?3?J~dO4l&OL4`ny24r@x -T`keZmpo@QqRx3@SM?Pz7Lb|lI@JvnO%Kf;~MIgRWy-yk1qCYTv+O=X0I>Fs`n7E11eL~lZ-}RdEGY) -{=@>~a}~YXl+T1gRR?_!^)en@^ -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 -~czC?;`?^cBVDu`+^P-#p;pq}*Da(|^!YhY4N -lYy3SA`1GJe%{I;^$)B_S2^A)~I@Eqbr74>T>JLg#XY8qop4bYocA|s7R5G8 -gC!wcEmiSN?TIQEwt`;VJO6mbzCPu#WB!#+Sg-Q?pQd&GDca`uwG1rFpGw8TseKbQ83JhhN6bP -X4gO@YssDL2m7jg?jll`%|KLdY9}0sMkFfL}`-5a*5*n}tps=5c>%+-^o>4H3jfHybt2iwQuSciIYKl -WvfOKkXPEHM@z-;jhI*39NDik(+?QM=FQ!lI-DzK1+ijA7um|#=20}720NCA-kveV^Kgj%M3{8Gyd%l -~OwCeVfWsb$RXTIPF!K9GqG0zEMwgyKGaEiPV99(Zdsm8W#24iS#N`iXqV{X9(mpm&aI -{Akwm)d96IB`hK*Pqdw^6SbEk;hUAB)6pNy9k?sk1=JkXS5@y&IG1*N*fj^GhqJy-~29Q#f7Wbs -*7EzD1P=#ESs4>H0Wy`{Yq`@{7ToMldvyC`&0Bah{W=v#6jUki0x*UQYAx!X`)-}+nGC?~AE;i_HHDP -kJkaa?L>=ds4nZAOc~2W2x0S3wuZi=07IgI{Tj%ST4 -|&^Y_tkb@mUo=On2q%6+*hLHfLIJ@7Zx%)bAkkn3W6zKf80esM>i#^j8H4 -FjQ^qzqu>phANPMcPj-cKNC)XGZT2oMa(i0O6m=>7=h5Jjd)E0WBLT4c=3z`y86W>+n?QmG7{Z{WTKY -cq37!KZl+RX5c)$eF8Yapqb+77*>d+W_-$G!2Sl6g>5;xG_>{0J-$%x{L1|A64RzWIBN`Xvv^t8Ib6u -7;Z*jSKR{;P`G_?8i?U9>2~O`76`?Y_`a6P4`biqR6|LsJ54ylr6dyZ|zXgU`5loA6%L{Th3xz@ckOK -w*hV`TPD|h<*_GL=R!n;@N(q`j?5_9?t&wKE)5PlKcr)0NCTm^? -F+$QPKLqS~l9=c*F?LbKb#R1x&ayEoZE{VNq=}{=xUmFy0Txhb!w;v&yK`oX?`<(drexX}ZilALap%R -sSnn|M+)gg@ipUae6&2BNmSg;#S8 -gqrp^BZ(R%n_(fZ#bTHn%51mWSFD@hWn2TH@l?XfK7U37mb;)FJzMK#Jcr49-m1zC;pWkHsNl3_k`!L*pev>}$sy%<6_|2YLY8&aTKVGVT -tf2mf&+We`_NV#$fU9W+XDNaO=ou$44zk))7)FsK!?Gv~;5Ex)H2SIV2lx~Af{ma*1R!08g}#)8go%{ -^+{PG`x@-cWDHTJP$fxCw6R89SX^EhR2Z&)HWr0WrC>Wo7J0vr8-$-HJJdn^S3;Vai2=iCvjw}H$CgQ -2jI0rE{%%zz+dXX%I`at+|6YV#eL4CtfFw~1pIXz%1K;}~^3_XB@Xgb*i40QECwn*?ezoao*@-WS&xq -{D=2-RUV4@|_LK*kKR9^ZMrHqu`m*}+_;fXlupn^?mFhr@C -Z2W;Jw106?G$;^Bi;Ri7;)-69Y5X^!L7wn{LUV?5PqIP2`>s@xpa~2tz$%JCnRm$>RCJ#H3OwvuZ^E4 -_J`ozAcFJSOdQr%65!&?le_|`8wd8~_)~QMT(pmChWyn<`?zMvUtP41Yli&QMfY -V%L|zPaneRL^w)UBV%M4cUD%RQLD1s4rc3z)uCMCNE)ZOn}Mw+qbO4!`b^_V!iJY#qVEFMe5E_JIyPa -&HDjZ24%gZ{O**4KHLk}*b9{Gjrn6}$&;*W|iFw*evaP3)WAX;&c*iaF7)yDwdgFLB$(W=!ffz^0%hQ -L%)=xan7I9FHrrp+wI@$F)1Q!=Rp{q2N=dg!IxniSp{EXIdJy#?|REgu(hATlR7j4#SBOwPoMGWu}-?pSy5r|bX -yEKBGgKKN4?eLe6Gsharb;eil}=7fNf8rTm&~C&lB^xsSP=h)znnJ4%7 -)SH(=0VYU2QoKx{ubd0-2342pLqg)V)D{K|x&;CVPTWq>9yPY6R{5E_gN)9vvoJ)ePjrBH25Z7hJ*f= -(2_FjF&vaqBFD|Db8;S4ya{X+`HlN=Ul;sm>eKf1j`z3~farY@#qT%(fRLnK9+#*~AS@l^RZ7|sK46p -Mz183H>D7@h-Xgf4t$~<8)|M#?X=;t}dztMEcS$dBR$9cga#4^{ClaYAyQ^lK@`!G@lg*bWTM@3MS+g -Y>2q!vgde)hV#7Z&pj9KlSKFyqYee*PXhg?YPR>~<)b@-!>xrZK~YeiYndw$&p;<}xM)fGD&jf;vc&Z -Q}A(lFlkvgG!dU!Z#uK}qji;Z;-Y1vOu?J1I`6o4`uz@m4lpWwt*HXJz7o$bEa--)alT0A&II0384T0B~t=FJE?LZe(wAFLGsZb!BsOb1!3Ma&&VpaCvQzKX2SH48? -bT3ifWeyWq~Z76CF8MTP*Kg6x9MqHMM{4oaR>$)O`}bC>Yv51jPuxweV$mc?~c0 -X%seLq@AbWa~e+DVOn?{$`3Po{_4iI-?JY7JsqicXS++@+~J0f^)yOVjFT$e6R-TNz!>*8%@4#~09*$LPPe)@scVx`zjEC -Azr>lYb!wG;r8Z*rpgAWgQFs8RG#vB$0gR-RKYU%`^P)h>@6aWAK2mly|Wk^)s#oRCg006xO0015U00 -3}la4%nWWo~3|axZdaadl;LbaO9bZ*6d4bS`jtom9b&+At8k`zuCpShfmL1(ym5_0aaPhiWUKo~kM`j -uXrp+iQVqVOJ(X6M6Bi?+6rTn$%MHEch(4da2!*CRo)&TcU(O2 -S_V)DXFY=0abHSgtj|Le7@NYpdno#rh{9Qo!cAk4A0fn=`&tUn-v3khGFT{av!LX2WU?wk3u?x*+W8n@!tBZA2%iU9l`Xxx3s -hmV~H=i#CsZMk%2h^j(hs1{xw6MXrdY8y -;UX!!O_R2sFaoG^~-@516ArRc8IRfD&YBMgtbpf5_oL>lu85OtEFB&-fqy7?;jqA`yn3@C$Hz-7|XF> -$@5;8MX3Z11dmmPFqu -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 -z12Q`WH7(<03a1`wDuK@B%(cZn+MO{- -PG?Z?Wr4QxAf-5u**(3wN)_eJ=x=@KAt*}0or6mGv3DW^)84=cnBE9q>*;`QQ?6QXaM?UcP2DC2#F$B -*n455IH^WNMTpyb1+i$9@KKf-*)o==U~ii+Ya(K}noPWEc;|~;OMk*{%O^Bie#DHk>P_-(oF(QM@j2B -eCB0(_o=tKWp;YyZRHuizBjLJ1Kaps$_EzIL-O-n^son#kv^7x&nT(8mVKk@PZL>1gb25$uW)rF~@rn -dg%K9m_leO$+P=V(wTe;B*F0F57@04v4FPF_`KEnm5GeRuq^Wa5Pfv|}pxAPB3EHSH`Ek#sxX@icwLK -9tz1d?FYYusKw_KHk6^Q~!eIoAP#f^Qzz)_uQ`Ysi!YKMc8d^4Gs!Ca{WR5=-;|#xX^Re34@jCCewc_ -W~Qb63oO1i=yxd;!wM}0*KWT*7h(*$r~CMlz_3!Z;dD1$hf#bqwEevS~8MW9202R)bUR01Z{WB@INDj -#ks1)6B0E-V(|o~g6?Ln9&Y;P_g*ipx0vc`fl6i&ZZPhD2y)N!sIv~K4M9g>`r5P`5@AJ@IM~EffBlhSj>a@ypY<7b5>R~g4yLJeO; -bb$1izgDE7!2oq!7wSJW|s~oG`7>In%^=95FR4L`roGXC`ij{kfW_IS9*?+G2`fRt@(`Bp4^@V_-smZ -N5;wR>FFHkU5dcOM&jK*bSqum_2J)c34&#OP`nQg%0yDHUF?IiiR6iy0j9E$qgV5^ug~i-+*OlcSk+ZI>qQYFG{ZW-u -1^9Hk8*uS@Rn6SEw#YM~j;6K?uw?Y0CIjUM3}Y6?ezVBNbW8ObWV6Hih;Rq`R1+8sGxsb=meL_FcGpy -C5eH@(iV7@<3VTvUG -oU=Q3?Zn(yH7ns0*aq*1xob6aX%SxwvZvo)xH}_DQ$wxjcwvK68FWGOZPi7TCqg5K@1O?+YP=llg~EeqZh4pBX04s}CRo<8(G&&Si3FYP|D3z!`G@5Ac>blVJHGwA82I<~l1@WOl -3biWWdu(!++J3f5&NCxi -GV!HhJ^(m?$K{0MGl%U8yBlJL}YD(0~cSTf6vSc2uQA-(Eq21LnK4iL1wzS>@2{V1-!UR}LjUHw`7;q -`4Y_5&C(%$u~t^=_X=9FRD4uR0RRWDU!BZZDW9K*Z)baW9st`3+QOeGTd5r0-(t#6}*^I7>Uyn#I&5n -!h6t&EqnBg(-HnmLQwRS${osjCL?yUdMBuxeTCuxb -yT-W8Crt)W;rFHQV5$IkP3nN@6@?LR?LN`==!NTo=$Sv`oW~z<#4k$(Gp@w%{3-Tl<~{^C3_wEYOvrh -7h&d%f?_H!eyIzRT{c|LPZ!dBNv!#jYLGieDz15hnOb-#b?O3peAMc0Xa_qrE;Tsep`H;av^hzfjvrp4L9|m`%XmnpLxu?8}T3eIkkb>iUG^Q -x$fOVm`*D$&c+oFXYn+HL*RizQn8GWJbLtV_(c`^PJa-bixtw?kC{H`yevQAb!rR<2>IJq~KN2AV8}r -V?6LV5HP)h>@6aWAK2mly|Wk{qmL88h7007tu001HY003} -la4%nWWo~3|axZdaadl;LbaO9dcw=R7bZKvHb1rasl~zr2+cprr^H=OR2TLBAmtHcS=^=HTsb}IQV=L -*=f{3Mvngm#USXK}D?b!thN|aQo)rBOqc<=2e@D8r8uAwke>D3JcUtYiGl`OlsxX3L29ng7~<6D8PS4 -O++$Kfx_=9O~L7#V6LEbWET4t#~+(1R)Au?M<@EmGcbl-4wmx1x9vD|C6Vb*+}a>@b3AT4O!@KA(TRv -({J;4t^63hlMQ5ids0AXztS9$^DmTFulouendB~&?2k}L1+-oQmujsZmWt!3sPJZ!CI8Ct`vDx2`y`i -4{S`Z5vdPM&JM%{i6uNgE3N$V^Tc6Y&frSem7~Yi%bMSM4ZV)x{hqccQLBIOKs~ILuVB%0El9ECFV|8 -~Z~ED43JbG+W2S@9pR4=CM^ -y-)2|Xvcy9-k84P68op>J6H}WT~Z=DG(+R1*rXK~jwAM&`L!J*EE$~(Z=R@w(0%>ZM`ri$t+riZyTT2 -l&X+gY$3+f#^Nt$EvYV0+-ZSS?$ff_ZxSd=5mj(J73%YS09K!YS&-)JWjTS_0YUT|eClUsT+3o+nF3v -sQHt1^)p{9C)Q2vgOlcQ2QN{}iwDRryR8<4^aP&%p;b#1&SZqb; -a=B3i#=!>`T)@kLd1oboYPJJt6Y>B0^2t+YOY&(gm#(;EpknzW -)dh$sH=FS0(w>qvO$;1}n3sgh#l1+yYh5FDUPHcW*d1y>_b#34!xlbP#|&1}sCYH9iOuX=k)QGCdi6# -8b?(@%3OUu|EfSJ=%6+$RX`cN>#*LzpTcU2klVi;x&Dty|J;Id&`4ffjl$E8Jl!l>!Wr;B5!(X=G2!ju&)_4 -r)Ng{7A8^Iz2Pk<4azspvnli)V1>ZbhCF!u|k{D*5M31&n(TYBoN(;Mz8uiLo`3N?u{0UG?0|XQR000 -O87>8v@UIOF1dI10c{{jF29RL6TaA|NaUv_0~WN&gWa%FLKWpi|MFKBOXYjZAed2La_YJ)%!z3*2H$w -3W?=OW}#$e~cE(B>9`+32WC%&y&CQ*!CIcXrj7v>njZH@-J-o^x0&R*>FWoqVHb>yV9!{ACD6sY#%6v_81>Q`ZKov^BDZ0P7nF7 -hyM5$s`&SSWyk^AM9Jc8uO(rj*Us%cJN;hP~AYoc=^V&}ePk3GSyY)v_aLbplSe(ANuFT+rtZxPyg~t -7t-jz_2Yo|_NCCCx90&|*4b4Vz5J3E0s*7b0bd%sfjw-;AvovFSh$}x8s$|2lvYjrrd4zeugO_OCoG< -|ljyYmnGThE2(7ohBZsk_QeZL3fKpZ|i6ss! -B%k!CNoAu#Se6qK{%UZlQKxv4*e6y|U26`6-w9KngnMYaL$R^*&y}fl^ZA4xP{o;q4MyivyQ}MA>?G_)&?Cn<8DR -$?^$wgIND$^m8>$EMJ1wGUaR8zOBrmdxI^&(aBq*St0d6Qqsm-(vELnmq5T$pA*o}Rw@AyxV6IXu+wR -{%KgAo0&%(|Uog7a2gBigVd4_{HKvrkSj#0)B6A%tL6dp>5OEWqK}E($+(?^!D#d5I$Eacm?ZWimR-T;ErF#v6o7p60GP;vop#v02nE4ih;GhO060iTx=M}1Y-6)g5WEcz6 --vuYdtPlz`BSx`9ejtw(X)vja11_fh3@=wt`v~)ht-ALq*HNHUZq8zeSH7ZRJ^!o%S)NPDw) -c;1NDCaBrD5?rfJ{c(~?P1KlsqpGTp#q)ouWeJ2OO6FsXCc9JRm=DASGPeMkCXS^$(y1@cwZAWCzdh@ -ue|8R2UIG`WSr;C-3ngQ;k$#ihJiz?v3Cu7H?$OPG$}QF*BtP~O0ARpcwFrg|p7s;XQ7V^0Mz3$~Ue0 -W4Fb@&ybHOP^Rm-fYvxUl7wLZ1hyX?AwyYrtfN7@{FHhdTdU3k=aQgi8M9eLo04RvcE16A&_c;(xjvhO0)>T -^$wK;a$R3Jv{fi_Q^HjTvff}CBL$xW%vADuR^<(sqwDi7K`-J9&~y?pih`NyA57j{KIo&0=q3M+bYwD -;oeo6}csP8TnJ{P^atiw`IN^$MOpJ`xY%f5%_%ot(aU@4x%Q@d@ahVp_kn>oaWJ^$Qv|Cw_90eF}`+y0}4O|B6RxZf~N;QYzI#Cr)V%ljT_Jzs5Pb5Ug$$qTIsfQi$MictmlsHQDLJi~hl(gc_a7(;Axxsu36*dytN|0OR95G*TXlXV -Mhqg9Oy;QB(A@LMUFArGel6{4tW_=eI9pjvRphfNC%t`hMUq(lu;0~ZKp1$51MaC~Mv+72L28j;p#d4 -v4mqS~2AT1ymyKn(6o5_kD~Zr2=C3ShBZNkY_A#GQPbO#JQB`#?I?JOiP*78j{Xo2J$fA`tXh^uO%8S -de^Q^!qDN>`eOZb5Qc)aw@K94+9+%ZvF7Guaqa7anq19%)IdR=&Z~KhKHG5sn5N)IKL~L+m#yb3X{3Q -{l+ohRHYnl)uF&J$!IhD#Fq)vXdIEf8%=^mUy>f1z!oS8_}d9gT-^ff$^~{cnG9{bRiH61V=A&r$-mD -}>sC%2icoT#ZtlSIXp^Xz{y!Cc&hLcmS(V+;=A^<}jE~S_JR}CxZoyro01fu9F919V;B<|V@MsMo$E7 -)J=YOU}%a&@q|C(01X<=4p=>Jq#c_y=Df8uj=Poy~9b=wdxaq%<)P76j!1^2{JY~NB|FSNtp2?YCWND -$y={Pz3AX^gAsx8>)$an~9i5O|O^X@LyQgZT>z_#!QKixzypQ?}qxC|J^>FZEceq{X0oyMstM5HG7T0 -!uPQ!iMR<{7M%5G+i~r0p8s_0gGE;oAV0kysls~#v~bz=nDo`B;!Ku3f6~%UpcsTKiyW}D)?e*m#~L1 -Cad%w^0ZiD@uP7OcyICN5e$(FB3A-TXb8$SpU2AZv)@W^B^of -t{H;_$$tx!FS3#&6!|y?X6T4prz>xDa5XqfwZ+gVs0g`=CNM>qm@h4ft57{A+m*WDPPDgJ0wVO@+JyN -Pr1=;+p{P$R`8!ZF+%*}0d -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 -;Sr<^K+9=7sy( -sQ_*vvrUl3YlU`$H1I{~pCi04^m20f%f5i5`#BoWS2N{0Y-iaUQaW7Gw(46$` -T@AzqZipqzQncay`u#;DB`?VPfXW7PHw*!I6^kGMdn8f;WvUijWNORf1jOqp3Ka^f%F|+11tm9^_Ql`Brn#6V;D=ilV -ya4p{n!MR<9m@C0v(r@#FWhmJUK)*^)Taf^rfiLekJB0K^NqUenp=wgl^m_i&$)-=$6 -T9#DZLo%4pZ!Ez+V#(OTV!_%hD#@QHKE-)l}7yVK#^M1r>?e*|3pXlW~BFTW@1Ft^xGYT)N^ANf8g_*%OGAzSJRMQ{AmqYHErkayJ*PlXK#fs= -?`u0z2MF|3C?~j -s)b^D!mprj=}C^oG&fP_u}7wcJYoj}V+Zg}6EuF6MY;uo;P*5!_TWC>Ucy91UuN<%AD#FK0oW-p&15?=|FULg%UmEN~ej3fRBo%yyxO#srK@)&^o+@A2hgDm0%w%eVI88M7+mgNqYyWjT#ql -Ld*zG-QAxVr~R0f(|QstwxKm1wAM97htqkxSciXhDdFKr~yT2!`~SFNagEKccKEH?@?kVc~>CW# -iV&7Gyw&rAPr^VKCefm&i`mA>x*%nVded&A(O9%8{>^DjmTIsmLlqv>8JTueE;Uz_PzOdhzisw(>6z@ -{|^Ya4yAc7}7CEgd*ZB>w2_Un9?1(KDezt4nvNvMT=}>+1h#G|qhu3`OA}t|a2)sSX1RUCUyUkz+#(q&9$~?lg7Yc~~s#u4PeB -g25-abck$ev@rB;G)@2q7o)%G5t4L-ML;NQ#Dt4~!>*ifhx^4Ily~*gx!8*sr`O4ZP0iIPO^XsFmJk9fT2ak3 -av}vy0ob!%64-m$>8M!VL9mT3*JeirAU-} -n%%ZOSqGTMArW^rQwVBhaG^g7nEM-yhHS2uM(B|?Ymq;Wg@Ea=n1Mz`V4T4e)t=3fZ~pBE!ApN@x^K5iQpT&X@vpz+Gwre-Ay}C#%n%Y?J# -u3Y%KfPaShzL7x#A119#N!03F`4dl&fbZMPxl;f(qLdZJ|p!iUNg+z?9t`YW*iff#X1hUdW>Jn#0GF8 -b+qceKa=Ig*-<@AMhK>hCdrTpH+`6+q8SOPH -hA2ER-lZ!G#-WpE%7koLN}Vb_XCF$a}nN|)_gIs?cYfTCzW7c`h$%l$eeoUAbV)_YJNgIn`eChH3t^39Obh9x#+_iCgH&JjD&5tBbai(M!_ENci4#(u}LfZ&cuPcOua)v=8X -H-b;QrYj@5`_e-h*8xSojMjYC*5-=D|d|^yH4oa$jZPylV*lq=4dXCh9?+iy9O)u#;f$g?zA28gs-;l -3yA&|sxaCBOPDl^L6C=X`9; -9{V1}p@j8o(w8iV$2o{%=m}YLA#Y}OGJ1`k@Pu9=^*7sR#uE_cty1Z&C{42b`Z=vfZjo)H{ESK7eT`s --q7{`4HL;emUqT^d{=yqUsa#U4FaLy`DI9qt;b{1d+jA9{FJji(b&Es!O-lmWZz@p2^FvMj&HA?w4>A -7^TDYnNiFU#s0w(VTn5~&nZ2zcC_){FYKaTYTr;DOhP`h2;pEfSYY3=hDb)j1drR6;{Z0ymoNBsNC0? -g0?x4TT60K4q)i+R>h65OAxLob!@({d0;=)L}5jhGmSAf3WSfxkUnt1KOrK>%n^e}QT1Mx9ZzOTLxdegE~HuW{##KNuG3F$+Hk`2 -&o&yn{x;a0r&u-&uyU4e)q5Ko9`bN}JP%WFD=I~-aEEMwzCT@~J?;nq$Be5wmT9U-PK-uv6bziIe0@s -`e8r-e<(+42B7yFw=dfcp{sYJ{y_uCsVHg`!>rP&^AS8^*If-R6K;NW@=0ynREm@au1m{|Jw`9`On1d -lc>r3oER>g_i-ikEgE>pH9Ugh*6+}!zafH@D_5iCO}jr~_y=Otwz*0);g?xJFDY -X>F*umUww0MbmVEREypKT1s&-7Q>TdOj!8;NRE%d(CT){dfb&5jb>R&><%l@hL78D?rhBQV>5|KN4JC -hM?*yVoU#*y8lLWf_yzAX$33Pv_(~Wd{Vi-L7ptDhRZ3MTXvZK*h#*G5;SK$&+JGXZE47{;p5^>+^{k -vQD~J-L#;d$4D2hLP_xORW3((~XS)QTAb;h7krAxev0{`uSR1YE^f{1)L0uCb=!#B5M)nH$kgj;Bd(~ -%})#uxp2O}lb=^zYo%imryD>PqS{V3o1N@x+6z=(q)_r@@-#OLV%NP!91U6CTdM;D+U=xW; -!aOCZR;#wIWl;Q!H!LhjBP})xWlZEBSpWLyNPIW%yH($bKO6;qRUgy?C0-Ocsvl-u@j#hCJboWcTutV`6(P3VYzsAGtYV -5lsGRZ@CX@mB|Enx@Oqr|{GqpfdSIgxw9AA-Z%1OEq5O9KQH0000802qg5NLc?uv*;QC0N`H$03ZMW0 -B~t=FJE?LZe(wAFLGsZb!BsOb1!pcb8~5LZgVbhdF?!HbK5w2-}NhSo5@H@W!l-@xl1*1X1tDf<7?h( -JJ())9*H6$i))J15~LmNPWoH=Tl&lTyZ|5oQjW8G*Ut1#lZhn~cmOY(`BNiRts*6r%F1H!pTTD^xL9RMtjn~?rPx&EZI((UVsXwLM7j7;Cbg(bv5t%QT8g+x#YR ->tQ?*dCu3=bcpH!t%b~rIg%JL?YY9ivMUQH12NBB98cv{(dQ&zPo)nHkbYnXhV!yqu668hDfc(Vb>{6 -39qS!Zi$UYg$nejVW$=G|-&t1Ow}qnWBJ-6AR1o47V@cyf8Rn22{(Dl3`3%#wN{nkxUX%nJIli7O>-Z -(5A$J{k!4@WUVDYKDzwDM64Q>ncv_neH*G%Newoh%=3tV|xBae6*I;wKNUKdL*EO%^K7Dg~p@FObriGEpW!&WTj2=!znkhg;vZCL*eN$)cm@wlTxt-m{`7F< -HC<{QwfGPk1EsD6#ZYAQ^(kPN26S?td$auOa%QtbcJ(Fox0g(Z~X#vo)^gLO~bvzNrtERY-=}Eynd{R -{DkJe@7Jn^-B^j -DTTN;%H(uSoL5$uuF;SMgaoSb}{s0FnA=EWd&@OZ;^arw0cIgTVj>)|{?&#YpQ2^BdO9nx=h#qBKi#z`~&;p5rN -@0@VlpeJKI|YgiO0pA8^uQ)QqPj7Fk0#o`)BS%}I=O&#ChyQ~0h7AHyB6u|E*N$>z8d6r~WrwPz~^$K -)`?Tv~LTH6L$p?}i!BXPPEF@drTP>ozULZnSal!Z1iK8vVX0Z?ZI>`+|ZkZ_D{CgOICOdPBRx~|n|j0C( -j9CAfaup0ouJ{Dk$a!?Tgs7q*YH5fSb@ZWptf%YehGre0G^xMtr0gB;0=mOGt1Xqbg3C4jnOi+k5R6$ -T9o*-F4@UMVfLn*}MLMCyeq_|tPDugE@4iCjIL)bhvu-(YvR9s$tnpj0b!-_>EV`zEq4kchef;}+bM& -5)S!PYxBBV7Qxy%!N^icvf680T?$wUgX~{&VC6(HPJdgD_()yvaUh#fWWCO -=n~om|&TM0a6*G0t7W*;>M;n`2SBZRt*$bAATR_3U)lS7R#nS#6?d$?c#q}gB@N}4RlImrF$6rRsVYO -MB4;2+%vD0qj-R*Xn4TBgUbI*BQk<-h#q`)Een)QzaBRAjmep&4uFPlVB~JLqw&C3y-S$N3vn>*pzM+OKw8gCfdtE+oFz`w>5Z -KtP~EafM>yGWr$r&}W_sPEO!0fS6)n`v;LvvR7g1N+?)<4|!Zs$Z1}sF?fQO;V}QHp)hK_E!X$i3t_6v+J1I{w(oLl5vc17#K(57c0I+{p+tv*5Ez{gDL`+?sW|)oSUi1p@C>vMxB7M*;u$7}rgl{;gfJTJ?+<$ -@NKPXN7B9nik;LNYt8^Kd8x9|<>0^aBA2|>ro+Ejq9n4>#<;iPczX2IFFYmyROn@R$pt#^F9V9IO4h+()(EREZo4wD -rAHc|`6|K^{c{eB|uB!(`~FND1q#fumeaUIedZC8y8@ -X=s}U1D1zW6Z$Pc;b3~gk^tn;7G|`u)>~$d-Zn2okDlKOIg5246I_-3Jg``5)Jvfm3Xu-vzkOcM1|Q+ -0CVfO0Nh!HKuRCQ4`=eb!`>No*GhvJ5VHiQcBz3}iGCm<8)}xQL9?hRll3wxtLyz$z0UWmWrD2sNU

F&$@&4WU1z -MJDKBnZ{vH->~*Qa{cz;*0^Y2dPL -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 -KR)eu&)L5RLNNe>-be|3*8+0|~n{hG%GCB -Y(h4*F{l>_#gE$s)9Nd3$L3W5QK3Nbiv=Uh$eir)8bXr?oH)|qa<`*@E -uI6$+=h1TSgX^wEABycS#!Z-7`Lm||w3Sg~8BN8mbN1{#OlcaQyflQha;)%&SJSZr8=6twYGC -WIvPXy9<_bB93ZA^lK2A)Rv9+#kMX{BekW=x>CAzI@G;wPu_)h-SFtEw`E`PGan-5i*ayq!^dj)m3Zvjy@e>|s@hliqe}7YLIncoYBo#Jf|<3VH^X)xun#E>f_R%7hY3ptS3tZ+{odDR|F0 -chIjDDZXGy1)>p}nMtJ&-?svv7nm+uDD%!?;J25=43$!QZ#y-f)q3=}EnMxX@$K&iKDG-Fa0Oc=W!Y# -ad_Mlpx8nBxe%w!_)Xn~7%ULtWXEsVPMZk?(JHPmk$@Xl|k-gl?gUW?QNf7Ej!IdAJ*LC!c!Jc4cm4Z*nhkWpQ<7b98erb97;Jb#q^1Z)9b2E^v8$SIurCHw?b}DFp1nc9CQg|75cP_SE)Jpr^LS -0D?S2+k$7LS&hbyTl6V<=%r7$Pg081NV1bQmyD=SB*mXk^apYK-L0r>t~sudPwd9SI-q@1MnNT3O?@8DM%dzlrjPAn# -AwS9`QBJ7>MEY||HzMS$Q&1$~d0VrNN8_fQ==tBub)3pz76Exom}vEh`MI`}$3@8yL&9$B!5_7H&fpw -8jHY8uHB{>svwwRQM@d9feE|8M{Nl{L|wDhJ9#oqSsGJycaecPXb^7;B^&{N6h4F?2_e8p9Y=zrPa$o -Q%U -pQVFPUS)6=vVNf^_4J52{DVOu+ -xy3j(|>H(zndvH`O^pOBD5ni^~P+JYl#dWVt`()k3qTxEE+_r&eX)a7*xcHrE{&jkD&DR$fFD);~Df#Scjrf~Ct -Lf(Mc`F-J7+K!Y9sIAuI{Z{E_^gWA{@rPyUWw?evGsh~oD-EwoTq5Et5VwixhmQF`wpg-C`g2EB`DTZ -DI75=2$HEw5oiaP19QPRGeycfm;u=DtcdTGP+@k>ipY>kKFvt{CA7fi --j^0fzM7b~_>wvrXXq)t5+*$(10FG9ly&4W*}x9L_%inBUQlo;7!QBuz9-_9RbzW7 -m^MF{zk)l0E17xC%#4E*IGogEPY4MC5zJk$KiZcUo^}2njjx%zL!0REY6M0u%5cr}9k_po!_Y~ci>>& -Ox+6Z*vbZ~!TwbOFl(48L6Jgq>8s2-~N%Xo8l}6n=GDT2Z?q#elZ2nAs1{@&*fT7Q6w7@A-dGBU)E^4|Vw -ey70TY&-KJ^Z@6aWAK2mly|Wk_t338QTU005y2001HY -003}la4%nWWo~3|axZdaadl;LbaO9rbaHiLbairNb1rasl~&ts<2Dd|*H;h;7Lo&7Mc;~`DG+40=mNW -oqDaw)Y+%vS*ye^76_Sc;EZT4H%upA~j<>BJ;#fR$J9B2JOR>0Gh|*N5-du~;uNObilO(ygxJWEKx8S -_Xowsf2TMI7v`}C6}Z>5)F1PQ;DUNmM8R{Ylc2rd(~YmD_6QEMo@GPO&Rq}0+maVH(TuN~A*dG!KsRq -3+`mw#-%Txs|yn+CI;T_*xRyeyT6okK{-=N9ds;D8xe5b$S% -!Jrb}h!qg87|7+~ehVYX!eair6WTsb+YD*)vMym(6!We|3ZK#MfZ4@ -A?07gj89?k{udsyD)LyDOv|?-oS?A&xtosG*T%aKA0ZU?Eorz;79+g4|%7tR0ZeCvprnpd5iJMpDGK( -<}>1|m;>6+jm2h4(i#!D1z -BOg9#X0qwYPve3|{((GGYQPU~lW8qc2jo+)|0=>0M{`t~Wy~oVEs42_iV3YMPQTQV3&Klna6{mJVF-uGU#tEB!9DFX6j_v3oc-oB`zY;Br04uTeE%5xsz86k7oMJV6n -mkC)44d!BxB}!;`$$RvBNorDh!dDB%Jd@++LHiHPmNg;8_+qi0q<$er$`1{Xln5v@SzG_sVbi<{26vm -SivSxVVWRGdAGr@DEmjY|kbLqTmEIg&c9wWi~)2oWS$YIfLS|QFS;u%Jnx%#;0>Jxhf|&b^l@Dnf)C? -3~aL4;-a&zdzF{Qi#n1Q%=Gv4LZkjBwrAcZ0{2U-^Na-?h*oVcPp|BQHEEA?O -1XrVbTd0freSVo`YtbdjIz{`W<5Ndo^qDR;pX%F3k>EDa^1b*9PXEaOx0Z>Z=1QY-O00;mWhh<2hoxrPz8~^}SRR91T0001RX ->c!Jc4cm4Z*nhkWpQ<7b98erb#!TLb1ras)ja)o+cuKF`>(*to03W-+LF^;szm9!iL-S#O}dHQ?w#vp -C=!wwQ>03ew$;A&Z{PUe)I83Rr4ozUR_>Qk -!a!%EBvIRNsoc46AQ9L7oEP)ZX4a&sM?{`nm64%Ur?ozTbKi${aS$&%$iAhRqvff?P>|SrltOi51X93 -7?V=rXPb4P6s=dLyy6Zxfr2y6fkOQX@$3p98O#kAJg3Ls1h5>B_z>hi&hR5ZThC?Emw7$?Ilw< -nl}uG!#MkmgJyza^a?R|g$DXFwK@vyjZ(j|>%Q%tW0>k{k$G5lVFH5xqg3OcP3cyc=yNy|YZ}0WV+1u -y-%hOjU?{JLcrLxFFXCNG(Kf#z6CohlBU!D2SkNvOCU%z;D;(vF1_B9NrllN|xa2PI(+l%B};O_h)^A -)a^hSH7t6Cx#W`CAEl1^k0l#HkhqGma+0?t*+H%5@YJ(j&RRsqtJa0~HiS?nZ!FT*#GjG+6u>0WOh8j -}Z@il+#io(paf-EptDSshjC}MOFj}K3Nn?n0`nP!!plhTKMY>$)Bb4qK!g^#KD=qZzItH$ZPRrnY5#}6Id4xy_EL!eIdPtC%!@nIei2C_Kq0z^o?ge+=--TV7mQX_|Ad5(yW1UzL_*6gohCJ{1Hy -Vykph{edV2l-diK{%IFQ8NPt9c!a+H#CnicZU$;r6ytyiZ!sRvlAW^=Gf0lcVN&DjK;2H?Q>Y641AQ4 -I6!Bw0}(C3miAQ;P@uJ-c{iZivb9WMO1TE+7PFW*8BB@v8X$nO&dd>MR^ -YJA!x57$U1PMchaX(GQy2A&K;u!>n~7*QfM)@mJk*pz>qFS~xXF|kewGmzh~*afFa -6b}?=rLM)1cQ_E5IRURE0o*~0tg>rBeHUIpRotp-?9J=-yNyR%N4MYiJ5@~~lf;(14jq+wIH;xiR>7? -cTWSc*aBH?v+n@tj;rl^ZEM2gJ1Ca+Ym};5lS+1rp!I_cUsvM7`qG3_4;oK1bFhIr+C_wKfRu(WeL%^fo(OH -4+8H34L#^F*#nWWtqO;n~a!VwUFfVqV8uE3}@JOc+3u%0;+$KHAjS{#fVdS4{SFsem;YqI(1L9_uYxl -W+MICg3dUuIw!ra&K0Z0J`V8i-5?@ -Xi8+{eYZ@n=IcJ8yeu_3A=|iSiqcI3^D5O;A`RPks83|z)T%qZuvKEOH~cT=^OgcBL2QOHLQz%LqKs7 -+Feq$f;8tEjk!|n?xXktLP2DVGa8*i3+9b2eIlEuNKyY?Ft)KW&jfbT!20esz`zZjkCh02WEjkKqd#L(ts(dP&Ti#4`5*NAp|_AA^OGuyEGCMuq{jYY+y%#GytC>BmHSAoT -tu~(x%tL5x;+C8*D==<02^o -!MtNsH&lnu$I@ZnBh}bAvtz%?a&-G)n`tO2~)M!bFbT#OGNJqG`rwjstIBM3n!0 -0yt8OfWe}i@G -M#4diB19|G*fdLrJYLx2!JuDj*h&ZC1Y#9OQ35f%_&dMC<2CUzcpVu8O5oWg=xofvcQsCqp+bR%R1W} -`?MlIZKw(TU$v%0{q*u~V{yjT3#7A`8i~?*Pcmu)#u_}`y#^|$%SBMN~n-C1DFqu@$--8&Cn#lo0jmF -th8jh(%B@oDpQ2?&|Buu~|nY>3*zt;){1$dh?oFaqRX&`!>SpA(ieb2I_>s&DBw#LYv#NFy52w-p1w -{)0M!lH4EH31FE(&krnk<|t0y? -3EH;K3RXqvVquCY5bp*n%+>zp_Z|E1&2glyffpDu5>(*KRTA>_N|jn?j#w_kq!H|5QlRyk*!*iMBY_z -Qe-X>w`yd$bmDTGkIa5;9g8=jo&XEHkj9Y2$(zQRgo^W!*sR6n385DeV`C(4}z*{ujl4HzHJTG(l%0J -DS6(ou}GhRvgBzioh})7E*%*wS#7+?KR%_J#C**Br~b#@H8J{Dj?CQA!9)x4Xy%M##x@-C`?UJ@i{C? -w5|k)^ZLj(dQvB=B5WI7j)@4n9iAoHSw5G;#`$g^?>^TbV&2L2E(WxXd3?(`4j890Q)Q7B6x5fP`j=W -+XwkruOSw>dj9grV5t#9SKre4Z<@;Fkodq*+JXD4W1Jp?t?O2t;QJtRXs(r9R&!U;a1Hhb*;Q|1y+j~ -Cw5tQGLpcK90w&)=&!y?_jE3>nmXr!zr6Dp{a8WcSN&A>Cs>CD3=99&o+!bz50k@I9h3B>v9=K}KzRH -sSVebO?4fEWu?e_>{YEuWkEj|B^Yvm^**U8$YPB)bt=YOO-W9&%LYbBy*VCTmtX_StFGS*$24XFyX08 -gFTA8?IeF(>qSB`5q?tqN?CGr8xXBsb8768z?Jp3*;4HIu#H -~EzjE3z*l5n*~(OAhTouk0r-kC*7ytl>=_lTzv^9Ebg<@VY6MZ_n|=YC9s_%97jf!cYKnAG>n`E|RUq -P&c}*1LL9a2PMqwf_`=Q-AUPoCVh<&XyX;SvXxFSlU1;n-YsE2yo`2ZvsH&`hAV3p}8w#Eq0FcK9tUH -x~PT-A6c7AHpaXziP{NX73a9Qw2KVzE&ZUehq_s#`m!Xo~Gp>+YSjtFNAT34B-=I2_8|#VHr#;H)8t2 -DL)L9^1z#R$)nI9JLgu&-cgUM~^(=qD8e}8H|NmQm~t)NflFOpzOT9V^wosV4f6zi-gmtRU-t3ivrEtzSl?Dtn0CsizRrWiD!2<6Q%VDSQUSjk?CmP -)fcej-KYj^s0IE5T4jh}w6}R55H;*AyPLhiK#Dj+VthVy8fsEYNsD20IGq|vBM3Rc+D6)s{=H`%f0Z;z`Na` -bsQsK$Bn)>{1dq8fUM&1v!4?Kwa8dKM^bb09c(V(y&2doz6e`13D@BgeF072xoJ>Z2+n9JN|!pgw(F; -B=|JSzvJ}uaEK_%@I5Y6~7tP=nc!g>R`4qopz*TCN~ZICYB)gIHt7;hRr -k0ZM?J;hUP8S7lz~9yt|7>x3AxP_xHE -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 -b!yAtZH_S>Xh&mT -$MlfWH1%elZ6x=P5^NJ{t2igU=b&JYE;K#dTS(&oN`s=xF}s>~xME&>=wfPxa8aD>LQciU+J+>uRVpK -zTSEDES5|RM5Po5ld6xg6mVi26ZRo_@@0N^U#q;xjGNIY&wKgQl-X<3$!Pc;q#cjMg;F;bkWUzFurzXjsk>hfgg3NDpW&|K_x-{I}q)_+W%|8D*_c`5 -tb@6aWAK2mly|Wk_*sO8kui000jK001!n003}la4%nWWo~3|axZdaadl;LbaO9oVP -k7yXJvCQV`yP=WMy?y-E^v93Q^9VVKoGt26{GkNBT;H6>ZNWfVFxFuj%^vckx$kFL)mt{Y -wa#}`TGtSl2l2gc1|!e@A2l%(CfV&Fb?mcIn1I-IFCaZ&lZz!@J?^f>A||-1_Vzu(-qKTt`Whg+@6@m -5mc&#lu6K-abq=4N{hfPFqwT+n(%v-@w}>2rOZ%+Ef6f~y#bXsFL(0|%+MIB-JwLy1T4!$@RYzao}x4 -e%)p_}nF2FNss=Z$g~Y88m@1-YmMb{|MCt{jPGi -fUlP6Q9(YI0AAU>wb&^|n?&jn?xpj$yi3K>*8OwT>p6S+IiTX0=?zp$`xvb{5xWzGd>0#W_*#6*-xqW -n7r^=v!K^A%P-;f*q08oFYGxJO-&cRR6U@q2!NdUV=OuIs%@9RMvx&=5#w&z1}XdJnz?oNT$9ApN7=L -=(vHhqIgXQIUOSAb?Xz*2yPqAPAPf5am!0qh`qv%|>YJn^Gh7Zn6APTTs@6aWAK2mly|Wk_+Hz -cF`_005#w0RS-o003}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQV`yP=WMy{)=D#?iY`r{pvSA|34r9i_iY(r$y_(!0tMTDe%g_Gi6#U1Ve)D+y& -TjwIbKgI7hy9{|X|a0z;mzZR@8A6Khi_kX5B=H4fBoXC|MHvPfA#qM*Z=bPub+SU<>$Zt>R_#J-z+&cP)b7Jo>FZyngrbuRZYY;Gci-<LU;OHeul|M6|MH8ke*KHz{qFJ0-+cM_{PEk -*zx?Wppa1?>pMUxI?eD+*?Qeefi_ad9-@SSBX^NT5zctDK&lLZ$yZrO}p2=_Ce0=@(+wb?Q|4T3L_dU -RGzj^%W^}oOAW&Zlj+m@)u>)s;Y{q_IX8h-o!-M{(1-Q+(e^zR>U|M+$l(b2mg;hef;>{fBNZ9|MHi=eD>y>A3po|m;Y49PygIaKK%4QJO9U7kH=4b@}D2i&*pi?(Z4! -ZeEQYOTKsAq=cixg+`l@W=e&Pa*QiOu=dAlzSFRd9;EQkGpgulHG~@e{X@2~}r_O%*r1qfRzw2%K{YN&_pM -UuJPme#fQd5Dny7}@SzkGT5*%$w`{`ISW`Rx}!|NK|~`j21y?yE1q_}TBj`r{ --@U;5Udue|Nff~Y9W_uckuboe)Wrg{oNP;*Do0Q$mouHU1{^x`~PV1504+ew8A`I9rf&g)-zu9aM!D2 -j^kCUM{7wb@ez#Kk& -GM$2^Mh^3$qU-Q$xNx%#i;-2Kk#d5F=!_HRc&eH=ZaaFp5oo@amb=&|(!$E$Pl*I9nJN3wd-#`8M(++ -;HDeq+A$965P|*L^bb(JlA;U9Zmc#mDMK5j~>WBd`9*qqjCQ*NbtSgW;S!>z;>tzVvJK%sdyb`(!=%i -D&hvdeFx_yEkU!IGO#YGo7r+WV}7Kdq$X`;3xXM;-#DSU>5Rl^*Z-ItT;k(@qRHE|MXwui98&xQ9pVN -I!_j3|AGIkEf4()FFn2eALl3@yb!hvq39R7MlZ$lI$7r)NA}o`+4Io9n{?hEnG-3Dp0BIttJn9~{hqy -UNA|CuSBs9bdNBNFPv}w8_j|JJPg?RK{q{YoenNF`kL>^K5Bm;G+Nbf(`SQ4~#Y-k{-<|g^>OT0-=#K -jRibd&>kA9m+GKhn@Sv~vbNM7zz*qED^8~cstOHVEG&=PuPPu?+lMjjE0M-TsEY|pEETfBHLTnpRey% -3|-0(;P`pYQOuob|?eIeM2PoU^;^j(Yu(A9i$$Mvn-Aeexm)LNxjbk5S0TVp&>RdJ6h;lfAmmd%V~A( -lY4Oq7_H#Y1gB9m@J+(blwlL!jwqMIQ&5*r*)=_9y`d#tT%3{!O4=X -Q3H~PVBwcc~RmWzG7eDRaV%z>uppNgR#Y#ryYTFxi3XTRC|ZL%Q~?R2rGMMOOFQYkv1z_0k`}O1O{EKv%i_)XCjZuRDTr&=MuVZX9f@2o@BL5=gwe<~;X2jAyS~^ -Z@$}SXka~9?mqMijyZ?%mb4=c=4xwAi7U9ML!i2jVSOodG~uhTc4e5m!7;6`!ZOqexV+girFq}A|w5n -7IxRNdYARGv;g{E#d4$EkGs*CnSP{yTGM@@g=yh=-ut-Um-%(YdjTqY%2q$2MWF|Mw9aVNyBI -nBBBlrSb@hz2Lc(bE3if{v{_$CNzwLuD%l$ZpRj0}ag~x+up$h`bj1f=NMHbIuue2yLBNt{|b=3pQ+W -pSwv-P_Ani0*O)t(XkjX?kLQA~WXP`pwL5aNG2bB+?>K?C)a_Pd^2uTT7v=wbB>>ENJik>pH2??1h6R -}cRvR`7Ibk+^wlPA5b|bGuID9f%fP6r+XgSFKGc~Y>3WcwHQ`U!G*?R_cDZSic8g?;Xx~)6X!r`%Ptpx*!y -_4U(&`F(ZQBwvB6NzWoeDoDH+k9!cj%pmlo?t&lYKTh11K$%zNH&|L>Bo?++xYSDJ6bu -F5(7q5H6TK7T?CFAOKYc~*~n3y(=_t^f~YQJPKgo(yzt2fvPxXL}~$&T*FU~Kgta2B(tYBJvL4X3LG_ -FxWs5bpeYyc0d?ZkUb|PYH)}GRX+V2po%G1xG*iK(O1X>_N|PA7ig{0G_V?-EaFP2M%X%VSH#z1seXq -@$Mx?MHS{e+&WkZY_DdYLHCkjo~Ql`FZ|qgbK#fZIy^4b1{SOzk86fIf$4rOj7Bk`xO_aiUj+X_Hgp_D4r -i*pVcu}UJk1k2xU -C)e(_7#1O0g=e-e%HR>n^U4lEAj;FXA(dqL4L+9uqe)y;aj2k(HU8e1Mxza;oIkyjfGKCc~Om*EIK2q -=oDMtf8}sVoNOqn@Z&ECC81A03Od_gm}QUbkMvfm=M#p$q?a=xD8{x{J8*WU(14_TnV$S{T#^o@Hy+l -O@9*f0~E(OOCy9dI&uaY9}`2#s)mWNI6)oOTnI~Z$hSWH(=tK_|`T2wB@YuOO{5ag?Jhs%*#E%`yHwh -6rJJclP73APaQIXjKmitOwEalG4?)ggVOPFOTnSHr5}~4II&Q!JxWlEo0sBY?1Ki>%wR(Z&srh%NaFV -UYOroN0*G$^#9JjHFG|>Gn;^NJEF&YLS3^4 -y@iRlKr7h%69A=XpDBE(WFv4ZUw?S9)Y!N{R-ap+GK9;yNNGWOo`9g?+&3^6Si(=sMP$=)8*?Z;ck-p -AE`$+*XRv0B|xxsQ3eS`RGKpX*tD>KaZ*&f2T2OZubr(;>a*q5YD18sM?p3$JWVx*Rxl`lQ?T7OSP+; -hhtoI9TL~V24jVnWY^c_vU+PL7Mnoih?#ruyi4-0tYNJR0q3#JncgZih&}uIC2=q;MbpfycfI#Uu=jf -9ys1i_bC9v1MGKXr~|Y_6xN;a4p>WJm%%^wbs6u*)(;oFB(^@mUZ7(p%eW2Y!k;Tbln%ocC{ipw`$40Qkz7qS$0+;YK7X7JI0jT-DSH71(_0(#&abeG7~#YULSh;%?lS{WrQ!J -4&)p*~{=wm;e99r$jCdL93_RnA3ZjZqfk;Fv}_d}I}CJ%@T-%BN5=BiD2H+kQz8hCO?sm@c-EAuNra% -E+UaorvI64Gpmf;(@k#5b3l&b@Pi3-gK&WBr-^{lZ*nJ`bU?x%=rSEXoXozu)&$zoq@&9y>6{gUJlIT2^H+Uh(SZwvfBp_oEn~m>V -=OkVB!Jj9E2qY`uD_79Vr9ccD_H<_U%C|tO6@Za0urJCi&>|Dd+MD%nhys;mLvb)^42m2EsDf{%h}x4 -(!{`pZJNG?!>dq9Z;~3wLZjNm;8ZX5~bQ}gkOTfC72%9_MI^dx#jF=zho}w;qWCLmfF;)f-P|n1-0l7 -!oLS0>B)aCg2*0@vIh=1wKexVv|rMV_)TxHh5c^r&F&$E@_dQ|Z~zEYI(T9R(axAL5(OvZ@nM<%>G{}euEdqy-S?Z41z3lSmQ=w#5w_AmX<09A22jK0&A1 -04eJF#w))xuLdQN7N7!o~^tA86_1 -ha}OiB=j$x$uPZ9QXXTUvf-;ZOFod6D)!vAH?|UFuW$R_jk*M!o=^uYJUU|8+LGw<{!lf=T*>(lk;AkK`=1J^6&<}^vt699ry>6rZl0(Ce)E@Y-%b*$+)w)ZZhQ&t>iQwx=W{ba)QJNs -cbtwCLI9vbr)N~w+0fetl7~_J7FHrTl^N46-Lr10S>;#e@+1 -zxnSqy_hLxn!4zmS^dmEfayxRd=(51eIz&Urnfqk320Z!Vwv?UAy4~3Ok%xVvn^c^Zv8>x;X7&$>2C! -zcj;NCoy6b}8Os!!c8!at-IJ$YOXdbtts)C8@9AC&dsHc`>xNA38y_P!YSC6L&j2fQ+TCg9C6Hj^cEJ -B76jf4TE;y+g1j$vb!|%VIii^Bt&f>q$Hy-R;Mv20$bUs`16nbXCnM6F&mqphEqvmRWVb$4o%Tx{viC(l_+>En3yOy+@Oy4>aG4kqbxsv;4^z^)|Pe5aFn!*$OCykxnB%=3m)U<_y|#0FcwE{SE5DI_-9A#?4WRpWDl20 -U9l8T#$tFb`^xz;wG%6Ndo=4dFOK8=`viMUZZTy%2cdxS?pvjOg5Qw#efguDE~#T2F@J0EC@pP#=dm7 -?gx^j;CaXnh55^h732+Q!{$|sU4cOze8w>rXNoy6#Ei-?!-eWrX#e#RP5Z3L;<9=%~D!*_?^F#;}os5)Ida5`xAl=`VGB-#DOlXWX656G=PBS; -OXs}46%zO@)ayhCVG9K*RZB0O~E-_o0NMoyo_ZhkzW51lk|!WL(L95pp#IjL+ll7hWP6C#kgrVMM^a?D*mMX -Qqx3fOSYaQDrCoEcGqNbsB<*R0NTGzqKT_|4WdXTYk}#z!=g{%LLkhjhHQ6#MlpWXUk2*6Nc(dQ-%4c -yI<=|Pza=VhP(IDD?^p>`G@EgkbRoq5eEcuKa6T@4nH(TxHGZ+hiJd#Ahp@?8YXKe%Wy;r%TcmL!UBR -xT*)?!cxteN-UNIE4o@&LObXxjBF*CcrhN7Q7cG;2SlY`!5D2=^B0iq&0YP!*u5qsyd-)3LOi4Qc7$VhH{;HYL~mWB -7VF$TCM;>!iS@?rIAAa{hdN(k$_ojsW{+rDRT8GZLyDl=DEB;halBq!vkOi9+;t%RsfoQnR$*{!zbWw -OQg;z{q54X+bEzHi#loaJzAIkr#4AkKch`Zm!Xl5eBUK7CgbSxxq+-xa@^tNeG%=k_R#zQA4w^z41<$ -g@-fx9pLczmH{lhdZ$cnF1g#d*jAv77_!&#l;Klrai9x3SGkjp-~=;221O87odqjM`n&(x< -Gsk^3~T8ig?Tw%`?U}H#a#k}o(%fI20vn#*kFP%$`e-r{kuNthpYXP6Z_JeLmPF$<9!0&-jwiSWN-r! -u|eW ->KGd9QibH1=CJVY+(Coux*#$LY8Bg(Q?g8Q>q=JoW_-P)fFF|yA&lm_M%fmt;NmFKt4>U|_m6p-Yod* -cOQ`Uj(FL&dX-;4T^gl}6Hbm-|bn8#i%$BVJ0$OP^2AV3(VwTEdwEdFU7Db|eIrUymC?U&4_3&7*h3P -U{=a?;CTvG#V91EcylmpKXxNbcr4?2lmrgWGUl* -6=iFw0uN!r*^E5+iAsbEv)a+!?hdY&+WJ6 -M?2e+Ku>w!`mfQ)5=g=l3`D7a4R$?%#a%=Am$D`gxru|M1&}=J`&HNRHf?K0O#SX30m40dywwzJ-I!>cvqJ=osSWF8+kvR>Vn -a3^>mO`=p#KG9N`BZI(}48vyvK2Et`G4@pIy+HP2ggo@U6aVPOt>p_gOXmP5X~4C6`0Rn@JDUyBnIcJVd@;5?rtY;pB^SU(cFF -sp@Xq}^Vw9y2`xstaC5%BU&A8eQ*^Be;xBZf(G9F~}P-T;}!vhsHsSrBcU{ex+nl+A{vYEq(fE+RTYg -O5~^Fya~uf$I$T5nPdy3k?+|LhbbTfmiOd_B|v#y3%GbVotU0I3Xu|8;I2MXH(cLR}Hq$Dw3cD6O4E2 -`ajjEjSoTA5LlshbI+Ik7z8EwFE~m5xR-J>af;=vIPJFp5kM<-{w6J?UzjP0nHEj8M1O(h>0I_Vn!c -;;e+{Fr!gJi`{|ajdeuSj5nM?7ZNFqvoAH2d6OF6#;IeyMx)>;Qanj -jbY$idltXYYzWl>Vor5rC%Z;#2*-LVaOxvi<@M>@)D-N3Mie9r^#s|0&DPV&zlQXj1pYP*c>z>vxb>V -qWx?0GY}JUMqQ@mj7XB|g-y52%sxevmt{}{FS~PMY_l6Dt|2+Azz148|8`RMdWLm))@I_y4Qn%_{2p#fkF>`V~Bsdh={^dq(LE)XSRlwpLXto0tek{>FD --6Q1^Nm<5Em|QmQf1ArxM{2!@4vDkEum6`vcAVm3U{v5w$`m)^8k^04^Ou;x|K0;p^q|?|v72l4Z9_& -18yVs{MwWkF-Wm10i!Kdt*He(aJ%*aN=RFA=kLqjk?#h1C`5BB4R{Rq>jfBma0Gzf8K#qEBQ3f$-yh{f_f|}b_Ye2gIIMwZ~uY1*U3gW1*mx62is& -2WKf+(ORV3tbI`Lju2c$GRrnw&L5gfVeb>#;$h-GGrhv;zSc-mz3i`R9j$ch&W=T9!@SwWqJgo2_^~b -r;31;rV1FE#S=V{$5H2Fbp<&l?zeE1VVCwqlKpFBKxr4C@VEc$WK|`XkR@wddcdHFE$4Ux3rzdUq{g_RM}#Urt -UB`R&#jdi}Z`C)Pgf=T-Q!?iL{r~jfn5O|4H5J06iRXJkMbd*Le}|VYM&ICv>&U(c&0;{D_*glaklRb -gDf3u+LFZbl&!u{b?=!rI>p3Lir)uCUhIt8IsnXo;C~F-l@P^;15Fd(DvT0C*Y7!Y}5iu)i2S6qzcor3?6Rm|+tysu`k#z}DIfEy*K1 -((Nh}KM}Jjg(l#V^5USzzHM_J80rg^+#Mep^3@`w@=Z(45HAm3B{|HZ5Dbx#zI%wJbeQBn@;) -b;}Ms9!a2ohP&aAQwWOu9M94{7$zK%_+8I6sCzw$f+qUmA;c0X5C9zl6JeHbg -2*_hHm)$SL+gnhB_*w#L!fm0{pHED=yI6Vw#E_2&b;`6aH)C_++mGrVXB2>HOjF?q3!l{7ic?JyjQPx -lxUVBp2LvZZ!)PbBHP+@J#f55w2pAG6>`%MvRHr>Pe@l)}~XW9>RwQR}O0W*8}A)GH0zy{dXcs=j&!b -=ErPf+T)j1gRHY7D3+7|WnU-Kk#$RvaD*!cf-^VTnx)5bkxO?)BW62YpTR$5fLs$!q8V5)tf>-*c=(x -N$MRxESOxpBChn^R?H_x>sK4#5@fs@z_;9@)BiQ2LLbtiCyHBdw!8~ZRvKAfq3Sf_I(P2y4OW~{O}Bi -6|*}s!4a6EGj#?=(eigN&Z+XD27f+1j%SUyGk_P=T@Yv4gtT1HiVd39~#;5N8y9?rqIXYeVqy;8rIt##9t=$PUk1!! -g&~`Pf0->xptZEWI@}4Nnz5cH9aEc5q?UI4 -2b#s1Bf&)FR=W)zIho|AKE%MOmG}^_tvH(&Duc)y&7X)e~yT{gWy#%l#MK|50J-Mi1#As!rKSyc27(jGImWHP^>`fb1D6!y=<(h_zwd6cP&Jp9Q -nF-9J_O`lIdK9yQ`8TnXTxaa28!@5^b06h1FI}XO2E>RN!=e4i(SL&KvmPlwB6AtVt5`6SXh3;NzIT>?E(gp -DYS%*2t-A+90J|G3XdFj2iPjBzP$c$(ZZ6)+WgXRt+=*k|D34wiiq`>bhZV0tdf8-@s!_IZ&(-Rm%jS -*Aaufx+amcJ|8P<0ORoP-vK>YLKv;SEZZ2oJBk -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 -yT43ok)$7&_K`J`fE=a@s_==M%hQ -HTHdYle*U-*7LCNl&4<0&%U!?XrheZ;5c7^dTSTFl5lOd>3uKWLx1-RFL~;{cuB3t{ahXs01{g>I$F? -OlZ*dikqge0!GPe0Wb-+0y-wZhVBQ{@EbkF;ql--~{|P-R4}(nSf#6?xbPN0aCZs*cX0EvP19h*1Xs|%NrRl -y~yY3+-!%C`QaepuGM=9cY?Un2lyNH`!jyDSI=2Xb-){)7PauaC>jqAvX*ZY@*j!ZoSU8S-hM|m&6B0cKIzuepSciojkH}-^L3Dge$`XxopYu -`S=uh~NS}b6(m`6xGU@E!x+cCTnkl1p;)RrjBd;TuJKIyvqucoj~neA0XN(f;XTd+q@BVvy{O<=*=4 -@x;rQ^VE>%iA|ksp2|&R?e}2}pjH#PJPrSZy9QR?k7${h)DD>%oF83y%+uSmB)hv3dGkK5Y2qB9U-;v -GLx{x@UgII#yZi@nG5``wyNs3}O`nPe#AIJvpK&Kn$D7NiGiB2+Tw{recGJanZ*va&*iYy|m&KvhM5q -!1ELq4@ri{AF-Nm(n*kX0W|Jf^iaGt0@KW$;AQHo}`p@}39I<2b*yzd8%Zqk`7|ef -muwj+_@K&LXf{sp_>31e>rAV?)<+-@C}o0&O>$yi#`<;1LSduGY3U?_tAumc8-Run*i@mbSd8l5hQrxPUXBiq7rvL}Bbp^*#oU~hL&Lp~okqn}W0X#wUrMDEcwq{w -y1y?EL$Z`OJ`9SIF<76Po5OI3@#S&(9atWKkt=vlq{`h(p*?-*i~9{R(=XO?T7Y81$?)cSpRmU}JSR* -Bk@M@*%Q%(B%M*Djweksm(WIUGHcUMJLwS1)vADYBx%~%@OSOIDH#*mJzP2hMu<{xW9IT}egv)n&c*i -dr3@*qIo$_ufVi&jj+-(EGv&7GIQ=(a>Y#xYOpzT%@(QB5HBke$_5Eqe8g*#jH? -QxvX7OiJP+|A+U^!xDIe}jm@IsVsV4n;%b}4%?!)yTToT2ZsSYw?Bb;B^4=~ESuO7*@hlEyw2M01MS0 -`0P?mz2MMS&|T2*a+mk=@cs@s@(X{?3x9+uYvq7fE2Y(cRWOkuI-7Zt3_udLt@)Zz%j;!M)=L<=G9s- -3K$IIR0c1t9f{gDcB>mpJONIDN3ZtH&E6sNP-{WP`kxWkVFzEOya?)~-AGN^Mg2%Lc)`E;Q~^-3UF1> -KF0&BKlrL3JWiEVOy408>kA|9gCdlx^Ab`OJm7`Ez(}gWS2*b{i+WF(|qSwZ(Lm5lcod#j> -bh^pEJ30oA0EH0i|l-@7z9` -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 -B+jolm8@F*1Ul7}Hww6 -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 -plh+}y>{(MlO5F0A -T=(AW*gERRuAo1WV3A;vV -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 -9*t=Q3FH`5HɖwBE4FEM~Hf!djun=`Py`M9C$w17XK-2(H14IoFH9*t=Q3FKHA)tqVVo!6v`O};f -Vo-xY4F)wB)Et5eKMnje@YBFg13%3nps>@xP6Im)>@??_Kf5xae_{-RiaZVSG|1E76GJ&Zpwk?(2{sM -bG+@(!O#?O!*fi&R5j7`D~*{3PcSMH9*t=QF90=05 -t&AT)(|HhqFQ;YJjK#qUIu~7}Q`;gFy`jH5bz<{4^KYgq;R<8rW$rvU$xuH;2hYR8j!)D27?+5YA~q5pa -z2)3~FwoiaibXG}zPJ`tA)Ug&5ReP=i4Y1~oU4g`Wm~8u)48r@5I<5vM_%25}n1X%MHmz0b|XSt0T?$ -kQNCgFFrLG|1B+PlG%S@-#QoDdIGU(;!ZRI1S=7_q9p8I4eY+<|eJ6(|}HMlUBTG@TR#*E6y}H)8I^V -lg)b{ZL$e5&He0a+r?QS)HG1jKuuF>I@v1_RJ>_!g1T=?_B`z-pb*nQOan0u#5DK2uWdIcg;3K#O#?L -z)HL^|he`D2C7dNd@5Y5};!J}x%}q8Trh%Ad7Xgu&fBn<&cjD4q9xg8~Z!RA$UoIJgNfcO`heTpZgDD -NBG|%j-!OdAAwluXR?-Tt0wAK$}}j`piF}@%|lur(uye!rZmqUlayjggDDNBG?>!tf+8}~;}BGAX|Sbv2r8yDn9^WMgDDNB -G?>z0N`om4rZf+$)b{Y-dB?*^;j@o0lPJJ60Mk4KwXk%ux0ke{OM@;Ax-{t0pi6@;4Z1YD+=y`e>z^L -}?&Xp(m_&IHpr(0=EW|Vr(?CoEF%85t5Ys?R12N63@7{1u2sI7VG*Ht(O#?Lz)HE+?g_s6n8i;8irh% -BI#NY2N*e^su^QK&Jtn26P(GX+Wm| -od$Fo&}qVS3N{VcG+@(!O#?O!*fhIy1W)n5{)sWBXX!j5$kQNCgFHz@`D425g# -L=)^PJ!w^)^X+Wppqm+X;4c;_()A0Ge!I=hU8k}ixroov8XBwPocHtAxaF0VW@utC>25%a?3Ah=&X_g -YU%-?Q)>vWuHw*SPLX1m4RXM*RphasN(o_kNb_l?oM(b@MNVG`XFtbGNCm}V#LoyB%i+WBLD6?fkWp4 -%R0Z!z(Nng(hbsA-_436m(qG!WB3Oan1ZiRo;$i8Bq(H2L})mX{3PG<@IJcPugrIt}PF*&(w3%0SJgz -$SrB0-FRj32f5tO2L!*uYbDvyNAn{OU4++7{(aJ7{(aJ==>?1NjQ^mCgDuNne_YSPu7>}1ThI>($D)l+65;46JwY$4r3g~IE--^<1ofyjKdg*;~%bjxbDSuFRpu -W-D`hGS!5!BNdS`oCIL)hS(Gp(VM_W@1wH)r%|JId;%0!G0d5Ak8GtV{;7ROZZU%Z7=;6jZjPWqW!x# -@^JdE)$#vbkAx-Zv#x$et#U#`oS8}KCdI4@(ojPWwY%NQ?XgfYSxVT>?FIDWWpxNf*^xGrIwJ^vKTOo -S~7TN1V;RzwL?5~d_fNtlu_C1Fa!l!Pe>Qxc{m7C~wD{8KD65v(LwNi2pEoFq6&aFT{kIzRi53`8O^C -1FacDINGhz>>z_z3GXe044!U0+__IC}B#%l!Pe>Qxc{mOi7rMFePD1!jyz5Y0h_VdS)nWN!XIGC9(QR -n36ChVM?kg9cCf{O9GYzED2Z=u%yD$Ir%cs^FmdbddX;Hw7}$dA9jL@E(u){x}@RD>q!8_q}c|FpChW -nw?X87If0=Q?hr0+~Q2anS?V5XA&!+1Tks0%NL7G1T_h268t0jPeDzhq0sED-kZ -A5F}a19BqmXGN$8T$C26~SvB*RylUM>JfJp$8SOO(rNx+hTB>_u(uVpW}E|Vy*Bw$IvlC+=26N^kFmY -VWlpiDxUgffYBP(qi4E(u){x+HW-=#tPSp-V!Sq&@%abMf!+vL&cVP?Ml0K}~|1#5yQJOoEsMF^TUy; -}uUhlW->COxm3|coKRPex3xgB1(9Z@Fw9+!kfg3DB(=PnS?V5XW~1Sd&zaltG0{kbI`*uL>E9)Eed%O -@+9O*$diyKAx~m$ln^H&PC}f7I0E!!gZUj+uL5XEif}aFG34R -jGqEvA*=UjrF1Um_K((Xac1Kh)qTlh)vli(-8PlBHWKM8)4`J@TI=NObsc(Es8Pr{yLfA^-Rgu?GJpu# -`B;@cE@TS&mQJ4sLuWm=Aou#;dX!A?5+xqPwEMDUZ!PlvZB!k -~mf34;;_B^Ephei93w*qwF02?}u%3!Vfv>Fj6O#Yz)_P6C~D_?!v(LY{;?33(FoB;-ka1XYNW&c=dmk -BHjY0k(@03r$4ZC%OS4Puf$KJx|$}hyQ==-V)?VEPWEsWl -F%jH-+L*Rn+RnR$|RIYD3eeovBF8{lF%igOG1}~E(u){x+HW-=#uWWP_f=bD3eeop-e)VgffYBO+uH1 -E(u){x+HW-=#tPSRhQ2GHkX)s7}lEzY7*2Ws7X+hpe8|0VsVooCP7Ssm;^BiViLq8h)EEW?t6bnS#Kh -!Nl=rZCP7Vtnglh8)l7nz1ThI>604bnE(u){x+HW-_kNZ{EI1L$B$P=glTaq1OkyFE&?TWuLYIUt30) -GpBy>qEU=pyTdp}DemYfJ+62PPa)5&**4#Ywxp-V!Sgf0nP61pUGN$8T$C80}t_Om2n#feZRp-e)Vgf -a}&0_-w`2 -}n+RYMz$6weiA77ol!Pe>Qxc{mOi3(O5}YJBNpOG7A*-$5|Sh&Nl20^Nv92j>8FJ$2~!fLBuq(|k}xH``$Ys|y@^=9B$ -h9UPXC -X;Kl7u8_TaA4uzi+_z#BYC7kt88WLXw0eDSMo+{|qOGh>~DEAxT1av_PM$>k*TM%kE>F(qS4-tXJ -vruHyqATy8|$P8o#GGiRZIE--^<8UJm*F9YKaNWao57*uK(=0hLwq$I{*pgYaWK7AJk})M?O2(9oDH& -5T>y!*98BQ{s*HlV}von@xyh)b;EVTb;EVn-_4>E!%Bvg%u*%8NrsaQCmBvMoMbr3aFXF9!%2pd3?~^*^ -30cmo*EifGOT1)DH%?3Im!I8yQXybEi$lVV9CIeS*K)7$(WKcCC`2@NpE9+clI9`P24Qvi76RVGN$BR -v=mO27>0nNOGcNBF1fmN@;zd#I5E^@sL4>1p(aC3hMLUsB|}Vxm<%x)Vlu>Jh{+I>S+?ZeYn_|XM$#9Zq(?D+FB+uS`ZV{a1-I<-E{u?%poBftPvuMe1lF -Lcg@4Ldo<;x`l5nfEmn36FiV@k%9tbPA()|(hxGPY!F$t+qji6U)|(h$GQebj$pDjCzGO_vn36FiV@j?mnO9B&O9qw4BpFF^CCR -++F`Q&L$^L!!rl*94l?*GHB~6Bt3?~^*GMr@ZNJJJ+GMr>M$#9Zcz+@!J-p`Vl4Bp -FF^CFxvyQ%EbEWH`yJW-^jwB*{pUz3b}DauXv;W;K(MBqK?#BwfFK6i6$aWH`xilHnx7No<}n>@w1|Q -Vei?_oiorhLsE}nbk~&lME*rPBNTiRx=q%GLmE@$w-osBqK>ilDzxJbB%x3o~6M`W=WG-(qtsbNRp8x -BS}V*j3gOJGLmE@$w-osB=2_e{A}+I8D$}pkt8EYMv{yq8A&pdWF*N*l941MNk)>4BpFHaZZFTz_Bdp -eHB3g5j3gOJGLmE@$w-osB(sLeAd*2OgGdIE3?likO%y--uYY0;;t3)dL^6nE5Xm5tK_r7n29XRR8AL -LOWDv<9lFv7Pvf#ulUvd%YTzeylCz9k!($U^aW>PrGEMzj0WF*N*l941MNj~ShH=Gh8O8aer`$cQ}En -nXW@=jw&l941MNk)>4BpFF^CF$BzemKdyH$DH{!;n!}$*g8FoMcur8A&pdWF*N*l941=lFqfy5ZQ#23 -@7il8hvowM+iiQkwN9W(|`;B!fr>kqjakL^6nE -5Xscerr0v2fq8#r-dcIzHSPJ|ZVklW{p;n!-@RNi1{npB3?dmsGKgdl$sm$JB!fr>kqjakMDlKJ&)@Y -pWE4a)h-47SAd*2OgGdIE3?dmsGKgdl$sm$JB!fuat?v1|9*1OtNCuG%A{j(7h-47SAd*2OgGdIE3?i -8oOKiV2yPUwEADJ~L#*d6289y?9Wcu7=e|}`voESeceq{W}_>u7=<4 -4Ai%=h9MIx=)*=*ZBKS*K*yDH$#D_q}*#&52PXqee!Jj2am=GHPVh$f%J~Bcnz}jf@%@H8QJ{j28L(U -Ocnt#Hf)`Bcnz}jf@%@H8N^s)X1ojQ6r;9MvaUbnKem9i~M~ro>_Hb)X1ojQ6r;9MvaUb88tF$WYoy0 -kx?U~Mn;Xynk1t|zIQFMS#@I6$f%J~Bcnz}jf@%@HFDMH+Oh&VGIV6<$Sh1U3zLi%`TpL&v+TsEk*h} -6HXYEBp(8^_hK>v!89Fj_Wa!Ayk)b0)M`m@B@B6zqoE$<&hK>v!89Fj_Wa!Ayk)b2@T^x3*8@31v!89Fj_Wa!Ayk)b0)M~03J9T_?@bY$qrtV!~{-z8?&oftYYYmW&Nzx79E@rh9*qee!Jj2am=GHPVh$f%J~Bcnz}jZCp>)W}t%@14){z2{-^iJ>D -yM`jU{0V4xO28;|C889+nWWdNQLNbexj1d_lGDhTY{gGLGVywtmk+C9UMaGJZ6&WisR%EQmSdp?daTgRS3tCalO*-3 ->g{n`*lVvKQTgNgvbby5h5c*W|@(}A%jC^nUO&ugF*&{3BHPJji&E@gUU845BKWGKi`kf9)F&C)DDF(hP2$dHgBAwxojgv{b1LqUdu3AZI^wY*wHc5;7!YNXU?oAt6ITW^s|BAVWchf(!*23NjRAD9BKdzwfUzD^Lsx84@xiWJt)6kX -cv6X5hn)tFzz4#us_aF5}8v@{(u<-8v_6Ulm-9*GXMYpaA|NaUv_0~WN&gWa%FLKWpi|M -FK}UFYhh<)b1!3PVRB?;bT49QXEktgZ(?O~E^v93R84Q&I1s)2R}AWl1Gw6_ivrsXdXN=6HP*5X$wrZ -rK}#c>C`B41l|cRVee_qdjRWlJWDe&&&U-VSZuj~}!_mWJM$<_$n&l%JPUp!#^iFQK)1~E(X>R3KYN0 -4GC6jcNnx9fBfpc9qS{A|^ONElGJr&4_I%nuaOD}=E=O)a)z-?IJ`yVQOLstut= -myi>x_H1i+_V8i0qA5F6N)N2rLd~MtC|LkJl?7|ZBpmHS%*9zQ?`q0bmA+AuYat48&~fL!`MS$>3f`I@of2chg>*~TlDY9Bs7oGjT3soYWeBiidwpeku6o)~Q|SYo0`;4iXo|5p!{(c6PwKwb>JB -UzC)zE96qVsfhlZTu -1cyoq;<}!C-rcZ#O+s_xIn*xghV^Pt1EwOLb>z- -p(o#NrU4vhYte#s7}XkDMAru6lS>fWnT-yq-U{R!W{zH3GAHv)^T=n=fg+Ol7tnz+`Y=HKO6_Knr_Aw -2M*^9xW*0|XQR000O87>8v@d9qhoGXwwt$O!-dGXMYpaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b -1!3PVRB?;bT4CQVRB?;bY)|7E^v93R@;u-HV}Q+S4Iy7&#(H)EzeZ)DLXV}#DnVVEO6iqLl0SdSwreoUk_71U7Rt4>(Gi?!F<|n8Aq>lJ!EZ -EWuvNM;TerBle0NDNehsD3wW{b0g!A;>-hB^{fpn!(Pn<8(^CbCLgEnIllv8KThV0cGlpj)7l#|k3@1 -eG)1?MT1GzkPHVWlYQ-uD)Z0#wT!fLuD$^d5`&J||eEJ-O-9E2HPoYeke`(I}5rHbl(0)2=#c9ggpA= -i(vCjNqn2J)As{H(H8fgVxajMR8(J={UB?CNfP09Cmyg4OfF9NsP|BLCY3%5eN{o -EHKS1@b6b71~f>bhf-Y)084(PIxwwExunvLtpKJb=TL1rlo1-`Jg-Iom&OLkhz;372q1%Nf(nn|4Xh| -}#y)~f;~u~3aNP2d3Featdb#uHj$t{W3_jC0n}=wqN16shp?Edm9O1@26y-_&J>*ZxoX&!+CQL@5E*h -c=%VAquBUXXm=-a1dV;l}UExNw(1l_0cF|4Y3Fx-eScX4~bw6PT8;rua!hl|H2jsI}@C{hZlm43?E%% -6dq@8SN}X9PN&CT?RY*f@M4MjF7l?0$3~eWb2)`dlcp7Sl(zGpWP@tKd`xdp2v -P5k{?Xu>cqN+(tf^^zjjGe)!q5bxo=Oi0Uwd=4{wZdu;w(+b5pOrqPi4=tcox|N74R6ZmHy7FM-5n?g -y(1i@okv+6H*1XHXar8Od;@<`uRot-a0rrNsZU1vNPi#fUxH=25A$fS^U3vpmGo0Rhab;3$6n?qhwh0 -5r5P;BMmm>23GfPQNu_rmu<729&WHWnNR29eu@05Cxu8}t%?8EnDDzZSRWVXB6+x}V%PqX7vvTpCbKS -0K+71%3r4`dRO!7Ul$Z*cKd)huglNCWMM8K>E)Q{||jyXh=Di -7Q-()5&+!hfCM?S~L4c{{_fSx=qP#u-T>Xg{tmg0>3?z-sF$#ub&oI;J1pzO~y+hOnSUzmW|Z+acZcb -POY?Tg3k+ZNR3Y$cc!=T-cNa^=@qt8`_Mdd4*59T7oZjk_Wq$K^DtTYP+qilws((Q{OiK4X+s)RkY$j -VEDC<3e;9cVq9|Ati$X+JgF?=de*jQR0|XQR000O87>8v@_>jT?4haAN3M2pkIRF3vaA|NaUv_0~WN& -gWa%FLKWpi|MFK}UFYhh<)b1!3PVRB?;bT4CQVRB??b98cPVs&(BZ*DGddF@zjZyHGw{?4zci*-7<#T -XptHg?vL0Aq*5#uhJ%e5(izGYxbyOp~4_g#GpVR1YsR%-EP@rS(aNEW`9vS5;R%_0|Um*&nJku9_{nZ -q^&EPJ?RKxAhP70PR8UfVyKrw_1*5;P_Nmo*)_0jrv3SzJuqnq0hVu0SRZdS|gGDB -JiK@O&ZKe&WEkdEc2`@THT?IzV!3@XDhlMk&5ZyTX3*AY7q~(MT2^tzQitZL>tb*nFVJcq^w4)bnwV@ -V*LNzpVDE5XHYDTUTkQSZ{Bla+aAt&&Tl*ayv^5k&AOS8bkaae03^dwx_@T%3LYY{?Ix)OoVIL+N`;7 -b>quca%3P>>VSl-I)X#!{E8NN1@CT`I7*)_p@l;yug$CUl4uIxbaK(v}>H1YhSJ!}`OUQ{GsB(hKt84 -ZYe~$~3{|q#nt@vK_$UH0JB<=iM~Ib)*_c^ -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 -aZxvYE!XgnpwG#S|}Qsib*<}nm -e9GRHV$TTeb_Xp>;ib_IOS?C=S%8@4#vbFPW#PG^RoyUtE+uT>+Se$x^>j75ra`aQ2gOBrmm;Mo3s^@ -PJGQS}9VZzX?X6rLFyEEC{)q_DRM;1qOSQ3bM>m8HJ$Xa(+HZ|+5c#&oE0hWQ=6&8qp_4$6RLPYUwhr -p9Ei*Z@_HXEXNVPdoDKuHGq&wD!Ql5maz8Q=BovGxy4xxjtFmD*kv)#F~$Pej)ChRZ@J+Nkr^7F$=$r -8yES+aIa!qGm&-1bAtacCqzH9}(p`bPdCvBZ9;9qdPh2HpO-+KI7)S?Nmn&_C?nhs0|%U6X=c_M924y -r99ys1-@w@NVG_KEQ}c-*EnD#dL7IKBx{DfTgFTc$_T?iqa)LMOhZ5#c~KNyudCTJ~GMOUP%yREGx9H -(K!gFaW;BHMs$};H058NF!+M#_hxLy~LK#&_t=N}L`X&`Y+Hj|Ht1?yVZKGcy-v&FY2{geBbX* -cm$^jn-7KV^IlfXltG{)maKh3E|;@$QVsA7@!HS`^R4V-{mExew^>kK5K?P)h>@6aWAK2mly|Wk{}I09!sub2&V7W;pH -kUiq!jhx#Fnl4~n$RjZU+W^yL?F -CcbDl_@C|nk;A1HSiF^lhD~`W07B&Oy*T>Ds_f(YSx}@;f@+UOqVof2d4DEnk}lCmun?cB#&jv+A#@7 -yV~ZqXQhTUk>o&xh6eC^b?=BJ{Po?>Y#l80CFmV*J0Nz+Sn3F0^G7##b>bCBSESGld&~?jN^q_;BdPb -WTWF6D0HV+rj1jGwO2>Jrx+c)CL@l!h1mYmj8IQxd?a$_ni(5C_0y5J% -sU5%x#p(c-CQKO8NlgCwEhET)j=VZ0bc%W)Xfd>PMY$siy~n2!?IVqOyYBykSN!a&K4y^zW^r9Yv)4g -^(3Tk*_jbIKAEMFLM`SN%~BmC>7hy+}C=dPg!RZG4wrtikb~_a^~QOOS|QS{)O<{f_MW8nOd8KI1u&<%t7rOvstfCV==ZX{j{Pyq -LWHQ0FQms}iRl>Q(*zoIIrj2ERU4hBSX|3^qXXdL0zZKK6FRi9e`x-yB{sT};0|XQR000O87>8v@rY+JraRdMWa|{3gG5`PoaA|NaUv_0~W -N&gWa%FLKWpi|MFK}UFYhh<)b1!3PVRB?;bT4IdV{meBVr6nJaCwzhU2p0*5Pj!YjMNv9Xcl_4(rvqa -pcGoR5D=ld>aJGEBonZ1Vn?=VFZ=6voG%E3Zks1EK65;C<|ABO)IV@PcpSMf9`y&VH-P)`wEqleuosO -BSZolcim$m~5%gt%z%|73Umiuwk!lS-*_=iJ9SLqYAs_G!BblHA8G@+eKS3wNLwMKHHm4Rh3}-Z02A=}Tc0Uu}(4P2 -IX73&4b_pD^RmTJabzfg&_uB+PbZBSoG+NfYsvVrpkq3Kb$~8Jc$r>=t%%3qBK|FyK0)Cm{?l5&R|<` -NuNg;m(@2BA|3^)CN_o3k@IL7Z{_aNZ}C$D#~WIT}9j{=P~zDXauGqu{OQgD>bx%czGZ<iDZdke_v -+}{0$N|ObyoNjSj&e#U2pvjDlpQ@Qy#});>gNUl33Qwn2f_bDUA*2BmXxMbs$a&$<0RrlOj#)=%#H#lg2`aseB&KiDh5kHZ{HPwBh$IftdIiQ3*V9AM%i>hmn-34fj$T3!U`Hw -{z9)b}qZ$I$eMlk1XdN7`P9gTp|~ZMyO;AjxCs-8lQ&QP{DL=NA2slIBY)s>iDFGb8jP90;Q~u^dg9rWNp@1Y#EI?c4EC; -AvXm-lG#Y-yw1$E9D;G5@Z?s};+yRELTyk1e%Vkqz6y|pORPas}Rf6oBvyAf~CvXRUR|GnZelK^c{eR -Hoa(vpOEZ3(!4oX*m|EXrFXknXXt5FJ<89r3)08%3CF#CmGG#^J2-c$n4=C8!xoOBX}wFLeV@5@&x{X27TJO{jA~1%azorrB-V+%X}D?g2i|&n?kcy;tbmnjT9jdQ -1~Y#Bvw5^Rkr-Dj&pro+A-322G!~8?++1!^wu`8`|aV~X;p1Gt-Z=be<)tRJ>R4!_7lbED@n`LenWO` -`dnK-vI_F1RcXteAu1$a>Y7}Pk2@#pf|~BB@y;9RizNPj+NdE)E`h(yGF^4eVrw=1R;wWppoPb7OODE^vA6m~C(3Mi9r}^ -C?D`7newwVw=Z{`hswfkRt>E(JA+)TI_YO&e(Kqa-vngduRLrm<$BkYkR5!i5zz3H#@uQnSadL8UKQ- -&UJ49{a(8>7kALsfi1xeVIKVEdY&i+>Ip0yD-|-=p6^C3dVZA8(hC+ -+LEu2d#6bUnj6zE+Bo58zOW(Cb#FtYEMX?quoN5-qdHVwNX0w -4ISoadNJP$_X8^TD2QawvMSxGzaBjrw)QJ~Jliw`&ga3|DP7`on*a_67{W*9*fz;G4K0zX|pZjI+ol~ -60%B}YjKVcFZ%`&p_GN5ClQ*=%XVA_NM~MMU}IX)Xx7 -z@%5;;c2LhEU{a#S*Z=KABUac-s2w_5EuFlZzGsWSccMBdPR(YzVNv>xw(IsKx^;_pIf6*YcP4dL|@! -#wBq?Ck=*&hb1^WkN(nz&Vd5Czt}|-iAkn(&^?Q>?%D&s13_9a6bni#df?;bk>9rsFtq}|#M#KAYrvx -yTGTUO>Om36cTkK%Sd4M}<%SgChm@NGfk2k~wJsW1?S>iEU(#1Op1eVBRb||UV`g@A4 -Em?rd+&t@a}tYx)^11zD2z0tx^%HIywpetA|H0M!f4f7`p2PfhxjP5Ju#B*Fv^z=z3Yx&9V;gFvgL6F -X#+D9@#|B3I#_6b0}F@#1S4;NGC_-Bgc_Yn2+ozMXAVM6yC`~;pWRPmKVa$a9+@h<=h(plPqKXmFtBv -XKRqnVQo5bddBH_8*w_%8N?a!KhCYPnV*_ky%3L9bNSbDpQ^dbHs8>&IpjyvPx(vUw&snpX4Kbwnm@a7+=beVW~7JFo(a{L{zObYN -vDGKmivjF#&>u4ZmVl#0V^=~F3E+LW8F>jfs9gv1-;#jpj`ke2{zL-)`ut{DGhdNlHd=OmW)V57QihC1kk%e-Y1!@YWG%~T@Ox=lozXIriTQW6td=TSgVnMoJ{i1e* -_)RA2wH|k`JJ`wR7u;TWhXoi9n!Mb1#U;nQb{^O1b4J-KT+GAIQQwWmc70khqde|EsVA7WD#7Sf2FKp -U)#Q?j@H7Q9NrFJlfy(pj*>&Ye1aavRdA9X=GSBCxAuKa1Cq9Rlm_g6b$3Vt;)6d)0`ki`Rsu -eaNCNQI^Tb!#_yB(Jt0?>lP)h>@6aWAK2mly|Wk{@iyhRHI003SN001-q003}la4%nWWo~3|axZdaad -l;LbaO9oVPk7yXJvCQV`yP=WMyJj~{lAaVs@l|Z3a&+ -^YBmg6(zQKftYsDjY1C*fwBVm%5jTCwPL`}$7imAl16evW{GB8h+*aajq29F6)=yRRH6A=cO@c)#G{3 -Ge}AhDuY_*9O~+MtSb!Qsd80*0t5Q}~Di6;(5dS0VSvdB{B!8i8rpTAAMLnYyuw%<@FwMiP9=?gbzxy -^Z~dN|OZMx}73gj@SaJz+uMbPu<*F$0jA6KuFzCg{NCf!M;)-xJY3)#6A5WKq~Z!#t2pjvBn?{TZBNi -@MSQ+y<5zoJHCf6-RZPDp5I@PEip}6>R*P$qix6un5t4tn1m81fKh+iyCskA)nGW7-`nhO2J>-$HiMh -HDRg1doz4fn#jrbt$znRWoAq6Q8Dc@PC9{s?9mN4bMv|EH(J&tBtn_lZGOvqpnDWv`1)bR$qQ0vB?LNB7!L?+SUe@-|FqG+QNCL{V-wibKP%5 -`#U`&d^L!ZSF%0h>JDB7>t;=;Q|Y{UaFZ{%_!3pE(Eh1O*{6vLx0ixG`T)dbZKKHniuK)yY+;5KC-r} -0-sIEkm}GnIx?J%Mzs0DMx)_{OzTXT72?#_M~jE{4oz7A%O$7vwOl$H!yuR2Q}5^=oA0dcKX)1Bw2a` -gh9T!L*@|n0oA1=5%hS9$HNp3M9XOY0Ec+>1&xV9MLNdY2*f_BLNjB9uYc$JzB$t9kSPrSs#7e*`D&o -zj$*a9%fas^jEnrvip$i+*{Qc@i!zVj)JmOifHb=4?sP -oiCI=n+(Iy6aLV-AXf>wa%6E2fT)Sp={{UL7N=V1C%oNn$$G74u3h=KjL-OIOngR^MH)8G$X9oujp&$ -+mRH*A96Y{dW2QFPRC6jf`R${$Rtyy8rilYo8|KCq>YM|LXkDh&U%$Gipg!H_K6wDK!;2ld!N5{9w<^ -eitUFVIh618?j|09wTk5HoBo4s_p5Li>YAqgEZywJ(Pw7ooYTa09)36BD&Whey?l0AlsDKq(nU -uRANI!7^4(3&c1yD~Yu9MdGc-o$buVJoSh@J4G6;J!-S@A -5cpJ1QY-O00;mWhh<1Ac!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7 -a%5$6FJ*OOYjS3CWpOTWd6eC4uWU(mAn5P+SER%jTPo9MN355~v3ewoad)XPpaRtLXe6sBF6OF>y3DP -@Zsym|epZ4#lHJk_lGAlgX2jk*V#V7Naq@oed;jtO9)I(r|MK}y9zXv4hd=ts&wupzn;-x5hyU&Izxe -F;-hJ=!i{HL~{Pfd@fBNvvmtQ}A`0>~8A0NJb{QbxO`@`2?e|i7>yWjocn-5=o`Q67)kFUP|@cx_c9$ -(#``Tn~HU}Az5n&&SAU!w|NW)D{3Ng6|M9-mZ@+u|#Sj1TaXp{s&f-7(`1c<_`1T%!UcaQHrK7RJ -c?|%F7n?F7OT~uFx_|>N`KmAdu{pQpA_m6Ks{^q-Xxo_;RAAkJ#hsRf6e)IVB{?{MAePw?a#CMM`zxn -ll`uOQi|GSUB{_vYW`qdx4`Stxc?)tm;pMLl4pUd#S{N$I9AHVD(PxsUO><_>C`omXu;v -awb>isw0zJGlA?c?`;_w8^0t)%|Wjr{yiH}d$qk9YP{x_|w6|KWb$wg373r*H4yJl6NGKVR)nIezxI> --sOg{LcN~wfTDq|MI@+KR&*`Yva?OQ>v-|pbY-)QGfmT@Xh4=+q>}Z|G0C!pY&huxO)8R{o@bczW>c1 -zW(ga;r{I7zkmLV|N7Hk{^Ie2pZvq)zyIKiFMjZoU;M*g-=DpU`hNGWz*kNme)s!327mpyAM4YX-+cG -S`_AtS{{BZ_{P4ftDSq%bpa1ytU;KmH|GUqB@sl6@{O6Cq`{@^tA3T2cgD-yZ`44~j;~#wS_}MSN_}N -c?{-f_d9zTEo{?BEsH2-XP%`Qhtt|Mcwta98lR_Z@!y>&I`u{O9*~MSu1F!y -QwPFYiY3`#=8ws>QEAe)CWBz;}{=E78AxeE7}dn~&dp_V|}iAMWV6eQf=K&^_x#0fA{$ES88&-{rw%`|MR=Y?}XCbI={Vx|M@Sz`225v`HRng`jdbB;s^Kty -ECirzy0gye(*Ox{?R}F{PX|gNB8gV3ohmL!{2`SNz~jC^MC#H({wUl{_5-ZkIx>jRNnu^$A5eGKR^EB -@qfO1Jg)uO{eN%w%X<6l+Rysz5$F2s>g##G+`oJ5bv}F4+w-%>x|ZKvpFR4m@6Wy6@2=;3ZhiK6oc`? -HokROsu5WRN=dRDL>$-op-nKX5{;#?d*Gd0%XPs}y8|kIIOa{lzoXK!5;N`x}`{lm;757WIkuAwv-Wl -$a&AxAB@{e<8{aBM?yV7J3pS^oL=uoYJyh4i|k=b -hno-9JC?r+=LL?K^8XckT~9+A}JK%QZXX9||`VWcY}*$1T*9%3YA}?$UM92rrXP{#CB*K_|nxymWWf+ -&QeN!8^lh_djH4B7utDq>u>29WmvMFin{CLu8C4UIgjj8D&V@j-Iua=(NQcsnM4IL`ciJC+*W -CAE7(-ct89dA`=cG*~^;eK0>Ld`tNL1|NUV1eVwNiE!QKkuUCe5>F(DrLnL_QJBaTLpDq$={{D1Mp$U -=NauxRLO@XVtzTVt=Plor6JcZ!7=5C~WzWKBdD$Udk+THYXd1HQ57EdXjZs95Grwn6S*mFMf)bzIJe! -8!@x%<=CU3>R`DKs~C?kBn4?vlEWw!D?pd7GCz4)53PKf{aLe7#d%+RIT}Pyh9l^*r8PG|_W8AGxN75 -C~5#y{; -582$$J$=!9WZqEBJgKeyqw_i2MYfM@`D-)N_f3IZ(!SMv?!H`2r5qLfRJ!>pAQ#o -g#6*HFAuc^?PFd(>=dPb~3-=pOA+9DKn#Wzs*IZr^=$0N^^a+R1H|;4+zuTJ7bDr_O$RkqcP_88IQa7 -rbes|x4AXtJ$gE(5|L(Cn$?7l1I5e5jcd3QF;l{}sX_ojV>4kJ8R+;wz6vfl0J-9kg%O7m^a9V&r4Y9 -Ft9yf6IFJ3l6Jbr|>W=7z;sOkejl9js>*Hb$Vk!FhQ7$!gvGM4Ha-gnPbCZ|M%FkMzbgp{-w-9$Wu$&pKpy*Y8~^TEz^C55aQP^g9#m9z`6M=zHqdR!=tba^L@TO}{)p9v -7Kf)~%LYr$Ijji#f&p+?uR9nre+D>!*S=K;&HW)!c>U>$&e*zUInL)%w%|-i*sL6)|L9Mx|@&*27`%SMQ{TFJdKS5A#uL*9`n!|t -XnETwXF-2>gE>4@dG#B08JuxyWNjI~}Fz!F6sMf@o{^OcX#2p#1wZHq3^-|L>Tz9*DoY#%aZK?%>!BZ -{hMTTpGl4-klsI)*zlSeVzLks?Sg=XPU>Ewyaqjkd -~n@RLWCTJay$Wzn!VoGgP&7m!2`N`LJTv9-g|)=gbeE2L7l1@u^dM<^-&&p6W3_jCrWJNY2b*QYd;+^ -fc_e>EYf=Ew43it1eIW_BI2HHZ#4fW)^yg=S&x$6Hj7Ou9rUYsUUTNcUn`CHC@nzhz|CtEkA31)V_5z -+XQW`3Fn!)D{D{kRMyio)>PEoq51Tk>vS}FDW8ewRIBl6&!^qjL|ROzE{ePx`Z`Z?zgQWV&fP6XXC#N -E8Kkg$g;q~3yDtwqNmfjyn19aneP*4W_L|t74z`5Dn=$gzOI?zzY44N7+#qXu4VSA~7R?RM&8b_%$+M -?FcZZir#F`b}o>{tdZ!=L<70>y!BAv&ZcBGfBi6`CTj4974!gk_miqEIcG^Wrb(}HKIH1m(=bDG|BRti%o6JLfVR -dM&s`Z@i%dYgw@bEQ{oy0CHJp)=Te#-*h^jBpQK=>5q0eDjgDrkC}*GySM;XrjZF*7WiB$gy4>r6J(V -H-`T8bQQG&z;JGxC`{f?>?$_|2Gj5tJ&BT7D<@cxWH%uv -B|E2LN!=4UlO*V?g%qK*f)#n|DdhEK(=6+k4&Id2|a81m~OEElVEDfK#$C>*@-)$sc%NSH+nsNq78k`R8cUHNP_}-1A?0R4>Z$ -UOdApyF+rB|VhUD@@AWbZCJ{e9yQR$1eO+^-XNZ#(LTjka2Q3yUfa*k5HN`1zQiKofnHH=P@;U6Q=tZI7RR@kisrXJ^R44 -&pr%c^Wy=`0J8Wy$b3uSz*GJQ7cXp1$MN<#=PR@LX6B7jblj)+b* -YZ;*KXE?sJL{RFZl7-9=@y<-W+u^LOo{tG*EQ>9J@KXFbS0OO{eDA{<~*osopq3iyz~{dCBAmet8)(6whxVoaH_E~Y=6h4frR%$X`IgXg-YXr>spLF%D?EVkFQ{QV~D8E1 -}k(@(3OTr(@2clC7>mOZ18rYEhX*jbiwTd&`F#<``IL(8G34ClWT(iqtcw`O1WFAd4=uqT#g@~WX -uZ(vclu9=bV`BBzqoXdSoWSN5PiOn;2_?oTC>x@zvV!+l+2KH2dIh}s^8O5M@(hT6ihFr1n!Ygmo|$u>!6ZU$2+YI&yMJy)IufZr0JSxznU;x#igqy3r@M<;(LCeC|)lvqgU(w2T+Gy6}76sbKJxKN3h)8>xgL!LA^_b -<%gX%xFQEBNlbmhxzVy(GhE!HN){i5kDgTup=*!cH&#l%cNWbteGK)GB9W#N7x -k$^FKVo`=;a*94EJqT96r{WtXj~OdHm<32aQ|yMhm2{y+jdc(=n!px^E9+&08nksv&SzriXizf4fdj>m=#@tq -o-d*ho-fRu1;I~;$Su)P#Rfn-rnC|ylC)GSqp0<%NE|f0QY$N% -;nvt5PzVgfsGm7i$08w&(?U1bBGJeqP1VU6Dr}p`hABwSY64|H0~E4)WI4V@6RX@z3iSr${gj9vyZFh -xz^jnz%=sN@tN-Ou_wd%w6d9DIwpUQqJk%$N*}Oa+u%C9bS0DTE#i&t5Mw?wcRUSMkAwrJk(0zVJEwb -o9AX^Jn$1H!*)^M)D4D*)%NsSz$mx})51 -ToPPNXe-_B={WGoH3E5M(fzT$S96k$Yxjv$Pz6oGyWh$E-od$zPRXK$_DB@w&Wsu93v~abDc3J)C&Xf -6emNMGPl4{MMe8=FDJ?w-4BP2d5{~Gwx}gCOEria5EK|aDEPR-nWF8uD5BEy2sh^-m|%&rL0#=nbK4k -vjhGL!D$d@a&Su%=X2}I@Hu56c5-@>Gi{lBZ2jS$?d^G#sTn&Q&c ->2Vxg~*->1!p4Ke6xWvPOh-LG84Sm}GyNhOOK0MVu#}bxJ;WgV#YnJQR3@4_UHKVFGu6gA0B2H -#@dQJ5Y%*;NRB`8e05YaU!UW^Nu&gddW*WkP!Y1t0Ga-L*vN#)IstBL77^vM4?XGO*jXT?27VdlACGw -YckSa(?w=PMf*e&y9(j+fzS1@c;Rnq%82T($?-%Q|O&NX$+5Xx@Fz+~=E7rkux4EsvznW{UZ)#o^H>f>uQ?Vp2Te*ZJ5xw~*n6|Q>IZBT4UbAU -4CxYex)kM5Id_3olXQTW0^dy-a%1e8hH)cVmXPnLNS$o;No3*wr^_8=~JmfK*-Skq^L1}*v2gH_!b0? -AYH7{;N_c+LqvtH`S)rDtyE40?c#8l>#h>vt -{EnrbHZt+lsQX5^O1U;b@K2rU@@O|Uj{(~*TrP6*Tc^Wb#_>1y*yxFZ$pmrw!|qfu``?BhJeSMN~zho -A$_wIl;&91Sg_WwBffhZ-73;vj!Z2lq3)N_x!JUvtX)axHd~pG*%O{^tJ$6%shmfg)u@fnl~Y~XBidU -|)vbK#_54nTTCgK0Yffi4E_h8<7aef!>#<)MiqJjV2Xl&RhFVjRoVzwg+J{*ragEN|0l4NEl?DD9*5* -gch;U~(GohIp&Q{0F4-NEt0&ni{Ox@}~Mt)+>olG{OVfIGfW^X#@c#Pp?jxj!FY2!wWk+}K+sUK&sV2 -+8bnM_W*ozJOiL(Ft62IIR@W;HicvQf#|ZgJ(wutoX!M;(VCQ@E#qbJwPsS{6 -xW&~crgc9bC#`uRWz(Qt2JdYiZ>^QCz)QH{oiHyoVVv0b*6L5#;nQ-z%~7$*~(=*ZOulfvw6#!g(`%0zM$7!rB4OFcTQ)P+M7)*MLlCc-);RaP9EG`?t>;!zCa=rZ+?}CL3rMax1_8v@G`&B -a51cbgf@&OFoMWX*EK)T*YDyWuIc*%g=`+oIsinF(!c4hNLYNjsGH>}w9`J}1L@+XLwKYCy-ZP_x_l+BzGZlQ -<`9&!khV*MEt?@BL{PJ?q`~e)P}pKmGB$-}+;MU%mhO4s+lW41^F!fCO;iYf5Gn_EdAvra<96(x* -0xm+kYKlg;qSOj~4R&HB~x(=|44)^W`MRrk1VgWfSYpPz*aDyBsxL_S)B+^f!(z)BH7EfCE}N)H_M=dO$)=X#|;aw(sYuc%E?aQ9T8dNnrtZvo)VcxZz5?PpQS$Z!A&952Q9WP(b_O3ZeK3kWL>@H_Cm!n6^fOcmnPMpGBj>@i?7E|G6e`ayO<)rs -=I(s>Iyk=w5CgyVbdpYd9Na1o^_T6&Sa5;~(%z3ZT0LQqOW8BNB>*XZnnqJ!xpXIQ@a%_7!H@F=ATh7 -_7ITN$&3M>=m&#je`}8a<|Gy!bMiMQ8zG`YUDKgDBD!puubD$T` -Fr1?z?j_}ld7fPTu!Q7*SNquw-9lRZ8?yzxcHg{@U&_N@|GiH>&*PaN!{h7?sBAdIVHKA9$a%?$V_25 -G`k#{UCzrc$7Pp;o6GsUW$C?Uraou)mm{ysfz>tVat4H*Rb9@iE@xGjv#QHk)#a?}a@cY?BC{NVSq^` -!S%h0}-x-PttC;01&~mn7!Nx^1mTA~BD_DlC*5jZ=vXG_JauBavE_tQMeorTyx;aIhJLge%T3Jv#T^yET{6;a}?5vyyfuPvJJXyCM<5fp -xy!}%c5`1;>XNwIa9Zssawv}EobVM0~^aZgF8c!fZ7(?SsY?nk1uE0mSb$&F}Cge*>>t|I~BB@O4xS# -xBZ!o4>!Jew@qla<6_%!vF)(YWi7ECX4y`5Y`ekRe%yYWc~Q>qEMm9(FBvQu;H2%`*LLn}JNC65``V6 -uZ706A6JOgIrEQmb+xgvZlg*Z5OR=TcQrsbNXSgNVl7u87Nk|fsgd`zJND?j*QiK#aZQi>nnG+}5^6A -Q9kM!wzp4VsO@cNw`QV!*sC2_fCxn@aGQrvNIXE-CtB&m6kuBB_~TDq35rEBSCp)>in%e7?f$2&sq43 -Bh2x>@y2eH@98#K&zO>5g6@K+qSJq_-$JYZ_D6q4YjS8wpG%8J*Wb -ARAeKdZOh=!P+-`#-cE$z+>AnhYg^&U778e! -*0Qc+W_D6a$|yR$9voH-gdk8D8*dxN+lKMB?Y8Z@ZhLRr9@M69@3yU)ZKGw|KiPIow%v(slV -Ahw&8Rnj-oSaY=FLPmMA-On6SGZY?hFNidFwXQ+NKkG2A^pz6Ww-Bw>{HsYjoS}-1c?0&CYGdW!voBH -aqVO)xV9-ZKHGB=-f6sw~fwiqjTHh+%_?{P0WpDH*Mb_W`oylTXNfxyfak)d}{NmZGUky_Um42dfSfPwxf5w%0djxX5O} -$w|V!rnYZoZZTooJKHj#Ex9#I?^1bceZM%2d?%gKj+m_w7Ww&kFz1zrU+o{`lY}<<4w&FGc-uA|}y|H -a??3zlk`L%6yZF^kX9@n0IVYPK(&%eo=Hy)0RYF*xA}PwKj3wwt2R#tZgf6+r--Qhc?qr?PT2w6;8r*E_0-=|F`Oa|GBzEs`=(caP?Hldcv7n>dzR`{;hPh1v6qBOo!;;PCdNLG7bNVV@|0S_dvU9WT -*=&0@+n&v~XS40pZ2L3Y{>-*Nv+c_4*_FAb`Ph}&_F}fZm~Ag++i=*kS^qXwCZ6oOY+EcFzHi$id$v1 -B?zY<@!~4_rJhuIfZEIuO)!4{=+pO3&E4IywZL?zAtk||AcFx{{>OoT5Zp6Dyp|_ogowMI$Ri>41+Y# -F)#GaikQoLtp3m0#D5ZfNawg<88L2TO(cZO@;mRNit_zk5uP2S9S!`}^TH=Etyb@Rf_0ypy8m~PKOrJ -Zxfb4vn>Uu*=i>BFW2+k$mloNi0fZKbnk8a}h_nZcT|ZZp<9L$Nf|$C-G|Xg`DCj1?Nro`y4lE!?&k+ -Y@6GR1-TBA!_E%P@KF9Xv#*Mp!AK>_lwf!cY+tE_GZ)@J#X~9sq^N_ -8zgUzygBk_#+wvxNW6LQW}xpj3%=%Vfba&w8whUuid=%ngXfmZ3ykAu^YT@@Vde42CtjBZnV15>PD-ZiEbvkndoMsn~C -n4sR$I^P;^7l4MjH;-B5Hx(Ot8OIrD~e;sT6rFuK9$2BRB{-WduEGP=p=CZn5-ZZf*b=q96^jBYZz$> -;{78;ou+y20qKnTpgD#uUNagK!|Dn~ZKUy2l6 -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 -2MgR;haFXAs^V(311Dq8hkbQYVg&VF -K`xPcZPxmum)faz#8-Q%rl#$tU+0WvIb?1Ifyz_3ep;+H6Uw1);mKHLs^5eMo%{LX~9BSgR%x-jrr@n -iF3#rkToD{K-TD4r%=|QtU+0Wvc@RuG!4oclr<=8P}YE~0a*jG24oG$8j$tQ&_FXy3bh7m4b&Q_HBf7 -y)&Q*0Q@7#-tp-{Rv>IqN&P+wvYOvK9Tb+i=R)ej^d!zAxG^2)&Q -&lSc9zwTMeKZKsA7B0M!7h0aOF121|`IQ;{=Yk*MTgYQWThsd46B=jP^ef`z39OAVG9EHyA{VAQ~Flu1bz^H*y1EU5;4T2g3H3(`D)F7yLhN1(Z20{&j8U!^6YQWQgrvXm`o(4A!ZW`P)& -ODu-iX>ilvrol~vmIf#dMjDJX -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 -@eam281G=bL-7v9I~4CwyhHI0#XA)5A -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 -C0)%eOQ9R^G62kmInTMfnBSVW -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 -UOF4@S1m(lgG9w0d*4nL*B{0c -Fu76zz~ZC5@S6@%db41Q&j~>>(1DOq2D?C1Hq#4qi}rOz{#^KnLeC0rTfl>%h@9MNduJ8@OZgx8i@(b -?px{&KEFA#vamQLI-4jv60;YV$BjXz~7mWV0K~LCaUf7h@h4mKV0Gx%!I%?p#u^t_@uOpU&kG0ibe9< -F)Y@KD}>TTJMFpDByk8T!FItVP2R|O2nkDi-RawAUE&NEI748Hhbe9lFX4Dy(f~{W(2Ve9y9f1vf}WB -$Od0lbvZ4=|RS1t92hHxJZ~lw1JQ*}O3Br;!ji`D+db0V@33hoq8D7l^Gqnc7JYUPzKr-8jHs1O(YLZ`!i-RW# -KW}qEPgV>K(4nbK7-s{`c-(jWzn!nr%8Mh#JlJpKZ3DQa+;&Au&WHqSk-Rgl5|!)n!xE`fepS2m}&;# -rc2keu+)MP>2UwRA9CAeWTtx5+q-dC%v-Ll=@jEWJJEI2Xu+j-95eh*vs%zx+o1nhg)UO#L+qhJ-Te* -X+w`7bA$hUzPlnrvJdAm!1-OC3B_XRrCds<2xwL@S^beCtZN6ia5Qf1aW3@dj$JuT!gu*sbHLz=>_r1 -AHFv=AcL%E{jafY(QC8KV~V!lNGMqFwHQmK|dPM%&m;BX$q&@SP|UGas7Ic1G+LhbaE2g4{+i2H`kXb -f`p!|#JZh{q&gb5z(}fOfm%tyy_#DEa(%yVP;Ir7ZB=q_)v^As6ctOyxw?UpVF -ZgKcXP~fCzg^2-)lz+%Gt6g!)DL-jZ>EwmAC0v84WZW_+0yJ4G0XGd&o11w)2SP%H9xkj~19cNnQIDMM{!Ky5Rq)9mA9}Y)VT7)SBAzdL}$2A#2L(27TH*raNT_#)9$^+Ee2GNSfG<~cZwLB9uwwdoRv^O;C7O@ZrPc6Gq-K#k -7d6dz65)3fR0IVWX)QdIAKeGRIx6X2_w>pmKT1H30)9XO*Rm~G;h5IjP%2#1UW1}AA(ggN;p~SII|g% -iXdSex;LbR)QPWw*@b0&|2(SQ#3lWdmvf?M4fx)$#vDs5pSqJJ=>TsX25OT?*4q`<@m;3kv$Eg(M~*L -OwgdzrtZ^{#XHcG`s~c;(Vg4IwgY=BFM-`PP`2ZS*o-%>wwiJ_gIi#GJ;`Yzfqc%HI+L=JLxG$gi59cPvOV(+9U6< -tj_r^P*zR0~p;&8!;`g1V{)CiK)3U%=tppJn>>uu<6=P%vF)p6q;Mg>08Y3;VKL=Vel8qg(1ZC85EtP -)6OPcfaHD?D|QbkJWD8fYxA2CJr+KvX$dty#cNd68&jhIVB4QV@{fAb~$StCb(ps&If2(|Hl|Xur*3E -gMhl>LKao5PTjPF0x}Pw69cz$L6B<{{q8Tgq?^BiXij1o^|#r?8+PCHdN_hk9t2~T6TlQg>xNro9M0R -Hjp@sr7ZwDlGf&a-YEanKd3T&PZSB8xIW}4#deBf88!4R+dd5;5p$#pOUa^5aT0Nk+BIptF)mwO -xjJjFJ?H+W&B2{TtylToxXfT^H*v|rV` -Qf>&QoJEizcI-q^mp#kf>pM6NX_ZErFw2hh^uk2n|nM{8?fo*PBWjxO8U$uZxv0l}Dh+oJ9x(83VFs) -2<8d2{Jx`7Y(rd5I;Ld{6iiR%PB8SzK4NW(RpR9~|S<&374mmLDpZi -9Jj+2gr?u10PrE1`|o9pWNj&2$UTF*OXd<$U&?NZ{94HT~t2s&KW8Ii3+_8azpDz?0EZ!6MYHzXgjO0 -ixV8iO?p{nLF-voatV((P@Oxjw<8GXLYJm;uUCH;`jTaO%M&z(#I>qA+Ww;f6By`X^ -2TmX8Yj;_`;=jaHFP(FQKZ8YWP36@NBM_u5s*LT*e~lzqEcNBA8^mDunyCw++kF|FDOklQrYaonFJ`-(Zp`_rIE3zXp+y{ZLRfEYVBI3IL_0;#5MfOWj&>UNCBXtG? -}K%(7D2XW?|XQ6v-82B8;osvbLtUOGN)PE9WC>-SD!j&Nh?o}R0=QB;4(re;L*+ALC}ccv$Q?>>lu#TNVdy(gv;DF& -bgz?QN}~wZz$23fSHdTdAZ(ze6Er!LSTgUZ154I?%liM2urN_9_7M* -Tk1jp$i^*K;8@%_@wyNz?};v+=4n=hfp2b;^=p~r|V5uhA&Y0gM(H%!ETBrQ^?vL5V(W-Ta#i_>NSRb6_K44HYAx --ToT2Nz+~;pB(+-0e5R>Zd>sdnMCILwy4NO+ZY(j_2if2uGeq$R!fZ)Wviz2;&Z+bbzsIH#$n8N+xu} -rXZYRE7x|1+)${-^W_m;c;FJu9Dq&wxqw#Gis&&1=C@PSP(sRj=mOZ -F@HSEF(EZKUtNHo}*#uA>y=mk5AT8#{%Jy?Ih`~q2?BakW;}HgwcgOZb`r;CnBHZ -w=-?&#M{D7>AIr05p1|^692^jXy(UcpOkwaS{p5k}b&xBqv&6mPWh}1ATtJzNOJMwk-p#VZFf+m(TXu -E<7!&Swf$p`zY2~C46yf7bO$IYnJ4X~KSEfOfG8JPTFAV^TBO)y|wl{BopnF}XO#Zafm>AxXQb0b4WA -5$&S02a*#&pAvxC@8eYhy>s1ObkA+XK4S7Lu@9Bi^x@Ub_pXi_~1Rj5IXTWezyqHbEyyKZnq8*G9@7( -7n!9)f=QGeE+o08w!a#S5kU|8A3fetWYzSo2tTmWWJ*D@WA)@qI+#v*R1_nivLY^Xb61Pn2L28r7lSm -T%-z*O5j~;O6^(drT0A4y^@1%r}Y^zzePqI2Nf)Qpc*okoq#Zds2@nX+5X5hB5Jtp7u{?@}b?_O-eaPYjQ@;c{BH(;6F582qqKGr5aVrEaU1=BoP8f$p`tc@V|RLUyvyfh -<|nO5)fR%lcdty_aP^&)o%oQiVY}n8#=AtOZUd$3Yq^3#KR70%Zoqk -LUwfKLv4xpjV8rvB)

^r6mt-P%vMK69rUO);rc+CIjKjrXEwAnRX@UG5=h3}3kaH)&8z!Wzx8>fz -rQcEIZ!yP;gA~y61Cm*{=3>9KDYEJ~2fEieE&LfqPE{q$xHT?vR#P0^EUEd{i`O8hQy6wBF-N*{I9|0 -b)V%_v7yTGZq26U@cn_*iQof?^er|@TeeQ?4SM~OkA4Y8s0;a$ZHp@$0hR(hEwcd -zo5c(=}qP(NI7l6BX&ja1-U>EN?h0pH3X0|Y~Z7c0JbdM73Nyf!sQ0(Z!pPiJ{O{ZN1y6*8s_exEnhp -v~n2{vBn_6F6lMbWvR>PuAq03hAyK(S*8gxHeQ303RXD<8}KIP3{)sye7QcZb&PPYSy0Po9C;u$wX+D -$c2=fm+abjUfwnuQzqC?jJh!JE2q#y-~XI-76w?=m2$0x)OjBHf33x&Es?GKw&Q2kIn|(e!6}xS3Y& -f-QBRYj?uji3OAjo-6^KDn(Up(ad;8-0Lw`6XVzTeBKfn`{tqcn6NGiQyU5>8EMK4nwZ02Fv^`THko# -%c-c$#3SIIU$K(alkh79P{`5)te?sY0fwD^Al=oNgq%8cZi9R)P^Auge>+Q-ul0+CsMXtBn1`$=@K%i -wXU!Eqq~*Pxk^|K$xaCxaql(uQKTyLW;650ten)QGFMulZF8Dik}#@hQhC3N{sk<86Sut^##i}ubgvD#ojvjeuC?yK+}E-e2+2;c|5*S@;@VvPtatZ -XgA~`g{W`kW4hPqEsS24tNi28*b}27*buafYBamCm<)_4v8&V_a)4jD$WAW=Jy4S&=41&P|IX4S#Rg1 -zK6Z;F6%Nb}b5pXgrawA5noTp~N|*K8MT#lPgi;dh!z9J8bdk_AE&Gok<`!$U*&&Kb+0C*dmXq#lO#6gKA!r3@_uv$Lx>!{Lev)%%)-oG)Ptkt2OC84qzP6jNtWeS{P9y0YDba@e>X>Y#Et|D?_m -Du9Oa+tf58H-yk*Ic0bacWt>E2;RH7 -l$|a;;)(9H$+Rf#b4!q?5>TFTf5y*NJ?0xHoQ@@_PEka-wi -KL)xEbfKd$9UyRy*R%iRu>#B2QTJHpC^^kMu1C&9#IMR#3?SwU&x`*y^culW3QGt_~NHwDyC$-HY -|6mzI2F0_Q3A4)+C_3$wsr=9{wQc(=^4xV@<~fE6|6#Tav09CI4l0`E<{MWVn%|^1>6{>w-m{GScde+ -;8vr;!j4Xy&=St5U(ZtFhB`8&0Ch~4*7i5P0v}lgyB&=@3B_$p4epFneiEMYW43tUbGK>U}r9o?l}A@1{A~T>fm;50YOI3gKD -T;9hco#fA#KUCITF7w$-`b30CSuLH`wORBo_9w5@)(O-%poU5|9SuaLV*#U%0V$tQb#+sTpbgxvW@fh --AkT;|ZsPflx?kO5VK8|7;FGq7+-RnktYo7Tg+gQh+T;4&1pmAakm(o<9nWRjLV!4Tlj6~PJ?(y|pHSAX}29B9sD0c}W* -pPMUB>aF}*b;{_O*g(MuXUSq*Mce@qkHA>I;O{Szd#u(qSb!GtcG<~y6-s+ror7!ZC1eQ^fwp1c(VM1 -x>w^Ny9GDWj$svxoUSkJ0ozk{;{g@8$ZeI!B&x}RO>a1Psqsbky25Rps!grgc#Q#^8VNP_f -jl88H4(f-yaKHu2qAX-nlb|u|I#h7e-Dl?3A|C|%9ZGrJ=dGORUc2xEu3^>YAiA%_95wF>)vG!yNE3_ -c>}DP$=~HY)-IlEegvIg?=w7>9&(t_Y9fIaTiy-VeDh(jt9V)k_cr+qjtU7JGKmm3i9{b%c`VtGP6ul -b(t+~q|Al+fwJ7m{Xw&2+fhsGWj-Px)_dSn~~BKLXYUv#gVf<@&PQm<|=fGlmIQ?yWvy6HTs=Qt$AS5 -;^NrFUgj3|gHhcA|UTSegrpf5AR4&yE2#bo1WYnIk%NvxG`N7On%!*~E=U#Uo`d@CbZ+7 -gpia+S#3+ruu(Ono31_T)uBbd~p?mFatPD55`ry7O-ox^{pN4&d`w~RB@lO_2iw|G$zZEx^x>p(AL&s -0z2i9Z~#QSExJ8X>bZ+SH{hj0s6=YngamdH0Golq^qodl@ -Ru!&Z=w6q#TDLogv4L+vqt7}}qs|9F$W}-EF=z!bSRwA*rj%COPm8x->Rv-cBRxcl&Wvx$kE9-eON(< -4rW>cI7Ic+IRvb9Pc)8nFI1{zMWubdrZsxZL$1bjhJxovH?E=kRkR&*fk-?HFvZBTuYI-gm9R_&qce~ -&c#W`@YL)L-Rc)9VqYHh>uWg$X~Q~qwJX^g?sUFczxy3M;?_6heo*3VN}{DOys6E|xbQM2tHxiI+@pV -&1I?=QE>GqCyV*6%EIuMMHz>~)-8<1_dj+rSrj5;_v-0h_(x8#hW99Z)%Tcfzp)!9x;m9mqoWIz7X;M -9Wic53_Z7{5E0C^M#hTf%2s2-b|Db#jv|_d8p&A5!ZPu3*GDR=xPGh@KgXO&vm(jg)KHDJCmCEx}5vw -zgXoIjICr`H7pnZy4wYpxNqhVw&Bu=)yq)mj($L8M_W1>-@fWz_$RVPR!#Gu8+Qy}rDIy?UZ-c=dUT0 -ZA!K~r4TVr*3(jYjzRXQL$icgyyxof$Eox4Jgd~h=y~Q!8CZzJVFd6ZYwC`Y+yC*R6z;p!nZMq!R~%aEUYD!KUH*qhuO -n9QY|Q$AG!gqnO1nY)G(zzN=C@j9H7tJlZkK(+S6$9z4{yw5Bg~~{v@TCX*2LTzwj@bOD2B78w{feA> -!;Qmy4NXd=Hb-pw7O|p2=e6)tWA1U5!9##>j9l*-5znRlK@tgu7Wdsv%lb4PdRauq4fi}|IR+ZdB5-= -)uY5c7X`+ -2p(9%EMuL%Ebf1FYilAj= -~)509zR*hz3}KMrT3<+>m&cW%#bZ3d~mf^*Bi>^8h!zDK -W3QG_9TD0vi$-d#nJaz@K6^WzJz`0K9W~Xnnie1(!7W2g>{1<8V&h8~I+jUUCVzbfr%9(+r0L&pezqD -V*>;sJmUxFCpn_h@96YPKAm;{F#6{!HBTy@onzar2gi?kj=12zN^INss`?M;Y;9m7FF@)$sjO={W1zm -;1cr;wrZZCvzljRBgr32XKDCi@ -hQZRZ{`=PAV=et@L8p*ZjCu3r>L*R6kGYi#-l&$18`y5xlf%(#Me6HyqM?os?43pD+e1EZy^oq|}8uN -bA*VB2BF`8pAZC9L?#lQun}PY&+X&WJ;GUL56&rYZQI!$KI>&DVY>c9=bk-Jd7HZMg&MlFjw7NPne+; -;@P>W6t3|Y?iAhy11Leg@r1%?d={1bgxvDm$g^&={{Xn{?yE&nL_sv0>jYi9KjPG;sIQln@%C@MlXFe -`%4~L0f9^V(YYIT@wLW7fwVtv;ZcrtSDU2T<$iP#m8i7xLgexf0jU}AnE@9$DD(^u2E*?RgT{RZtiR` -j#GEMMiTLD&9q>8aTC?WeU-Tu*@^2jy?#ZNsJFsvM@8z$)Nc|!?O7ZFP;cC61d+qKKv{noTneximba#(9yC`D!7!3uqP!Cg~N@H3Yt;r6bj7af_Xt#14Or;5E9 -)93&noLh>QMT(Qtu&$l%*5`wmgOI8S04uuGSjL3yr_0)*DiP^gQu8(S^b01sqTBFBccYBQKDc0*%i{D -6cS_acYg=-CSwUVg4jF?27)4y8Baus;n9<=z5?jU*$N;@GkXn5$~q)FU9aPA=iM(J%T>IyYF?mH;`1)dAD%@ -nQ+e_9TCI!YaFBg*6X)G7=c+;L1<7xi?S`gnl4@9TEX#6X>Yn5pOg_i-R#KnyZm7`27}%BZgKZqdBs=n{298}CWley>^m4H3iZ1swoBZC2HhQ6dE$BoQXy9eU= -_7^kJ^7s%96O+NvUqJ!RTb%POh|Di%*FmWJdF-7dP#hNit|la~4J4?Se}Li;`|8vs0y%#dpv3b$T?cI -+qI9aM?IBs2A)0auYSg(%FCn`JF42{fceG)r-k44#jhQ?Ju+H{07h9diUIM4=w8chMgbWJ7n1MqIvSR_=OqaOuwi>1HZK5!Tn{12a-#>l#`psizs_Nh@6NLTt=Tw{&fBlHtbv*zBN`6Y^d+riNILkWLo27oA7)H>j#4 -o?2Lz}qyg`6VBt}ffXZM~WUwhFpwWZFse;|B!M2}h#monaSzdUD%LjcMTsgQB)QONRs5=FWe}Gwn3TC -j^B9Q9`YT|&Wh*mpQ1H~*a`3`QYIf(~Xf@mP1f(lnq#fs)Q9Ng>V3PN!`16aFhEmipl6tleW4p(ZDI6 --|gt}pNpK~N5e(SW=UbpL^PFOahEN@Vhs`$ -;d&eIoNa>h8u(dK~W$O<_6NfK$8&25#rtn94Kaa;T^8TR@jFZIM;xT2nw*lacjZGoAtVEaTs&j)AB1joPx3Z39QkU%dN9Cs136i|U;mKWaPN^Hf10^w+owg=*Zpg0{=4T5r9P|*nhVZfmTD -ORv8JMNR_1H~*ayu+2)3cG%T{kOsX+h8ASu;DFG$pt$!gFT1AuEIb|64Zoi@ -l}%9332JBoff;0I0TmSTJ8&3b224B-RL6n5HD)Q21H~*a`3|;%jxwMW0y$%#Jq#3df&3?s!VWgrp1*CV&DVxk26=q%2|b0MHA7P#{8!<3@}qW_jVA!OP_3;N| -3H@e;gnB{l-X5JGAJub>WK6XKVn81z6f%M0&tCALCEJ19B_RpWqY42rEmjWno-1_i>P1Q-ZgFwR@)Wm|yb3jl8Ksr#91u~1E{uc0vLFymucM4?vao)HD#Vjwp!`O8v@EuuJ783O({w=n@hthD-pFmY+O*s;&8*x?EfggtXOfOe -^Ft~nB4f9dAr`exsUt1DMCKhou`(4~G6ney7|5TpcbTXdp|ad-nF%kAcKEcFv4;-;)7;o&JhLo3=d`I -0h_9~_HegjXuG)F(Bv;h?{P`0gE~ZBmD@BWt>uAA_?GxumC5h4A%FW&z+i_Q45Fwff`<>=eZLKWnn!w -PLH#D#P&ge!ztWk1fg{^~2g=HpZ3jYjZw^W-wWkQqXT)HDXjPN9M{@z&BmnN4*9YTAZLr!4r*_Q6);r -(<)V|HLl_pI4M&3wO6GDGoLW~?2Pa8!ku+r2n73`Ej~2n`M35ANO)OPq(hpV&G?=tI;y-PRy>$yn+LA -NZr2RVcgy>6#R}VNaEzQx`mVk(!g#2izUZ#|sdl^cizR8>YSEVz0VDKrTIumfvQpCB@T6dWaW`c)EPN -MJ}wyDH?c0l4YeNfFa8Y?Q1Xxz+|vUzM&%SkH(|rW1v4AEvJJtrQvKrG0o$}a+Ivb@q*^7#e9|yBBGS -}(}V -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 -3Vc_5IK)Xn;td$JUGmJs!*P;6icUSv! -j~Kp$pjIV9z%VV#E-C*c-R-dvhu`|SM!)5v4(2k5Xx+D*4=}HYCTi%vYH+MOhwE~e<(157_upknKnea -g^LOD9;i|lYpq0ghfF(^`SLx&7J3iNypfjDVOMA#;FDWak6i^ggGdfrdNeTE7f22{xOiKJnO%QC&0tTIJr>k*mP5U*oQ;uwkRlz%8<& -IFhE8X+dOJ7m~*3bg!vXM%gVHZ}SSsIJ0fG+E9iY;7=G$?YvL^SEjCNQVo`7tl{RR{nzAAyB -DNG7cDP~A&DPwKxMM{MWgH=BxSdKychA^ahMmf+ -as|k3rQQmjel?}l4-GfM3EDP%tA$w$k+ -C!W#qZqUDkTo)6xkm10$Re3{KA$hN}Ces#3%tdu^h3QW7c3+DN~0uy)1mM6s@(Lc)9ptVjcg-8!}SrW -VlCAD6s5csD%>1)%j9G}*C(e70Olc8?X3_tkJxVY9+DLPMOivzk6@hSl!E5@gyvxU!U+z>GtAwjM=Xv -tbFLbL_iG3V3>|mZFaE(5WR?mz1#w3HY=1p3=tzPy0FwYC4+Q?j$acLU1~NlFP!OC~=xc!pMJv2ARBi% -U%_P%9T()J5qvUGX6B#aQy$IVkmzfYX3m@L34%wtmcX$k+WgpjLa>|scL|~4GMGh^=_MU`c!1hz5?hj -e%?wNTRZo;;BL9P8E_TZH1A!Lz&_BfhkIp~Xq+_{jInk9uGhf-k5Vhr|DkJhYE3CwoRDVmWR$F5S$(^ -skuuv`TrXjM6~&59g~xjo}0Z$mzZx7pW`I}2UXA^SEx@S-jI@_V(xO-&LA* -g1!1c9kS-07OtfJ+!w#yC(!lQk<6Bhzq@`uC;Y7n_|hRmJhj88wB8jL_r8ppdl!dWu&LoSv{=*Bp?B?3_=D8lY_|C!!pb8j%UVJQd^-6SA+ -}^LZ$oXb_oj5CkYY0KnwnpB*Br8F%R1ZKucTCD;IC+w{bVECN=lVjR&*Quoo)%_WNX~CdmfE#Xeo&ROOJ!-!jWufR6ujN?>!k5A#PDM0`pt -hQ=-f*z^9x|b4Z*A`Rm?mN2T>+BID5cX=N1j6BOFEM*gm&I3`bv)m4+3EoCuYLz -O;}FoAuvPAXXjt`AI&`-eYWs%baje?d`0nW?+PofDF|w@dD&(d>Q67x3$lT3iDiY}M&}y0<4NK3|Qhc -@5lu)Hz=@MS4uxLJq0T*cFv1CFn*Vs${|{rBiF3K{X!{C}Ds()RUa^W3vP_Z1HFSU -sM}h?es*5YwdLy9$)a*j!WkvKOHJct!Hs)YdyJR{f9PsY!&rp=hVnq%RKapIMe -n(F(lgGsuf`rHE+o^h32Y4k-1Ur9-=_{2(@R@&A)JUo?Yu>$BeJheP*LWvoL*L*RNH`c*1?Um9JxL9z -Gq)zW-BMxmux6KCTxq-4`UGiX$j -R{D5HPvcv57I`oPUBc-RVftJKjGxNKpPiblFrM{`z -bJ|Kxds8|j3BJ0w%obrzcxua2nWr~-oZ=BrfLSVG;-3Ao9cZ^=m;zKlcFt9n&i4k8)g!hr%jISgYET;x9@1d-#+;CulG+sz5DLr&0n@}?q5ItjXUNZxf -E@Cc=PW5>7Lug9-p|F?f#|rW&QBu(+`ht?{7&cpP=%w02G>-%chw{jVI5BlGlSPR!$Tl2-C{nrnM=nJ -ndnlZsmc7fLboPd!R#JQ->toN<^u>B>pjU>gDULg`A+KKXTIQD=+jryp6E-H;xI^mw_xXkL^Au -@C_l`;mG?}F{6LzXyZ0n8Z-jy~6zWc{QmDZMDJ5vq+>+MABxePQF*rPt^xl$WpH#A;UX~gs(eNdO$6% -~M(=TWW3^pZb^4?PJpA?)N)0p`DBnhV4LTHbGsY>u{!V+dIohb6agDIDVq^I7&ptqoXI;Bv^!wIjI9; -t;(3pzYuPXfurfE)X -{Wc71TCaVcW{Cu6a1N|Q71_9SY=bUw8z -0cnv+0642SshKC4V!%BH06Ei>w}WHO+sx -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 -_O!#2hEs|HyEUBJoo3A$Em$ -%yo+qbV@{QLd+PurWv|9Elx-%v{f1QY-O00;mWhh<0~wcGX@0{{S#1^@sx0001RX>c!Jc4cm4Z*nhkW -pQ<7b98eraA9L>VP|D?FJow7a%5$6FK1#hGchu7a&KZ~axQRrl~he{+c*%t`&SI=ivzgYIK=|n4SJ9j -J2lo{kZcq=8MHLAiBhCNQVG;wzmK-;Y#Mj5tCKXGd3^89Xu93&4-H3;lQ~T%$!MO9XgFOYf6*^;yPYn -r_Dl;acTx*Qi7A+*qssh{N{PtW9p#8copb6$OD~c6z|XAAfi0Pm{1pu3&)K_N92lXhs+4#NDt$tXe)F82dcx)9(W$3H@E62N}x8vIO*48Dsl2G|q?AS&Z7-yTRc0g$+Te*{?>ccT4D1UGM@gH -F#M;?xdX81u#=~>HFnXJQ$qrx9rfT)h=*t!9y*F&%)xHz`1NMLU7e{(OL0BwEkKjexj{T8v@AWpXZXdA(b0bKAxd{;pqfl|P7_lC0#^ZR*s`P_krmBFY*`u -E*ngG)Le_qQVP<14OgGzR&L70SA(D>~yA@Ng@Gvd;7l6?jg^f?f+4y=Wixg>T+^+esz1UPA}h`{i2>& -`|RMEx?39cu1pq5u2XeZ#6~4nO^g2|X{y!xJb5&w#hYlUOKU0>o61C0QK|?_M+ct5Bu}aY%U+vDlNKv -es$#CHJ*2U|`MF(g@Q+T53{S6%vPz2Fs;D%&GO?O%n7}S&T^dkZZ9sWhsoq&%JwHBv0TO$ckJLC#)eW -t+>c&`8KAKnDm5EW^Jm=2X&pKi!#a7P_4j~stR?zsg_0V#D#*=WLD~OL%N!m#wc6Nt2 -G$=No|T+MLJidi4!a2A$O&89{;H*u|F%~WWJ$Cbsj?;;<_?rX1&VZT)kJ9#)4Dz#^k1iG}rYkO(JZ*O -d^w8qqJ2kdS;icrY?w)TgQmHC_rA5N`F!&!FxKJjEN`e`RK%-<|qynY}(Tm@ekvzXk#BtZ&V6vlz!)E -uL@d8W0mAgb_w0%7Z8M?YdDjd8C6>|uhRi2V6FNvxqJKW{hb0vzzp))+ZHPtmg^a~N~6)bA~B6C$#Q+T3z%}FN77tP9SMV=(f)}>zE7iE0l -J<%N%7slpCh_tAxb((I-HpL=O{sUFRi}OXT7ls@~`)mf2s!2s2tku$_lw2GwGCpY?9_vl|*33$?rtme -XTV@YPb&Z9S*l4@8+~-Zl3)xF?;uRCZ#Wc+2R#|1fAe1PEWIN@g!^!Qt;g3JQ_}lQuLu90XCKl4U_w; -(5 -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 -1jqS>#xMXU9_l)g)A`#SP~|9xxSDsXZTYM28 -dISQ`$j~&u{IAp$$%_MC%5o_cTV`p4dE7Q$HQ{X#AzSblj;mKL@+qKH`CeK+7DIJ9Q+TpJ3#$Cx^4*mT~z%I6u++JTMoXw;F-XHp{e_ -#DVW_j&mE{tZ)S93b%Z^ZzGLrV$yjej`#pn3#lM5QUhA^zxcvmV&;Qqf%&_S@Ci%vSz9TF86y3T`>Ca -C0?7o@$26cCGgn+S~@6aWAK2mly|Wk{E=nhw5J007gt001xm003}la4%nWWo~3|axZdaadl;LbaO9oVPk7yX -JvCQV`yP=WMy_RsntK@3c_zRMZhWnd(*D@7}%omsf9IzP>(v`_1$9>izYbxBt(p*RNmhzrXwLhc~aje)-|;yX))Mub$t0xW3 --M`S|IlqMyHc_2Jbn`47*3d4B!&`{#Gp+i$NAf1}R*``ndw@1OsF)xLWB=KcQj-S=iYi2eXBozxPJEO&#$u9+*SO|pMQLP^7{4l1;2fNeewMM`Q2Zhz -d29x>DxCS-o5(M5Bo8H_WtMpd4FZzwd_q{q^J9AFi)ozPa8#fAi}7seX6FhwJ5=Z~oKUcf0&|Z@+ou)!<%p -Rg!$j*RQ^Qe)InMdinnPp3mO@`L8|oD;o -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 --49S;g%q6==yckxlMU1Oas|O>%}k83B+w{ -B!3FsSi>+_vF^g8(-}BUZ5Ze)q*L%F9rDn3)dxB_L-%?Cr@ExSq~w~cnL8WYe_;8YDl)#<>pJ&bahr10xk8nWO-VEXIB01SE;eQK#^zX{+sU@BFG)5LI4e!x*;_tM>+z -?&4h5%>kMfX}=6d?f$*{0^o2nSaT8PEk4GCBoi$`z6o%Qb}Ih8{yOR375-_)*ArpDGHz!unQlmpZgAAce(qd=NCZ>ipQ -1(&?K+q?aef)?q*D{Bv*bm>%fE(325ML&XhcNUQKYh*PsF7!Tbim_jp9y{|5-D^dLbn(-I>sv{o*L2< -+XQjOl383|0rNghT@IaN0uaLEcjPGR=saL+lsA9Poxn$u=vK}LnDsEF!7)+pj8T3MLmWT6)+C(xsri) -a&^)A*oTn+vEqOMpYNQMOWvQ}eTE={UNxjbTNqSkIkB1D6lcT2Zat&%QJ3 -)q%wab2a;^z1uG-codE9>8MQ$j8`H3a!qZ9K`K@sC#ejJAKr*5$rC~}TqqW$tpwY@l9#Tm*hyNH4cHtS-QY -KGO+yZw?2p-P=6>EccZ9T%b%9<84Z7ubR )UXl5>E4Y0aGyg81MJ-D_P!tjSWip${K=nq|Sgq**9R -E0>byk+jpxAxpdw_fq1d-F`K?*Q-j$o?hiybeD=ABQ3%{Ot-cWSr2(y489vENQ6}6>=$u&skfa(_gWz -V8svE+m46u(yDMrLvo<@F2x7QD3o(Dw?_`}{?%r}#nYFiHjqbI%>rAUK+?2y8ROuFXMmnJ6xXR(zaY= -U9HfBvpeOzK0tX)A7V!hihsl$NDKoFxnjj<&)q4kOYz@zFWVgh+zcewe!n))U1Fp>~1lm -y8aO3{lYwqW5eNX^>M&=Q<>y%ClJ)*)%wJUi^}aoc`Lus!g?^}J600EZJ^p&>0Rk{O3TsOdk -BrM9#(P0#HD-{lj=oKf}0UJ*v3q@myv*6uWDDj@o>I1| -D<=NL!(Y;>Xoy+u0bEdLO&y>@Y!3n1yiwr}+)G0bAEqWC3v|FVY<2g+zWG?C -J#*f>_}drG)k${5IS6FuMY8@ksPhB(LhA_Ra-nQq2bZ{H<+@suz~XP}HS^|fg#;<^I&RvtHRgzmMe`^ -S)$YLvO8Tl9gjJMN*Q&qe-K8(Y+S4Naixxzf&--)sO{O8P1A@2RfE2wXkHPuW2Yo5NG!0I2+^GUv#fUF9WxtRC7`f -n}8=l*UB5Qsus3ORU!f&6Do@5B5vWOTV8IivVL*KH*VtcHB=T({0IiWqGn^q923C+lQ4!%itJCGZH -bRlFMJ7k)8Yo@=3Z3rgF37dt&}+R;y@-2)`_-Rt$`T3XPYSlk_}a>M7{7O#EiuuK3jS1hoKw+Q*AcHW -FQj($G_o*HJr3Er9rhq4#JD|a?*`xB236 -*S(nK#XEdhC*!Cj=I^zJ=H#6|KMrPFIC-FfpR4r9K6@nI&dvJB0-JlMHDa_0>Q;$Hzdf6vj^)Lz8Fk9 -tpI>j_J69w3==F_-PYf5P-3;Y*3?4w5{EA!MPI$adaznMXGq3ULh; -RmaXOw&arqa)e&Q0c-mq#0_$&vmyKzJ!GBMOv`3{j#fB!iR5~H^dkPd(u4af)&5vD-2~Vfeo2_WWfg2_=`Kd53TKTrY-?jrT4fonPHTLzQl((Jea<3FPuJsDa~cY9x7>uB(xQ+fuC3J*# -Rwl}Q*j%D!lRLK@uuU?X9PYc4j{PSarZRGuT$yl0qWJ|oDIY>PLlV-#G@iKyeF3+a7JeoLopRM)Qi4^ -og1~8-XBC)W^(aUIisWE_;=S{bRE4(0%ICr`s)&a>YbeLM^D?(y*9FyRo+oQk&vumj)QueNE&(w#Fpk -S;1P=gp#4L<))1YsNVjg+pa%uS~ -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 -0TO`(W2ojI$15-03tjO#yEk-rgRxt{Fjc6BpoC -GL9hOU5Zl13Bd<l(&sUJ;3H1 -v68>mlG<3~%h?Vih3&Ti9Nv@bE1vxNEK#9)dE|*qHvrgxu>8Z^zp0#li8=6gE}%e*6c>^kIm#_{@ -rE5tCy$w+E;_H^lR?AMSBOJloL@k~ZGI@})gOUP$>bBJ_ut;2I8Td8+d;>F=@xsweS3NESRrUaX_+etK3|77t5UG6!MF^I=quZOc?W86f{ewxaThd>n)N?z -P`-?iMQB-@Vhzag6&)I$|}sf{~_9Pkd8r{*+Ne0>5HPz!k(P&R>Xs*%KturnBT)~kN*@9Q)aNG(V3%n -QV`U6)Hu0W@keh$DsAkE9-FmE2oJoDneZ0c#ylu^msXle7;g(DwMLUJi{7?Iicqc7)c^O*M+my0ziTP -P3Y(#ZWyaySJT^-nR*yv^~Y9;4|dkg;i0ji -bHMBsY|?KYDk6XDp+j(sO>U8{3Xf4>vrvR7HViG>fFch6Fci=7t3a#Ja1NRRC4Nr|l`ou#bdW4J%e1CXoENS#0I~!!dA{@7{FRbS!X3^gabB* -n>xCx6D+?m~?pA#crwntk3Vy=Xnjo17EeMDsb-GB%VxQvl!%5okauw>OO57`Rp{dYN2?^A;F&&XfoLI -tW#W9+e;5O$cbjwMC48^ksf{<7tEyC*BJ^I=(f?%L~2sSQfqz)O55NmHYr=d%to1I4l&&ySIdmXnkz5 -N%Y6tnmAjsIdEw&+{$6bD)@}she~fCV1{~o33v-E^x?3)*60Kf6>BXu{x>bNF5v; -0NhJB5k8}YBRCz)GcOR&1~avCh)ytFgX!7{c{|$b?rG&`f-$X)=Rslj1aq(#fGq$@Nt(wwoO9XJ{N#?a5 -YGnM!61j+kP^0sqPyX*5DpUlsak`P4%B;n>ZB1M(0$D}uy!Bh@SeO}g?jBq9=!NdZ=;BTmD!PL{)+~J -v#A&0X{XE(c-pR!nnwiB%T;#0m4x9+=WIrGZKjZlXVEQ!N(AjW4qe|ic5EtJ6-gM2&Rd)YkXh2@CA|GqR(LFJJfi -~fCHO?A-OE=oxgfUZ&%o5n0#~mLdp6&V%Y-nwUC)3&Pteg&`_0mA>4vFYSP9snyHZvInxUJg1xBrWHw -uW8nJM(ZIV6~gY(+0Aj;bC_ez0h}M>IA`IXa-RW2V#<5@3;{0Y)s7y77K|^XMzQL7GsGx;Jh?e%(vx% -5$Oya{AvGA{?)nM?S(IKC$XDR!`Blttq_S+AlZoB!=3ns?Y>F?9d{s?iRE3fJ8lD7<*s-8CEfQyEKd# -?jv#vO;Xo1p55MKE!;0u`voW~C03{GEc4z+ml9J(}u`Eh~m?M-^q^}KN-E!y0^1w`P -PC;TTeiGvv>T(vgLi*VP9wZO9q$df4K!%@qC=3``#F@1m#aKg&pFeVXCGGha) -ae4A2DJOk^b)p9{hFvHOQ(gY^cvRjxJOJra! -JS99umt&6^a&J~u7A3^*_zm%FzyLNka>^Dh`;8?CawC>@3i{ZnTrLT9Z$nq#vB@pHjW+A})uDJ6^Fk( -riwmHYt4(#e!O+;h;#W{0Oh^YAL#G5~`K%`%;^iv4z3C5VAZC`7d)JVYWe!rpL3S)i`-VAEQk6}w&Lj`t74+~87TozJKeCkgI9VCw@8FyQZEId1qgMjDVSeIC2c%T;!JS;VC!IH5g>it -}Ndv&SfjJd>caBeqGxzcj>?u;UbwBywo5c6o2|3J;Bi5$V361LiI9&C?B^4i9l}3+FLgiSRa?q`7t-O -;48~!mjuGaR(F8do1&zZxxQ9bPt`TC04PpJ2~+W^HJ`8*nUZR@Sy2j7e)BV -#K%iKF!rVJFK@#{^q}(dCpWBot8L+|HdQ;2G3 -nuG58Xf!*BKOjyhgWl`m)pAooDD&-YEu=GQ7jFzo_3f9z@chj=`7?iVuoQnI}~a>W~`=SGq+%*h;^k$ -{||LxFMcR&h*WPaAJ7k{0p8*NW$3ap*+rkj($sfgDQje2K5H_kGtOOm*hjh3O~V?G}U!8Y@q#1N!wx0%8+p`5iO!ao9~d};fUv}%~^t&k%qj#b%Q9uo_cp1YtX<&ixw?fv}nuvEunZ8=|MUN*r1ff(8;7Tla#YHlY>q>t6vM@PdEqSnq$sMU&+ZAdB1cCq1CqQKFg%Iu? -OSE*<8u_aOufpY3!4JmR!ITGaBDHeQAyvk6Qd-ZJsMtO!YOc+-`;`HvT2VCxmSvyk5E -OJ9eqf>F{IQ4QkTlKIrmR)T#<~Wg+COU;AYn>+duulnTU11E8Z6X~@Bvp`GtQ{!QnL!-8>~RRg$Sr@}^1BCCMN3Y9V{X7FoGf>I2!5PRlU_#X#- -w)ksUW|7)n{xQUEmZ$Z%_z*%Q4^IN=LW-ro`{y4SyC-=fgl(WeIjmU1VSP4PzgM+E%-TeZ2dDE^tIqY -A*;JJj|qB#UFk0XLd__6DC8A;JslrSo*dn8NN8qLZ5&sXPpTHJuY)_?BlDiXPn_&JZBZ@ -^#0B$PsqEeJ=Ji6YTuy>gUm! -*1KD|v_)7Y=!LB3&`s0<8)v}8%m*U0B)m_8dQ`ELEL`?9v;@UX~XbqOc)#4^6_=N>n8ufVS=e?hAlKK-c^q}K3dG|Z!Adp)0nDeqwm#H@)6mH01-*MgRY3+&ny?B4Z^8@kuTapCwves5zK1( -qAEe`0161DY7dP8i%#VsxYzsR>~YCX=Yf?XRPIP2snEaAP$b@8Ljoi&N#@;%M;=~?wqOiFgV1+zIEm#{&xRjQV}L3iR&a -0oaAr&P^pS}@v!yj<7&3>tKkItkgvh`NV(Rd3nCBq)RDrpDh7qF>O!aHsnSBM{j_(8uIgt!)|9hg}pHVM=dNVc%$cu!SkN+^J{0|2*s(Z9pVT^!MJ7c3{O&k~ -b25iGn;)kaygw?lN-@5x((&?zJyLkA{MDZXZHY){2D^FFmW6E>`Kc^gfdrNl=Fg$tHPqHt&*u+U*4<$ -j=k`c{aCp(OXTI3rs_wq_T53ltgi!D9#g|dA2jY{CN()3w5vPh!S;qqApK_<=yjT(08N~a}-6*{Dsp5 ->)4Qaqz7QqhuJ&<>gZlc`8;KFHZ;GZ5I{s?p3MjGu0(CV<`7yYn-IeSq18;ZqN@%@2M| -J@x;}Lxu;((TV`aTUo5sP6T_MwIY_4PQ1ppasCst>!}a7tW?ax*p1iU@X6)3j_p#suAVqT5c@+P?W|x -W3;04!YN7B3cd%T~PXl0j64q4eOZM?tWx_JXGC%xn7;egqj3U$RVsq5hS0A -$o&%HHQoJb195O{zAt8Ukk7sYICAQxkDLQ?bQ!oBe?CK{TAIq?gvl+3S>06}$Z1u{-Ksv45# -#8VWDbrzQ&2Y+4p|{5l=p5a(z(tuZ0WlvJ7wC-}Y2qkHYpdZ}d4z4lT&YN?kGi6!>H6_sF!sXA;%BB{ -$GpMyLio^R_MP64m`)R0%D@=`LAiRP`s%Owi8M9P)jRSKFRJ@%I@fWl`(O*DV$OAziu7U5N?7pj7V)l -K5)0n-x{mn~wY(LW;*ouu>{>CQ&1SUq%J|BRGZ-gzA8P!0pfeTE0YHYZ7pg!D^knR60J`na9X7&2FmZ -cF@(rI^K~*SjC^OYC-5{-mRl=gU(^^)shy@-MtSUtk3(hKw;0OEgccJ}11~yb-$BMB$K%y$x*8BqSn) -rmNG9K{brsZw*fn&86R>?m0cpTs=H3oZ+_X?q>i1)kM1w)chClXW{dmslF-7)G;nexBJ}uMG`s5viF; -(g@XgXJae<(Y&jP!ad!l3ye2R -V)LbTE-DE)~)9;aUTl5RH7-75GX{XC?_t=w<1lY~dZvyk*yeU}>!3o6Kt=au*29}q>mUO!=yc9rDJfv -TruiTZJ%laVY&L+t0>UicEk5M8g -=e1PE*W-Ggg{SJ@3Gg`7ZXyNo3C80%`rUP#ZstRGAKtT0(^VKh!y^^)c@9A#Qr&hZte4IUD;Ek*Fbb(eK!nRrlAs|C2C7Vm$7bt0W3flM> -xD1DwNHHc9Ot{_f{m*_sSgRxy7g}G9G4nuhg?nKT&G_2sCT{aB||54*=5{8TZ`Xy-clwv&cr2QoO+h{ -hp8`!A2rPU;6mlCiznWC8V|J&a{7)Di;>>TI5s>e36hy6#ZF_LADZZCZNBT#V#iLRd(ELIiUDEWOxI0 -Tuw(^GS1{I`LGmd*6rId$vNq(fZ!p`~*t`!bAt>4PvZgb=lUbQeuw?cOb5~4+6tKW9t9}~o4B2QI59ftZqrK#m#1Qxj;yUks*nY_{BZsg&(UcEza}7Q-5ta|KbE&3$oqzcS -0vHxKdWqe}T#_%2eL(k`h{F>Bcp?B#72izxL2|F#jiHth`+xM^9#-PXQf>()NGEOA$I+4E1a802Dw*; -In7*pU*B_xZ8zc=gY${Vd&Yza>hCC*!ZZ`tdlNZ4a+wH|aGoymedzf=X?43xw6IFMjnBLcH -CG@iUyv-lpC4!k0iAC;V9&&zr8nLrCA^s<($gF41A966|4*>^VD>hyk8q>=*6s2XwFUQHZSDbfEO=%_ -R5?OlxJ-`i^c=z^-SU!$){HD0ok38)u&-9>Q)f$|{{}-Di|*87F>Y4pct_anm}O2tE=90nJIGH0i!nu --@xDy4NJRH8lMA_o@G2A{tB&UuQhMA(n#NVd)-^(+`-J^oBOowsB#;AMv&%8V<;<+r~EU_09a --q>kp`(Ie@F8{#{?7ZQt{B1XpJ`H^2+IrmP)wWQ**&ZXvx -O);5rq$v?%^y~zq1&OW-Z4~qI(_WZxhvcq8d-M;%toL0>MZxop%+5KfzeK+kg&oQx0rvH*cD^Jq!I3G -7kvfhUZL5Il>(z>hkV+5f59$3Yumqm-naTXk>)5I@Yo7_M&^OCi+bXdC&n+Kwa3i$%uo72{)uW2~RP| -fQ^ScARc}}3DBD5ZtwO>h6yjk>4`2qQKKhn^nT1d(-mEMqDRlvk>4^b7?W -_!``uprlJtaN2OAeg_b%-l!$b^H`r!C4$Y2wNMY_MymvhJypsUMUXU-_>dU0k@52ZWoWY7_Q4AM0niZ -&5wB#Ml2A>E!bGRuE?Yi0hz -PR7;F0YfQvsrsmXP31^LOhI{ZCoA|3G&OAo(2yPISMVi9V90Dsg -|36)ER=Nj3l9^@4}#?T8ytnqM3gfc8t45`{cdBME>YILtjK0l`e3lL4x -lmANdNfPR&pQX_y$YmA`Eu%NA|A3$DWhqE$+%^m{6(UBO;bMRTga%S85J`m=0(VSqzMZ%6eb -|x{u63HX1Pkrlg-V9SmK<#-+p>Bw9+MNs7sHt=r#0_sWG&C<$O7Z&H~M+)OH9fR;(=7AX}u6atEr`hf6A8 -H085-4op_mlulq{4il&qAj -l&qAjl&qAj+^bTeQle6#Qle4f@DCH+D;GYYWTRxGWTRxGWTRxGWT#~3UY!!15}gvA5}gu5m5 -F0I@jE98o=GNSk`$Qb>}QzhUb*lICBX{o>|~9cXxJtiwuy3WB2k+N&L%3diHdBZBAcklCIYfq&N)vL- -76P9p(I#A9X8Q~O*CN>IoL!FHj#r(`vI$d7qOr(Yj6bN`e*Gfk|{ViKHei)~f -E5%O6EVg_TrtrF&DOj0P5l*lB{ -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 -sa%ENa>K+PV(Hb^hC3T7NSL1o_??r?UqqTY -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 -NXboOxfR@%1?!LSa -3K#)vNE!xoCcB`C6mGsX_lMiNe{0}LNk6fZny-*KM8n4#xKHTqGF{?Drs%0}PSNQwNYMm<# -{oVD>?E>b5Ye9cO79A`7}=SsvgksZMT?`QNc!W753A>-!QWPHHKL#D^E3I~P&I~aLhF`NpFnp5SUci{ -QMi5!l_Jt} -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 -b9oX(E+n{+gvA7A*~z?~AIU=gu -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 -jXST{`E -O;I9Q{^?kvwBa3i+W&z(BanRrnxY{Igp7P{Smcb@5M*3`?3t8t?e{hILA$1~NqNr_?;0(&;Q8we)@VI -#ZHR^s*uo>8I?LtiCzHHsha2NnVoWjEh-+drW0`s!!CDeMhAxJx)x0S#lTgfy4qD1T*Zf -jt|sjLncWk2p@aH{$%4Mp-G{Yx$eKRjZisf%6MZ`rqj_^>N57NZdYc8k5_MQ#Mt`hTgr3!4tGTeTSP1$vGV6ct1hWMKJIB0p<*Kn++C*peb?loAbr9&? -zp1^jjn>VNT?eLLdO2{D)n~-!BoJ+!M(6fyrhNztfj0}b4%}|!=c7TutyNI}7BD(62;6X3J6&Ldv>CR -;az)h3g7GID@7-#2d!l}7b!Edtf3ALE>GOa)-B0g;jVcWXp)=IULcd&H9Ty`{>p}=*@z=yam1*Sl^-Tz}i|cP`izc_2%qzv&HJ{e%u7Je -oyQw(auk|$#trcx2dw#X0+gD!Qwy++pIfLYGj^Sg@Zu%LSbEbbig|QciWn0ZPd~0zmfQ ->&MhG$?7(HYzaMlFxTu^gxLkMB#d}ZN{eiC*w%Z?cipkxF*!=gw+h@D@)z&A?#n8`$jVAEz0lSKOrWX -8Cakc4g`y2$mHKDtp`Vq7tbW`L0-PoP4ua&?TD|62JvR;e8p27ELQQy6w3*SayyIzZ+A5~wA8-?VqG= -2^?B3SoRf;ne)Hr)HW`U{4yeK7CU#w>JoU^wZ@+j8(aXx{8>-%rr*Cj2WP`eo|8m-WjbZGH`OpvKJA8 -^1I4{==uZDw6LQ)qnY6W%+osoF~&bz0Au*y*P2D-dKe>+n)^8D;X=JuTsuWvU~L=_nE9JS-{|?Sjd6K -SIX)u$~Ow)D!4tmOXIIHI;1TBBM$xpP)h> -@6aWAK2mly|Wk^dse_iDY000Xt001@s003}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQV`yP=WMy -z=K+X)&1UcfWsJ> -7r5r-7!cF;1M!X>Sk)`lafrr>d)q4Da6c|DzA5AJ4Do;{4?F>h6?2TwI_0i?)n?=e?upqoV6Peu&d3p -_6Q`C@$zS`zub82+vPXt2CZPWtP({iB($C3}XhKnR=eaWsI4>sjn)@mMW)gL1m9jjK5N4F^iUpiH)cBx>Wg7VL1GF^@%Q20i^U%r7DLtH>>+3o?-GuJX2|*C@N^F+l -oia)R_iy*8rij4B{(x-;;{buXTS_d4U#^17Wl^5`BWN_o7nchc}mc;yysHDS5t>v+vBV0=l2*3rqK)k)so_;B|>mcuquzzat+`R -aCv%r@;hc6e>lH5pMKWp&(5b;r+0UBc7037baQ+=JwN$$aePZRpKfoi?@k9qcS;$GHJN=Rw-hfR@+kw -8b5%xhQq-n@hIsR?O$dkxk~PgURcHfAeMj8rfYD)As_$hbVF(FubsRmYUvE{p%G0VjJfdR#bPu_E%T+onS -5Y0JmFQOFy{bqBXWz1XUQLuo6ksJ!ye4-ovLwmA#Tb>VVwIGYqah_mgdzK&SIu-FFY@dOUQObsSU(mK -;!x3^xZEFTQ76Vaq>SZKi1i~J -T=+x#&tqtc8ZQy`Htxaxk?pmwevqXlXXMw$ -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 -d|lFz$xc18Sfi|tvQWr{R%oO -O$#DFyRsT=D$Nhhh{bMcB%phNB!J|ci(oH!gx5yW*RjVBTX)Bp#TqkOxM|(BRD) -BI>%1E15I&4nk?Qm4quna{wkOiP5{{z_P9 -NB$@kS?7 -WppoXVq<7wa&u*LaB^>AWpXZXd8JlcZ{kK2e&<&lDGv);mcmwjNt8;2kOUP7;-XcQMrg2)VH7iiX2wa -qzrNp?J2q+BT8b2(^PSswF8Jc2_@SHjeWy>|POIG?wdtn&*!qLcU@uA+G+r=08abCr#MIIuleE;+KV= -*Xnkf0k#zGS;gt6=>WXFNih5|rqrLBjKl1>74%WoX(6&unKxdPX~_u1J%tQex@GEp)RPHJWGYF650FK -|o)ZPxO@uy7pGEX_RTLkZ)3tx|+qI4ZX)^u1nhz(pavM$I^;p~qSpvSste;kuHRR?f&-g8Is~atR4hP -ncI4$arq#lD-i#bmTM*Qn%15LyQ(F{zR<3UhnG77|H+xqjj{>Qn@P93AU_(=UC2+FsY|JGR$OkasLDDJ3=%LwK7E`dVG$g4qw+n -O(|G*&%eaB4Fj481kC2LHkTrM@3#O4SY+jZ$rX -s<|kbd-G!HZf7i2FrQaF=3H2JI1tXZ> -$q26RVy#V;ZnSkC+H1nL{=Lzte{1|&ZxBsJkeqv{-M{_hMY<@J&?&!UHnpY5V5w@fkp#E~4!zsTH#cc -z^b7=TKrIMI>;{>zR4N6rusCQ*?Bq@A_()wodc(qFS<$D6rc;TtF`bqz$I(XapCf$j7_|fWx7u`hyPa -lm+r&jkeTAWPP~1kT=A+&jbyryDBSZaMuTuS`v`f_Bez}jcJb>&F7>$$Ad+UO{Ha?2%i>fU2RR -qlW{pW(`?53N(PnB5mY3(a?dykHo!wgX+ag!Y4L>G7AnqpSvOtVw?eU<+FUxTIO%`=9W(nqSFnStXqdTzWRQZ|ZMr4I}WcXYQy2Og{23i7FOYzwIVRFL -(u;3KMWDKRXKm+I%{>h#&=cJ8i#hAko49YDmFQtr6?0TryFA_N@<&C^wVSfi$$T-zPp -&BY52LWK#Dk^PDv}|qz-RIMK@y{f$Kkj&8BfO#!!};Jx0T9&8S$NoVV4+{EB)m3?$bFryocuJ>OZNc^ -fypT0|XQR000O87>8v@&Ww*cSpxt7uLl4CH~;_uaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1!3P -VRB?;bT4gUV{>P6Z*_2Ra&KZ~axQRrl~rMH+DH)n&aW7WFGQjo(5uv5bRUchl$L;H8%5FSgcf@Z+bmv -dcb&-h>+h|B5CfI&EJccE-n^Z8Z@jeIw;vjfr?UmkXa0B*jcGJr`akFw*mkQ;@s86{i>=6+BwwYRgrN -uZkC2klDi<$Y8)T9l(}r70x#fvfni4>JtrNp67ghlFmA`PQ3a&|IWN%Odzu?v+tl$Xk_hl{;W`)WPUU -i{#{Q_bNls?20&6(vXZK|5_`Y5IyS5e`pou!U{N5g)90E(ON9(hty=&*)DZn%Eo>0uIIB>o-Y0k;0 -%)Vlrd#Y4P3Cl_IRG33kkk1m!)8CXv{a&Rat6ZqeQ;6VZwOsGbN%`qwMRRU2A5D4AHF^rljT8xr=OW> -`;lvCTE@pOTeJ8Gw=-3EN6zFSD?uiTJ-Pvv@5TRjja60YC*o6SpVb=AJ9VlGk9h$C4!b5$kye+|b(v( -DA)9&CH{sAEdeZ@}FhEr*HR?03IfThP-{B604$y+?pqZfwWB7V9D7XBa$*AGl$Uq}IBOr=?FD>M#*hj -HkCLxne*&1dnG>wYqe7vm_R$ucC50xyhb{%Y=p6s*Ev8I5~zob!{!PRv^(ze${da<8Byz8of`IgI`Ud -kq?tDec$`hs_Dcr -CVVy+42q{YihlrQCCNsB_nCWX{H1X5QIxnR@TRjk1&Sm#KGpU#8A7-{3om+d0qscXM)$9~g`Dzfem91 -QY-O00;mWhh<3dc!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7a%5$6 -FKuFDb8~GjaCz-q(Q?{I7JcU{x{8M+Rfv@UftXYtY!A*j!Hx@XrSdc-L}P15mb{X%!*1=r?`^dNx24- -cHkr-tB*3JNPM_v>OFD{IOD`k@=JvuMScpRo -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 -#7@B>jFOEPlcbENu86W+`vhG@2I~ -C=v|B9~DJsn!=yDDVYpY>FHB~P($TI0mVHDfMm|tBt{z3`Bl&EKzGrm=92VVdqG+-pm6B9|1T6j@{Kf -f3grdDl5)0DL?yPmp`sMD49zP>eg}z+!6yO~4VcdSW2Fob5&R();&(D&VPZwG2ryrpmZ55=4 -@Dl$RxqI&Q-Ki`RH6HMyy478@PzqPXbMEb-pX`zEalJ!;^l$BP$GR={yU%y_13p-KT4qOxCd`JV-s_Q -Ix#kWZ1>&*8yIu~9NVQ1NT;#{$4moYBBhP6Irs+&G0|5XKiE)+H4S6lL;OuZrR9;CP;N7g>(|ZQ@q=P7^vV8WHi#u>~H&hb%msBmeV{BGGQ8SnQ>ZmSea|26pFOt7$`^NwIj{IcXjn(=1$?e;c@+lNjkeP|R?*kWIwOYx`9{~TF -)4$Tt!dK4A#o0xBjVnm#Bbb1F}iN`IA3tUkw&T+Nx54sXpt1K>X;qJ2%&2sGBwp&XSpSYzPMPEzC8GG -kG)fDYB+wz=bR{3z$YCb1ggV*bOg-NTQ4j;Y}Y?A^S!g|f{#j;-4HRWM0x91e(luh3(?US?KWkwqQhM -%SBI5WzXquOX*1U=64g@B5oz7Y9-@-KuH#{UY$VMne=s<12^jU -OL3iDce-9t#b!ko=WZp3{x(zu^`B9Rpo;aQq)wgwYShYZ6@H8x9D#oUP)h>@6aWAK2mly|Wk{D{@K*f -<006WO001)p003}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQV`yP=WMyAWpXZXd8J -luZ`w!@{?4x$DIaQ7>VsA%T^r>jLP)|L5QK@Us28Ed9>ZSjU9`JS;{N)ZwGBA7Nz>kbf_Zsn=9$@9pP -V!wI3He(rZ652hEs0{=i{5f-*CkCq;&#|4Z@A$Yc5y>0~sK24YB;rqlmdut-&Xm+uE6q1UH;4FYpl~x -kUvs1k->)_ER+4XImsu94CVN%y20*{Z(73vOfe2GpTa9uaFrGV3lTw^-xS%tZho6HU^wQ8+xBV|3MIq -<}UQ32OQq_)RMEk7dBa)QS=jP&qbhgDTcL4zH%SFh)(8!W9ZsRLv||McgOnG51 -ku1g2qYWqNa9>e43S6^X#5B>0ToQ$S978~YKJCJB6Wd%I`_Vh5xGhZ&ncb#rSS+mv()5p_fDJl#eL4w -VMLMFzVe?&${sQlU>YMzBIiG=@pkAq298ucO8F&FupE(>wUupU?Z##oZ~{64Rum{^dwK-bS2&sVc>UN -hxsxm<;EGYx3xykH(|Loz4Dow3rS(4=!)!(1%%nz8DQ|$Nf3XZs)TbZ|DMeh&zfcnN1|`DGmuTmc(R$ -hVe+}rQcC|H6<7Yuwjo#ZT6AVL;<5KvQ2-ghmjQPtX^_C5PAwc1R+fao)o9qq3Nr2mrxGcF|w#+pw0vcc$K6QHlw;oB39T-k8-nc|gS}p37y)HV{tx(Ar+<4 -`0n9^vrO0I~C!eEj_hM%Vf2c-4T%rb4^LyLxswKg<$G4nTE;LdH3X*{c$dDVV=vzb|K)isn}5!TE}HOZ!)3v78UxP#;5INXhL2uLn<_h635_b-X-J^G04z5z|NC0CL7acJA(*?lWFz}yK%T(pmdAZ=yW@oY01+ -b|IkkYsr1_wl-@GCJQ?;ke&2rKO{?Vvz}aDHT^uSU)yrsmpPkV%z*VxY8)c-Y+SP{MH05TiD=WW=q$c -Ouc@OWP*c%&qL(nD%^q#C}07&&7Xc`^2Kb-Iqn&G -!1p{Qt-#Q>Gr-wjv+E>g;5VN|Zv8H_Q%boiU2ZZKUpz8OTA$OdESkzxD1ZQZ|a+`_~+*S8IQL%3vSqi ->%21%YElYFMrGW!6%ET7&lP@kQB -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 -#jXH*)~VT`G17Cf7Gr&-c9#-&_LC%EFXgMmmn -%x(Yle5x;zv1dJY<@>Jve89r5zk0BRx~rt!)ICKz)ZOuxIu>^xDHH)LawMUgkHzgsuq8U;9tgh1vM~C -L%(Ll1ppq@0j)|GV&g)KKea?KgDw=@@Y^lBa%xJ@U;y@Jy+HZvFg+P8@Lv9tA!`S}F@i$`hgnaY)bD8 -<0T?d%hF3eW;`z7U0?qBPY1(PAi+`%mz&5Yqxz%_BvM;o=8r$bb;W$=fBu4iR1R(6hvW -8uARfM*s0;Dklb28lsDcfB6hy)KAb!cGrG2Y)_E+RcE;?-h5(a-x8d)PmifA?y3bU>efcQ_v*hU<3%$ -pr_`4o6T#IP@@jC_o41R*~x~5dV-rbIPI1xW#H;HG5=wb#^r-ud_#@C!0=1%9$vJ@RyaWP=#G9B+!XX -Ej$UD?SfHfi(hDU-^*M;czBMA)hZY3Q=_%y;Ia%I@}O0xA<@M~%Jy;jDNnk`sw5%KAXHgd3!O9r{}*+uHH -_YT&|(^>6p~=7~1XhpDpZkK9(T|^E|XuIQoj -YeYt|2t##CK$lN#;Mc8QZqwe)?r7ot=0c(>Vj?7f7>(vPd0m;>8jgvUh+{lN|!t&u -g4C@U_alFDVo9!vO&)k`DW(N+q^B;9YHrla)oS=`ve=B8WUoBCgS(P!bs$&*w+JdIts_j>1nubNSRx$ -kLPy6l>SGvF}cXtGH(|HE9yOVqsd%xPsFbrvDKkH0cU^BZeB(?`9*Da~_JHpYlB$Q{PlV5I8x=J4Q%+ -sbn9P&1bE_5UOFYDr#!Dk~_>o0gNl=EHBG6LS}4;wg45QYxux&iZV3)$bnDfiV$dHWBmryn8zmNuJV8 -Fd{z^=MKfSAZM{}DfZ$w!iS(=h79$Ul}cz39@kJxBL~5ZL8`&X9|wPqBHc1qtsh7MW+2H88TLu#jH*f -ogP!ZH`p#MmM-kp%QW-dh81=!vcZufB@VXZ7An@9lTdPK@w{N4Zih~hokjuQ1r>bGEG{*NDgTULcZXdpIbqkiq+kke|Z;tfCns4s?_d%mbY?+pfRV -wY7Wd*H3bzqRk)2e1$?67y%t^2ny#B$(rOT77uPFz)Had~w)A^+%YrJGq>LVu?5OEt3lS&Q5B@lNMsW -2SGI@QrC3dpFn+VuDd8z~JX|(1D-fsS}~GHUYeVf*rXgcm6haA(=yXKqtk!PjxG~WblB?=oUOt^zRbB -TJb^=P%{e%3L1~*jN%V&^z9Rpt=Nh`=+^6s{tk0z6<-T=6$n;56+`ybx|`Rhe5zAk!%X_$(LEXlNnOYIwB6@V5TQpf_{WjacXAg24tXYec -jl=hqJ}?UkvncS~Kee5~Duw5BtwC?cKESB)7)V-*fG$Y$zJ>w)H(icZaq>WrzHvqOt|X`I634m+5(;1 -vMJHjM7yf08L$@ftKLmsDC35xJ#lz6m=&qA)a5t}=rTJ=9Ds#<(@4sUU4#!<9J&epI-JqEyFxRV5c2b -CZ=1QY-O00;mWhh<3Jru{14ApijNc>n-60001RX>c!Jc4cm4Z*n -hkWpQ<7b98eraA9L>VP|D?FLiQkY-wUMFJo_RZe?S1X>V?DZ*OcaaCzlDYj4}wmEZj<2pfTeN1^HuM)`SZ4DYj~rNj@CH5ZkC@_m$@;THY;@YkshDp*J;+3 -Th;WPdw$6e?CA9H=%{P=XIXZVz2A4&O`W|s%HTt@{IyrTGLyV1*UcaC!8AMH?z;Un`>wC5BlTsec3pN -sjcDdGH^3hsFaS0_F)g(;R;z3cThir9Woo@v%T8yowznU%AIo~x+-mA319M;4=De?atyc4Gv+64~=jS -kZ-TbvU%lPGyKrrWpmrZTv%*Hh6tEz!!@0+G#IMT!SZPPW&;1TU1YW90otW^8HXf>Rb|Gd%NtLviPsF -nBhO|vX;0e>p0UU|>o7GFLnIF)ezFaGxrFp(Um_w?h(H{Q4O{Y9(8)^MHhKp*WC4K#e~@P -e)%vci1~y#kxqCQYwasn^_~~_t$1b!6Fwd_E%jP>qv#P9Rb&Z=fb;k==cWyRPA^^M+}+ICr3x~*J@q#RR`^wtN(%>kKy4F@Eo8Yd7 -_V&6>KnbCxtJ^{Bpuf<@orR{*T9%adTu7MO9@Ucz4iGPcz*wuK{G#;fxxeE%Fd+aE3)z)T^+;$EZbaC -#OFcHDN11G_|59#A#kt8lG7$$8A??4YHuD%Wgg&YgMhM8ABC;Ji`HGYsAmiz^XcG;2z?qElSvM$}h&p -KQz=l(>t{!Y|oD;N476cnA7_iH49(RInQV%{$h34%38gp0cQ1WosAypF%C3))XEkfwUbfyC>wYCo#IZ -pIrnL>hdV!Zp;NcCiN7dSck1x6@M+NciwAFD^mAMt|8-MT^61JNhbCPj=Lf_z4^NPUaQN?v3c%krFx? -YAilW}b_B&WrSyY)5CGo+%}Ksm -{9Mv#MDhUw7T^?DX_{lkZ5_=S{mgUGm?j>#|a(-xS4F@y+vR>T3D)^i6qn%31=nKdGMo+w-IORRs@#& -gZ1KAjWIejsHyF^7EJ9zr6Tin#s2x-+g-X`aj;hd-aFEAh|QarW801zfL1Y8`1vdbqoCOi7wVECVFB9 -KvIP3IfMNS*krMdXbR=<@iRM`1=G9}PLpR(>6JCtD@2->Q=iWtlyTm_= -FTg7{%zk61J90Cs!AW{PA0>U94{`RR|jbk3Ls;^rO5PG@v*7K@>#b{uztB+mL_4-X&6V_iTW6 -h*US}1)Ul#SK!zL(>yybv8R%Ec^az&dueU?AXV3*JGXMXoz0#p3tIdV*O7O=~Ab+ylKoAxuHe{Iy-=Q -$GuZCwE~A!Tz@H!aO>wcij#A~N0ZtVvtlx0 -00Vv<}|y#E@2QLDowC9Gck%N#t>0V9D_w62zo^gpsklGYt|NqAkqPZFIc{d$Y01Ln-au$wr~1u3t+H= -t>IvvY~aXiWl+Lr4YXl`O3>pGL^~(;{a$RU|o4|b-Ii`%{@Ly5g7JI~y1M6d{AD+d -w_@c|dDR&k>^xG?#95(B7N%Q_RDBFULQg*~)VDGx@dXl -)X(TjDqSP=7DEU>RuM2W=Ury>0O)!dfA&tU~i7!s|TD>zDk)}CLWw1=0t-W4#eCGqzC=thOmqs0fXpo -KU{z~W>*mo3^?bwexStu7Vzq;J -qXAOM)Vjp;0EuiRh25}Sd649JRUo)nIV5PkZQ9+4L1}lq>O7%w(tY&S=P&{hn?KQLP@X-{eW`X*OdZc*Z}ZaGX?<`Y0~is^#vH -lt*>%ohfkT-0_VeQ0ZB|>-!XYC0jCduYHZ0Yta#9e?3ob?+!1?0Y(F+@!Ua6kw -wa2KF=IBF+5;j;X2SUM*XQ58{PgB>etGfs{N1O^sUgnUvng|ygCohI%d|ot{4H(F7$t2(^g7hV9A_2g4LF7&YTERNdn@*0sm;lb1)fu5+)qL~(kK%%^FBwjU`|Si={pI=7eFF+M!-a -7sl1#q`!S~%E#FNle}%8zAo5q#ofP{S|84B-v7p5yY)TjcZCM6I!w_qj$!QO~GYDYY*ax7{{P+L3;ZC -yeP|%^+V+U!!%XGu~#;O4UfxeUR1pSp|=LtpRP9Rq*H#zEbb7aHpNwK>Mp=_a$@A{4mf{DMF%WH*ZV~ -e6q17~AR5s(a5LT017>d7^e?fP~HHm1(Q?brQw?hC(J_B3r^rAG2r=mK8IUjYI+0EfFe$XzUhJ2iZ3UOW&*Bq9=vXsGY -t;r?otJ+m#UW|Noox)~pX#n%$Xz@pg3@Km<(qt)ard!&!EM=4_*4^1<59-WDYt=PiQav)*YspNTqNQ7 -8d&_g^)MwIwG$B4tZ;foI#M* -7AKh;Dx{)T!e}o$z&NlG*}Y3)IVS`~1`l|KqnMQ--tl|sMQ+E?Gc5BF1jDTuo*kK(;e;XNdA^5vdwEe -UdP)GJLE@F$ew&d2h8SQh*W(9{mf(0*HMhK1za4s+5SZ_-fyY -}P)fOs_bG#eFt*MQJcHAt*ylWYbOKgEL+&uV93y$T@++K@H%w|&RnkNv+SFdgxw(=7i7@Ic%LbA -ZJQ+kf2J1R^7lrum>c0a#`-_#EBcA?lDQ4`(!=D&r$0mP&zT~%WhD`d>$X2n$JJp_aSf3t_s8x^wv5@ -e#}C#c?fgQDa_6>>k(Y`ZHvfA{t5)0#0o8kj=_EghUhhLK)bUAZq`0E;%gBK6rZye75ZI3)$Ea$#QW# -T24*-WXt6BXl}7_tYKe|!RJM={sTK19WC7%6i%Hs!fMN)g&^j>RNm3aXju`xaG=M8DdzTJwf)^>WF4} -{2+YM}FSWF}$AynI$v^*0w#7IFr)QWFZy9Z_iG!AQA!OZ(9m=(3k?~xUenwp4>JYk6OfS8UE4?{$5{3 -z;%6lq{Qbtoo~N1zN%*p{TNj1%%Z_VC%PlCeqPi~vZOTQZEt>^yeujm>LDehjBDKzdU?VqhzI%%oEZZ -~3R=0~Fx^-u6Id@CxJ;;8R;}uB{4GShqUBU<)SaG%KuE-6Z;G<3YYF=x0~81M>w)hwa$mRhKB1*45v^WxNTxd__lom!Bcu@#fi^%NUN+ku*s@n;Rd)MnG@cD#V8X>Js{jGop*7 -y?&7o5x)h#+V)wa_NPQacZVsszbDHkkBCCzNv^?=2Di4#DV--)%tk#Rpa3FQic!@3&NL!bo&`DyVn(6 -DjBlPsTBevB_^F{=!rkd0gO0F~`WdV+dUxIdp=d{i7$FRlQ}cp&Isz;Cbtj%Wt~!tBBY6;X&?7hb&Pg -yK(}jIkszEiqpT)fN;Y-F4gC25~(Cst+4bnn)QVz>Fx8K4O&!{?6$;E+-De|FePiing_Dv@X%2^gC=0-6+6mT4Qt>=d1%%?E0es2tA3;X%!X3yUOjvI{F~= -KfJb)IBZ}WLtS5-8qgBb_0;I}HfoVWcnFI~}WXb3GZ~kd;CmP-spOx{&d5nFUZONq^((=r(%0sr<@sF;&=~KdIPgFy~O?MZEVO#FBfUUnl~!ai;(G?j$+@AQxaf^<3<>knf5v7Y1N{daa$c$ ->m#*~RI6B<9tT1#Ofj7xYfQ9<_xtC}Ks56@N}&ldQ=!QV)1)LDPY38c;Fpf1J}|JEA}%pYrT)x^>m+4 -tJ}{}NVMG&30MOQye{9}N4aXP$1UT%CVG!0*+y$zMx{=Y4*I`l`vdHBP1ymem}^XkiGevAb- -kWnhnl4j;8e71jTATjDG$rf2NnaU3Ok?N=Zw=oGH{B;DB*#bX^2WK;)6ZHlt}4d60Qzr;WVGY_cA6B3 -3;_g(3ectBaIWc8g{&5O_2krV(({V&zOFI)+_??5=gWEPFa|(2Pq^n1sH5T&a2#0NKr6+eEie#Bc0KIKOOV`k%&U+;ZOG!sqD!i<(%*Oi-xFFz3Hy~P-=qNgT*1^WTdU$Bp8yGE -g>dc@0fhwS4D@a{}W@@o`t1iK6nrM`$pdtWyR_h<$~Irw=tp-FfsJ-jZzpf{@L0&Xp9{uQ(PVA@nd8} -h%ENw$D8-;s9;3qwz~o#oRk)P!uOOQB_Uz1OUmvESkq`T8WO8&;u3&6BL07;GJuopwX`diOH4KNoSwE -3aG5!KL6cM)ejJ8J5}X5x4-+8phh+zr`^XetM0CLajh{ict3O)ke#Ot>D5eScy(Z7Mg?_2$XqHiBle5 -YXorH<#A>7!|U7(T03BU!Yv?l-9ntL3BVf{T&P(4F+_`F~m7@92}jmeDT(dlT|BT1fi->!N0`rR2O8% -i!q0XAsAqbLv+QCfM8tGn7$*&eApl+0?z@e!NRnRzV33ZdlB`AI9AoN6;_?3CoxY)g%H6=xB1u0ojHY -O{kVURAT_B`lGkqjY6Tt}u|$iU0InvXT)O4$A}FHNxP8gQ3B33MPt>jsxa!PdO6+6T_>5fPv7tYE~vM -@oO>~Tg8d3GtU1OSzu9J9^da4Li{ws+fGbr+GOdic?ygibh<9&c(Qt>Y%E@dCGlHA%^v -Vwkma_Do!^?L=(;2I;AL!3yc~J?i+KS#nv8Ks^es+JQlZb8Xd?bJy=oV1BVI+&@5tB3wXwq!T?5AW5Bu4CIi2e -QYwPFg8&A{`_*9y?^%+|HTYr)h+W$GAz30wYP0r-i#Dd9nW}!cPkss^AKSBk%62L> -rY#3c(cB9(?k24;;%xXSV^T-HgZNIn=`e-z^>@%96WbA}#Bzn)gJc`gUNmn#yD ->);m`*P+6`+JSw2vZlSnlbc}Y=JQ$E3fu>_OjBAtzsdt81xA5WOo}FU -_q}}+k0Yn!^Hm_Z*5(K76_xFb*02u?v41-DFO}e>Q$w@Y8@;awHEJ`k5bFGvH;t7$u-gs$2t~M%M7Zx -{4&L6t9ctCdO#dmv1;hY=}lDJ>=i64}xc1H4Kvc%#N1$Mr&TtVJcZfaWR0P7nJaA7T=xeQ=Rgx;1br2 -~N+db>-!TO~>>^*r+1V(-_gj$O!X@=F3!>2`eOGu@MNu`!b{BsGt0Rf>ws$y}I8!*U-_Dr7&Du!K8bE -c_XPJ)20NNkxwHT)E&TMhq|S&1G1lZX-$pj*q%-*$m`L`zl+qXTc$xpeA;MS8d6q3N%EN!WQm1$$R2z -Qzvvdqnkt#=t{_<8O3GnP+b(kRq$!xB?zpUAbn^<{$%+JH^V -CKjlc9)r5TgKVjJnHZcvBMT8uSMVtFaGM)fhG-;$L^e=||#pTO9Io7_D!xqRiD`u?fvz@2YqcDKg~}wA -5h|6sXYx;W%6`YdAY$BTRDUSEt2AaSlTcRmOQOX4ykeF-Wi>?^AGV3rrmgJ?l52)dudZ(6L3U8WdQ5c -1pV4!93}c?5%1y%H>yE^_(wXFxfgKOE${nArlm7uG#IQ93XS*SkCLpurj>j0~4rdtz1h-24jYfEG5q| -CCKLmC$NWgB}OjF);;>3P-qiZ*zJQnPtR+EUK}ofJ%o~Gk2p${L~ma8JIo3gr&Wc)(Y^&6Ec>j~E(&R -0fx1L|sepwcS$4=5+L9y+UN3>FN8)=wVFL=3eJx3ApK2Nj?+aqV<>d~yZE~84Tld7&sUGm)P}yT>BYb -t5hlg9PHL+ade)5I$vZ(gmCaiX({nj{Bsze%sI -2-f1`$HSUDH&n@Hhqng*4CVPNRwzVFr6b) -+zJvwUQhp<+rlDOj_ARRZ*>#A7->)OL+u28bC|Jt+hTTqD>yYcwOj@;DD;zXUM{6qNZNcS5r -OQa@v;(8nEvb13;6KbOO0B*V1_sYc9$IIS<$MJXeZY6!;V*4zye7x)YeQ>?K2gF2we177AX@bYIbfV!{tNbFQD7O61_;9Oe$^oJPiECDh054mz*^EsqI^J-mDD3@Xk*jbh!6xRRZ -Lw5{-~Y({rAQN8a2ns}8C-=MT;Dp3O|QA^C>9}-52*cwGV+QDX-A`wZ;xEqt8CS`CTolk$Z0s7F8Ox^ -R;r1(`iiMZ01{ZF7rjonyx`DH4FqzS$=yLa9=+n~Op~-sr~z+tP>tebr|O>d1m`xH9Gu%7AWZKL2*fj -97c4U$u>Oo&o2mk_x+Bc=A=;eLRWM&KeCDvR -z`V!?$G(442$OAQWZ^D^EI!zHN$iBUM|x2`Ma)G48WsQ+n(y{4a6Jfp1Lz -J`7v@?#PYCPv(`}n@fy9A`|Ro7xf77Cu!}mU80-l^#ElB>3--=c=7Z_N@L=eo@Jx&&o4(I4@fL=-p2# -km|201bf$_mk_Xgb -n;GvbV{3x3=t`<)e2=s+@mF$3jAS4k!uYW=_2#DAjIagZL>OCXk9Hb -{$&f#k!7bk@M{MPiKDHIzV&!n)Q>U29#i6$&OntD_mUnCU5RgRk-m3ox=vauHWv#yd(ccbs@;L+)-B{ -BOZ(3Js>FgXcT_u)UOW#sd0=#3xr3j<@X0iCJ_H!(FLXY8MvE) -SuUt9H8EnkZ{KGAL~@?;J)flYWH_`?}eN`QN#3u?j0?&VT#?}SB>4)5y14r{q3I}XKBP#wod-`$*(eJ -MKG?=~&aG7T3=V{@wn4p-Dvr0rML9k>}(AHEvYJN5_P4Vnt#;Ih!Kxf?Vc%D*i1AAUEeK^W;|F~!i(sY>bC6M>`f>ssYN~RaI&hwR{ -B`qKJ(M^5yIPQhZGEJX@@291w<)^2jBR=(Yg3j4l5N(C97iHBJ#Lq -|31sc&!^dMrrED2VPZ^pgM7H_-{ikOP;%?$9S>LZ*nKDAz<;JUG2aAmOnV=AFGKQzc -Mx;yye;N`(7@jm*h%Y*&eu22UxS2c!DfpZ-%BZ)#hU>A2NPGKqTqBI4%7sb9h#6@x}OKbkDoLXfSYe{_U02+-y8Q|?H1>lt% -u1ualqhT>AFAN1JfT5_$ZikCc_uhcr2e>NEX*g>bRPip6X-F2yuixrpLRkDhZ4Hw*&_Ig*!}s$rg0!! -y-7%A8VSnEmi>LRkPG|aha-5@vcAJozf3>V&U6$x2;B#6!nLH(-VJgjjGMn0N9yO -17Hs9FL9Fko!nv@Cpd>_U=jMqVS;4POm0*r|Kf30w2G-X=_)94@kfWERExrf9Bv*xXwWe&BMw4JD*2D -=7new^^tuOp(8yLm=ffl(1fS5e835wTa?Gk2anxF4+%ggyU+t3pwmDb_lKOtECpUu&9>CIrSwIl*9y` -RmJje3QpcBn(U%&}n4R2@pCEAIjcA*)KSS~IcBow1GOe7uwMF9lZP`K6`be*3MTo)F{HNN(TTG|dL2+ -_Kr8dY5is=hkR)Ch?F$U%)I(LxX}3s6iKI5asM@FKJg$cgTb5$tBjphzzJ_sKR+;JZy;n15ir?1QY-O -00;mWhh<1>ayr7}1^@s+6#xJ;0001RX>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FLiQkY-wUMFJ*X -RWpH$9Z*FrgaCyC0ZEqqs5dO}uusB5_5=X1vmkM1@x^kqAlp_%&?Z=JT9l*`5y|uj|sA_+EXKe2qED8 -Biq~o${dtRQId1lN?tBgg_s<4HIC}JYZm9~s8jY)eV83t!Z2A&IZiSMj*XzY8H-`Ooe}6aCTI -oTxcrorV{Pf)sDBrTeK*E+gW;epHOeIAMqrTgjqo9_+Ke(1ct_R`&mcXrlcdEEMrBZKSW$6+7R!TFVb -;Dxrq;CZZmyELQ*wqh -k>go>@WNDZURlP*^lELKuNOi*{`xK=N_6ZF^(G$b*rD7ERV*VrZc8^kJs6J+zks*GC^BhYw+KwNTKMM -V=OElB(EewV{>Rp^CP@zH8+Dl;krDotbo2`@SNgDV@J=OB>_MDkJl~E4rU12QS-#NDaFIzG{)C_w+k|nS<3KWX(b=o$VjQE#ogD -D>5dFYzdmF6=kFrfO%qEAwmMl$fx=^=bC4(3dZcd9rTKb#+IVt_l%ugZ4%P{!-a -JHWe8(gkqtCx_~~_e5ls2u_6pJs!+k*+$iZ!7BT^y?noMV6ayT+6L`Z5x^xw|#~pqNW90wnRjYv`aHW -q?sW2@8buGXQtc7W -6J_x&E05fe&x3k%NdiAiFe( -UPe(=4~UdZ>O?wI7_BF0d;*6jlwD#)m`U?5;6V^e;`-7Moay)=7%fSaP!3lJRip0BuS;_zIs~Gj)#}Z -rBoVf9!;Jsl8EHb!hAFJS_s3)PD}yTf-Lmgb7*?D_gDTn<$a9wRpx|l%GQ8g?&x^9oHtPKeVVzHxhs3 -=oc%(h)kqhhoKU)ASY=KhNkjkeIN}AySe`gg?jRLQcIRE550ZkY0u~tyO#n`MrwAiKg@U?HnyRw+geB%UvbN8)DAg_Qlu=*KTzW^3Roeo+QW+(d2?v?G-ndrgYpf%w7RB;UtiZ3So#6yrs@hZCrE -Z_L>i*7Kx0g(WZps#4XI*K1EuFm(`oud-$oNy}(}hIJM2)!OZ%Co!yYww~IE!XPneR|#+#yHcu80d0t -{Le25_~DY;@e%yEoNQz9()l)Ojmy!RB|QOh4w`td`sicSZzq)KzAzSw4kEX<=ORjABGcisYJGorVB4I -H_EHkcPT83a;9)*E#wmfm4mO -wP+o@K*=2$|^qotjpvLS#)Ih(25l2=uVVr2M7)OuWZ?^;c@#lDRF=h*^@^YRa6x~SCR!;sr|1|n>bd+ -el{BD|^)kdKu{>tw62g3CaHHQ|+4TD2O{0|iuH3=VHIuL5m)Ns&|*Kgu@3*yelXyXn=xj!{@cj&E~bF -fG)Ma~gMs@9|O*E=^~XV{;Q|00C1u;L8f0;Fp$Nkju-CqU4FxdP$xVOD4g$$+{5hc!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D? -FLiQkY-wUMFJ@_FY-DpTaCxm*ZExE)5dQ98L3juxZ;rYq{ZP0Nu%Jt~0BcwD<-?E!GA&UK8(CCEDvdX -6zkPQkC6SVxbj9=~5ygA%?cv?gc`bG%N%BTDHA@o0ca^9Wp&KcRMzO@a&+IbWQC>ui;)QINc6`UwzG8 -AV%MmN8XnISxOtw&x-_K^VjOAq8Fe#H%l!}!qL7_0`1uN-}EeUL(O`+m|R#m}Ms<QG*4gi@5pXYXHLTo@bWk`(;bhsMG -+m*#b)y%gAPLzMejRPTn)))U)WBPoFV$G;M$yNSMyxCAzL^Bn!K*01WUUK#*}`tSF1U#~N+D53H9akg -HnU@eBZ|1T9U;Q;{*NZA6(;U_SOC1do>%5+iKhgZb6fRee>qhssbxA`xQ}9LacoBWC2_+_a`^V{uknhOby}E(?o%Eu{ -_t^aHOl(ws{M?$@?r_SR-IvsPimVCsmL-`KgLr)(AIa%(S)=s|9JjOpAIUrR87Qk>aaLrZ*n9$>3=Y{ -D$*7_&ls)ETdE#%UKX&llKRx{1B?h`_^l#M#5S3pO0Pj?` -+TFtx^2DuQyiUb>42g|`1ddtuT_#EOkJ;$hf6+rE=laoX@?WbTdkcUaB=;Q(4krx#!!+ygef`7AcF+@ -O*G6&*M4YA>62VvJb1Tc;7VB~x9sbbraMbM}ro)*yaq5opY2(jp+hYO~W>#?HEizK@SDDI6 -NFC5UFUHvbK2Z1TOs31RDX^>{yUECa3;)e1@EGC)l>HctYdWHHMiK#Aks1z|idU*O5Y}7-1QkJ)mLq- -80V_5A*>v;~{*8A`&_^WKc=RHhS{W4tSpIppSESSD|ZC?7l2q18nwQ?FR(o -qealZtt9*n$_1R(4crVpz6l-~$AGr+1p416p#K3 -3Gag9?BOmwcB*`!yb$~35+6oeUf&|o{ji(f&2cOFh7a}*It}kObl{|KZ>$DG)7wn71C~9l2;U($6}lT -?LeCWxZs=8d>ik==8v@o%ygKPXhn|5D5SPF#rGnaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1!vr -Y;0*_GcRUoY-Mn7b963nd6iX7Z{s!)z3W#DQUsO?n?vh&UxEK3mmpp64wTP?lAa{SKHa-&;pY?gJw%6rjH`0)P2xGeOv`2O -I~?mi_r8+h};@6k@%Ry?2WFj|^+>$KMilwmCuHXrjlBeWwNcL@5C(i;&hi#vb#Ar!)b6xM<6Ab(iHV*$<+UkhBd&Hu|)h3x3p&q+lDN{dTuz|D} -j6KWe5KqwF==*#fyg$7Pogy#@_MBKc-jDJL(x?w?UqtMf1nP#y|B=E)db_{O^36J4jJsIQpl-9-Xd%RXj@%Mu3E#>UNrk8Q~P#tK=SaFT4 -Y}@sdR$!rEA1&ZXNC`E@6aWAK2mly|Wk@?i0cc4J0 -090Z001-q003}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQb#iQMX<{=kaBpvHZDDRkUdB4< -EUG7Mlt{U0YEKLdDRb?#+U5GMoBun-C$SmjOdd-XVXe8^yl#oZ{(?M>^f}D>C{8ososq>sKl8V-XS!} -TOTgi(NyU$o9$y>F0S=VJf4FCs$Mrt=nvog4Hf+btQO%l9+`BTPxbRP!H%u`*A@Aw^6$9Cs*H3kMf4Ej?J{Q}f+ -!qF0&3S#hDMUnSj -;d_b*5p(nfpivZQmQx{^aAE*tUzIMSjg(b19g?)$7v{iq_rxEg5!e_YGnSUDnS2M2td7&PpgSIq&znnJzM6yM=lQR4q1A@cN&)dDE-j;2dqM{wat@k=~m#i3 -5d+K^99PSoF5d0y@XS(P=R^@7Wqf){7KoZ5jN~>=vvBgnbmUBpC(ekp%;6j4ZjxXuVWaz-rE@kS(6txEg7|*A#;A>J6hy5 -TCpFjb6Z8c#-AJl94@^8v>@+N@7BqA_oph2^ZED2Z)T3HNRs;i;Ue@InOxUAKv<(Cr=z(iuH86cQm|O -E;;VdoT&3mTJ(ww6hO_WWDtOu*tB3%rS0ilhqCid7)U~!odbJ9(gHMPXuG_pyDDeX>8Qo{^5sji(}n} -~>YGukvf0@7l-v(I5B$I%s}e%`swuKrPIrqXCDoKvNtVNMJRbWJgIif`IP(Mm@xQ4HMPqRK-V+0)u2dc>rl0O;Z -k84v9xWLN33cqm^$0TxqJK?u$lKsfH9M^-hi6(GAV^4{ii7jHYQHj^1 -$p%~eU1&e15Hk0z|8^a9LDB0W{yB6&=+fMhICs6-a6xv;Xb3#nU_mq4K=?Y?sDV+k7gaZa5pQW+>|7k -k6tPX`o*CJkI#(os8&$MGEIVVXai6vTc~z?&l?cTG@P%fvQ)v$K3%Y98vi2M{ixP})wL$=1oUU@d- -bl}yAU7@=h3nwXFPO*JsWMBt0>4-0le6Q>cQLAUV#jmGCQ(E-K(^8{;a018rgeNoM87g%?Atzw&f{xi -&=KFR$b63bb4atIh@`FyCWK2Z6>tRz;jp&UO$1_{&ov%^X#{pF7Tf$-Mh`3c`8*V&Z|A55q&l=i9rOA -He|++xRL6;^SjJbJEt3<^I@{9OJb=k-(RyABF>0p&z-~w=7RRv-k-t0}hrSLqG1kTdA=D9|Dl*SF@-o -|otUW>Mj -e{o(=FxaTd6YIUZ4F4+qr9n4D$FNIk>SJ(z&a;Jl(HCzNj`_V!gwuP*l3?i!+1CAH*64X~Xzqhv~UVS}p(FDkcgw>!PY!4ly -P=~6ho~Tr~Y!WY2Hi?dCCRjF!e(*vrAV&`{`qLR->2U&A=`1q4sT-zq)G_6PCc+vi~ -v&?N+vHl+}!DrQ+yuovf<3eaT%)sKLJL@0@y&fv7Ec@VL%jxqkDVlGBhF9n+J&h9z2k{u9%G2M=zK!^ ->*6}h2UsS#R1!%)>6imxBGF+c+sWWb@Row)pNd%!yes+k|M2mEdKw-Huj5ZndMI1o6(xS-2p|Cm+Ez& -1p{$h0((N>org`Q5NZVb6TAESQBL(dj^?+B2wF5F1ti$_Ok2SnZu)x;p7(Lk4|IA(&~Kti8p7oh!q3{ -XOvUok(n33fkcoo#(JxN@;F#GN5VA8F{eiF`=Zr(_SfRa(?efms%AdELKOzBXZqTDpS@h2f#ZFMM`d)`g_95vaxUXXhb5ruTtr9((>EGu51 -7B@abA=Hke#L_LXdVdo;TIWy4%$Z=0}2Bq3floLVM3Iy|4$@dZL|}dh_Ji%gdd4>EGCf-htMB!}y=`txM*9F4rxQPCxz_5%NP_Hfue=(?#2g7 -dWQG+b6mUP#YH?KYX~nxUu$)UZ}><$|=LqqMm#M!%l~ox!|BpZ8|#YejIzTA^6@{^c8f8$}!DU7d!-s -v!hRy>1<~MoJvztX>dVeYDI(S9Xf?bW&IL -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 -ONY*5v}1c_6rYDd*ox^-S -R)sNS?le?X}0tG&eqHVpEWtyq+=8pjWTjx#_3_@v^-25z?&m$=j*Vk!1K}xW+@O`Ec)Y173NYgc61X&RkE$u -y;N`tU-qQ^sj;O5?9R5HOnsL}s_ekMcro0>)0%cRs@;F;GgwQB`tp_p2p4ogkLnV -3-l=UYcJaL(gt9}!AfmB;IG(Zdjv$l_EORuN#&xc%$TV7yz-udtp|xgst};^wgKO=0U1g`h23MO2yvo -dkeF6)b$J74}u8b({;ClbEhrt5A(*iz?OdiWzf}7E%MUT%Ooxe1*E{5Y_3nVg=anj%BjF+R$%s8aSVP -tY_y2INvwIrD|6oL(kF4~Fg_G}$94vctcvmcKP{i;`g3d3<3KJ=Glntt*na%W)8ZihRgj|j)sf>8lO# -3zB-s@iyZ+`9k{!ZQ}EP1&0!|nIxi*L5xpQ7pVBd}d1_0 -oIJw`SL!xk4TNRxw|D%x=4taxt!Jh}1p9V0`3?-on@U;m~lZ7hnr1Z~uAO^r*V23&2(jQ{PN4Rc^KPW -kmvg&+5TbAElwGh6Cv+$1?jCPUJwr_S242rp(7%kSSC-77D9)Afn!~P7!^qE{^iv@q{kl%o%)a|5#eL!qM23rpP46Jj(-m^!<*@M=ihe{3wzD|n -Oabm2||IbpZBIw{ujrXZu`F~J7sr;o{hA#s5{eYYirmLYc9(w=mmGKBszX#y{g~cBlKKBZ$LD;5pzN?$UvIF{OK1*198bbN}b}%+$t3(KWLWR*aKJhoi} -?BbEOZuJq~Eb82yVdo{`ancYbYdUR>mIQGE294{v+nYy0TrU>DaRPy;WCO$h2dob`Xiab>rS5sVp!Nk(2`u7A(5q#vxASZLh|guMG#w{PFsU -r9s;y5kM_$ZzZ?N7hGwI&*wf!sBSrTYG7vOxNg8DUTJ(W3f@R;nchFy(rFpmcZVp-W%U;d7e7jSP4<2c>%8-+;~VR+4!di -T(M47l~J?oBykQ@?kbl$7Oc!Jc -4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FLiQkY-wUMFJo_RbaH88FJE72ZfSI1UoLQY0{~D<0|XQR000O8 -7>8v@VJexA&IkYiYaIXpIsgCwaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1!vrY;0*_GcRLrZgg^ -KVlQEEaAj_1X>MgMaCxm*-EZ4C5`WiU!E>>&T)1+##l8gaL$-B#0h$jaZueoa5NL^Zbdf}zNG0(d?ti -}-en_GyxjFRm5KGi>_?zz;?rUCy#iNNQA;&VY1CYLu-z4qk!) -{+%fq6ybsML(U>vRjdSE<5OlgGI#ya3PH}RYNJlP&8gh;x-fPLdp26=V=ADZ-ly<{t)WluxuPXSIIiZ+mf38ken0WDWC=PGDKtHSbI2 -E^Dda^oGa_i2?)VD<<>gsImHS13_LzrEw7VO@1d$Jne7pO4q4XtK{gfq)q*)CoXmCO2rH@^zf%VX$n^A9pr)4>`bG_K -Ri#ItyW3Sn=~?RlJH{Hy2=Xni&b?59hR%sR}_P5F6j=%f>6!!oYXV}hoiqYY%?g$pd1R9J0d` -&2r$!q8`!Zo*a2YsFbXzlo~+IAR+7lVZNMio<5LJ+dC!Suf$@BD%m%HM)2g3$(9!ZT~^BBVeiygl-S@ -E*}oW47QDvuK&W5elY$-S4ugGUn+a!s-^UMnpFDc|P_#y?tSJpVki%jql;Z+!P!dRWbGyB~xxP2P_d7 -ds@DZQ@1_=e{TMi6Sg5qh8;R_!1kubD@L4ZM^9#Xc4M4gqHjN?$Se7^(_p((4y8e@G)Ft=pPzCF=AOT -kg&gw-qz&wr<#>vuw6k=CrPI*0TUH$R?uOp;Ry@eFS`6djTt-vYMCZ;L&Um^igCYu4oi55EQd~Nk$l*RD~_05k9yg&8%}|-pLqVley4} -=|Y)-)H>=!M7BCq&HHE$>?KMzWMvbRRdNk`AhBUGigHy7vMzHa+*36^BF!P0YE*xJ;kV(3u6^ngP#kL9sq`U# -MkrCpED8$1~~UC`ToDAbRvzu{hra -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 -UoX$q$F9pDw0s6p1mNKlYd{2 -5i>AL?CkSB4GeXR2c32vM|j$(hBJJBf&<#2I_^~|uhKwOsHXTLWj0FSkL2Xf<6H}R7UT!8t(iWN7`pU -5#*$s`6flbe4bC$LMN5_h+1|%NVRRV)OUne0e|`P;j&h5Yqa2IOyzE*ny@5Wi?o3?xphj)!(7B+nO_= -Rd$-OAwrZw3uOEnf;POip_pKr!K3`ZyJfJc2S^^MRkHM(M0>kUa;oa^@RbuCX+H$PAey<%3z%+vSIr~ -N^{F1m5q8VAXzwxHg{bPfX4sdhVKV9Tr?;b7CA)%8B@1)s~S->tN-oAE|C9Bc=xb*iENlToBG)(DS3f -^c;{Va{!Re7%hadv2IKYImr&D1O5A-v}aZGcca^ap*KE8{cbM?1^3*&W)2Z7yk^%J>8=oqba1wfjT~F -T!Mzb34Pr?;{^)Hh6J{!Uh{3Zkm#`|7Fx&Qg*eU1k65Pem>q@kv2o50Q<{W9-t9c4FD^{}W~*{nl_Si -qfo<^(a95CF-o91`u1mTJ9vHr(hhYsTIsFD3<~B7p;tv?~k3sg;!IpgV0DE?DtMS4uxR+WP$-~ytG*i -EOfaiLpA*^jjc?Bo%`ni6M7j#AjO>X0@z^9T0G!RY1RdS4Hm2E25JTcs$)R+fR!7}Fh-KlU3UNt8_IT -0M119Z=U+XgB$u#6w?kcQz~6xr;i=_1+C&P!J3a!#ko$+jli!{o6_qGsS7PW>*~7Ohyn%?_ct)IiVfsU_esn=GlBV -?Ej8}Vp0nWcn+#Z*|G}ZEbvE`5VxTlr5d>C+UBa+;Upq;wADpQ=qy7AUP)h>@6aWAK2mly|Wk`=*pnO -mO003VP|D?FJE72Zf -SI1UoLQYWsE@zfG`XM?|DUTRS;^3%@6aWAK2mly|Wk^QBrf2X9008GA002G!003}la4%nWWo~3| -axZdaadl;LbaO9oVPk7yXJvCQb#iQMX<{=kaA9L>VP|D?FK=>WWpZU?Uu0=xbS`jtwOVa&+c*;bo?k& -UC~PkjC+Xd`*xG>4-kr)F{CP3|YXrZ(#a}P+*DJ>JgcYaaG(S6M?_ixUju -<8VJr`l=)WZh-r}uZ -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 -dJXTr`tIzHK-(cZ^BT>{JPHvmnU1nL10#ukAk -T)(CRj|exbC+IpiUBBKx?e1}cA3g8vcnYCN~FjHWQ(tnCSQ;>n$ns)OqU^LZ-H!W`m=KWcVWiz1qNx; -9-`BlCcn+>jXF?EpX(XTlcMVs$-8}um-d(WMpDHU7DzP)XcJyWQlB6q1-;;`6hQI1=?ba0`AA3dW&QUwaQQ#^=~3+D)T%`6r5vS -T8=zEYj6N1#h2&mgW-OM}fbaNOVSPSn>}irRK4bi~&pQ?RftTBc>4E9#XrFEq^t3rq5RHw`dk5tYRht -}!L69KInq?mjEd1^ayV# -2%1DeMxHhmZXoW<5&7T%eCEy}6zfVCiFvdk?yJJd&UyvhDltPIHVpjlc)9>--+lME#a4CR@KdNnY~N_JgK -B~(_V1%oaUlzG9tQ_yl*$aOLhQikfqB88*2LCXFL@g -3dEXgh$UFv^bH1u3f>&K{U2(&+Gv9xv!SZ^T~GqulfLgvz&Ym3*Elr$O;f=i%Ze -UW64FI1lhQ{}zW0yBt1dK3{ACR09sB&IV2P|6IRS@;#kL=AcDWK&Lx}F<+aPxe6xj|YLI&Afhy-R8N- -^@d-p^99A&@D}fHGCT*kRyON@16zyRxPvOvZs}cW&NeMn8bFE2Y2WE%%jU?7%12v3a -RrkM?`Td?w@pQA7|H4DwL1cQZy>gK=L3u1N7|qruz&r#-TDtuO9KQH0000802qg5ND#1S<=p@P0L%dZ -08Ib@0B~t=FJE?LZe(wAFLGsZb!BsOb1!gVV{2h&Wpgiea%^mAVlyvrVPk7yXJvCQb8~E8ZDDj{XkTb -=b98QDZDlWCUukY>bYEXCaCwc6!Ait15Qgu4iXZk+#nOY`1TV@Syr^#wvdPp2lT1h_yY}tvrYckrHpj -`#_kEJ*`v%L~;cb?YBkua!n>raX2TYTP3yHJfiL$uC87;KWnRADr#f)m?Numza(5Im!c&_VpWkt)6WA -!|0^HG63Kt{q)q7k>4t574&$sw>Uo_??D*Wvqc>X$0Dm0uirru`SX_Pv&jBSp)ZEDWc4ThXgUD+9Wo>0{bYXO9Z*DGdd97FdZxcrl{oQ}X$Wi1w<6H=7DYcYJQGg -bSCJ_dT3e;NP?ZsQpyQkfCjQiL3&F-CjjssL}gG8MDn2$Ga-j4hI{_DA4idJ)}Y3Y={p~>WB*6;Uwy#u;5UXJPYTsbOLB?-Tmx{#JUJY7$oQ>AjLo -h0GHQf>yX8C -N@p}U&A!VXW{(EFUS0|3=t5erN|g&QpIK{c@>W#K_%R*#;E`$^>-BntENNP3$Jk5*R7s&n)WS6ae4nQ -)RTa6gg*!WGZUc^A`7pyH^4!>hKY2s1o?p=8lSki=$jONEV}y3v3%8myy)l)`l=NlDl5;z@WzN?Qnp; -QlR^zG(*gK^9{$uz{m86ZQLdSUc$4bAnnx2cw$>{HZu7Q^5WziLtr6^oQ|}+fD7zNp#>x0&jBSG{w%Y4iZkF07gJEM9Np6q*v|Ea8-Usx;x -uv9olOKM3@^DPz)~JFCsX=2$rbH#|EqFw;H3BLlrxyk++FI~)p~+~u@kcd+F0Hs(pdUcdb8<_2E7xpK -Ixl9Ga&uX9OwK -3KT5n(I68yQGDK8gvk~Jq;!SYH0MVkC__2%VMy1aT#!sAdKfDAoLf@&*Sx)|VsC9G5^ATU_XRX*>vRq -hlxp9?E;k5fpwwgB0|OeJQrB7>7Ql7jCrKaT>x!*K_=>2>LMAu|0DbOplKLcb)w2ZQ?%Sl`FS$xE%q3Jq~TtX5{y<)W5 -J3uoFw>|__GE2hc{>=}h}Z%V2+rNldDAvt(lvzv@otJUzIdd$$KmB=NO_QP-h2V8529Q3SA}&a$ -qxWN{$ajfTk4jw*zErHRtU?Xgkl@i&6v3$0_EfNEopI|pL`$9FzpSs8rD2HBrR>4dGMap`x2j>9j0zP -x(%?Baa#EbVm^0|&GC@V3lMn|Jxn>Y#r`Gq -$ei-Bz<-xJ@n7=iF_~q>RR`XssaWlb5zUsKUR-mLEYDSOo8=P| -gRFgwt?MA7dsph2_u&yJh=(?zswL2*D~(o!A%{|PpzT=K!Pc=io>8)$Num*P&bFi9;hEWvNl8EI5&Ub -@eM$PUddFyx2*<)O=)x -O+2C`R~pbGrw}PZ$P(oGVNhaRAtfY-?(<#90h4OVBaf+wYVv&Jm&V`yu_?N -`9rH?a$XMTS=X?CsK@*CwCiQZ_ets;n1O_{_fOO80qw&dB;hrFg4)GIdr=R4=LGxpc!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FLiQkY-w -UMFLiWjY%gD5X>MtBUtcb8d2LcnPs1<_z3*2<;xLfV{s9Msgg`P%(LrRf=Z(9#Axgc6N`@pskQ)iV#n|;H+Bhp=?Q}A|mZH+3m`NuPEN0 -s8{^a`!jxdETDLQ9f1`=R;XRSL-y?Y6cjp9dq60o8jQ)3j$IDHR~TXxB5`EvL8#ngC~}wlsOyjhU0Ny -!X6zNBIOczjVKHx-Rr!?DJ|alM!0ocy4iy@bDsuFm;am>o1rv&~J^^2+PD$X`%P0|XQR00 -0O87>8v@*v|{0I0XOzGz|a%H~;_uaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1!vrY;0*_GcR>?X ->2cJZ*Fd7V{~b6ZZ2?njaE@l<2Vq0@2?oaLzAi-p}mKbD)GSWl{<7SprtFFgizupPV2+9Bin)Pzuy_# -Nt#ktR|(q0<8NlZnfdJ6=pE#F-MZHBJO{CBv~j@JR?F7$JUmb0Ypcr_?k3Lc7ZbowO}j0ZymZ~pMoT$ -|hx^;xo4X1BQS!#YjbBpev9E`rIV;x!1Hms%-Y5L)Gx(M`jvgkGiI!$VBrlWlk@YEgQ)v$ -He*{f#5(%EHRD97GM6H4JbF4iV9lVz;`L6|B)lYRju^;z1S-Gi>Mg4RkC@$*f%zTjv@n*4f{y)x(z_x -d6TX4}V64JMH)auJr-qAjJzGSeRpI7|ol&5-|D3_7;qf9g4!!Q54{`2b0|SJUS@YV(fC1m*M5UltOK= -giKkCpDQQ#facKJY(xx9`~Q)@i@skOjmCjl@Q^%Fe$R7wihmc`Mf!B{-0z -6v5{5nFeqK(&4QZXjiW=mV8yh=!&7H#;#)qM)+?F9~+xYPmF3{9qd5MlB6tc+--{2H-laT*TNx~v^NK -z|32mYFZKQ?o;O -5F$q4jL6mZT1vCIe6H+Et-AKeh2GtR+y;}1KY?jvj@j5Q6?PE;Hs(+#c8C@f)yLZNVCa-RyaOIfX;P8 -er=I?g(|UIQO1Wf5>{1)TZ=O-c3ijaGKQ4@b$kEE)ouRg^7`ug?J8g0d|lpuU(H9k4j-#qQ}R5bUDBw -`VH|>g8F|NnjzdHl%;L70SGGtXu@L~q`h@#lxe{EJyr(q-I0=_9`25MW4JuAiBwKCWJf0rLrA3kc+8@ -9J%BEK)Tnkw+=>cYutr>W|<<#6>4{a2@xK15^04x+0wG2bM=Ged-P|5fXvB{0@8Vr5kkPI9+!ot$9Nb -DUF;DE7_dd(zYX;~{>?-ir)fFU((6O^L`k+mpLJEL_pE`kzS6kBX%?{_w?X7EknJJ_|@fq3XJ2(;=N0 -f(cO2~4OGoq2nqjQ26c9c+noem9y(A4WC~6@tQCs(UBQT9}93ncX(3w!RK41wYwwsOY@&3y -{`Qz%_^6Kk>Q&tB9w{LKa8lxSGT*(x2gUyC(4E>_3;W`oy#y%AKyp#QC6g`Kph;T`;Gbl`NL|uL(v@L+mcI`=+;NB)f -6qA`w!h{i>B+^e|GK#%PbU!#6F98698AOGVc5yp!QjMXQ9KloQ10@6aWAK2mly|Wk}4yygu3j002-3001=r003}la4%nWWo~3 -|axZdaadl;LbaO9oVPk7yXJvCQb#iQMX<{=kb#!TLFLGsZb!BsOE^v9JR$WiqFcf{yuej<@2pn%E?G+ose>Zm36MXSM?r#DB+jQs;vfrmZh+>~qgO_cJX7uOLZ^Ml}MH1ZY)rp@5{4myN=tef -A0iONqpz!wn=oIz*Q79KH57ifWSGkZY8Yr1uWxd7l=Gv+q~Q*~Q}9=ktp%a18$S1FeG`i;^hxJ)HWEdmT{6`kcrg8F%`{6$qgI_sE%^O9d2yUmNzxLN -jAX0U=RCG-v)RmkU#@gGS)(KrT!40of+(#71paAID(Iv~o`uIX5u}1Xj@W5CFJQU65)CewI<7pI;Afm -M%oOD;wkDx9@jK2jDIqB2C6`X^#0gjJ|a7lt5rDQ0g1=pjMVigcb{H-oPDUIxN{_D^2f=XZ -2dGI13w5mNfmae-ItbMjrc`4|2v!Z6eVil$L8eF;by6k@Aj&_iU9n+AIx1(;6LrwFkK)<$k1PVA8zgq@n{;JM%$oc)w}Gmy`aVJ!PIwDQYIB)8BT=+ro8ibw7E> ->-2s+w*qbSz5KJ&;d+Il;2tWFB=Xm!naPGH^`QM9}^1mWw$2REmIN -SlP0=EZR5`p@k1KU`5&rnMP1QY-O00;mWhh<39@YeyN0{{Sb2mk;!0001RX>c!Jc4cm4Z*nhkWpQ<7b -98eraA9L>VP|D?FLiQkY-wUMFLiWjY%g+Ub8v5Nb7d}Yd6iX7Z{s!;y!%%?BnMl7BP@`cfS?GrF0zMh -gCZ?@Q)ubQ;)W)*BxT1a`rkXGC|kC(1?r1Tk@G(0%}|XsTPn+@_r2w^B)RR3^(5BLsNQoqtY=L)mgk+ -Q-o%Do?&N#EH9K}Ap!L2hDBwg8rP{wh+Fza -twF(dqLZf@f9bIaA6qkYT1WlMrKa>tq)srXLGHzq*1@(4pijC>YxMJKG-hTS1v_`S4z4fKYpkRv~)je -op7oPf7O8MKpvPzIT%k(Ctc6zwiW+lxbfgjoj5IwZ=6+TzZ@4Ly2q@)@pX%m^cZnPDC5^lrZp+dz1g^|&ys};QqL!$-fo1C6rUY>tv*I|mBeb`mgg$jN(n*U#CR!GP6 -r%?THW^wa}7Hh>}7&UvgTeNeW`H&?|_a;laK`^$yY@@EqZV=XDSh@=lJ;t*W6)8pOB(-A4v}S0^^;N~ -rHN8>?3IT(d0(|xEt*C%!U722^J}}0ia7R(_VIr1YuRNqdsg^NA669|hQTN6|%wYKW;9ETI&()d`MRJ -P^eC*iDCW)%>hmKFDUX$(eFsZL79bSDMBSwxL^;Y4;{lt;^wG~e@`f@5iH7G1hgRbifgWSSS7|ULQ%S -K2=4uaDjO+uo3j?*ToBR6|%5b#avI`Jd6VaoX!$k0|ms5P(q%_im+PKG(vHS`Q!q0378sZo&xLWeMzu0((6uw5){}fF4Z@cXQU4;|b&bSiOm6%+l9?OX<&1X-k -<2tD?Pi{=b)$?vts776;0p3Cz94`-|F^l`B11}eRYW?zgiKKxKDA-(jW7)<%SXBS;5XavIYZg9Myr`6 --ncj?r?#govrf^h=;doQD38+z=zm4-C=+_1QMbuqDKTvJggh`%_q=XjC6o)vvdzkK=Y>#Cs7kU30K8{ -~znoY`_~_HY-*)Z-HyZ>Hdk&dQzeJc^Y{IH@)DPchu^AHy44&C~WczKLCijU_DVvmdDhU32XE^70=OJ -<$E^>UG`&W*1r5o(F>Gvws0lO9KQH0000802qg5NFCO7s$>iR0R1Ka05bpp0B~t=FJE?LZe(wAFLGsZ -b!BsOb1!gVV{2h&Wpgiea%^mAVlyvwbZKlaa%FUKc`k5ywOVbD+r|<8e!pU2!w`AZ(K@?9TOq1@w&nO -x+h?2=q(G2TD{7@#_4x7VUpNAK2qC2 -N_k9;c}3sru5a&iK!vYBN#*^2rNTnZJXX~}mWbqs5=f>#wIh9bH88 -90uobku_f5AScKezg@}gjw61*0Svr-()c1;x?*Eg)$ui^2Ued0wU -sxhl1QLAqR9K%bt60G7IQ5=DGQ;D@X4GHBSomsLLo4f=nyn=(^2XBg+ZKQ%$tc%|50s57&JMTeUlV3nVQQu!LV23!L9@Ha{rha!Ic`C|*rOv7?MiQ{3Y^NOzuz;zcEv%ioU+B4{`u+pe@Z0S5=g_j_Of=B -&X5NI53UCX1pQs98t%D;(2R}(>+&w2m2u`$eI^Z2f+e=va;E&gko~z4z4BRMIjFfTkwzYdk@wo)}qV= -shUYRU4fT1WnCpLq8|jF0BFCHC4i0BO6*_fapJa|212@ef8t6DtNVy --BZ=!|U@Vr3gQ5TzBfj`i`p&iEl@Q2YT9Sgw^BFAz``buS)I@dNE`YJT>pjF~)d0;zU9_Ns6GzR(i}WZUh(-8kt$9tp@A|u+kQ0{T$#1m`N6Wdnao|UV$}?9YJlL2cTJ14QS>D!d)q0m&!4U1 -8Ll>cOj|0k{Q^%f6~{ZjdrW;;kXxlxG-i8V1@ZHz=akXAbJ=Xd=M&w5#Q881rQy0h>-yYY!rWbQAaP| -@gv{^u2F$upNY)|H1`{9?H8rj<}`qSeMBfgOb4Cs680wF<*k49yh3kr#JUc0;g+DqaQ1q!c;CiZ%BP% -FHLn|t25Z5dPR_^h^#s43;@4l8Y{S6Q$zOjTME(d@1pU+Aov3f*ItAOWMUht?)OaE=(?Bv%7-`lT550 -kbajekvd5s=Z-N>d`4|(bHqfMw|TqsK_HH^_}T9xrUv`-AOU{U035?tBQ$;&kqJ>a%r7SRsK<&f2^Ia -XRZWVcXgF_KY$h!qonjeY2d(IQl&h!c=guqo73YPzI^mb{$5y7>OhB7HkwyuNyw{_y&8F@JOUVR0XX+ -9Fc0z^nt|1%-P6k&yE&r-vME2J89-1j#bspQ{o`G@G$P{x*e#BQQhB%_iOOtd`1W%{*cH3Hi$&ZD=Lx -gAk=HGa-+e?61>vRS2<1e*IzuKX)O)&+L>%PuRa%bk}BRO5iq6e`aUw+?GM476IyCW8&P9E<@f??n!c -vAOLsMO;cvmWkT#MJ=PpG%$PsI2B>-`$rJkiGkhmW@{^O%aDu5?lPCoScPK#$S#G_Q4(cjHD|vqL;-6 -QqUZrm@{jevROju*E#P*v4faA9^pdSF#y2g -J0tLH0(KWOG4;>sOc*>vA2cp5ER9S->W-O^X)eKBs~56k4YLLXjit=toC;^m=~r63bLmt-k-B{(CupG -hfW{>gxUC^6K3Oyj)ygyqJ%EGKTVSisIzEX6Nw5Y^d4slmZ8zKbhz~pb_XjF$<(AD4^JkwI$BZCu3W8 -%+QBSlVUGT1f`#Wt<$F)I%oG`Fz$tj`$&csKLhUi@qD2gU@ny_O3~|7XZP78p8B3tY!dBkGc9WP$jA& -2%~klAiisIv(bCK}L3*ULqD={pv3I6{P;SGFO~MCVv0w%5Kk0Jf9{18WE$AW(3wyVKNwmH=+}Twh?Cj -nOH*~_$tfQ?C;{yWr?uA>rDuo@rTkIiQT)n)SGHBLW0@(l#K7wz8%k%ZK*4j&PFou45`tcCATA^rzq} -O>?M}bbXOSGmF+NX6B-+qj{IGgc&CeU6;spmI?>InDr9B5Ga;hv5&4d`(EWt*H0Yckx`bHqViwtM1^D -iS@Si9k#K5CuasmVl(iI66Jmt4$F62Q}szGN*GKO+k>WqpYZ0r|+pm2M&{+C<1wQfzzkw0M3D{b#<1> --JaL^DlhW-=q4f3lz7-P8`%UETNphPS%p4{(j0HDR% -aE_YYDab3N+OeoV18~ZE764&;X`U3hQY@p~Yyb(DbIdg!GB|iW -rVr-$L3QRK%nuZ#mY(j@e*zrQ-4QltshG=*qEk#4a!Oa<2>+ho{9Yc2q460rr6^T)#wgGuMjgkrfn!; -ueY{KriQoJ>uS?U380WEM>{wsGv736&0XblosdR4h#(9Lvc(76=4Y*6nh2{`zo`GK}nM#CAH-)R#X}w -v&RE2&8xH>)@Y5GWCPb7Fzs*=YxaW}L5l~CuYxwCYG_EqYk#V;hJGEx01oVO8oc#J4>Xd1Cf_tpW`ON -xA;Tyc1My-9a5^4(Wzdlmv)ZqdkVKIg_|(931xHCMv?e%RQFRVNxbCkV_UXY>7nPORg29<_6PjOMf0d -X~@7+fD0wnf?&P_U9Q?NN2skMc=Iu;v(4hol*Z_AJUDG3q6?&lecp3@+~wf>KFGwhPSH{~CSHocM!T} -afT!!phJwuncmd8un%bLSKkI5$9aBA220xFy3XO%;m -{*7e^;di!E#x)YYsFEb@}5K9AVGhJAt3fGV6e$@OVue`63 -Vky41F)LG0Pxi4^JQG7@&$VrYhhL#N?t~q1kq{ynw3;s7vN)w#qG_KsF>1RtKcyz55UV!?%9uhYQ~RcuD0c9H<`&ctwVm?p!(wP}jNf4M -N#LLyWM{8G=zaD=mwAZ$9xFSQ&2Zx7i^@BI^WJou`VGR2u5jUdysFA3qNhgE(HVA6F&r8upOjp -YSq&IBLp|r970Qp -fK0gLlKhL8>$jCf?Xw-O5J3FtX?7VFn`C@c&f5Y&sCzQ>MWc%Z)`;{;xX7D#I$#?U2^XtnO>HP -Zo>bj5Ykk&NI1MV_-z=!wq7niT>35gygM7_=U@k*^(=QJv5*KLjRzxb(^wUEJUxAi}b0^r#xeQ#*#B100(^wax_M= -nvJE*ef$s_hd0UqR}0WaqOQzeU7vu?%Le=xt+h?`PmBYk9sCCBJJF{%=Ot*(p`|UKF6c@i@6aWAK2mly|Wk^P -ig%C{-004B*<;!iQVk -BmIdV0E_e!7Q6maf=jvMBN*6O##(t96>?jL%dW7rB_2=azjfvMfp6!-i*xOdgecUaol5YAs0MOeS1KQ -aW)<@hO&zZNQ4eel+8jTrFccbHi5iZvv*4{GI;)**D)>abYMvMPi-HG*NEsc>H0MWoZ_$t3-(i+TX=I -U!>XUC!<%u#y3~jQYn14uUf4ZrVZ017oT!=&Ti5~v@QqZ2}a`aJ&%=WMVa8(_*^V_5$BVrKDu?xuK8N -Ad?{EglE-|>(goveE+2);S)StaI>n;1Sm^DsMUh0LIa_DxyojI%CQD^!(DIk>Ki&){*MmDO@>`4HU+= -81jiDdDe%m)j(NEug-M7XGTA#5Y=*dV)MXIjW9H(d`Pi8!NB2#sEz-HaPo_%z5r2h`hP?m2}tB9g~h+ -hgGyM4)oX}LVXzT`@TEj{%CJ9kr71@=4>G&SF@1ygx;I@{(#g?i|{fLGzj9VLg5%-8MtHznss=Wosf#1S+}c4;LKSZu#6P`Rjxav0M9bM#Zc_Le8PBR1W)Ym=PYLb -W|>`z)Gb#$XK!KOM%zN2N0IY9&pPDw0c+R4ZwKWHM< -d309kq$qcMXMFL)eNfU(U|M!+}a9AH);h~ji(rp%?{gx)tFKYU=k04yc2t#*NcU0-~|t_MS#%h(dO!I1;bAhoy1N|RkKuS7?UHS>!yD`ZyXse;+*_b}zxw3fzB~JyeQRD_Uj2C4ZyR~;Q -GY=j?YqDCk5$$DB0K|1V7r;%tJd64j~PbM8D;zdA-K2M`Gp4cf~+R-{=Q0T@$+1=r_!N=^QDiMl3^SB^%qT} -G?ZLw#<{Y9dsh@K|PROJa@iIU;$jl;sAWRn%n5rc5fVVNx&gz`xwU~5vL(1kvv)j#LIEz4A5kY=(3jsO+Z^4T7W5y8&VDeV -}0WoLccLA^nKtueKQ!2v7k#t!iU{THS9rx!kvO~BpsQZ$C`xdUBhDYq|X*iZ=QhgcnO)lojwvayTTe> -}9Ini|w;te!AZ{yEg#*`pK@CUp@x_(B6R1J1&7g>z*u4e!Xgm)nyktlIAL}mFJ$hXcUOc!r;K3(xGT$ -@sMgDeUO1ht+DQHh8Q%;2CF&?sc@8#o(Tq*0n9P*%ebSUN|hpQn-166(L#O>!+YZs($Py77hFa_?huY@@QYV@Cr5x*}k%r+&D=x#i -2`=;1M}OW0lfyvr3Rwuhd$SKUrpT*>kPRLy_1urcfPM9qIfMGS2qe;1m;d(9tX{2SihA%PGVlWaAu@z -Xl6T1B0rTGMR`rzc6`AZ&A}0Njrrs8&aY43>B|wS()uJA1?g#IjVy=w -A%PYFy`xds5h_fmX9)hpp!2>OKD2vmb)uw$m6+YDHc#+psLJsK|R$vgL-LLGvU=(PK7ROIb$2ud%qjy -X76VB6ltx$YqNmehl&VMCaW@BO|^h+@A}6JUnhMCWFC-GzGYt+_$lHweri6Rsr -l8Hp$LuFzGK@$fL|Uf{Ljv@u4q0z|Xa8WEG=mdR!)be_VRhZ>g}bJkm_t0TI&%JEp_6SF)uCRtKHPq_ -KXya&zGH`4n>4mJI-ZeAp-+jBwYKi!M=fOQu<1 -EyDl0tq0;zSOiIw}z-OTdFWHX^!h18)L>dCRSW#WA8-ocxXEG|=YJsgpt@~3Sg_uLC<(E_@7NKN~$>)W*`ST5t}tT<5V*w+OWaPEt}qt{`K+desnQ~OqC-K(^^xlZuwQIvdr6{Awp8KkWGo+O -yLVzwTX?eJ8;{HDYb9SMvVQ9OS_F!M_}kNxQKri{u$IelbVNHAE1@$G~6P6RYC_U2AGW -SL5!7oQQh;K{)ACYfI@Q9bQw#Q}a*_XInE+yE ->9gq8Iiu&RRoLj;BB6k+^Rm%Z*6>gc#h$GrHxjPs8eKLA(!ZU+w|K2bCjz;i>PM~JQa&z;pp?t#cJ(a -Hm!&Li7IWC-BGe(*Nr%U=ZSgPI?OG&MW7>kFMsUmEt2X%4Qs`WSz2J*NW=0v0Sui*rN?>(V6()pe{5l0a0P>_VC<^^h0x)*=-#>4 -9(xV8Omtm_wIqdS*Q-MYf{CV!oYH7Z@dJ!o5^RBJlFta>l>9Rg)55)&bAx=Cu77yyH#xR_H=E&M`{9E -HcZ$P$cu7M?Jt6_9S6mN$0N1md2(UbqKwbj;#}A!9pSN4IFo+XIh>?L59l%UmzbPHF1ZHcxC|fgYI)^ -!IiLuP=|%HrpYA`fr^H+Iu{6yIIq-ww$F}m1K>4W&OHKBk^uaUa(mLatiuo4(sdAiB2^>z1*P|brova -H=!RV=*wJpn-S=>g=-6x=k7|_DmCxY7rU!U{(x}hWJMPOeSKxwpH@j@>Uv;A788PK-40KmfuK-=UJy+ -wg`uo8Y;RuQdou-mCCv`JPMX7jjj()`b{R|CcW^|;Fb@;HrI_jpsAAcG9D7)P{@S}{kvrU|asppVcjv -U#F~+5Kh2g+I1x5UFg)}PHG0_8(2iio@r6{R3C_CFaSZ^zKG92jZutm%t2?zD|%?+8?f2l}Qd4OT_ja -|21=hq2)|4!xy|nY-w!2YfJZ{__VY|(fs<-PunvIp!@-U0a1s+{Sr{BL!yj -y&fNbjAbb?$7EKcD?WC)zOf*?e)w6#oog=ZqodHS|oF`tSJjn*XS_CklV5T!V_RPG5zd~+?dGvGmptR -iUgjf!$)Td10VELN8%BgoE5p)-K~}WM|Rr_dm1HYVw)!O+IDeRA~Y+VpPMDa(ar7X=Hb=*T+!V(T;%~ -aIqkV)xO+vue>v`C*k6Dh+MHumnunVbb52OS+xTz`@8{Fq{I~OL{rSLkWqXjY%ZG=%v97wP>?5i<6G# -Vy)`9*_51k_=ht9Y#MZ*oHfvPLqzDnkngLHAQxkwzFq~Ce%-ggp0>JEpy=nH*O8eFRj%zB|iM3o#3#W -|=>nh_-GH9P?xAo_h_BTiotm=cvPJLwmI-i4(_50001RX>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FLiQk -Y-wUMFLiWjY%g?aZDntDbS`jt)mm+n+qMz@u3v$<8_!8I3hx@%P0Qvwac#%Vj1zn6bNW$&NJv6W5efj -FtbXWk@9yG-fJmLsX*<*27fT|rSnNLg>ow$8PAwE@NZ>4HY*nQ^?eQ!aNS6VAQfwP}8BU&q4(Xe~ob -mDXBjw=gWKvt(4xbV}-;-xpuEmNz%i^@)ClgR|^#i~wgIBtOgr?Yax;P2w%g8u!huv&_HK|=jPI=KLI -OT*S(Tj6~eeBPm1YKA(=mUXR!mBPR^Hbo{=3-Dy?q_{Idk*eXw1Zzy4hP^J~0jpHImYYs(sh4 -r<|LxamVfNr@0qb#Fp~Wv9*kgM2`qkaloL%9M<@L4r#CQ8f6qVXtU(K9uZ#CNs{gvOrriZPpwoKg%tz -|6?c_Y0Ue#g7b(#!pt^XI`Nx4|I4xtYz**jXCBY8>W_u;^&Uo5m@_HQxy$B+M(P5UeLMu?Ec#M+`u8IePFjJ0C7w*~v5#owbO2t*7&B!HE&TL5&}5lo2+a(5rbwdjdq&L{v-!2$Xo*o0b{Ef5u -`841VVhwp((MP2kh^%O%sN5A<;r9JM2H!>PbK-kRLx>4McTDUaxhrdp{HTz^`@-Jg4;Lx^kbd*Rm1Uzq@(5`fdH}4^O{&_WSEMa&;Z0TsF_1KKs*hQ -ABZQU3VJeEd59?mbjV%eTzepUB8b7` -T-^IJ^Uec)O=C91r*meM@PFvk%z5OGhdoymz{pml3=IkH$kx2FN;}Ty>ooJOm9 -Os37MAeA=|3y>K=hxx!JN8?>;cF8*n0hH3z*J($m2Mkv4*X~` -wy3y)gf7=HaWG@Sk~_4YaDu_58lpq4E%FwSmTGHIo)5A=80hPpu)u{Z8B)s)1taEkI8=22s?>nA((;e -J)eN2qmfy)1`W{NM!LliU*6gS{%{B^_O1G**Kf!Gvo`ZP4Ml$4%KB6lRSie;bpd%|1=0wa;d1{7;MUe -X&v5Nz@6@d8yly^*;oW~5rLE?2fx^D*P!)2MaJFf7DrF*~#{kX}B-2e<~i)jBz+XaQ;xrS`wsT`U~q{ -_u&YDBZ1J3RZ6GZdhqTk=I{_&O^SZ#3&-5sHFa{~h#_HFRmA&@tgV$nh_UM%Lh -4d;nH=E)6x_wgNdh>*j#s_yk1+Pi@$By`Lf9+PN~edLR+s6M(J!29~wLNu;Aqzl7HViHfjq#=-{;+k&5nDwFN~sfmb4O_}j%dVw`7(by4LP2j8m_}>_4LQP*7l+H))*dWy<5MVX@2qa>#%=7 -AOBoYwaC6$7#YuL~DGmRxmBoSchMIXz@5@&caYePx7|)?S$WenpgsDcW&aRb6{(}*XA -tBT!~PJ3WhU5z5*%NQM*OK1DxE;Z_`}G~(Gwi!^u(x-`7*lwlvef8<|aODdIx4BL(UVU&Q8ujqbHB27 -k3%do){YTJOPBSFgaSb>oCy?bi_p_YVdaRydvbezbL{R!z2`&EUy`u5HWjE#El%dkkUH{-A3;6}~ -PU`ERK7#2pN|WMYE7WX=xxSI+DU2Q^388i~cKNWxdn-Dtg#6?SQug$J&{sobj?yIdNDBu~;>R!rIpIc -NUSK1LQgMg_H)^k-o)sHj9dqhSNODMvCj(b#V$f}FnqrU*!*Z36ID9gg&gOpDQr%Byp -Yt>DJ}aYrX8NFIP_x;m7lFlzK1gE-j~hvK4+QxFW6{1EUtf6e&4x|MXC?;C!muN5M0qh+lc2fr^;;|&UhNJdz%$!ZP -qLm-K%CEBdCHot89qpCHz#;KPEySMA>02M}+XCJg<c`F$!gJ=v$#J}ZXBsyykC02ITbJN -p8ybIlvEcDooWo2&$w_@jP)drtb1dk}$Uy~&D9g&$F|@tM1({!{o$+sg>Q1}vCDKfocBO81wU3`?IwwR0dMZbdyKKEu+iL1P@xmOo?ly05>G1jb5;fu4PKa+;tL{@hHN;^K3CLj -JPo6aXW8df#nC{BcqHS2$xXd>we21`DF$dvu+VZRKA>(Mtx!O3ZTQGCOTK7O$_o27<8!kK$A5T3vfPaQmgJ3OexUbHoiKK -*PrPV=%69*q*)@ZSSY-enb`xj(r_4DwYvQ-*qruNrB#_<|5>Z=lF>`On7?<}!p^?`)dxj)lh0X;_at> -OUDQU&i}juF>q1VLTY`C_Kw!;==zR(YhAG)of=uf0_dz@6aWAK2mly|Wk_e4Yc>xE008$E001!n003}la4%nWWo~3|axZdaadl;LbaO9oVPk -7yXJvCQb#iQMX<{=kb#!TLFLiQkE^v9JSZ$BnHWL2sUqP%9NJboa(*Q-z=w>%flU{+K*vlp8hsDB6OO -#E75>=Agjqlgr%#e~Ozr-ynVAm2g@0@vNsM6?)tyX30S|e5~CaXpp$N1W6)jF~A&yy0#a;=oeoz%7M= -xSbx!nKVO6Hk+6;#)475z$ATb6mLP#)|jGXfv5iTBBCnIb+!syGv}o6_rTlEa9!&;_p^lhrcL+ez{-& -vlV8CH>Kg5O4Kg72Wh$D*0L`~rGrIj0?$C%YnsiL69(7C#RdKT!X3BHv^o0DN^O`CjS&`v%6h|i&Hnx -Q^DX=G>0`#eSWz%;83!65uh}D4EisX(W!cvG@}WTwSD^4A8)>piJ9IRiP3XB0B?P?|Ppeg$D?4Z2|Eu -41E#?eE5N=- --BD*tQWSg?P^y_%q9nIOqNHE_rXfBZoemxX87^s}RbY#%R#(c70$`0cJsJg(@RQU^70z97^GSE$uQU!FX3u%yZb)Yuwd=VY2Tc(4BIw7EbB>h+n@8_oU5 -Nrb6vUu3@k!_b>-yw>q5&8Nk+GI@dCE6@d*}yB8!j$q=-Gs0c+qDtN4z#ZY`Mj#&f53lou9~8?gxQkx -bT2>m2Yn-OD-DGiU48G3h!pQRtto1RR56Vrwt@(}#B~71<^u*tESkvYoTF;`LYBH&{`MZTX{MOE9|9k -D{1mLuB56;}u}=k}a2$(N?~B^M-wa?ClLpldW^jav|#1s& -YfpP32!iNj?B-j%Nez%2Eg%s1U$4w(@p8=w3T!%=OrI6&8Y+QL*!({6BU`HYB1hVHWfhZ-h0QB)JI}r -i%&4`t-(h0-Y3LvudY`B0^0!m~6qliN!7^W)#&tP95% --APy544xS(%|4i(vh>`4ic+~IJ}3yl@uuwIY-J^5sJWA(n_lWq;{>>3+NCn!ZU=GI1ovx^Z~)PfrorklF0*246Gw;6DN--Y0c#$UzFMjTR -&Hno!VN*3P$O;B6EM5OT|$}1p_K}a-x60^-pSr=(BDkOaM6T2K|a;|Y4Z^dZ5>8yY~Lyg#OJ#%<57BS -ci{}0}DrWanrap~RC$h@vJhUj|{-TK`!u-!v?-*qCMvzJR)=v9Y`8X6+}ov5T12kao7dyaxF>F@)+9y -;7ZbRx^x&oFns5M}A{jU>VR1CJFA3tj+DW*Rfw(KG=`@j(hzcwm8v=@Igy@a-N(26QqM1RUpZA~~F=p -|<_3Q|V&)(2dj&->;*;H4k7f4@ai1rPE0%8F-Sz6H^l8%(0!%PH7)RK!ZN6Gdi0c(Fn6cbVB>Ct_9RE -)UP?K=J*ki_><85uMk&a-!OUT23q}ADm=nKLg%^=(9ly1ce5avXET6XykxA(~XlAS3wYTg?G -0*x7Bsl7b&JESUXhXl)cCCWWPEwpaB%a$Pu9wO%c&E%@5HtjRx^EAJa$kR=?&u`&EPoQ-EXC+?h@j4` -SoU{%*wcvl{%*s2ik2J!daxov;rw^g4ug2{q2%f*ac4DfY8404&^v?-Em%hH7$JLv2gp%1oQhV(TikF -lGMgU$1|hTK`q&#jETGpE`sy=<6!9c0}x`HPQRKWI;_1|4ozoS-&&H5%0?<0RSbcHRYffk3u1$UW@;@ -u<9H|xB8gf97b%)K63CLUljuK0a8goXml7Mv8(sAesCUQYeH~uMxp)f_VLF~Bhq4O!|&bYJ-dQw>Mj| -S`x*RTv+ljTn2H9m`=rxxtAkmT35Q;-hUtDU4{l1`ON#ScI415<1J_hd=6VBkJHLXxkgCg|cGb)}Q8v@`JN`VlL7z$VF&;K7ytkOaA|NaV{dJ3VQyq|FJE72ZfSI1UoLQYeU(j*+At7 -?@A(xLy%33_?R6zibXTp^L#2MHLMZaa6R_5?k?ja*)&Jh{SH80xz#g8Nc;0s~tJNy|O3PPz0#YhzDVJ -QH2o-`{_yt3CO(iqg3b{(FniNIV*hWK95ME!DwuHVIB^nDw*k^&m>}|?+i;Doul}t(dHnI=UOcqmDDH -LTX=VRP2XH**C4auKC5fX;(D3n(pYC-g -g=MvGT+Ei#*Y+O&bgieTK<>YBsR+uR4`szvLk;pg0G3+TS;qpoW?gEA6OUBK`dZB*CN!5M5MDTAzdUO -1MMR;h()ZEJwaV0AVaYuH4FxDtZ_ug;Q){3KC+`|Kzkz>v0fw~eY+yl4{fr4eG`>tpwY#{On<@<*SAm)~y=f*E3P;DM2K)Q33zHtC -imp~yWaw!w#+t-CaR0bY?uZBX38l`WFy>sEaC3u>!JFLGZ1gn`*ogWRo;uJdq+O6lQwi& -9Wy2$yYvuH@bIOV%^|Hg(xokJnsK-L>HII`Q^BwFqsjdS5E70T1XD@@I2b4C7TL_)EH1T;WnE14T`3c -?J{O@I`k1V=L4Zbm}j#=?I8S3Jlwc8ok0DCCXc)hGjZMG~nN!9DRLwIL`PH(PxU$sM6Ttngw%%ry`(dG;SrO9KQH0000802qg5NSGvFLGc0r0IvrC02%-Q0B~t=FJo_QZDDR?b1! -3WZE$R5bZKvHE^v9RRZ(x+Fc5zCuQ)L(Cmo5_SEM{J#-wW9K+tKb+A0c(L$fAvWIL;%;=lK72ST8&v} -t*O`0l&&-FKgzRPX}AFs)TBSQtW9R9q;CmXhbSVxe6V(%9u%l2nIOS>-Py$zomq?OZsz7A4?~Vr$ -+T;_?7dLpa;*0wOHe!{7_w6kPwuF#4kEGO+YkZCPoaWyhnvD@W0# -s4O1nktRI4l{|k|mJx*4%F6YhrbD85ImwMOzm&c3ESHSZmiw_IL79Vxn=vc<8b+Q(@>xmZt+akHkvi- -}&QHQ@Gs*6FVm@4nPOF{yxWHG}%YTMH2E#Nvu-i{oVQ$;YW#i(dVNxF6w#aD52uKB^`8pk&#_MrQ&#Z -#JrU12w`l2J&avX!nDJj?jw&TGoX_qQ-_B><_R;Lnq2N*HLz*w-~4O+oBvn-##Gq@6aWAK2mly|Wk_F+fSYLr006`i000;O003}la4%zTZEaz0WOFZMZ+C8NZ((FEaCx0q -Td&(T41UkA5Hb|8i^SV=QTJi(!wM8bu@-wdC=A7>6ZP1VtINrU^3?rRX0s{DLL-_)!;en=FZkhvh8m>(0(O8Lxq)2OHJ8N-^nE -Mo;Tpf{Th@d28p9WluX>?i*$$}-7oq%=lYUU6gC2h^$*FG8HrGW7V(hT+<7xBk0RU=7b7`3VdoA -Kz@e@W4J_KYwHqajEPXy%4g1f561d8FYo|!8|h!AVx-XZ};qS7WtX>e-Z_FQ(Q9O=E^So%B%{ -ZTp35GssNM!B(#z~OcWoX-wBFjLMP<|Q?={lyVg}_kXn4+!5Djm+n?A&D7tU#?JAY;*h9$6!83p8@kx -^0uyoK9V{O>~$I!z8(66W5jFb58MTKgTT`J}0bl!%flI>r6F!AISjKiYUSE6)LsYxKWfD+q_kiuqJWS -}bd>^0XXgI}*7FQMLBV+|gf*%8?@Qi+q^!dQ3H>tch*&}oC75I*VtFA)hZ{11#T8rn*dE;U`C=i{ -#h+3gyqKy?ob)${th+Ywy3||p(9mRKy%M7r%D}p6$JMv;#Nl?u@vsmQL?(;uVr+82fESsi6P(ZJJDMTlh3dE_P=7idMQf-LZNpsk67nMKxuq*>dzArWsN{oQ%(!9U*_+KIcO@~eyVf1lLzQK%F -zSg6CgO>O&>f)yOZRvrm1WWVRMW(=Xs7YikSKdd&T-oFq|tmu7U$Dnw1AE>+^u##OfFnYoO_~$oYwa1 -8Tvu%%66~Jj+_;EY_Rrdj-PXIJG|&1uY&H%$?8XV~EnR#yC!Z1= -0MMPin)c=2SJ_>}#rButCd`#XJah!$0~?$vm;wVI9#*PoEy#O#dF8jTKkx-7akeal)euHIt$f_tHZq_ -d8)4jy-bbgeb4tIhjeO5N^RC^mn<4j^-U0ZC_Vb1b_NQ`;@l@O@(^eAA`dWiTHeWVI@8csITG)Ae!SC -yK7UU{vF1!)%t}^@Pqq>;CyE`MI;PE^NE)vs~U1VjT2(wJ!GOX#Ox>mN@ob>Ta_T6Qpy@jajx?S{kg= -^2KvQLm{=*%)f9(ZOALW3@?%Ne#3UjcO_)>a4RQ1dRF?^;vYCnEVeZ+&ym8?RXFz!#uxU!Evp1+85Gu -o5BH3arCKi=TDvbJAI1UVjk9OZ_(W@kqF>m1f3v#gRwn0{@U6^Esq#?Qgba-~Zc{wRZ~g;NO9KQH000 -0802qg5NSxqpoWcVD0M-fs02TlM0B~t=FJo_QZDDR?b1!CcWo3G0E^v9JR^N}KHV}T#UtvW$LAHeJ^G -ZDJb*rjXuWEJe!}Vl2cpz?!?b>Fu+rPeJ8v-P(s=Xp5;Q8U<`(`{tV|7O;ZF=8Zpp=NtXzK|(I4ye*G -_5zALGE7M<=F_cX@WaGl(p^*^P{`-T#5rVr`Am-2j&3HI;Qw&_mGy8jW%GJ7h1Wpu>k+TXqi@%;rR$4 -N97-3@xbaMY&M$@-~CR1`SJVTNJa7tO|ybz4t#IC*3yL)7tUL8KzLylcgl9?Sxe>|d5n>UH_M0n?tVk -?+HSY;{;~I_N3_a$CM9rUSbbtGI1~{JfA_*d2g*CrXxlMgZlc@8idi5M-vT|+fsq=i+2d}Yobciah(l -PY)Ru!S7oipF0HI}xkSxl2hr6P1v?1i3vAQLnwTWDQ85OQaH1;L_z!P;#>Ze_a!pF@MCCY11$<_=_2kUM5uhqt@ad7wDGCYC|INJK$`!>+ve&pkJjCmNM?$0;IrCFAh{D -abDt;mY~%e>!?soCytZ)T+pu2x>SwKBsp-J8CuXax5%SvW2+~yBPY#GbLdtwd -MOd_064yz=4M;pmxY#Z>iq|%rv}lR-tw;+h9xT-o9TQ(-Qr=2hlSpfX;(IC7$*po0)O1ZfQpSt{#b4p -<^Osi``}FHiYlH=Ps8ABZ26$r`7YJO`M{*WYk^^$ZITpFskO@gjB2%%tNu?&>AgRsyttDvp)T?4&%1E!0}<5yTFS^fhd&aEul!33m -5-Becij*Tvk1Qo1IGFRBWyiN4S$xG`nx6yYR;`tD-j4H~7Ev`b%QW&VK;?A>=j!7??RQYE9Q4tb$zhE?MQ}%{44-<_Oi-X( -g90w&{U-}9B5=2 -_~#cLGMPV=kNILl}?d%k^Z=1Q -Y-O00;mWhh<3kiR`4k0ssI#1^@sQ0001RX>c!NZ*6U1Ze(*WXkl|`E^v8$RNHRUFc5vuS6G!+Nvf>H^ -NJuHF*}UBl~@H7ZTkK{PM!U0M -c2~h#rVjq*iFxz#TvJ5SfHT342UG*#s0)!0gh%mqv@XAq+I_v{5bjrnD1E+8^X?Ab&?Fr6bUK%+S09= -$zIhEv9vmjzyp7R6~PZB&2YRWfuCTAlKZq7XPlFo+q_Nc8waJDO!*K&*|cQ?zg%jhE_w(Flfg|C*Wb;`gi@`n4~mD|?aKsxAknPTPFgf~D37Ks|%rA7(+*mLaTLX-ngkr5xUT1HLt(5s%KI7$7xv4b@5-M?4JJA -rST(llG!JU6q8zCKw-In1#zzMIxn0$jbfZIk+gTCCXYLs&bbg?a{Mj7lvH%`f`NXEIw)EkwhJA3#p$C -)be9Yrl(YdSrFvRFeX2n%jZH7txrc5$7DxvUf0|~7J(zvRIhm3!JjeuEKmLdP)h>@6aWAK2mly| -Wk?|&!MN -V2*n=T>RJyZnXLc)%ChA|VRbR`d@s#RYqbQ%+R={|83Q4WwjTJ^>0$K9mOCNsj5ESiSMIRZQgYQK@M* -ao;Qa4&dOe@-VEnAnc%hYh!oFIoEg_^HxO4D^gINpZ`rZE`5Kd7P=U(5S4+v2PQdpqB?7fZNWkG3T>AI?>aU)15V<_6O+DG -bf}NxMitCHWhEDyX1U+01cus9EF?kJt!TmK{)6GdB6s)Q*>rbDB&5a47UzL&~l$?)v{r0!)Arc%loYF -drTSOhM+JAre19HWs>k$HTW5am#4HC_D5|Cu+>C+H&xn$P@6aWAK2mly|Wk^g)eL&O=004VB000*N003}la4%zTZEaz0WO -FZRZgX^DY-}!YdF30~j^j4+-Csd?Fpxd5HQCojJiuJoZ6F95>6x8}-hn_%w5_x(DkSA@zvSDuiibo=l -#fn!vA_yJ#x|=;b+In8H-hg;l5A>K3zj4#-&b5HLf4WPwPK0+KAG6x3%=dv<<@=W6%$l((R`QglVba7 -lNZc=m%Cc!h5PnIMG0i&M2X|gguvq#c8nDh_MEaxkz4)SXCb&SKzfy|$S=HPlgS2IuktDu?01L%EBn3 -91>3Vy-80pKtf^!v-|uOe1wcQVl@`3C7KJ9R1zQmNa{KL0utUyk`Jv8>>{Bkx&y#sW+R;n*88>fe->P|W0IZZ~(kvG}fOw6x9hiF&OT -muEK4``&SkdgZdfW2@%WliNy!zXZ-;5>ucxZZgl;8yozdM#bCKXk?gg=$cW6D_7f_=j;A1OdD%xBFXf -KMjqdrW}&trNyurheAH&61>~dvM=5fTabM(ka?1cQ!Qk+_=RtJpjY_WK@svAUcMy{){VcDpMrXPM;@$EmRjx020o7C5lTzZA! -dYr389B21HKNa^ey=AEJD#SEjs-voS&>kk@njL81X{(ip8>A -(RIPDK=Cbq1)2_v7%vg$BvP}8Pqb9g0{*{Lpf(1dJF6L!Y89C!q}^NIGer+ntfJu(*p$|VT4A#5uIyM -*tp>gTyAgKfPeABhOrj2g;q$}M(Ije@OY)QhcF7flm#Ux;SlBb!Uo!TBP)OF^_j5#t$GXJG*JE|fHNkIUSqZg&8^Tnk)_4b7n>9srJt5LD_ilAP@Ycxf2t4M-9S -fWJT2Qa?>)w&z{ze^OJDnXH;Ec7OL6#*ON1%{BI-&uEy$rs!c5SdfdB76j=s9_1ha$mbl*8m}66oji7 -B$qNhA`NE(2^Ew?9$)O#%MFLzzZA?R)sRj#Ofm*@p>Cn-Dv7ZUc-?|Dz#jJSvC -5(HDvsojx4MZd-Y&3!e*OOL?$i4(?_dARz6SmaQThgjA%BuFncXwyvz76*#(KhZLdXpY9)G?6{A=>z{ -r%@4H3Zw#Cb-Gk3Y&S01s~P|(FT+Wd#=bInQkp$GwiiSLlR~jYETn7 -jRY9roHrqX-1ESu1I;1U -tfp@{sevY6*#;sj@M&>BVWf?S}?X6=$!-VR-@W+M6-TWFfr;d3$3=wr{=OC8v1;L?)Hwo$JOY-7iT_&;qW6f$|<{>;Y(sad{86TK -}t3_)yzj3U@0L`Bg_N*gyansSFn~cZ!VKxY4u!lAF(qR)YG9)sn#oeeDs#Oe%y1QR9Jv%(WZ+WQVnPQ -1!X8$qyRO>X7?r3SdbzFsZoY!!*eT_q!v -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 -I6$J`$Hbt{j4_lgQg_CfzbkMxw^u2 -17R)g#<=;T26?DB{=MR+GXLWX*m$-pcP$;q+lAWZ$&P^v+A`$OWL-1% -#&He>YO9KQH0000802qg5NRY`?VC@C~0JjzZ02BZK0B~t=FJo_QZDDR?b1!pfZ+9+mdCgc$Z{s!)zWY -}YUMwUnY+=tv-8RT$8#J2)N!p8HXc>vNwU#B7l;Q?O|9fZn5-G{q-CKQ#Bywgr&yO?N@ajO4WYab+XG -ucxLtXKP&}UHwnI}CwG -2c9u1*@>vH|OcwnekNqJ?1o){YhRQu(XdF|uikf)u%c=xrQ#$x{iqlQ5d@jQ8Ron)nu~^pAm&@kX1NY -9i@xw`PwS4kWnDK8;~!$6k6g4`DjiitqhyyO`p)M%`d4a~r& -K>b}|oI#eoCkn?$pQ`e}`hrIVw@w^h=My6&M -y(TQ*9VGC70KT!xY2gf%6SP)c%i!Ra`#GdERtx}2Hqsrc*be+nf7sdsw%peM>EHj83VwaybF}d#L5od -q3IhaqV6a!dAwyb2FHb4?sc2xy&^LG<~OqrgZb|i?|b~{Hy6>el8G=&;?jXi@qeU?CyHeJoF!a9Z=`3 -hVT@#3O7LUl(oQb#h|YdqKk&iGjIJ)~M9ShH3UmQI%Zm=7ygkQ5?w4&+F>wPe9%v;~(}R=*XTv{vWtx -0XXoh8)tXmVVvkiplRK`Nu~TWDXYcFwayU1p*yPLun%G6PYj@DjRm6%!C)nRvGg>tSo2JuTq8~4x@D^ -=3o1UDUe7!T9RA1Q0&G5(l?_G?XQEIav?obrYyuGX1xGjz}hwB%!QLny{dah9xl)C9xeodOQ|g~@(fr -)xdg=+Wy++pItY&$G?13}M5~V~g$i -`Bl(0U{Scw?lh8xw*l|uKZ=b=+2 -7s~#7c`@eclY1&{ZNi4Mx*S?qYKs`(Oqzq)uH4gC^cfm_3h)++0D)6LtlMa&!C}2%`x3ia_a+;EJnzy -!x4hMx-Ru7@iS+1-@kuWHhZ~ri~Z_+@{au4R9UsakpiK02+p?C*wGiJdj!S#1?@%#Oz$t4J-aIVrMoO -(+)DHWwseLs#{!2W#`n;8u_H0^6YLd0j?0o3m0+$o2+W?nVqC(&h?<+r6k2&bll1y=^9y#>fz4}h9Ma -Mj%;DYJT#l6ZUF0c)mbxEU<8;sfo$V=(DH6g)LIjgbL2W8>=^YxS2? -w_Y~8ZL5yHim&Ka;$0`TVq<+FiwXkV^y$nz`Txz#o+MEa&W#qM6)0~9$!85p#%YwJY=n9=nj3&Sz+f| -Jrno?hu1vMSwt=-ncpPY2 -2^Z9%ljcsGj1}O^!Lwu2S1nEE$O2Op+pdJyx5_lVM`BllwBW5F9@uH^nS>O-rBD5KX9O8YI01-0>3W -K4IrCGiy)Hugie(o$YG7(eIVkzJ2H^&H}Nc;jYy@-LBouIT&z8QSjmkKa)Jr1|>)Ks}V4{0C4=0|XQR -000O87>8v@tBDyu&;tMfL<;}_82|tPaA|NaV{dJ3VQyq|FLiEdZgX^DY-}!Yd6iaei{myB{_bBf1Qy4 -K*YxvpzAxJrN}-fqODV^pDE2rOD@#5}-dz5DNAi1|>~exc)@WWIjb>CC-2h`%=Q@LofoNK79Pp#nvUA -A#brcQsRx97ul}ll<_>8n}xv|L1OtrJBBez)Srs -1j_RX+F2nFqfY*gBz=y|T(Z@fTyXiK3{G+*)v1r}Y`X6|AGCgM*L0sGuiWIZhww_KM%m^I{QS?=IA^M))$G!bV|wW^z2G%eJ(gSg2%&YFDx)*qO-Ob>YZX(y -v@cL;1BF(VFij{ppsPh)C{bca*=(0YYwttdGZ}HBafAEpWOUc=e@fQ@CUdr$P7R4V+=Uc;&Mi_kl#C$ -Gj-8MtvuLe{W)MioZ5U`ztI#MEih)ry&S*(D$CpzD;??~6WZR|H`)yGPT^FOr0bhB?w@y2dRRa$EPmI6V&kyEngV<;nmHM+cIu!lGw<} -Jelt9h005Xw~D&)2Du;hXy|@ugZUAW`;70V$T;qRm289Zw%Sr3P>H5U+0MUt_);PwcxSh6j336)q6+PzA%*I|+0h`BcF -7ymOij^?gclY8y%PKTt~p1QY-O00;mWhh<3YVc>?^2LJ$Q9RL6o0001RX>c!NZ*6U1Ze(*WcW7m0Y%X -wlcWF-+pIEN}?>_-}z?X)_wqS&>z)ld{n92=!A<6EO-YoYM}XR|Oa)qal>y1&YFPiL-co -G>#lu@OzahjCpV#0d=BDa~F~tC=3y4I|T{`cPL;mjX;aa}qqSz$k0hv4!8lAc4WNh1!tY -I8zg)qj7>d$gE<)7wbx#MAdTXsXDO9Z0>=qjt;T#tGl7rkcdrhTE@O_wA!=J!I8eOcac4rX`mE40s1} -5^ZW`&rbkTZ8bZP?hR+$`I;YYwocI%Ch_zaNok6M+Rqa?BZV$J3-UUx3*$+K&kBw>3)6rWH9`D{BLJ$ -1Juk(fHs$hq?QPjc~#nOP>t=Su{_vl)0-aMT{*m&^`23{Oy_pOc$tw!Hp4p-u<6a=C2o#Pw#8V%+go+Kn=K*=n30Pai-wo8^3jr>N0i- -y!MyH4SMOfSn-92=sS865~H}TtSl$o|S&0=&rhSo6lFnx~rSG3>h-V*z*CmT)mp7R>e26ZAFdVbq9~C -<;yF%E{vVIY>@fMq@^7};5OH+ou1|;jcyjap`5-**n9rVv(+5y!oKyew@e3D0Uov+<3YD;YE8z~7IOgwQGrGLbJ+MUHBi|bk1Aut$@{PSzTP|-oho`vW9XHMY71xQq!!N -=DVZucy3-n$xP6u<$`V#4PDkP6Z>_sdzl;ll!A%iX26=e-387Qo7FA2Kz_mN8j$<+6$E@fK*7AeRyNW -g|Sv_vP6s&O?Hn-t@$%6@w3M6S~*kXi>y3|LX?$}r>Hc@QwpgLk-Ji94(B4~yc!%>m5F32|fa+*PcI< -;b5PNGkSPwawT75v7;lXvUbj`qyx6KqvK#=1~ZK+wp>L*U|1)_po(vtcI$O-FW#_1R$y+G-Jj!0a4w* -I7D1{o$m`{_Z@3II^T?gAZ{bWE`03_-Cfrn=InQc?(&Rt0=o;{){mF*I0uhf&@BSz-^t&N!*HrOM-0`|@^-7eCGR=@xjF -P9&UKOF&3N28eN%Hwcf@X!UjlRGPY_UB%KBQLXg3egF=5lPa?zSSQhlIJZ%yDNOH#rE_B&b<;*vC5Nj -()-wE3~OQ@S_1zh*RMD8ALKC5M7WUwia7c*;47G`UPGp=4j2j!TOwFacIgGhO>Ms1`vd{WK!dUIFA8dFnT`n!Df- -W!nO@^gxs=!!~F9jvteWIM-2(kD7eq -9rV9GrokL#&-my(3`L94o{qpEINT+C$7}FmWq49|4}uh$pm>l6!Go7vBC#F}?q7moLK0k~D07`7v}?2?K -^#=SSCSn{is{ZaOgMeg1M?#Q5^1moXl`C1jP3EN`Ck*6(JyO5^I#c*S8Q{>(peA^n|=HwvZ`*1c%)21 -;FJT-&XG$CrMUm)`WGtZW#in6#(47kQVXXje>4S9~o%ce%<9054*|k+)4jFG1+w^FL5a0|XQR000O87 ->8v@HVxB=>IMJ+JrV!_761SMaA|NaV{dJ6VRSEFUukY>bYEXCaCx;@?N8e{82_HX!U~#_Y$1iR0mq4x -cE@(&geZbd+-X9Y8#}E<8b`L%Qt7n6{hr58+N3RP`*3`K*nVDr&x;@9`~ID&^PHF|HH3*g=SmY%HlMs -STaj|1a*X-bO%8cpkkzg>lXO#D@n;G))CgMAszrX1H`HMA -$58VMjN-x=bU)QCBEJH&5;nbv~g+M$_Nj}t5M{_^@_bbn`0=!}E0yp_`_P1t$>n?;UTB~4FFMVU+T+c -^o3V)C{LPuE274FOt5+{GExCm8oO?3Ok~f>g^|W!&S1=KV%6t9D7BQcaCfAsojf*pd@OPDbA2Tc^<$0 -~X~By499Jwr{MAdXD#6mi$GO8jLWp`=JYUC%bz+t(!~< -<=W_UyW|G7$P40mFQ)sk@}94`&;di0#K{nG&A)`$&IPV;TSCIMd -3nF*q;vhq49@*OnSEI;Se9=UC75zwF}rG!!-`}?GJpb{g==T9H^PazY^z>u7Z;(0(;H~({>*ch%r+2y -c@rWI@`iwlWW9m~qf1R*li^$Vb# -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 -!Cr4u3R1mPP-x=K{nupj1yKuCV -p@vDx|Lw$OH$L<=}aXK7<4zUR8RoMH80YXzX)CN(m2`J?TVJhbSX-6lZDGNLhPB -Onm=KoL*%=td)jF@mz=2`-_8C3>Sq3qxk`4HKu~{ajjKFOySVPcmps|iTJW!u)Wfj{QeG- -h5uYunRMAnvu1=uD6T5d%oYun}u}kbz*DtU@JDpX~bX!%XpRjW@vLxK%RJAyP&-5tlZCYfq2=6#|ilVo7lQvDg!$eJ{zhSvq;I3^cP -WjIB=K^SnY=m<)V@xRn?5HADEJnFl0)wckE}@weG_hF6oLxU2u9QQ)Y)Xcw**$*9WnY)-JP_p|eTXak -AfDEe8+0pP=1I0Ww^_Hc;LEBO`j%2vt6Ju&)VB)ZR}BxMQs5cqsxL8oQ<{O@O+51<1;+j{;n@r8N@ut -Veq9-fnw8WlQB`~cgq~eMFJ~bpC0o+zw^ZMQ7_u*AGR}>IglBO}^DMhrX}dG(7+3O_=hl#J_WPlx -I*ti*@R%rTUTz+|Zr0)NMelz@%>2PfFX9lN6sttIk~CMy<6#$V1swkrbQLSUIv`v-8uBY;e{fN?(2ksME(TXyarV!|%hn;K2_lL{+ZU2sC88?4?LwtGpL=8j~^mgE4_>pg72YftJ -a4Zh;d6NLz`mQfTGUbR{m#0yzow-NI09ur||o19_a_f9b^9ewes035EVt{O|vToV4wy5L3`!5wwD?-2et*h6_*mBLr(0CzXA3_3^Y2c0mxUj+ -D%z>qp#6Eool>W~@3IGxgikNgeD7gSbi*LFjNz6ysj1+6M+Zkoxgd6m!5?;$CpeHbqoG$|6-fc!DYyl -fFROipfH0t7qGMsz*3aw`n^T`jrLwDKe~4We1st6E@(Fpq>FpM;H-T4-g7~1#UV9Dv}}YK1D3V -j4zQ1F|$!1=&@58^;_m9;b~{(E?(-uS29zx(a>HjCrCP2Ky|YMi0{P(gajF{pLJM9ZyZ3zcE`6iKqxy -=lssSt$#Z;>B}QB5vm_0$se4{d^}catVG317IhUhmHiY#%rK<>ED{>_tIOSlpIiOR~pgcae<}_6bXql -EbeqFKsg6QzD=)@3P6(ClnR?C1Xvlc)PT$(M_;}PNeY2s8^`e(UBy$R`rWsrn&Dc|`rQTpvRN#}+i3iutSB(XG9Qv?e5(#$I1uG0dD^{BA10fug8XcgH%>>CWtwc=d7bn! -z*W%@eyxo$A~YoxoQTW&%P

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 -go;^P%;6{3~EGD -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 -uxs6=mLL8O5n++!mj?hyLgrFdo+u!SnF!; -0+J5ux(t8tWQ+NR{GwS{;ye~53IQkD1@U!d>>$cU-ypPSpTskZ@+#Ym2Ja4iG5>oe?lS7g6H+bW<}&a -dXH>3*+r@8lD*%iXkIEa7^Kt9APB@5u}7d$VL)_F5JH0PB3Q#-7KFdE!FJ;gK2ASi^JB1oo_NFF>g<>$m7(Qp+lF(00#S5-kT($864T~=EMm*|9CrqB!YI9gG^ -@G$B1Qj+`KEhY@kk%2D9u)B2Rr%qR)^<>J*<+lES?dr9xqP{Y{H?efjKi!`|$U#A^qp{2}l-$c_;7ZB -G5=w`BQ&LETQ5CkIhgfAxfX**4KrnPl6y2_A0)%(?i;-aaO(x~HHWVECSG1{fVRLgf@A7WGK?R)V%6K(}C$Q}ikcxQdwK_0gW -z(v$IteDa1X2D4#&thw-p<@2-$e?MJ=6XIGOeVzs<=z&uICmQT(i0|dL6vgN1ugCxY(w;xD#%i;tNI$ -FT4kto*KceNY<1pV+x}PN4gAI!U{Pout+dZ6L+bRn$`c{+2+hoLwyG2D#url}v>BjO5E>HFE5J7lR7p -qC!F^m1J?JzSxzxd~i^9`EBL3WTFz~w#8I-F2lAIQ2qYQt8(mR&AJ!p-u=&2v;?@cYdSs-@b}S1_TUKSt~K;Yr5VTRwQG2q9U0fd-IyXq4IK)|wsYs%bFo!b+czK5QqJO?~SJiNP}rl>` -ZpWc|F)%(FniK~+@Pu7gCz!^LyR2t!{Kch!WCAI@U*PrqY@9z-+3L~<4d%=WuThj^Ko%iYBXs)bN#@^ -Vr?197S0f5aHK*Xi(EZ6?)pCs&Ktf_Rx0VJN9Q#>`fd^eS=JE2U~bl8>oj_UPXD%CZZOKy&4wKQr)w( -?F;+XDr#y{jd&%`RHQ$EdzVVvyc$%s92MaD*}qO+}>|4W)GVqOlRTTAnTw=8)nEn2EQVcHxoZ8)?IuI -?;<=&wnu?o7LCRjSC2AJQpdzxxv5pH;Kj!q89BYQr;_f^JPy4s0r6U4uY3yeMgx7DB(6c4g1I|UVt%* -s1cmxsJ|Ai<$#{&O*7)BXz%l_BAk7S(pm_WCxkDRWsq|54cr!GkR#7Ja -vu=q^GtGUL`(rf(6w&HN3fwQI40!J@z*&GOySG^o+LA?n_jvNIQEY-J?GV_yyXhOybT($lUzTG87vE7g -RUKB-A?Yg!flX5k*^?nou|NZEZd|$U$S55ZzAbM5kjS!o6^hUPTRb -5`(ie}U5GTqHp(Tkzo_iHiClcD+)6wR>7_iD=d%?Zmp;R -#5Fg;oL#ax@_8}T9M$(0!4 -#|DrvPkwy+?W^y8{9vkW+PkK1%ZM({)l8kG377Ts92jqZH -*D1ql~GmK?jm-y**-?z}EAAqJJFNb}H^~B~!9NhfT%mA<3bs2%Zs+yv^pC|pkK{74&%|`UaZPkzavKG -zlJbCx_UGeJm*RQ{SU3~N9`+tA^zIgNY>(}3Y`OWJ&)!qYQotB&_<5qx%y1KlV*ywj-FT@-O=Z4-C;u -Fvq&>yaweOGL%p0K2bxT*!cQ=rB|Hak=!fKhMouYxHDiCJ7-6?N5c6I>T4r!I#5s_R>zcPP_~a#M`r( -?~NhPu`R_;tl;OcJQ-U?W=mj{SkoN-s%Suh3uf%0QEs<+Gd_KZNFps2|eBBxD3_z(W`(W6I*BVeUVwKwE2-CxtYtRT))6fl)AzP=n=V2VqNo#h|Y&%Dqj@*8nKWKiePMr -;%0D^&+{58K6%A*IaDiK=!0sTaU&$MtpAr+>-vr?c$i#l>GfUS2-^cscu*l$ptlN^^av@@?A)dQ)wa9 -Yey07FW|2y4)_m>f3#ny_o4T!MB$Zc0Gs#knqJL`V8ED-#1=~xr7VjUDxF>C?57+{B>XTVh0qLwX6RW ->k$Ud>l)DlE2hD7z&(2*q>;l!Zo;|LeLuG*g=Gi?KXa<`)-+v@1P$7T!X}~T?T{mV07 -vP7-(V-gV)&GsO|cuUpoeE~Q7&t52AIMdk(5MVdGe}7UO6VTVs ->YKoh(P?8UZAt1JzBy9Fs$SjSo}uUg>J!L_w7E}iLyzS%Xr7^^%QSH3y=90w~-MR(>j}lb68e`2&IB7 -3jOSD!@cdzY@H|RlOg@sJQ>cCCkYdi?8VG&&Lv0W+-hArC77z>|UE;Q)M+MHvc_Ek|2I$7vCIc*VL -4&@k+f`XZ*FYwNm-k3U@{4Mh!eRqh3~}oTd`Y` -av{dNLev%>6?%H9fa5#Ni*T^Yn-YBfvL37xG!cCdf;;I^}9S(ZaE|BtIBVDx3!pNl{o5TM*kYWMcA`$ -sjZh-?;9i}@$wIeZV2P=yDg*SP!8PWxHGs}de0B`@De&;TU5{E6F9^0 -&XcHMH1+B7*vTDkXr50>T3mZhK(Wb4yg1CW!~;(Tp|6 -u_WXxv$3pl!+;+jh=&&UMSd2Ksg}pY25_1uun=4`5LzvT?W++vL`5^x&TF|?|}`F91en)8N4gBIY_X^ ->`0XW7^KLu9|z>4S&F*TdFqKn&i-qeHZu5a=@NmAcO^(ACwLnX2>T#VpdIC -Bc%?*?EcyG>_CMi-ekvf#U2`Qv(bNVqbNaz4lrCaEeQ5S}C4rmLqjRVjvL*1GEeO$6apbj92%CNr?Z)|!+5RXoQ9@YXf>|OK1emi=j@e -UgHL+J(yZ3<1nsfbqD(^7TEoJ++jieS>8nDe08>lKfhjwDr(29Z&{Gt9Zh;ce1hrbwX)-jUhl6Ym -bvZ1I42bAZqf`5CCM)gTGd=az4QRg1lqN!%oR2)WZr8IE`7Ke#}4S&w$%gX%rK}S+a)}#e_Z9qfCbyq -QyP)2<$O$iZr6=V1W3jMA${HxMZU@H=#&kM!Gg^n`(KIMTiQ%kwvB`n4sp`uaq5J_r3$_z_Ncb7;BoY -B*y>>1ZfW)OfMS3a5Yat;tp=7hJjDSf<_w#bYi)bHZTUGga`aBeFHuNh*|MK7ZkkY5HM&+qv>%2kICByMC)T#^t32|gx3PiWguG>Y4UWEjE_Ft>MXFo`eHo$QD -8vQjbbfW7?ZNrdRiLVI>$a!Ujvy#8%0CfACjlQSXl;sGNiDUbm81)9PJ;U1Fd1S`@i*xz06}&gQPke`Y$;wcQ>W1ljAQCvl6KS&v@ -7tG?Wbx#EKbd*59(^EG+;fj5_gKSJI;m!(ifmXfDgncudfgkp$#SKh-In7tFtCJS -ui2ksX_A-$JGl+p4^*nHcv;cH{3)$H4?H#)4qZp=;Fq+_xl*jUY*t>lNW+m!f${xs?Ym4RWF^<8;CkR -^R&sja@Bvo(8DZMU$QLC0isFyw|BATPWIr2=JOnL=jwYJ^3aY -UwVjPv?XR-*hXIW)_5`xXk6e3hz{myu$F4`O>v*r1yOv@m7?0Z1awG0cKmyU4LRB_CB$)R13=H~54yw -0Fi54F$jD!R9Ew+Em8SSCS8i_HO0#siglU0)m+8!6x@NbTmO0|9ME25kUrfp){~zzk3)m;0p -0*deZbZpsw8JnmJHFrYfN9w*DzDP%Q~sFtPkT$dtx6f -a#wFKP-6D-dXGHwL;ha2l?vz{=+K&}klM%6Q?|@qzGH&`+EN%47+yC*+>+|I8z}hg(&`ONxR3xPdkt( -MSNkDh?izK_gqWy36b8kUw1oC2#$sA^38{s(0G>feReB5n`d=0oW86N>{NT#+^*$WrVBE=;7Rd4>Yt( -we=FXbK8h|_T*ifm2av_PU!dcvrM7==93d!nn@<6eckki9gABty4%e09#|lgo2*VeT6YWWS?Tm8ivrT -cb72!IGi1C=tjDnIk*QxPxYbX^LKsDk*r2wl4f~bmP}(4jK9)2++DpHOHY2h6k(_J}5d+%8+rJu5y$m^iO9dmL#W07_GZvrRsg+Z@-_dj0}`8)a_x5kPeo%2Dp&yQ^~9acYc(O?tVa6jP54>Dv?v>& -}kAFb`q)PglvHbR`OPn@=%0uB`haZK+g_@wXoAXlPLn~)p!{0S)jTD74_O1x?*6_blpeM>JrR`esBzd%?l2@~B -M`I!$(UTdf;*w?Hx={{HG~AA$7&SDPWn%?)Lqlk`-J|u-*XjEf5Vs4Q`3DqJg#j8iy9045JQPK_w?-T -b9Yw -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 -6Md{1^LSEeKm5#c1$|Xhdxpq@$2Tn@rG2)S@ -YWy`v$Pk_J*^auHgW?yAo?H3H#xBz)A4o`aB=&(5!l?AizMDm5WtImb(kH{>$&mkCb*bwz49_mz>VsY -ZuxMQN3wDwHQ#HM?pk4_Kl>MP*4ibMbhGvwY|f)A0W1L!US$P3m=U!lXDU4H5Oz!*ZV+3GN4r{Ix3ts -;He0KaCl|I)gv@&MS#K%xvb{WpL{ORAIEKcWf(^%;=iWshtU^GVy -!Bo&(R&6^zkT5hMG%!$Rjgz -JC59(y$O>|NsPH?hh*6Lfx|cIt0L%Qr;%kRi6Nc}JhZ91gN%zM_93)lU5m0QVB!jCC+n4^WFn9sit@B -r1oBn|2@}&sF@@}0=8r?5a^){7(DMs`pMQGs`c?A#-zP6VL*43m``>@}yQ%v5U02Edda#)_rrM2bDchWp|f>YU=Oh -#pRq%WKCSX#TcZIkrBqvS=#a16L)G6ki$Jw^Stz@+YCJDPyAX369sP!oSdT9iNl`?FEy1oSdVWwuU1u -EjrWNRTKh`Cqk&S7lh<@KjC^x+ytCb^phe2}BVBjOAl2cD-q0lytp$ -W)!qnk=%%8!_6kh|03??VFll+i2BMZuRvJsUacO!3Sh5Q?>Wm)Q$0XBPKDMB8#$02xyB!~!^$1>e`U0m{+S -@$in!Y~7l21AMHtdxV1M5-Jt63L{>ABw3B)B!!$Av_YE7o!p8Ig^Mf`>P?A9q4Sa_cHm|HFCOqa+6^W -q1n+=M=};o1Hd_*zWYjPt3vDYO`h;uXyC=DAzW;DHbO|^uzQf6mCnkKo -KKNu$0OBH7fyULabb=BqxKw$~U!hQm%s9`r&AC`~-5#WyVloXgVzb{Pecq}jt^rBn5GmZpob*dX^254 -Mbz0nrW@AZxqai>HOrxw|@D4`!yy0G)Orx8s|Gp^Wmz28tyCA6fU0&HTO_Gam#pA!IvX|tUH%=;z>!>L>N%P&NMoJgup)cis;{|6?UgKHdJpL5B< -jctb{hoshm9b6VEf=!7*!@zDlt%+OSpZUOVTw&Y=F`t~lT@-;@YNiPeS;O(TPuRgOd%bc~78>EidpwPfm2ihN$tZE -oad`QiXsI-e*BGCHxth~9q&VOl~kmWC(2W#7$Ca=t{nwgsLF*qCOlIkB>w8y -32ECg`5%-k2J|Tanwg-gPTtT{!dJ&2bt{PlXEJ~Zt2G+<%Tud$hG^?&a(qc3`OT4Cgj08rE#eo+zR{M -*bCumP<944&Xq|)7TTa7tv`4>d^399LGN;|GI0~@gYe-e`lkS3=LQffjX$S~+4^@FL~mKF$i7D>!SQY -ptDSSa^?qk{_&h-;9i=;`(>~^lJOm-Ee!ICw{v<%gp^)UEU+Wsm62*~nCWAV~Wo^g@XnMmuwFU7zukrrEf~$?KK(8oOmT -a&ks(UlzK%V_k*~>ErIbj?3$nM77b)JLLyh*$$K!|datZH-?rl$G)$b(!ze77xcMuIB^L}$EE)u5K7 -}LQ4~Z<6RoN*OPlO7bkAheWwAh^%QtothLI;V_!_pmOM9alf*VBg4=)r3Bs9s_Z^}$ZBs|W8?KQVhCK -4(9ov}+~HP$%XPMU>#fKFBq3HckVpG1QUls3p6z*T4cAzL@QaOb&SHVs>|s&iv0^j87b%QO_wka~?9U -f$uqb6{xxQbmC6Y$bCDin&obfxliQ{^TvBh9_$H`B!Ccd7%SX@E?L*mouWtt%W!SEg|6G3;6h{B^Xm4 -%7poBDK9Z5y&=roXYT@53W->PzjT)OY#(vLF6f ->GH^@wx_QI3|I)}T@SuqF5H|ku60%?pCZl0UM^IOtkN4(5cy+8nN4`vt7FMYC}#+gfWlf&{!!mRkE?x -tHtjen_rOy(;@D*@hetOTFqm-Lp+JuB>stG3;!+o@3@G+y{}P;mo}EUE~`TH6-p=Z7XkCcKqtx2#AJ%`@0?C#IGeY8T&o$G3Xf;qn}03UKCi3 -e1Cw1o@FmQkW!KOy}OsFSP)l(j?+yfW@}T|d$(xFG>Emv^=EnCc!RZv#exDW#BL=v8;+ES##eBDCoF4 --+Pf>91W0pL_+o*xSk}81WRgw@l{G>Kau{8|F0TeWST1w|v2Z>!MKQQ5Vs4imteIOH>DCG%yNRWt>nKb-qS<)75@+C17NjAr}yShk1;Mh|Bs4R$ua?74 -*(Gvw!y7NNGrhev2=IGCh#mh^+6n%sxOh+dAvRN}>;yd#yb%aQ|_Jkq)H{OLw$8g$tVYl<*l -GCn(5^|GHKzezp`s*aVJ&^Px{m@j~EhkiT_%d6=^$Ny(oS+4J89iJtTpCI6LCHEO#YdjVD;9aT#Orz! -ynqJQAm2&p0Ym*ol$#t7XeZeC*JyqXP<7TfeBIQ`35wx+p0xc?{U}IWmP@y|T@SYK4U2_Nr4Hn@lQkS -H0XwlWtiZMz;L!d^o1*oCa*+@A3)P0?boA-VHEQgDPkY-mjSjcXQ@p3*{MoZrU0&n=|JaLLy4>eY+pf -y~VpaZp`CsjuK$kKUr{I?wR(^p#&4T)Msrd!{AX30^Qr?B-HIrW>%cSp|vDHQ^Q#B3IvFAQc-fl7T3r -1D&>3v&-qFtP8fkLBs1`-m#Wp=S+mPEXQInvWv_VME4FCQ;2pMJa~cBJ#RB0Dk&gV#mV7P@CUm)AJGR -^KF5xtgaB2ov9`_FT89Q!>nN>{-?wcY;&Zxi9mVUV(h}%G_tJZ=+Tz6Yxfq1P|s|Et$ZVJf`hCJ)E%X -JO*7`-lh%`7GR6+2qf_nGYF}xm?@JGSri53^qNF9osh%hjLi2fB?f8C5mwaxsWwj4VT?&c -YgH8&dx-ZL~M*bePzlAekw-Xv=-5C!nKlCOzeA1$zvjW$2NkUOjx|ndnXwvdn%O^zgJEQVOVJ&~$kQM -t;nTPq>A!l9Sb{(6vC&M|0(0LHNwZO~>%086=cV2OeH>iihTNLqN&TE;440BxD9kcd|SfkcwbiO}DOx -qc;Bj`K%?(!#t(hfvL(m95cFb@Sey`*e5wa$En_iZNs@zn?FSR}K}N`Tl)?k(cExR1<}t7?RQudm=As -K5HTe;PYK8nAiw$mJ(9Lo-iw6L+K3CFfOR8!xV#Zd{yAKR5z#5~P%BCGzQe6iSTRadGwh6LrbO2$4~lRei8#B$BrA) -_%QlW?$043Xrl~t0a&sZs67z*6?1TIqH-Q~$m2^#vC;5@&@{ar9&!uGxq&_j{@l+(c|1(@6aWAK2mly|Wk_));YbA_0020C000sI003}la4&LYaW8UZabI&~bS`jt%{^DU^s@a;4 -t34YE=ABgSv0F=(Y}LuX9i{4BIO}$QD0n1 -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 -fvvw%?#9@1%X1?@+rtr~u9Qm$dJ7r_ -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 -vdmUxNrSKM{=flcwOT^v-mv?(9 -i@Cm~*T|4OC$QYSvx~sYV(7p3%sX5a_N*rjjtkb_9k$wH~<9E}!sQ84HKWWF}P_SdXk%5=rn3faHNzj -d1sl^b?l{=7b2aAfojH`FAk7@ibEg5&huA2lbnm2UAeX`%kwSkL`CZAo2f&ahZ1iXn0?~xYS-$5GayM -~4nMxJ@?ujd=Z({{;3923-1Fj+FJ3FU7R`Vl@qEx^HR3Hs`EXX52_Q@obqrb35_A?7=M-YOjr5J5sH` -?d85tKs7Q2$cElXaAABGwjOTf(S;^8LH{cn2z=6KHj~Frcm>`De{7Ub{ZUmd37qBgVvv#4u{VuCGKJm -e12lyT%_wObLTD$e(eFfltX8pX$9nBDu#KYDH%b2bef|RglPKo{j^vcFFf5gFgLD9rP9r?!e045(QtK -wLC{PK3ZLr}vp4xcZfo=!I>kmlq~U(MxjH_<{~}ZgFWj3Jhp?oxTk(CxoBcG{Ym#UZ#Xsf_Y44iMcw6 -_@=+Whr<1SKUP!)c)}IX@I}V7s{b%kJ}xZH+|cVV}!SYf1pB8kY4V`M$goR*cWlBBg$414fO_kH=KJ4f?`m7k9 -Vx8SAHH^`uVq_2F~Y6t)g>MAuT8^j)!VZori`gK_I~4j1|vfeO}`)Mc|!&AbGo|s;A#Q -ql;_@HpRE*KV$lpt}3;W>*R$HADzO|%KTy!t;t-mfWProV8EzowvwlyM|Qy2YD?>Xx7RuFVw4UMX-v^ -|j7vAGzyapzv6N_!ms|^3ball_2&i0@r24@D+j@@-7#_!~fv2yA>UiX(&e=ffKqo3Dw}e&m<@4=>VXF{7=VIl7}RMRJ1630u{E%1E0|&+By#KV~$2mYY&CccF7YzCId|u;@zJR9GfQf5~FmN*-CmEu2AsTpTzgBR@k`4W{mu|-gGW}W -~)GLw6k|X6?t}Mp@HCJC4iYgQ4e0Ojx@J_@bHPT`?<)ECWH~%UpUj*^Fp3h`{h}+Lh+q-5e+6f~bV|* -pOXqVUbf4;WJ1zMA+m{#-fnf@^t=l4MW2T)4`1QY-O00;mWhh<0wM#OMX2mk=_8UO$o0001RX>c!cWp -OWZWpQ71ZfS0FbYX04E^v9RS=(;pxDkEtuOK`yBw=MamzRYDBM9~aED+2tW;U4z&p>8NR5#ZWsgRW0o -gn|7DpHgvi9McKL@#cMWU*Lv>QoioDA|#+Yz8wZR+fZ!y;O$Ky_W4@Sn1w(yYYJ~4+ky|{#9!K%doC* -c*}OX1|{~qFDlvf)Od-5X1eUp6|IgeCm()#`~A-!-si-=m$;_Xa!?hU*Rz+3^@dBKy^MbdF0`R-OY!p -$N=Y?O9}I7&nW{62!9G+!<%H|9l@)DsqL`o^(>W1Rb+qOGW+kY2TnQ=0Q+i=s)JzzVaoFv4IK~vY_og -Tg%>3PcOUn|amt_Xis+MX!EBp)W@}8Mg?tf#I$?kRpo~x^?zY)#Aj158C5!6K!BgvkDs-1jhHEd4Ik& -$6>bX-BL48{I6aF`1U79h`lt62js<${~COf_qpoYY+VUGc$>h1=~OHAu7NP^nl04vP==<_H7-`S0>8? -f{?h&vHQ1XI9o6P4-p_w%W)Zvh=DveA>+?=$Y!cF{~cXfRlnV_|xL^jsbiH`Be>!@WvYKz@M40Yry{m -HYO)Vr~)H-G9Ium{FS}vXdNv%!^47i-(~J!*~*ehJtkU|Vzi0d(d}M>L8rwgKN5Cp*XW<#rq8%vX*`<+c3s?dKifKMuKyHM|EPH8oSF;sdG&0@zm1Z%{pSPbJG=Wr(kv=Yej}U=Zq -dE^wBG!^R}S?HB1lXJtmUmoGga7+>1|09}z#t%(x7%$j;Crq{%NzRt!qQ^n5F_zmg;;DQJ|FL?l_ZK2 -(?mwhDxsCvO3jHek?gpu8(E@g;U0%^W) -%ZKrLj#)MCpS}EB-^lf^>OFFPoM+4dBp~w@w#BAax6)maU5O70T9@yX8YlgChxqPYy|>a&LuSv!brGL -Ih#(VpncE8n%cu>Y((vheA4{F(F5{HVwH!NWc83Y^AXo_HXr*JVxpo+vQa;^ -UYO_R1+C$Q50F(#q3B+a_O#Qn -h?1!*<3Zv&ClYtDRL_m>BLrzIM+CSsby1?L-L5+%Eco{_+-dzO9>hhd+{dVsMzr1J%%OUYkftoC+#kT -inYhshHj?XLBC1-iVJOBmk>vGhBbHO>So>h+V|knW4h5;^^R}I&w_k_ib|gJ_WlEFUZ6yyEu%S^SX>4 -H|HekQ2Hzf;E(rPc2;joo1F0}A*$D9mG)HPcZ(S)4Q1y4WfhdQUpyJTnup6i&p6G#%H$})GsExh#(x? -mWaiXdY1bKZzyo`6b_8ua{PS9F7<2?M~(-J@4nD#GZEhG(=CLcdy<#n56QFn%&daNl4oOL0=Be5(1Xp -89?Q1iaFES5cXihd9@Q~Ly(OIW+Qn0N#8t;6kg3`st!k0Nn0`tzTkoSDa=dEigQ%aTb)L^hbmX>DKA2 -v@8CZ2yLC!Jc_P>Hsu~;}$gb$M`{KYlqnVupYMyKXVllP7Nk{Se_^99xc7fE9!i)a$dX3io0`}WEEu# -oB6WGfrEVGRm?zzO4cmB8ccKZ?bWKFcmHM}|HSNK$!n`vPlJv$j)~I+On?_p3WCkK(b@dAhIC<0E=q?02KfL0B~t=FLiWjY;!MPUukY>bYEXCaCz-LYm?hHlHc_!uruc)Wo -tN(B%7_-D2`)~b5rNoE|0xVVtZ+dgd}DtQsHAXO6`xoegGgqQkto3uIfIVwl*V?K%>#E8Q@Wzcq5Ce#Avy%iB6jXZndO%e>G(Qu8e<;wY1& -L$Q%!8Qn+`iK>~ciloV;$fK1^gqIbIMVc=>v00|^Qf!JQOGLGdl42w3WeOO~v3pZN<9dm}O1WsVs3ZX -A?N9_pM3t!OBve23+tT1(RQlVxsM6bYR4?^|YT49jW`5OCZN4|Nby>u+GM%ff`C3QiJk87izo%>Z$)s -GT>p?SSi29_+pnTYm#m>1z9D`rtPA!wTt!6h=2@Mjg3*U%H^J -Q2B7Wu#|Jp3MwfQO*@IblzI -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 -_L$yoKe>b&i5)fj^AB;_Y -1Ic93ieBS37SMY%~)YhW0!r1358D|;1g>cLsdrbDWqW%;`{TJ=#Y -i2`#tbhnj<`Vaevn-tUnn43S^Y667J4ntx}(n;H7km1?5GCNK93U7=RohnQwo+2zaVfFJ76j74Ag#-P -(lF)+R&R?(HOlLy+8o_%-A2&o@PNn)2<|VXbCvr5S{$mRJG=Nt~)3z-X)nA5P!H198RjjD#uSI7jchJ -1)2?&kNO>HB;Wz2sq>`c*I5al?uN>JdMPA~hwMV=L1{hd0gbX7&OR7-VQO4WvT2H?D#yhf@-Vq-x941 -rUGH+gbGh5MR4;9x+V##|wef@Gy>3M6NKef$AaA;*uIC*%M%^OUcazSk% -PYF*E^-Pem~h9iMm+>j{faLY{%$Nff18ftFxe)Y|;eqx*c;$1|BSBx>(lmgwce!d>P@MHkekuU#iE1& -RD2q@>i5|DdIW{e|UfS^6D3VZX4QOhDTL8&f~n!hF;JxMK$yaIH!qS%NuiPEj|ypR(N1Pc-bjbrVk+y -5aNLGM2{Q1y?phQCo&P<>Dd=wdONpwi7y9b$K=@6q9dA9;h#*z$*{0F9n`a!{al)&L*NtKCUGB~_8*- -YmZOcKa?hH~6ILy>bB2{uM2rM8negjX_~zNGmoI)E_bK09cc%pc%8E)lFNTO_>IDaIrD6PTS;ULWmls -%@efAZj=)8RT>czVssdW2qCvGAI%LU@{!|5mJrM{nh(pdu)o`uZ{%Rj85ET!0V_(t#536(Uz!CXA;xGjv15ybt#v*7Y%TO%pdkqFIWs6BD>8~@|riw_ibZIQgSwb?4KIYddd%!l?T-eFHuR49DfBPGx7v -xf9}tYg#!t3YzrmY+5F&jDuRSX#L-5!0DiZwEtCq8uyv1lM}C(I)B^CKhM>*2q*#x0r6-K%nqI -vo)AJz`_tU~417sMBMerSyxGq9 -sQ>Pa##^HiTX3Vun~&yiaQ2Bo5l4Ltknm&_w=NUZi8r@f6#=o#REm^AUnY%3I>nchemtP4bwf$i}-w| -7OHl3r748t93*5fW~Z6ZX8jO^%GKq_7yR*AGK4#<}m-QIG!KC4mMd(1-4LSC(+)E+$y{);5M;REXVeg ->|pFwKats-aswq8SZ)a@jet!+Qdfht;H?fA^ZMurvv -cV9LT{eJkN`d`H}SY}wF!-J*B;@fY<>0bx?P`NR6L~eC72tKfd*H#+y9c2epA6y=jGC3wi@_4YFJ*X} -Sug?@sU4~RqZaJ{f(cXA|F}d$+x -3gzl~&x-22Yz=T2iS6uRMq6Dn#EqihHJO5E7oTyALS$aM}>0+xy|vD^xHLbaz{mt8-kNsKjiG8{v3Qq -nuK{k^?l1YgfpSRF6l8F6N5BSlT-=NVOr+cwin684r}ZsXo>mbo>xfZhb!lkFVA8TrtZx)3e|!;22q9 ->Z_6p}7@Y_U-3x1&zNdfz;=sUtQ=!k?{JU-tI1gPXs8bMhha1!qjtgc7JelqhypFeGL#Vc^AqYDi52S -YpZUJT~LWbh=A3kN(_bHTSHU;x^TJJU<27f57iWSOISvG4r*slzS=HPW%Buy+SX|)4_U#(@F&QmIV04 -oE&fvVXWc6j!Qx&84jITfan0=ZTP5{MZeRJ>t-6J=>a_58c{Pc30?nUjpzaGzns2U&918QtSZvZ4vpn -v!S0NbOuo|G(u{9Yl1`D31SsZU0x-7C)A3cS9lT44M6DtFu)J?M78*qswMjXWJiDdlnb#El#MI{pw>p -%UyAQ}QTZ4km88s|_i8((;`JNURqn9=I -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 -&noy0hl^@Ty*^{^`U6>Pg`FtogMb})IX! -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 -z>|)O;;^TL8gE`h4c9he$zie(l}O+7 -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 -oItDY838~ -JWZt1_I3%2O`^m9Y9lXMz_Nvh}e3_)j-bOA8-_aiAG=^h5#+=Wn*woL7_GwDcBti|JFt%#`i73C}zlx -~@Si}DVOZI6aayxducfgXEi`V+SG?1c -|Tv2h+IT;SvZ<&UR9!3#GSdof)|BkJ|}`3%J-2Rc?nVg!oUE9T-qhZV1F>++}_x>+iO~3qetv%LcjYPJkx)LQ -o)JcwIam)B8vS0ixpbeJ-Zbtopqmlj9z9caY*xwJ-^ekV1I~Ow{wNiC8p^is_;AXTvzOI`gn*Vfww94 -OiwZVgk83TNF&orGd;#R@_|LWffit&>&OjWjkAFl?17oG2kpAd7W;hl^D<3Pg40MlXX@%n?>I`Y_Y@J -*4v*VOfsnaBL{!u%cBYaeArQU#JuHVZ^oyO@=bAtbg=)QVaZhQ?<+|9EQV^q96_<$hZKzk-^Vc`mjQR -o7qvvWg*E+_wK4mvL^ep`voXBN?62RmKj*bBs(jyhv8fHf6OLeA%uf10~;u!JhgEMhU5RLlas2(lK6o -N_wSHPuC6ALsY9a>S}<@LR#@r^HOr$jBNVA><++eZ(etsPiO6dWU$X -iPU|Yp`o6`8Eg`2m5C7)9%!|ri8V+ol?Ng%~vM>CAhlKeUZ-+%eSKND*3$8tSyeJ0B7|0r!pa~n_EDH -Xt_llHSp}IN3=Vwa2ESo_N|6d60csMC@HRZkQZ@k;o^+9?Zn!nEJF1K0(S}il&^Jx#8bPI -pAA5c}Gsz3w2&sk^fL9OV^l6I9N7T5H| -?9~rZV{S?Kv`3|siin(_`64GP*5rF}lmY>z@6#KT6noubC0k6sc! -l_%k_UKMFXW%#lmmM%}eH)IZWS01G!NW}(epIaSAv -?6H1Bb9y;`{cY2@i|S4>`Wo6``UD~G9?qMi^_)*gG&1EToWG-NvSw-HE>N>Fq9#d?|iwY$Ab!@nD@VD -H*pz4+l}s2gT3Lq3Z$_5VasIS<5~n(rhZ7L-F1wD%$*;dgQ53hh9twOqXB$jipsFbx32R7gjmbXB(2W -&b9?RUYSc9Lha6SPQH>@pg|6n6zOj_C4-!+s$ -wHVViCRuY5y6zj{Dih|(W3HwbA3pr^ayn8SoUxaiN&<5IaP6Cr1I?uu30|vjffX_rhkH+G;_7kw95=)Z8PiLyO6# -`#f%CVb{a3$UNyVnFPtEADi$rFzVC5K+0Z|_p+ve_Xp^(9UHQ>#vL2A?bqO=hY`XiCwB({o$$RXy9 -mp@I=skPzP~zLj64$cvm-qDqi-Bp&Kpa{-W6|+6v3ep-6QhJ0OquUxv*TL -dEWqITJQdeHCjgU5{2ZHbeksI?p)`atWB(Oe=ruiW>Lp$1G+~1Yx-3N#L5G#dCMD%-O9F)derjJ64-FmsT9IMT(yEa8#{D)9!$XNjGFG*XcQpwk -kKOv7C0qo;(^!ZsKbc<8iwYH*|_Pjgmb&{V2y(i*5E(yh^R7*XZJ}}Q{Rz4r7{noUR -@I3kVU8v@_vxpg=?wq?Jum?y-E^v -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 -5>D`fse(J --(@^J{;tc1m0T7_z0m0BO57ONl(#xE>6T}!etYg2{95It(BLFUlE`Y5_G(_V*x69gHH5Zqu*03}LS!F -)tW#Z`P|&^O{1ElKJDa|&pitSy*dz;XZl5lhyVX&9wlt1AY%r!I^EBx3xd0lI^#bAmP0=pgnEVDFfqg -^s)|2`!KGBuOK9t(}4*|CoH)bAUag8qVMwbP5T(g62^(*qwGKlofpAOWU!Sd`2OGO;;*jftQshB5L>p -&*)Wys}+>jQ1Y^8n(FPzbH1UK+`EN?g>i~lDyWuB{PYz2@b=LQF8Dg#kBp!b&$1Omlr)| -a8z;bmBG9}ZO&BzOdWn$@L^|Mp3os#jLikK3*`>)qm5JXV>H>-h$e51}XuR(z< -|9r#lCeB6A9svk~FaRx|^*kEQKj1DqIohh!RKM_MZgrhSYK0lt7NoF -|c4C>Ud8K~?AceL(|yXC`&-X`8)l(_S-MYcDbw^gHb>b_(3bv$tnrhiyNZz!)kfoa*+HPIcU!y|>XTOB=9Bn%@COjs0lX) -x|A)J!h!B$4Q}iL$mY>=|8u6AYxRr^oT;E@%&y5lFidBd4ElO$?0~T0Jco>C!o{Z_Km2vx_nG3>lf|X -LOF`+Pnii?>^I|wXJJY%3GR0Uo;H=nG=wypMH@MxB+xDWr=(^S&FLpJis3iaT`x?h@zUuroX#&nP0R1++1^@(3tibn9v{<*EC9gp*5kz1=Xa -SW!$&iKt38II0kKP`&YJfgAJ^4hneSL6NzqT4mybyUoQ$V%RCts)>#5`uZS8Ksa>n*t~b>5Ywsr4_x; -y;{~8APP60bC(6LQ|`vU*!>W812x#U@L>YjgJoyx9QZ_62Ksz8hrWldKiFAXm0Eb%<@hFBPfhx -fwwDcdx2yC!;M}dw30b?wuVr58W6_e2}UuP)A|GzJ)}d->kFm1r3u4%FdQo!7hj(xvO2s>go+tcM0U -s5Xk+MqjQ=Y|z>E= -kxsvgx^GWDhUUM0B}l#69VUV6z~U*>3Jm+VPZoT8x}A?NWi#^MS_)Jo}xx(so?@> -4StbsQ3>4&aqzN?%?zttgV|(IO{^m&aiHSnp@y|cyNS|z}uK;=HCbJ=0T&W+hrV3jR%{r!IL>AD1qR> -^vOG-3%ZrAiJOxl_3Ro#7NLd*1q2hsc^en{C1~7f!Fprd_Yi?`|aIbFq|QO*;B0cEGRRwgPO3z-)NK=ZHhfcp%cN8&! -0b;FH%%Yar`YoCYY>)!LN>@eKHGCVpg)(t0ZJ`5#!b4zS~7H`2pIiBQw`V)X_ko={aF?#2-qKPYf&4B -h#Jn0c%rpByR3|A);lbhqLK*Q9Pd$XSbPzl;oL|@!*XS55)8Rjn8J`Pvo+P{V$ -QsBblnC72CPVax0PbBRub8|kdWVypy-U{<0#@Da6aFn2DPEXVQGn}(E*Q5k_A$22SEz4QJ&4eT>m!B`$5{`A$G=gT@ -hZTeVLOnh#-|dbjh)8@l~p1qfLptZ7Etq!RKA1*ka@FNPM) -&BudO9KQH0000802qg5NO@vv9bp6j0FVs;02BZK0B~t=FLq;dFKuOVV|8+AVQemNd9_zti|jTGe$THk -TZSZ@OlV&h23nR=`p}*h7W%Rb#wT$SpLOgU+nL#=^uJefZq8)((pzA_ab)R}^jXqWMz@60s&~ENloHW -)+Bm{KTP=IX>F^#!_nIMPDnc`EQRePd!`+8O-4-X4CjmJsh9;}nUU -YQu|lgmt(?(vkt_9CNzKYh7`0KSX>S4{dg7|oCb!}#Z}o}Kstc_uQFqK(ZlWkcU$`NM$*H{N?q|Q3P^ -wr9;YdNOkjz^03pYh?1e3`cTY4K2cu*WP#Z4Xi_fnW?E1&iZ?=+ou3#k=6S(8i<@52LbokbWwQE;&qK^ -i(TEd|7pIRIv5h`c>q_0b!;ef_o{{2Q9=0Yca8k+(vja&3fOC-TS-7GZgN!lCFlaz)exkZV<2DGn&-= -hVh?BNCvNr#sg-V9A-oKGCKDnj{f;FEE>6_oPir@K--~2}MO8ka{x#6r#0x;<{A_2*YaA0j`x -ZU}g83lKHOPTmi_p&5PyD^>16%X$OT!fvygX+4WiBq?VigWQ!0U1Iee5Y%PDui -Zf<1wy8M2keWQXss$IcJWAq`j}j=16imly-HD`Dt(Qg&>?`iq^ZH5ogJ7MXB$DZxY- -PhZa;>-*uzd=Vl+NiI5IRZq{v?B6=B8zpwi=;YW_CWM*6(m-LQ2X-sl$(F}8)Fp7`E`#V(&J-Ekd?7d -psnI=9Ya` -$@>s;SbR8=f4im=+Gsq>t4}@+2&oYdC7n7n$jizKYa7B*1lO&z?ZMRFfj9}X;6b3>8|>S8US?6IP7cJq0?ctA-%)!f1q=#%h~#(a!?(w -4P%aJn=zN08@n#0MB-r{q>Wg>w`8v@8L?i~TM7UG?;!vH6# -xJLaA|Nac4Kodb9G{NWpZYe*3wR=-yHrpbvLvcv6qo{MKQeB+WN*;wy8&#IYqvL+yN(;s{v%?wv_SP45F3yhlQ&B(lQ;jJ~?WR; -^ln`^47y3~0XW(P@Bhs{$*eyZUwaH+#Cp>OCj_^8XKMAD^S-+RHQL>!PGJUMGb5&*_Zl(mghtsATSsj -W}#1RbMU&X6`T&-`Dt0=M5N*qH=&zqYEm@r2CLZGgg`1%L+)fP_6!lh;@K -YkG=s|zuSdJy?R!)od7KY!&={L#SSNI02W;0Z_P(aygJ>3cOiN@kAt9b<$hGd(PYt8=BJRYs4Rh>6LZc-?BfcdvV64*t9DXn-6frCr6A!7)f3 -u@>ca4yW621M;?l;&XL%^;v)q)tbeijyZE$P3G*h7ofgJY4(i6i#7^WqhUq28q^`c`f6!9-l;;mLma( -|k`&xYp9-_5{nJ(t!1SST>9e@36a|M3sel11;MfAxe(_f~PU*@H};FQi&tEaBi5EFOzKcq{hgvrHYvx}oYS*4pjH -*902coY^0^Cf$zaZ@%vDL#sFS%?o<|6x1)HGM$&68v?*$0(sA>F!aU@S=uX@5L5T7qY@7@&2y9F06z?|`=RzADPbkbi*Is;JxfHsN033@afkK -ca;bk(&E)?T6BZiongnT+gWQ)aCs*PaV;tXNI>~1E#0!!K&R`_KLWh`!$E08!_1LtGBXir -?wjJA|DMeYHt^h@qfn=z(V2oas&^@ti>iwF<1=t*CE@DPB6y8?{1BNtGUP_^0y=5$(%FK_v7h1ocpYj -Nq8n7p1@|@0e#xSZ|}+hDef7XeZTD&fSa!A5@=6YM3=Qe^0oNotBnw^)A@@tk^%h-w?iaErPTgadrILwWYNc5C&)FJ#a*&`y&lJ9iq!*aaBg`q9Cz6lvt0p&ZJ1E|Os_#KBbLnYCm^K~Q^P(7BPA50t<94Wp{M#lWjDTOuV({medL-dTm{~5rGcA;FnZ$U -(@XKw;fgDm&@R#9fk~)w99=Efu=8sDqP^Oq)e`vDP`cyhh$c)!Azg>T( -mmOp=^IfKNSa748g#&c<{d1{p_`wjQ!n_41M0|7&Y%5;+pNHfjp1I!79%-0~p^zb;8IZ+Z6Y<^-|jzS -iX7%vycb+^7_d}a{w^xQ&Vf4$qV@hT*64-k=-L2>Dyj1wH_k4WdAz-Dg^V4@#$X%yKD9liY~Zd-L@d; -YGi{ca6vf2Tc@@8@tp3Fm$KgJA{QPXg0S@Pj2^Nl!;`R~e1b&K1sb1M&aQBhe1>Cpr$R56+HSgHMCE*I_iT)ijoLj}{7b(f9dr!Sr$XN(a`a|(=C)2sjlFky150C -|(EFk{4LaP1*U5{v{<-y58U-R`$iSyN)bz=RD5;T++;RG%+PuM&5hC#N-kP3?;KL@4&A86q1x96 -%H$Cg10utG)`==Y4re2^k^O+vA1W8<#IeO%x*&o)FN0LciEbcTd++j}{BOsEhp`e7?|Q$0r0ztKg|mIPS_}B -1V9Km8Xj*fUmphDSl<}fKigbf$)6zrkE(yHI@=ld#f%DZ9H;yy>5Ko -c<{q@#x=K5gz7>#i*&F@cjlKr{_x4* -APrPNsh~sxZsKj51*18NgdB68R%EEq+aAS`qmS!o?PjDhI6;$=%(-bmJDOjUE92)Upoel{Y3_jDC)(r -4Eo~OEdgUbZm{dJ1LqzTtI6!&P)h>@6aWAK2ml+0Wk?A(qmT0e0055!001KZ003}la4k44F)lDJWNCA -BEop9MZ!bheQ$tcoP*h1zPA+nDbd^-guG26O-TNy>Vu6Hi?0rN*s65nNg)ZyXO{R{)u_Jqu(!Xcyv`U -N01+t1V=P`3U&R_?zTCIe5?hy9d^Y#NoY(n3oZ?P3`JE9@gN)5XCp^f!M4rl6ummwO3UO7#eNHt@O=t -;fX?*xV5;20uUpGZ5$B-j=b%qp0q5N}|=nd_P?mlh{Gu*aaK4cUMp2Zw6Wk{$If`>?{t(2U$Ey&!Qxt -~>1wx?uihZmKVeL~jjMT|9uN0u^MqJ)fDn$b4!#{564m`9#3$B12akNS2zkXQAF=hoEdgu7rJ -dIa8kRcfgy{*&mI39B@6aWAK2ml+0Wk_!_`M4?o002Y)001Na003}la4k44F)lDJWNCABEop9M -Z!cwTbaHuLaBpdDbaO6rcyx -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 -x*zr7!^hr-x*L*8IF*IvD59k_`%xA_EiNR6rI -K5uXA-S)E4x#Z{+Uv&u&)b#R*-9240AD8(CrkNP7VgB;<>m4>a6z6p=pe1Vt8Ol?vRz_4$|8~LOE%ywRodzYJ6L=I -gS=f*3C=yK>|ys -()-4ue{zI|v|g>}%M6(uC%NQV}y&4RSy2%DX~gs(qT|J$15}*e`T=DfF?4J;gZ`l)2@L07AlFBX6nW= -9GumMHY@IyJY~hqSk}G*;{m_qZ@y$_im9O1k=rc5kAhhsm`Bb0)2O{{~^DNt6b|Xdu|tNz7=OdzY;Qg -At6uFq`B3UFp*DZn%UDCc#$?^BcN|^P-U7)-frm1rC6^*$c{Oo@k1vi4$Lqn{EfNcWLz#dI-0pHNF -D7*6DP0gxLnLo;T1`$rK>DhbXN;7lITmOLpWVbhSc$ORP}{`ey&e%}>OS_?HHgZ1b%@%lmmh1r8ffDlv6uK6J -aF=x^_|B2H4}u0gSqn8{n-$#=p=+H)zIGMT!=iuTJr?Sr!>80ZruUM4h4yKh4T~jz8Tq;LBD#->n)(P -H4~B>hfB+GIrQ)qmF-m@@z%lN(nrs<9WaOuAD33_>+7{U@0|b~R~;xHOLf1fxl|Sx*QO3 -Y%t`327J-T?b_9yPCxyRIKQ8SlICn^Ms8-IsMq%rVQ+pQUy1Fp9$6N>JN~nx#H=YSgI}+LQ;crmivh2 -{D?|qEZ1|W5WKh9{)U*&iLqn@ra0-p2UGkj?=c=EF4F#z(7b$Njw7H!jyU%B|8)4j-0IBc@X{FFw(v? -i^3Yp}bEJX+PoizRUd=q~&74#K}#j{g{{dmhbyz9!KKzz?b6Q-vcvnhxL{?>?ScV^t;gaAHyAyV?n;!~?!n+hc3Vb56hw0eVIcnZBrh(?jvN)3gPF)z4vZ=GBvX6tYA!; -btvq!)dt#lN17gbj#zCUrn9zSDqu)QZ>g!hD7DHBKH`qJuwdal^`%v`BPe)y8R9}%*XcGyKxu80BM?x -6%HjiwqO7t6{5LcpORHTP*;YQ(Wij33{;d$$bpKJ;p+Y;iuK-crE#g!>opwkTW3sy}$x11ic8Bd -L3=WLt7>6&Z=cD|~(cVC{v0bem2QMvZa)V0W8$c^AFEu>bkPr^0AM9+f_e#FMi{fozy!YM8EbG%b;zQ -u=*<2taAJC#QGP9SGv^dqL+He4hDZ{HR`SQ!+p(w64_IxA&B27G^AiILfuAio=gHv8kI@T`xqKCj1V> -KFO#5pzC%Thp~_SSIsvJ@O&FfB~Yx!I@!nJu#QgD)@G;q@wy1WU|f?ZK*R;v!65doCV!z1{!;<3A68` -umeZoI$CYNhJ0LiY-eZI4SYoSSL2GTNjFHa4Q48sL2jaxLll+A}Hbq>&VPj@O42)Ua4lAUx;?$E1 -zqy6OYTF0_%W;SE)(o5SyLjD)_km8T<{RE*=Bwak9p{q{y6q|FpVGdP||8*uwn)sqsx^oPSqln0s$Q3 -!X6B5KX3(1)eT^h;$_ot-)-+ty1c%{;pjajofl@$BlappA7yz5d3>rLS-7}H0*l6Qhk-eRwis*Rb7i; ->eC4xta-IR^Pjf4`?B@lYh=m5wuT1D5fRYVz1klL{V}*I8U3A>TKqVh_GeN|f-F*(cpU{6?clhOd1-@ -Cu`H)JQ|A_Itd&G%&X_>5r^ZtxGTtkYfej4tsBRwyOP~cD7|J9+B?k98b?$GGlYI@3Uk73qyGv|^=-$ -|QqlGSw|>#^yWTd+r=KQPQ$zHNEyhp$#928tQdzuLeZCn{KxTnRQGx98*&-c{)C1obLu%yAr`gT(->z5!lTXg?zrv9doKDF$Mf(0`}OtCXYX5FRciPo -X#fb`6d=CigL^M5t`&P&=|$aO@f!Sw&Pga3hJ@L#h_xJi)v-8UVc%0s-Z(>Ry -~3qrD1(Q!8=(^T+1`x2*{C*K_TcVXhm5KMU)eKU*eid?Y+%21%TM^B69BghRHggGg($ds1=kPj2N$A> -d)?qKA-l=ltIn;W|(z|plrYvwOHHnKx3L^pIk2hJ1*GF=DMP!A`hROEcyk*uYtxj9@$i`DI-gj6MT -R~$Qk0y!Qi4(l0)G0bRF`&$t@yKm>R%HGN>3 -{j&IG?<;7J_^66Rl3ZQ_2$N(!OK%w2V$}fVdx3#CmFe-^Nah`iW8eAU4=it6PuAD*I;K+)+2><f?VkK3c;9yt!!k5f9Cg0%A$NNSm8GH~qtx~}U%GY~$;3idK026;W%=B*IwK?I?y4c!`JwNY>E1N+2(~L -kH56tI7Bx+i_ZL6lL!JNQ$FMe=Q7t}N`gIGsq={gqZ7Xd@9I~DR_xFtm2Z}$cr`OhCO*jvQt^rUdL$q3jzGi5gZkRpqDM6T>^BBiRGgrhuoeMryD;`< -%mz}w{oc)nH_v3IoukrrECQlNq}0<1{B&O{AA2><|9Jnv?EqS?eb{^rNaCM=$5;a4kdbnQw4%zSo|Od -XQdQiPH~43WUw=*Xh6Ds$15dJKqB>`3@MTmOZ;DYW9}FE8jcu5d7ioT4*EOvv$)wnS2>P@y2nVjB8#g -RfXnrb!coTY~#8aDJgzMU?knz{hZx^5Q-oT}d4DJ)DdnncE)0UtkR2}sEW8}fgE{YD;Qc1=7kryX -Uw}^qM@|JMAE(D+RVVb4+cT1%J2)|L>DHO)bR|*$?x?)8!+>{D^9y|F%1xDhf!{!eR7jcwpU;!}tDdadpTcc)AAo~uErXCkbg_UUO5a|7%fN=g`QQ;o -#4g7HSM$;iS_^E%zE#t)k5quEgGTqKq*r;1eZ%iYF&|D0 -!DwV+DzD`Nfy+Oc)x#m0p9%j6pmB>A-U4{ilqf4^k$><4ab>XN95Q%4j9R&gz5}7Dy3yJXrS8x{d8&l -ANuFgds|r-LeEi7KHd!ap_R8vG4v7RbNO(m4v^_)EkxCneouEe{C?T{A95deQ{Kl_{IS%cGk9bPr(2| -&-Pmvef_L*7n{C0kM0@vY-yW@y60jK_s2u{o`@{d>hc*uLB>y;eoszV;UllkxLws>`Y2PiT+4V(_J$0 -O{tVmnu$UUp&XNC(v=y&Mvi9cLn_I=CkW%Wgh%OTgyAQS^Nyi`4sd7x9&K&*wczYZ4cE5dcXVjJoj|3 -bTS`(+G-s#4%y|z+NZPy@xBcjQ;%{@Zaq_LdlR;!0p39)eGg3A@}TdyTb -je7Q|ydRyP$btWwZ#l9m#9BW)*7>MF_2RShaJe~$#jhmWNCoMBQ9!w6_SBZiW5oLo{sax1ss7lTQm`F -G+-x?Q`w&w-((<(j9^4deF39vz?k{9x1s8z0qtBMKcLnhaIE%~nqtPAXESX*7zIhEg8G=wM@1^DeBlm32DX{D~($Pl~j6_p%)fhj}Ji-MM9EioEC3z9^rT@6tm1BN*S0t9DOhA|3VG@Fzz? -UA6LIxeIKiR)OuY7+~JzrSX`xqdGTh1#7hI|Z2AsEib80h#BNzIg1-yO|DZSE5374cIWW}o0}64$E%U -lN97{HlbsT&2dgPMdJ%pN*HJ{8K_8zPLLw%1_S%=eSu2~9sAeQy4QbMj2+(l3uxg{xrl%~XpvXZWIXA -36p>Fx_|Q{*3_RMq!-uQ}Oc87GlB_dFUd94d>*dT%Khhn>5EQ}sypkL}FiF!7zCec6p$ZbL=+{aVPhO -s+r}-?I8U9zWf(WwkOkNNa`OZ;%)5{BK1{Gu~G{M;(!uI)M0s16^8Xy -+6Y1~sE)~<6hM&cOmV2Jqcn0zT?a(Iz^p9xCDOJ(64g=e^6s#q7B2Ix`p%JOy-dfg~5+tA5x7v()%w; -amM&EmSZd1Y)5QpCOj{DB#uz$2^M>L+tjp?b24mo1$m-Wzv*;r@u+Uq@Ej%HmGe!Yf};ISRnImObJwp -t=aSWc?<Vq2V5#Yd9Q%iPj=90mH)sH~_ZSH7E8U -Jv#{hIGdkTL7t+?_RlX=4AB_Tx<5(yroxQDw*{uc(7WU*B1glIDZn~YfO{n!E;|B3$-kb~lWU80!G{Q -Uy^W? ->Qph)4!qlijXj7S};O~XN-F6I9~_N=}~}@GY+l5E~?<3Cz#NvAg3FPGTnjXyRiBVUlVPb`RSD6$`7-={!sZK(B8>7OPa|C!wOcK -U$PcZYVp)#In)y#eo<`cY;eGqYyNtz@HeDyu@T*b($aHtoPYv*LX}6M3Z>qmWpNX&mOW)~uBOLB(H74 -V3;Lah`hw{5HT2%B9m2#}6<^83SR#O2Iv72$g??lylgjU8lSLq7g9Ea;6!@>tdDxN&`Dx#d(mfKF1D? -b;^{Nd<5c;@y231%y@AqM-Zl=7c?_?!b=XnA9*ZUR^;U}&RHNwj|wmKNJAH9w1cVfA4lUL| -(|IbJiJqMbVoPN?7D8wKQ#StJk$sw)-QZE}qHI5V^#S4b73!B#t~``UFsl<+&b02II`+Z1PtW{b0Q@c -6IKNHp>}+9{{O=4ha|xk*rZj2f@Ic!#0XM>foQ)kf)FWnI<}X<%9yaYmYAUp -SkI0PmMoe`5PIIm@nZjph@ugIQP;u9E*)%zmRmh@7rzs9uXrE3>@Dh0lok*K}DN^zrAlB-*Gklfk+so -`@W3A&R|2JnI+-EqraE7(v7nP#-gqbN=yIe|_L?`S7-qZYUxe8W$WFsL&>dPJUrYhao?AuIp0NVa?`z -KWT;14m$*g!M`@iTN~En>s{%Rj8zL<{3E6b3aSeO!Q-NdQb(kpRS1rQn7(YYmB1}K2FcAL|CXur>ol0 -k)bDe@{wG6to!_Dk6i#B2Ze>oC*qKD9XFDvWmO4}QxwAtSrb{@!Va+D;@V^&BPu6hh^RmptchaN?BUH -IJsoCyNz0BB@tEPoB=o-yHP1TGPd+%;#C7#)5o&UXH_IuK_kK^K<@xn<94APv}j2LdxV>R_Od+yE;$e -tVj+|Q6hJI>(@iSs|#p8u=G{b8l=lnAAl=zTp4YMmn7wsaPE9yNysV57aXab0r87DZeR?Ah0+jekiw) -nD(Yew`Qs-g -olK1&<9^75c35$g+T1eVjPUN+cme&r&o2Ejufb1eAA$*iQyv`QYf~gRki6w>cXYsW;1a{9sVI39=1OM -??&%JN-ru8qPge!sDNV9h=o@1Vl`gedjCatmbbbLrH@xfv)6IlTieo4ZEb;ju^t}uCw~WKrT3Y9{RaV -88xh9ezQbe24oMi%b+65^?%Ma!vHRb8*;mfv(*ix;=&Ocb=vz)c4+X%JBPV#rCNhPF6*uAILRkakThot^w8gDCc_pjK9QM@Qsok}j-$gDI@2fzfG}A< -&F?~MURPwC?A%_BTPrcyaH`hEc2mzl?Qjx2G@gR=vK0MuRuAzp!LmxWcV6JGagZxQogACzOA7S8hwOX4E$OO%(7m1mjcvNl%}_*4{S>9e$SP?F4`#YmI>2{&sghY~) -CK#=_Ng)QZ`j(V`4H;Ynn1d0b637@UpwZOQJ{TTN0RmC6uw?_AQ=P#@U7>2K@fVsPx_wm%Q~sz^<{U< -EL0VaJw$BVgg8KvCf>y>31rY7_>`oF!D3Iu4n_WKlt0OmJT9XT&qOWrt|s~_AL@K2*R#bmVo5G&(Lmk -#a0}Lg+Xu!)($mWh{Rr4ddY`jQzw|N2#>sM -*~PlwHk%&&X_xp0D(XH{};1=*24ZjZgTuH-}B{foqjA6#WSD9E8Q>p4d_9gHY!3I+qz^i_9(RMWly=8 -e7nY2#O`qPz4PtQob^~%Z-<*@gn0=UzicIjAesDhMBAfGyUNKpTn;WXiZanCRPLAImZ-nCBLA7PU7Bs -4!|=)}97On}5Y7~G*CJ|7e0rFth%{3@8~BVeiH4R0Mrjay*jyO!=c?_m^YEJjcwN$2e_D$hT~rx;CAt -3Sb)0IZ&5#W0rLcJ6k>_Gokm*MH$IR~&WwV98K90O7|4_!YF21VBNoGkyKpZgmn&PgqL_){2-ffMg%# -vX>4zVVkcLe$8BH1V2k6))S_r0>W5B*Um)CU*)m0n^^ai(vbdISkM%iRFzR2Rdq&-&kAXtw)%4|>gQ;l_c&io9vADyWR@rj7}Bz;Ay8EyEDWg -iEu%_BbwF9~U^bjJ5xY+}?0=y9QWIe6ojH_e54$iTx3Y|}pI9mD&LPw2lcpfBH3kTOO^S7!ApGr}*Vl -}n-M%X^@vNQq)vY|^(6F9({ld?IpY*eB?L`EX+6g9wKCqkEg*M@!J8btwK9A8Q0$RQjwi4d -Xj%GNqr!Dn(c@716(2;07+)j3YaHw$mWM|Bh_TtGJn7H!g1|-f73< -aya3!>Gg!?Rtkbjc>yec -WXYhG -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 -87>8v@nYvru3kCoHClUYv7XSbN0000000000q=D(r003}la4%nWWo~3|axY(BX>MtBUtcb8c~DCM0u% -!j0000802qg5NbNO<|2jJW03bL402lxO00000000000HlE_)&Kx-X>c!Jc4cm4Z*nhbaA9O*a%FRKE^ -v8JO928D0~7!N00;mWhh<3T|Hs8ejsO7rXaWEj00000000000001_fte8j0B~t=FJE?LZe(wAFK~HqV -RCb6Zf7oVc~DCM0u%!j0000802qg5NMIfZjb;G=00jd802lxO00000000000HlEwpaB4IX>c!Jc4cm4 -Z*nhkWi57PZe(wAE^v8JO928D0~7!N00;mWhh<11d%OzI2><}}CIA2z00000000000001_fv}+g0B~t -=FJE?LZe(wAFLGsca(QWPXD)DgP)h*<6ay3h000O87>8v@nOIF)NF4wGl63$85&!@I0000000000q=B -@n0RV7ma4%nWWo~3|axZgfcrI{xP)h*<6ay3h000O87>8v@cLsvS0s#O3Gy(tsA^-pY0000000000q= -78S0RV7ma4%nWWo~3|axY(PVRCC_a%^d0FJE72ZfSI1UoLQYP)h*<6ay3h000O87>8v@E)(3O#svTXi -w^(*ApigX0000000000q=9bA0RV7ma4%nWWo~3|axY(PVRCC_a%^d0FKuCRYh`kCE^v8JO928D0~7!N -00;mWhh<1k04`9j0000k0RR9b00000000000001_fpgFS0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD -5X>MtBUtcb8c~DCM0u%!j0000802qg5NZM3Jr2_&004N0j03ZMW00000000000HlFq(E$K(X>c!Jc4c -m4Z*nhVVPj}zV{dMBa&K%eUt?`#E^v8JO928D0~7!N00;mWhh<3dkaS%61ONbJ5C8xp000000000000 -01_fuz#`0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gJCVQ_S1axQRrP)h*<6ay3h000O87>8v@5~{}VE -CB!j76SkPApigX0000000000q=DYp0RV7ma4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zE^v8JO928D -0~7!N00;mWhh<245=-#T0001>0RR9Z00000000000001_fl1l{0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^ -QY%gPPZE#_9E^v8JO928D0~7!N00;mWhh<2|ZU^lH4*&qfG5`Q300000000000001_fmhoB0B~t=FJE -?LZe(wAFJob2Xk}w>Zgg^QY%gPPZgg^QY;0w6E^v8JO928D0~7!N00;mWhh<1X0weXI0{{Sc2mk;l00 -000000000001_fu8CC0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gYMY-M+HVQ_F|axQRrP)h*<6ay3h0 -00O87>8v@4pbie!36*SEf4?zCIA2c0000000000q=AI)0RV7ma4%nWWo~3|axY_HV`yb#Z*FvQZ)`7U -Wp#3Cb98BAb1rasP)h*<6ay3h000O87>8v@+l{C1;s*c#p%?%FB>(^b0000000000q=AX_0RV7ma4%n -WWo~3|axY_HV`yb#Z*FvQZ)`7fWpZg@Y-xIBE^v8JO928D0~7!N00;mWhh<2Md&NS$0002;0RR9a000 -00000000001_fv)@k0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP)h*<6ay3h000O87> -8v@o*h>F%K!iXaRC4TD*ylh0000000000q=Bpb0RV7ma4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb -1z?CX>MtBUtcb8c~DCM0u%!j0000802qg5NWrHD|62tB0L%>l04)Fj00000000000HlGx{s91RX>c!J -c4cm4Z*nhVVPj}zV{dMBa&K%eV_{=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000O87>8v@(}>1YrU3u -|%>w`cE&u=k0000000000q=97w0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!mbWNC9>V_{ -=xWiD`eP)h*<6ay3h000O87>8v@J+sw;vj6}9@Bjb+AOHXW0000000000q=8ok0swGna4%nWWo~3|ax -Y_VY;SU5ZDB88UukY>bYEXCaCuNm0Rj{Q6aWAK2mly|Wk^01r(cT$007(x000~S0000000000005+cN -CyG{aA|NaUv_0~WN&gWV{dG4a$#*@FJW$TX)bViP)h*<6ay3h000O87>8v@Qt3xxUJ3vJNhJUPBLDyZ -0000000000q=5|!0swGna4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4c~DCM0u%!j0000802qg -5NKvz{bX)=e04E0k03rYY00000000000HlGe6#@WoX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<=+>b7d -}Yc~DCM0u%!j0000802qg5NDXbGJxm1v0QD3A0384T00000000000HlFP7yc!Jc4cm4Z*nhVZ) -|UJVQpbAcWG`jGA?j=P)h*<6ay3h000O87>8v@cY9|c;spQzk{AF09{>OV0000000000q=C;J0swGna -4%nWWo~3|axY_VY;SU5ZDB8WX>N37a&0bfc~DCM0u%!j0000802qg5NDkTJ5?uiR07U`-03QGV00000 -000000HlHLBLV<$X>c!Jc4cm4Z*nhWX>)XJX<{#5UukY>bYEXCaCuNm0Rj{Q6aWAK2mly|Wk|wI*vL; -R007jU0012T0000000000005+ch$R95aA|NaUv_0~WN&gWWNCABY-wUIV{dJ6VRSBVc~DCM0u%!j000 -0802qg5NR=n$qQNcz00+VV03QGV00000000000HlEuPyzsOX>c!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VR -L0JaCuNm0Rj{Q6aWAK2mly|Wk})%&Rhu<008h&000~S0000000000005+c5Pt#yaA|NaUv_0~WN&gWW -NCABY-wUIX>Md?crI{xP)h*<6ay3h000O87>8v@PXTaUNHPEbJ;eY39{>OV0000000000q=8eE0swGn -a4%nWWo~3|axY|Qb98KJVlQlOV_|e}a&sc!Jc4cm4Z*nhWX>)XJX<{#JVQy(=Wpi{caCuNm0Rj{Q6aWAK2mly|Wk@{{t^$ -n*004>@0015U0000000000005+cRn`IkaA|NaUv_0~WN&gWWNCABY-wUIZDDe2WpZ;aaCuNm0Rj{Q6a -WAK2mly|Wk?|d40fR-001tR0018V0000000000005+c9^L`~aA|NaUv_0~WN&gWWNCABY-wUIZDn*}W -MOn+E^v8JO928D0~7!N00;mWhh<1}ilb_N3jhFoDF6T<00000000000001_f&2jj0B~t=FJE?LZe(wA -FJx(RbZlv2FLGsbZ*_8GWpgfYc~DCM0u%!j0000802qg5NMOM+MF|oB0Czh803HAU00000000000HlG -q4FdphX>c!Jc4cm4Z*nhWX>)XJX<{#PV{&P5baO6nc~DCM0u%!j0000802qg5NaFr9;HRnp003M802= -@R00000000000HlHa9|HhzX>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cx6ya0Rj{Q6aWAK2mly|Wk_sly$ -n^j0001f0RS5S0000000000005+c-O2+1aA|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4&!O928D0~7!N0 -0;mWhh<3N$QxUUIRF5h$^ZZx00000000000001_fop>V0B~t=FJE?LZe(wAFJx(RbZlv2FLiWjY%Xwl -P)h*<6ay3h000O87>8v@ZX30fuo(aVpIiU{9smFU0000000000q=7BH1ORYpa4%nWWo~3|axY|Qb98K -JVlQ@Oa&u{KZZ2?nP)h*<6ay3h000O87>8v@eno%c!Jc4cm4Z*nhWX>)XJX<{#THZ(3}cx6ya0Rj{Q6aWAK2mly|Wk`L%oge=s004uS000~S0 -000000000005+c8v@BkyPY -!vFvP5&-}JDF6Tf0000000000q=6k+1^{qra4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y --E^v8JO928D0~7!N00;mWhh<2wiZ5l(0RRBY0{{Re00000000000001_fhSo80B~t=FJE?LZe(wAFJx -(RbZlv2FJEF|V{344a&#|kX>(&PaCuNm0Rj{Q6aWAK2mly|Wk@us(aK01001&%001Wd000000000000 -5+cI9mn)aA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4ygb#!TLE^v8JO928D0~7!N00;mWhh<1_7 -67gG0RR9w3IG5r00000000000001_fyH+Q0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|qd2?fL -Zf0p`E@NhAP)h*<6ay3h000O87>8v@5kE*E=pFz7PH6xDDgXcg0000000000q=5u_1^{qra4%nWWo~3 -|axY|Qb98KJVlQ7}VPk7>Z*p`mb9r-PZ*FF3XD)DgP)h*<6ay3h000O87>8v@p+h)ZV_5(I(`f+!C;$ -Ke0000000000q=7V<1^{qra4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCuNm0Rj{Q6a -WAK2mly|Wk^n#XWg#>000XE001BW0000000000005+c-SP$iaA|NaUv_0~WN&gWXmo9CHEd~OFJE72Z -fSI1UoLQYP)h*<6ay3h000O87>8v@kCt+f%t-(MSyKT3ApigX0000000000q=Cxx1^{qra4%nWWo~3| -axZ9fZEQ7cX<{#9Z*FsRVQzGDE^v8JO928D0~7!N00;mWhh<0wZXB%tL;wI|$^if)00000000000001 -_fz>_-0B~t=FJE?LZe(wAFKBdaY&C3YVlQZPZEQ7gVRCb2axQRrP)h*<6ay3h000O87>8v@I?pK#1rz -`P#XtZ6AOHXW0000000000q=6NL2LNzsa4%nWWo~3|axZ9fZEQ7cX<{#FXkm0^cx`MhaCuNm0Rj{Q6a -WAK2mly|Wk{WBhzZjk006Oj001KZ0000000000005+cSeOR@aA|NaUv_0~WN&gWXmo9CHEd~OFKKRYb -#!xda%Ev{E^v8JO928D0~7!N00;mWhh<2|Pk2IT6aWB>MF0RH00000000000001_fo!)20B~t=FJE?L -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 -O87>8v@^O+-nf(iftnbY -EXCaCuNm0Rj{Q6aWAK2mly|Wk@UD@+Tq#003MH001Na0000000000005+cReA^jaA|NaUv_0~WN&gWY -;R+0W@&6?FKlUUYiw_0Yi4O|WiD`eP)h*<6ay3h000O87>8v@Att(^b0000000000 -q=C782mo+ta4%nWWo~3|axZLeV{2w2mk=e7XSbw00000000000001_fp38b0B~t=FJE?LZe(wAFKlmPYi4O|WiN1PWNdF^Yi4O|WiD`eP)h -*<6ay3h000O87>8v@yM^$*2?YQEf)xM&CIA2c0000000000q=Cwb2mo+ta4%nWWo~3|axZLeV{2w8v@ks}G&Jp%v$I0^s&CjbBd0000000000q=6TY2 -mo+ta4%nWWo~3|axZLeV{2wc!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCYHUtcb8c~DCM0u%! -j0000802qg5NP%{i$`}Cv009C303iSX00000000000HlFqln4NDX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE -72ZfSI1UoLQYP)h*<6ay3h000O87>8v@=4ndf%K-oYTmt|AAOHXW0000000000q=CAX2mo+ta4%nWWo -~3|axZXUV{2h&X>MmPUt@1=aA9;VaCuNm0Rj{Q6aWAK2mly|Wk~w{q!M!h004*u001Na00000000000 -05+c!VP|P>XD?rKbaHiLbairNb1rasP)h*<6ay3h000O87>8v@jitS0 -R|xMmPZDDe2WpZ;aaCuNm0Rj{ -Q6aWAK2mly|Wk{|OpYwMH008F@001Qb0000000000005+c4WkGEaA|NaUv_0~WN&gWaA9L>VP|P>XD@ -PPadl~OWo>0{baO6nc~DCM0u%!j0000802qg5NPI -c!Jc4cm4Z*nhiVPk7yXK8L{FLQ8ZV`*k-WpZ;aaCuNm0Rj{Q6aWAK2mly|Wk|*9Cl3(;005-{0015U0 -000000000005+cm%<1DaA|NaUv_0~WN&gWaA9L>VP|P>XD@YhX>4;YaCuNm0Rj{Q6aWAK2mly|Wk?S1 -#-U*i001N{001BW0000000000005+cVP|P>XD@bTa&u{KZZ2?nP)h* -<6ay3h000O87>8v@<8HPM%5nezyQTpEB>(^b0000000000q=AFc2mo+ta4%nWWo~3|axZXeXJ2w?y-E^v8JO928D0~7!N00;mWhh<3mT5*h$1ONcf3jhEh00000000000001_fsjNA0B -~t=FJE?LZe(wAFK}{iXL4n8b1z?CX>MtBUtcb8c~DCM0u%!j0000802qg5NDsqC12hBx0DTGo02=@R0 -0000000000HlFnNeKXOX>c!Jc4cm4Z*nhia&KpHWpi^cVqtPFaCuNm0Rj{Q6aWAK2mly|Wk@Q2@h}eq -007Fa%FRKFJo_YZggdGE^v8JO928D0~7! -N00;mWhh<34><>=+0{{Rf3jhEg00000000000001_ff-Q=0B~t=FJE?LZe(wAFK}{iXL4n8b1!IRY;a -|Ab1rasP)h*<6ay3h000O87>8v@cL-8@=mG!$A_V{d9{>OV0000000000q=8XY2>@_ua4%nWWo~3|ax -ZXlZ)b94b8|0qaA|ICWpXZXc~DCM0u%!j0000802qg5NFF!1U*rP-0M`cq03ZMW00000000000HlF-S -P1}dX>c!Jc4cm4Z*nhkWpQ<7b98erUtei%X>?y-E^v8JO928D0~7!N00;mWhh<2LedO8`5&!^KL;wIF -00000000000001_ftXwg0B~t=FJE?LZe(wAFLGsZb!BsOb1z|JVQ_S1a&slM04o&$02=@R00000000000HlHGZV3QzX>c!Jc4cm4Z*nhkWpQ<7b98erVQ^_KaCuNm0Rj -{Q6aWAK2mly|Wk^n4a3uT)004d+000~S0000000000005+cXLJbwaA|NaUv_0~WN&gWa%FLKWpi|MFJ -X0bXfAMhP)h*<6ay3h000O87>8v@nJPeOk;?)Ah(ZMb9{>OV0000000000q=B7%2>@_ua4%nWWo~3|a -xZdaadl;LbaO9bVPj=-bS`jZZBR=A0u%!j0000802qg5NUbq1j%EP>0A&II0384T00000000000HlFy -NelpRX>c!Jc4cm4Z*nhkWpQ<7b98erV`Xx5b1rasP)h*<6ay3h000O87>8v@RNlqhFaiJoy#)XO9smF -U0000000000q=5`e3;=Lxa4%nWWo~3|axZdaadl;LbaO9bZ*6d4bS`jtP)h*<6ay3h000O87>8v@T0@ -2o4-)_Y>q7tl9{>OV0000000000q=9%%3;=Lxa4%nWWo~3|axZdaadl;LbaO9bZ*Oa9WpgfYc~DCM0u -%!j0000802qg5NTf4CqRImR0N4ru03rYY00000000000HlG$Uc!Jc4cm4Z*nhkWpQ<7b98erW -q4y{aCB*JZgVbhc~DCM0u%!j0000802qg5NL~Wtym|ou0RI920384T00000000000HlG=WDEdsX>c!J -c4cm4Z*nhkWpQ<7b98erXm4+8b1rasP)h*<6ay3h000O87>8v@9zrO+2q6FfU2*^b9smFU000000000 -0q=AEG3;=Lxa4%nWWo~3|axZdaadl;LbaO9lZ)9a`b1rasP)h*<6ay3h000O87>8v@SpPz^=o$b3;9m -d$AOHXW0000000000q=CnW3;=Lxa4%nWWo~3|axZdaadl;LbaO9rWpi_BZ*FrgaCuNm0Rj{Q6aWAK2m -ly|Wk`vp!m9BE007Vo001Na0000000000005+c?V=0-aA|NaUv_0~WN&gWa%FLKWpi|MFLQKZbaiuIV -{c?-b1rasP)h*<6ay3h000O87>8v@Y?BG2Z3F-Sp$h;2A^-pY0000000000q=6u)3;=Lxa4%nWWo~3| -axZdaadl;LbaO9rbaHiLbairNb1rasP)h*<6ay3h000O87>8v@pq;?0h#UX_RaF209RL6T000000000 -0q=C(>3;=Lxa4%nWWo~3|axZdaadl;LbaO9tbZKmJE^v8JO928D0~7!N00;mWhh<2fI48xq0ssJL1po -jk00000000000001_fsn}z0B~t=FJE?LZe(wAFLGsZb!BsOb1!gVV{2h&WpgiIUukY>bYEXCaCuNm0R -j{Q6aWAK2mly|Wk_*sO8kui000jK001!n0000000000005+ckjxAKaA|NaUv_0~WN&gWa%FLKWpi|MF -K}UFYhh<)b1!3PVRB?;bT40DX>MtBUtcb8c~DCM0u%!j0000802qg5NO7FMF?W#w0HQ(x05Jdn00000 -000000HlFz&kO)?X>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7a%5$6FJftDHD+>UaV~IqP)h* -<6ay3h000O87>8v@{(u<-8v_6Ulm-9*GXMYp0000000000q=7PF4FGUya4%nWWo~3|axZdaadl;LbaO -9oVPk7yXJvCQV`yP=WMyAWpXZXc~DCM0u%!j0000802qg5NO`hXSu+Fx0LTdd05bpp00 -000000000HlGQWDNjtX>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7a%5$6FJow7a%5$6Wn*+Ma -CuNm0Rj{Q6aWAK2mly|Wk~pt!T=5l000Uk0021v0000000000005+cB54f(aA|NaUv_0~WN&gWa%FLK -Wpi|MFK}UFYhh<)b1!3PVRB?;bT4CQVRB??b98cPVs&(BZ*DGdc~DCM0u%!j0000802qg5NI8k6pL7H -O0M8Bp06PEx00000000000HlG3at#1*X>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7a%5$6FJo -w7a&u*LXL4_KaBy;OVr6nJaCuNm0Rj{Q6aWAK2mly|Wk~oL=!07W003?W001@s0000000000005+cRC -f&kaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1!3PVRB?;bT4CQVRCb2bZ~NSVr6nJaCuNm0Rj{Q6 -aWAK2mly|Wk|r;5H#Qe000gN0027x0000000000005+c1A7esaA|NaUv_0~WN&gWa%FLKWpi|MFK}UF -Yhh<)b1!3PVRB?;bT4CXWNB_^b97;JWo=<&XlZU`E^v8JO928D0~7!N00;mWhh<10``tNF0ssJo1ONa -p00000000000001_fjoZ=0B~t=FJE?LZe(wAFLGsZb!BsOb1!gVV{2h&WpgiMXkl_>WppoNZ*6d4bS` -jtP)h*<6ay3h000O87>8v@{8hluwgLbEHw6FyG5`Po0000000000q=DLj4FGUya4%nWWo~3|axZdaad -l;LbaO9oVPk7yXJvCQV`yP=WMy8v@s|F^gTaCuNm0Rj{Q6aWAK2mly|Wk{@iyhRHI003SN001-q0000000000005+cRFe$=aA|NaUv_0~WN&gWa -%FLKWpi|MFK}UFYhh<)b1!3PVRB?;bT4IfV`^}4a&KZ~axQRrP)h*<6ay3h000O87>8v@D&#JauTua3 -nzH}^G5`Po0000000000q=B)R4FGUya4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQV`yP=WMy8v@1+&KF83O8v -@IgRuU>p}nktBe2uGXMYp0000000000q=B_G4ghdza4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCQV`y -P=WMyX>c!Jc4cm4Z*nhkWpQ<7b98eraA9L>VP|D?FJow7a%5$6FK1#hGchu7a&KZ~axQRrP)h*<6ay3h0 -00O87>8v@WppoUX>(?BWpOTWc~DCM0u% -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 -Z*FrgaCuNm0Rj{Q6aWAK2mly|Wk^%Y8e< -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 -qg5NMDYCn`s3A0K^gi02lxO00000000000HlFDau5J;X>c!NZ*6U1Ze(*WWN&wFY;R#?E^v8JO928D0 -~7!N00;mWhh<2d;BB130{{Tl3IG5W00000000000001_f!lWw0B~t=FJo_QZDDR?b1!CcWo3G0E^v8J -O928D0~7!N00;mWhh<3kiR`4k0ssI#1^@sQ00000000000001_fzf*q0B~t=FJo_QZDDR?b1!INb7(G -bc~DCM0u%!j0000802qg5NFEl@ovHx<0M-Kl02BZK00000000000HlGyeh>g~X>c!NZ*6U1Ze(*WXk~ -10E^v8JO928D0~7!N00;mWhh<1iN_{}o4FCXpIsgC{00000000000001_ft-L40B~t=FJo_QZDDR?b1 -!Lbb97;BY%XwlP)h*<6ay3h000O87>8v@#0hnoA_o8f^c(;H6aWAK0000000000q=BW55CCv#a4%zTZ -Eaz0WOFZUX>)WgaCuNm0Rj{Q6aWAK2mly|Wk_e);O~M4005~H000&M0000000000005+c`IQg=aA|Na -V{dJ3VQyq|FLPyKa${&NaCuNm0Rj{Q6aWAK2mly|Wk`_8RAB7}006fZ000yK0000000000005+cubdD -7aA|NaV{dJ3VQyq|FLP*bcP?;wP)h*<6ay3h000O87>8v@tBDyu&;tMfL<;}_82|tP0000000000q=C -+(5CCv#a4%zTZEaz0WOFZdZfS0FbYX04E^v8JO928D0~7!N00;mWhh<3YVc>?^2LJ$Q9RL6o0000000 -0000001_fz_uF0B~t=FJo_QZDDR?b1!#jWo2wGaCuNm0Rj{Q6aWAK2mly|Wk@y+(}?N@002D_000&M0 -000000000005+c;;#?@aA|NaV{dJ6VRSEFUukY>bYEXCaCuNm0Rj{Q6aWAK2mly|Wk`aerI$?=001~z -000;O0000000000005+c0JjhTaA|NaV{dJ6VRSEKX=8L_Z*FF3XD)DgP)h*<6ay3h000O87>8v@+ZWg -^AO-*c4iEqU82|tP0000000000q=AFX5CCv#a4%zTZE#_9FK=>WWpZU?WNBk`E^v8JO928D0~7!N00; -mWhh<2r8fUyg0000-0000M00000000000001_f!fj#0B~t=FKusRWo&aVUtei%X>?y-E^v8JO928D0~ -7!N00;mWhh<1;PBLxb0002z0RR9K00000000000001_flt#A0B~t=FKusRWo&aVX>Md?crI{xP)h*<6 -ay3h000O87>8v@000000ssI2000008UO$Q0000000000q=8}75CCv#a4&CgWpZJ3X>V?GFJE72ZfSI1 -UoLQYP)h*<6ay3h000O87>8v@7(YXzQv?72&<_9r7ytkO0000000000q=B2%5CCv#a4&CgWpZJ3X>V? -GFJ^LOWqM^UaCuNm0Rj{Q6aWAK2mly|Wk_6U(iwmN000yL000vJ0000000000005+cB-s!EaA|Naa%F -KZUtei%X>?y-E^v8JO928D0~7!N00;mWhh<2Ffb8jM4FCX`E&u=%00000000000001_fz{a%0B~t=FL -GsZFLGsZUuJ1+WiD`eP)h*<6ay3h000O87>8v@gLngh0WAOk6|w*T761SM0000000000q=9ee5CCv#a -4&LYaW8UZabIa}b97;BY%XwlP)h*<6ay3h000O87>8v@aV6nM1t0(bIDP;C5&!@I0000000000q=BRq -5dd&$a4&LYaW8UZabI&~bS`jtP)h*<6ay3h000O87>8v@1xCbhPzV43@frXC7ytkO0000000000q=DH -q5dd&$a4&LYaW8UZabIN0LVQg$JaCuNm0Rj{Q6aWAK2mly|Wk}Z|2_Ui|004_?000#L00000000 -00005+cUp)~3aA|Nab#!TLb1z?CX>MtBUtcb8c~DCM0u%!j0000802qg5NKHPJqDu(?0N5S?02BZK00 -000000000HlFLUl9OsX>c!fbZKmJFJW+SWNC79E^v8JO928D0~7!N00;mWhh<333{5To0ssIY1pojN0 -0000000000001_fx&1I0B~t=FLiWjY;!MSb!lv5E^v8JO928D0~7!N00;mWhh<0+=*X>c!fbZKmJFJ*3HZ)9n1XD)DgP)h*<6ay3h000O87>8v@@4;ZW@&6?b9r-gWo<5Sc~DCM0u%!j0000802 -qg5NU1dG1bqYm05S^z022TJ00000000000HlFkaS;G;X>c!fbZKmJFKA(NXk~LQaCuNm0Rj{Q6aWAK2 -mly|Wk_cx*Lbr80093C000yK0000000000005+c3w99zaA|Nab#!TLb1!UfXJ=_{XD)DgP)h*<6ay3h -000O87>8v@NL1MBi3R`wPZa4;ZZ*_EJVRU6=E^v8JO928 -D0~7!N00;mWhh<1aDh6Y$0002+0000T00000000000001_fvkZM0B~t=FLiWjY;!MjWps6LbZ>8Lb6; -Y0X>4RJaCuNm0Rj{Q6aWAK2mly|Wk}`Xkd8GIS4FCW=FaQ7(00000000000001_fg+I+0B~t=FLq;dFJE72Z -fSI1UoLQYP)h*<6ay3h000O87>8v@`@qb_GX($u+YSH#5dZ)H0000000000q=7u25dd&$a4&Xab1!0H -dSPL5E^v8JO928D0~7!N00;mWhh<2dtfO+}3jhG>CjbBr00000000000001_fu5uh0B~t=FLq;dFK20 -VE^v8JO928D0~7!N00;mWhh<24Vrm^>1ONb#4FCWX00000000000001_fv>O;0B~t=FLq;dFKuOVV|8 -+AVQemNc~DCM0u%!j0000802qg5NExwS)msVx0Pi6H02KfL00000000000HlFJwGjYtX>c!gV{ct#E-@}JE@WwQbS-IaW^XTLZgg^aUvO_}Zgg`lba-@7O928D0~7!N00;mZhh<1 -Krn6jT0ssK%1pojc00000000000001_fpEeR0B~t=EjTVQE-)@+X>)WfX>Mk3FKuOXVPs)+VJ>QOZ*E -Xa0Rj{Q6aWAK2ml+0Wk|;#m%;`B000C4001EX0000000000005+c6~z$%aA|NYI4&_RFfL?ib960fZf -0*UbZ>B9Y-M(3Y%X+obWlqH0u%!j0000802_y8NUPg|6JG!T0B!&P02u%P00000000000HlFh#Ss8-X ->ct#E-@}JE@WwQbS-IaW^XT7NJT|VP)h*<6ay3h000O88;4~`PLE`xYy$uQItc&(8~^|S0000000000 -q=E3o5dd&$a4k44F)lDJWNCABEop9MZ!b+nR6#^RR6$Tn0Rj{Q6aWAK2ml+0Wk^aClT-vO0016a000^ -Q0000000000005+cmdOzSaA|NYI4&_RFfL?ib960fZf0*UQbj{gQbbTo1qJ{B008#@_W-0%007eU5dZ -)H -""" - - -if __name__ == "__main__": - main() diff --git a/tools/gpio_0.bat b/tools/gpio_0.bat deleted file mode 100644 index d8fa62b8..00000000 --- a/tools/gpio_0.bat +++ /dev/null @@ -1 +0,0 @@ -curl --digest -u admin:441b1702 -X PUT http://192.168.1.1/api/control/gpio/CGPIO_CONNECTOR_OUTPUT -d data="0" diff --git a/tools/gpio_1.bat b/tools/gpio_1.bat deleted file mode 100644 index 5e336ffb..00000000 --- a/tools/gpio_1.bat +++ /dev/null @@ -1 +0,0 @@ -curl --digest -u admin:441b1702 -X PUT http://192.168.1.1/api/control/gpio/CGPIO_CONNECTOR_OUTPUT -d data="1" \ No newline at end of file diff --git a/tools/install.bat b/tools/install.bat deleted file mode 100644 index 9ff9b624..00000000 --- a/tools/install.bat +++ /dev/null @@ -1 +0,0 @@ -pscp.exe -pw 441b1702 -v RouterSDKDemo.tar.gz admin@192.168.1.1:/app_upload \ No newline at end of file diff --git a/tools/ll.bat b/tools/ll.bat deleted file mode 100644 index 90f58098..00000000 --- a/tools/ll.bat +++ /dev/null @@ -1 +0,0 @@ -dir /O %1 %2 %3 diff --git a/tools/ls.bat b/tools/ls.bat deleted file mode 100644 index 90b66e50..00000000 --- a/tools/ls.bat +++ /dev/null @@ -1 +0,0 @@ -dir /O /D %1 %2 %3 diff --git a/tools/make_load_settings.py b/tools/make_load_settings.py deleted file mode 100644 index 756698e0..00000000 --- a/tools/make_load_settings.py +++ /dev/null @@ -1,347 +0,0 @@ -""" -Fancier, "Load settings", including converting a "settings.ini" into -settings.json - -The Router SDK Sample design is the following: -1) confirm ./{project}/settings.ini exists, and there is [application] section -2) if ./{project}/settings.ini, [application] section lacks "uuid", add one -3) if ./{project}/settings.ini, [application] section lacks "version", add 1.0 -4) if make has '-i' option, the open ./{project}/settings.ini and increment - "version" minor value -5) look for ./config/settings.ini, if found read this in -6) look for ./{project}/settings.ini, read this in, smartly over-laying - sections from ./config -7) return the final settings as python dictionary (not saved!) -""" -import logging -import os -import os.path -import shutil - -from cp_lib.load_settings_ini import DEF_SETTINGS_FILE_NAME, DEF_INI_EXT, \ - load_sdk_ini_as_dict, SECTION_APPLICATION, SECTION_LOGGING, \ - SECTION_ROUTER_API - -DEF_SAVE_EXT = ".save" - -DEF_VERSION = "1.0" - - -def validate_project_settings(app_dir_path, increment_version=False): - """ - 1) Confirm a project settings.ini exists, else throw exception - 2) confirm it has an [application] section, else throw exception - 3) confirm [application] section has "uuid", add random one if not - 4) confirm [application] section has "version", add "1.0" if not - 5) if increment_version is True, then increment MINOR value of a - pre-existing version - - :param str app_dir_path: the subdirectory path to the settings.ini file - :param bool increment_version: if True, increment MINOR value from version - :return None: - """ - - # 1) Confirm a project settings.ini exists, else throw exception - if not os.path.isdir(app_dir_path): - # validate that {project}.settings.ini exists - raise FileNotFoundError("SDK app directory not found.") - - # 2) confirm it has an [application] section, else throw exception - file_name = os.path.join(app_dir_path, DEF_SETTINGS_FILE_NAME + - DEF_INI_EXT) - logging.debug("Confirm {} has [application] section".format(file_name)) - if not _confirm_has_application_section(file_name): - raise KeyError("SDK app settings.ini requires [application] section") - - # 3) confirm [application] section has "uuid", add random one if not - logging.debug("Confirm {} has 'uuid' value".format(file_name)) - fix_up_uuid(file_name) - - # 4) confirm [application] section has "version", add "1.0" if not - # 5) if increment_version is True, then increment MINOR value of a - # pre-existing version - logging.debug("Confirm {} has 'version' value".format(file_name)) - increment_app_version(file_name, increment_version) - - return - - -def load_settings(app_dir_path=None, file_name=None): - """ - - :param str app_dir_path: relative directory path to the app directory - (ignored if None) - :param str file_name: pass in alternative name - mainly for testing, - else use DEF_FILE_NAME - :return dict: the settings as Python dictionary - """ - if file_name is None: - file_name = DEF_SETTINGS_FILE_NAME - - _sets = load_sdk_ini_as_dict(app_dir_path, file_name) - - # handle any special processing - if SECTION_APPLICATION in _sets: - _sets = _special_section_application(_sets) - else: - raise KeyError("Application config requires an [application] section") - - if SECTION_LOGGING in _sets: - _sets = _special_section_logging(_sets) - # this doesn't need to exist - - if SECTION_ROUTER_API in _sets: - _sets = _special_section_router_api(_sets) - # this doesn't need to exist - - return _sets - - -def _special_section_application(sets): - """Handle any special processing for the [application] INI section""" - if "name" not in sets[SECTION_APPLICATION]: - raise KeyError("config [application] section requires 'name' setting") - - if "path" not in sets[SECTION_APPLICATION]: - # if no path, assume matches NAME setting - sets[SECTION_APPLICATION]["path"] = sets[SECTION_APPLICATION]["name"] - - return sets - - -def _special_section_logging(sets): - """Handle any special processing for the [logging] INI section""" - return sets - - -def _special_section_router_api(sets): - """Handle any special processing for the [router_api] INI section""" - - # if we have password, but no USER, then assume user is default of "admin" - if "password" in sets[SECTION_ROUTER_API] and \ - "user_name" not in sets[SECTION_ROUTER_API]: - sets[SECTION_ROUTER_API]["user_name"] = "admin" - - return sets - - -def _confirm_has_application_section(ini_name): - """ - Run through the text file, confirm it has [application] section. - Although we desire ONLY [application], we allow INI to have - [Application] or any case-mix - - Throw FileNotFoundError is the file doesn't exist! - - :param str ini_name: the relative file name of the INI to test - :return bool: T if [application] was found, else F - """ - if not os.path.isfile(ini_name): - raise FileNotFoundError( - "Project INI file missing:{}".format(ini_name)) - - # logging.debug("_confirm_has_application_section({})".format(ini_name)) - - file_han = open(ini_name, "r") - try: - for line in file_han: - if _line_find_section(line, 'application'): - # logging.debug("Section [application] was found") - return True - finally: - file_han.close() - - return False - - -def _line_find_section(line, name): - """ - Given a line from file, confirm if this line is like [section], - ignoring case - - :param line name: the source line - :param str name: the section name desired - :return bool: - """ - if line is None: - return False - - # remove all white space - line = line.strip() - if len(line) < 2 or line[0] != '[': - # then line is not [section], so no need to even compare - return False - - return line.lower().startswith('[' + name.lower() + ']') - - -def fix_up_uuid(ini_name, use_uuid=None, backup=False): - """ - Given a new UUID, write into INI (if it exists) - - :param str ini_name: the INI file name (assume exists at this point) - :param str use_uuid: optional UUID string to use - :param bool backup: T to backup INI - :return: - """ - global _uuid - - def _do_my_tweak(old_line): - """ - Create our special line - - :param old_line: - :return str: the line to include in file - """ - import uuid - global _uuid - - if old_line is None or old_line == "": - # we hit end-of-section [application] without finding "uuid" - logging.debug("Fix UUID - adding random, because it is missing") - if use_uuid is None: - _uuid = uuid.uuid4() - return "uuid=%s\n" % _uuid - - elif use_uuid is None: - # logging.debug("Fix UUID - keep it as is") - return old_line + '\n' - - else: # we are replacing the line, but don't care about the old - return "uuid=%s\n" % uuid.uuid4() - - _uuid = use_uuid - - # logging.debug("Fix UUID - try INI as {}".format(ini_name)) - _find_item_in_app_section(ini_name, 'uuid', _do_my_tweak, backup) - return - - -def increment_app_version(ini_name, incr_version=False, backup=False): - """ - Find an existing "version" string as major/minor and incr it - - :param str ini_name: - :param bool incr_version: - :param bool backup: T to backup INI - :return: - """ - global _incr_ver - - def _do_my_tweak(old_line): - """ - Create our special line - - :param old_line: - :return str: the line to include in file - """ - global _incr_ver - from cp_lib.split_version import split_version_string - - if old_line is None or old_line == "": - # we hit end-of-section [application] without finding "version" - # logging.debug("Fix Version - adding, because it is missing") - version = DEF_VERSION - - elif _incr_ver: - # we have old line, so parse it in & incr - offset = old_line.find("=") - assert offset >= 0 - value = old_line[offset + 1:].strip() - major, minor, patch = split_version_string(value) - minor += 1 - version = "%d.%d.%d" % (major, minor, patch) - logging.debug( - "Fix Version - increment from {} to {}".format(value, version)) - - else: - # logging.debug("Fix Version - use old line({})".format(old_line)) - # there is old line, but we're NOT incrementing - return old_line + '\n' - - # here we are changing the old line - either adding, or incrementing - return "version=%s\n" % version - - _incr_ver = incr_version - - # then exists, first walk through, find [application] - # logging.debug("Increment APP version - try INI as {}".format(ini_name)) - _find_item_in_app_section(ini_name, 'version', _do_my_tweak, backup) - - return - - -def _find_item_in_app_section(ini_name, set_name, process, backup=False): - """ - Scan INI file for [application] section, seek either the requested item, - or end of the app section, call 'process' to explain what to do - - :param str ini_name: the INI file name (assume exists at this point) - :param str set_name: - :param process: the process call-back - :param bool backup: T to backup INI - :return: - """ - # logging.debug("Seek tag({}) in {}".format(set_name, ini_name)) - state_start = 0 - state_in_app = 1 - state_past = 2 - - state = state_start - - lines = [] - - file_han = open(ini_name, "r") - for line in file_han: - - if state == state_start: - # seek the [application] section - we have not found yet - if _line_find_section(line, SECTION_APPLICATION): - # logging.debug("Found [application]") - state = state_in_app - - elif state == state_in_app: - # we have seen the [application] section, so seek 'set_name' - # or end of section - clean_line = line.strip() - if len(clean_line) < 1: - result = process(None) - # logging.debug( - # "Hit end of section, add line ({})".format(result.strip())) - lines.append(result) - state = state_past - # continue down & append the blank line - - elif clean_line.startswith(set_name): - result = process(clean_line) - # logging.debug( - # "Found {}, add line ({})".format(set_name, result.strip())) - lines.append(result) - state = state_past - continue # loop up, no append of old data - - else: # we are past our spot - pass - - lines.append(line) - - # handle if we hit EOF before blank line - if not, we should be in - # state 'state_past' - if state == state_in_app: - result = process(None) - # logging.debug("Hit end of file, add line ({})".format(result)) - lines.append(result) - - file_han.close() - - if backup: - shutil.copyfile(ini_name, os.path.join(ini_name + DEF_SAVE_EXT)) - - # rewrite the file - force to Linux - file_han = open(ini_name, 'wb') - for line in lines: - line = line.strip() + '\n' - file_han.write(line.encode()) - file_han.close() - - return diff --git a/tools/make_package_ini.py b/tools/make_package_ini.py deleted file mode 100644 index aee7205e..00000000 --- a/tools/make_package_ini.py +++ /dev/null @@ -1,90 +0,0 @@ - -from cp_lib.split_version import split_version_string -""" -Make a file such as: -[RouterSDKDemo] -uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c -vendor=Cradlebox -notes=Router SDK Demo Application -firmware_major=6 -firmware_minor=1 -restart=true -reboot=true -version_major=1 -version_minor=6 -""" - -DEF_FILE_NAME = "package.ini" - - -def make_package_ini(sets, output_file_name): - """ - Assuming we have a 'standard' settings file as dict, create the - ECM-expected file. - - :param dict sets: - :param str output_file_name: - :return: - """ - data_lines = [] - app_sets = sets["application"] - - # [RouterSDKDemo] - data_lines.append("[%s]" % app_sets["name"]) - data_lines.append("uuid=%s" % app_sets["uuid"]) - - value = app_sets.get("vendor", "customer") - data_lines.append("vendor=%s" % value) - value = app_sets.get("description", "") - data_lines.append("notes=%s" % value) - - value = app_sets.get("restart", "False").lower() - data_lines.append("restart=%s" % value) - value = app_sets.get("reboot", "False").lower() - data_lines.append("reboot=%s" % value) - value = app_sets.get("auto_start", "True").lower() - data_lines.append("auto_start=%s" % value) - - value = app_sets.get("firmware", "6.1") - major, minor, patch = split_version_string(value) - data_lines.append("firmware_major=%s" % major) - data_lines.append("firmware_minor=%s" % minor) - data_lines.append("firmware_patch=%s" % patch) - - value = app_sets.get("version", "0.1") - major, minor, patch = split_version_string(value) - data_lines.append("version_major=%s" % major) - data_lines.append("version_minor=%s" % minor) - data_lines.append("version_patch=%s" % patch) - - - _han = open(output_file_name, 'w') - for line in data_lines: - _han.write(line + "\n") - _han.close() - - return - - -if __name__ == "__main__": - - import os - - settings = { - "application": { - "name": "tcp_echo", - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1TEST", - "description": "Basic TCP echo server and client", - "version": "1.3" - }, - "base": { - "vendor": "MySelf, Inc.", - "firmware": "6.1", - "restart": True, - "reboot": True, - } - } - - ini_name = os.path.join("test", DEF_FILE_NAME) - - make_package_ini(settings, ini_name) diff --git a/tools/module_dependency.py b/tools/module_dependency.py deleted file mode 100644 index 81e8a311..00000000 --- a/tools/module_dependency.py +++ /dev/null @@ -1,264 +0,0 @@ -""" -Obtain module dependencies for Cradlepoint SDK -""" - -import os.path - -# from make import EXIT_CODE_MISSING_DEP - - -class BuildDependencyList(object): - - # these are modules on Cradlepoint FW with Python 3.3 (/usr/lib/python3.3) - COMMON_STD_MODULES = [ - "OpenSSL", "__future__", "abc", "argparse", "base64", "bisect", - "calendar", "cgi", "chunk", "cmd", "code", "codecs", "codeop", - "collections", "configparser", "contextlib", "copy", "copyreg", - "ctypes", "datetime", "dateutil", "difflib", "dnslib", "dnsproxy", - "dummy_threading", "email", "encodings", "fnmatch", "functools", - "getopt", "gettext", "glob", "gzip", "hashlib", "heapq", "hmac", - "html", "http", "importlib", "io", "ipaddress", "json", "keyword", - "linecache", "locale", "logging", "lzma", "mailbox", "mimetypes", - "numbers", "os", "pickle", "pkgutil", "platform", "pprint", - "py_compile", "pyrad", "queue", "quopri", "random", "re", "reprlib", - "runpy", "serial", "shlex", "smtplib", "socket", "socketserver", - "sre_compile", "sre_constants", "sre_parse", "ssl", "stat", "string", - "stringprep", "struct", "subprocess", "tarfile", "telnetlib", - "textwrap", "threading", "token", "tokenize", "traceback", "tty", - "types", "urllib", "uu", "uuid", "weakref", "xml", - - # these exist on router, but you probably should not be using! - # are either Cradlepoint-specific, or obsolete, or depend on STDIO - # access you lack; shutil & tempfile in this list because large file - # ops on router flash is risky - "_compat_pickle", "_pyio", "_strptime", "_weakrefset", "bdb", - "compileall", "cProfile", "cp", "cpsite", "dis", "genericpath", - "imp", "inspect", "lib-dynload", "opcode", "pdb", - "posixpath", "shutil", "ssh", "tempfile", "tornado", "warnings", - - # exist, but not in /usr/lib/python3.3? builtin? - # maybe inside cradlepoint.cpython-33m? - "binascii", "errno", "fcntl", "ioctl", "gc", "math", - "pydoc", "select", "sys", "time" - ] - - # others? _ssh.cpython-33m.so, cradlepoint.cpython-33m.so - - # these are used in sys.platform != CP router only - COMMON_PIP = [ - "requests", "requests.auth", "requests.exceptions" - ] - - def __init__(self): - - # # load the CP sample built-in list, will be of form: { - # # "cp_lib.clean_ini": [], - # # "cp_lib.cp_logging": ["cp_lib.hw_status", - # "cp_lib.load_settings"], - # # } - # json_name = os.path.join("tools", "module_dependency.json") - # file_han = open(json_name, "r") - # self._cp_lib_details = json.load(file_han) - # file_han.close() - - self.dep_list = [] - - self.ignore_pip = False - - self.logger = None - - return - - def add_file_dependency(self, file_name=None): - """ - Given a single file which ends in .py, scan for import lines. - - :param str file_name: - :return: - """ - # self.logger.debug("add_file_dependency({0})".format(file_name)) - - if not isinstance(file_name, str): - raise TypeError - - if not os.path.exists(file_name): - raise FileNotFoundError( - "module_dependency: file({}) doesn't exist.".format(file_name)) - - if not os.path.isfile(file_name): - raise FileNotFoundError( - "module_dependency: file({}) doesn't exist.".format(file_name)) - - value = os.path.splitext(file_name) - # should be like ('network\\tcp_echo\\tcp_echo', '.py') or - # ('network\\tcp_echo', '') - # self.logger.debug("value({})".format(value)) - if value[1] != ".py": - # self.logger.debug( - # "module_dependency: file({}) is not PYTHON (.py)normal file.") - return None - - # at this point, the file should be a .PY file at least - file_han = open(file_name) - for line in file_han: - offset = line.find("import") - if offset >= 0: - # then we found a line - tokens = line.split() - - if len(tokens) >= 2 and tokens[0] == "import": - # then like "import os.path" or "import os, sys, socket" - - if tokens[1][-1] != ",": - # then is like "import os.path" - self.logger.debug("add_file_dep:{}".format(tokens[1])) - self.add_if_new(tokens[1]) - - else: # like "import os, sys, socket" - for name in tokens[1:]: - self.logger.debug("token({})".format(name)) - if name[-1] == ',': - value = name[:-1] - else: - value = name - self.add_if_new(value) - - elif len(tokens) >= 4 and tokens[0] == "from" and \ - tokens[2] == "import": - # then is like "from cp_lib.cp_self.logger import - # get_recommended_logger" - self.add_if_new(tokens[1]) - - file_han.close() - - # self.logger.debug("module_dependency: {}".format(self.dep_list)) - return self.dep_list - - def add_if_new(self, new_name): - """ - Given new module, see if already known or to be skipped - - :param str new_name: the gathering list of names - :return int: return count of names added - """ - # self.logger.debug("add_if_new({0})".format(new_name)) - - if new_name in self.COMMON_STD_MODULES: - # scan through existing STD LIB like "self.logger", "sys", "time" - # self.logger.debug("Mod({}) is in std lib.".format(new_name)) - return 0 - - # if self.ignore_pip and new_name in self.COMMON_PIP: - if new_name in self.COMMON_PIP: - # scan through existing STD LIB like "requests" - self.logger.debug("Mod({}) is in PIP lib.".format(new_name)) - return 0 - - # handle importing sub modules, like os.path or self.logger.handlers - if new_name.find('.') >= 0: - # then we have a x.y - name = new_name.split('.') - if name[0] in self.COMMON_STD_MODULES: - # self.logger.debug("Mod({}) is in std lib.".format(new_name)) - return 0 - - if new_name in self.dep_list: - # scan through existing names - self.logger.debug("Mod({}) already known.".format(new_name)) - return 0 - - # if still here, then is a new name - self.logger.debug("Mod({}) is NEW!".format(new_name)) - - # convert from network.tcp_echo.ftplib to network/tcp_echo/ftplib - path_name = new_name.replace('.', os.sep) - - added_count = 0 - if not os.path.isdir(path_name): - # only ADD is not a subdirectory - self.dep_list.append(new_name) - added_count = 1 - - # handle is file or sub-directory - self.logger.info("_add_recurse:{} {}".format(path_name, new_name)) - added_count += self._add_recurse(path_name, new_name) - - return added_count - - def _add_recurse(self, path_name, dot_name): - """ - Assume new_name is like "network/tcp_echo/xmlrpc/" or - "network/tcp_echo/ftplib.py" - - :param str path_name: the path name, like "network/tcp_echo/xmlrpc" - :param str dot_name: the dot name, like "network.tcp_echo.xmlrpc" - :return int: return if files were added - """ - # self.logger.debug( - # "_add_recurse({0},{1})".format(path_name, dot_name)) - - added_count = 0 - if os.path.isdir(path_name): - # then is module, such as xmlrpc, with includes: - # network/tcp_echo/xmlrpc/__init__.py - # network/tcp_echo/xmlrpc/client.py - # network/tcp_echo/xmlrpc/server.py - self.logger.debug("Recurse into directory ({})".format(path_name)) - - dir_list = os.listdir(path_name) - for name in dir_list: - if name == "__pycache__": - self.logger.debug( - " skip known skipper ({})".format(name)) - continue - - if name == "test": - self.logger.debug( - " skip known skipper ({})".format(name)) - continue - - if name[0] == ".": - self.logger.debug( - " skip pattern skipper ({})".format(name)) - continue - - # still here, see if file or subdirectory - file_name = os.path.join(path_name, name) - if os.path.isdir(file_name): - # then another sub-directory - added_count += self._add_recurse( - file_name, dot_name + '.' + name) - - else: # assume is a file? - # for example, name=client.py - if name.endswith(".py"): - self.dep_list.append(file_name) - added_count += 1 - try: - self.logger.debug( - "Recurse into s-file ({})".format(file_name)) - self.add_file_dependency(file_name) - - except FileNotFoundError: - self.logger.error( - "Could NOT find above dependency within" + - "({})".format(file_name)) - # sys.exit(EXIT_CODE_MISSING_DEP) - - else: - # expects network.tcp_echo.xmlrpc.something.txt - value = path_name + os.sep + name - self.logger.debug( - "Add file as dependency({})".format(value)) - self.dep_list.append(value) - added_count += 1 - - else: - # might be file, like network/tcp_echo/ftplib.py as - # network.tcp_echo.ftplib - if not path_name.endswith(".py"): - path_name += ".py" - self.logger.debug("Recurse into d-file ({})".format(path_name)) - self.add_file_dependency(path_name) - - return added_count diff --git a/tools/package_application.py b/tools/package_application.py deleted file mode 100644 index 35ac9295..00000000 --- a/tools/package_application.py +++ /dev/null @@ -1,228 +0,0 @@ -#!tools/bin/python - -# changes by Lynn: -# add the package.ini to the MANIFEST hash table -# in the MANIFEST hash table, force use of linux "/" separator in json text file -# use the Python modules tarfile and gzip, do not 'shell' to Linux -# make sure the 'package'ing directory is in the build subdirectory - -import configparser -import logging -import hashlib -import json -import os -import re -import shutil -import sys -import time -import uuid -from OpenSSL import crypto - -META_DATA_FOLDER = 'METADATA' -CONFIG_FILE = 'package.ini' -SIGNATURE_FILE = 'SIGNATURE.DS' -MANIFEST_FILE = 'MANIFEST.json' - -BYTE_CODE_FILES = re.compile('^.*\.(pyc|pyo|pyd)$') -BYTE_CODE_FOLDERS = re.compile('^(__pycache__)$') - - -def file_checksum(hash_func=hashlib.sha256, file=None): - h = hash_func() - buffer_size = h.block_size * 64 - - with open(file, 'rb') as f: - for buffer in iter(lambda: f.read(buffer_size), b''): - h.update(buffer) - return h.hexdigest() - - -def hash_dir(target, hash_func=hashlib.sha256): - hashed_files = {} - for path, d, f in os.walk(target): - for fl in f: - # if fl == CONFIG_FILE: - # continue - # we need this be LINUX fashion! - if sys.platform == "win32": - # swap the network\\tcp_echo to be network/tcp_echo - fully_qualified_file = path.replace('\\', '/') + '/' + fl - else: # else allow normal method - fully_qualified_file = os.path.join(path, fl) - hashed_files[fully_qualified_file[len(target) + 1:]] =\ - file_checksum(hash_func, fully_qualified_file) - - return hashed_files - - -def pack_package(app_root, app_name): - """ - :param app_root: build\\network\\tcp_echo - :param app_name: tcp_echo - :return: - """ - import tarfile - import gzip - - base = None - if app_root.startswith("build"): - base = "build" - app_root = app_root[6:] - os.chdir("build") - - # we'll make "tcp_echo.tar.gz" - logging.debug("pack TAR:%s.tar" % app_name) - tar_name = "{}.tar".format(app_name) - tar = tarfile.open(tar_name, 'w') - # this will add the sub-directory recursively - tar.add(app_root) - tar.close() - - logging.debug("gzip archive:%s.tar.gz" % app_name) - gzip_name = "{}.tar.gz".format(app_name) - with open(tar_name, 'rb') as f_in: - with gzip.open(gzip_name, 'wb') as f_out: - shutil.copyfileobj(f_in, f_out) - - if base is not None: - os.chdir("..") - - return - - -def create_signature(meta_data_folder, pkey): - manifest_file = os.path.join(meta_data_folder, MANIFEST_FILE) - with open(os.path.join(meta_data_folder, SIGNATURE_FILE), 'wb') as sf: - checksum = file_checksum(hashlib.sha256, manifest_file).encode('utf-8') - if pkey: - sf.write(crypto.sign(pkey, checksum, 'sha256')) - else: - sf.write(checksum) - - -def clean_manifest_folder(app_metadata_folder): - path, dirs, files = next(os.walk(app_metadata_folder)) - - for file in files: - fully_qualified_file = os.path.join(path, file) - os.remove(fully_qualified_file) - - for d in dirs: - shutil.rmtree(os.path.join(path, d)) - - -def clean_bytecode_files(app_root): - for path, dirs, files in os.walk(app_root): - for file in filter(lambda x: BYTE_CODE_FILES.match(x), files): - os.remove(os.path.join(path, file)) - for d in filter(lambda x: BYTE_CODE_FOLDERS.match(x), dirs): - shutil.rmtree(os.path.join(path, d)) - pass - - -def package_application(app_root, pkey): - """ - - :param str app_root: root path, such as "network/tcp_echo" - :param pkey: encryption key - :return: - """ - # app_root = os.path.real path(app_root) - if app_root[-1] == '/': - # this routine (or os.path.basename()) doesn't like trailing dir slash - app_root = app_root[:-1] - logging.debug("app_root:%s" % app_root) - - # expect like "network/tcp_echo/package.ini" - app_config_file = os.path.join(app_root, CONFIG_FILE) - logging.debug("app_config_file:%s" % app_config_file) - - # expect like "network/tcp_echo/METADATA" - app_metadata_folder = os.path.join(app_root, META_DATA_FOLDER) - logging.debug("app_metadata_folder:%s" % app_metadata_folder) - - # expect like "network/tcp_echo/METADATA/MANIFEST.json" - app_manifest_file = os.path.join(app_metadata_folder, MANIFEST_FILE) - logging.debug("app_manifest_file:%s" % app_manifest_file) - - config = configparser.ConfigParser() - config.read(app_config_file) - if not os.path.exists(app_metadata_folder): - os.makedirs(app_metadata_folder) - - for section in config.sections(): - app_name = section - assert os.path.basename(app_root) == app_name - - clean_manifest_folder(app_metadata_folder) - - clean_bytecode_files(app_root) - - pmf = dict() - pmf['version_major'] = int(1) - pmf['version_minor'] = int(0) - - app = dict() - app['name'] = str(section) - logging.debug("app['name']:{}".format(app['name'])) - try: - app['uuid'] = config[section]['uuid'] - except KeyError: - if not pkey: - app['uuid'] = str(uuid.uuid4()) - else: - raise - app['vendor'] = config[section]['vendor'] - app['notes'] = config[section]['notes'] - app['version_major'] = int(config[section]['version_major']) - app['version_minor'] = int(config[section]['version_minor']) - app['firmware_major'] = int(config[section]['firmware_major']) - app['firmware_minor'] = int(config[section]['firmware_minor']) - app['restart'] = config[section].getboolean('restart') - app['reboot'] = config[section].getboolean('reboot') - app['auto_start'] = config[section].getboolean('auto_start') - # this actually makes an INVALID format, because it uses localtime, - # but adds no time-zine offset! - # app['date'] = datetime.datetime.now().isoformat() - app['date'] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) - - data = dict() - data['pmf'] = pmf - data['app'] = app - - app['files'] = hash_dir(app_root) - - with open(app_manifest_file, 'w') as f: - f.write(json.dumps(data, indent=4, sort_keys=True)) - - create_signature(app_metadata_folder, pkey) - - logging.debug("app_root:{}".format(app_root)) - logging.debug("section:{}".format(section)) - pack_package(app_root, section) - - print( - 'Package {}.tar.gz created'.format(section)) - - -def argument_list(args): - print('{} '.format(args[0])) - - -if __name__ == "__main__": - - logging.basicConfig(level=logging.DEBUG) - - if len(sys.argv) < 2: - argument_list(sys.argv) - else: - - private_key = None - if 2 < len(sys.argv): - with open(sys.argv[2], 'r') as pf: - private_key = crypto.load_privatekey( - type=crypto.FILETYPE_PEM, buffer=pf.read(), - passphrase='pass'.encode('utf-8')) - - logging.debug("app:%s" % sys.argv[1]) - package_application(sys.argv[1], private_key) diff --git a/tools/pscp.exe b/tools/pscp.exe deleted file mode 100644 index 81f638e4c0e9657063cc27a44f4debaf716c05b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352256 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

KC)bpUHERkv10~6Js0zs@U)5TD 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

yS!7Iywd!88JNgbRvHVihGuK@W|yCk{ykwf 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 diff --git a/tools/py35.bat b/tools/py35.bat deleted file mode 100644 index 7dab2559..00000000 --- a/tools/py35.bat +++ /dev/null @@ -1,5 +0,0 @@ -set PATH=%PATH%;C:\Python35 - -d: -cd \root -set PYTHONPATH=D:\root; diff --git a/tools/set_ip.bat b/tools/set_ip.bat deleted file mode 100644 index 5b7c9b92..00000000 --- a/tools/set_ip.bat +++ /dev/null @@ -1,4 +0,0 @@ -REM ['runas', '/user:lily-lyn\\Administrator', 'netsh', 'interface', 'ip', 'set', 'address', -REM '"Local Addin ENet"', 'static', '192.168.115.6', '255.255.255.0'] - -runas /noprofile /user:lily-lyn\lynn "netsh interface ip set address \"ENet USB-1\" static 192.168.1.6 255.255.255.0" diff --git a/tools/stop.bat b/tools/stop.bat deleted file mode 100644 index 71953090..00000000 --- a/tools/stop.bat +++ /dev/null @@ -1,6 +0,0 @@ -REM curl -s --digest --insecure -u admin:441b1702 -H "Accept: application/json" -X PUT http://192.168.1.1/api/control/system/sdk/action -d "stop 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" -REM {"data": {"exception": "key", "key": "data"}, "success": false} -REM curl -s --digest --insecure -u admin:441b1702 -H "Accept: application/json" -X PUT http://192.168.1.1/api/control/system/sdk/action -d data="stop 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" -REM curl -s --digest --insecure -u admin:441b1702 -H "Accept: application/json" -X PUT http://192.168.1.1/api/control/system/sdk/action -d data='"stop 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' - -curl -s --digest --insecure -u admin:441b1702 -X PUT http://192.168.1.1/api/control/system/sdk/action -d data='{"data:"stop 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"}' diff --git a/tools/target.py b/tools/target.py deleted file mode 100644 index 3797de40..00000000 --- a/tools/target.py +++ /dev/null @@ -1,1021 +0,0 @@ -import ipaddress -import logging -import os -import subprocess -import sys - -from cp_lib.app_base import CradlepointAppBase -# from cp_lib.cs_client import CradlepointClient - -DEF_TARGET_INI = "config/target.ini" -DEF_INTERFACE = "Local Area Connection" -DEF_COMPUTER_IP_LAST_OCTET = 6 - -PING_COUNT = 3 - -# set this to True to force the router's syslog message to include -# the UTF8 flag, else set to False -SYSLOG_UTF8_FLAG = False - -# suppress interface show like: Configuration for interface "Loopback ... -LIST_INTERFACE_NO_LOOPBACK = True - -# suppress interface show like: Config for interface "VMware or VirtualBox -LIST_INTERFACE_NO_VM = True - - -class TheTarget(CradlepointAppBase): - - ACTION_DEFAULT = "show" - ACTION_NAMES = ("ping", "reboot", "set", "show", "syslog") - ACTION_HELP = { - "ping": "Ping my router", - "reboot": "Reboot my router", - "set": - "given an alias/nickname, edit the ./config/settings.ini to match", - "show": "Show Interfaces / IP Info", - "syslog": - "Check router 'system logging' - show status, force to be syslog", - } - - def __init__(self): - """Basic Init""" - from cp_lib.load_settings_ini import copy_config_ini_to_json - - if not os.path.isfile("./config/settings.json"): - # make sure we have at least a basic ./config/settings.json - copy_config_ini_to_json() - - # we don't contact router for model/fw - will do in sanity_check, - # IF the command means contact router - CradlepointAppBase.__init__(self, call_router=False, log_name="target") - - self.action = self.ACTION_DEFAULT - - self.verbose = True - - # the one 'target' we are working on (if given) - self.target_alias = None - - # the data loaded from the TARGET.INI file - self.target_dict = None - - # the one computer interface we are targeting - self.target_interface = DEF_INTERFACE - - # save IP related to target and/or the interface - self.target_my_ip = None - self.target_my_net = None - self.target_router_ip = None - - return - - def run(self): - """Dummy to satisfy CradlepointAppBase""" - return - - def main(self): - """ - - :return int: code for sys.exit() - """ - - result = 0 - self.logger.info("Target Action:{0}".format(self.action)) - - # the data loaded from the TARGET.INI file - self.target_dict = self.load_target_ini() - - try: - self.target_interface = self.settings["router_api"]["interface"] - except KeyError: - pass - - self.target_my_ip, self.target_my_net = self.get_interface_ip_info( - self.target_interface) - - self.logger.info("Target Alias:{0}".format(self.target_alias)) - self.logger.info("Target Interface, Name:{0}".format( - self.target_interface)) - self.logger.info("Target Interface, PC IP:{0}".format( - self.target_my_ip)) - self.logger.info("Target Interface, Network:{0}".format( - self.target_my_net)) - - if self.action == "ping": - result = self.action_ping() - - elif self.action == "set": - result = self.action_set() - - elif self.action == "show": - result = self.action_show() - - elif self.action == "syslog": - result = self.action_syslog() - - return result - - def action_ping(self, name=None): - """ - Attempt to ping the router - - :param str name: optional alias name, matching a section in TARGET.INI - """ - if name is None: - # note that target_alias might also be None - name = self.target_alias - - ping_ip = self.get_router_ip(name) - - result = 0 - - if ping_ip is None: - if name is not None: - # then - self.logger.debug( - "PING - assume HOST can resolve name:{}".format(name)) - ping_ip = ipaddress.IPv4Address(name) - else: - self.logger.error("Cannot PING - not enough target info given") - result = -1 - - if ping_ip is not None: - if sys.platform == "win32": - command = ["ping", "-n", str(PING_COUNT), ping_ip.exploded] - else: - command = ["ping", "-c", str(PING_COUNT), ping_ip.exploded] - - result = subprocess.call(command) - if result: - self.logger.error( - "PING {} failed - return code:{}".format(ping_ip, result)) - else: - self.logger.info("PING {} was good".format(ping_ip)) - - return result - - def action_reboot(self, name=None): - """ - Go to our router, and reboot it - - :param str name: optional alias name, matching a section in TARGET.INI - :return int: value intended for sys.exit() - """ - if name is None: - # note that target_alias might also be None - name = self.target_alias - - reboot_ip = self.get_router_ip(name) - - self.logger.info( - "Reboot our active development router({})".format(reboot_ip)) - url = "http://{0}/api/control/system/reboot".format( - self.get_router_ip()) - # we do need the 2nd quotes here - # data = {"data": '\x7A\x16'} - data = {"data": "true"} - - # result = self._do_action(url, data=data, post=True) - # if result == 0: - # self.logger.info("SDK reboot successful") - - return 0 - - def action_set(self, name=None, ini_name=None): - """ - Given a alias from target.ini, edit the ./config/settings.ini to - make the alias the active target - - :param str name: the alias or section name in target.ini to use - :param str ini_name: optionally, change the name of the - ./config/settings.ini (for testing) - :return: - """ - from cp_lib.load_settings_json import DEF_GLOBAL_DIRECTORY, \ - DEF_SETTINGS_FILE_NAME - - if name is None: - # if nothing passed in, assume is the alias from command line - name = self.target_alias - - if ini_name is None: - # if no alternative file name passed in, - # use default of "./config/settings.ini" - ini_name = os.path.join(DEF_GLOBAL_DIRECTORY, - DEF_SETTINGS_FILE_NAME + ".ini") - - if name not in self.target_dict: - self.logger.error("SET failed - target name {} is unknown") - return -1 - - # these are the only supported fields in section [router_api] - user_name = self.target_dict[name].get("user_name", None) - interface = self.target_dict[name].get("interface", None) - local_ip = self.target_dict[name].get("local_ip", None) - password = self.target_dict[name].get("password", None) - - if local_ip is None: - syslog_ip = None - else: - syslog_ip = self.make_computer_ip(local_ip) - - self.logger.debug("SET: open file:{}".format(ini_name)) - try: - with open(ini_name) as _file_han: - source = _file_han.readlines() - - except FileNotFoundError: - self.logger.error( - "SET failed - settings file {} not found".format(ini_name)) - return -1 - - dst = [] - state = "out" - changed = False - for line in source: - value = line.strip() - - if len(value) == 0: - # these always copy verbatim, but we reset to no special mode - state = "out" - - elif value[0] == ';': - # these always copy verbatim, with no change of state - pass - - elif state == "out": - # then seeking our sections - if value.startswith("[router_api"): - state = "api" - - if value.startswith("[logging"): - state = "log" - - else: # assume we're inside on of the sections - - if state == "api": - if user_name is not None and \ - value.startswith("user_name"): - # change out the user_name - value = "user_name={}".format(user_name) - changed = True - - elif interface is not None and \ - value.startswith("interface"): - # change out the interface - value = "interface={}".format(interface) - changed = True - - elif local_ip is not None and \ - value.startswith("local_ip"): - # change out the local_ip - value = "local_ip={}".format(local_ip) - changed = True - - elif password is not None and \ - value.startswith("password"): - # change out the password - value = "password={}".format(password) - changed = True - - elif state == "log": - if syslog_ip is not None and \ - value.startswith("syslog_ip"): - # change out the syslog_ip - value = "syslog_ip={}".format(syslog_ip) - changed = True - - dst.append(value) - - temp = line.strip() - if temp != value: - self.logger.debug("SET: [{}] > [{}]".format(temp, value)) - # else: - # self.logger.debug("SET: [{}] no change".format(value)) - - if not changed: - self.logger.info("SET: nothing changed - doing nothing") - result = 0 - - else: - bak_name = ini_name + ".bak" - if os.access(bak_name, os.F_OK): - # remove any old backup - os.remove(bak_name) - - # save the original - os.rename(ini_name, bak_name) - - # save out the file - self.logger.debug("SET: rewriting file:{}".format(ini_name)) - with open(ini_name, "w") as _file_han: - for line in dst: - _file_han.write(line + '\n') - - # change the computer's IP - if interface is None: - # use the 'new' interface, else our default - interface = self.target_interface - - if syslog_ip is None: - # this is problem - raise ValueError - - result = self.set_computer_ip(interface, syslog_ip) - - return result - - def action_syslog(self, name=None): - if name is None: - # note that target_alias might also be None - name = self.target_alias - - router_ip = self.get_router_ip(name) - - if router_ip is None: - self.logger.error( - "Cannot check Syslog - not enough target info given") - return -1 - - result = self.cs_client.get("config/system/logging") - if not isinstance(result, dict): - # some error? - self.logger.error("get of config/system/logging failed") - return -2 - - # FW 6.1 example of get("config/system/logging") - # {"console": false, "firewall": false, "max_logs": 1000, - # "services": [] - # "modem_debug": {"lvl_error": false, "lvl_info": false, - # "lvl_trace": false, "lvl_warn": false }, - # "enabled": true, - show always be true? - # "level": "debug", - set to "debug" or "info", etc - # "remoteLogging": { - # "enabled": true, - set T to enable remote syslog - # "serverAddr": "192.168.30.6", - set to IP of syslog server - # "system_id": false, - always set False (for now) - # "utf8_bom": false, - always set false (for now) - # }, - - # assume everything is as expected - logging_setting_good = True - - logging_level = result.get("level", None) - self.logger.info("{}: Logging level = {}".format( - router_ip.exploded, logging_level)) - # self.logger.debug("{}:control/system/logging/level = {}".format( - # router_ip.exploded, logging_level)) - - syslog_enabled = False - syslog_ip = None - - if "remoteLogging" not in result: - self.logger.error( - "{}:config/system/logging/remoteLogging is not present".format( - router_ip.exploded)) - logging_setting_good = False - - else: - syslog_enabled = result["remoteLogging"].get("enabled", False) - syslog_ip = result["remoteLogging"].get("serverAddr", None) - - if syslog_enabled: - self.logger.info( - "{}: Remote Syslog logging is enabled".format( - router_ip.exploded)) - # self.logger.debug( - # "{}:control/system/logging/remoteLogging/enabled = True".format( - # router_ip.exploded)) - - if syslog_ip is None: - logging_setting_good = False - else: - self.logger.info("{}: Remote Syslog IP address is {}".format( - router_ip.exploded, syslog_ip)) - # self.logger.debug( - # "{}:control/system/logging/remoteLogging/serverAddr = {}".format( - # router_ip.exploded, syslog_ip)) - else: - self.logger.info( - "{}: Remote Syslog logging is disabled".format( - router_ip.exploded)) - # self.logger.debug( - # "{}:control/system/logging/remoteLogging/enabled = False".format( - # router_ip.exploded)) - logging_setting_good = False - - if not logging_setting_good: - # then at least one setting is not as desired - desired = {"enabled": True, "level": "debug", - "remoteLogging": {"enabled": True, - "utf8_bom": SYSLOG_UTF8_FLAG}} - if syslog_ip is None: - # if no IP, use this computer's IP from the active interface - syslog_ip = self.target_my_ip.explode - - desired["remoteLogging"]["serverAddr"] = syslog_ip - self.logger.debug("desire:{}".format(desired)) - - """ :type self.cs_client: CradlepointClient""" - value = "debug" - result = self.cs_client.put("config/system/logging", - {"level": value}) - if result != value: - self.logger.error( - "PUT logging/level = {} failed, result={}".format( - value, result)) - - # false is 'not a boolean' - # False is 'not a boolean' - # "0" is not a boolean - value = False - result = self.cs_client.put( - "config/system/logging/remoteLogging", {"enabled": value}) - if result != value: - self.logger.error( - "PUT logging/remoteLogging/enabled={}".format(value) + - " failed, result={}".format(result)) - - return 0 - - def action_show(self): - """ - Do simplified dump/display of interfaces, assuming multi-homed computer - - """ - self.logger.info("") - self.logger.info("Show Interfaces:") - - report = self.list_interfaces() - for line in report: - self.logger.info("{}".format(line)) - return 0 - - def load_target_ini(self, ini_name=None): - """ - Convert the ./config/target.ini into a dictionary - - Assume we start with INI like this: - [AER2100] - local_ip=192.168.21.1 - password=4416ec79 - - Want a dict() like this: - { - "AER2100": { - "local_ip": "192.168.21.1", - "password": "4416ec79" - } - } - - :param str ini_name: relative directory path to the INI file - - in None, assume ./config/target.ini - :return dict: the prepared data as dict - """ - import configparser - - if ini_name is None: - ini_name = DEF_TARGET_INI - - target_dict = dict() - - if not os.path.isfile(ini_name): - # if INI file DOES NOT exist, return - existence is not - # this module's responsibility! - self.logger.debug( - "Target INI file {} does NOT exist".format(ini_name)) - return target_dict - - self.logger.debug("Read TARGET.INI file:{}".format(ini_name)) - - # LOAD IN THE INI FILE, using the Python library - target_config = configparser.ConfigParser() - # READ indirectly, config.read() tries to open cp_lib/config/file.ini, - # not config/file.ini - file_han = open(ini_name, "r") - try: - target_config.read_file(file_han) - - except configparser.DuplicateOptionError as e: - self.logger.error(str(e)) - self.logger.error("Aborting TARGET") - sys.exit(-1) - - finally: - file_han.close() - self.logger.debug(" Sections:{}".format(target_config.sections())) - - # convert INI/ConfigParser to Python dictionary - for section in target_config.sections(): - - target_dict[section] = {} - # note: 'section' is the old possibly mixed case name; - # section_tag might be lower case - for key, val in target_config.items(section): - target_dict[section][key] = val - - return target_dict - - def get_router_ip(self, name=None): - """ - Given name, or self.target_interface, try to guess what router IP is - - :param str name: optional alias name - :return: the IP as IPv4Address() object, or None - :rtype: ipaddress.IPv4Address - """ - router_ip = None - - if name is None: - # then just ping the Router on self.target_interface - if self.target_my_net is not None: - self.logger.debug( - "Get Router IP - see if we have router on " + - "interface:{}".format(self.target_interface)) - # walk through our target list looking for first - # router IP on targeted interface, - # which is like: - # "AER2100": { - # "local_ip": "192.168.21.1", - # "password": "4416ec79" - # } - for router in self.target_dict: - # self.logger.debug("Check IP of router:{}".format(router)) - try: - router_ip = ipaddress.IPv4Address( - self.target_dict[router]["local_ip"]) - - except KeyError: - self.logger.warning( - 'Router[{}] lacks an ["local_ip"] value'.format( - router)) - continue - - except ipaddress.AddressValueError: - self.logger.warning( - 'Router[{}] has invalid ["local_ip"] value'.format( - router)) - continue - - if router_ip in self.target_my_net: - # this is first router found in correct subnet, use it - self.logger.debug( - "Found router[{}] with ".format(router) + - "IP[{}] in correct subnet".format(router_ip)) - break - - # else self.logger.debug("try another") - # else leave as None, router_ip = None - - else: # try to find the alias - if name in self.target_dict: - self.logger.debug( - "Get Router IP - try to find IP of alias:{}".format(name)) - try: - router_ip = self.target_dict[name]["local_ip"] - self.logger.debug( - "Get Router IP - alias as IP:{}".format(router_ip)) - router_ip = ipaddress.IPv4Address(router_ip) - - except KeyError: - self.logger.warning( - 'Router[{}] lacks an ["local_ip"] value'.format(name)) - return -1 - - except ipaddress.AddressValueError: - self.logger.warning( - 'Router[{}] has invalid ["local_ip"] value'.format( - name)) - return -1 - - # else leave as None - - return router_ip - - def scan_ini_get_ip_from_name(self, name): - """ - Given a name (a section in target.ini) - return the ["local_ip"] value as IPv4Address object - - :param str name: - :return: - :rtype: ipaddress.IPv4Address, bool - """ - self.logger.debug("Given name:{}, scan for local_ip".format(name)) - - # walk through our target list looking for first router IP on - # targeted interface, - # which is like: - # "AER2100": { - # "local_ip": "192.168.21.1", - # "password": "4416ec79" - # } - router_ip = None - in_subnet = False - if name in self.target_dict: - try: - router_ip = ipaddress.IPv4Address( - self.target_dict[name]["local_ip"]) - - except ipaddress.AddressValueError: - self.logger.warning( - 'Router[{}] has invalid ["local_ip"] value'.format(name)) - - if self.target_my_net is not None: - # check if it is in our subnet - in_subnet = router_ip in self.target_my_net - self.logger.debug( - "IP[{}] is within current subnet".format(router_ip)) - - self.logger.debug( - "Found router[{}] with IP[{}]".format(name, router_ip)) - return router_ip, in_subnet - - def get_interface_ip_info(self, interface_name, report=None): - """ - Given an interface name, return the computer's IP and network info. - - For example if interface_name == "ENet USB-1", returns 192.168.30.6 - [ "", - "Configuration for interface \"ENet MB\"", - " IP Address: 192.168.0.10", - " Subnet Prefix: 192.168.0.0/24", - " Default Gateway: 192.168.0.1", - "", - "Configuration for interface \"ENet USB-1\"", - " IP Address: 192.168.30.6", - " Subnet Prefix: 192.168.30.0/24", - "" - ] - - :param str interface_name: which interface we are targeting - (from TARGET.INI or default) - :param list report: a saved report, if any - """ - if report is None: - report = self.list_interfaces() - - self.logger.debug("Get IP for interface:{}".format(interface_name)) - - my_ip = None - my_net = None - - interface_name = '\"' + interface_name + '\"' - _index = 0 - found_interface = False - while _index < len(report): - value = report[_index].strip() - """ :type value: str """ - if len(value) > 0: - match_cfg = "Configuration for interface" - if value.startswith(match_cfg): - # then we are in the "Configuration for interface ..." - value = value[len(match_cfg):].strip() - if value == interface_name: - # self.logger.debug( - # "Found Cfg interface:{}".format(value)) - found_interface = True - match_ip = "IP Address:" - match_net = "Subnet Prefix:" - while len(report[_index]) > 0: - # walk through this configuration only - _index += 1 - value = report[_index].strip() - # self.logger.debug("loop:{}".format(value)) - - if value.startswith(match_ip): - # like "IP Address: 192.168.30.6" - value = value[len(match_ip):].strip() - my_ip = ipaddress.IPv4Address(value) - - if value.startswith(match_net): - # like "Subnet Prefix: - # 192.168.30.0/24 (mask 255.255.255.0)" - value = value[len(match_net):].strip() - offset = value.find(" ") - if offset >= 0: - value = value[:offset] - my_net = ipaddress.IPv4Network(value) - # else: - # self.logger.debug( - # "Skip undesired Cfg interface:{}".format(value)) - _index += 1 - - if found_interface: - if my_ip is None: - self.logger.error( - "Found Interface:{}, failed to find IP address".format( - interface_name)) - # else: - # self.logger.debug( - # "IP for interface:{} is {}".format(interface_name, my_ip)) - - if my_net is None: - self.logger.error( - "Found Interface:{}, failed to find NETWORK Prefix".format( - interface_name)) - # else: - # self.logger.debug( - # "NET for interface:{} is {}".format(interface_name, - # my_net)) - - else: - self.logger.error( - "Failed to find Interface:{}".format(interface_name)) - return my_ip, my_net - - @staticmethod - def make_computer_ip(router_ip, last_octet=DEF_COMPUTER_IP_LAST_OCTET): - """ - Given the router's IP, edit to make this computer's IP - (assuming we are consistent) - - :param router_ip: - :type router_ip: str or ipaddress.IPv4Address - :param int last_octet: - :return str: - """ - if isinstance(router_ip, str): - # ensure is IPv4 value - router_ip = ipaddress.IPv4Address(router_ip) - - value = router_ip.exploded.split('.') - assert len(value) == 4 - return "{0}.{1}.{2}.{3}".format(value[0], value[1], - value[2], last_octet) - - @staticmethod - def trim_ip_to_4(value): - """ - handle things like 192.168.30.0/24 or 192.168.30.0:8080, which - we might obtain from various shelled reports. - - :param str value: the string to trim - """ - value = value.strip() - offset = value.find('/') - if offset >= 0: - value = value[:offset] - - offset = value.find(':') - if offset >= 0: - value = value[:offset] - - value = ipaddress.IPv4Address(value) - # will throw ipaddress.AddressValueError if bad - - return value.exploded - - def list_interfaces(self): - """ - Dump of interfaces, cleaned to be only as wanted. Might be like: - - [ "", - "Configuration for interface \"ENet MB\"", - " IP Address: 192.168.0.10", - " Subnet Prefix: 192.168.0.0/24 (mask 255.255.255.0)", - " Default Gateway: 192.168.0.1", - "", - "Configuration for interface \"ENet USB-1\"", - " IP Address: 192.168.30.6", - " Subnet Prefix: 192.168.30.0/24 (mask 255.255.255.0)", - "" - ] - """ - if sys.platform != "win32": - raise NotImplementedError - - command = ["netsh", "interface", "ip", "show", "config"] - - result = subprocess.check_output(command, universal_newlines=True) - # use of universal_newlines=True means return is STR not BYTES - """ :type result: str""" - result = result.split("\n") - # for line in result: - # self.logger.debug("Line:{}".format(line)) - - report = [] - - # use in_configuration to hide interfaces we don't want - # - like hide 127.0.0.1 / localhost - in_configuration = False - - # use last_was_blank to suppress consecutive blanks - last_was_blank = False - - # suppress 'rogue' subnet or gateway, without IP - # (idle DHCP interface might do this) - seen_ip_address = False - - # delay output of 'Configuration ' announcement until we have - # at least 1 other value like IP, etc. - hold_config_line = None - for line in result: - # we'll ONLY show certain lines, discard all else - test = line.strip() - - if len(test) < 1: - # then blank line - keep for visual prettiness - in_configuration = False - if last_was_blank: - continue - last_was_blank = True - report.append(line) - - elif test.startswith("Configuration"): - # Configuration for interface "ENet MB" continue - if LIST_INTERFACE_NO_LOOPBACK and test.find("Loopback") > 0: - # skip: interface "Loopback Pseudo-Interface 1" - continue - - if LIST_INTERFACE_NO_VM: - if test.find("VMware") > 0: - # skip: interface "VMware Network Adapter VM1" - continue - if test.find("VirtualBox") > 0: - # skip: interface "VirtualBox Host-Only Network" - continue - - in_configuration = True - seen_ip_address = False - hold_config_line = line - - elif test.startswith("IP Address"): - # Configuration for interface "ENet MB" continue - if not in_configuration: - continue - - if hold_config_line: - # add the delayed config line. - report.append(hold_config_line) - hold_config_line = None - - seen_ip_address = True - last_was_blank = False - report.append(line) - - elif test.startswith("Subnet Prefix"): - # Configuration for interface "ENet MB" continue - if in_configuration and seen_ip_address: - # only add if we've seen an "Ip Address" line - last_was_blank = False - report.append(line) - - elif test.startswith("Default Gateway"): - # Configuration for interface "ENet MB" continue - if in_configuration and seen_ip_address: - # only add if we've seen an "Ip Address" line - last_was_blank = False - report.append(line) - - # else: - # # self.logger.debug("skip:{}".format(line)) - # continue - - return report - - @staticmethod - def get_whoami(): - """ - Fetch 'whoami' to enable running priviledged subprocess - - [ "", - "Configuration for interface \"ENet MB\"", - " IP Address: 192.168.0.10", - " Subnet Prefix: 192.168.0.0/24 (mask 255.255.255.0)", - " Default Gateway: 192.168.0.1", - "", - "Configuration for interface \"ENet USB-1\"", - " IP Address: 192.168.30.6", - " Subnet Prefix: 192.168.30.0/24 (mask 255.255.255.0)", - "" - ] - """ - if sys.platform == "win32": - - command = ["whoami"] - - result = subprocess.check_output(command, universal_newlines=True) - # use of universal_newlines=True means return is STR not BYTES - """ :type result: str""" - # we'll have a EOL at the end, so strip off - return result.strip() - - else: - raise NotImplementedError - - def set_computer_ip(self, interface, syslog_ip): - """ - To set a fixed IP: - netsh interface ip set address name="Local Area Connection" - static 192.168.0.1 255.255.255.0 192.168.0.254 - - To set DHCP: - netsh interface ip set address name="Local Area Connection" - source=dhcp - - :param str interface: The interface name, such "Local Area Connection" - :param str syslog_ip: The IP for syslog, such "192.168.0.6" - """ - whoami = self.get_whoami() - self.logger.debug("WhoAmI={}".format(whoami)) - - if sys.platform == "win32": - # then use Windows method - note, it will pause & ask YOU for - # your whoami password - - command = ['runas', '/noprofile', '/user:' + whoami, - 'netsh interface ip set address \"' + interface + - '\" static ' + syslog_ip + ' 255.255.255.0'] - - self.logger.debug("{}".format(command)) - self.logger.warning("!!") - self.logger.warning( - "Enter the password for user:{}".format(whoami)) - - result = subprocess.check_output(command, universal_newlines=True) - # use of universal_newlines=True means return is STR not BYTES - """ :type result: str""" - result = result.split("\n") - self.logger.debug("netsh:{}".format(result)) - return result - - else: - raise NotImplementedError - - def dump_help(self, args): - """ - - :param list args: the command name - :return: - """ - print("Syntax:") - print(' {} -m '.format(args[0])) - print() - print(" Default action = {}".format(self.ACTION_DEFAULT)) - for command in self.ACTION_NAMES: - print() - print("- action={0}".format(command)) - print(" {0}".format(self.ACTION_HELP[command])) - - return - -if __name__ == "__main__": - - target = TheTarget() - - if len(sys.argv) < 2: - target.dump_help(sys.argv) - sys.exit(-1) - - # if cmdline is only "make", then run as "make build" but we'll - # expect ["name"] in global sets - - # save this, just in case we care later - utility_name = sys.argv[0] - - index = 1 - while index < len(sys.argv): - # loop through an process the parameters - - if sys.argv[index] in ('-m', '-M'): - # then what follows is the mode/action - action = sys.argv[index + 1].lower() - if action in target.ACTION_NAMES: - # then it is indeed an action - target.action = action - else: - target.logger.error( - "Aborting, Unknown action:{}".format(action)) - print("") - target.dump_help(sys.argv) - sys.exit(-1) - index += 1 # need an extra ++ as -m includes 2 params - - elif sys.argv[index] in ('-v', '-V', '+v', '+V'): - # switch the logger to DEBUG from INFO - target.verbose = True - - else: - # assume this is the app path - target.target_alias = sys.argv[index] - - index += 1 # get to next setting - - if target.verbose: - logging.basicConfig(level=logging.DEBUG) - target.logger.setLevel(level=logging.DEBUG) - - else: - logging.basicConfig(level=logging.INFO) - target.logger.setLevel(level=logging.INFO) - # quiet INFO messages from requests module, - # "requests.packages.urllib3.connection pool" - logging.getLogger('requests').setLevel(logging.WARNING) - - _result = target.main() - if _result != 0: - logging.error("return is {}".format(_result)) - - sys.exit(_result) diff --git a/tools/test_convert_eol.py b/tools/test_convert_eol.py deleted file mode 100644 index e0e7810c..00000000 --- a/tools/test_convert_eol.py +++ /dev/null @@ -1,24 +0,0 @@ -# Test the tools.convert_eol module - -import logging -import unittest - -from tools.convert_eol import convert_eol_linux - - -class TestConvertEol(unittest.TestCase): - - def test_convert_eol_linux(self): - """ - :return: - """ - - convert_eol_linux("build") - - return - - -if __name__ == '__main__': - # logging.basicConfig(level=logging.INFO) - logging.basicConfig(level=logging.DEBUG) - unittest.main() From c99f7e726eef955e0b922220b729f65965039c59 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Thu, 29 Jun 2017 12:08:40 -0600 Subject: [PATCH 2/9] Remove the .idea directory as it is used by PyCharm --- .idea/misc.xml | 4 ---- .idea/modules.xml | 8 -------- .idea/v2.0-branch.iml | 11 ----------- .idea/vcs.xml | 6 ------ 4 files changed, 29 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/v2.0-branch.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index fd0669b0..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 4e86f89f..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/v2.0-branch.iml b/.idea/v2.0-branch.iml deleted file mode 100644 index 67116063..00000000 --- a/.idea/v2.0-branch.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 37f8d75cac0953e4a77eded7ee87460736a25eb8 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Thu, 29 Jun 2017 12:11:56 -0600 Subject: [PATCH 3/9] Remove sdk_cs_client.py as it was used for testing and should not be committed. --- common/sdk_cs_client.py | 409 ---------------------------------------- 1 file changed, 409 deletions(-) delete mode 100644 common/sdk_cs_client.py diff --git a/common/sdk_cs_client.py b/common/sdk_cs_client.py deleted file mode 100644 index dd94a600..00000000 --- a/common/sdk_cs_client.py +++ /dev/null @@ -1,409 +0,0 @@ -""" -sdk_config_store.py - Communication module for sdk apps - -Copyright (c) 2017 Cradlepoint, Inc. . All rights reserved. - -This file contains confidential information of CradlePoint, Inc. and your use of -this file is subject to the CradlePoint Software License Agreement distributed with -this file. Unauthorized reproduction or distribution of this file is subject to civil and -criminal penalties. - -""" - -import json -import os -import re -import select -import socket -import threading -import logging -import logging.handlers -import signal -import sys - - -def clean_up_reg(signal, frame): - """ - When 'cppython remote_port_forward.py' gets a SIGTERM, config_store_receiver.py doesn't - clean up registrations. Even if it did, the comm module can't rely on an external service - to clean up. - """ - EventingCSClient().stop() - sys.exit(0) - -if sys.platform == 'linux2': - signal.signal(signal.SIGTERM, clean_up_reg) - - -class SdkCSException(Exception): - pass - - -CSCLIENT_NAME = 'SDK CSClient' -# logger = logging.getLogger(CSCLIENT_NAME) -# logger.setLevel(logging.INFO) -# log_enable = (os.environ.get('SYSLOG_ENABLE', 'true').lower() == 'true') -# if log_enable: -# handler = logging.handlers.SysLogHandler(address='/dev/log') -# else: -# handler = logging.FileHandler('/var/log/{}.log'.format(CSCLIENT_NAME)) -# formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s', datefmt='%b %d %H:%M:%S') -# handler.setFormatter(formatter) -# logger.addHandler(handler) - - -class CSClient(object): - END_OF_HEADER = b"\r\n\r\n" - STATUS_HEADER_RE = re.compile(b"status: \w*") - CONTENT_LENGTH_HEADER_RE = re.compile(b"content-length: \w*") - MAX_PACKET_SIZE = 8192 - RECV_TIMEOUT = 2.0 - - _instances = {} - - @classmethod - def is_initialized(cls): - return (cls in cls._instances) - - def __new__(cls, *na, **kwna): - """ Singleton factory (with subclassing support) """ - if not cls.is_initialized(): - cls._instances[cls] = super().__new__(cls) - return cls._instances[cls] - - def __init__(self, init=False): - if not init: - return - - # @staticmethod - # def set_log_level(level): - # try: - # logger.setLevel(level) - # except ValueError: - # logger.info('Unable to set log level %s', level) - - @staticmethod - def _get_router_access_info(): - """Should only be called when running in a computer. It will return the - dev_client_ip, dev_client_username, and dev_client_password as defined in - the sdk section of the sdk_settings.ini file.""" - router_ip = '' - router_username = '' - router_password = '' - - if sys.platform != 'linux2': - import os - import configparser - - settings_file = os.path.join(os.path.dirname(os.getcwd()), 'sdk_settings.ini') - config = configparser.ConfigParser() - config.read(settings_file) - - # Keys in sdk_settings.ini - sdk_key = 'sdk' - ip_key = 'dev_client_ip' - username_key = 'dev_client_username' - password_key = 'dev_client_password' - - if sdk_key in config: - if ip_key in config[sdk_key]: - router_ip = config[sdk_key][ip_key] - else: - print('ERROR 1: The {} key does not exist in {}'.format(ip_key, settings_file)) - - if username_key in config[sdk_key]: - router_username = config[sdk_key][username_key] - else: - print('ERROR 2: The {} key does not exist in {}'.format(username_key, settings_file)) - - if password_key in config[sdk_key]: - router_password = config[sdk_key][password_key] - else: - print('ERROR 3: The {} key does not exist in {}'.format(password_key, settings_file)) - else: - print('ERROR 4: The {} section does not exist in {}'.format(sdk_key, settings_file)) - - return router_ip, router_username, router_password - - def get(self, base, query='', tree=0): - """Send a get request.""" - if sys.platform == 'linux2': - cmd = "get\n{}\n{}\n{}\n".format(base, query, tree) - return self._dispatch(cmd) - else: - # Running in a computer so use http to send the get to the router. - import requests - router_ip, router_username, router_password = self._get_router_access_info() - router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) - - try: - response = requests.get(router_api, - auth=requests.auth.HTTPDigestAuth(router_username, router_password)) - - except (requests.exceptions.Timeout, - requests.exceptions.ConnectionError): - print("Timeout: router at {} did not respond.".format(router_ip)) - return None - - return json.loads(response.text)['data'] - - def put(self, base, value='', query='', tree=0): - """Send a put request.""" - value = json.dumps(value).replace(' ', '') - if sys.platform == 'linux2': - cmd = "put\n{}\n{}\n{}\n{}\n".format(base, query, tree, value) - return self._dispatch(cmd) - else: - # Running in a computer so use http to send the put to the router. - import requests - router_ip, router_username, router_password = self._get_router_access_info() - router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) - - try: - response = requests.put(router_api, - headers={"Content-Type": "application/x-www-form-urlencoded"}, - auth=requests.auth.HTTPDigestAuth(router_username, router_password), - data={"data": '{}'.format(value)}) - except (requests.exceptions.Timeout, - requests.exceptions.ConnectionError): - print("Timeout: router at {} did not respond.".format(router_ip)) - return None - - return response.text - - def append(self, base, value='', query=''): - """Send an append request.""" - if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') - cmd = "post\n{}\n{}\n{}\n".format(base, query, value) - return self._dispatch(cmd) - else: - print('Append is only available when running the app in the router.') - raise NotImplementedError - - def delete(self, base, query=''): - """Send a delete request.""" - if sys.platform == 'linux2': - cmd = "delete\n{}\n{}\n".format(base, query) - return self._dispatch(cmd) - else: - # Running in a computer so use http to send the delete to the router. - import requests - router_ip, router_username, router_password = self._get_router_access_info() - router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) - - try: - response = requests.delete(router_api, - headers={"Content-Type": "application/x-www-form-urlencoded"}, - auth=requests.auth.HTTPDigestAuth(router_username, router_password)) - except (requests.exceptions.Timeout, - requests.exceptions.ConnectionError): - print("Timeout: router at {} did not respond.".format(router_ip)) - return None - - return response.text - - def alert(self, app_name='', value=''): - """Send a request to create an alert.""" - if sys.platform == 'linux2': - cmd = "alert\n{}\n{}\n".format(app_name, value) - return self._dispatch(cmd) - else: - print('Alert is only available when running the app in the router.') - raise NotImplementedError - - def log(self, name='', value='', level='DEBUG'): - """Send a request to create a log entry.""" - if sys.platform == 'linux2': - cmd = "log\n{}\n{}\n".format(name, value) - return self._dispatch(cmd) - else: - # Running in a computer so just use print for the log. - print('[{}]: {}'.format(name, value)) - - def _safe_dispatch(self, cmd): - """Send the command and return the response.""" - with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: - sock.connect('/var/tmp/cs.sock') - sock.sendall(bytes(cmd, 'ascii')) - return self._receive(sock) - - def _dispatch(self, cmd): - # logger.debug("_dispatch %s", cmd) - errmsg = None - result = "" - try: - result = self._safe_dispatch(cmd) - except Exception as err: - # ignore the command error, continue on to next command - errmsg = "dispatch failed with exception={} err={}".format(type(err), str(err)) - if errmsg is not None: - # logger.warning(errmsg) - self.log(CSCLIENT_NAME, errmsg) - pass - return result - - def _safe_receive(self, sock): - sock.settimeout(self.RECV_TIMEOUT) - data = b"" - eoh = -1 - while eoh < 0: - # In the event that the config store times out in returning data, lib returns - # an empty result. Then again, if the config store hangs for 2+ seconds, - # the app's behavior is the least of our worries. - try: - buf = sock.recv(self.MAX_PACKET_SIZE) - except socket.timeout: - return {"status": "timeout", "data": None} - if len(buf) == 0: - break - data += buf - eoh = data.find(self.END_OF_HEADER) - - status_hdr = self.STATUS_HEADER_RE.search(data).group(0)[8:] - content_len = self.CONTENT_LENGTH_HEADER_RE.search(data).group(0)[16:] - remaining = int(content_len) - (len(data) - eoh - len(self.END_OF_HEADER)) - - # body sent from csevent_xxx.sock will have id, action, path, & cfg - while remaining > 0: - buf = sock.recv(self.MAX_PACKET_SIZE) # TODO: This will hang things as well. - if len(buf) == 0: - break - data += buf - remaining -= len(buf) - body = data[eoh:].decode() - try: - # logger.debug("body decoded: %s", body) - result = json.loads(body) - except json.JSONDecodeError as e: - # config store receiver doesn't give back - # proper json for 'put' ops, body - # contains verbose error message - # so putting the error msg in result - # logger.debug("json decode error: %s", e) - result = body.strip() - # logger.debug("safe_receive result=\"%s\"", result) - return {"status": status_hdr.decode(), "data": result} - - def _receive(self, sock): - errmsg = None - result = "" - try: - result = self._safe_receive(sock) - except Exception as err: - # ignore the command error, continue on to next command - errmsg = "_receive failed with exception={} err={}".format(type(err), str(err)) - if errmsg is not None: - # logger.warning(errmsg) - self.log(CSCLIENT_NAME, errmsg) - return result - - -class EventingCSClient(CSClient): - running = False - registry = {} - eids = 1 - - def start(self): - if sys.platform == 'linux2': - if self.running: - msg = "Eventing Config Store (%s) already running", self.pid - # logger.debug(msg) - self.log(CSCLIENT_NAME, msg) - return - self.running = True - self.pid = os.getpid() - self.f = '/var/tmp/csevent_%d.sock' % self.pid - try: - os.unlink(self.f) - except FileNotFoundError: - pass - self.event_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.event_sock.bind(self.f) - self.event_sock.listen() # backlog is optional. already set on value found in /proc - self.event_sock.setblocking(False) - self.eloop = threading.Thread(target=self._handle_events) - self.eloop.start() - else: - self.log(CSCLIENT_NAME, 'EventingCSClient.start() is only available when running in the router.') - - def stop(self): - if sys.platform == 'linux2': - if not self.running: - return - # logger.debug("Stopping %s", NAME) - for k in list(self.registry.keys()): - self.unregister(k) - self.event_sock.close() - os.unlink(self.f) - self.running = False - else: - self.log(CSCLIENT_NAME, 'EventingCSClient.stop() is only available when running in the router.') - - def _handle_events(self): - poller = select.poll() - poller.register(self.event_sock, - select.POLLIN | select.POLLERR | select.POLLHUP) # I don't unregister this in cleaning up! - while self.running: - try: - events = poller.poll(1000) - for f, ev in events: - if ev & (select.POLLERR | select.POLLHUP): - msg = "Hangup/error received. Stopping" - # logger.error(msg) - self.log(CSCLIENT_NAME, msg) - self.stop() # TODO: restart w/ cached registrations. Will no longer be an error case - - if ev & select.POLLIN: - conn, addr = self.event_sock.accept() - result = self._receive(conn) - eid = int(result['data']['id']) - try: - cb = self.registry[eid]['cb'] - args = self.registry[eid]['args'] - try: - # PUTting just a string to config store results in a json encoded string returned. - # e.g. set /config/system/logging/level "debug", result['data']['cfg'] is '"debug"' - cfg = json.loads(result['data']['cfg']) - except TypeError as e: - # Non-string path - cfg = result['data']['cfg'] - cb_return = cb(result['data']['path'], cfg, args) - if result['data']['action'] == 'get': # We've something to send back. - # config_store_receiver expects json - cb_return = json.JSONEncoder().encode(cb_return) - conn.sendall( - cb_return.encode()) # No dispatch. Config store receiver will put to config store. - except (NameError, ValueError) as e: - errmsg = "Could not find register data for eid %s", (eid) - # logger.warning(errmsg) - self.log(CSCLIENT_NAME, errmsg) - except OSError as e: - errmsg = "OSError: %s", e - # logger.warning(errmsg) - self.log(CSCLIENT_NAME, errmsg) - raise - - def register(self, action, path, callback, *args): - if sys.platform == 'linux2': - if not self.running: - raise SdkCSException("Eventing Config Store not started") - eid = self.eids - self.eids += 1 - self.registry[eid] = {'cb': callback, 'action': action, 'path': path, 'args': args} - cmd = "register\n{}\n{}\n{}\n{}\n".format(self.pid, eid, action, path) - return self._dispatch(cmd) - else: - self.log(CSCLIENT_NAME, 'Event register is only available when running in the router.') - - def unregister(self, eid): - if sys.platform == 'linux2': - if not self.running: - raise SdkCSException("Eventing Config Store not started") - e = self.registry[eid] - cmd = "unregister\n{}\n{}\n{}\n{}\n".format(self.pid, eid, e['action'], e['path']) - ret = self._dispatch(cmd) - del self.registry[eid] - return ret - else: - self.log(CSCLIENT_NAME, 'Event unregister is only available when running in the router.') From 1570669e4b03844fb02d32c1c91bcda6981d698c Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Thu, 29 Jun 2017 12:55:42 -0600 Subject: [PATCH 4/9] Remove the Router_Application_Development_Guide.md and only publish the html version. --- Router_Application_Development_Guide.md | 570 ------------------------ 1 file changed, 570 deletions(-) delete mode 100644 Router_Application_Development_Guide.md diff --git a/Router_Application_Development_Guide.md b/Router_Application_Development_Guide.md deleted file mode 100644 index 1e247cf0..00000000 --- a/Router_Application_Development_Guide.md +++ /dev/null @@ -1,570 +0,0 @@ -# **Cradlepoint Router Application Development** # - ----------- - -## Quick Links ## - -#### [Overview](#overview) #### -#### [Developer Community](#community) #### -#### [Cradlepoint Knowledge Base](#knowledge) #### -#### [Router Python Environment](#environment) #### -#### [Computer Setup Instructions](#setup) #### -#### [Router Development Mode](#devmode) #### -#### [Application Directory Structure](#structure) #### -#### [Application Package Anatomy](#anatomy) #### -#### [SDK Instructions Overview](#sdk) #### -#### [Router Syslog for Debugging](#syslog) #### -#### [ECM Application Deployment](#ecm) #### -#### [Sample Application Walk Through](#sample) #### - - - -## Overview ## -Cradlepoint’s Router Application Framework provides the ability to add intelligence in the router. Applications written in Python can be securely downloaded to the router via [Enterprise Cloud Manager](https://cradlepoint.com/ecm) (ECM). This allows for extended router features, FOG Computing, and IoT management. - -At a high level, the Cradlepoint Router Apps/SDK is a mechanism to package a collection of files – including executable files – in an archive, which can be transferred securely via ECM, hidden within a Cradlepoint router, and executed as an extension to normal firmware. - -### What is Supported? ### -For the scope of this document, Router Apps are limited to the non-privileged Python scripts. Supported functionality: - -- Standard TCP/UDP/SSL socket servers function on ports higher than 1024. -- Standard TCP/UDP/SSL socket client to other devices (or the router as 127.0.0.1/localhost). -- Access to serial ports via PySerial module, including native and USB-serial ports. -- Ability to PING external devices. -- UI Extensibility (i.e. Hot Spot splash page or other UI WEB pages) -- Access to the Router API (aka: status and control tree data). -- USB Memory device file access (USB Memory device support varies based on router). - -### What is not Supported? ### -- Any form of natively compiled or kernel linked code. -- Any function requiring privileged (or root) permissions. -- Access to shared resources (for example: no ability to issue custom AT commands to cell modems). -- Modifications of routing or security behavior. - -### Supported Routers ### -The supported set of routers is: - -- AER – 1600/1650, 2100, 3100/3150 -- COR – IBR1100/1150, IBR900/IBR950, IBR600B/IBR650B, IBR350 -- ARC - CBA850 - -New routers products will support Python applications unless they are a special low-function, low-cost model. - -### Application Development ### -During development, an application can be directly installed into a 'DEV Mode' router. This makes it easier to debug and work through the development process. Once the application has been fully debugged and is ready for deployment, it can be installed via ECM at the group level. - -### SDK Toolset ### -Cradlepoint has a simplified SDK, written in python, which builds and creates an app package. The SDK, along with sample applications is located [here](https://github.com/cradlepoint/sdk-samples/releases). - -For app development, the SDK is be used to install, start, stop, uninstall, and check status of the application in a locally connected development router. The application package is the same for local debugging or for uploading to the ECM for production deployment. Application development can be done on Linux, OS X, and Windows operating systems with the same SDK. - - - -## Developer Community ## -Cradlepoint has a [Developer Community Portal](https://dev.cradlepoint.com) to leverage knowledge, share, and collaborate with other developers. This forum is also actively monitored by Cradlepoint to answer questions. - - - -## Cradlepoint Knowledge Base ## -The existing [Cradlepoint Knowledge Base](http://knowledgebase.cradlepoint.com) also has many articles related to router applications and the SDK. - - - -## Router Python Environment ## -Application are written in python. However, the router only contains a subset of a typical python installation on a computer. The list of python modules in the router are listed here: [Router FW 6.1.0 Modules.](https://dev.cradlepoint.com/s/article/ka1380000000EXWAA2/sdk-fw-6-1-0-modules) New python files can be added to you application but they must also adhere to this list. - - -## Computer Setup Instructions ## -The SDK and sample apps can be downloaded from [https://github.com/cradlepoint/sdk-samples](https://github.com/cradlepoint/sdk-samples). Below are the setup instruction for: - -- [Linux](#Linux) -- [OS X](#Mac) -- [Windows](#Windows) - - -### Linux ### -1. Install python 3.5.1 from [python.org](http://www.python.org). - -2. Add Linux development libraries. - - sudo apt-get install libffi-dev - sudo apt-get install libssl-dev - sudo apt-get install sshpass - -3. Install python libraries. - - sudo apt-get install python3-pip - pip3 install requests - pip3 install pyopenssl - pip3 install requests - pip3 install cryptography - -1. Useful tools - - PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=linux](https://www.jetbrains.com/pycharm/download/#section=linux). - - - -### Mac OS X ### -1. Install python 3.5.1 from [python.org](http://www.python.org). - -3. Install HomeBrew for package updates. - - /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - -6. Install openssl. - - brew install openssl - -1. Install python libraries. - - pip3 install requests - pip3 install pyopenssl - pip3 install requests - pip3 install cryptography - -1. Useful tools - - PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=macOS](https://www.jetbrains.com/pycharm/download/#section=macOS). - - - -### Windows ### -1. Install python 3.5.1 from [https://www.python.org/downloads/release/python-351/](https://www.python.org/downloads/release/python-351/). -3. The SDK requires some OpenSSL tools to generate digital signatures. - - For 64bit OS: [https://slproweb.com/download/Win64OpenSSL\\_Light-1\\_1_0f.exe](https://slproweb.com/download/Win64OpenSSL_Light-1_1_0f.exe) - - For 32bit OS: [https://slproweb.com/download/Win32OpenSSL\\_Light-1\\_1_0f.exe](https://slproweb.com/download/Win32OpenSSL_Light-1_1_0f.exe) -4. Open a terminal window and use the following commands to install python libraries. - - python -m pip install -U pip - python -m pip install -U pyserial - python -m pip install -U requests - python -m pip install -U pyopenssl -1. Useful tools - 1. Putty: [http://www.putty.org/](http://www.putty.org/) - 2. PyCharm (community version is free): [https://www.jetbrains.com/pycharm/download/#section=windows](https://www.jetbrains.com/pycharm/download/#section=windows). - 3. 7-zip: [http://www.7-zip.org/](http://www.7-zip.org/) - 4. MarkdownPad: [http://markdownpad.com/](http://markdownpad.com/) - - - -## SDK/Apps Directory Structure ## -Below is the directory structure for for the SDK and sample applications. The **BOLD** items are modified or created by the developer. The other files are used by the SDK or are referenced by the other files. - -- Router_Apps (directory) - - app_name (directory) - - **package.ini** - App initialization items. - - **app_name.py** - The app python code. There can be multiple py files based on the app design. - - cs.py - This is included with every sample app and should be in your app. It contains a CSClient class which is a wrapper for the TCP interface to the router config store (i.e. the router trees). - - **install.sh** - Runs on app installation. (update with app name) - - **start.sh** - Script that starts an app (i.e. cppython app_name.py start). - - **stop.sh** - Script that stops an app (i.e. cppython app_name.py stop). - - config (directory) - - **settings.mk** - Build system config settings (i.e. Router MAC, IP, Username, Password, etc.). - - common - - cs.py - This is included with every sample app and can be copied into your app directory. It contains a CSClient class which is a wrapper for the TCP. - - tools (directory) - - bin (directory) - - package_application.py - Used by SDK. - - validate_application.py - Used by SDK. - - pscp.exe - An executable use on Windows by the SDK. - - **sdk_setting.ini** - Used by the SDK and contains the settings for building the app and connecting to the local router. - - Router\_Application\_Development\_Guide.md - - Router\_APIs\_for\_Applications.md - - Makefile\_README.md - -Based on the sdk\_setting.ini file, the SDK will build all files located in the *app\_name* directory into a *tar.gz* package that can then been installed into the router. This installation is either directly into the router (if in DEV mode) or via ECM for grouped routers. - - -## Application Package Anatomy ## -A router application package, which is a *tar.gz* archive, consists of a set of files that includes the python executable, start/stop scripts, initialization files, along with manifest and signature files. This package of files is built by the SDK base on the sdk_settings.ini. Some of these files, like the manifest and signature files, are created by the Make tool. Others are created by the application developer. Below are the example contents for a tar.gz archive created for a router application. - -- app_name (directory) - - METADATA (directory) - - MANIFEST.json - Contains a file list along with hash signatures and other app the package initialization data. - - SIGNATURE.DS - A signature file for the app package. - - app_name.py - The application python executable file. - - cs.py - Another python file used by the app. There could be multiple python files depending on the application design. - - package.ini - The package initialization data. - - install.sh - The script run during installation. - - start.sh - The script run when the app is started. - - stop.sh - The script run when the app is stopped - -### package.ini ### -This initialization file contains information and about the application and items that affect installation and execution. This information will stored in /status/system/sdk within the router config store for installed apps. - -For example: - - [hello_world] - uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c - vendor=Cradlepoint - notes=Hello World Demo Application - firmware_major=6 - firmware_minor=1 - restart=false - reboot=true - version_major=1 - version_minor=6 - auto_start=true - -- **[hello_world]** - - This must contain the name of the application. In this example, hello_world is the application name. - -- **uuid** - - Every app must contain a universally unique identifier (UUID). - -- **vendor** - - This is the vendor name for the app. - -- **notes** - - Add notes to describe the app or anything else. - -- **firmware\_major and firmware\_minor ** - - This is the required router firmware version for the app. ***Not implemented at this time.*** - -- **restart** - If set to 'true', then the application will be restarted if it dies or is not running. If false, the router will not attempt to restart the application. - -- **reboot** - If set to 'true', the router will restart the application following a router reboot. Otherwise, it will not be restarted. - -- **version\_major and version\_minor** - - This contains the app version. This must be incremented for any new production app used installed via ECM. It will not re-install the same version that already exist in the router. - -- **auto_start** - - If set to 'true', the app will automatically start after installation. - - -### install.sh ### -This script is executed when the application is installed in the router. Typically it will just add logs for the installation. - -For example: - - #!/bin/bash - echo "INSTALLATION hello_world on:" >> install.log - date >> install.log - -### start.sh ### -This script is executed when the application is started in the router. It contains the command to start the python script and pass any arguments. - -For example: - - #!/bin/bash - cppython hello_world.py start - -### stop.sh ### -This script is executed when the application is stopped in the router. It contains the command to stop the python script. - -For example: - - #!/bin/bash - cppython hello_world.py stop - - - -## SDK Instructions Overview ## -The SDK includes a python make.py file which is compatible for all supported platforms. There is also a GNU Makefile which can only be used with Linux or OS X. Both perform the same actions which are noted below. However, there are minor setup differences between the two. Developers can choose the one they prefer. For usage instructions, see: - -- [Python SDK Usage](#python_usage) -- [GNU Make SDK Usage](gnu_make_usage) - -### SDK actions are: ### -**default (i.e. no action given):** - Build and test the router reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to ECM. - - **clean:** - Clean all project artifacts. Entails execution of all "-clean" make targets. - - **package:** - Create the app archive tar.gz file. - - **status:** - Fetch and print current app status from the locally connected router. - - **install:** - Secure copy the app archive to a locally connected router. The router must already be in SDK DEV mode via registration and licensing in ECM. - - **start:** - Start the app on the locally connected router. - - **stop:** - Stop the app on the locally connected router. - - **uninstall:** - Uninstall the app from the locally connected router. - - **purge:** - Purge all apps from the locally connected router. - - - -### Python SDK Usage ### -All SDK functions are contained in the make.py python file. While this executable is the same regardless of the workstation platform, the python command is not. Use the following python command based on your platform: - -- Linux or OS X: - - python3 - -- Windows: - - python - -The command structure is: - - python(3) make.py - -The make.py usage is as follows: - -1. Update the sdk_setting.ini file based on your needs. - - Example: - - [sdk] - app_name=ping - dev_client_ip=192.168.0.1 - dev_client_username=admin - dev_client_password=44224267 - -1. Update the UUID in the package.ini file located in the app directory. - - Example: - - [ping] - uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f - -6. Build the application package. - - python(3) make.py - -5. Test connectivity with your router via the status target. - - python(3) make.py status - { - "data": {}, - "success": true - } - -6. Install the application on your router. - - python(3) make.py install - admin@192.168.0.1's password: - hspt.tar.gz 100% 1439 1.4KB/s 00:00 - Received disconnect from 192.168.0.1: 11: Bye Bye - lost connection - -7. Get the application execution status from your router. - - python(3) make.py status - { - "data": { - "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": { - "app": { - "date": "2015-12-04T09:30:39.656151", - "name": "hspt", - "restart": true, - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "vendor": "Cradlebox", - "version_major": 1, - "version_minor": 1 - }, - "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "directory": hspt", - "filename": "dist/tmp_znv2t", - "state": "started", - "summary": "Package started successfully", - "type": "development", - "url": "file:///var/tmp/tmpg1385l", - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" - } - }, - "success": true - } - -8. Uninstall the application from your router. - - python(3) make.py uninstall - { - "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "success": true - } - - - -### GNU Make SDK Usage ### -A GNU Makefile, for Linux or OS X, is also included with the SDK which can perform the same functions as the make.py file. The make targets are identical to the make.py actions. However, environment variable will need to be set in lieu of the sdk_setting.ini file. - -The GNU make usage is as follows: - -1. Export the following variables in your environment. - - APP_NAME - The name of your application. - APP_UUID - Each application must have its own UUID. - DEV_CLIENT_MAC - The mac address of your router. - DEV_CLIENT_IP - The lan ip address of your router. - - Example: - - $ export APP_NAME=hello_world - $ export APP_UUID=616acd0c-0475-479e-a33b-f7054843c973 - $ export DEV_CLIENT_MAC=44224267 - $ export DEV_CLIENT_IP=192.168.20.1 - -6. Build the application package. - - $ make - -5. Test connectivity with your router via the status target. - - $ make status - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X GET http://192.168.0.1/api/status/system/sdk | \ - /usr/bin/env python3 -m json.tool - { - "data": {}, - "success": true - } - -6. Build, test, and install the application on your router. - - $ make install - scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload - admin@192.168.0.1's password: - hspt.tar.gz 100% 1439 1.4KB/s 00:00 - Received disconnect from 192.168.0.1: 11: Bye Bye - lost connection - -7. Get application execution status from your router. - - $ make status - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X GET http://192.168.0.1/api/status/system/sdk | \ - /usr/bin/env python3 -m json.tool - { - "data": { - "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": { - "app": { - "date": "2015-12-04T09:30:39.656151", - "name": "hspt", - "restart": true, - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "vendor": "Cradlebox", - "version_major": 1, - "version_minor": 1 - }, - "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "directory": hspt", - "filename": "dist/tmp_znv2t", - "state": "started", - "summary": "Package started successfully", - "type": "development", - "url": "file:///var/tmp/tmpg1385l", - "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c" - } - }, - "success": true - } - -8. Uninstall the application from your router. - - $ make uninstall - curl -s --digest --insecure -u admin:441dbbec \ - -H "Accept: application/json" \ - -X PUT http://192.168.0.1/api/control/system/sdk/action \ - -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \ - /usr/bin/env python3 -m json.tool - { - "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c", - "success": true - } - - - -## Router Syslog for Debugging ## -Application debugging is accomplished with the use of debug syslogs. However, the default logging level in the router is set to **info** so this will need to be changed to **debug**. It is also possible to send the router logs to a syslog server running on another device. For more information, see the Knowledge Base article ['Understanding Router Log Files'](http://knowledgebase.cradlepoint.com/articles/Support/fw6-Understanding-Router-Log-Files-and-Features?retURL=%2Fapex%2FknowledgeSearch%3Fc%3DAll_Products%26p%3D2%26k%3Dsyslog%26t%3D%26l%3D%26lang%3Den_US&popup=false&c=All_Products&lang=en_US). - -You can also view logs via CLI commands when logged into the router console. This console is available by logging into the router with Secure Shell (i.e. ssh) or by slecting the 'Device Console' from 'System > System Control > Device Options' in the router UI. The logs can be viewed or cleared with the following CLI commands: - - log (displays logs in the terminal window) - log -s (search for logs that contain and displays them) - log -s -i (search for logs that contain but case insensitive) - log clear (clears the log buffer) - help log (display the log command options) - - - -## Router Development Mode ## -In order to install an application directly to the router without using ECM, the router must be placed in **DEV** mode. One would typically debug and test an application using **DEV** mode prior to using ECM for installation. **DEV** mode allows for quicker and easier testing and debugging. Instructions for setting up a router for **DEV** mode is in Knowledge Base article ['SDK Enable Developer Mode'](https://dev.cradlepoint.com/s/article/ka1380000000EXqAAM/sdk-enable-development-mode). - - - -## ECM Application Deployment ## -ECM is used to securely deploy applications to routers at the group level. If an application *tar.gz* package is uploaded to ECM and then assigned to a router group, ECM will then securely download and install the application to the routers within the group. For security, the application files are not user accessible within ECM or routers. That is, one is not able to download the application from the router or ECM. - - - -## Sample Application Walk Through ## -Cradlepoint has provided several sample applications with the SDK which is located [here](https://github.com/cradlepoint/sdk-samples). Any of these apps can be used as a starting point for your application. The application data structure is described [here](#overview). - - -When using the SDK make.py file, be sure to invoke the proper python command based on your computer OS. - -- Linux or OS X: - - python3 - -- Windows: - - python - -### How to Run the Hello World Sample App ### -1. Download the SDK and sample apps from [here](https://github.com/cradlepoint/sdk-samples). -2. Ensure your computer has been setup. See [Computer Setup Instructions](#setup). -2. Connect the router to your computer. This can be done by connecting the LAN port of the router to the USB port of your computer via a USB to Ethernet adapter. -3. Ensure the router is in DEV Mode. See [here](#devmode). -4. Enable Debug logs in the router which is very helpful. See [here](http://knowledgebase.cradlepoint.com/articles/Support/fw6-Understanding-Router-Log-Files-and-Features?retURL=%2Fapex%2FknowledgeSearch%3Fc%3DAll_Products%26p%3D3%26k%3Ddebug%2Blogs%26t%3D%26l%3D%26lang%3Den_US&popup=false&c=All_Products&lang=en_US) -6. Open a terminal window. -7. Change directory to 'sample_apps'. -8. Update the sdk_setting.ini file based on your needs and for the sample app you wish to run. The hello\_world is a good app to test. - - Example: - - [sdk] - app_name=hello_world - dev_client_ip=192.168.0.1 - dev_client_username=admin - dev_client_password=44224267 - -11. Verify router connectivity via: - - $ python(3) make.py status - -12. Create the application package - - $ python(3) make.py - -13. Install the application package - - $ python(3) make.py install - -14. Check the application status to ensure it has started. - - $ python(3) make.py status - -15. Also check the logs in the router to ensure the application is creating 'Hello World' logs. In the router console use the 'log' command. - - - ----------- - -Published Date: 6-1-2017 - -This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at [suggestions@cradlepoint.com](mailto:suggestions@cradlepoint.com). \ No newline at end of file From 7f345ad3dade392dba130462bb392fdf60dd9e43 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Fri, 30 Jun 2017 14:20:19 -0600 Subject: [PATCH 5/9] Delete guide --- Router_Application_Development_Guide.html | 929 ---------------------- 1 file changed, 929 deletions(-) delete mode 100644 Router_Application_Development_Guide.html diff --git a/Router_Application_Development_Guide.html b/Router_Application_Development_Guide.html deleted file mode 100644 index 1d06355b..00000000 --- a/Router_Application_Development_Guide.html +++ /dev/null @@ -1,929 +0,0 @@ - - - -Router_Application_Development_Guide - - - - -

Cradlepoint Router Application Development

-
-

Quick Links

-

Overview

-

Developer Community

-

Cradlepoint Knowledge Base

-

Router Python Environment

-

Computer Setup Instructions

-

Router Development Mode

-

Application Directory Structure

-

Application Package Anatomy

-

SDK Instructions Overview

-

Router Syslog for Debugging

-

ECM Application Deployment

-

Sample Application Walk Through

-

-

Overview

-

Cradlepoint’s Router Application Framework provides the ability to add intelligence in the router. Applications written in Python can be securely downloaded to the router via Enterprise Cloud Manager (ECM). This allows for extended router features, FOG Computing, and IoT management.

-

At a high level, the Cradlepoint Router Apps/SDK is a mechanism to package a collection of files – including executable files – in an archive, which can be transferred securely via ECM, hidden within a Cradlepoint router, and executed as an extension to normal firmware.

-

What is Supported?

-

For the scope of this document, Router Apps are limited to the non-privileged Python scripts. Supported functionality:

-
    -
  • Standard TCP/UDP/SSL socket servers function on ports higher than 1024.
  • -
  • Standard TCP/UDP/SSL socket client to other devices (or the router as 127.0.0.1/localhost).
  • -
  • Access to serial ports via PySerial module, including native and USB-serial ports.
  • -
  • Ability to PING external devices.
  • -
  • UI Extensibility (i.e. Hot Spot splash page or other UI WEB pages)
  • -
  • Access to the Router API (aka: status and control tree data).
  • -
  • USB Memory device file access (USB Memory device support varies based on router).
  • -
-

What is not Supported?

-
    -
  • Any form of natively compiled or kernel linked code.
  • -
  • Any function requiring privileged (or root) permissions.
  • -
  • Access to shared resources (for example: no ability to issue custom AT commands to cell modems).
  • -
  • Modifications of routing or security behavior.
  • -
-

Supported Routers

-

The supported set of routers is:

-
    -
  • AER – 1600/1650, 2100, 3100/3150
  • -
  • COR – IBR1100/1150, IBR900/IBR950, IBR600B/IBR650B, IBR350
  • -
  • ARC - CBA850
  • -
-

New routers products will support Python applications unless they are a special low-function, low-cost model.

-

Application Development

-

During development, an application can be directly installed into a 'DEV Mode' router. This makes it easier to debug and work through the development process. Once the application has been fully debugged and is ready for deployment, it can be installed via ECM at the group level.

-

SDK Toolset

-

Cradlepoint has a simplified SDK, written in python, which builds and creates an app package. The SDK, along with sample applications is located here.

-

For app development, the SDK is be used to install, start, stop, uninstall, and check status of the application in a locally connected development router. The application package is the same for local debugging or for uploading to the ECM for production deployment. Application development can be done on Linux, OS X, and Windows operating systems with the same SDK.

-

-

Developer Community

-

Cradlepoint has a Developer Community Portal to leverage knowledge, share, and collaborate with other developers. This forum is also actively monitored by Cradlepoint to answer questions.

-

-

Cradlepoint Knowledge Base

-

The existing Cradlepoint Knowledge Base also has many articles related to router applications and the SDK.

-

-

Router Python Environment

-

Application are written in python. However, the router only contains a subset of a typical python installation on a computer. The list of python modules in the router are listed here: Router FW 6.1.0 Modules. New python files can be added to you application but they must also adhere to this list.

-

-

Computer Setup Instructions

-

The SDK and sample apps can be downloaded from https://github.com/cradlepoint/sdk-samples. Below are the setup instruction for:

- -

-

Linux

-
    -
  1. -

    Install python 3.5.1 from python.org.

    -
  2. -
  3. -

    Add Linux development libraries.

    -
    sudo apt-get install libffi-dev
    -sudo apt-get install libssl-dev
    -sudo apt-get install sshpass
    -
    - -
  4. -
  5. -

    Install python libraries.

    -
    sudo apt-get install python3-pip
    -pip3 install requests
    -pip3 install pyopenssl
    -pip3 install requests
    -pip3 install cryptography
    -
    - -
  6. -
  7. -

    Useful tools

    -

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=linux.

    -
  8. -
-

-

Mac OS X

-
    -
  1. -

    Install python 3.5.1 from python.org.

    -
  2. -
  3. -

    Install HomeBrew for package updates.

    -
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    -
    - -
  4. -
  5. -

    Install openssl.

    -
    brew install openssl
    -
    - -
  6. -
  7. -

    Install python libraries.

    -
    pip3 install requests
    -pip3 install pyopenssl
    -pip3 install requests
    -pip3 install cryptography
    -
    - -
  8. -
  9. -

    Useful tools

    -

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=macOS.

    -
  10. -
-

-

Windows

-
    -
  1. Install python 3.5.1 from https://www.python.org/downloads/release/python-351/.
  2. -
  3. -The SDK requires some OpenSSL tools to generate digital signatures. - -
  4. -
  5. -

    Open a terminal window and use the following commands to install python libraries.

    -
    python -m pip install -U pip
    -python -m pip install -U pyserial
    -python -m pip install -U requests
    -python -m pip install -U pyopenssl
    -
    - -
  6. -
  7. -Useful tools -
      -
    1. Putty: http://www.putty.org/
    2. -
    3. PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=windows.
    4. -
    5. 7-zip: http://www.7-zip.org/
    6. -
    7. MarkdownPad: http://markdownpad.com/
    8. -
    -
  8. -
-

-

SDK/Apps Directory Structure

-

Below is the directory structure for for the SDK and sample applications. The BOLD items are modified or created by the developer. The other files are used by the SDK or are referenced by the other files.

-
    -
  • -Router_Apps (directory) -
      -
    • -app_name (directory) -
        -
      • package.ini - App initialization items.
      • -
      • app_name.py - The app python code. There can be multiple py files based on the app design.
      • -
      • cs.py - This is included with every sample app and should be in your app. It contains a CSClient class which is a wrapper for the TCP interface to the router config store (i.e. the router trees).
      • -
      • install.sh - Runs on app installation. (update with app name)
      • -
      • start.sh - Script that starts an app (i.e. cppython app_name.py start).
      • -
      • stop.sh - Script that stops an app (i.e. cppython app_name.py stop).
      • -
      -
    • -
    • -config (directory) -
        -
      • settings.mk - Build system config settings (i.e. Router MAC, IP, Username, Password, etc.).
      • -
      -
    • -
    • -common -
        -
      • cs.py - This is included with every sample app and can be copied into your app directory. It contains a CSClient class which is a wrapper for the TCP.
      • -
      -
    • -
    • -tools (directory) -
        -
      • -bin (directory) -
          -
        • package_application.py - Used by SDK.
        • -
        • validate_application.py - Used by SDK.
        • -
        • pscp.exe - An executable use on Windows by the SDK.
        • -
        -
      • -
      -
    • -
    • sdk_setting.ini - Used by the SDK and contains the settings for building the app and connecting to the local router.
    • -
    • Router_Application_Development_Guide.md
    • -
    • Router_APIs_for_Applications.md
    • -
    • Makefile_README.md
    • -
    -
  • -
-

Based on the sdk_setting.ini file, the SDK will build all files located in the app_name directory into a tar.gz package that can then been installed into the router. This installation is either directly into the router (if in DEV mode) or via ECM for grouped routers.

-

-

Application Package Anatomy

-

A router application package, which is a tar.gz archive, consists of a set of files that includes the python executable, start/stop scripts, initialization files, along with manifest and signature files. This package of files is built by the SDK base on the sdk_settings.ini. Some of these files, like the manifest and signature files, are created by the Make tool. Others are created by the application developer. Below are the example contents for a tar.gz archive created for a router application.

-
    -
  • -app_name (directory) -
      -
    • -METADATA (directory) -
        -
      • MANIFEST.json - Contains a file list along with hash signatures and other app the package initialization data.
      • -
      • SIGNATURE.DS - A signature file for the app package.
      • -
      -
    • -
    • app_name.py - The application python executable file.
    • -
    • cs.py - Another python file used by the app. There could be multiple python files depending on the application design.
    • -
    • package.ini - The package initialization data.
    • -
    • install.sh - The script run during installation.
    • -
    • start.sh - The script run when the app is started.
    • -
    • stop.sh - The script run when the app is stopped
    • -
    -
  • -
-

package.ini

-

This initialization file contains information and about the application and items that affect installation and execution. This information will stored in /status/system/sdk within the router config store for installed apps.

-

For example:

-
[hello_world]
-uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c
-vendor=Cradlepoint
-notes=Hello World Demo Application
-firmware_major=6
-firmware_minor=1
-restart=false
-reboot=true
-version_major=1
-version_minor=6
-auto_start=true
-
- -
    -
  • -

    [hello_world]

    -

    This must contain the name of the application. In this example, hello_world is the application name.

    -
  • -
  • -

    uuid -

    -

    Every app must contain a universally unique identifier (UUID).

    -
  • -
  • -

    vendor

    -

    This is the vendor name for the app.

    -
  • -
  • -

    notes

    -

    Add notes to describe the app or anything else.

    -
  • -
  • -

    **firmware_major and firmware_minor **

    -

    This is the required router firmware version for the app. Not implemented at this time.

    -
  • -
  • -

    restart -If set to 'true', then the application will be restarted if it dies or is not running. If false, the router will not attempt to restart the application.

    -
  • -
  • -

    reboot -If set to 'true', the router will restart the application following a router reboot. Otherwise, it will not be restarted.

    -
  • -
  • -

    version_major and version_minor

    -

    This contains the app version. This must be incremented for any new production app used installed via ECM. It will not re-install the same version that already exist in the router.

    -
  • -
  • -

    auto_start

    -

    If set to 'true', the app will automatically start after installation.

    -
  • -
-

install.sh

-

This script is executed when the application is installed in the router. Typically it will just add logs for the installation.

-

For example:

-
#!/bin/bash
-echo "INSTALLATION hello_world on:" >> install.log
-date >> install.log
-
- -

start.sh

-

This script is executed when the application is started in the router. It contains the command to start the python script and pass any arguments.

-

For example:

-
#!/bin/bash
-cppython hello_world.py start
-
- -

stop.sh

-

This script is executed when the application is stopped in the router. It contains the command to stop the python script.

-

For example:

-
#!/bin/bash
-cppython hello_world.py stop
-
- -

-

SDK Instructions Overview

-

The SDK includes a python make.py file which is compatible for all supported platforms. There is also a GNU Makefile which can only be used with Linux or OS X. Both perform the same actions which are noted below. However, there are minor setup differences between the two. Developers can choose the one they prefer. For usage instructions, see:

- -

SDK actions are:

-

default (i.e. no action given): - Build and test the router reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to ECM.

-

clean: - Clean all project artifacts. Entails execution of all "-clean" make targets.

-

package: - Create the app archive tar.gz file.

-

status: - Fetch and print current app status from the locally connected router.

-

install: - Secure copy the app archive to a locally connected router. The router must already be in SDK DEV mode via registration and licensing in ECM.

-

start: - Start the app on the locally connected router.

-

stop: - Stop the app on the locally connected router.

-

uninstall: - Uninstall the app from the locally connected router.

-

purge: - Purge all apps from the locally connected router.

-

-

Python SDK Usage

-

All SDK functions are contained in the make.py python file. While this executable is the same regardless of the workstation platform, the python command is not. Use the following python command based on your platform:

-
    -
  • -

    Linux or OS X:

    -
    python3
    -
    - -
  • -
  • -

    Windows:

    -
    python
    -
    - -
  • -
-

The command structure is:

-
python(3) make.py <action>
-
- -

The make.py usage is as follows:

-
    -
  1. -

    Update the sdk_setting.ini file based on your needs.

    -

    Example:

    -
    [sdk]
    -app_name=ping
    -dev_client_ip=192.168.0.1
    -dev_client_username=admin
    -dev_client_password=44224267
    -
    - -
  2. -
  3. -

    Update the UUID in the package.ini file located in the app directory.

    -

    Example:

    -
    [ping]
    -uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f
    -
    - -
  4. -
  5. -

    Build the application package.

    -
    python(3) make.py
    -
    - -
  6. -
  7. -

    Test connectivity with your router via the status target.

    -
    python(3) make.py status
    -{
    -    "data": {},
    -    "success": true
    -}
    -
    - -
  8. -
  9. -

    Install the application on your router.

    -
    python(3) make.py install
    -admin@192.168.0.1's password: 
    -hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    -Received disconnect from 192.168.0.1: 11: Bye Bye
    -lost connection
    -
    - -
  10. -
  11. -

    Get the application execution status from your router.

    -
    python(3) make.py status
    -{
    -    "data": {
    -        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    -            "app": {
    -                "date": "2015-12-04T09:30:39.656151",
    -                "name": "hspt",
    -                "restart": true,
    -                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -                "vendor": "Cradlebox",
    -                "version_major": 1,
    -                "version_minor": 1
    -            },
    -            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -            "directory": hspt",
    -            "filename": "dist/tmp_znv2t",
    -            "state": "started",
    -            "summary": "Package started successfully",
    -            "type": "development",
    -            "url": "file:///var/tmp/tmpg1385l",
    -            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    -        }
    -    },
    -    "success": true
    -}
    -
    - -
  12. -
  13. -

    Uninstall the application from your router.

    -
    python(3) make.py uninstall
    -{
    -    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -    "success": true
    -}
    -
    - -
  14. -
-

-

GNU Make SDK Usage

-

A GNU Makefile, for Linux or OS X, is also included with the SDK which can perform the same functions as the make.py file. The make targets are identical to the make.py actions. However, environment variable will need to be set in lieu of the sdk_setting.ini file.

-

The GNU make usage is as follows:

-
    -
  1. -

    Export the following variables in your environment.

    -
    APP_NAME - The name of your application.
    -APP_UUID - Each application must have its own UUID.
    -DEV_CLIENT_MAC - The mac address of your router.
    -DEV_CLIENT_IP  - The lan ip address of your router.
    -
    - -

    Example:

    -
    $ export APP_NAME=hello_world
    -$ export APP_UUID=616acd0c-0475-479e-a33b-f7054843c973
    -$ export DEV_CLIENT_MAC=44224267
    -$ export DEV_CLIENT_IP=192.168.20.1
    -
    - -
  2. -
  3. -

    Build the application package.

    -
    $ make
    -
    - -
  4. -
  5. -

    Test connectivity with your router via the status target.

    -
    $ make status
    -curl -s --digest --insecure -u admin:441dbbec \
    -                -H "Accept: application/json" \
    -                -X GET http://192.168.0.1/api/status/system/sdk | \
    -                /usr/bin/env python3 -m json.tool
    -{
    -    "data": {},
    -    "success": true
    -}
    -
    - -
  6. -
  7. -

    Build, test, and install the application on your router.

    -
    $ make install
    -scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload
    -admin@192.168.0.1's password: 
    -hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    -Received disconnect from 192.168.0.1: 11: Bye Bye
    -lost connection
    -
    - -
  8. -
  9. -

    Get application execution status from your router.

    -
    $ make status
    -curl -s --digest --insecure -u admin:441dbbec \
    -                -H "Accept: application/json" \
    -                -X GET http://192.168.0.1/api/status/system/sdk | \
    -                /usr/bin/env python3 -m json.tool
    -{
    -    "data": {
    -        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    -            "app": {
    -                "date": "2015-12-04T09:30:39.656151",
    -                "name": "hspt",
    -                "restart": true,
    -                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -                "vendor": "Cradlebox",
    -                "version_major": 1,
    -                "version_minor": 1
    -            },
    -            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -            "directory": hspt",
    -            "filename": "dist/tmp_znv2t",
    -            "state": "started",
    -            "summary": "Package started successfully",
    -            "type": "development",
    -            "url": "file:///var/tmp/tmpg1385l",
    -            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    -        }
    -    },
    -    "success": true
    -}
    -
    - -
  10. -
  11. -

    Uninstall the application from your router.

    -
    $ make uninstall
    -curl -s --digest --insecure -u admin:441dbbec \
    -                -H "Accept: application/json" \
    -                -X PUT http://192.168.0.1/api/control/system/sdk/action \
    -                -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \
    -                /usr/bin/env python3 -m json.tool
    -{
    -    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    -    "success": true
    -}
    -
    - -
  12. -
-

-

Router Syslog for Debugging

-

Application debugging is accomplished with the use of debug syslogs. However, the default logging level in the router is set to info so this will need to be changed to debug. It is also possible to send the router logs to a syslog server running on another device. For more information, see the Knowledge Base article 'Understanding Router Log Files'.

-

You can also view logs via CLI commands when logged into the router console. This console is available by logging into the router with Secure Shell (i.e. ssh) or by slecting the 'Device Console' from 'System > System Control > Device Options' in the router UI. The logs can be viewed or cleared with the following CLI commands:

-
log (displays logs in the terminal window)
-log -s <text> (search for logs that contain <text> and displays them)
-log -s -i <text> (search for logs that contain <text> but case insensitive)
-log clear (clears the log buffer)
-help log (display the log command options)
-
- -

-

Router Development Mode

-

In order to install an application directly to the router without using ECM, the router must be placed in DEV mode. One would typically debug and test an application using DEV mode prior to using ECM for installation. DEV mode allows for quicker and easier testing and debugging. Instructions for setting up a router for DEV mode is in Knowledge Base article 'SDK Enable Developer Mode'.

-

-

ECM Application Deployment

-

ECM is used to securely deploy applications to routers at the group level. If an application tar.gz package is uploaded to ECM and then assigned to a router group, ECM will then securely download and install the application to the routers within the group. For security, the application files are not user accessible within ECM or routers. That is, one is not able to download the application from the router or ECM.

-

-

Sample Application Walk Through

-

Cradlepoint has provided several sample applications with the SDK which is located here. Any of these apps can be used as a starting point for your application. The application data structure is described here.

-

When using the SDK make.py file, be sure to invoke the proper python command based on your computer OS.

-
    -
  • -

    Linux or OS X:

    -
    python3
    -
    - -
  • -
  • -

    Windows:

    -
    python
    -
    - -
  • -
-

How to Run the Hello World Sample App

-
    -
  1. Download the SDK and sample apps from here.
  2. -
  3. Ensure your computer has been setup. See Computer Setup Instructions.
  4. -
  5. Connect the router to your computer. This can be done by connecting the LAN port of the router to the USB port of your computer via a USB to Ethernet adapter.
  6. -
  7. Ensure the router is in DEV Mode. See here.
  8. -
  9. Enable Debug logs in the router which is very helpful. See here
  10. -
  11. Open a terminal window.
  12. -
  13. Change directory to 'sample_apps'.
  14. -
  15. -

    Update the sdk_setting.ini file based on your needs and for the sample app you wish to run. The hello_world is a good app to test.

    -

    Example:

    -
    [sdk]
    -app_name=hello_world
    -dev_client_ip=192.168.0.1
    -dev_client_username=admin
    -dev_client_password=44224267
    -
    - -
  16. -
  17. -

    Verify router connectivity via:

    -
    $ python(3) make.py status
    -
    - -
  18. -
  19. -

    Create the application package

    -
    $ python(3) make.py 
    -
    - -
  20. -
  21. -

    Install the application package

    -
    $ python(3) make.py install
    -
    - -
  22. -
  23. -

    Check the application status to ensure it has started.

    -
    $ python(3) make.py status
    -
    - -
  24. -
  25. -

    Also check the logs in the router to ensure the application is creating 'Hello World' logs. In the router console use the 'log' command.

    -
  26. -
-
-

Published Date: 6-1-2017

-

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

- - - - From 1b6ad663c3986123e1d8db935fa059e8c01be0d2 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Fri, 30 Jun 2017 14:23:42 -0600 Subject: [PATCH 6/9] Add updated guide. --- Router_Application_Development_Guide.html | 930 ++++++++++++++++++++++ 1 file changed, 930 insertions(+) create mode 100644 Router_Application_Development_Guide.html diff --git a/Router_Application_Development_Guide.html b/Router_Application_Development_Guide.html new file mode 100644 index 00000000..5b9dcba5 --- /dev/null +++ b/Router_Application_Development_Guide.html @@ -0,0 +1,930 @@ + + + +Router_Application_Development_Guide + + + + +

Cradlepoint Router Application Development

+
+

Quick Links

+

Overview

+

Developer Community

+

Cradlepoint Knowledge Base

+

Router Python Environment

+

Computer Setup Instructions

+

Router Development Mode

+

Application Directory Structure

+

Application Package Anatomy

+

SDK Instructions Overview

+

Router Syslog for Debugging

+

NCM Application Deployment

+

Sample Application Walk Through

+

+

Overview

+

Cradlepoint’s Router Application Framework provides the ability to add intelligence in the router. Applications written in Python can be securely downloaded to the router via Network Cloud Manager (NCM). This allows for extended router features, FOG Computing, and IoT management.

+

At a high level, the Cradlepoint Router Apps/SDK is a mechanism to package a collection of files – including executable files – in an archive, which can be transferred securely via NCM, hidden within a Cradlepoint router, and executed as an extension to normal firmware.

+

What is Supported?

+

For the scope of this document, Router Apps are limited to the non-privileged Python scripts. Supported functionality:

+
    +
  • Standard TCP/UDP/SSL socket servers function on ports higher than 1024.
  • +
  • Standard TCP/UDP/SSL socket client to other devices (or the router as 127.0.0.1/localhost).
  • +
  • Access to serial ports via PySerial module, including native and USB-serial ports.
  • +
  • Ability to PING external devices.
  • +
  • UI Extensibility (i.e. Hot Spot splash page or other UI WEB pages)
  • +
  • Access to the Router API (aka: status and control tree data).
  • +
  • USB Memory device file access (USB Memory device support varies based on router).
  • +
+

What is not Supported?

+
    +
  • Any form of natively compiled or kernel linked code.
  • +
  • Any function requiring privileged (or root) permissions.
  • +
  • Access to shared resources (for example: no ability to issue custom AT commands to cell modems).
  • +
  • Modifications of routing or security behavior.
  • +
+

Supported Routers

+

The supported set of routers is:

+
    +
  • AER – 1600/1650, 2100, 3100/3150
  • +
  • COR – IBR1100/1150, IBR900/IBR950, IBR600B/IBR650B, IBR350
  • +
  • ARC - CBA850
  • +
+

New routers products will support Python applications unless they are a special low-function, low-cost model.

+

Application Development

+

During development, an application can be directly installed into a 'DEV Mode' router. This makes it easier to debug and work through the development process. Once the application has been fully debugged and is ready for deployment, it can be installed via NCM at the group level.

+

SDK Toolset

+

Cradlepoint has a simplified SDK, written in python, which builds and creates an app package. The SDK, along with sample applications is located here.

+

For app development, the SDK is used to install, start, stop, uninstall, and check status of the application in a locally connected development router. The application package is the same for local debugging or for uploading to the NCM for production deployment. Application development can be done on Linux, OS X, and Windows operating systems with the same SDK.

+

This document is specifically written for SDN version 2.0 and above.

+

+

Developer Community

+

Cradlepoint has a Developer Community Portal to leverage knowledge, share, and collaborate with other developers. This forum is also actively monitored by Cradlepoint to answer questions.

+

+

Cradlepoint Knowledge Base

+

The existing Cradlepoint Knowledge Base also has many articles related to router applications and the SDK.

+

+

Router Python Environment

+

Application are written in python. However, the router only contains a subset of a typical python installation on a computer. The list of python modules in the router are listed here: Router FW 6.1.0 Modules. New python files can be added to you application but they must also adhere to this list.

+

+

Computer Setup Instructions

+

The SDK and sample apps can be downloaded from https://github.com/cradlepoint/sdk-samples. Below are the setup instruction for:

+ +

+

Linux

+
    +
  1. +

    Install python 3.5.1 from python.org.

    +
  2. +
  3. +

    Add Linux development libraries.

    +
    sudo apt-get install libffi-dev
    +sudo apt-get install libssl-dev
    +sudo apt-get install sshpass
    +
    + +
  4. +
  5. +

    Install python libraries.

    +
    sudo apt-get install python3-pip
    +pip3 install requests
    +pip3 install pyopenssl
    +pip3 install requests
    +pip3 install cryptography
    +
    + +
  6. +
  7. +

    Useful tools

    +

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=linux.

    +
  8. +
+

+

Mac OS X

+
    +
  1. +

    Install python 3.5.1 from python.org.

    +
  2. +
  3. +

    Install HomeBrew for package updates.

    +
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +
    + +
  4. +
  5. +

    Install openssl.

    +
    brew install openssl
    +
    + +
  6. +
  7. +

    Install python libraries.

    +
    pip3 install requests
    +pip3 install pyopenssl
    +pip3 install requests
    +pip3 install cryptography
    +
    + +
  8. +
  9. +

    Useful tools

    +

    PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=macOS.

    +
  10. +
+

+

Windows

+
    +
  1. Install python 3.5.1 from https://www.python.org/downloads/release/python-351/.
  2. +
  3. +The SDK requires some OpenSSL tools to generate digital signatures. + +
  4. +
  5. +

    Open a terminal window and use the following commands to install python libraries.

    +
    python -m pip install -U pip
    +python -m pip install -U pyserial
    +python -m pip install -U requests
    +python -m pip install -U pyopenssl
    +
    + +
  6. +
  7. +Useful tools +
      +
    1. Putty: http://www.putty.org/
    2. +
    3. PyCharm (community version is free): https://www.jetbrains.com/pycharm/download/#section=windows.
    4. +
    5. 7-zip: http://www.7-zip.org/
    6. +
    7. MarkdownPad: http://markdownpad.com/
    8. +
    +
  8. +
+

+

SDK/Apps Directory Structure

+

Below is the directory structure for for the SDK and sample applications. The BOLD items are modified or created by the developer. The other files are used by the SDK or are referenced by the other files.

+
    +
  • +Router_Apps (directory) +
      +
    • +app_name (directory) +
        +
      • package.ini - App initialization items.
      • +
      • app_name.py - The app python code. There can be multiple py files based on the app design.
      • +
      • cs.py - This is included with every sample app and should be in your app. It contains a CSClient class which is a wrapper for the TCP interface to the router config store (i.e. the router trees).
      • +
      • install.sh - Runs on app installation. (update with app name)
      • +
      • start.sh - Script that starts an app (i.e. cppython app_name.py start).
      • +
      • stop.sh - Script that stops an app (i.e. cppython app_name.py stop).
      • +
      +
    • +
    • +config (directory) +
        +
      • settings.mk - Build system config settings (i.e. Router MAC, IP, Username, Password, etc.).
      • +
      +
    • +
    • +common +
        +
      • cs.py - This is included with every sample app and can be copied into your app directory. It contains a CSClient class which is a wrapper for the TCP.
      • +
      +
    • +
    • +tools (directory) +
        +
      • +bin (directory) +
          +
        • package_application.py - Used by SDK.
        • +
        • validate_application.py - Used by SDK.
        • +
        • pscp.exe - An executable use on Windows by the SDK.
        • +
        +
      • +
      +
    • +
    • sdk_setting.ini - Used by the SDK and contains the settings for building the app and connecting to the local router.
    • +
    • Router_Application_Development_Guide.md
    • +
    • Router_APIs_for_Applications.md
    • +
    • Makefile_README.md
    • +
    +
  • +
+

Based on the sdk_setting.ini file, the SDK will build all files located in the app_name directory into a tar.gz package that can then been installed into the router. This installation is either directly into the router (if in DEV mode) or via NCM for grouped routers.

+

+

Application Package Anatomy

+

A router application package, which is a tar.gz archive, consists of a set of files that includes the python executable, start/stop scripts, initialization files, along with manifest and signature files. This package of files is built by the SDK base on the sdk_settings.ini. Some of these files, like the manifest and signature files, are created by the Make tool. Others are created by the application developer. Below are the example contents for a tar.gz archive created for a router application.

+
    +
  • +app_name (directory) +
      +
    • +METADATA (directory) +
        +
      • MANIFEST.json - Contains a file list along with hash signatures and other app the package initialization data.
      • +
      • SIGNATURE.DS - A signature file for the app package.
      • +
      +
    • +
    • app_name.py - The application python executable file.
    • +
    • cs.py - Another python file used by the app. There could be multiple python files depending on the application design.
    • +
    • package.ini - The package initialization data.
    • +
    • install.sh - The script run during installation.
    • +
    • start.sh - The script run when the app is started.
    • +
    • stop.sh - The script run when the app is stopped
    • +
    +
  • +
+

package.ini

+

This initialization file contains information and about the application and items that affect installation and execution. This information will stored in /status/system/sdk within the router config store for installed apps.

+

For example:

+
[hello_world]
+uuid=7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c
+vendor=Cradlepoint
+notes=Hello World Demo Application
+firmware_major=6
+firmware_minor=1
+restart=false
+reboot=true
+version_major=1
+version_minor=6
+auto_start=true
+
+ +
    +
  • +

    [hello_world]

    +

    This must contain the name of the application. In this example, hello_world is the application name.

    +
  • +
  • +

    uuid +

    +

    Every app must contain a universally unique identifier (UUID).

    +
  • +
  • +

    vendor

    +

    This is the vendor name for the app.

    +
  • +
  • +

    notes

    +

    Add notes to describe the app or anything else.

    +
  • +
  • +

    **firmware_major and firmware_minor **

    +

    This is the required router firmware version for the app. Not implemented at this time.

    +
  • +
  • +

    restart +If set to 'true', then the application will be restarted if it dies or is not running. If false, the router will not attempt to restart the application.

    +
  • +
  • +

    reboot +If set to 'true', the router will restart the application following a router reboot. Otherwise, it will not be restarted.

    +
  • +
  • +

    version_major and version_minor

    +

    This contains the app version. This must be incremented for any new production app used installed via NCM. It will not re-install the same version that already exist in the router.

    +
  • +
  • +

    auto_start

    +

    If set to 'true', the app will automatically start after installation.

    +
  • +
+

install.sh

+

This script is executed when the application is installed in the router. Typically it will just add logs for the installation.

+

For example:

+
#!/bin/bash
+echo "INSTALLATION hello_world on:" >> install.log
+date >> install.log
+
+ +

start.sh

+

This script is executed when the application is started in the router. It contains the command to start the python script and pass any arguments.

+

For example:

+
#!/bin/bash
+cppython hello_world.py start
+
+ +

stop.sh

+

This script is executed when the application is stopped in the router. It contains the command to stop the python script.

+

For example:

+
#!/bin/bash
+cppython hello_world.py stop
+
+ +

+

SDK Instructions Overview

+

The SDK includes a python make.py file which is compatible for all supported platforms. There is also a GNU Makefile which can only be used with Linux or OS X. Both perform the same actions which are noted below. However, there are minor setup differences between the two. Developers can choose the one they prefer. For usage instructions, see:

+ +

SDK actions are:

+

default (i.e. no action given): + Build and test the router reference app and create the archive file suitable for deployment to a router DEV mode or for uploading to NCM.

+

clean: + Clean all project artifacts. Entails execution of all "-clean" make targets.

+

package: + Create the app archive tar.gz file.

+

status: + Fetch and print current app status from the locally connected router.

+

install: + Secure copy the app archive to a locally connected router. The router must already be in SDK DEV mode via registration and licensing in NCM.

+

start: + Start the app on the locally connected router.

+

stop: + Stop the app on the locally connected router.

+

uninstall: + Uninstall the app from the locally connected router.

+

purge: + Purge all apps from the locally connected router.

+

+

Python SDK Usage

+

All SDK functions are contained in the make.py python file. While this executable is the same regardless of the workstation platform, the python command is not. Use the following python command based on your platform:

+
    +
  • +

    Linux or OS X:

    +
    python3
    +
    + +
  • +
  • +

    Windows:

    +
    python
    +
    + +
  • +
+

The command structure is:

+
python(3) make.py <action>
+
+ +

The make.py usage is as follows:

+
    +
  1. +

    Update the sdk_setting.ini file based on your needs.

    +

    Example:

    +
    [sdk]
    +app_name=ping
    +dev_client_ip=192.168.0.1
    +dev_client_username=admin
    +dev_client_password=44224267
    +
    + +
  2. +
  3. +

    Update the UUID in the package.ini file located in the app directory.

    +

    Example:

    +
    [ping]
    +uuid=dd91c8ea-cd95-4d9d-b08b-cf62de19684f
    +
    + +
  4. +
  5. +

    Build the application package.

    +
    python(3) make.py
    +
    + +
  6. +
  7. +

    Test connectivity with your router via the status target.

    +
    python(3) make.py status
    +{
    +    "data": {},
    +    "success": true
    +}
    +
    + +
  8. +
  9. +

    Install the application on your router.

    +
    python(3) make.py install
    +admin@192.168.0.1's password: 
    +hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    +Received disconnect from 192.168.0.1: 11: Bye Bye
    +lost connection
    +
    + +
  10. +
  11. +

    Get the application execution status from your router.

    +
    python(3) make.py status
    +{
    +    "data": {
    +        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    +            "app": {
    +                "date": "2015-12-04T09:30:39.656151",
    +                "name": "hspt",
    +                "restart": true,
    +                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +                "vendor": "Cradlebox",
    +                "version_major": 1,
    +                "version_minor": 1
    +            },
    +            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +            "directory": hspt",
    +            "filename": "dist/tmp_znv2t",
    +            "state": "started",
    +            "summary": "Package started successfully",
    +            "type": "development",
    +            "url": "file:///var/tmp/tmpg1385l",
    +            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    +        }
    +    },
    +    "success": true
    +}
    +
    + +
  12. +
  13. +

    Uninstall the application from your router.

    +
    python(3) make.py uninstall
    +{
    +    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +    "success": true
    +}
    +
    + +
  14. +
+

+

GNU Make SDK Usage

+

A GNU Makefile, for Linux or OS X, is also included with the SDK which can perform the same functions as the make.py file. The make targets are identical to the make.py actions. However, environment variable will need to be set in lieu of the sdk_setting.ini file.

+

The GNU make usage is as follows:

+
    +
  1. +

    Export the following variables in your environment.

    +
    APP_NAME - The name of your application.
    +APP_UUID - Each application must have its own UUID.
    +DEV_CLIENT_MAC - The mac address of your router.
    +DEV_CLIENT_IP  - The lan ip address of your router.
    +
    + +

    Example:

    +
    $ export APP_NAME=hello_world
    +$ export APP_UUID=616acd0c-0475-479e-a33b-f7054843c973
    +$ export DEV_CLIENT_MAC=44224267
    +$ export DEV_CLIENT_IP=192.168.20.1
    +
    + +
  2. +
  3. +

    Build the application package.

    +
    $ make
    +
    + +
  4. +
  5. +

    Test connectivity with your router via the status target.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {},
    +    "success": true
    +}
    +
    + +
  6. +
  7. +

    Build, test, and install the application on your router.

    +
    $ make install
    +scp /home/sfisher/dev/sdk/hspt.tar.gz admin@192.168.0.1:/app_upload
    +admin@192.168.0.1's password: 
    +hspt.tar.gz                          100% 1439     1.4KB/s   00:00    
    +Received disconnect from 192.168.0.1: 11: Bye Bye
    +lost connection
    +
    + +
  8. +
  9. +

    Get application execution status from your router.

    +
    $ make status
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X GET http://192.168.0.1/api/status/system/sdk | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": {
    +        "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c": {
    +            "app": {
    +                "date": "2015-12-04T09:30:39.656151",
    +                "name": "hspt",
    +                "restart": true,
    +                "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +                "vendor": "Cradlebox",
    +                "version_major": 1,
    +                "version_minor": 1
    +            },
    +            "base_directory": "/var/mnt/sdk/apps/7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +            "directory": hspt",
    +            "filename": "dist/tmp_znv2t",
    +            "state": "started",
    +            "summary": "Package started successfully",
    +            "type": "development",
    +            "url": "file:///var/tmp/tmpg1385l",
    +            "uuid": "7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"
    +        }
    +    },
    +    "success": true
    +}
    +
    + +
  10. +
  11. +

    Uninstall the application from your router.

    +
    $ make uninstall
    +curl -s --digest --insecure -u admin:441dbbec \
    +                -H "Accept: application/json" \
    +                -X PUT http://192.168.0.1/api/control/system/sdk/action \
    +                -d data='"uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c"' | \
    +                /usr/bin/env python3 -m json.tool
    +{
    +    "data": "uninstall 7042c8fd-fe7a-4846-aed1-e3f8d6a1c91c",
    +    "success": true
    +}
    +
    + +
  12. +
+

+

Router Syslog for Debugging

+

Application debugging is accomplished with the use of debug syslogs. However, the default logging level in the router is set to info so this will need to be changed to debug. It is also possible to send the router logs to a syslog server running on another device. For more information, see the Knowledge Base article 'Understanding Router Log Files'.

+

You can also view logs via CLI commands when logged into the router console. This console is available by logging into the router with Secure Shell (i.e. ssh) or by slecting the 'Device Console' from 'System > System Control > Device Options' in the router UI. The logs can be viewed or cleared with the following CLI commands:

+
log (displays logs in the terminal window)
+log -s <text> (search for logs that contain <text> and displays them)
+log -s -i <text> (search for logs that contain <text> but case insensitive)
+log clear (clears the log buffer)
+help log (display the log command options)
+
+ +

+

Router Development Mode

+

In order to install an application directly to the router without using NCM, the router must be placed in DEV mode. One would typically debug and test an application using DEV mode prior to using NCM for installation. DEV mode allows for quicker and easier testing and debugging. Instructions for setting up a router for DEV mode is in Knowledge Base article 'SDK Enable Developer Mode'.

+

+

NCM Application Deployment

+

NCM is used to securely deploy applications to routers at the group level. If an application tar.gz package is uploaded to NCM and then assigned to a router group, NCM will then securely download and install the application to the routers within the group. For security, the application files are not user accessible within NCM or routers. That is, one is not able to download the application from the router or NCM.

+

+

Sample Application Walk Through

+

Cradlepoint has provided several sample applications with the SDK which is located here. Any of these apps can be used as a starting point for your application. The application data structure is described here.

+

When using the SDK make.py file, be sure to invoke the proper python command based on your computer OS.

+
    +
  • +

    Linux or OS X:

    +
    python3
    +
    + +
  • +
  • +

    Windows:

    +
    python
    +
    + +
  • +
+

How to Run the Hello World Sample App

+
    +
  1. Download the SDK and sample apps from here.
  2. +
  3. Ensure your computer has been setup. See Computer Setup Instructions.
  4. +
  5. Connect the router to your computer. This can be done by connecting the LAN port of the router to the USB port of your computer via a USB to Ethernet adapter.
  6. +
  7. Ensure the router is in DEV Mode. See here.
  8. +
  9. Enable Debug logs in the router which is very helpful. See here
  10. +
  11. Open a terminal window.
  12. +
  13. Change directory to 'sample_apps'.
  14. +
  15. +

    Update the sdk_setting.ini file based on your needs and for the sample app you wish to run. The hello_world is a good app to test.

    +

    Example:

    +
    [sdk]
    +app_name=hello_world
    +dev_client_ip=192.168.0.1
    +dev_client_username=admin
    +dev_client_password=44224267
    +
    + +
  16. +
  17. +

    Verify router connectivity via:

    +
    $ python(3) make.py status
    +
    + +
  18. +
  19. +

    Create the application package

    +
    $ python(3) make.py 
    +
    + +
  20. +
  21. +

    Install the application package

    +
    $ python(3) make.py install
    +
    + +
  22. +
  23. +

    Check the application status to ensure it has started.

    +
    $ python(3) make.py status
    +
    + +
  24. +
  25. +

    Also check the logs in the router to ensure the application is creating 'Hello World' logs. In the router console use the 'log' command.

    +
  26. +
+
+

Published Date: 6-30-2017

+

This article not have what you need? Not find what you were looking for? Think this article can be improved? Please let us know at suggestions@cradlepoint.com.

+ + + + From 38c4cfb1ec16d97b8726d88782679ad11b9abbba Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Fri, 30 Jun 2017 14:30:46 -0600 Subject: [PATCH 7/9] Remove some code that was left in by accident. --- app_template/app_template.py | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/app_template/app_template.py b/app_template/app_template.py index 831026da..018ddaaf 100644 --- a/app_template/app_template.py +++ b/app_template/app_template.py @@ -17,39 +17,7 @@ def start_router_app(): try: cs.CSClient().log(APP_NAME, 'start_router_app()') - gps_clients = [{ - "distance_interval_meters": 0, - "enabled": True, - "interval": 10, - "language": "nmea", - "name": "test server", - "nmea": { - "include_id": True, - "prepend_id": False, - "provide_gga": True, - "provide_rmc": True, - "provide_vtg": True - }, - "server": { - "lan": True, - "port": 12345, - "wan": True - }, - "stationary_distance_threshold_meters": 20, - "stationary_movement_event_threshold_seconds": 0, - "stationary_time_interval_seconds": 0, - "taip": { - "include_cr_lf_enabled": False, - "provide_al": True, - "provide_cp": True, - "provide_id": True, - "provide_ln": True, - "provide_pv": True, - "report_msg_checksum_enabled": True, - "vehicle_id_reporting_enabled": True - } - }] - response = cs.CSClient().put('/config/system/gps/connections', gps_clients) + except Exception as e: cs.CSClient().log(APP_NAME, 'Something went wrong in start_router_app()! exception: {}'.format(e)) raise From 8d4efc9935f6c8c3d3a06caa997e417a54ffd6b1 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Fri, 30 Jun 2017 14:33:08 -0600 Subject: [PATCH 8/9] Update README file. --- README.html | 488 ---------------------------------------------------- README.md | 2 +- 2 files changed, 1 insertion(+), 489 deletions(-) delete mode 100644 README.html diff --git a/README.html b/README.html deleted file mode 100644 index b29a0cf4..00000000 --- a/README.html +++ /dev/null @@ -1,488 +0,0 @@ - - - -README - - - - -

Router SDK/App sample Design Tools.

-
-

This directory contains the Router SDK tools and sample applications. Below is a desciption of each. The Router Applications Development Guide is the best document to read first.

-

*** IMPORTANT - PLEASE READ ***

-

This is version 2.0 of the Router SDK and applications. The SDK has been simplified from the previous SDK to decrease the learning curve to allow more focus on application development. The router application infrastructure and packaging is unchanged. That is, an 'tar.gz' application package built with the previous SDK can still be installed into the router using SDK version 2.0. However, the coding of an application version 1.0 may need to be re-factored in order for continued development with SDK version 2.0. Please see document SDK_version_1.0_app_refactor.html in this directory for details.

-

Documents

-
    -
  • -README.html -
      -
    • This README file.
    • -
    -
  • -
  • -Router_Application_Development_Guide.html -
      -
    • The main document that describes application development.
    • -
    -
  • -
  • -Router_APIs_for_Applications.html -
      -
    • The router config store API in the router.
    • -
    -
  • -
  • -GNU_Make_README.html -
      -
    • The Linux GNU make instructions for the SDK.
    • -
    -
  • -
-

Sample Application Directories

-
    -
  • -app_template -
      -
    • A skeleton template for the creation of a new application.
    • -
    -
  • -
  • -Boot1 -
      -
    • On bootup, this application will select test the connection of each sim in a dual sim modem and enable the best.
    • -
    -
  • -
  • -email -
      -
    • Sends an email.
    • -
    -
  • -
  • -ftp_client -
      -
    • Creates a file and uploads it to an FTP server.
    • -
    -
  • -
  • -ftp_server -
      -
    • Creates an FTP server in the router. A USB memory device is used as the FTP directory.
    • -
    -
  • -
  • -gps_localhost -
      -
    • Assuming the Cradlepoint router is configured to forward NMEA sentences to a localhost port, open the port as a server and receive the streaming GSP data.
    • -
    -
  • -
  • -gps_probe -
      -
    • Probe the GPS hardware and log the results.
    • -
    -
  • -
  • -hello_world -
      -
    • Outputs a 'Hello World!' log every 10 seconds.
    • -
    -
  • -
  • -hspt -
      -
    • Sets up a custom Hot Spot landing page.
    • -
    -
  • -
  • -list_serial_ports -
      -
    • Lists out the serial ports in the logs.
    • -
    -
  • -
  • -loglevel -
      -
    • Changes the router log level.
    • -
    -
  • -
  • -modbus_poll -
      -
    • Poll a single range of Modbus registers from an attached serial Modbus/RTU PLC or slave device.
    • -
    -
  • -
  • -modbus_simple_bridge -
      -
    • A basic Modbus/TCP to RTU bridge.
    • -
    -
  • -
  • -ping -
      -
    • Ping an address and log the results.
    • -
    -
  • -
  • -power_gpio -
      -
    • Query the 2x2 power connector GPIO.
    • -
    -
  • -
  • -send_alert -
      -
    • Sends an alert to the ECM when the application is started and stopped.
    • -
    -
  • -
  • -send_to_server -
      -
    • Gets the '/status' from the reouter config store and send it to a test server.
    • -
    -
  • -
  • -serial_echo -
      -
    • Waits for data to enter the serial port, then echo back out.
    • -
    -
  • -
  • -simple_web_server -
      -
    • A simple web server to receive messages. Note that any 'server function' requires the router firewall to be correctly changed to allow client access to the router.
    • -
    -
  • -
-

SDK Directories

-
    -
  • -common -
      -
    • Contains the cs.py file which should be copied into an application folder. It is a wrapper for the TCP interface to the router config store.
    • -
    -
  • -
  • -config -
      -
    • Contains the settings.mk file for Linux users that want to use GNU make for application development instead of python make.py.
    • -
    -
  • -
  • -tools -
      -
    • Contains support files for the SDK. There is also a simple python syslog server that can be used during application development.
    • -
    -
  • -
-

Files

-
    -
  • -make.py -
      -
    • The main python tool used to build application packages and install, uninstall, start, stop, or purge from a locally connected router that is in DEV mode.
    • -
    -
  • -
  • -Makefile -
      -
    • The Makefile for Linux users that want to use GNU make for application development instead of python make.py.
    • -
    -
  • -
  • -sdk_settings.ini -
      -
    • This is the ini file that contains the settings used by python make.py.
    • -
    -
  • -
- - - - diff --git a/README.md b/README.md index a86086d6..34094876 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Router SDK/App sample Design Tools. +# Router SDK Design Tools and sample applications. ---------- This directory contains the Router SDK tools and sample applications. Below is a desciption of each. The Router Applications Development Guide is the best document to read first. From c291619a8e01be88208d7a45b4490736fac9d9c6 Mon Sep 17 00:00:00 2001 From: tsnuggs Date: Mon, 3 Jul 2017 10:52:45 -0600 Subject: [PATCH 9/9] Update cs.py so that the json data from get is formatted the same when running in the computer or the router. --- app_template/cs.py | 2 +- common/cs.py | 22 ++++++++++++++++++---- email/cs.py | 22 ++++++++++++++++++---- ftp_client/cs.py | 22 ++++++++++++++++++---- ftp_server/cs.py | 22 ++++++++++++++++++---- gps_localhost/cs.py | 22 ++++++++++++++++++---- gps_probe/cs.py | 22 ++++++++++++++++++---- hello_world/cs.py | 22 ++++++++++++++++++---- hspt/cs.py | 22 ++++++++++++++++++---- list_serial_ports/cs.py | 22 ++++++++++++++++++---- loglevel/cs.py | 22 ++++++++++++++++++---- modbus_poll/cs.py | 22 ++++++++++++++++++---- ping/cs.py | 22 ++++++++++++++++++---- power_gpio/cs.py | 22 ++++++++++++++++++---- send_alert/cs.py | 22 ++++++++++++++++++---- serial_echo/cs.py | 22 ++++++++++++++++++---- simple_web_server/cs.py | 22 ++++++++++++++++++---- 17 files changed, 289 insertions(+), 65 deletions(-) diff --git a/app_template/cs.py b/app_template/cs.py index c5e5ed17..9359ed03 100644 --- a/app_template/cs.py +++ b/app_template/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" diff --git a/common/cs.py b/common/cs.py index b83a98d0..9359ed03 100644 --- a/common/cs.py +++ b/common/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/email/cs.py b/email/cs.py index b83a98d0..9359ed03 100644 --- a/email/cs.py +++ b/email/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/ftp_client/cs.py b/ftp_client/cs.py index b83a98d0..9359ed03 100644 --- a/ftp_client/cs.py +++ b/ftp_client/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/ftp_server/cs.py b/ftp_server/cs.py index b83a98d0..9359ed03 100644 --- a/ftp_server/cs.py +++ b/ftp_server/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/gps_localhost/cs.py b/gps_localhost/cs.py index b83a98d0..9359ed03 100644 --- a/gps_localhost/cs.py +++ b/gps_localhost/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/gps_probe/cs.py b/gps_probe/cs.py index b83a98d0..9359ed03 100644 --- a/gps_probe/cs.py +++ b/gps_probe/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/hello_world/cs.py b/hello_world/cs.py index b83a98d0..9359ed03 100644 --- a/hello_world/cs.py +++ b/hello_world/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/hspt/cs.py b/hspt/cs.py index b83a98d0..9359ed03 100644 --- a/hspt/cs.py +++ b/hspt/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/list_serial_ports/cs.py b/list_serial_ports/cs.py index b83a98d0..9359ed03 100644 --- a/list_serial_ports/cs.py +++ b/list_serial_ports/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/loglevel/cs.py b/loglevel/cs.py index b83a98d0..9359ed03 100644 --- a/loglevel/cs.py +++ b/loglevel/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/modbus_poll/cs.py b/modbus_poll/cs.py index b83a98d0..9359ed03 100644 --- a/modbus_poll/cs.py +++ b/modbus_poll/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/ping/cs.py b/ping/cs.py index b83a98d0..9359ed03 100644 --- a/ping/cs.py +++ b/ping/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/power_gpio/cs.py b/power_gpio/cs.py index b83a98d0..9359ed03 100644 --- a/power_gpio/cs.py +++ b/power_gpio/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/send_alert/cs.py b/send_alert/cs.py index b83a98d0..9359ed03 100644 --- a/send_alert/cs.py +++ b/send_alert/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/serial_echo/cs.py b/serial_echo/cs.py index b83a98d0..9359ed03 100644 --- a/serial_echo/cs.py +++ b/serial_echo/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request.""" diff --git a/simple_web_server/cs.py b/simple_web_server/cs.py index b83a98d0..9359ed03 100644 --- a/simple_web_server/cs.py +++ b/simple_web_server/cs.py @@ -109,7 +109,7 @@ def get(self, base, query='', tree=0): print("Timeout: router at {} did not respond.".format(router_ip)) return None - return json.loads(response.text)['data'] + return json.loads(response.text) def put(self, base, value='', query='', tree=0): """Send a put request.""" @@ -137,13 +137,27 @@ def put(self, base, value='', query='', tree=0): def append(self, base, value='', query=''): """Send an append request.""" + value = json.dumps(value).replace(' ', '') if sys.platform == 'linux2': - value = json.dumps(value).replace(' ', '') cmd = "post\n{}\n{}\n{}\n".format(base, query, value) return self._dispatch(cmd) else: - print('Append is only available when running the app in the router.') - raise NotImplementedError + # Running in a computer so use http to send the post to the router. + import requests + router_ip, router_username, router_password = self._get_router_access_info() + router_api = 'http://{}/api/{}/{}'.format(router_ip, base, query) + + try: + response = requests.post(router_api, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + auth=requests.auth.HTTPDigestAuth(router_username, router_password), + data={"data": '{}'.format(value)}) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError): + print("Timeout: router at {} did not respond.".format(router_ip)) + return None + + return response.text def delete(self, base, query=''): """Send a delete request."""

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¥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 P{bgypi~3Dqg#{uri8+gLP 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