From 3c98868f6cdabaf294b905d08a15fd73e5a8f293 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 12:15:03 -0400 Subject: [PATCH 01/11] deprecate explicit cache feature --- docs/tuning.rst | 37 ++++-------------------- include/libtorrent/aux_/session_impl.hpp | 2 ++ include/libtorrent/session_settings.hpp | 2 ++ include/libtorrent/settings_pack.hpp | 8 +++++ include/libtorrent/torrent.hpp | 4 ++- src/session.cpp | 1 - src/session_impl.cpp | 4 +++ src/settings_pack.cpp | 4 +-- src/torrent.cpp | 2 ++ test/swarm_suite.cpp | 12 +------- test/swarm_suite.hpp | 1 - 11 files changed, 30 insertions(+), 47 deletions(-) diff --git a/docs/tuning.rst b/docs/tuning.rst index b8d6e4493..d2297797f 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -238,42 +238,17 @@ In order to increase the possibility of read cache hits, set the ``session_settings::cache_expiry`` to a large number. This won't degrade anything as long as the client is only seeding, and not downloading any torrents. -In order to increase the disk cache hit rate, you can enable suggest messages based on -what's in the read cache. To do this, set ``session_settings::suggest_mode`` to -``session_settings::suggest_read_cache``. This will send suggest messages to peers -for the most recently used pieces in the read cache. This is especially useful if you -also enable explicit read cache, by settings ``session_settings::explicit_read_cache`` -to the number of pieces to keep in the cache. The explicit read cache will make the -disk read cache stick, and not be evicted by cache misses. The explicit read cache -will automatically pull in the rarest pieces in the read cache. - -Assuming that you seed much more data than you can keep in the cache, to a large -numbers of peers (so that the read cache wouldn't be useful anyway), this may be a -good idea. - -When peers first connect, libtorrent will send them a number of allow-fast messages, -which lets the peers download certain pieces even when they are choked, since peers -are choked by default, this often triggers immediate requests for those pieces. In the -case of using explicit read cache and suggesting those pieces, allowing fast pieces -should be disabled, to not systematically trigger requests for pieces that are not cached -for all peers. You can turn off allow-fast by settings ``session_settings::allowed_fast_set_size`` -to 0. - -As an alternative to the explicit cache and suggest messages, there's a *guided cache* -mode. This means the size of the read cache line that's stored in the cache is determined -based on the upload rate to the peer that triggered the read operation. The idea being -that slow peers don't use up a disproportional amount of space in the cache. This -is enabled through ``session_settings::guided_read_cache``. +There's a *guided cache* mode. This means the size of the read cache line that's +stored in the cache is determined based on the upload rate to the peer that +triggered the read operation. The idea being that slow peers don't use up a +disproportional amount of space in the cache. This is enabled through +``session_settings::guided_read_cache``. In cases where the assumption is that the cache is only used as a read-ahead, and that no other peer will ever request the same block while it's still in the cache, the read cache can be set to be *volatile*. This means that every block that is requested out of the read cache is removed immediately. This saves a significant amount of cache space -which can be used as read-ahead for other peers. This mode should **never** be combined -with either ``explicit_read_cache`` or ``suggest_read_cache``, since those uses opposite -strategies for the read cache. You don't want to on one hand attract peers to request -the same pieces, and on the other hand assume that they won't request the same pieces -and drop them when the first peer requests it. To enable volatile read cache, set +which can be used as read-ahead for other peers. To enable volatile read cache, set ``session_settings::volatile_read_cache`` to true. SSD as level 2 cache diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index 186dbfc42..a0cab6bf4 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -933,6 +933,7 @@ namespace libtorrent // torrents. int m_auto_scrape_time_scaler; +#ifndef TORRENT_NO_DEPRECATED // the index of the torrent that we'll // refresh the next time int m_next_explicit_cache_torrent; @@ -941,6 +942,7 @@ namespace libtorrent // the next time the read cache is rotated, if we're // using an explicit read read cache. int m_cache_rotation_timer; +#endif // the index of the torrent that we'll // refresh the next time diff --git a/include/libtorrent/session_settings.hpp b/include/libtorrent/session_settings.hpp index a65b73826..6ec1c2e20 100644 --- a/include/libtorrent/session_settings.hpp +++ b/include/libtorrent/session_settings.hpp @@ -451,6 +451,7 @@ namespace libtorrent // once we want to calculate the piece hash bool dont_flush_write_cache; +#ifndef TORRENT_NO_DEPRECATE // defaults to 0. If set to something greater than 0, the disk read cache // will not be evicted by cache misses and will explicitly be controlled // based on the rarity of pieces. Rare pieces are more likely to be @@ -468,6 +469,7 @@ namespace libtorrent // the cache, so that subsequent refreshes only swaps in pieces that are // rarer than whatever is in the cache at the time. int explicit_cache_interval; +#endif // the buffer modes to use for reading and writing. Set // session_settings::disk_io_read_mode and disk_io_write_mode to one of diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index dc1f2db96..435cb13be 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -275,6 +275,7 @@ namespace libtorrent // hash dont_flush_write_cache, +#ifndef TORRENT_NO_DEPRECATED // ``explicit_read_cache`` defaults to 0. If set to something greater // than 0, the disk read cache will not be evicted by cache misses and // will explicitly be controlled based on the rarity of pieces. Rare @@ -284,6 +285,9 @@ namespace libtorrent // actual read cache can't fit as many, it will essentially be // clamped. explicit_read_cache, +#else + deprecated10, +#endif // allocate separate, contiguous, buffers for read and write calls. // Only used where writev/readv cannot be used will use more RAM but @@ -924,6 +928,7 @@ namespace libtorrent cache_buffer_chunk_size, cache_expiry, +#ifndef TORRENT_NO_DEPRECATED // ``explicit_cache_interval`` is the number of seconds in between // each refresh of a part of the explicit read cache. Torrents take // turns in refreshing and this is the time in between each torrent @@ -933,6 +938,9 @@ namespace libtorrent // subsequent refreshes only swaps in pieces that are rarer than // whatever is in the cache at the time. explicit_cache_interval, +#else + deprecated11, +#endif // determines how files are opened when they're in read only mode // versus read and write mode. The options are: diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index 2339e4805..c9f418d31 100644 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -676,14 +676,16 @@ namespace libtorrent void get_peer_info(std::vector& v); void get_download_queue(std::vector* queue) const; +#ifndef TORRENT_NO_DEPRECATED void refresh_explicit_cache(int cache_size); +#endif void add_suggest_piece(int piece); void update_suggest_piece(int index, int change); void update_auto_sequential(); + void refresh_suggest_pieces(); void do_refresh_suggest_pieces(); - void on_cache_info(disk_io_job const* j); // -------------------------------------------- // TRACKER MANAGEMENT diff --git a/src/session.cpp b/src/session.cpp index eec512187..6231deb3f 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -231,7 +231,6 @@ namespace libtorrent // download rate set.set_int(settings_pack::max_queued_disk_bytes, 7 * 1024 * 1024); - set.set_bool(settings_pack::explicit_read_cache, false); // prevent fast pieces to interfere with suggested pieces // since we unchoke everyone, we don't need fast pieces anyway set.set_int(settings_pack::allowed_fast_set_size, 0); diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 958a78347..d5dc33629 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -393,8 +393,10 @@ namespace aux { , m_optimistic_unchoke_time_scaler(0) , m_disconnect_time_scaler(90) , m_auto_scrape_time_scaler(180) +#ifndef TORRENT_NO_DEPRECATED , m_next_explicit_cache_torrent(0) , m_cache_rotation_timer(0) +#endif , m_next_suggest_torrent(0) , m_suggest_timer(0) , m_peak_up_rate(0) @@ -3333,6 +3335,7 @@ retry: ++m_next_suggest_torrent; } +#ifndef TORRENT_NO_DEPRECATED // -------------------------------------------------------------- // refresh explicit disk read cache // -------------------------------------------------------------- @@ -3368,6 +3371,7 @@ retry: least_recently_refreshed->second->refresh_explicit_cache(cache_size); ++m_next_explicit_cache_torrent; } +#endif // -------------------------------------------------------------- // connect new peers diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index 608c77ae1..0dace4240 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -152,7 +152,7 @@ namespace libtorrent SET(use_read_cache, true, 0), DEPRECATED_SET(use_write_cache, true, 0), SET(dont_flush_write_cache, false, 0), - SET(explicit_read_cache, false, 0), + DEPRECATED_SET(explicit_read_cache, false, 0), SET(coalesce_reads, false, 0), SET(coalesce_writes, false, 0), SET(auto_manage_prefer_seeds, false, 0), @@ -251,7 +251,7 @@ namespace libtorrent SET(cache_size, 1024, 0), SET(cache_buffer_chunk_size, 0, &session_impl::update_cache_buffer_chunk_size), SET(cache_expiry, 300, 0), - SET(explicit_cache_interval, 30, 0), + DEPRECATED_SET(explicit_cache_interval, 30, 0), SET(disk_io_write_mode, settings_pack::enable_os_cache, 0), SET(disk_io_read_mode, settings_pack::enable_os_cache, 0), SET(outgoing_port, 0, 0), diff --git a/src/torrent.cpp b/src/torrent.cpp index da5a53297..ced7edf54 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -10576,6 +10576,7 @@ namespace libtorrent update_want_peers(); } +#ifndef TORRENT_NO_DEPRECATED // TODO: 2 this should probably be removed void torrent::refresh_explicit_cache(int cache_size) { @@ -10674,6 +10675,7 @@ namespace libtorrent } } } +#endif void torrent::sent_bytes(int bytes_payload, int bytes_protocol) { diff --git a/test/swarm_suite.cpp b/test/swarm_suite.cpp index 997e7ac8b..3be77faf7 100644 --- a/test/swarm_suite.cpp +++ b/test/swarm_suite.cpp @@ -48,13 +48,12 @@ void test_swarm(int flags) using namespace libtorrent; namespace lt = libtorrent; - fprintf(stderr, "\n\n ==== TEST SWARM === %s%s%s%s%s%s ===\n\n\n" + fprintf(stderr, "\n\n ==== TEST SWARM === %s%s%s%s%s ===\n\n\n" , (flags & super_seeding) ? "super-seeding ": "" , (flags & strict_super_seeding) ? "strict-super-seeding ": "" , (flags & seed_mode) ? "seed-mode ": "" , (flags & time_critical) ? "time-critical ": "" , (flags & suggest) ? "suggest ": "" - , (flags & explicit_cache) ? "explicit-cache ": "" ); // in case the previous run was terminated @@ -89,15 +88,6 @@ void test_swarm(int flags) if (flags & suggest) pack.set_int(settings_pack::suggest_mode, settings_pack::suggest_read_cache); - if (flags & explicit_cache) - pack.set_bool(settings_pack::explicit_read_cache, true); - - if (flags & explicit_cache) - { - pack.set_bool(settings_pack::explicit_read_cache, true); - pack.set_int(settings_pack::explicit_cache_interval, 5); - } - // this is to avoid everything finish from a single peer // immediately. To make the swarm actually connect all // three peers before finishing. diff --git a/test/swarm_suite.hpp b/test/swarm_suite.hpp index 68f7aeaa5..8356fd80b 100644 --- a/test/swarm_suite.hpp +++ b/test/swarm_suite.hpp @@ -39,7 +39,6 @@ enum test_flags_t seed_mode = 4, time_critical = 8, suggest = 16, - explicit_cache = 32 }; void EXPORT test_swarm(int flags = 0); From d3df16cd12f6f4f73496db850bddb17d0b8992e8 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 14:38:45 -0400 Subject: [PATCH 02/11] convert tracker try-next test to be a simulation (and deterministic) --- simulation/test_tracker.cpp | 97 ++++++++++++++++++++++++++++-- test/test_tracker.cpp | 115 ------------------------------------ 2 files changed, 92 insertions(+), 120 deletions(-) diff --git a/simulation/test_tracker.cpp b/simulation/test_tracker.cpp index e33659c45..7e7789c00 100644 --- a/simulation/test_tracker.cpp +++ b/simulation/test_tracker.cpp @@ -363,8 +363,17 @@ TORRENT_TEST(ipv6_support) TEST_EQUAL(v6_announces, 2); } -template -void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = "/announce") +// this runs a simulation of a torrent with tracker(s), making sure the request +// received by the tracker matches the expectation. +// The Setup function is run first, giving the test an opportunity to add +// trackers to the torrent. It's expected to return the number of seconds to +// wait until test2 is called. +// The Announce function is called on http requests. Test1 is run on the session +// 5 seconds after startup. The tracker is running at 10.0.0.2 (or tracker.com) +// port 8080. +template +void tracker_test(Setup setup, Announce a, Test1 test1, Test2 test2 + , char const* url_path = "/announce") { using sim::asio::ip::address_v4; sim_config network_cfg; @@ -390,7 +399,7 @@ void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = " p.name = "test-torrent"; p.save_path = "."; p.info_hash.assign("abababababababababab"); - p.trackers.push_back("http://tracker.com:8080/announce"); + int const delay = setup(p); ses->async_add_torrent(p); // run the test 5 seconds in @@ -405,7 +414,7 @@ void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = " }); asio::high_resolution_timer t2(ios); - t2.expires_from_now(chrono::seconds(9)); + t2.expires_from_now(chrono::seconds(5 + delay)); t2.async_wait([&ses,&test2](boost::system::error_code const& ec) { std::vector torrents = ses->get_torrents(); @@ -416,7 +425,7 @@ void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = " // then shut down 10 seconds in asio::high_resolution_timer t3(ios); - t3.expires_from_now(chrono::seconds(10)); + t3.expires_from_now(chrono::seconds(10 + delay)); t3.async_wait([&ses,&zombie](boost::system::error_code const& ec) { zombie = ses->abort(); @@ -427,6 +436,16 @@ void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = " sim.run(); } +template +void tracker_test(Announce a, Test1 test1, Test2 test2, char const* url_path = "/announce") +{ + tracker_test([](lt::add_torrent_params& p) { + p.trackers.push_back("http://tracker.com:8080/announce"); + return 5; + }, + a, test1, test2, url_path); +} + template void announce_entry_test(Announce a, Test t, char const* url_path = "/announce") { @@ -609,6 +628,74 @@ TORRENT_TEST(test_invalid_bencoding) }); } +TORRENT_TEST(try_next) +{ +// test that we move on to try the next tier if the first one fails + + bool got_announce = false; + tracker_test( + [](lt::add_torrent_params& p) + { + // TODO: 3 use tracker_tiers here to put the trackers in different tiers + p.trackers.push_back("udp://failing-tracker.com/announce"); + p.trackers.push_back("http://failing-tracker.com/announce"); + + // this is the working tracker + p.trackers.push_back("http://tracker.com:8080/announce"); + return 60; + }, + [&](std::string method, std::string req + , std::map& headers) + { + got_announce = true; + TEST_EQUAL(method, "GET"); + + char response[500]; + // respond with an empty peer list + int size = snprintf(response, sizeof(response), "d5:peers0:e"); + return sim::send_response(200, "OK", size) + response; + } + , [](torrent_handle h) {} + , [](torrent_handle h) + { + torrent_status st = h.status(); + TEST_EQUAL(st.current_tracker, "http://tracker.com:8080/announce"); + + std::vector tr = h.trackers(); + + TEST_EQUAL(tr.size(), 3); + + for (int i = 0; i < tr.size(); ++i) + { + fprintf(stderr, "tracker \"%s\"\n", tr[i].url.c_str()); + if (tr[i].url == "http://tracker.com:8080/announce") + { + TEST_EQUAL(tr[i].fails, 0); + TEST_EQUAL(tr[i].verified, true); + } + else if (tr[i].url == "http://failing-tracker.com/announce") + { + TEST_CHECK(tr[i].fails >= 1); + TEST_EQUAL(tr[i].verified, false); + TEST_EQUAL(tr[i].last_error + , error_code(boost::asio::error::host_not_found)); + } + else if (tr[i].url == "udp://failing-tracker.com/announce") + { + TEST_CHECK(tr[i].fails >= 1); + TEST_EQUAL(tr[i].verified, false); + TEST_EQUAL(tr[i].last_error + , error_code(boost::asio::error::host_not_found)); + } + else + { + TEST_ERROR(("unexpected tracker URL: " + tr[i].url).c_str()); + } + } + }); + TEST_EQUAL(got_announce, true); +} + // TODO: test external IP // TODO: test with different queuing settings // TODO: test when a torrent transitions from downloading to finished and diff --git a/test/test_tracker.cpp b/test/test_tracker.cpp index 8c7d8adc3..eead9c622 100644 --- a/test/test_tracker.cpp +++ b/test/test_tracker.cpp @@ -387,121 +387,6 @@ TORRENT_TEST(udp_tracker) TEST_EQUAL(num_udp_announces(), prev_udp_announces + 2); } -TORRENT_TEST(try_next) -{ -// ======================================== -// test that we move on to try the next tier if the first one fails -// ======================================== - - int http_port = start_web_server(); - int udp_port = start_udp_tracker(); - - int prev_udp_announces = num_udp_announces(); - - settings_pack pack = settings(); - pack.set_bool(settings_pack::announce_to_all_trackers, true); - pack.set_bool(settings_pack::announce_to_all_tiers, false); - pack.set_int(settings_pack::tracker_completion_timeout, 2); - pack.set_int(settings_pack::tracker_receive_timeout, 1); - pack.set_str(settings_pack::listen_interfaces, "0.0.0.0:39775"); - - boost::scoped_ptr s(new lt::session(pack)); - - error_code ec; - remove_all("tmp2_tracker", ec); - create_directory("tmp2_tracker", ec); - std::ofstream file(combine_path("tmp2_tracker", "temporary").c_str()); - boost::shared_ptr t = ::create_torrent(&file, "temporary", 16 * 1024, 13, false); - file.close(); - - // this should fail - char tracker_url[200]; - snprintf(tracker_url, sizeof(tracker_url), "udp://www1.non-existent.com:80/announce"); - t->add_tracker(tracker_url, 0); - - // and this should fail - snprintf(tracker_url, sizeof(tracker_url), "http://127.0.0.2:3/announce"); - t->add_tracker(tracker_url, 1); - - // this should be announced to - // udp trackers are prioritized if they're on the same host as an http one - // so this must be before the http one on 127.0.0.1 - snprintf(tracker_url, sizeof(tracker_url), "udp://127.0.0.1:%d/announce", udp_port); - t->add_tracker(tracker_url, 2); - - // and this should not be announced to (since the one before it succeeded) - snprintf(tracker_url, sizeof(tracker_url), "http://127.0.0.1:%d/announce", http_port); - t->add_tracker(tracker_url, 3); - - prev_udp_announces = num_udp_announces(); - - add_torrent_params addp; - addp.flags &= ~add_torrent_params::flag_paused; - addp.flags &= ~add_torrent_params::flag_auto_managed; - addp.flags |= add_torrent_params::flag_seed_mode; - addp.ti = t; - addp.save_path = "tmp2_tracker"; - torrent_handle h = s->add_torrent(addp); - - for (int i = 0; i < 50; ++i) - { - print_alerts(*s, "s"); - if (num_udp_announces() == prev_udp_announces + 1) break; - - fprintf(stderr, "UDP: %d / %d\n", int(num_udp_announces()) - , int(prev_udp_announces) + 1); - test_sleep(100); - } - - // we expect the first two trackers to have failed (because the hostname - // doesn't exist and the port isn't open), - // the second tracker to have succeeded and the third to not have been used - std::vector tr = h.trackers(); - - TEST_EQUAL(tr.size(), 4); - - if (tr.size() == 4) - { - // this tracker may not have failed yet, but just timed out (if the - // hostname lookup is slow) - if (tr[0].fails == 1) - { - TEST_EQUAL(tr[0].verified, false); - TEST_EQUAL(tr[0].last_error - , error_code(boost::asio::error::host_not_found)); - } - - TEST_EQUAL(tr[1].fails, 1); - TEST_EQUAL(tr[1].verified, false); - const bool tracker_error = tr[1].last_error == boost::asio::error::timed_out - || tr[1].last_error == boost::system::error_condition(boost::system::errc::connection_refused) -#ifdef TORRENT_WINDOWS - || tr[1].last_error == boost::system::error_code(ERROR_CONNECTION_REFUSED, boost::system::system_category()) -#endif - ; - TEST_EQUAL(tracker_error, true); - - TEST_EQUAL(tr[2].fails, 0); - TEST_EQUAL(tr[2].verified, true); - - TEST_EQUAL(tr[3].fails, 0); - TEST_EQUAL(tr[3].verified, false); - } - test_sleep(1000); - - TEST_EQUAL(num_udp_announces(), prev_udp_announces + 1); - - fprintf(stderr, "destructing session\n"); - s.reset(); - fprintf(stderr, "done\n"); - - fprintf(stderr, "stop_tracker\n"); - stop_udp_tracker(); - fprintf(stderr, "stop_web_server\n"); - stop_web_server(); - fprintf(stderr, "done\n"); -} - TORRENT_TEST(http_peers) { int http_port = start_web_server(); From 85f615132b054df7609edc2b93d6f823afdf4d67 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 13:43:11 -0400 Subject: [PATCH 03/11] fix documentation mentions of session_settings to refer to settings_pack. clean out some outdated disk instrumentation docs --- Makefile.am | 6 - bindings/python/src/session.cpp | 4 +- docs/disk_access.png | Bin 3032 -> 0 bytes docs/disk_access_elevator.png | Bin 5768 -> 0 bytes docs/disk_access_no_elevator.png | Bin 5309 -> 0 bytes docs/disk_buffer.png | Bin 5170 -> 0 bytes docs/disk_buffer_before_optimization.png | Bin 4846 -> 0 bytes docs/disk_buffer_sample.png | Bin 5340 -> 0 bytes docs/features.rst | 58 +------- docs/hacking.rst | 2 +- docs/python_binding.rst | 11 +- docs/troubleshooting.dot | 4 +- docs/tuning.rst | 174 +++++----------------- include/libtorrent/add_torrent_params.hpp | 2 +- include/libtorrent/alert.hpp | 2 +- include/libtorrent/peer_connection.hpp | 2 +- include/libtorrent/peer_info.hpp | 4 +- include/libtorrent/session_handle.hpp | 6 +- include/libtorrent/settings_pack.hpp | 2 +- include/libtorrent/torrent_handle.hpp | 8 +- tools/Makefile.am | 2 +- tools/parse_disk_access.py | 102 ------------- 22 files changed, 59 insertions(+), 330 deletions(-) delete mode 100644 docs/disk_access.png delete mode 100644 docs/disk_access_elevator.png delete mode 100644 docs/disk_access_no_elevator.png delete mode 100644 docs/disk_buffer.png delete mode 100644 docs/disk_buffer_before_optimization.png delete mode 100644 docs/disk_buffer_sample.png delete mode 100755 tools/parse_disk_access.py diff --git a/Makefile.am b/Makefile.am index ca7e224c8..b5b424dbc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,10 +10,6 @@ DOCS_IMAGES = \ docs/cwnd_thumb.png \ docs/delays.png \ docs/delays_thumb.png \ - docs/disk_access.png \ - docs/disk_buffer_before_optimization.png \ - docs/disk_buffer.png \ - docs/disk_buffer_sample.png \ docs/disk_io.png \ docs/hacking.html \ docs/im_thumb.jpg \ @@ -28,8 +24,6 @@ DOCS_IMAGES = \ docs/write_disk_buffers.png \ docs/write_disk_buffers.diagram \ docs/ziptorrent_thumb.gif \ - docs/disk_access_elevator.png \ - docs/disk_access_no_elevator.png\ docs/ip_id_v4.png \ docs/ip_id_v6.png \ docs/hash_distribution.png \ diff --git a/bindings/python/src/session.cpp b/bindings/python/src/session.cpp index 57ff83a1a..ac011917e 100644 --- a/bindings/python/src/session.cpp +++ b/bindings/python/src/session.cpp @@ -385,7 +385,7 @@ namespace allow_threading_guard guard; s.start_upnp(); } -#endif +#endif // TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE boost::shared_ptr @@ -792,7 +792,7 @@ void bind_session() .def("settings", &session_get_settings) .def("get_settings", &session_get_settings) #endif - .def("set_settings", &session_set_settings) + .def("apply_settings", &session_set_settings) #ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_DISABLE_ENCRYPTION .def("set_pe_settings", allow_threads(<::session::set_pe_settings)) diff --git a/docs/disk_access.png b/docs/disk_access.png deleted file mode 100644 index c236b6bb37a4fcb89294942cbc7f6bbe65d22b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 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

4KrO9$$ZWL509 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 diff --git a/docs/disk_buffer.png b/docs/disk_buffer.png deleted file mode 100644 index fb617d0e68f786a77be8a343663be0764a374e0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5170 zcmb7IdpK0zyI5>YLm(Q%FLH=z@t&F!?mvUxxwsOu!f!VImhFj|k!b4ik@O;`t1O z7?1y(&62^O{bgk!ziC;7g#73`*4Q8(E%M$O%7H`QxzrKO4&y}dWDOr9?>VCcy zi-pO#jZMF^KE7am)II62!VUgKGM>e# zJS70OGN@DmRjQy`4Lnx|H5#B+6Vzz|jy8Cq1GswNr2%+l2pWvQYZLIs3^eWlO%|Ye z7kFz0TC72<4R}WZZF@lbKJeZibWlO(A<*Rjx*b7}Gw5{#eIDQg9rSyG0dMf}BpCDq zLjhno2#kaPUKkiX4@M)v7z2#QfKPE?;tH5d2A|Ww)HU!W8%*B-)3?CPZ7^E^=I(>9 zCE!~*n6Cf}m0+O;eCL24ufSpx_}L1U-h<_Cu-p%R4T0ZdU}X}l&VaRfu(k;P{6?M? zkfN@s0{~`r583K)c;0NDf7TZ~I&Q$G4A(YwG%RqbK4V9JhZ+ViHkI9aVbY#*2{S|~ zyM0#9O*{MTr{JppblE-2g)<}7={sNj`7;(X9S{sJ_0)t!&L_`*IBKn~NKsEC*3>#d30GlkzNU(owMPSXPIW@d&1pl}qlsPYl61WXqtH?Y z;8ngWr>hg(`b@ck4V3F+#1n+>5hA5B`xTTZu5qv-UpzI+yTi3{_eaNxK2i1jI7)!W*xKy<$E^_-aFhrmKctZUYuC2Ex~Ny@g)^Sq3A!VI z>#5Hgwi6x3D-dg%$_I`232Hl!dhU6%b610sXB2<(W$=amtj@NZc8LWOKWtX-8@J3( z2@36TVQ}Uft$>@Fo)I*qw;r;qyQWAa##F|V?9tWVKjbZkt!n!2e2{S2 zP<|(zFlC9t zqquBqCw2wBLzfQgM@=`VL4}JSJ;_kvdXl+#@0zJeW4>klN9E|CwG!E0gYmHPAo=w! zXFi#6KZ)S(68%JyqI?ZtiFM-lg;;IeEA@-VLgR|8g3Z3G3LH4m6EQ26*R$`#R8qeW zrKqW_j}~!|kQ~kxaow??_A79t@!Pld!A#kQ2&O?KrOd+I-s^0+*~?>sl)lZI3-zBn z-K3XaGFhLV)b$sh=9d=Woo%OG-r5>pv&WaJeNZbhDo);B0G{=q3$t$Yq4->-JB<1V zP}C*gKHPP0Ah(Im&G+6rFwd@vlI4Z$~JM%9t@dqR)m)%=dD~z!caswY7t$ijI9WWV%2H_T} z2TsgAZ}tBax>#~P!YLQMQegDk1Ck(l(f##jvim<%hN76ut>iYs|sx}lZBZ7XZ+s|GXmp6CU9?f^=&h#ml%f}^uOm0 z2Ea$Z+T?Evgtux~g+%n$g>Q>;>-J$7(L0K=G|ui7RbI*+Y{9zNA%<&LNUb+@vBTpz{Dhq_3gYeL%NbziS{oA*2ATYV_b1#>f7(ky^5NO5eYirt>B3Jip^IxaP?c^kV9 zZTGGzG8wpWqx2d}l03(b#j*AtiF9qm7JGjBkMr3cDxCK8LHqz%H_~u!-Q$G;QVLa7 zvwj<*_W$9qt>o@q#^Va|6j^(fQ#B){W!fi?Z6LHgyZ7)7esy)#ko%<5Nu|7U!q~y8 zI>U^VsUq9Es$Ds>irra2npE>&>k6AnE$7g8I3FwqG z1;j|9er6|VVMQqFKXM-uJ}Pgg$l+L=)5WAo5!c~L9INZ}W74ou*ngYRM02vTpI80; zbti76i@3sgYB+}5v0bL;^is6WiU*D!zLiUQF3bzQv+TZ7N00E6OewoWax{;2{tWG} zkmfdD9WfK1&X)Y5kR?D@U$r2>JV%Vtfy1v^&^dqS`Vi`H*-y&yBjOI%DNGisB>Z)U zyoRk$S=u4yPfEDrEF9>A_d9A9ze|YQ-hNrve|aBVuxZ9lbiPB!&wB?+0gfOzf5;w6 zg{%TX<8)QnR-Su44tkBTD=P=%G9#vhFN$(?y`YywY;kGmIbrw(HoBwkKw0_YVF`i@ zQ|U_CMcZa{Q*)#eO!z>LCFjSKE!>Wl&$xPVs>VPaBO*&`J%0Rj!u#|{%~M^Q0yBnJ z(OqjI5RpBV1FevPGj;*`Lf5hu93ifudF}#?BBB+zBTy{Cx#>~lYYq78MrU_hIY~>o zj638*!FPvipT;-WTduYm-8E z_cThwFGT1jo9UHm+`6=u^jrdZ16S_i3E0)rfhJuqzWwa2*xY=&b$pVM6?EJJ&6{hB zeM207m3d0MNL)*m^4q<%j7S=pjKe5I7{JXO{Q%+mw=&v^y4wbh>@|O$pIElisy4() zFXY{V*o^6evX&^FrCjyeEnF4v=rn1^(g(^jl1;c@I?C5Ak6k#;?2d-Afs^pQzkv^GUPj?W}jNKNetYNy?4;7ea23ac--V0ko zw)1OVqwMsbHkCu^7gWS^RupgqY{xqKvMTaqzhj?Cg$V{xf@CL?%zYP5gt*#NhREK! zq`Ltt;?USN9R6gyW*bRv@)jg>L*w!0xR^WNvz3EyyyT_$Wyvt5ynph}}T1 z%0VXfOVexJSXVLY^^qN2!RNIWEvuxOvaK}|5Lh6bQZ~y@$I)4dM@dEV^fiZtJ=lm&A% zHDL?I#N5O96{IGp(}n0Iz>npI}-85=QH${AVn_f`2*z;(5puO2(tPUA`G_= z73nwTZsc-K8<>(DAi?@p8`zN?>C9!vfLv#5U}+u_rG1a9Pk4Q|aIEX~I{lZvf775sA!g z!g^y(o+7$CXE8mWps)66=XN@$a_)PLuyb(qO_v*Mu}$$`6=XFRV`_938V%x&JnAYDOvx>h!V zAFsOduIUZ_V(lU2NB*nxKQ&e7>DaG(l45Lx{bLml5?PWHxx9u5SoQ&;p=bl|*e`Lj zUy26gWtYfcHG)-THvv^QJny(u!B#^S0PfSZrke*L*%6lGd<4DE{PB8 zjh(O8dtpk_5)j|ITPRauTS;#7O`8|g#`ss+;zXgbJ~gohmP9-G`KI1$4^P^-R1s8U$O!8_qe-65SK{eZI!*7p9uMGzc!}6WOs_ikCVPehW*R#nCdW7Safk~wz z{S)C>R_uoQqe%}uy;8m@-^SiP8IK7V$MI~g;Xlf@RM?xX<&8L0STsm99578ors#9? pmr42kAT+L`MXcIQyZ8GKr6qGrQyH`QDDq7U?6I*Ymy&4F{{@c!ZN>lq diff --git a/docs/disk_buffer_before_optimization.png b/docs/disk_buffer_before_optimization.png deleted file mode 100644 index dcb4c4560cc23a921b8e072a6d581a6ac0e8397e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4846 zcmX|F2{csi`+se@gK7+AXNGJ^WM6A$vhSiO+bCN_6xo--MfSC_GfE1fD9Sdb)h=za z#3XwmOBl=ir|<8a|8t&u-}gSx`}sVd_qp#m_nez(Wns9VLy!Xiu;187?+gG;6vlN7 zVqru)Z=H?13Fk-Bx4yjfJT$)WHcaRONn$M7SM@w zKqde(84!qM0uc}amQGY85QzkUWf+k`!I&e71Okzf{YOU!1Ta}g#*&GIQZj*oBbPD~ z3?u=~SVcfH42wl$8Ozaxe=vq&(L^+3U`Q$*m>{FkfXJu?h~xuP?(#{#-Fg35J5vQLD?o{Ai*7vpF^gJ&4f zC=QyAfESYBr4(qE0WGqiRSvWr1LWhNLjh1ufLF@kwF-En2Ht9bcUs`RHt5s^U8g`d z4)mM`z51Zf5cC^^0Wz>iSyBLYkk!OvJQ6%VG9z)UKb%>Z*bVE!&x$Oj9>;8z*=T@Dr>fu+Y_ z`3d;b09Km7N()#egSFRSy%YTH1sfm0=4Y@u47R=l+9cSX0Xx6I?jNwb4)$n_vjWm& z;J`1RvJkPW~P9gBEm$8-Y3RF0^p#)lCb}EZ*l$sa8N; zD!3EM!laPAF!i9#@Myw(mgrTL6Ge~}T3`SJw~aXYC&vUQVYh4O`!AB)5~arHDV z_!5I%`P+M}eMzUmJ_^lI@VrNocN6OY3XMx5C$Dad$yFcQ6n;j6(|P=W<3yluVWcNE z*lrMBjN_;C$R?Ujv`9irCTV`ke6@`OZ?3Mo^3`9HSX)zMr8>!qtEivAM;glqNAHJ& z$}<$zbRQg#z9cS^&5WPXkqXtCbYk}0Ulqs>AIkG~Ls$2^NwBy^NC^o*3;$D8mU*`L z_Jq>LfGzTHH>*&R+0Z}Lha|$-Nx$0X5_pc?S>;xV3@Ks6FNn!Z32-&OAP#y?pW?wWG?VraZq)g+eDU+P@cnZRew-j!$e-z|c5h~LWO@7S6b zimtWk^j}$XFf`fp{gOpr{G;iog9%f&-h6@9T5wv_i!- z%}0lz^S^cRRT7Q4ohtBjIQCXiOYe;|JkGN}N+IqH|J7k9cU62k)fzvx-IO+^6MtG} z%{q9`^i=y}gg$XuhvQl9T;pp!6Ayzkd?h3}L#-@A4E@P4E3&9cQb(;xk@N~(0J)#S zTbtz;8g)Z-^Xg=jiG-`E@*&bT|C7X=qCT%DMW|xFC%+}#O@sgXL)|r>%y6?xM#ZX- z`bg}aU&D!R))1TP-o&6g_-cIc=uE-|CerBWvccf-!dNRk$XrO)*+i!GO%}@JtcxZ) zsVTkg*Ts==_;{)1L!s|R55r=YE%0+it3&ISs4SOeZMc0^$Rv2@Z?V&KBnxTj9pbmh z{+pbnMR^)hPzi_Fa>($HEnF@@j1;LtzrQWKhNBZzOl0B+cVE1r!8n|;%U}EK3h0{y zmb&X!(+9bJKm4?N6yN@gFQ#4L(~`tlY_P5-UX{~i&MBQc231+5{8Q$>NZP$Dr|H8x zN*mgUd%s!W8_j~xy2UM;=Hx#9*wG`kS^P#-#xda|d9zYmZ;J1)HA1NgC&a<;778(= zeaC0!dO}im)9^2DbBneLkN|14=0Wa2U&QoR-s98|lns7XG|pF?OCd7fPg%J_x9EdS z#mQZjRj*B@poxIDnk4z5Z<+87o8)uS4ZUiU{_$;c14YK!s|V=cA`F=+X>b{FAVm7E z6t4iDiPEd%hHx#@5x|Scp5?5E_a165dE~vkG_u^+T(8=uBzj?~CPV>qd0JRq-w<<| zXWlV_w{izZu?-1D=J#Ev5IpP2dG7v97*42DYTSI*B0?Uw= zA2-K_XWJtezNbeVJhH3cwWF;sNCkyCiZ-H;Eb;TuTzVBUKOH?F^t@A@CqIN2jzy$e zhC7~y&dNpu^X$d%pm-yPMD+MrLQ{{wEx~Y= zrC>%cSa`0r`&-;Uvy}ScV{(T1vzanUMDNT=CAf0bV|husp@^k>1@^cZrypYTr8hiF zdiOyL%EZ*(>+@YJTD$m4mISXIBw&+ol_JsOt7IUvg!$>SB+iQ-6<6fpewy_i_g*{J zj{_eVL%WFAWFo!4-yj1_$oQmnBYN7PE^72h8VPNQV}=qX+jy!3&7#)my6(EA1_Z86s9Sj zExxr+I^|GkDCJs(@`0R~>eHav#Opu*)b-y=UOi*>*kz7*i zX!AXKR3Wp*@F8EQ`=^*>o|-7er>)9m`U}^emDxCF0fcMyKoPZUJNI$W(|=&c-IPy! z0bM*_-}8LGI~*$Q0JHVFY-FAK8zD`yFIF7v-w`|D<3RKMjSH3?gDzDC-QbN`PFoW< zYk{)pBek#X*mcbx@>MVzN^@6nddGPO1AQMqII#GfD10yhkNV@G;+paX?A#1U`_|7K1T;|%}Da@iR&8; zzwXXHHW?e!9g!~tJ6~BCQ$3B)XL7C7=~QZi{Zx&_;RpZWIJ!1VC&q(q zNDEw)vk3Dd97K_2p&X-Xq+H!%fjz1(Gq??`9eYh7n*zm4Y}D~1!fe-d(X7-pIIw!o zFfqq7UQulvX^4Jg(0#Ck95Q~-Xs^qj z#ffnm5Km>O;aZo%F>jxUS10N0rFi}_X3YSMaEuKYHOpLUz^@~a zOUKe%V7(*!fofpYbFnYF@v>J+TH$Z1A$V{^m%*P7Xn^ z$2izG(Mu#at?Pbr(3Ne@SLSiowm+ovjT{`CzEo_L`CM#DTix|(ywfCVKHu=5v5jM3 z>1>~~gXu$c(a{>`gz6H;$rks z(a*b)B0ebqs_p!vOZpOc?9Im`6_N7>jHZR{?kZPd&xlOtxWT!s`Ch18vzbB#QFtgcsuToY_ zZTR`}ZvT)lt_V?z%bQ4b9L3*dQqwLu7z)6}ZYx#dWzh{1k#R5&qFC?Blw8%soVG)K#(kL(T2WE$Ws$2F`bYeeoZ-&yF3# z@-ZPJ@+R^rVN);Z7(cS6#93J>1`Yl5HKX3GM^_yDc*e+|zndQ%YZ>nda@{KS)~|C) z4`NqcLTv>NKDbsU)HK{YM=IC|^XGUxdqelULZir-fr9~R(Fb-9^LrKPOG~7UBldqL?WZ{);X!ftr^2V3=@IRyit%V3_FYSf%8kyI2Wb5zhcw5gO53M@m zhM`0xSLSMF#0NbusJr=9{q>RW-Ezh4sn2aix|;KtXICHj;h$QzaJF)Wj(y5Y8C98h z=Y}E47dNIp|K#oF8-g2j;*)N;GX;M-)s*_yw(!g1^r6dNS51CNy^O2+5A;ne*stn^ zbEgkFo89EUZU1lc)rCKwrIJk?IrF6Q#lzNLcwttsCP%Ou{(;-c#NM5A@0$DC|Net4k!38S6o$w)5fKVAXtK-R5E}DFwy10=G10=1rJ{`NB#bm<4^zz) zA=yTzM3S!?&o#Rb^dq~?QG2i`K9;)0D>0g zM;!p*!~(#9oNQUQ)Y#Ss7jpxJ~2I069&(9j@263|?PfWr}>>~A?Xz=6+?sc0$z zmrun(JZe6afS5Q0gu)@9fkq?H5FCN~O@js+K|nwc$Ws2>F)9K92v99RppHR&DgjUl zI5y-2szznAp*fVzha6EMqtF)E01D<)srhUi?)QQK*!h4kHkJ=vYy@P83aI%AL_UH| zfP@i<-__6r0`9je0TQP|6f`>@x^V3LvusH9k0KlD3IO7OUm8g41+pqYMI9W}0)~fx z*>t%NA_N5u)S@ zm*oi;6o_OM!qSUG6G}v5ABaVkil2EX;av`QtB|xO?=-92W%x+y;N#sYls&T5(h@bY z{7(>|Ru0t5g9ZiAs0f<&fo5g!R0XuCfmS4-s)J`5;JGGvaS+h70sRnosRv#i2JJ^c zhaq^40-eU7%M^5Dz#B8rV*%b;gI-(EX9xNnz<@ItJOLQ4V8|W3^8~|Qfawk1`+^Vt zU?d293L4%1m7uO@d;RJ083B7G8O!wft3#Mvm5;C1*?N#l?m29g7wc}<15&l1*}EDS^-<@ z(6<6ol+`oY=02J^*4^lj5=-&s}E z0fo}u2TeJT_Ffe+;gf@ILJf0qBCz`>;o3=jdBoa2Zw!n;yeH2jBS<*qe@Ph z5vzoJWk;4BcSoY^^;zFXD^dN8K0M3Khu@(o?XL$DzHC144jD4NUmqYE-7VMqhi`*w56wR zG)9HFMF`WDnj^Q;svLt4bzb@kuX!pHzaiu@Drl;=%NP;}TYh`couamNcJcP+V_lzN zkxSB+JA-E?U7lk5-E_CUj;1bZEMq;%7EO(j;uTWQ%tN~)n)9(6bE5)EGVxj40nS7Us= zx^ReCV)=+e-$X%s_did4B9rv{r8lc%wjw=)j0zrL2h+3>H#U4($K!(6BYXX@JSw^s zUr%YYnVM2m<^9lbm2O+x{reg#vFdv$AAa^9B{~b*b7?h%Fphib*Sr7x;QM0B;hVCH z0H0Lawdk5MLo=EiiV*fp>bxki3gP9MQoj~oh@kytybDn-zlQ6Ez7`KK|;g5r>_ z3ySiGuSSvEpqGiGZ04O`)tQmacSf+@mrB8T2;Fb`olOs1)7hpwU1PU>89Rh8>HO5R z@=KYaGq_W1NKcW+T*RMo{Di*lhE|Wxj?U};Z5vU@0$3+oWw!9d(iO|(#K8NaTnY)= zGiJHn72i)#;#l*Olw$R3X37k~zwD$ZDJGrrOX+V`e)s=aB8Oez4htSeui zra~e_9%UVY@I1V~eJ?2SEtq#i?pKw{A3zRVCYE4+1Ftn5r#yM+M{uaI`=yczmk_iI zfKMCI`w9y=EW1rcO0oPnOolGH%vG6J+=^rI*5uoc`UEtE2Gj79$%#(l6Svy47&qDb zpPNsz46BTVo#slNLuiz6M>sLt#*L>{w!2VWMG+a4TFFde{KkW~MS;6@i z^0OTLfmF8qKSDm8!wW8JTy;9kHk1&k5=^_MMC6X_%M9=t;%$F^n7=jdf>x0 zguu5V`9Px!`n4Qt z!7EfxfOeD5_zq}ZBtHb&Iq9OW9=7X%YN(Bxs^NIT@YWTHD4LO|R~sz~YthdCEr zl>U%f3$%q~<{GKBf@*kaFhEWAw`HX@W%OH*M+DN>2*0FLyfEauAB` z$XXv`Pf2hpT*qg4IrSa`qNbGB2g?2Sg2V!>&ratjFaiz2B&#y{(0FB+UB@KOY(r>@ zSL`Sv9^y>fNp!w$kJ-&(zJsp%;$h)U@c&Q7AB$|XRmIzNUk9RGtDll(pY9v7!0ad= z7D40tSZ8yFi{x+IX=6DVpa|y`cXOHVIE;5qRAgFUoMztbLF1RqkU6FMO4<4u&pQsj zRl_G0`*PoUG2!s=t%b)O)pyEhyi`+^?Bmjagglf$#=4F`+PwzZ`H#ELQN)jwB}6Z} z@tAj&VI#-QlS+myFtorSZ8YAN)+Af4%t*K}M}o46vf^s6MW&8m+C5*RzTVkl`SIF7 zDTHR}UYE%$!+sGC!i#;if@xVb*}uBDmZ7}Vct+qJgw7s{rAU?gXHcfUQI^&(Sid+f zhmt{{o<`LZe+h!MPhs)SPeVYvu#$P@_+>71%xZedpFq!W$=gj+zi!(Agy$0_FmXe7 z!DX?P1A($fITROQQG986_heJViuwNp7hy?a#Y=yto93@nKkEL6@V`>s&3{XUeEeJL z!g8?0!fvqiB0I9;!YD|S-73ucTRTg3Q^f7?Zh0k#lAY3P6OVD4 zNZYuZXYy4eVdEEAiZ_UN`cl>b&ly0IvBx>vg%O#K7XqqnlypQ?2W!l2Y+0rIc857^ zFK{pvK%m0&NI?S@nsK*ZJ576mvhpLw0smbpWqK)<@Evz^FIM85AmWYXI2ZkM4q5i^1~s!yvicHY0Nv@AkgwgJOM*t^ee z38H^0GkhLzXLB?eu7e!PW6-F{p-% zNjr_pyT_b-;9qSsiUWQhlnkOV{{ywAF?s$=bQ_oufXrpUb=Ei`^%9ItD;Ta336%VI zCkI6WW&d3jVav{m=}?wro<{KfYrWw3k9b*$s2%@C%1}CM|7nM5E@}3BE-Ctd2nR=A zBZniWY2~9GK|f4lk?5aKLOy1H^Om_-fPy0~G5ZB=!nA~2-pWGuJSb9A3Msy0!aVH= zx|ZhM4w$Xa^v_F z@e01ddx8bn#t9zJgT6;D`cp1Kf3$$ErsUeZ(E?%Ngsz%juQK`g|#+058 zFTt|Eg&rx9uHlR!NUb{~+uDQA8HLGgtmoowHt%3NGXl(9lPC{jJ;<>t?Q?e`y7-Zj zd5UK2*|i^p4=N_!c#4^S!$P432=rX*Ku zvH@4!Iro! z_{&A})F9KTxzCpViOz>}TKttA$uUhjR@!m}wY)@~>mR?A7%9?qCnCz5MFehx1OpZp z9T!GPgVQ(Ljn3|9N!oWvKUHbXyaN+l+LVBe5+%Rl3E?komlJTH$GM3w@BKwp`Jqml znlN}NWNUrqqOMT${F|ZENrSva?o&_EvUPXK&pZwpSAE>?A~iMAAfi_4*6SBidSm{* ziF88XY7xxcv$n5ZZTc*V@XX$i|G+wL+L2<#E-0+ElPvwtFu%H<+!K0%ny$#%vW_kIj4w@8v?AFJ@56mbT&*I@w5Hl+ z<>D{w8+MgSHI4s8GxDbSp<8!ee`2c2QLdUu1St90n~`Z;oitHPV?~Mr^G>qMJrZ6~ zfmMFsIevRBTtxWkY@J`fUH^cX+Lva1ue#__A+vrm)*=&Y!YjQQ}Bj& zr|~vkG**FAPf0i>x!<_>A(FA@Wg@n1eea-vpE;T2kLVka2;3fzH@w|51t(&b)(p_d zB!f-8yl+3#etjTFK5C z#)9xEp;_UgeuHmk=*;NFN=GtJLu2^|ncSZ4-cY~1aM*}H%Y@=K-ml?fG^$v)Feo9+0rTNcKJKtMgqmMMpfO-|Y#fyFK4| zipAPE&E;0=<7NBW6}6SO6?$3lpO4mBsOG{+2oUD%k`s0(5Ls;@Zz7~iJiQL59_W`k(9pNvRYYxaP- zhDNTA&dDryw)LOkb`qPZfvE{GGS0ET8IRW0xm2oc3B4&vsx=HZ+9*ox_Q*xVtd7Re zEkZ9*_&2m1Eyz6`J4@P;1HPEH;OY1;5miQgG_N)Vqil`l+65Cw@-lDLNQ$%S9_w$B zRqM?ohu&+^*5$Z9YvZvYL`e7vHvCk9XX8Kw<)imq^`ss zu3H;TwaA-2FBhX;)2iQ}lJj$i|Ira-eeUUcJH4SL6n`IT^xoD~##Uofjgfy2l6jCU z5l*qKs61DF+tL4iPu9o%; zjC2$lzA$z9viZ{Slhgc!6aQ4+{JF|EK1@nYF6{3q2%p@9s3h{Alj93~jh~$Ev3N)r zuzBaRwnT$9U&_g*@DZ*37UuHV!nFG*yGbZGDfV+V9=5GMW?!ABqW}N^ diff --git a/docs/features.rst b/docs/features.rst index 47b4a0a9e..a16d5a1b8 100644 --- a/docs/features.rst +++ b/docs/features.rst @@ -129,7 +129,7 @@ disk caching ------------ All disk I/O in libtorrent is done asynchronously to the network thread, by the -disk io thread. When a block is read, the disk io thread reads all subsequent +disk io threads. When a block is read, the disk io thread reads all subsequent blocks from that piece into the read cache, assuming that the peer requesting the block will also request more blocks from the same piece. This decreases the number of syscalls for reading data. It also decreases delay from seeking. @@ -155,62 +155,6 @@ The largest contiguous algorithm is the default and flushes the largest contiguo block of buffers, instead of flushing all blocks belonging to the piece which was written to least recently. -For version 0.15 a lot of work went into optimizing the cache algorithm, trying -to increase the cache hit rate and utilization. The graph to the left shows the -memory utilization in 0.14. This cache is a straight forward, fairly naive, implementation. -Every block read will also read all subsequent blocks in that piece into the cache. -Whenever we need more space, the entire oldest piece is evicted from the cache. Caching -writes always takes presedence over the read cache. Whenever a piece is fully downloaded, -it is flushed to disk. - -.. image:: disk_buffer_before_optimization.png - :width: 49% - -.. image:: disk_buffer.png - :width: 49% - -The left graph shows the problem of evicting entire pieces at a time, and waiting until -an entire piece is downloaded until flushing it. These graphs were generated for a torrent -with fairly large pieces. This means that granularity was poor in 0.14, since it only -dealt with entire pieces. In 0.15, the granularity problem has been fixed by evicting one -block at a time from the read cache. This maximizes the read cache utilization. The write -cache is also flushed when a sufficient number of contiguous blocks have been downloaded -for a piece, which is not tied to the piece size anymore. This way the cache scales a lot -better with piece sizes. - -The graph to the right shows the same download but with the new optimized disk cache -algorithm. It clearly shows an increased utilization, which means higher read hit rates -or smaller caches with maintained hit rate. - -high performance disk subsystem -------------------------------- - -In some circumstances, the disk cache may not suffice to provide maximum performance. -One such example is high performance seeding, to a large number of peers, over a fast -up-link. In such a case, the amount of RAM may simply not be enough to cache disk -reads. When there's not enough RAM to cache disk reads, the disk throughput would -typically degrade to perform as poorly as with no cache at all, with the majority -of the time spent waiting for the disk head to seek. - -To solve this problem, libtorrent sorts read requests by their physical offset on the -disk. They are processed by having the disk read head sweep back and forth over the drive. - -This makes libtorrent very suitable for large scale, high-throughput seeding. - -.. image:: disk_access_no_elevator.png - :width: 49% - -.. image:: disk_access_elevator.png - :width: 49% - -These plots illustrates the physical disk offset for reads over time. The left plot -is of a run where disk operation re-ordering is turned off and the righ is when it's -turned on. The right one has a relatively smooth sine wave shape whereas the left -one is more random and involves much longer seeks back and forth over the disk. - -True physical disk offset queries are only supported on newer linux kernels, Mac OS X and -Windows 2000 and up. - network buffers --------------- diff --git a/docs/hacking.rst b/docs/hacking.rst index 7a1de5d93..b96ce86dc 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -119,7 +119,7 @@ libtorrent starts 3 to 5 threads. * The third thread is the SHA-1 hash thread. By default there's only one hash thread, but on multi-core machines downloading at very high rates, libtorrent can be configured to start any number of hashing threads, to take full use of multi core systems. - (see ``session_settings::hashing_threads``). + (see ``settings_pack::hashing_threads``). * The fourth and fifth threads are spawned by asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking ``getaddrinfo()``. diff --git a/docs/python_binding.rst b/docs/python_binding.rst index 61f1960da..e6539984f 100644 --- a/docs/python_binding.rst +++ b/docs/python_binding.rst @@ -98,13 +98,12 @@ a list of entries. ``create_torrent::add_node()`` takes two arguments, one string and one integer, instead of a pair. The string is the address and the integer is the port. -``session::set_settings()`` not only accepts a ``session_settings`` object, but also -a dictionary with keys matching the names of the members of the ``session_settings`` struct. -When calling ``set_settings``, the dictionary does not need to have every settings set, -keys that are not present, are set to their default value. +``session::apply_settings()`` accepts a dictionary with keys matching the names +of settings in settings_pack. +When calling ``apply_settings``, the dictionary does not need to have every settings set, +keys that are not present are not updated. -For backwards compatibility, ``session::settings()`` still returns a ``session_settings`` -struct. To get a python dictionary of the settings, call ``session::get_settings``. +To get a python dictionary of the settings, call ``session::get_settings``. .. _`library reference`: reference.html diff --git a/docs/troubleshooting.dot b/docs/troubleshooting.dot index 7cf5af8a7..c26931e4c 100644 --- a/docs/troubleshooting.dot +++ b/docs/troubleshooting.dot @@ -28,7 +28,7 @@ digraph no_download { node_upload_mode [label="Is the torrent in upload mode?\n(torrent_status::upload_mode)"]; node_bwstate [label="What is the peer read_state set to?\n(peer_info::read_state)"]; - node_dl_limit [label="There is a download rate limit in affect on your peers.\nDo you have a download rate limit set?\n(session_settings::download_rate_limit)"]; + node_dl_limit [label="There is a download rate limit in affect on your peers.\nDo you have a download rate limit set?\n(settings_pack::download_rate_limit)"]; node_dl_disk [label="Peers are blocked waiting on the disk.\nThis typically means your disk is overloaded"]; @@ -36,7 +36,7 @@ digraph no_download { // end states - node_end_queued [label="This means the torrent is 'queued'. i.e. it will\nbe started once the torrents in front of it\ncompletes downloading. To know the queue\norder, see torrent_status::queue_position. To\nconfigure the number of simultaneous downloads,\nsee session_settings::active_limit and\nsession_settings::active_downloads."]; + node_end_queued [label="This means the torrent is 'queued'. i.e. it will\nbe started once the torrents in front of it\ncompletes downloading. To know the queue\norder, see torrent_status::queue_position. To\nconfigure the number of simultaneous downloads,\nsee settings_pack::active_limit and\nsettings_pack::active_downloads."]; node_end_stopped [label="This means the torrent is\n'stopped'. To start it call\ntorrent_handle::resume()."]; diff --git a/docs/tuning.rst b/docs/tuning.rst index d2297797f..b921cfec4 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -12,8 +12,8 @@ libtorrent manual tuning libtorrent ================= -libtorrent expose most constants used in the bittorrent engine for -customization through the ``session_settings``. This makes it possible to +libtorrent expose most parameters used in the bittorrent engine for +customization through the ``settings_pack``. This makes it possible to test and tweak the parameters for certain algorithms to make a client that fits a wide range of needs. From low memory embedded devices to servers seeding thousands of torrents. The default settings in libtorrent @@ -27,7 +27,7 @@ reducing memory footprint ========================= These are things you can do to reduce the memory footprint of libtorrent. You get -some of this by basing your default ``session_settings`` on the ``min_memory_usage()`` +some of this by basing your default ``settings_pack`` on the ``min_memory_usage()`` setting preset function. Keep in mind that lowering memory usage will affect performance, always profile @@ -58,9 +58,9 @@ disable disk cache The bulk of the memory libtorrent will use is used for the disk cache. To save the absolute most amount of memory, you can disable the cache by setting -``session_settings::cache_size`` to 0. You might want to consider using the cache +``settings_pack::cache_size`` to 0. You might want to consider using the cache but just disable caching read operations. You do this by settings -``session_settings::use_read_cache`` to false. This is the main factor in how much +``settings_pack::use_read_cache`` to false. This is the main factor in how much memory will be used by the client. Keep in mind that you will degrade performance by disabling the cache. You should benchmark the disk access in order to make an informed trade-off. @@ -94,8 +94,8 @@ connection, and might be worth considering if you have a very large number of peer connections. This memory will not be visible in your process, this sets the amount of kernel memory is used for your sockets. -Change this by setting ``session_settings::recv_socket_buffer_size`` and -``session_settings::send_socket_buffer_size``. +Change this by setting ``settings_pack::recv_socket_buffer_size`` and +``settings_pack::send_socket_buffer_size``. peer list size -------------- @@ -109,7 +109,7 @@ large number of paused torrents (that are popular) it will be even more significant. If you're short of memory, you should consider lowering the limit. 500 is probably -enough. You can do this by setting ``session_settings::max_peerlist_size`` to +enough. You can do this by setting ``settings_pack::max_peerlist_size`` to the max number of peers you want in a torrent's peer list. This limit applies per torrent. For 5 torrents, the total number of peers in peerlists will be 5 times the setting. @@ -117,7 +117,7 @@ the setting. You should also lower the same limit but for paused torrents. It might even make sense to set that even lower, since you only need a few peers to start up while waiting for the tracker and DHT to give you fresh ones. The max peer list size for paused -torrents is set by ``session_settings::max_paused_peerlist_size``. +torrents is set by ``settings_pack::max_paused_peerlist_size``. The drawback of lowering this number is that if you end up in a position where the tracker is down for an extended period of time, your only hope of finding live @@ -132,7 +132,7 @@ The send buffer watermark controls when libtorrent will ask the disk I/O thread to read blocks from disk, and append it to a peer's send buffer. When the send buffer has fewer than or equal number of bytes as -``session_settings::send_buffer_watermark``, the peer will ask the disk I/O thread +``settings_pack::send_buffer_watermark``, the peer will ask the disk I/O thread for more data to send. The trade-off here is between wasting memory by having too much data in the send buffer, and hurting send rate by starving out the socket, waiting for the disk read operation to complete. @@ -156,7 +156,7 @@ the whole piece in one read call, then hashes it. The second option is to optimize for memory usage instead, where a single buffer is allocated, and the piece is read one block at a time, hashing it as each block is read from the file. For low memory environments, this latter approach -is recommended. Change this by settings ``session_settings::optimize_hashing_for_speed`` +is recommended. Change this by settings ``settings_pack::optimize_hashing_for_speed`` to false. This will significantly reduce peak memory usage, especially for torrents with very large pieces. @@ -200,7 +200,7 @@ processes that might be of higher importance to the end-user, you can introduce between the disc accesses. This is a direct tradeoff between how fast you can check a torrent and how soft you will hit the disk. -You control this by setting the ``session_settings::file_checks_delay_per_block`` to greater +You control this by setting the ``settings_pack::file_checks_delay_per_block`` to greater than zero. This number is the number of milliseconds to sleep between each read of 16 kiB. The sleeps are not necessarily in between each 16 kiB block (it might be read in larger chunks), @@ -221,7 +221,7 @@ purpose of this is because of anti-virus software that hooks on file-open and fi scan the file. Anti-virus software that does that will significantly increase the cost of opening and closing files. However, for a high performance seed, the file open/close might be so frequent that it becomes a significant cost. It might therefore be a good idea to allow -a large file descriptor cache. Adjust this though ``session_settings::file_pool_size``. +a large file descriptor cache. Adjust this though ``settings_pack::file_pool_size``. Don't forget to set a high rlimit for file descriptors in your process as well. This limit must be high enough to keep all connections and files open. @@ -230,33 +230,33 @@ disk cache ---------- You typically want to set the cache size to as high as possible. The -``session_settings::cache_size`` is specified in 16 kiB blocks. Since you're seeding, -the cache would be useless unless you also set ``session_settings::use_read_cache`` +``settings_pack::cache_size`` is specified in 16 kiB blocks. Since you're seeding, +the cache would be useless unless you also set ``settings_pack::use_read_cache`` to true. In order to increase the possibility of read cache hits, set the -``session_settings::cache_expiry`` to a large number. This won't degrade anything as +``settings_pack::cache_expiry`` to a large number. This won't degrade anything as long as the client is only seeding, and not downloading any torrents. There's a *guided cache* mode. This means the size of the read cache line that's stored in the cache is determined based on the upload rate to the peer that triggered the read operation. The idea being that slow peers don't use up a disproportional amount of space in the cache. This is enabled through -``session_settings::guided_read_cache``. +``settings_pack::guided_read_cache``. In cases where the assumption is that the cache is only used as a read-ahead, and that no other peer will ever request the same block while it's still in the cache, the read cache can be set to be *volatile*. This means that every block that is requested out of the read cache is removed immediately. This saves a significant amount of cache space which can be used as read-ahead for other peers. To enable volatile read cache, set -``session_settings::volatile_read_cache`` to true. +``settings_pack::volatile_read_cache`` to true. SSD as level 2 cache -------------------- It is possible to introduce a second level of cache, below the RAM disk cache. This is done -by setting ``session_settings::mmap_cache`` to a file path pointing to the SSD drive, and -increasing the ``session_settings::cache_size`` to the number of 16 kiB blocks would fit +by setting ``settings_pack::mmap_cache`` to a file path pointing to the SSD drive, and +increasing the ``settings_pack::cache_size`` to the number of 16 kiB blocks would fit on the drive (or less). This will allocate disk buffers (for reading and writing) from a memory region that has @@ -280,7 +280,7 @@ throttle TCP to avoid it taking over all bandwidth. This balances the bandwidth between the two protocols. When running on a network where the bandwidth is in such an abundance that it's virtually infinite, this algorithm is no longer necessary, and might even be harmful to throughput. It is adviced to experiment with the -``session_setting::mixed_mode_algorithm``, setting it to ``session_settings::prefer_tcp``. +``session_setting::mixed_mode_algorithm``, setting it to ``settings_pack::prefer_tcp``. This setting entirely disables the balancing and unthrottles all connections. On a typical home connection, this would mean that none of the benefits of uTP would be preserved (the modem's send buffer would be full at all times) and uTP connections would for the most @@ -299,7 +299,7 @@ enough to not draining the socket's send buffer before the disk operation comple The watermark is bound to a max value, to avoid buffer sizes growing out of control. The default max send buffer size might not be enough to sustain very high upload rates, and you might have to increase it. It's specified in bytes in -``session_settings::send_buffer_watermark``. +``settings_pack::send_buffer_watermark``. peers ----- @@ -311,30 +311,30 @@ infinite, ``session::set_upload_rate_limit()``, passing 0 means infinite. When dealing with a large number of peers, it might be a good idea to have slightly stricter timeouts, to get rid of lingering connections as soon as possible. -There are a couple of relevant settings: ``session_settings::request_timeout``, -``session_settings::peer_timeout`` and ``session_settings::inactivity_timeout``. +There are a couple of relevant settings: ``settings_pack::request_timeout``, +``settings_pack::peer_timeout`` and ``settings_pack::inactivity_timeout``. For seeds that are critical for a delivery system, you most likely want to allow multiple connections from the same IP. That way two people from behind the same NAT can use the service simultaneously. This is controlled by -``session_settings::allow_multiple_connections_per_ip``. +``settings_pack::allow_multiple_connections_per_ip``. In order to always unchoke peers, turn off automatic unchoke -``session_settings::auto_upload_slots`` and set the number of upload slots to a large +``settings_pack::auto_upload_slots`` and set the number of upload slots to a large number via ``session::set_max_uploads()``, or use -1 (which means infinite). torrent limits -------------- -To seed thousands of torrents, you need to increase the ``session_settings::active_limit`` -and ``session_settings::active_seeds``. +To seed thousands of torrents, you need to increase the ``settings_pack::active_limit`` +and ``settings_pack::active_seeds``. SHA-1 hashing ------------- When downloading at very high rates, it is possible to have the CPU be the bottleneck for passing every downloaded byte through SHA-1. In order to enable calculating SHA-1 -hashes in parallel, on multi-core systems, set ``session_settings::hashing_threads`` +hashes in parallel, on multi-core systems, set ``settings_pack::hashing_threads`` to the number of threads libtorrent should start to do SHA-1 hashing. This defaults to 1, and only if that thread is close to saturating one core does it make sense to increase the number of threads. @@ -390,19 +390,7 @@ the disk I/O. The following table is an overview of these files and what they me +--------------------------+--------------------------------------------------------------+ | filename | description | +==========================+==============================================================+ -| ``disk_io_thread.log`` | This is a log of which operation the disk I/O thread is | -| | engaged in, with timestamps. This tells you what the thread | -| | is spending its time doing. | -| | | -+--------------------------+--------------------------------------------------------------+ -| ``disk_buffers.log`` | This log keeps track of what the buffers allocated from the | -| | disk buffer pool are used for. There are 5 categories. | -| | receive buffer, send buffer, write cache, read cache and | -| | temporary hash storage. This is key when optimizing memory | -| | usage. | -| | | -+--------------------------+--------------------------------------------------------------+ -| ``disk_access.log`` | This is a low level log of read and write operations, with | +| ``file_access.log`` | This is a low level log of read and write operations, with | | | timestamps and file offsets. The file offsets are byte | | | offsets in the torrent (not in any particular file, in the | | | case of a multi-file torrent). This can be used as an | @@ -412,106 +400,12 @@ the disk I/O. The following table is an overview of these files and what they me | | | +--------------------------+--------------------------------------------------------------+ - -disk_io_thread.log -'''''''''''''''''' - -The structure of this log is simple. For each line, there are two columns, a timestamp and -the operation that was started. There is a special operation called ``idle`` which means -it looped back to the top and started waiting for new jobs. If there are more jobs to -handle immediately, the ``idle`` state is still there, but the timestamp is the same as the -next job that is handled. - -Some operations have a 3:rd column with an optional parameter. ``read`` and ``write`` tells -you the number of bytes that were requested to be read or written. ``flushing`` tells you -the number of bytes that were flushed from the disk cache. - -This is an example excerpt from a log:: - - 3702 idle - 3706 check_fastresume - 3707 idle - 4708 save_resume_data - 4708 idle - 8230 read 16384 - 8255 idle - 8431 read 16384 - -The script to parse this log and generate a graph is called ``parse_disk_log.py``. It takes -the log file as the first command line argument, and produces a file: ``disk_io.png``. -The time stamp is in milliseconds since start. - -You can pass in a second, optional, argument to specify the window size it will average -the time measurements over. The default is 5 seconds. For long test runs, it might be interesting -to increase that number. It is specified as a number of seconds. - -.. image:: disk_io.png - -This is an example graph generated by the parse script. - -disk_buffers.log -'''''''''''''''' - -The disk buffer log tells you where the buffer memory is used. The log format has a time stamp, -the name of the buffer usage which use-count changed, colon, and the new number of blocks that are -in use for this particular key. For example:: - - 23671 write cache: 18 - 23671 receive buffer: 3 - 24153 receive buffer: 2 - 24153 write cache: 19 - 24154 receive buffer: 3 - 24198 receive buffer: 2 - 24198 write cache: 20 - 24202 receive buffer: 3 - 24305 send buffer: 0 - 24305 send buffer: 1 - 24909 receive buffer: 2 - 24909 write cache: 21 - 24910 receive buffer: 3 - -The time stamp is in milliseconds since start. - -To generate a graph, use ``parse_disk_buffer_log.py``. It takes the log file as the first -command line argument. It generates ``disk_buffer.png``. - -.. image:: disk_buffer_sample.png - -This is an example graph generated by the parse script. - -disk_access.log +file_access.log ''''''''''''''' -*The disk access log is now binary* - -The disc access log has three fields. The timestamp (milliseconds since start), operation -and offset. The offset is the absolute offset within the torrent (not within a file). This -log is only useful when you're downloading a single torrent, otherwise the offsets will not -be unique. - -In order to easily plot this directly in gnuplot, without parsing it, there are two lines -associated with each read or write operation. The first one is the offset where the operation -started, and the second one is where the operation ended. - -Example:: - - 15437 read 301187072 - 15437 read_end 301203456 - 16651 read 213385216 - 16680 read_end 213647360 - 25879 write 249036800 - 25879 write_end 249298944 - 26811 read 325582848 - 26943 read_end 325844992 - 36736 read 367001600 - 36766 read_end 367263744 - -The disk access log does not have any good visualization tool yet. There is however a gnuplot -file, ``disk_access.gnuplot`` which assumes ``disk_access.log`` is in the current directory. - -.. image:: disk_access.png - -The density of the disk seeks tells you how hard the drive has to work. +The disk access log is a binary file that can be parsed and converted to human +readable by the script ``tools/parse_access_log.py``. This tool produces a +graphical representation of the disk access and requires ``gnuplot``. understanding the disk threads ============================== diff --git a/include/libtorrent/add_torrent_params.hpp b/include/libtorrent/add_torrent_params.hpp index 00d1f8c7b..9baee8c68 100644 --- a/include/libtorrent/add_torrent_params.hpp +++ b/include/libtorrent/add_torrent_params.hpp @@ -188,7 +188,7 @@ namespace libtorrent // priorities for torrents in share mode, it will make it not work. // // The share mode has one setting, the share ratio target, see - // ``session_settings::share_mode_target`` for more info. + // ``settings_pack::share_mode_target`` for more info. flag_share_mode = 0x008, // determines if the IP filter should apply to this torrent or not. By diff --git a/include/libtorrent/alert.hpp b/include/libtorrent/alert.hpp index 2bcb3661b..ab6cba6cb 100644 --- a/include/libtorrent/alert.hpp +++ b/include/libtorrent/alert.hpp @@ -54,7 +54,7 @@ POSSIBILITY OF SUCH DAMAGE. // alerts (warnings, messages and errors from libtorrent). If no alerts have // been posted by libtorrent pop_alerts() will return an empty list. // -// By default, only errors are reported. session_settings::alert_mask can be +// By default, only errors are reported. settings_pack::alert_mask can be // used to specify which kinds of events should be reported. The alert mask is // comprised by bits from the category_t enum. // diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index 32301ddc1..7ce79c4b0 100644 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -865,7 +865,7 @@ namespace libtorrent // this is the limit on the number of outstanding requests // we have to this peer. This is initialized to the settings - // in the session_settings structure. But it may be lowered + // in the settings_pack. But it may be lowered // if the peer is known to require a smaller limit (like BitComet). // or if the extended handshake sets a limit. // web seeds also has a limit on the queue size. diff --git a/include/libtorrent/peer_info.hpp b/include/libtorrent/peer_info.hpp index 849b38fde..73a99e56e 100644 --- a/include/libtorrent/peer_info.hpp +++ b/include/libtorrent/peer_info.hpp @@ -233,7 +233,7 @@ namespace libtorrent // the number of seconds until the current front piece request will time // out. This timeout can be adjusted through - // ``session_settings::request_timeout``. + // ``settings_pack::request_timeout``. // -1 means that there is not outstanding request. int request_timeout; @@ -317,7 +317,7 @@ namespace libtorrent // the number of bytes this peer has pending in the disk-io thread. // Downloaded and waiting to be written to disk. This is what is capped - // by ``session_settings::max_queued_disk_bytes``. + // by ``settings_pack::max_queued_disk_bytes``. int pending_disk_bytes; // number of outstanding bytes to read diff --git a/include/libtorrent/session_handle.hpp b/include/libtorrent/session_handle.hpp index b77e035b1..c696bcbd2 100644 --- a/include/libtorrent/session_handle.hpp +++ b/include/libtorrent/session_handle.hpp @@ -81,7 +81,7 @@ namespace libtorrent // saved when calling save_state(). enum save_state_flags_t { - // saves settings (i.e. the session_settings) + // saves settings (i.e. the settings_pack) save_settings = 0x001, // saves dht_settings @@ -844,7 +844,7 @@ namespace libtorrent // aren't working or fail, will automatically be disabled and packets // will flow without using any proxy. If you want to enforce using a // proxy, even when the proxy doesn't work, enable anonymous_mode in - // session_settings. + // settings_pack. TORRENT_DEPRECATED void set_proxy(proxy_settings const& s); TORRENT_DEPRECATED @@ -957,7 +957,7 @@ namespace libtorrent // The alert queue in the session will not grow indefinitely. Make sure // to pop periodically to not miss notifications. To control the max // number of alerts that's queued by the session, see - // ``session_settings::alert_queue_size``. + // ``settings_pack::alert_queue_size``. // // Some alerts are considered so important that they are posted even when // the alert queue is full. Some alerts are considered mandatory and cannot diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index 435cb13be..884240a40 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -136,7 +136,7 @@ namespace libtorrent // // Since this setting sets a hard upper limit on cache usage, it // cannot be combined with - // ``session_settings::contiguous_recv_buffer``, since that feature + // ``settings_pack::contiguous_recv_buffer``, since that feature // treats the ``cache_size`` setting as a soft (but still pretty hard) // limit. The result of combining the two is peers being disconnected // after failing to allocate more disk buffers. diff --git a/include/libtorrent/torrent_handle.hpp b/include/libtorrent/torrent_handle.hpp index dcb528467..383accd9e 100644 --- a/include/libtorrent/torrent_handle.hpp +++ b/include/libtorrent/torrent_handle.hpp @@ -598,7 +598,7 @@ namespace libtorrent // Explicitly sets the upload mode of the torrent. In upload mode, the // torrent will not request any pieces. If the torrent is auto managed, // it will automatically be taken out of upload mode periodically (see - // ``session_settings::optimistic_disk_retry``). Torrents are + // ``settings_pack::optimistic_disk_retry``). Torrents are // automatically put in upload mode whenever they encounter a disk write // error. // @@ -1101,7 +1101,7 @@ namespace libtorrent // ``set_download_limit`` works the same way but for download bandwidth // instead of upload bandwidth. Note that setting a higher limit on a // torrent then the global limit - // (``session_settings::upload_rate_limit``) will not override the global + // (``settings_pack::upload_rate_limit``) will not override the global // rate limit. The torrent can never upload more than the global rate // limit. // @@ -1170,7 +1170,7 @@ namespace libtorrent // at the same time on this torrent. If you set this to -1, there will be // no limit. This defaults to infinite. The primary setting controlling // this is the global unchoke slots limit, set by unchoke_slots_limit in - // session_settings. + // settings_pack. // // ``max_uploads()`` returns the current settings. void set_max_uploads(int max_uploads) const; @@ -1182,7 +1182,7 @@ namespace libtorrent // must be at least 2. The default is unlimited number of connections. If // -1 is given to the function, it means unlimited. There is also a // global limit of the number of connections, set by - // ``connections_limit`` in session_settings. + // ``connections_limit`` in settings_pack. // // ``max_connections()`` returns the current settings. void set_max_connections(int max_connections) const; diff --git a/tools/Makefile.am b/tools/Makefile.am index 6d12e2f5d..1cf4aee97 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -12,7 +12,7 @@ EXTRA_DIST = Jamfile \ parse_dht_log.py \ parse_dht_rtt.py \ parse_dht_stats.py \ - parse_disk_access.py \ + parse_access_log.py \ parse_disk_buffer_log.py\ parse_disk_log.py \ parse_memory_log.py \ diff --git a/tools/parse_disk_access.py b/tools/parse_disk_access.py deleted file mode 100755 index e88946425..000000000 --- a/tools/parse_disk_access.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python - -import os, sys, time - -lines = open(sys.argv[1], 'rb').readlines() - -# logfile format: -# : -# example: -# 16434 read cache: 17 - -keys = ['read', 'write', 'head movement', 'seek per read byte', 'seek per written byte', - 'read operations per second', 'write operations per second'] -colors = ['305030', '503030', '3030f0', '10a010', 'a01010', 'd0d040', 'd040d0'] -style = ['dots', 'points', 'lines', 'lines', 'lines', 'lines', 'lines'] -axis = ['x1y1', 'x1y1', 'x1y2', 'x1y2', 'x1y2', 'x1y2', 'x1y2'] -plot = [True, False, False, False, False, True, False] - -out = open('disk_access_log.dat', 'w+') - -time = 1000000 - -last_pos = 0 -last_t = 0 -cur_movement = 0 -cur_read = 0 -cur_write = 0 -cur_read_ops = 0 -cur_write_ops = 0 - -for l in lines: - try: - # strip newline - l = l[0:-1].split(' ') - t = int(l[0]) - k = l[1] - n = int(l[2]) - except: - print l - continue - - read = '-' - write = '-' - movement = '-' - amount_read = '-' - amount_write = '-' - read_ops = '-' - write_ops = '-' - if k == 'read': - read = '%d' % n - cur_read_ops += 1 - if k == 'write': - write = '%d' % n - cur_write_ops += 1 - if k == 'read_end': cur_read += n - last_pos - if k == 'write_end': cur_write += n - last_pos - - cur_movement += abs(last_pos - n) - last_pos = n - - if last_t + time <= t: - movement = '%d' % cur_movement - if cur_read > 0: - amount_read = '%d' % (cur_movement / cur_read) - if cur_write > 0: - amount_write = '%d' % (cur_movement / cur_write) - read_ops = '%d' % cur_read_ops - write_ops = '%d' % cur_write_ops - cur_movement = 0 - cur_read = 0 - cur_write = 0 - last_t = t - cur_read_ops = 0 - cur_write_ops = 0 - - print >>out, '%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s' % (t, read, write, movement, amount_read, amount_write, read_ops, write_ops) - -out.close() - -out = open('disk_access.gnuplot', 'wb') -print >>out, "set term png size 1200,700" -print >>out, 'set output "disk_access.png"' -print >>out, 'set xrange [*:*]' -#print >>out, 'set y2range [0:*]' -print >>out, 'set xlabel "time (us)"' -print >>out, 'set ylabel "drive offset"' -#print >>out, 'set y2label "bytes / %d second(s)"' % (time / 1000) -print >>out, "set key box" -print >>out, "set tics nomirror" -print >>out, "set y2tics auto" -print >>out, 'plot', -count = 1 -for k in keys: - count += 1 - if not plot[count-2]: continue - print >>out, ' "disk_access_log.dat" using 1:%d title "%s" with %s lt rgb "#%s" axis %s,' \ - % (count, k, style[count-2], colors[count-2], axis[count-2]), -print >>out, 'x=0' -out.close() - -os.system('gnuplot disk_access.gnuplot') - From b446fe4bba34dc7a5dd49d694e585c05d680dcc5 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 15:43:02 -0400 Subject: [PATCH 04/11] deprecate settings_pack::hashing_threads and replace it with aio_threads in documentation --- docs/hacking.rst | 2 +- docs/tuning.rst | 12 ++++++------ examples/client_test.cpp | 4 ++-- include/libtorrent/settings_pack.hpp | 6 ++++++ src/create_torrent.cpp | 2 +- src/session.cpp | 6 ------ src/settings_pack.cpp | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/hacking.rst b/docs/hacking.rst index b96ce86dc..a3e414189 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -119,7 +119,7 @@ libtorrent starts 3 to 5 threads. * The third thread is the SHA-1 hash thread. By default there's only one hash thread, but on multi-core machines downloading at very high rates, libtorrent can be configured to start any number of hashing threads, to take full use of multi core systems. - (see ``settings_pack::hashing_threads``). + (see ``settings_pack::aio_threads``). * The fourth and fifth threads are spawned by asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking ``getaddrinfo()``. diff --git a/docs/tuning.rst b/docs/tuning.rst index b921cfec4..96c8cd164 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -332,12 +332,12 @@ and ``settings_pack::active_seeds``. SHA-1 hashing ------------- -When downloading at very high rates, it is possible to have the CPU be the bottleneck -for passing every downloaded byte through SHA-1. In order to enable calculating SHA-1 -hashes in parallel, on multi-core systems, set ``settings_pack::hashing_threads`` -to the number of threads libtorrent should start to do SHA-1 hashing. This defaults -to 1, and only if that thread is close to saturating one core does it make sense to -increase the number of threads. +When downloading at very high rates, it is possible to have the CPU be the +bottleneck for passing every downloaded byte through SHA-1. In order to enable +calculating SHA-1 hashes in parallel, on multi-core systems, set +``settings_pack::aio_threads`` to the number of threads libtorrent should +perform I/O and do SHA-1 hashing in. Only if that thread is close to saturating +one core does it make sense to increase the number of threads. scalability =========== diff --git a/examples/client_test.cpp b/examples/client_test.cpp index 62e76ab7c..911737f2d 100644 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -1243,7 +1243,7 @@ int main(int argc, char* argv[]) " previous command line options, so be sure to specify this first\n" " -G Add torrents in seed-mode (i.e. assume all pieces\n" " are present and check hashes on-demand)\n" - " -E specify how many hashing threads to use\n" + " -E specify how many disk I/O threads to use\n" "\n BITTORRENT OPTIONS\n" " -c sets the max number of connections\n" " -T sets the max number of connections per torrent\n" @@ -1401,7 +1401,7 @@ int main(int argc, char* argv[]) case 'B': settings.set_int(settings_pack::peer_timeout, atoi(arg)); break; case 'n': settings.set_bool(settings_pack::announce_to_all_tiers, true); --i; break; case 'G': seed_mode = true; --i; break; - case 'E': settings.set_int(settings_pack::hashing_threads, atoi(arg)); break; + case 'E': settings.set_int(settings_pack::aio_threads, atoi(arg)); break; case 'd': settings.set_int(settings_pack::download_rate_limit, atoi(arg) * 1000); break; case 'u': settings.set_int(settings_pack::upload_rate_limit, atoi(arg) * 1000); break; case 'S': diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index 884240a40..2a7f6af7d 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -1387,6 +1387,9 @@ namespace libtorrent // received by the metadata extension, i.e. magnet links. max_metadata_size, +#ifndef TORRENT_NO_DEPRECATE + // DEPRECTED: use aio_threads instead + // ``hashing_threads`` is the number of threads to use for piece hash // verification. It defaults to 1. For very high download rates, on // machines with multiple cores, this could be incremented. Setting it @@ -1394,6 +1397,9 @@ namespace libtorrent // any benefit of setting it to the number of cores. If it's set to 0, // hashing is done in the disk thread. hashing_threads, +#else + deprecated9, +#endif // the number of blocks to keep outstanding at any given time when // checking torrents. Higher numbers give faster re-checks but uses diff --git a/src/create_torrent.cpp b/src/create_torrent.cpp index 5ae63f89c..3992166f9 100644 --- a/src/create_torrent.cpp +++ b/src/create_torrent.cpp @@ -282,7 +282,7 @@ namespace libtorrent settings_pack sett; sett.set_int(settings_pack::cache_size, 0); - sett.set_int(settings_pack::hashing_threads, 2); + sett.set_int(settings_pack::aio_threads, 2); // TODO: this should probably be optional alert_manager dummy2(0, 0); diff --git a/src/session.cpp b/src/session.cpp index 6231deb3f..2278afd16 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -97,7 +97,6 @@ namespace libtorrent set.set_int(settings_pack::checking_mem_usage, 2); // don't use any extra threads to do SHA-1 hashing - set.set_int(settings_pack::hashing_threads, 0); set.set_int(settings_pack::network_threads, 0); set.set_int(settings_pack::aio_threads, 1); @@ -274,11 +273,6 @@ namespace libtorrent // connect to us if they want to set.set_int(settings_pack::max_failcount, 1); - // we're likely to have more than 4 cores on a high - // performance machine. One core is needed for the - // network thread - set.set_int(settings_pack::hashing_threads, 4); - // the number of threads to use to call async_write_some // and read_some on peer sockets // this doesn't work. See comment in settings_pack.cpp diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index 0dace4240..4a563a52c 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -316,7 +316,7 @@ namespace libtorrent SET(torrent_connect_boost, 10, 0), SET(alert_queue_size, 1000, &session_impl::update_alert_queue_size), SET(max_metadata_size, 3 * 1024 * 10240, 0), - SET(hashing_threads, 1, 0), + DEPRECATED_SET(hashing_threads, 1, 0), SET(checking_mem_usage, 256, 0), SET(predictive_piece_announce, 0, 0), SET(aio_threads, 4, &session_impl::update_disk_threads), From c0033d0977b68e514b9dd3305605f26fca5d2956 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 23:57:02 -0400 Subject: [PATCH 05/11] do not enable SSL listen sockets by default --- src/settings_pack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index 4a563a52c..067c8acc0 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -322,7 +322,7 @@ namespace libtorrent SET(aio_threads, 4, &session_impl::update_disk_threads), SET(aio_max, 300, 0), SET(network_threads, 0, &session_impl::update_network_threads), - SET(ssl_listen, 4433, 0), + SET(ssl_listen, 0, 0), SET(tracker_backoff, 250, 0), SET_NOPREV(share_ratio_limit, 200, 0), SET_NOPREV(seed_time_ratio_limit, 700, 0), From c1a310845362e705492be96106c2239ab2b87631 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 20:07:26 -0400 Subject: [PATCH 06/11] remove html and other generated files from the repository --- docs/building.html | 765 --- docs/client_test.html | 112 - docs/contributing.html | 136 - docs/dht_extensions.html | 148 - docs/dht_rss.html | 435 -- docs/dht_sec.html | 305 - docs/dht_store.html | 538 -- docs/examples.html | 763 --- docs/extension_protocol.html | 498 -- docs/features.html | 415 -- docs/index.html | 171 - docs/projects.html | 222 - docs/python_binding.html | 209 - docs/settings.rst | 3268 ---------- docs/stats_counters.rst | 2031 ------ docs/todo.html | 10465 ------------------------------- docs/troubleshooting.html | 90 - docs/troubleshooting.png | Bin 373300 -> 373382 bytes docs/tuning.html | 628 -- docs/udp_tracker_protocol.html | 605 -- docs/utp.html | 370 -- 21 files changed, 22174 deletions(-) delete mode 100644 docs/building.html delete mode 100644 docs/client_test.html delete mode 100644 docs/contributing.html delete mode 100644 docs/dht_extensions.html delete mode 100644 docs/dht_rss.html delete mode 100644 docs/dht_sec.html delete mode 100644 docs/dht_store.html delete mode 100644 docs/examples.html delete mode 100644 docs/extension_protocol.html delete mode 100644 docs/features.html delete mode 100644 docs/index.html delete mode 100644 docs/projects.html delete mode 100644 docs/python_binding.html delete mode 100644 docs/settings.rst delete mode 100644 docs/stats_counters.rst delete mode 100644 docs/todo.html delete mode 100644 docs/troubleshooting.html delete mode 100644 docs/tuning.html delete mode 100644 docs/udp_tracker_protocol.html delete mode 100644 docs/utp.html diff --git a/docs/building.html b/docs/building.html deleted file mode 100644 index 1f1cf37f8..000000000 --- a/docs/building.html +++ /dev/null @@ -1,765 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - -

-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
-
-
-

downloading and building

-

To acquire the latest version of libtorrent, you'll have to grab it from SVN. -You'll find instructions on how to do this here (see subversion access).

-

The build systems supported "out of the box" in libtorrent are boost-build v2 -(BBv2) and autotools (for unix-like systems). If you still can't build after -following these instructions, you can usually get help in the #libtorrent -IRC channel on irc.freenode.net.

-
-

Warning

-

A common mistake when building and linking against libtorrent is -to build with one set of configuration options (#defines) and -link against it using a different set of configuration options. Since -libtorrent has some code in header files, that code will not be -compatible with the built library if they see different configurations.

-

Always make sure that the same TORRENT_* macros are defined when you -link against libtorrent as when you build it.

-

Boost-build supports propagating configuration options to dependencies. -When building using the makefiles, this is handled by setting the -configuration options in the pkg-config file. Always use pkg-config -when linking against libtorrent.

-
-
-

building from svn

-

To build libtorrent from svn you need to check out the libtorrent sources from -sourceforge. If you downloaded a release tarball, you can skip this section.

-

To check out libtorrent follow these instructions.

-
-
-

building with BBv2

-

The primary reason to use boost-build is that it will automatically build the -dependent boost libraries with the correct compiler settings, in order to -ensure that the build targets are link compatible (see boost guidelines -for some details on this issue).

-

Since BBv2 will build the boost libraries for you, you need the full boost -source package. Having boost installed via some package system is usually not -enough (and even if it is enough, the necessary environment variables are -usually not set by the package installer).

-

If you want to build against an installed copy of boost, you can skip directly -to step 3 (assuming you also have boost build installed).

-
-

Step 1: Download boost

-

You'll find boost here.

-

Extract the archive to some directory where you want it. For the sake of this -guide, let's assume you extract the package to c:\boost_1_55_0 (I'm using -a windows path in this example since if you're on linux/unix you're more likely -to use the autotools). You'll need at least version 1.49 of the boost library -in order to build libtorrent.

-
-
-

Step 2: Setup BBv2

-

First you need to build bjam. You do this by opening a terminal (In -windows, run cmd). Change directory to -c:\boost_1_55_0\tools\jam\src. Then run the script called -build.bat or build.sh on a unix system. This will build bjam and -place it in a directory starting with bin. and then have the name of your -platform. Copy the bjam.exe (or bjam on a unix system) to a place -that's in you shell's PATH. On linux systems a place commonly used may be -/usr/local/bin or on windows c:\windows (you can also add directories -to the search paths by modifying the environment variable called PATH).

-

Now you have bjam installed. bjam can be considered an interpreter -that the boost-build system is implemented on. So boost-build uses bjam. -So, to complete the installation you need to make two more things. You need to -set the environment variable BOOST_BUILD_PATH. This is the path that tells -bjam where it can find boost-build, your configuration file and all the -toolsets (descriptions used by boost-build to know how to use different -compilers on different platforms). Assuming the boost install path above, set -it to c:\boost_1_55_0\tools\build\v2.

-

To set an environment variable in windows, type for example:

-
-set BOOST_BUILD_PATH=c:\boost_1_55_0\tools\build\v2
-
-

In a terminal window.

-

The last thing to do to complete the setup of BBv2 is to modify your -user-config.jam file. It is located in c:\boost_1_55_0\tools\build\v2. -Depending on your platform and which compiler you're using, you should add a -line for each compiler and compiler version you have installed on your system -that you want to be able to use with BBv2. For example, if you're using -Microsoft Visual Studio 12 (2013), just add a line:

-
-using msvc : 12.0 ;
-
-

If you use GCC, add the line:

-
-using gcc ;
-
-

If you have more than one version of GCC installed, you can add the -commandline used to invoke g++ after the version number, like this:

-
-using gcc : 3.3 : g++-3.3 ;
-using gcc : 4.0 : g++-4.0 ;
-
-

Another toolset worth mentioning is the darwin toolset (For MacOS X). -From Tiger (10.4) MacOS X comes with both GCC 3.3 and GCC 4.0. Then you can -use the following toolsets:

-
-using darwin : 3.3 : g++-3.3 ;
-using darwin : 4.0 : g++-4.0 ;
-
-

Note that the spaces around the semi-colons and colons are important!

-

Also see the official installation instructions.

-
-
-

Step 3: Building libtorrent

-

When building libtorrent, the Jamfile expects the environment variable -BOOST_ROOT to be set to the boost installation directory. It uses this to -find the boost libraries it depends on, so they can be built and their headers -files found. So, set this to c:\boost_1_55_0. You only need this if you're -building against a source distribution of boost.

-

Then the only thing left is simply to invoke bjam. If you want to specify -a specific toolset to use (compiler) you can just add that to the commandline. -For example:

-
-bjam msvc-7.1
-bjam gcc-3.3
-bjam darwin-4.0
-
-
-

Note

-

If the environment variable BOOST_ROOT is not set, the jamfile will -attempt to link against "installed" boost libraries. i.e. assume the headers -and libraries are available in default search paths.

-
-

To build different versions you can also just add the name of the build -variant. Some default build variants in BBv2 are release, debug, -profile.

-

You can build libtorrent as a dll too, by typing link=shared, or -link=static to build a static library.

-

If you want to explicitly say how to link against the runtime library, you -can set the runtime-link feature on the commandline, either to shared -or static. Most operating systems will only allow linking shared against -the runtime, but on windows you can do both. Example:

-
-bjam msvc-7.1 link=static runtime-link=static
-
-
-

Note

-

When building on windows, the path boost-build puts targets in may be too -long. If you get an error message like: "The input line is long", try to -pass --abbreviate-paths on the bjam command line.

-
-
-

Warning

-

If you link statically to the runtime library, you cannot build libtorrent -as a shared library (DLL), since you will get separate heaps in the library -and in the client application. It will result in crashes and possibly link -errors.

-
-
-

Note

-

With boost-build V2 (Milestone 11), the darwin toolset uses the -s linker -option to strip debug symbols. This option is buggy in Apple's GCC, and -will make the executable crash on startup. On Mac OS X, instead build -your release executables with the debug-symbols=on option, and -later strip your executable with strip.

-
-
-

Note

-

Some linux systems requires linking against librt in order to access -the POSIX clock functions. If you get an error complaining about a missing -symbol clock_gettime, you have to give need-librt=yes on the -bjam command line. This will make libtorrent link against librt.

-
-
-

Note

-

When building on Solaris, you might have to specify stdlib=sun-stlport -on the bjam command line.

-
-

The build targets are put in a directory called bin, and under it they are -sorted in directories depending on the toolset and build variant used.

-

To build the examples, just change directory to the examples directory and -invoke bjam from there. To build and run the tests, go to the test -directory and run bjam.

-

Note that if you're building on windows using the msvc toolset, you cannot run it -from a cygwin terminal, you'll have to run it from a cmd terminal. The same goes for -cygwin, if you're building with gcc in cygwin you'll have to run it from a cygwin terminal. -Also, make sure the paths are correct in the different environments. In cygwin, the paths -(BOOST_BUILD_PATH and BOOST_ROOT) should be in the typical unix-format (e.g. -/cygdrive/c/boost_1_55_0). In the windows environment, they should have the typical -windows format (c:/boost_1_55_0).

-
-

Note

-

In Jamfiles, spaces are separators. It's typically easiest to avoid spaces -in path names. If you want spaces in your paths, make sure to quote them -with double quotes (").

-
-

The Jamfile will define NDEBUG when it's building a release build. -For more build configuration flags see Build configurations.

-

Build features:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
boost build featurevalues
boost-link
    -
  • static - links statically against the boost -libraries.
  • -
  • shared - links dynamically against the boost -libraries.
  • -
-
logging
    -
  • off - logging alerts disabled.
  • -
  • on - default. logging alerts available, -still need to be enabled by the alert mask. The -reason to disable logging is to keep the binary -size down.
  • -
-
dht
    -
  • on - build with support for tracker less -torrents and DHT support.
  • -
  • logging - build with DHT support and verbose -logging of the DHT protocol traffic.
  • -
  • off - build without DHT support.
  • -
-
asserts
    -
  • auto - asserts are on if in debug mode
  • -
  • on - asserts are on, even in release mode
  • -
  • off - asserts are disabled
  • -
  • production - assertion failures are logged -to asserts.log in the current working -directory, but won't abort the process. -The file they are logged to can be customized -by setting the global pointer extern char -const* libtorrent_assert_log to a different -filename.
  • -
  • system use the libc assert macro
  • -
-
encryption
    -
  • on - encrypted bittorrent connections -enabled. (Message Stream encryption).
  • -
  • off - turns off support for encrypted -connections. The shipped public domain SHA-1 -implementation is used.
  • -
-
mutable-torrents
    -
  • on - mutable torrents are supported -(BEP 38) (default).
  • -
  • off - mutable torrents are not supported.
  • -
-
crypto
    -
  • built-in - (default) uses built-in SHA-1 -implementation.
  • -
  • openssl - links against openssl and -libcrypto to use for SHA-1 hashing.
  • -
  • gcrypt - links against libgcrypt to use for -SHA-1 hashing.
  • -
-
allocator
    -
  • pool - default, uses pool allocators for -send buffers.
  • -
  • system - uses malloc() and free() -instead. Might be useful to debug buffer issues -with tools like electric fence or libgmalloc.
  • -
  • debug - instruments buffer usage to catch -bugs in libtorrent.
  • -
-
link
    -
  • static - builds libtorrent as a static -library (.a / .lib)
  • -
  • shared - builds libtorrent as a shared -library (.so / .dll).
  • -
-
runtime-link
    -
  • static - links statically against the -run-time library (if available on your -platform).
  • -
  • shared - link dynamically against the -run-time library (default).
  • -
-
variant
    -
  • debug - builds libtorrent with debug -information and invariant checks.
  • -
  • release - builds libtorrent in release mode -without invariant checks and with optimization.
  • -
  • profile - builds libtorrent with profile -information.
  • -
-
character-set

This setting will only have an affect on windows. -Other platforms are expected to support UTF-8.

-
    -
  • unicode - The unicode version of the win32 -API is used. This is default.
  • -
  • ansi - The ansi version of the win32 API is -used.
  • -
-
invariant-checks

This setting only affects debug builds (where -NDEBUG is not defined). It defaults to on.

-
    -
  • on - internal invariant checks are enabled.
  • -
  • off - internal invariant checks are -disabled. The resulting executable will run -faster than a regular debug build.
  • -
  • full - turns on extra expensive invariant -checks.
  • -
-
debug-symbols
    -
  • on - default for debug builds. This setting -is useful for building release builds with -symbols.
  • -
  • off - default for release builds.
  • -
-
deprecated-functions
    -
  • on - default. Includes deprecated functions -of the API (might produce warnings during build -when deprecated functions are used).
  • -
  • off - excludes deprecated functions from the -API. Generates build errors when deprecated -functions are used.
  • -
-
iconv
    -
  • auto - use iconv for string conversions for -linux and mingw and other posix platforms.
  • -
  • on - force use of iconv
  • -
  • off - force not using iconv (disables locale -awareness except on windows).
  • -
-
i2p
    -
  • on - build with I2P support
  • -
  • off - build without I2P support
  • -
-
profile-calls
    -
  • off - default. No additional call profiling.
  • -
  • on - Enable logging of stack traces of -calls into libtorrent that are blocking. On -session shutdown, a file blocking_calls.txt -is written with stack traces of blocking calls -ordered by the number of them.
  • -
-
-

The variant feature is implicit, which means you don't need to specify -the name of the feature, just the value.

-

The logs created when building vlog or log mode are put in a directory called -libtorrent_logs in the current working directory.

-

When building the example client on windows, you need to build with -link=static otherwise you may get unresolved external symbols for some -boost.program-options symbols.

-

For more information, see the Boost build v2 documentation, or more -specifically the section on builtin features.

-
-
-
-

building with autotools

-

First of all, you need to install automake and autoconf. Many -unix/linux systems comes with these preinstalled.

-

The prerequisites for building libtorrent are boost.thread, boost.date_time -and boost.filesystem. Those are the compiled boost libraries needed. The -headers-only libraries needed include (but is not necessarily limited to) -boost.bind, boost.ref, boost.multi_index, boost.optional, boost.lexical_cast, -boost.integer, boost.iterator, boost.tuple, boost.array, boost.function, -boost.smart_ptr, boost.preprocessor, boost.static_assert.

-

If you want to build the client_test example, you'll also need boost.regex -and boost.program_options.

-
-

Step 1: Generating the build system

-

No build system is present if libtorrent is checked out from CVS - it -needs to be generated first. If you're building from a released tarball, -you may skip directly to Step 2: Running configure.

-

Execute the following command to generate the build system:

-
-./autotool.sh
-
-
-
-

Step 2: Running configure

-

In your shell, change directory to the libtorrent directory and run -./configure. This will look for libraries and C++ features that libtorrent -is dependent on. If something is missing or can't be found it will print an -error telling you what failed.

-

The most likely problem you may encounter is that the configure script won't -find the boost libraries. Make sure you have boost installed on your system. -The easiest way to install boost is usually to use the preferred package -system on your platform. Usually libraries and headers are installed in -standard directories where the compiler will find them, but sometimes that -may not be the case. For example when installing boost on darwin using -darwinports (the package system based on BSD ports) all libraries are -installed to /opt/local/lib and headers are installed to -/opt/local/include. By default the compiler will not look in these -directories. You have to set the enviornment variables LDFLAGS and -CXXFLAGS in order to make the compiler find those libs. In this example -you'd set them like this:

-
-export LDFLAGS=-L/opt/local/lib
-export CXXFLAGS=-I/opt/local/include
-
-

It was observed on FreeBSD (release 6.0) that one needs to add '-lpthread' to -LDFLAGS, as Boost::Thread detection will fail without it, even if -Boost::Thread is installed.

-

If you need to set these variables, it may be a good idea to add those lines -to your ~/.profile or ~/.tcshrc depending on your shell.

-

If the boost libraries are named with a suffix on your platform, you may use -the --with-boost-thread= option to specify the suffix used for the thread -library in this case. For more information about these options, run:

-
-./configure --help
-
-

On gentoo the boost libraries that are built with multi-threading support have -the suffix mt.

-

You know that the boost libraries were found if you see the following output -from the configure script:

-
-checking whether the Boost::DateTime library is available... yes
-checking for main in -lboost_date_time... yes
-checking whether the Boost::Filesystem library is available... yes
-checking for main in -lboost_filesystem... yes
-checking whether the Boost::Thread library is available... yes
-checking for main in -lboost_thread... yes
-
-

Another possible source of problems may be if the path to your libtorrent -directory contains spaces. Make sure you either rename the directories with -spaces in their names to remove the spaces or move the libtorrent directory.

-
-
-

Creating a debug build

-

To tell configure to build a debug version (with debug info, asserts -and invariant checks enabled), you have to run the configure script -with the following option:

-
-./configure --enable-debug=yes
-
-
-
-

Creating a release build

-

To tell the configure to build a release version (without debug info, -asserts and invariant checks), you have to run the configure script -with the following option:

-
-./configure --enable-debug=no
-
-

The above option make use of -DNDEBUG, which is used throughout libtorrent.

-
-
-

Step 3: Building libtorrent

-

Once the configure script is run successfully, you just type make and -libtorrent, the examples and the tests will be built.

-

When libtorrent is built it may be a good idea to run the tests, you do this -by running make check.

-

If you want to build a release version (without debug info, asserts and -invariant checks), you have to rerun the configure script and rebuild, like this:

-
-./configure --disable-debug
-make clean
-make
-
-
-
-
-

building with other build systems

-

If you're building in MS Visual Studio, you may have to set the compiler -options "force conformance in for loop scope", "treat wchar_t as built-in -type" and "Enable Run-Time Type Info" to Yes.

-
-
-

build configurations

-

By default libtorrent is built In debug mode, and will have pretty expensive -invariant checks and asserts built into it. If you want to disable such checks -(you want to do that in a release build) you can see the table below for which -defines you can use to control the build.

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
macrodescription
NDEBUGIf you define this macro, all asserts, -invariant checks and general debug code will be -removed. Since there is quite a lot of code in -in header files in libtorrent, it may be -important to define the symbol consistently -across compilation units, including the clients -files. Potential problems is different -compilation units having different views of -structs and class layouts and sizes.
TORRENT_DISABLE_LOGGINGThis macro will disable support for logging -alerts, like log_alert, torrent_log_alert and -peer_log_alert. With this build flag, you -cannot enable those alerts.
TORRENT_STORAGE_DEBUGThis will enable extra expensive invariant -checks in the storage, including logging of -piece sorting.
TORRENT_DISK_STATSThis will create a log of all disk activity -which later can parsed and graphed using -parse_disk_log.py.
UNICODEIf building on windows this will make sure the -UTF-8 strings in pathnames are converted into -UTF-16 before they are passed to the file -operations.
TORRENT_DISABLE_POOL_ALLOCATORDisables use of boost::pool<>.
TORRENT_DISABLE_MUTABLE_TORRENTSDisables mutable torrent support (BEP 38)
TORRENT_LINKING_SHAREDIf this is defined when including the -libtorrent headers, the classes and functions -will be tagged with __declspec(dllimport) -on msvc and default visibility on GCC 4 and -later. Set this in your project if you're -linking against libtorrent as a shared library. -(This is set by the Jamfile when -link=shared is set).
TORRENT_BUILDING_SHAREDIf this is defined, the functions and classes -in libtorrent are marked with -__declspec(dllexport) on msvc, or with -default visibility on GCC 4 and later. This -should be defined when building libtorrent as -a shared library. (This is set by the Jamfile -when link=shared is set).
TORRENT_DISABLE_DHTIf this is defined, the support for trackerless -torrents will be disabled.
TORRENT_DISABLE_ENCRYPTIONThis will disable any encryption support and -the dependencies of a crypto library. -Encryption support is the peer connection -encrypted supported by clients such as -uTorrent, Azureus and KTorrent. -If this is not defined, either -TORRENT_USE_OPENSSL or -TORRENT_USE_GCRYPT must be defined.
TORRENT_DISABLE_EXTENSIONSWhen defined, libtorrent plugin support is -disabled along with support for the extension -handskake (BEP 10).
_UNICODEOn windows, this will cause the file IO -use wide character API, to properly support -non-ansi characters.
TORRENT_DISABLE_RESOLVE_COUNTRIESDefining this will disable the ability to -resolve countries of origin for peer IPs.
TORRENT_DISABLE_INVARIANT_CHECKSThis will disable internal invariant checks in -libtorrent. The invariant checks can sometime -be quite expensive, they typically don't scale -very well. This option can be used to still -build in debug mode, with asserts enabled, but -make the resulting executable faster.
TORRENT_EXPENSIVE_INVARIANT_CHECKSThis will enable extra expensive invariant -checks. Useful for finding particular bugs -or for running before releases.
TORRENT_NO_DEPRECATEThis will exclude all deprecated functions from -the header files and cpp files.
TORRENT_PRODUCTION_ASSERTSDefine to either 0 or 1. Enables assert logging -in release builds.
TORRENT_USE_ASSERTSDefine as 0 to disable asserts unconditionally.
TORRENT_USE_SYSTEM_ASSERTSUses the libc assert macro rather then the -custom one.
-

If you experience that libtorrent uses unreasonable amounts of cpu, it will -definitely help to define NDEBUG, since it will remove the invariant checks -within the library.

-
-
-

building openssl for windows

-

To build openssl for windows with Visual Studio 7.1 (2003) execute the following commands -in a command shell:

-
-perl Configure VC-WIN32 --prefix="c:/openssl
-call ms\do_nasm
-call "C:\Program Files\Microsoft Visual Studio .NET 2003\vc7\bin\vcvars32.bat"
-nmake -f ms\nt.mak
-copy inc32\openssl "C:\Program Files\Microsoft Visual Studio .NET 2003\vc7\include\"
-copy out32\libeay32.lib "C:\Program Files\Microsoft Visual Studio .NET 2003\vc7\lib"
-copy out32\ssleay32.lib "C:\Program Files\Microsoft Visual Studio .NET 2003\vc7\lib"
-
-

This will also install the headers and library files in the visual studio directories to -be picked up by libtorrent.

-
-
- -
-
-
- -
- -
- - diff --git a/docs/client_test.html b/docs/client_test.html deleted file mode 100644 index 454354383..000000000 --- a/docs/client_test.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - -client_test example program - - - - - - - -
-
- - - - -
-

client_test example program

- -

Client test is a, more or less, complete bittorrent client. It lacks most -settings and you can't start or stop torrents once you've started it. All -the settings are hardcoded. The commandline arguments are:

-
-client_test <filename1.torrent> <filename2.torrent> ...
-
-

You can start any number of torrent downloads/seeds via the commandline. -If one argument starts with http:// it is interpreted as a tracker -announce url, and it expects an info-hash as the next argument. The info-hash -has to be hex-encoded. For example: 2410d4554d5ed856d69f426c38791673c59f4418. -If you pass an announce url and info-hash, a torrent-less download is started. -It relies on that at least one peer on the tracker is running a libtorrent based -client and has the metadata (.torrent file). The metadata extension in -libtorrent will then download it from that peer (or from those peers if more -than one).

-

While running, the client_test sample will look something like this:

-client_test.png -

The commands available in the client are:

-
    -
  • q quits the client (there will be a delay while the client waits -for tracker responses)
  • -
  • l toggle log. Will display the log at the bottom, informing about -tracker and peer events.
  • -
  • i toggles torrent info. Will show the peer list for each torrent.
  • -
  • d toggle download info. Will show the block list for each torrent, -showing downloaded and requested blocks.
  • -
  • p pause all torrents.
  • -
  • u unpause all torrents.
  • -
  • r force tracker reannounce for all torrents.
  • -
  • f toggle show file progress. Displays a list of all files and the -download progress for each file.
  • -
-

The list at the bottom (shown if you press d) shows which blocks has -been requested from which peer. The green background means that it has been -downloaded. It shows that fast peers will prefer to request whole pieces -instead of dowloading parts of pieces. It may make it easier to determine -which peer that sent the corrupt data if a piece fails the hash test.

- -
-
-
- -
- -
- - diff --git a/docs/contributing.html b/docs/contributing.html deleted file mode 100644 index 1df40233d..000000000 --- a/docs/contributing.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - -
-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
-
-

Table of contents

- -
-
-

contributing to libtorrent

-

There are several ways to contribute to libtorrent at various levels. Any help is -much appreciated. If you're interested in something libtorrent related that's not -enumerated on this page, please contact arvid@libtorrent.org or the mailing list.

-
    -
  1. -
    Testing
    -

    This is not just limited to finding bugs and ways to reproduce crashes, but also -sub-optimal behavior is certain scenarios and finding ways to reproduce those. Please -report any issue to the bug tracker at github.

    -

    New features that need testing are streaming (set_piece_deadline()), the different -choking algorithms (especially the new BitTyrant choker), the disk cache options (such -as explicit_cache).

    -
    -
    -
  2. -
-
    -
  1. -
    Documentation
    -

    Finding typos or outdated sections in the documentation. Contributing documentation -based on your own experience and experimentation with the library or with BitTorrent -in general. Non-reference documentation is very much welcome as well, higher level -descriptions on how to configure libtorrent for various situations for instance. -The reference documentation for libtorrent is generated from the header files. -For updates, please submit a pull request.

    -
    -
    -
  2. -
  3. -
    Code
    -

    Contributing code for new features or bug-fixes is highly welcome. If you're interested -in adding a feature but not sure where to start, please contact the mailing list or -#libtorrent @ irc.freenode.net. For proposed fixes or udpates, please -submit a pull request.

    -

    New features might be better support for integrating with other services, new choking -algorithms, seeding policies, ports to new platforms etc.

    -
    -
    -
  4. -
-

For an overview of the internals of libtorrent, see the hacking page.

-

For outstanding things to do, see the todo list.

-
- -
-
-
- -
- -
- - diff --git a/docs/dht_extensions.html b/docs/dht_extensions.html deleted file mode 100644 index 679de2e8b..000000000 --- a/docs/dht_extensions.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - -
-
- - - - -
- - --- - - - -
Author:Arvid Norberg, arvid@libtorrent.org
-
-

Mainline DHT extensions

-

libtorrent implements a few extensions to the Mainline DHT protocol.

-
-

get_peers response

-

libtorrent always responds with nodes to a get_peers request. If it has -peers for the specified info-hash, it will return values as well. This is -because just because some peer announced to us, doesn't mean that we are -among the 8 closest nodes of the info hash. libtorrent also keeps traversing -nodes using get_peers until it has found the 8 closest ones, and then announces -to those nodes.

-
-
-

forward compatibility

-

In order to support future DHT messages, any message which is not recognized -but has either an info_hash or target argument is interpreted as -find node for that target. i.e. it returns nodes. This allows future messages -to be properly forwarded by clients that don't understand them instead of -being blocked.

-
-
-

client identification

-

In each DHT packet, an extra key is inserted named "v". This is a string -describing the client and version used. This can help alot when debugging -and finding errors in client implementations. The string is encoded as four -characters, two characters describing the client and two characters interpreted -as a binary number describing the client version.

-

Currently known clients:

- ---- - - - - - - - - - - - - - - -
uTorrentUT
libtorrentLT
MooPoliceMP
GetRightGR
-
-
-

IPv6 support

-

This extension is superseeded by BEP 32.

-

The DHT messages that don't support IPv6 are the nodes replies. -They encode all the contacts as 6 bytes packed together in sequence in a -string. The problem is that IPv6 endpoints cannot be encoded as 6 bytes, but -needs 18 bytes. The extension libtorrent applies is to add another key, called -nodes2.

-

nodes2 may be present in replies that contains a nodes key. It is encoded -as a list of strings. Each string represents one contact and is encoded as 20 -bytes node-id and then a variable length encoded IP address (6 bytes in IPv4 case -and 18 bytes in IPv6 case).

-

As an optimization, libtorrent does not include the extra key in case there are -only IPv4 nodes present.

-
-
- -
-
-
- -
- -
- - diff --git a/docs/dht_rss.html b/docs/dht_rss.html deleted file mode 100644 index 3d52252b4..000000000 --- a/docs/dht_rss.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - -BitTorrent extension for DHT RSS feeds - - - - - - - - -
-
- - - - -
-

BitTorrent extension for DHT RSS feeds

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -

This proposal has been superseded by the dht_put feature. This may -still be implemented on top of that.

-

This is a proposal for an extension to the BitTorrent DHT to allow -for decentralized RSS feed like functionality.

-

The intention is to allow the creation of repositories of torrents -where only a single identity has the authority to add new content. For -this repository to be robust against network failures and resilient -to attacks at the source.

-

The target ID under which the repository is stored in the DHT, is the -SHA-1 hash of a feed name and the 512 bit public key. This private key -in this pair MUST be used to sign every item stored in the repository. -Every message that contain signed items MUST also include this key, to -allow the receiver to verify the key itself against the target ID as well -as the validity of the signatures of the items. Every recipient of a -message with feed items in it MUST verify both the validity of the public -key against the target ID it is stored under, as well as the validity of -the signatures of each individual item.

-

As with normal DHT announces, the write-token mechanism is used to -prevent IP spoof attacks.

-
-

terminology

-

In this document, a storage node refers to the node in the DHT to which -an item is being announce. A subscribing node refers to a node which -makes look ups in the DHT to find the storage nodes, to request items -from them.

-
-
-

linked lists

-

Items are chained together in a geneal singly linked list. A linked -list does not necessarily contain RSS items, and no RSS related items -are mandatory. However, RSS items will be used as examples in this BEP:

-
-key = SHA1(name + key)
-+---------+
-| head    |           key = SHA1(bencode(item))
-| +---------+         +---------+
-| | next    |-------->| item    |          key = SHA1(bencode(item))
-| | key     |         | +---------+        +---------+
-| | name    |         | | next    |------->| item    |
-| | seq     |         | | key     |        | +---------+
-| | ...     |         | | ...     |        | | next    |--->0
-| +---------+         | +---------+        | | key     |
-| sig     |           | sig     |          | | ...     |
-+---------+           +---------+          | +---------+
-                                           | sig     |
-                                           +---------+
-
-

The next pointer is at least 20 byte ID in the DHT key space pointing to where the next -item in the list is announced. The list is terminated with an ID of all zeroes.

-

The ID an items is announced to is determined by the SHA1 hash of the bencoded representation -of the item iteself. This contains all fields in the item, except the signature. -The only mandatory fields in an item are next, key and sig.

-

The key field MUST match the public key of the list head node. The sig field -MUST be the signature of the bencoded representation of item or head (whichever -is included in the message).

-

All subscribers MUST verify that the item is announced under the correct DHT key -and MUST verify the signature is valid and MUST verify the public key is the same -as the list-head. If a node fails any of these checks, it must be ignored and the -chain of items considered terminated.

-

Each item holds a bencoded dictionary with arbitrary keys, except two mandatory keys: -next and key. The signature sig is transferred outside of this dictionary -and is the signature of all of it. An implementation should stora any arbitrary keys that -are announced to an item, within reasonable restriction such as nesting, size and numeric -range of integers.

-
-
-

skip lists

-

The next key stored in the list head and the items is a string of at least length -20 bytes, it may be any length divisible by 20. Each 20 bytes are the ID of the next -item in the list, the item 2 hops away, 4 hops away, 8 hops away, and so on. For -simplicity, only the first ID (1 hop) in the next field is illustrated above.

-

A publisher of an item SHOULD include as many IDs in the next field as the remaining -size of the list warrants, within reason.

-

These skip lists allow for parallelized lookups of items and also makes it more efficient -to search for specific items. It also mitigates breaking lists missing some items.

-

Figure of the skip list in the first list item:

-
-n      Item0  Item1  Item2  Item3  Item4  Item5  Item6  Item7  Item8  Item9  Item10
-0        O----->
-20       O------------>
-40       O-------------------------->
-60       O------------------------------------------------------>
-
-

n refers to the byte offset into the next field.

-
-
-

list-head

-

The list head item is special in that it can be updated, without changing its -DHT key. This is required to prepend new items to the linked list. To authenticate -that only the original publisher can update the head, the whole linked list head -is signed. In order to avoid a malicious node to overwrite the list head with an old -version, the sequence number seq must be monotonically increasing for each update, -and a node hosting the list node MUST not downgrade a list head from a higher sequence -number to a lower one, only upgrade.

-

The list head's DHT key (which it is announced to) MUST be the SHA1 hash of the name -(n) and key fields concatenated.

-

Any node MUST reject any list head which is announced under any other ID.

-
-
-

messages

-

These are the messages to deal with linked lists.

-

The id field in these messages has the same semantics as the standard DHT messages, -i.e. the node ID of the node sending the message, to maintain the structure of the DHT -network.

-

The token field also has the same semantics as the standard DHT message get_peers -and announce_peer, when requesting an item and to write an item respectively.

-

nodes and nodes6 has the same semantics as in its get_peers response.

-
-

requesting items

-

This message can be used to request both a list head and a list item. When requesting -a list head, the n (name) field MUST be specified. When requesting a list item the -n field is not required.

-
-{
-   "a":
-   {
-      "id": <20 byte ID of sending node>,
-      "key": <64 byte public curve25519 key for this list>,
-      "n": <list name>
-      "target": <target-id for 'head' or 'item'>
-   },
-   "q": "get_item",
-   "t": <transaction-id>,
-   "y": "q",
-}
-
-

When requesting a list-head the target MUST always be SHA-1(feed_name + public_key). -target is the target node ID the item was written to.

-

The n field is the name of the list. If specified, It MUST be UTF-8 encoded string -and it MUST match the name of the feed in the receiving node.

-
-
-

request item response

-

This is the format of a response of a list head:

-
-{
-   "r":
-   {
-      "head":
-      {
-         "key": <64 byte public curve25519 key for this list>,
-         "next": <20 bytes item ID>,
-         "n": <name of the linked list>,
-         "seq": <monotonically increasing sequence number>
-      },
-      "sig": <curve25519 signature of 'head' entry (in bencoded form)>,
-      "id": <20 byte id of sending node>,
-      "token": <write-token>,
-      "nodes": <n * compact IPv4-port pair>,
-      "nodes6": <n * compact IPv6-port pair>
-   },
-   "t": <transaction-id>,
-   "y": "r",
-}
-
-

This is the format of a response of a list item:

-
-{
-   "r":
-   {
-      "item":
-      {
-         "key": <64 byte public curve25519 key for this list>,
-         "next": <20 bytes item ID>,
-         ...
-      },
-      "sig": <curve25519 signature of 'item' entry (in bencoded form)>,
-      "id": <20 byte id of sending node>,
-      "token": <write-token>,
-      "nodes": <n * compact IPv4-port pair>,
-      "nodes6": <n * compact IPv6-port pair>
-   },
-   "t": <transaction-id>,
-   "y": "r",
-}
-
-

A client receiving a get_item response MUST verify the signature in the sig -field against the bencoded representation of the item field, using the key as -the public key. The key MUST match the public key of the feed.

-

The item dictionary MAY contain arbitrary keys, and all keys MUST be stored for -items.

-
-
-

announcing items

-

The message format for announcing a list head:

-
-{
-   "a":
-   {
-      "head":
-      {
-         "key": <64 byte public curve25519 key for this list>,
-         "next": <20 bytes item ID>,
-         "n": <name of the linked list>,
-         "seq": <monotonically increasing sequence number>
-      },
-      "sig": <curve25519 signature of 'head' entry (in bencoded form)>,
-      "id": <20 byte node-id of origin node>,
-      "target": <target-id as derived from public key and name>,
-      "token": <write-token as obtained by previous request>
-   },
-   "y": "q",
-   "q": "announce_item",
-   "t": <transaction-id>
-}
-
-

The message format for announcing a list item:

-
-{
-   "a":
-   {
-      "item":
-      {
-         "key": <64 byte public curve25519 key for this list>,
-         "next": <20 bytes item ID>,
-         ...
-      },
-      "sig": <curve25519 signature of 'item' entry (in bencoded form)>,
-      "id": <20 byte node-id of origin node>,
-      "target": <target-id as derived from item dict>,
-      "token": <write-token as obtained by previous request>
-   },
-   "y": "q",
-   "q": "announce_item",
-   "t": <transaction-id>
-}
-
-

A storage node MAY reject items and heads whose bencoded representation is -greater than 1024 bytes.

-
-
-
-

re-announcing

-

In order to keep feeds alive, subscriber nodes SHOULD help out in announcing -items they have downloaded to the DHT.

-

Every subscriber node SHOULD store items in long term storage, across sessions, -in order to keep items alive for as long as possible, with as few sources as possible.

-

Subscribers to a feed SHOULD also announce items that they know of, to the feed. -Since a feed may have many subscribers and many items, subscribers should re-announce -items according to the following algorithm.

-
-1. pick one random item (i) from the local repository (except
-   items already announced this round)
-2. If all items in the local repository have been announced
-  2.1 terminate
-3. look up item i in the DHT
-4. If fewer than 8 nodes returned the item
-  4.1 announce i to the DHT
-  4.2 goto 1
-
-

This ensures a balanced load on the DHT while still keeping items alive

-
-
-

timeouts

-

Items SHOULD be announced to the DHT every 30 minutes. A storage node MAY time -out an item after 60 minutes of no one announcing it.

-

A storing node MAY extend the timeout when it receives a request for it. Since -items are immutable, the data doesn't go stale. Therefore it doesn't matter if -the storing node no longer is in the set of the 8 closest nodes.

-
-
-

RSS feeds

-

For RSS feeds, following keys are mandatory in the list item's item dictionary.

-
-
ih
-
The torrent's info hash
-
size
-
The size (in bytes) of all files the torrent
-
n
-
name of the torrent
-
-
-

example

-

This is an example of an announce_item message:

-
-{
-   "a":
-   {
-      "item":
-      {
-         "key": "6bc1de5443d1a7c536cdf69433ac4a7163d3c63e2f9c92d
-            78f6011cf63dbcd5b638bbc2119cdad0c57e4c61bc69ba5e2c08
-            b918c2db8d1848cf514bd9958d307",
-         "info-hash": "7ea94c240691311dc0916a2a91eb7c3db2c6f3e4",
-         "size": 24315329,
-         "n": "my stuff",
-         "next": "c68f29156404e8e0aas8761ef5236bcagf7f8f2e"
-      }
-      "sig": <signature>
-      "id": "b46989156404e8e0acdb751ef553b210ef77822e",
-      "target": "b4692ef0005639e86d7165bf378474107bf3a762"
-      "token": "23ba"
-   },
-   "y": "q",
-   "q": "announce_item",
-"t": "a421"
-}
-
-

Strings are printed in hex for printability, but actual encoding is binary.

-

Note that target is in fact SHA1 hash of the same data the signature sig -is the signature of, i.e.:

-
-d9:info-hash20:7ea94c240691311dc0916a2a91eb7c3db2c6f3e43:key64:6bc1de5443d1
-a7c536cdf69433ac4a7163d3c63e2f9c92d78f6011cf63dbcd5b638bbc2119cdad0c57e4c61
-bc69ba5e2c08b918c2db8d1848cf514bd9958d3071:n8:my stuff4:next20:c68f29156404
-e8e0aas8761ef5236bcagf7f8f2e4:sizei24315329ee
-
-

(note that binary data is printed as hex)

-
-
-
-

RSS feed URI scheme

-

The proposed URI scheme for DHT feeds is:

-
-magnet:?xt=btfd:<base16-curve25519-public-key> &dn= <feed name>
-
-

Note that a difference from regular torrent magnet links is the btfd -versus btih used in regular magnet links to torrents.

-

The feed name is mandatory since it is used in the request and when -calculating the target ID.

-
-
-

rationale

-

The reason to use curve25519 instead of, for instance, RSA is compactness. According to -http://cr.yp.to/, curve25519 is free from patent claims and there are open implementations -in both C and Java.

-
- -
-
-
- -
- -
- - diff --git a/docs/dht_sec.html b/docs/dht_sec.html deleted file mode 100644 index 67fbd8c8c..000000000 --- a/docs/dht_sec.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - -BitTorrent DHT security extension - - - - - - - - -
-
- - - - -
-

BitTorrent DHT security extension

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -
-

BitTorrent DHT security extension

-

The purpose of this extension is to make it harder to launch a few -specific attacks against the BitTorrent DHT and also to make it harder -to snoop the network.

-

Specifically the attack this extension intends to make harder is launching -8 or more DHT nodes which node-IDs selected close to a specific target -info-hash, in order to become the main nodes hosting peers for it. Currently -this is very easy to do and lets the attacker not only see all the traffic -related to this specific info-hash but also block access to it by other -peers.

-

The proposed guard against this is to enforce restrictions on which node-ID -a node can choose, based on its external IP address.

-
-
-

considerations

-

One straight forward scheme to tie the node ID to an IP would be to hash -the IP and force the node ID to share the prefix of that hash. One main -draw back of this approach is that an entities control over the DHT key -space grows linearly with its control over the IP address space.

-

In order to successfully launch an attack, you just need to find 8 IPs -whose hash will be closest to the target info-hash. Given the current -size of the DHT, that is quite likely to be possible by anyone in control -of a /8 IP block.

-

The size of the DHT is approximately 8.4 million nodes. This is estmiated -by observing that a typical routing table typically has about 20 of its -top routing table buckets full. That means the key space is dense enough -to contain 8 nodes for every combination of the 20 top bits of node IDs.

-
-2^20 * 8 = 8388608
-

By controlling that many IP addresses, an attacker could snoop any info-hash. -By controlling 8 times that many IP addresses, an attacker could actually -take over any info-hash.

-

With IPv4, snooping would require a /8 IP block, giving access to 16.7 million -Ips.

-

Another problem with hashing the IP is that multiple users behind a NAT are -forced to run their DHT nodes on the same node ID.

-
-
-

Node ID restriction

-

In order to avoid the number node IDs controlled to grow linearly by the number -of IPs, as well as allowing more than one node ID per external IP, the node -ID can be restricted at each class level of the IP.

-

Another important property of the restriction put on node IDs is that the -distribution of the IDs remoain uniform. This is why CRC32C (Castagnoli) was -chosen as the hash function.

-

The expression to calculate a valid ID prefix (from an IPv4 address) is:

-
-crc32c((ip & 0x030f3fff) | (r << 29))
-
-

And for an IPv6 address (ip is the high 64 bits of the address):

-
-crc32c((ip & 0x0103070f1f3f7fff) | (r << 61))
-
-

r is a random number in the range [0, 7]. The resulting integer, -representing the masked IP address is supposed to be big-endian before -hashed. The "|" operator means bit-wise OR.

-

The details of implementing this is to evaluate the expression, store the -result in a big endian 64 bit integer and hash those 8 bytes with CRC32C.

-

The first (most significant) 21 bits of the node ID used in the DHT MUST -match the first 21 bits of the resulting hash. The last byte of the hash MUST -match the random number (r) used to generate the hash.

-ip_id_v4.png -ip_id_v6.png -

Example code code for calculating a valid node ID:

-
-uint8_t* ip; // our external IPv4 or IPv6 address (network byte order)
-int num_octets; // the number of octets to consider in ip (4 or 8)
-uint8_t node_id[20]; // resulting node ID
-
-uint8_t v4_mask[] = { 0x03, 0x0f, 0x3f, 0xff };
-uint8_t v6_mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
-uint8_t* mask = num_octets == 4 ? v4_mask : v6_mask;
-
-for (int i = 0; i < num_octets; ++i)
-        ip[i] &= mask[i];
-
-uint32_t rand = std::rand() & 0xff;
-uint8_t r = rand & 0x7;
-ip[0] |= r << 5;
-
-uint32_t crc = 0;
-crc = crc32c(crc, ip, num_octets);
-
-// only take the top 21 bits from crc
-node_id[0] = (crc >> 24) & 0xff;
-node_id[1] = (crc >> 16) & 0xff;
-node_id[2] = ((crc >> 8) & 0xf8) | (std::rand() & 0x7);
-for (int i = 3; i < 19; ++i) node_id[i] = std::rand();
-node_id[19] = rand;
-
-

test vectors:

-
-IP           rand  example node ID
-============ ===== ==========================================
-124.31.75.21   1   5fbfbf f10c5d6a4ec8a88e4c6ab4c28b95eee4 01
-21.75.31.124  86   5a3ce9 c14e7a08645677bbd1cfe7d8f956d532 56
-65.23.51.170  22   a5d432 20bc8f112a3d426c84764f8c2a1150e6 16
-84.124.73.14  65   1b0321 dd1bb1fe518101ceef99462b947a01ff 41
-43.213.53.83  90   e56f6c bf5b7c4be0237986d5243b87aa6d5130 5a
-
-

The bold parts of the node ID are the important parts. The rest are -random numbers. The last bold number of each row has only its most significant -bit pulled from the CRC32C function. The lower 3 bits are random.

-
-
-

bootstrapping

-

In order to set ones initial node ID, the external IP needs to be known. This -is not a trivial problem. With this extension, all DHT responses SHOULD include -a top-level field called ip, containing a compact binary representation of -the requestor's IP and port. That is big endian IP followed by 2 bytes of big endian -port.

-

The IP portion is the same byte sequence used to verify the node ID.

-

It is important that the ip field is in the top level dictionary. Nodes that -enforce the node-ID will respond with an error message ("y": "e", "e": { ... }), -whereas a node that supports this extension but without enforcing it will respond -with a normal reply ("y": "r", "r": { ... }).

-

A DHT node which receives an ip result in a request SHOULD consider restarting -its DHT node with a new node ID, taking this IP into account. Since a single node -can not be trusted, there should be some mechanism to determine whether or -not the node has a correct understanding of its external IP or not. This could -be done by voting, or only restart the DHT once at least a certain number of -nodes, from separate searches, tells you your node ID is incorrect.

-
-
-

rationale

-

The choice of using CRC32C instead of a more traditional cryptographic hash -function is justified primarily of these reasons:

-
    -
  1. it is a fast function
  2. -
  3. produces well distributed results
  4. -
  5. there is no need for the hash function to be one-way (the input set is -so small that any hash function could be reversed).
  6. -
  7. CRC32C (Castagnoli) is supported in hardware by SSE 4.2, which can -significantly speed up computation
  8. -
-

There are primarily two tests run on SHA-1 and CRC32C to establish the -distribution of results. The first one is the number of bits in the output -set that contain every possible combination of bits. The CRC32C function -has a longer such prefix in its output than SHA-1. This means nodes will still -have well uniformly distributed IDs, even when IP addresses in use are not -uniformly distributed.

-

The following graph illustrate a few different hash functions with regard -to this property.

-complete_bit_prefixes.png -

This test takes into account IP addresses that are not globally routable, i.e. -reserved for local networks, multicast and other things. It also takes into -account that some /8 blocks are not in use by end-users and exremely unlikely -to ever run a DHT node. This makes the results likely to be very similar to -what we would see in the wild.

-

These results indicate that CRC32C provides the best uniformity in the results -in terms of bit prefixes where all possibilities are represented, and that -no more than 21 bits should be used from the result. If more than 21 bits -were to be used, there would be certain node IDs that would be impossible to -have, which would make routing sub-optimal.

-

The second test is more of a sanity test for the uniform distribution property. -The target space (32 bit interger) is divided up into 1000 buckets. Every valid -IP and r input is run through the algorithm and the result is put in the -bucket it falls in. The expectation is that each bucket has roughly an equal -number of results falling into it. The following graph shows the resulting -histogram, comparing SHA-1 and CRC32C.

-hash_distribution.png -

The source code for these tests can be found here.

-

The reason to use CRC32C instead of the CRC32 implemented by zlib is that -Intel CPUs have hardware support for the CRC32C calculations. The input -being exactly 4 bytes is also deliberate, to make it fit in a single -instruction.

-
-
-

enforcement

-

Once enforced, write tokens from peers whose node ID does not match its external -IP should be considered dropped. In other words, a peer that uses a non-matching -ID MUST never be used to store information on, regardless of which request. In the -original DHT specification only announce_peer stores data in the network, -but any future extension which stores data in the network SHOULD use the same -restriction.

-

Any peer on a local network address is exempt from this node ID verification. -This includes the following IP blocks:

-
-
10.0.0.0/8
-
reserved for local networks
-
172.16.0.0/12
-
reserved for local networks
-
192.168.0.0/16
-
reserved for local networks
-
169.254.0.0/16
-
reserved for self-assigned IPs
-
127.0.0.0/8
-
reserved for loopback
-
-
-
-

backwards compatibility and transition

-

During some transition period, this restriction should not be enforced, and -peers whose node ID does not match this formula relative to their external IP -should not be blocked.

-

Requests from peers whose node ID does not match their external IP should -always be serviced, even after the transition period. The attack this protects -from is storing data on an attacker's node, not servicing an attackers request.

-
-
-

forward compatibility

-

If the total size of the DHT grows to the point where the inherent size limit -in this proposal is too small, the modulus constants can be updated in a new -proposal, and another transition period where both sets of modulus constants -are accepted.

-
- -
-
-
- -
- -
- - diff --git a/docs/dht_store.html b/docs/dht_store.html deleted file mode 100644 index c18096906..000000000 --- a/docs/dht_store.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - -BitTorrent extension for arbitrary DHT store - - - - - - - - -
-
- - - - -
-

BitTorrent extension for arbitrary DHT store

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -

This is a proposal for an extension to the BitTorrent DHT to allow -storing and retrieving of arbitrary data.

-

It supports both storing immutable items, where the key is -the SHA-1 hash of the data itself, and mutable items, where -the key is the public key of the key pair used to sign the data.

-

There are two new proposed messages, put and get.

-
-

terminology

-

In this document, a storage node refers to the node in the DHT to which -an item is being announced and stored on. A requesting node refers to -a node which makes look-ups in the DHT to find the storage nodes, to -request items from them, and possibly re-announce those items to keep them -alive.

-
-
-

messages

-

The proposed new messages get and put are similar to the existing -get_peers and announce_peer.

-

Responses to get should always include nodes and nodes6. Those -fields have the same semantics as in its get_peers response. It should also -include a write token, token, with the same semantics as int get_peers. -The write token MAY be tied specifically to the key which get requested. -i.e. the token can only be used to store values under that one key. It may -also be tied to the node ID and IP address of the requesting node.

-

The id field in these messages has the same semantics as the standard DHT -messages, i.e. the node ID of the node sending the message, to maintain the -structure of the DHT network.

-

The token field also has the same semantics as the standard DHT message -get_peers and announce_peer, when requesting an item and to write an -item respectively.

-

The k field is the 32 byte ed25519 public key, which the signature can be -authenticated with. When looking up a mutable item, the target field MUST be -the SHA-1 hash of this key concatenated with the salt, if present.

-

The distinction between storing mutable and immutable items is the inclusion of -a public key, a sequence number, signature and an optional salt (k, seq, -sig and salt).

-

get requests for mutable items and immutable items cannot be distinguished -from eachother. An implementation can either store mutable and immutable items -in the same hash table internally, or in separate ones and potentially do two -lookups for get requests.

-

The v field is the value to be stored. It is allowed to be any bencoded -type (list, dict, string or integer). When it's being hashed (for verifying its -signature or to calculate its key), its flattened, bencoded, form is used. It is -important to use the verbatim bencoded representation as it appeared in the -message. decoding and then re-encoding bencoded structures is not necessarily an -identity operation.

-

Storing nodes MAY reject put requests where the bencoded form of v is -longer than 1000 bytes. In other words, it's not safe to assume storing more -than 1000 bytes will succeed.

-
-
-

immutable items

-

Immutable items are stored under their SHA-1 hash, and since they cannot be -modified, there is no need to authenticate the origin of them. This makes -immutable items simple.

-

A node making a lookup SHOULD verify the data it receives from the network, to -verify that its hash matches the target that was looked up.

-
-

put message

-

Request:

-
-{
-        "a":
-        {
-                "id": <20 byte id of sending node (string)>,
-                "v": <any bencoded type, whose encoded size <= 1000>
-        },
-        "t": <transaction-id (string)>,
-        "y": "q",
-        "q": "put"
-}
-
-

Response:

-
-{
-        "r": { "id": <20 byte id of sending node (string)> },
-        "t": <transaction-id (string)>,
-        "y": "r",
-}
-
-
-
-

get message

-

Request:

-
-{
-        "a":
-        {
-                "id": <20 byte id of sending node (string)>,
-                "target": <SHA-1 hash of item (string)>,
-        },
-        "t": <transaction-id (string)>,
-        "y": "q",
-        "q": "get"
-}
-
-

Response:

-
-{
-        "r":
-        {
-                "id": <20 byte id of sending node (string)>,
-                "token": <write token (string)>,
-                "v": <any bencoded type whose SHA-1 hash matches 'target'>,
-                "nodes": <IPv4 nodes close to 'target'>,
-                "nodes6": <IPv6 nodes close to 'target'>
-        },
-        "t": <transaction-id>,
-        "y": "r",
-}
-
-
-
-
-

mutable items

-

Mutable items can be updated, without changing their DHT keys. To authenticate -that only the original publisher can update an item, it is signed by a private -key generated by the original publisher. The target ID mutable items are stored -under is the SHA-1 hash of the public key (as it appears in the put -message).

-

In order to avoid a malicious node to overwrite the list head with an old -version, the sequence number seq must be monotonically increasing for each -update, and a node hosting the list node MUST not downgrade a list head from a -higher sequence number to a lower one, only upgrade. The sequence number SHOULD -not exceed MAX_INT64, (i.e. 0x7fffffffffffffff. A client MAY reject any -message with a sequence number exceeding this. A client MAY also reject any -message with a negative sequence number.

-

The signature is a 64 byte ed25519 signature of the bencoded sequence number -concatenated with the v key. e.g. something like this:

-
-3:seqi4e1:v12:Hello world!
-
-

If the salt key is present and non-empty, the salt string must be included -in what's signed. Note that if salt is specified and an empty string, it is -as if it was not specified and nothing in addition to the sequence number and -the data is signed. The salt string may not be longer than 64 bytes.

-

When a salt is included in what is signed, the key salt with the value of -the key is prepended in its bencoded form. For example, if salt is "foobar", -the buffer to be signed is:

-
-4:salt6:foobar3:seqi4e1:v12:Hello world!
-
-
-

put message

-

Request:

-
-{
-        "a":
-        {
-                "cas": <optional expected seq-nr (int)>,
-                "id": <20 byte id of sending node (string)>,
-                "k": <ed25519 public key (32 bytes string)>,
-                "salt": <optional salt to be appended to "k" when hashing (string)>
-                "seq": <monotonically increasing sequence number (integer)>,
-                "sig": <ed25519 signature (64 bytes string)>,
-                "token": <write-token (string)>,
-                "v": <any bencoded type, whose encoded size < 1000>
-        },
-        "t": <transaction-id (string)>,
-        "y": "q",
-        "q": "put"
-}
-
-

Storing nodes receiving a put request where seq is lower than or equal -to what's already stored on the node, MUST reject the request. If the sequence -number is equal, and the value is also the same, the node SHOULD reset its -timeout counter.

-

If the sequence number in the put message is lower than the sequence number -associated with the currently stored value, the storing node MAY return an error -message with code 302 (see error codes below).

-

Note that this request does not contain a target hash. The target hash under -which this blob is stored is implied by the k argument. The key is the SHA-1 -hash of the key (k).

-

In order to support a single key being used to store separate items in the DHT, -an optional salt can be specified in the put request of mutable items. -If the salt entry is not present, it can be assumed to be an empty string, and -its semantics should be identical as specifying a salt key with an empty string. -The salt can be any binary string (but probably most conveniently a hash of -something). This string is appended to the key, as specified in the k field, -when calculating the key to store the blob under (i.e. the key get requests -specify to retrieve this data).

-

This lets a single entity, with a single key, publish any number of unrelated -items, with a single key that readers can verify. This is useful if the -publisher doesn't know ahead of time how many different items are to be -published. It can distribute a single public key for users to authenticate the -published blobs.

-

Note that the salt is not returned in the response to a get request. This -is intentional. When issuing a get request for an item is expected to -know what the salt is (because it is part of what the target ID that is being -looked up is derived from). There is no need to repeat it back for bystanders -to see.

-
-
-

CAS

-

CAS is short for compare and swap, it has similar semantics as CAS CPU -instructions. It is used to avoid race conditions when multiple nodes are -writing to the same slot in the DHT.

-

The cas field is optional. If present it specifies the sequence number of -the data blob being overwritten by the put. When present, the storing node -MUST compare this number to the current sequence number it has stored under -this key. Only if the cas matches the stored sequence number is the put -performed. If it mismatches, the store fails and an error is returned. -See errors below.

-

The cas field only applies to mutable puts. If there is no current -value, the cas field SHOULD be ignored.

-

When sending a put request to a node that did not return any data for the -get, the cas field SHOULD NOT be included.

-
-
-

response

-

Response:

-
-{
-        "r": { "id": <20 byte id of sending node (string)> },
-        "t": <transaction-id (string)>,
-        "y": "r",
-}
-
-
-
-

errors

-

If the store fails for any reason an error message is returned instead of the -message template above, i.e. one where "y" is "e" and "e" is a tuple of -[error-code, message]). Failures include cas mismatches and the sequence -number is outdated.

-

The error message (as specified by BEP5) looks like this:

-
-{
-        "e": [ <error-code (integer)>, <error-string (string)> ],
-        "t": <transaction-id (string)>,
-        "y": "e",
-}
-
-

In addition to the error codes defined in BEP5, this specification defines -some additional error codes.

- ---- - - - - - - - - - - - - - - - - - - - - - - -
error-codedescription
205message (v field) -too big.
206invalid signature
207salt (salt field) -too big.
301the CAS hash mismatched, -re-read value and try -again.
302sequence number less than -current.
-

An implementation MUST emit 301 errors if the cas mismatches. This is a -critical feature in synchronization of multiple agents sharing an immutable -item.

-
-
-

get message

-

Request:

-
-{
-        "a":
-        {
-                "id": <20 byte id of sending node (string)>,
-                "target:" <20 byte SHA-1 hash of public key and salt (string)>
-        },
-        "t": <transaction-id (string)>,
-        "y": "q",
-        "q": "get"
-}
-
-

Response:

-
-{
-        "r":
-        {
-                "id": <20 byte id of sending node (string)>,
-                "k": <ed25519 public key (32 bytes string)>,
-                "nodes": <IPv4 nodes close to 'target'>,
-                "nodes6": <IPv6 nodes close to 'target'>,
-                "seq": <monotonically increasing sequence number (integer)>,
-                "sig": <ed25519 signature (64 bytes string)>,
-                "token": <write-token (string)>,
-                "v": <any bencoded type, whose encoded size <= 1000>
-        },
-        "t": <transaction-id (string)>,
-        "y": "r",
-}
-
-
-
-
-

signature verification

-

In order to make it maximally difficult to attack the bencoding parser, signing -and verification of the value and sequence number should be done as follows:

-
    -
  1. encode value and sequence number separately
  2. -
  3. concatenate ("4:salt" length-of-salt ":" salt) "3:seqi" seq -"e1:v" len ":" and the encoded value. -sequence number 1 of value "Hello World!" would be converted to: -"3:seqi1e1:v12:Hello World!". In this way it is not possible to convince a -node that part of the length is actually part of the sequence number even if -the parser contains certain bugs. Furthermore it is not possible to have a -verification failure if a bencoding serializer alters the order of entries in -the dictionary. The salt is in parenthesis because it is optional. It is only -prepended if a non-empty salt is specified in the put request.
  4. -
  5. sign or verify the concatenated string
  6. -
-

On the storage node, the signature MUST be verified before accepting the store -command. The data MUST be stored under the SHA-1 hash of the public key (as it -appears in the bencoded dict) and the salt (if present).

-

On the requesting nodes, the key they get back from a get request MUST be -verified to hash to the target ID the lookup was made for, as well as verifying -the signature. If any of these fail, the response SHOULD be considered invalid.

-
-
-

expiration

-

Without re-announcement, these items MAY expire in 2 hours. In order -to keep items alive, they SHOULD be re-announced once an hour.

-

Any node that's interested in keeping a blob in the DHT alive may announce it. -It would simply repeat the signature for a mutable put without having the -private key.

-
-
-

test vectors

-
-

test 1 (mutable)

-

value:

-
-12:Hello World!
-
-

buffer being signed:

-
-3:seqi1e1:v12:Hello World!
-
-

public key:

-
-77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548
-
-

private key:

-
-e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74d
-b7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d
-
-

target ID:

-
-4a533d47ec9c7d95b1ad75f576cffc641853b750
-
-

signature:

-
-305ac8aeb6c9c151fa120f120ea2cfb923564e11552d06a5d856091e5e853cff
-1260d3f39e4999684aa92eb73ffd136e6f4f3ecbfda0ce53a1608ecd7ae21f01
-
-
-
-

test 2 (mutable with salt)

-

value:

-
-12:Hello World!
-
-

salt:

-
-foobar
-
-

buffer being signed:

-
-4:salt6:foobar3:seqi1e1:v12:Hello World!
-
-

public key:

-
-77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548
-
-

private key:

-
-e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74d
-b7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d
-
-

target ID:

-
-411eba73b6f087ca51a3795d9c8c938d365e32c1
-
-

signature:

-
-6834284b6b24c3204eb2fea824d82f88883a3d95e8b4a21b8c0ded553d17d17d
-df9a8a7104b1258f30bed3787e6cb896fca78c58f8e03b5f18f14951a87d9a08
-
-
-
-

test 3 (immutable)

-

value:

-
-12:Hello World!
-
-

target ID:

-
-e5f96f6f38320f0f33959cb4d3d656452117aadb
-
-
-
-
-

resources

-

Libraries that implement ed25519 DSA:

- -
- -
-
-
- -
- -
- - diff --git a/docs/examples.html b/docs/examples.html deleted file mode 100644 index ac327bd23..000000000 --- a/docs/examples.html +++ /dev/null @@ -1,763 +0,0 @@ - - - - - - -libtorrent Examples - - - - - - - - -
-
- - - - -
-

libtorrent Examples

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
-
-

Table of contents

- -
-
-

examples

-

Except for the example programs in this manual, there's also a bigger example -of a (little bit) more complete client, client_test. There are separate -instructions for how to use it here if you'd like to try it. Note that building -client_test also requires boost.regex and boost.program_options library.

-
-

simple client

-

This is a simple client. It doesn't have much output to keep it simple:

-
-#include <stdlib.h>
-#include <boost/make_shared.hpp>
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/session.hpp"
-#include "libtorrent/torrent_info.hpp"
-
-int main(int argc, char* argv[])
-{
-  using namespace libtorrent;
-  namespace lt = libtorrent;
-
-  if (argc != 2)
-  {
-    fputs("usage: ./simple_client torrent-file\n"
-      "to stop the client, press return.\n", stderr);
-    return 1;
-  }
-
-  settings_pack sett;
-  sett.set_str(settings_pack::listen_interfaces, "0.0.0.0:6881");
-  lt::session s(sett);
-  error_code ec;
-  if (ec)
-  {
-    fprintf(stderr, "failed to open listen socket: %s\n", ec.message().c_str());
-    return 1;
-  }
-  add_torrent_params p;
-  p.save_path = "./";
-  p.ti = boost::make_shared<torrent_info>(std::string(argv[1]), boost::ref(ec), 0);
-  if (ec)
-  {
-    fprintf(stderr, "%s\n", ec.message().c_str());
-    return 1;
-  }
-  s.add_torrent(p, ec);
-  if (ec)
-  {
-    fprintf(stderr, "%s\n", ec.message().c_str());
-    return 1;
-  }
-
-  // wait for the user to end
-  char a;
-  scanf("%c\n", &a);
-  return 0;
-}
-
-
-
-

make_torrent

-

Shows how to create a torrent from a directory tree:

-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/torrent_info.hpp"
-#include "libtorrent/file.hpp"
-#include "libtorrent/storage.hpp"
-#include "libtorrent/hasher.hpp"
-#include "libtorrent/create_torrent.hpp"
-#include "libtorrent/file.hpp"
-#include "libtorrent/file_pool.hpp"
-#include "libtorrent/hex.hpp" // for from_hex
-
-#include <boost/bind.hpp>
-
-#ifdef TORRENT_WINDOWS
-#include <direct.h> // for _getcwd
-#endif
-
-using namespace libtorrent;
-
-int load_file(std::string const& filename, std::vector<char>& v, libtorrent::error_code& ec, int limit = 8000000)
-{
-  ec.clear();
-  FILE* f = fopen(filename.c_str(), "rb");
-  if (f == NULL)
-  {
-    ec.assign(errno, boost::system::system_category());
-    return -1;
-  }
-
-  int r = fseek(f, 0, SEEK_END);
-  if (r != 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-  long s = ftell(f);
-  if (s < 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  if (s > limit)
-  {
-    fclose(f);
-    return -2;
-  }
-
-  r = fseek(f, 0, SEEK_SET);
-  if (r != 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  v.resize(s);
-  if (s == 0)
-  {
-    fclose(f);
-    return 0;
-  }
-
-  r = fread(&v[0], 1, v.size(), f);
-  if (r < 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  fclose(f);
-
-  if (r != s) return -3;
-
-  return 0;
-}
-
-std::string branch_path(std::string const& f)
-{
-  if (f.empty()) return f;
-
-#ifdef TORRENT_WINDOWS
-  if (f == "\\\\") return "";
-#endif
-  if (f == "/") return "";
-
-  int len = f.size();
-  // if the last character is / or \ ignore it
-  if (f[len-1] == '/' || f[len-1] == '\\') --len;
-  while (len > 0)
-  {
-    --len;
-    if (f[len] == '/' || f[len] == '\\')
-      break;
-  }
-
-  if (f[len] == '/' || f[len] == '\\') ++len;
-  return std::string(f.c_str(), len);
-}
-
-// do not include files and folders whose
-// name starts with a .
-bool file_filter(std::string const& f)
-{
-  if (f.empty()) return false;
-
-  char const* first = f.c_str();
-  char const* sep = strrchr(first, '/');
-#if defined(TORRENT_WINDOWS) || defined(TORRENT_OS2)
-  char const* altsep = strrchr(first, '\\');
-  if (sep == NULL || altsep > sep) sep = altsep;
-#endif
-  // if there is no parent path, just set 'sep'
-  // to point to the filename.
-  // if there is a parent path, skip the '/' character
-  if (sep == NULL) sep = first;
-  else ++sep;
-
-  // return false if the first character of the filename is a .
-  if (sep[0] == '.') return false;
-
-  fprintf(stderr, "%s\n", f.c_str());
-  return true;
-}
-
-void print_progress(int i, int num)
-{
-  fprintf(stderr, "\r%d/%d", i+1, num);
-}
-
-void print_usage()
-{
-  fputs("usage: make_torrent FILE [OPTIONS]\n"
-    "\n"
-    "Generates a torrent file from the specified file\n"
-    "or directory and writes it to standard out\n\n"
-    "OPTIONS:\n"
-    "-m file       generate a merkle hash tree torrent.\n"
-    "              merkle torrents require client support\n"
-    "              the resulting full merkle tree is written to\n"
-    "              the specified file\n"
-    "-w url        adds a web seed to the torrent with\n"
-    "              the specified url\n"
-    "-t url        adds the specified tracker to the\n"
-    "              torrent. For multiple trackers, specify more\n"
-    "              -t options\n"
-    "-c comment    sets the comment to the specified string\n"
-    "-C creator    sets the created-by field to the specified string\n"
-    "-p bytes      enables padding files. Files larger\n"
-    "              than bytes will be piece-aligned\n"
-    "-s bytes      specifies a piece size for the torrent\n"
-    "              This has to be a multiple of 16 kiB\n"
-    "-l            Don't follow symlinks, instead encode them as\n"
-    "              links in the torrent file\n"
-    "-o file       specifies the output filename of the torrent file\n"
-    "              If this is not specified, the torrent file is\n"
-    "              printed to the standard out, except on windows\n"
-    "              where the filename defaults to a.torrent\n"
-    "-r file       add root certificate to the torrent, to verify\n"
-    "              the HTTPS tracker\n"
-    "-S info-hash  add a similar torrent by info-hash. The similar\n"
-    "              torrent is expected to share some files with this one\n"
-    "-L collection add a collection name to this torrent. Other torrents\n"
-    "              in the same collection is expected to share files\n"
-    "              with this one.\n"
-    "-M            make the torrent compatible with mutable torrents\n"
-    "              this means aligning large files and pad them in order\n"
-    "              for piece hashes to uniquely indentify a file without\n"
-    "              overlap\n"
-    , stderr);
-}
-
-int main(int argc, char* argv[])
-{
-  using namespace libtorrent;
-
-  std::string creator_str = "libtorrent";
-  std::string comment_str;
-
-  if (argc < 2)
-  {
-    print_usage();
-    return 1;
-  }
-
-#ifndef BOOST_NO_EXCEPTIONS
-  try
-  {
-#endif
-    std::vector<std::string> web_seeds;
-    std::vector<std::string> trackers;
-    std::vector<std::string> collections;
-    std::vector<sha1_hash> similar;
-    int pad_file_limit = -1;
-    int piece_size = 0;
-    int flags = 0;
-    std::string root_cert;
-
-    std::string outfile;
-    std::string merklefile;
-#ifdef TORRENT_WINDOWS
-    // don't ever write binary data to the console on windows
-    // it will just be interpreted as text and corrupted
-    outfile = "a.torrent";
-#endif
-
-    for (int i = 2; i < argc; ++i)
-    {
-      if (argv[i][0] != '-')
-      {
-        print_usage();
-        return 1;
-      }
-
-      switch (argv[i][1])
-      {
-        case 'w':
-          ++i;
-          web_seeds.push_back(argv[i]);
-          break;
-        case 't':
-          ++i;
-          trackers.push_back(argv[i]);
-          break;
-        case 'M':
-          flags |= create_torrent::mutable_torrent_support;
-          pad_file_limit = 0x4000;
-          break;
-        case 'p':
-          ++i;
-          pad_file_limit = atoi(argv[i]);
-          flags |= create_torrent::optimize;
-          break;
-        case 's':
-          ++i;
-          piece_size = atoi(argv[i]);
-          break;
-        case 'm':
-          ++i;
-          merklefile = argv[i];
-          flags |= create_torrent::merkle;
-          break;
-        case 'o':
-          ++i;
-          outfile = argv[i];
-          break;
-        case 'l':
-          flags |= create_torrent::symlinks;
-          break;
-        case 'C':
-          ++i;
-          creator_str = argv[i];
-          break;
-        case 'c':
-          ++i;
-          comment_str = argv[i];
-          break;
-        case 'r':
-          ++i;
-          root_cert = argv[i];
-          break;
-        case 'S':
-          {
-          ++i;
-          if (strlen(argv[i]) != 40)
-          {
-            fprintf(stderr, "invalid info-hash for -S. "
-              "Expected 40 hex characters\n");
-            print_usage();
-            return 1;
-          }
-          sha1_hash ih;
-          if (!from_hex(argv[i], 40, (char*)&ih[0]))
-          {
-            fprintf(stderr, "invalid info-hash for -S\n");
-            print_usage();
-            return 1;
-          }
-          similar.push_back(ih);
-          }
-          break;
-        case 'L':
-          ++i;
-          collections.push_back(argv[i]);
-          break;
-        default:
-          print_usage();
-          return 1;
-      }
-    }
-
-    file_storage fs;
-    std::string full_path = argv[1];
-#ifdef TORRENT_WINDOWS
-    if (full_path[1] != ':')
-#else
-    if (full_path[0] != '/')
-#endif
-    {
-      char cwd[TORRENT_MAX_PATH];
-#ifdef TORRENT_WINDOWS
-      _getcwd(cwd, sizeof(cwd));
-      full_path = cwd + ("\\" + full_path);
-#else
-      getcwd(cwd, sizeof(cwd));
-      full_path = cwd + ("/" + full_path);
-#endif
-    }
-
-    add_files(fs, full_path, file_filter, flags);
-    if (fs.num_files() == 0)
-    {
-      fputs("no files specified.\n", stderr);
-      return 1;
-    }
-
-    create_torrent t(fs, piece_size, pad_file_limit, flags);
-    int tier = 0;
-    for (std::vector<std::string>::iterator i = trackers.begin()
-      , end(trackers.end()); i != end; ++i, ++tier)
-      t.add_tracker(*i, tier);
-
-    for (std::vector<std::string>::iterator i = web_seeds.begin()
-      , end(web_seeds.end()); i != end; ++i)
-      t.add_url_seed(*i);
-
-    for (std::vector<std::string>::iterator i = collections.begin()
-      , end(collections.end()); i != end; ++i)
-      t.add_collection(*i);
-
-    for (std::vector<sha1_hash>::iterator i = similar.begin()
-      , end(similar.end()); i != end; ++i)
-      t.add_similar_torrent(*i);
-
-    error_code ec;
-    set_piece_hashes(t, branch_path(full_path)
-      , boost::bind(&print_progress, _1, t.num_pieces()), ec);
-    if (ec)
-    {
-      fprintf(stderr, "%s\n", ec.message().c_str());
-      return 1;
-    }
-
-    fprintf(stderr, "\n");
-    t.set_creator(creator_str.c_str());
-    if (!comment_str.empty())
-      t.set_comment(comment_str.c_str());
-
-    if (!root_cert.empty())
-    {
-      std::vector<char> pem;
-      load_file(root_cert, pem, ec, 10000);
-      if (ec)
-      {
-        fprintf(stderr, "failed to load root certificate for tracker: %s\n", ec.message().c_str());
-      }
-      else
-      {
-        t.set_root_cert(std::string(&pem[0], pem.size()));
-      }
-    }
-
-    // create the torrent and print it to stdout
-    std::vector<char> torrent;
-    bencode(back_inserter(torrent), t.generate());
-    FILE* output = stdout;
-    if (!outfile.empty())
-      output = fopen(outfile.c_str(), "wb+");
-    if (output == NULL)
-    {
-      fprintf(stderr, "failed to open file \"%s\": (%d) %s\n"
-        , outfile.c_str(), errno, strerror(errno));
-      return 1;
-    }
-    fwrite(&torrent[0], 1, torrent.size(), output);
-
-    if (output != stdout)
-      fclose(output);
-
-    if (!merklefile.empty())
-    {
-      output = fopen(merklefile.c_str(), "wb+");
-      if (output == NULL)
-      {
-        fprintf(stderr, "failed to open file \"%s\": (%d) %s\n"
-          , merklefile.c_str(), errno, strerror(errno));
-        return 1;
-      }
-      int ret = fwrite(&t.merkle_tree()[0], 20, t.merkle_tree().size(), output);
-      if (ret != int(t.merkle_tree().size()))
-      {
-        fprintf(stderr, "failed to write %s: (%d) %s\n"
-          , merklefile.c_str(), errno, strerror(errno));
-      }
-      fclose(output);
-    }
-
-#ifndef BOOST_NO_EXCEPTIONS
-  }
-  catch (std::exception& e)
-  {
-    fprintf(stderr, "%s\n", e.what());
-  }
-#endif
-
-  return 0;
-}
-
-
-
-

dump_torrent

-

This is an example of a program that will take a torrent-file as a parameter and -print information about it to std out:

-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/torrent_info.hpp"
-#include "libtorrent/announce_entry.hpp"
-#include "libtorrent/bdecode.hpp"
-#include "libtorrent/magnet_uri.hpp"
-
-int load_file(std::string const& filename, std::vector<char>& v
-  , libtorrent::error_code& ec, int limit = 8000000)
-{
-  ec.clear();
-  FILE* f = fopen(filename.c_str(), "rb");
-  if (f == NULL)
-  {
-    ec.assign(errno, boost::system::system_category());
-    return -1;
-  }
-
-  int r = fseek(f, 0, SEEK_END);
-  if (r != 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-  long s = ftell(f);
-  if (s < 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  if (s > limit)
-  {
-    fclose(f);
-    return -2;
-  }
-
-  r = fseek(f, 0, SEEK_SET);
-  if (r != 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  v.resize(s);
-  if (s == 0)
-  {
-    fclose(f);
-    return 0;
-  }
-
-  r = fread(&v[0], 1, v.size(), f);
-  if (r < 0)
-  {
-    ec.assign(errno, boost::system::system_category());
-    fclose(f);
-    return -1;
-  }
-
-  fclose(f);
-
-  if (r != s) return -3;
-
-  return 0;
-}
-
-int main(int argc, char* argv[])
-{
-  using namespace libtorrent;
-
-  if (argc < 2 || argc > 4)
-  {
-    fputs("usage: dump_torrent torrent-file [total-items-limit] [recursion-limit]\n", stderr);
-    return 1;
-  }
-
-  int item_limit = 1000000;
-  int depth_limit = 1000;
-
-  if (argc > 2) item_limit = atoi(argv[2]);
-  if (argc > 3) depth_limit = atoi(argv[3]);
-
-  std::vector<char> buf;
-  error_code ec;
-  int ret = load_file(argv[1], buf, ec, 40 * 1000000);
-  if (ret == -1)
-  {
-    fprintf(stderr, "file too big, aborting\n");
-    return 1;
-  }
-
-  if (ret != 0)
-  {
-    fprintf(stderr, "failed to load file: %s\n", ec.message().c_str());
-    return 1;
-  }
-  bdecode_node e;
-  int pos = -1;
-  printf("decoding. recursion limit: %d total item count limit: %d\n"
-    , depth_limit, item_limit);
-  ret = bdecode(&buf[0], &buf[0] + buf.size(), e, ec, &pos
-    , depth_limit, item_limit);
-
-  printf("\n\n----- raw info -----\n\n%s\n", print_entry(e).c_str());
-
-  if (ret != 0)
-  {
-    fprintf(stderr, "failed to decode: '%s' at character: %d\n", ec.message().c_str(), pos);
-    return 1;
-  }
-
-  torrent_info t(e, ec);
-  if (ec)
-  {
-    fprintf(stderr, "%s\n", ec.message().c_str());
-    return 1;
-  }
-  e.clear();
-  std::vector<char>().swap(buf);
-
-  // print info about torrent
-  printf("\n\n----- torrent file info -----\n\n"
-    "nodes:\n");
-
-  typedef std::vector<std::pair<std::string, int> > node_vec;
-  node_vec const& nodes = t.nodes();
-  for (node_vec::const_iterator i = nodes.begin(), end(nodes.end());
-    i != end; ++i)
-  {
-    printf("%s: %d\n", i->first.c_str(), i->second);
-  }
-  puts("trackers:\n");
-  for (std::vector<announce_entry>::const_iterator i = t.trackers().begin();
-    i != t.trackers().end(); ++i)
-  {
-    printf("%2d: %s\n", i->tier, i->url.c_str());
-  }
-
-  char ih[41];
-  to_hex((char const*)&t.info_hash()[0], 20, ih);
-  printf("number of pieces: %d\n"
-    "piece length: %d\n"
-    "info hash: %s\n"
-    "comment: %s\n"
-    "created by: %s\n"
-    "magnet link: %s\n"
-    "name: %s\n"
-    "number of files: %d\n"
-    "files:\n"
-    , t.num_pieces()
-    , t.piece_length()
-    , ih
-    , t.comment().c_str()
-    , t.creator().c_str()
-    , make_magnet_uri(t).c_str()
-    , t.name().c_str()
-    , t.num_files());
-  file_storage const& st = t.files();
-  for (int i = 0; i < st.num_files(); ++i)
-  {
-    int first = st.map_file(i, 0, 0).piece;
-    int last = st.map_file(i, (std::max)(boost::int64_t(st.file_size(i))-1, boost::int64_t(0)), 0).piece;
-    int flags = st.file_flags(i);
-    printf(" %8" PRIx64 " %11" PRId64 " %c%c%c%c [ %5d, %5d ] %7u %s %s %s%s\n"
-      , st.file_offset(i)
-      , st.file_size(i)
-      , ((flags & file_storage::flag_pad_file)?'p':'-')
-      , ((flags & file_storage::flag_executable)?'x':'-')
-      , ((flags & file_storage::flag_hidden)?'h':'-')
-      , ((flags & file_storage::flag_symlink)?'l':'-')
-      , first, last
-      , boost::uint32_t(st.mtime(i))
-      , st.hash(i) != sha1_hash(0) ? to_hex(st.hash(i).to_string()).c_str() : ""
-      , st.file_path(i).c_str()
-      , (flags & file_storage::flag_symlink) ? "-> " : ""
-      , (flags & file_storage::flag_symlink) ? st.symlink(i).c_str() : "");
-  }
-
-  return 0;
-}
-
-
-
- -
-
-
- -
- -
- - diff --git a/docs/extension_protocol.html b/docs/extension_protocol.html deleted file mode 100644 index ce554488a..000000000 --- a/docs/extension_protocol.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - - - - - - - - - - -
-
- - - - -
- - --- - - - -
Author:Arvid Norberg, arvid@libtorrent.org -Ludvig Strigeus, ludde@utorrent.com
-
-

extension protocol for bittorrent

-

The intention of this protocol is to provide a simple and thin transport -for extensions to the bittorrent protocol. Supporting this protocol makes -it easy to add new extensions without interfering with the standard -bittorrent protocol or clients that don't support this extension or the -one you want to add.

-

To advertise to other clients that you support, one bit from the reserved -bytes is used.

-

The bit selected for the extension protocol is bit 20 from the right (counting -starts at 0). So (reserved_byte[5] & 0x10) is the expression to use for checking -if the client supports extended messaging.

-

Once support for the protocol is established, the client is supposed to -support 1 new message:

- ---- - - - - - - - - - - -
nameid
extended20
-

This message is sent as any other bittorrent message, with a 4 byte length -prefix and a single byte identifying the message (the single byte being 20 -in this case). At the start of the payload of the message, is a single byte -message identifier. This identifier can refer to different extension messages -and only one ID is specified, 0. If the ID is 0, the message is a handshake -message which is described below. The layout of a general extended message -follows (including the message headers used by the bittorrent protocol):

- ---- - - - - - - - - - - - - - - - - -
sizedescription
uint32_tlength prefix. Specifies the number of bytes for the -entire message. (Big endian)
uint8_tbittorrent message ID, = 20
uint8_textended message ID. 0 = handshake, >0 = extended -message as specified by the handshake.
-
-

handshake message

-

The payload of the handshake message is a bencoded dictionary. All items -in the dictionary are optional. Any unknown names should be ignored -by the client. All parts of the dictionary are case sensitive. -This is the defined item in the dictionary:

- ---- - - - - - - - - - - -
namedescription
m

Dictionary of supported extension messages which maps -names of extensions to an extended message ID for each -extension message. The only requirement on these IDs -is that no extension message share the same one. Setting -an extension number to zero means that the extension is -not supported/disabled. The client should ignore any -extension names it doesn't recognize.

-

The extension message IDs are the IDs used to send the -extension messages to the peer sending this handshake. -i.e. The IDs are local to this particular peer.

-
-

Here are some other items that an implementation may choose to support:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - -
namedescription
pLocal TCP listen port. Allows each side to learn about -the TCP port number of the other side. Note that there is -no need for the receiving side of the connection to send -this extension message, since its port number is already -known.
vClient name and version (as a utf-8 string). -This is a much more reliable way of identifying the -client than relying on the peer id encoding.
youripA string containing the compact representation of the ip -address this peer sees you as. i.e. this is the -receiver's external ip address (no port is included). -This may be either an IPv4 (4 bytes) or an IPv6 -(16 bytes) address.
ipv6If this peer has an IPv6 interface, this is the compact -representation of that address (16 bytes). The client may -prefer to connect back via the IPv6 address.
ipv4If this peer has an IPv4 interface, this is the compact -representation of that address (4 bytes). The client may -prefer to connect back via this interface.
reqqAn integer, the number of outstanding request messages -this client supports without dropping any. The default in -in libtorrent is 250.
-

The handshake dictionary could also include extended handshake -information, such as support for encrypted headers or anything -imaginable.

-

An example of what the payload of a handshake message could look like:

- ---- - - - - - - - - - - - - - - - -
Dictionary
m ---- - - - - - - - - - - - - -
Dictionary
LT_metadata1
ut_pex2
-
p6881
v"uTorrent 1.2"
-

and in the encoded form:

-

d1:md11:LT_metadatai1e6:ut_pexi2ee1:pi6881e1:v12:uTorrent 1.2e

-

To make sure the extension names do not collide by mistake, they should be -prefixed with the two (or one) character code that is used to identify the -client that introduced the extension. This applies for both the names of -extension messages, and for any additional information put inside the -top-level dictionary. All one and two byte identifiers are invalid to use -unless defined by this specification.

-

This message should be sent immediately after the standard bittorrent handshake -to any peer that supports this extension protocol. It is valid to send the -handshake message more than once during the lifetime of a connection, -the sending client should not be disconnected. An implementation may choose -to ignore the subsequent handshake messages (or parts of them).

-

Subsequent handshake messages can be used to enable/disable extensions -without restarting the connection. If a peer supports changing extensions -at run time, it should note that the m dictionary is additive. -It's enough that it contains the actual CHANGES to the extension list. -To disable the support for LT_metadata at run-time, without affecting -any other extensions, this message should be sent: -d11:LT_metadatai0ee. -As specified above, the value 0 is used to turn off an extension.

-

The extension IDs must be stored for every peer, becuase every peer may have -different IDs for the same extension.

-

This specification, deliberately, does not specify any extensions such as -peer-exchange or metadata exchange. This protocol is merely a transport -for the actual extensions to the bittorrent protocol and the extensions -named in the example above (such as p) are just examples of possible -extensions.

-
-
-

rationale

-

The reason why the extension messages' IDs would be defined in the handshake -is to avoid having a global registry of message IDs. Instead the names of the -extension messages requires unique names, which is much easier to do without -a global registry. The convention is to use a two letter prefix on the -extension message names, the prefix would identify the client first -implementing the extension message. e.g. LT_metadata is implemented by -libtorrent, and hence it has the LT prefix.

-

If the client supporting the extensions can decide which numbers the messages -it receives will have, it means they are constants within that client. i.e. -they can be used in switch statements. It's easy for the other end to -store an array with the ID's we expect for each message and use that for -lookups each time it sends an extension message.

-

The reason for having a dictionary instead of having an array (using -implicitly assigned index numbers to the extensions) is that if a client -want to disable some extensions, the ID numbers would change, and it wouldn't -be able to use constants (and hence, not use them in a switch). If the -messages IDs would map directly to bittorrent message IDs, It would also make -it possible to map extensions in the handshake to existing extensions with -fixed message IDs.

-

The reasoning behind having a single byte as extended message identifier is -to follow the the bittorrent spec. with its single byte message identifiers. -It is also considered to be enough. It won't limit the total number of -extensions, only the number of extensions used simultaneously.

-

The reason for using single byte identifiers for the standardized handshake -identifiers is 1) The mainline DHT uses single byte identifiers. 2) Saves -bandwidth. The only advantage of longer messages is that it makes the -protocol more readable for a human, but the BT protocol wasn't designed to -be a human readable protocol, so why bother.

-
-
-
-

extensions

-

These extensions all operates within the extension protocol. The name of the -extension is the name used in the extension-list packets, and the payload is -the data in the extended message (not counting the length-prefix, message-id -nor extension-id).

-

Note that since this protocol relies on one of the reserved bits in the -handshake, it may be incompatible with future versions of the mainline -bittorrent client.

-

These are the extensions that are currently implemented.

-
-

metadata from peers

-

Extension name: "LT_metadata"

-
-

Note

-

This extension is deprecated in favor of the more widely supported -ut_metadata extension, see BEP 9.

-
-

The point with this extension is that you don't have to distribute the -metadata (.torrent-file) separately. The metadata can be distributed -through the bittorrent swarm. The only thing you need to download such -a torrent is the tracker url and the info-hash of the torrent.

-

It works by assuming that the initial seeder has the metadata and that the -metadata will propagate through the network as more peers join.

-

There are three kinds of messages in the metadata extension. These packets are -put as payload to the extension message. The three packets are:

-
-
    -
  • request metadata
  • -
  • metadata
  • -
  • don't have metadata
  • -
-
-

request metadata:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
uint8_tmsg_typeDetermines the kind of message this is -0 means 'request metadata'
uint8_tstartThe start of the metadata block that -is requested. It is given in 256:ths -of the total size of the metadata, -since the requesting client don't know -the size of the metadata.
uint8_tsizeThe size of the metadata block that is -requested. This is also given in -256:ths of the total size of the -metadata. The size is given as size-1. -That means that if this field is set -0, the request wants one 256:th of the -metadata.
-

metadata:

- ----- - - - - - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
uint8_tmsg_type1 means 'metadata'
int32_ttotal_sizeThe total size of the metadata, given -in number of bytes.
int32_toffsetThe offset of where the metadata block -in this message belongs in the final -metadata. This is given in bytes.
uint8_t[]metadataThe actual metadata block. The size of -this part is given implicit by the -length prefix in the bittorrent -protocol packet.
-

Don't have metadata:

- ----- - - - - - - - - - - - - -
sizenamedescription
uint8_tmsg_type2 means 'I don't have metadata'. -This message is sent as a reply to a -metadata request if the the client -doesn't have any metadata.
-
-
-

dont_have

-

Extension name: "lt_donthave"

-

The dont_have extension message is used to tell peers that the client no -longer has a specific piece. The extension message should be advertised in the -m dictionary as lt_donthave. The message format mimics the regular -HAVE bittorrent message.

-

Just like all extension messages, the first 2 bytes in the mssage itself are 20 -(the bittorrent extension message) and the message ID assigned to this -extension in the m dictionary in the handshake.

- ----- - - - - - - - - - - - - -
sizenamedescription
uint32_tpieceindex of the piece the peer no longer -has.
-

The length of this message (including the extension message prefix) is 6 bytes, -i.e. one byte longer than the normal HAVE message, because of the extension -message wrapping.

-
-
- -
-
-
- -
- -
- - diff --git a/docs/features.html b/docs/features.html deleted file mode 100644 index efe362179..000000000 --- a/docs/features.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - -
-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -
-

introduction

-

libtorrent is a feature complete C++ bittorrent implementation focusing -on efficiency and scalability. It runs on embedded devices as well as -desktops. It boasts a well documented library interface that is easy to -use. It comes with a simple bittorrent client demonstrating the use of -the library.

-
-
-

features

-

libtorrent is an ongoing project under active development. Its -current state supports and includes the following features:

-
-

extensions

-
    -
  • plugin interface for implementing custom bittorrent extensions -without having to modify libtorrent
  • -
  • supports trackerless torrents (using the Mainline kademlia DHT protocol) with -some DHT extensions. BEP 5.
  • -
  • supports the bittorrent extension protocol. See extensions. BEP 10.
  • -
  • supports the uTorrent metadata transfer protocol BEP 9 (i.e. magnet links).
  • -
  • supports the uTorrent peer exchange protocol (PEX).
  • -
  • supports local peer discovery (multicasts for peers on the same local network)
  • -
  • multitracker extension support (supports both strict BEP 12 and the -uTorrent interpretation).
  • -
  • tracker scrapes
  • -
  • supports lt_trackers extension, to exchange trackers between peers
  • -
  • HTTP seeding, as specified in BEP 17 and BEP 19.
  • -
  • supports the udp-tracker protocol. (BEP 15).
  • -
  • supports the no_peer_id=1 extension that will ease the load off trackers.
  • -
  • supports the compact=1 tracker parameter.
  • -
  • super seeding/initial seeding (BEP 16).
  • -
  • private torrents (BEP 27).
  • -
  • upload-only extension (BEP 21).
  • -
  • support for IPv6, including BEP 7 and BEP 24.
  • -
  • support for merkle hash tree torrents. This makes the size of torrent files -scale well with the size of the content.
  • -
  • share-mode. This is a special mode torrents can be put in to optimize share -ratio rather than downloading the torrent.
  • -
-
-
-

disk management

-
    -
  • can use multipled disk I/O threads to not have the disk block network or -client interaction.
  • -
  • supports verifying the SHA-1 hash of pieces in multiple threads, to take -advantage of multi core machines.
  • -
  • supports files > 2 gigabytes.
  • -
  • fast resume support, a way to avoid the costly piece check at the -start of a resumed torrent. Saves the storage state, piece_picker state -as well as all local peers in a fast-resume file.
  • -
  • has an adjustable read and write disk cache for improved disk throughput.
  • -
  • queues torrents for file check, instead of checking all of them in parallel.
  • -
  • does not have any requirements on the piece order in a torrent that it -resumes. This means it can resume a torrent downloaded by any client.
  • -
  • seed mode, where the files on disk are assumed to be complete, and each -piece's hash is verified the first time it is requested.
  • -
  • implements an ARC disk cache, tuned for performing well under bittorrent work -loads
  • -
-
-
-

network

-
    -
  • a high quality uTP implementation (BEP 29). A transport protocol with -delay based congestion control. See separate article.
  • -
  • adjusts the length of the request queue depending on download rate.
  • -
  • serves multiple torrents on a single port and in a single thread
  • -
  • piece picking on block-level (as opposed to piece-level). -This means it can download parts of the same piece from different peers. -It will also prefer to download whole pieces from single peers if the -download speed is high enough from that particular peer.
  • -
  • supports http proxies and basic proxy authentication
  • -
  • supports gzipped tracker-responses
  • -
  • can limit the upload and download bandwidth usage and the maximum number of -unchoked peers
  • -
  • possibility to limit the number of connections.
  • -
  • delays have messages if there's no other outgoing traffic to the peer, and -doesn't send have messages to peers that already has the piece. This saves -bandwidth.
  • -
  • selective downloading. The ability to select which parts of a torrent you -want to download.
  • -
  • ip filter to disallow ip addresses and ip ranges from connecting and -being connected.
  • -
  • NAT-PMP and UPnP support (automatic port mapping on routers that supports it)
  • -
  • implements automatic upload slots, to optimize download rate without spreading -upload capacity too thin. The number of upload slots is adjusted based on the -peers' download capacity to work even for connections that are orders of -magnitude faster than others.
  • -
-
-
-
-

highlighted features

-
-

disk caching

-

All disk I/O in libtorrent is done asynchronously to the network thread, by the -disk io thread. When a block is read, the disk io thread reads all subsequent -blocks from that piece into the read cache, assuming that the peer requesting -the block will also request more blocks from the same piece. This decreases the -number of syscalls for reading data. It also decreases delay from seeking.

-

Similarly, for write requests, blocks are cached and flushed to disk once one full -piece is complete or the piece is the least recently updated one when more cache -space is needed. The cache dynamically allocates space between the write and read -cache. The write cache is strictly prioritized over the read cache.

-

The cache blocks that are in used, are locked into physical memory to avoid it -being paged out to disk. Allowing the disk cache to be paged out to disk means -that it would become extremely inefficient to flush it, since it would have to be -read back into physical memory only to be flushed back out to disk again.

-

In order to conserve memory, and system calls, iovec file operations are -used to flush multiple cache blocks in a single call.

-

On low-memory systems, the disk cache can be disabled altogether or set to smaller -limit, to save memory.

-

The disk caching algorithm is configurable between 'LRU' and 'largest contiguous'. -The largest contiguous algorithm is the default and flushes the largest contiguous -block of buffers, instead of flushing all blocks belonging to the piece which was -written to least recently.

-

For version 0.15 a lot of work went into optimizing the cache algorithm, trying -to increase the cache hit rate and utilization. The graph to the left shows the -memory utilization in 0.14. This cache is a straight forward, fairly naive, implementation. -Every block read will also read all subsequent blocks in that piece into the cache. -Whenever we need more space, the entire oldest piece is evicted from the cache. Caching -writes always takes presedence over the read cache. Whenever a piece is fully downloaded, -it is flushed to disk.

-disk_buffer_before_optimization.png -disk_buffer.png -

The left graph shows the problem of evicting entire pieces at a time, and waiting until -an entire piece is downloaded until flushing it. These graphs were generated for a torrent -with fairly large pieces. This means that granularity was poor in 0.14, since it only -dealt with entire pieces. In 0.15, the granularity problem has been fixed by evicting one -block at a time from the read cache. This maximizes the read cache utilization. The write -cache is also flushed when a sufficient number of contiguous blocks have been downloaded -for a piece, which is not tied to the piece size anymore. This way the cache scales a lot -better with piece sizes.

-

The graph to the right shows the same download but with the new optimized disk cache -algorithm. It clearly shows an increased utilization, which means higher read hit rates -or smaller caches with maintained hit rate.

-
-
-

high performance disk subsystem

-

In some circumstances, the disk cache may not suffice to provide maximum performance. -One such example is high performance seeding, to a large number of peers, over a fast -up-link. In such a case, the amount of RAM may simply not be enough to cache disk -reads. When there's not enough RAM to cache disk reads, the disk throughput would -typically degrade to perform as poorly as with no cache at all, with the majority -of the time spent waiting for the disk head to seek.

-

To solve this problem, libtorrent sorts read requests by their physical offset on the -disk. They are processed by having the disk read head sweep back and forth over the drive.

-

This makes libtorrent very suitable for large scale, high-throughput seeding.

-disk_access_no_elevator.png -disk_access_elevator.png -

These plots illustrates the physical disk offset for reads over time. The left plot -is of a run where disk operation re-ordering is turned off and the righ is when it's -turned on. The right one has a relatively smooth sine wave shape whereas the left -one is more random and involves much longer seeks back and forth over the disk.

-

True physical disk offset queries are only supported on newer linux kernels, Mac OS X and -Windows 2000 and up.

-
-
-

network buffers

-

On CPUs with small L2 caches, copying memory can be expensive operations. It is important -to keep copying to a minimum on such machines. This mostly applies to embedded systems.

-

In order to minimize the number of times received data is copied, the receive buffer -for payload data is received directly into a page aligned disk buffer. If the connection -is encrypted, the buffer is decrypted in-place. The buffer is then moved into the disk -cache without being copied. Once all the blocks for a piece have been received, or the -cache needs to be flushed, all the blocks are passed directly to writev() to flush -them in a single syscall. This means a single copy into user space memory, and a single -copy back into kernel memory, as illustrated by this figure:

-write_disk_buffers.png -

When seeding and uploading in general, unnecessary copying is avoided by caching blocks -in aligned buffers, that are copied once into the peer's send buffer. The peer's send buffer -is not guaranteed to be aligned, even though it is most of the time. The send buffer is -then encrypted with the peer specific key and chained onto the iovec for sending. -This means there is one user space copy in order to allow unaligned peer requests and -peer-specific encryption. This is illustrated by the following figure:

-read_disk_buffers.png -
-
-

piece picker

-

The piece picker is a central component in a bittorrent implementation. The piece picker -in libtorrent is optimized for quickly finding the rarest pieces. It keeps a list of all -available pieces sorted by rarity, and pieces with the same rarity, shuffled. The rarest -first mode is the dominant piece picker mode. Other modes are supported as well, and -used by peers in specific situations.

-

The piece picker allows to combine the availability of a piece with a priority. Together -they determine the sort order of the piece list. Pieces with priority 0 will never be -picked, which is used for the selective download feature.

-

In order to have as few partially finished pieces as possible, peers have an affinity -towards picking blocks from the same pieces as other peers in the same speed category. -The speed category is a coarse categorization of peers based on their download rate. This -makes slow peers pick blocks from the same piece, and fast peers pick from the same piece, -and hence decreasing the likelihood of slow peers blocking the completion of pieces.

-

The piece picker can also be set to download pieces in sequential order.

-
-
-

share mode

-

The share mode feature in libtorrent is intended for users who are only interested in -helping out swarms, not downloading the torrents.

-

It works by predicting the demand for pieces, and only download pieces if there is enough -demand. New pieces will only be downloaded once the share ratio has hit a certain target.

-

This feature is especially useful when combined with RSS, so that a client can be set up -to provide additional bandwidth to an entire feed.

-
-
-

merkle hash tree torrents

-merkle_tree.png -

Merkle hash tree torrents is an extension that lets a torrent file only contain the -root hash of the hash tree forming the piece hashes. The main benefit of this feature -is that regardless of how many pieces there is in a torrent, the .torrent file will -always be the same size. It will only grow with the number of files (since it still -has to contain the file names).

-

With regular torrents, clients have to request multiple blocks for pieces, typically -from different peers, before the data can be verified against the piece hash. The -larger the pieces are, the longer it will take to download a complete piece and verify -it. Before the piece is verified, it cannot be shared with the swarm, which means the -larger piece sizes, the slower turnaround data has when it is downloaded by peers. -Since on average the data has to sit around, waiting, in client buffers before it has -been verified and can be uploaded again.

-

Another problem with large piece sizes is that it is harder for a client to pinpoint -the malicious or buggy peer when a piece fails, and it will take longer to re-download -it and take more tries before the piece succeeds the larger the pieces are.

-

The piece size in regular torrents is a tradeoff between the size of the .torrent file -itself and the piece size. Often, for files that are 4 GB, the piece size is 2 or 4 MB, -just to avoid making the .torrent file too big.

-

Merkle torrents solves these problems by removing the tradeoff between .torrent size and -piece size. With merkle torrents, the piece size can be the minimum block size (16 kB), -which lets peers verify every block of data received from peers, immediately. This -gives a minimum turnaround time and completely removes the problem of identifying malicious -peers.

-

The root hash is built by hashing all the piece hashes pair-wise, until they all collapse -down to the root.

-
-
-

customizable file storage

-storage.png -

libtorrent's storage implementation is customizable. That means a special purpose bittorrent -client can replace the default way to store files on disk.

-

When implementing a bittorrent cache, it doesn't matter how the data is stored on disk, as -long as it can be retrieved and seeded. In that case a new storage class can be implemented -(inheriting from the storage_interface class) that avoids the unnecessary step of mapping -slots to files and offsets. The storage can ignore the file boundaries and just store the -entire torrent in a single file (which will end up being all the files concatenated). The main -advantage of this, other than a slight cpu performance gain, is that all file operations would -be page (and sector) aligned. This enables efficient unbuffered I/O, and can potentially -lead to more efficient read caching (using the built in disk cache rather than relying on the -operating system's disk cache).

-

The storage interface supports operating systems where you can ask for sparse regions -(such as Windows and Solaris). The advantage of this is that when checking files, the regions -that are known to be sparse can be skipped, which can reduce the time to check a torrent -significantly.

-
-
-

easy to use API

-

One of the design goals of the libtorrent API is to make common operations simple, but still -have it possible to do complicated and advanced operations. This is best illustrated by example -code to implement a simple bittorrent client:

-
-#include <iostream>
-#include "libtorrent/session.hpp"
-
-// usage a.out [torrent-file]
-int main(int argc, char* argv[]) try
-{
-        using namespace libtorrent;
-
-        session s;
-        s.listen_on(std::make_pair(6881, 6889));
-        add_torrent_params p;
-        p.save_path = "./";
-        p.ti = new torrent_info(argv[1]);
-        s.add_torrent(p);
-
-        // wait for the user to end
-        char a;
-        std::cin.unsetf(std::ios_base::skipws);
-        std::cin >> a;
-        return 0;
-}
-catch (std::exception& e)
-{
-        std::cerr << ec.what() << std::endl;
-        return 1;
-}
-
-

This client doesn't give the user any status information or progress about the torrent, but -it is fully functional.

-

libtorrent also comes with python bindings for easy access for python developers.

-
-
-
-

portability

-

libtorrent runs on most major operating systems, including Windows, -MacOS X, Linux, BSD and Solaris. -It uses Boost.Thread, Boost.Filesystem, Boost.Date_time and various other -boost libraries. At least version 1.46.1 of boost is required.

-

libtorrent uses asio, hence it will take full advantage of high performance -network APIs on the most popular platforms. I/O completion ports on windows, -epoll on linux and kqueue on MacOS X and BSD.

-

libtorrent does not build with the following compilers:

-
    -
  • GCC 2.95.4
  • -
  • Visual Studio 6, 7.0, 7.1
  • -
-
- -
-
-
- -
- -
- - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 205b158bb..000000000 --- a/docs/index.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - -
-
- - - - -
- - --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -
-

libtorrent

-

libtorrent is a feature complete C++ bittorrent implementation focusing -on efficiency and scalability. It runs on embedded devices as well as -desktops. It boasts a well documented library interface that is easy to -use. It comes with a simple bittorrent client demonstrating the use of -the library.

-

The main goals of libtorrent are:

-
    -
  • to be cpu efficient
  • -
  • to be memory efficient
  • -
  • to be very easy to use
  • -
- -
-

Feedback

-

There's a mailing list, general libtorrent discussion.

-

You can usually find me as hydri in #libtorrent on irc.freenode.net.

-
-
-

license

-

libtorrent is released under the BSD-license.

-

This means that you can use the library in your project without having to -release its source code. The only requirement is that you give credit -to the author of the library by including the libtorrent license in your -software or documentation.

-

It is however greatly appreciated if additional features are contributed -back to the open source project. Patches can be emailed to the mailing -list or posted to the bug tracker.

-
-
-

Acknowledgements

-

Written by Arvid Norberg. Copyright © 2003-2016

-

Contributions by Steven Siloti, Magnus Jonsson, Daniel Wallin and Cory Nelson

-

Thanks to Reimond Retz for bugfixes, suggestions and testing

-

Thanks to Umeå University for providing development and test hardware.

-

Project is hosted by github.

-
-
- -
-
-
- -
- -
- - diff --git a/docs/projects.html b/docs/projects.html deleted file mode 100644 index 922db4b07..000000000 --- a/docs/projects.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - -projects using libtorrent - - - - - - - -
-
- - - - -
-

projects using libtorrent

- -

These are some of the public projects that uses libtorrent. If you want your -project listed here, let me know.

-
-

Wyzo

-

wyzo is a media browser with built-in bittorrent support.

-
-
-

deluge

-

deluge Torrent is a more full-featured yet still lightweight bittorrent -client. It has the ability to automatically resume partial downloads and -background to the system tray.

-
-
-

qBittorrent

-

qBittorrent is a QT bittorrent client available for linux (likely portable to -most other desktops as well). Written by Christophe Dumez.

-
-
-

tonidoplug

-

Tonidoplug is a tiny, low-power, low-cost home server and -NAS device powered by Tonido software that allows you to access -your apps, files, music and media from anywhere.

-
-
-

Folx

-

Folx is a torrent client and download manager for Mac OS X. -The Free version of Folx has all the basic functionality of the torrent -client, which allows users to download and create torrent files. -Folx PRO (available for a small fee) features the possibility to search -for torrent files just from Folx interface. So there is no need to -browse through multiple torrent trackers searching for particular file.

-
-
-

Miro

-

Miro is a free application for channels of internet video (also known as -video podcasts and video rss). Miro is designed to be easy to use and to give -you an elegant fullscreen viewing experience.

-
-
-

MooPolice

-

MooPolice is a windows bittorrent client with a unique look.

-
-
-

LeechCraft

-

LeechCraft LeechCraft is a free open source cross-platform extensible -software, which primary goal is support of file sharing networks and protocols -like HTTP and FTP

-
-
-

Free download manager

-

FDM is a powerful, easy-to-use and absolutely free download accelerator and -manager. Moreover, FDM is 100% safe, open-source software distributed under -GPL License.

-
-
-

btg

-

btg is a unix bittorrent client which is run as a daemon. It has multiple user -interfaces which connects to the daemon. One GUI (Gtkmm), one terminal -interface (ncurses) and one web interface (accessable through a web browser). -Written by Michael Wojciechowski and Johan Strom.

-
-
-

electric sheep

-

electric sheep is a screensaver which collectively generates animations and -lets the users vote which one to live on.

-
-
-

Tvitty

-

tvitty is a bittorrent client for Vista Media Center, which allows -searching and downloading of torrents directly on your TV.

-
-
-

hrktorrent

-

hrktorrent hrktorrent is a light console torrent client written in C++.

-
-
-

FatRat

-

FatRat is an open source download manager for Linux/Unix systems written in -C++ with the help of the Trolltech Qt 4 library. It's simple to use and -install.

-
-
-

halite BitTorrent

-

Halite is a windows bittorrent client controllabel via an xml-rpc -interface.

-
-
-

Arctic Torrent

-

Arctic Torrent is a light-weight -bittorrent client for windows. -Written by Cory Nelson.

-
-
-

bubba

-

Bubba is a mini-sized server, designed to fit your home better than -an always running PC. Boasting Torrent downloader, DAAP streaming, -Web, E-mail, printer and FTP server etc.

-
-
-

tvblob

-

The BLOBbox represents the ability to harness all of the content available -on the web, without any filtering or pre-selection by a third party just -like surfing the web.

-

This means that anyone will have the ability to reach viewers via the Internet -directly on TV, without them having to connect a PC.

-
-
-

Flush

-

Flush is a GTK-based BitTorrent client.

-
-
-

Lince

-

Lince is a bittorrent client using libtorrent to handle bittorrent protocol -and gtkmm for the interface, it has been designed to be a light and full -featured client.

-
-
-

Linkage

-

Linkage is a gtkmm client that aims to be middle weight.

-
-
-

Bitfox

-

Bitfox is a firefox plugin integrating bittorrent downloads in firefox.

-
-
-

BitSlug

-

BitSlug is a MacOSX cocoa client.

-
-
-

DelCo

-

DelCo is a research project at Tampere university of technology, finland.

-
-
-

Torrent2Exe

-

Torrent2Exe Torrent2exe is a small BitTorrent client. Its basic idea is to -let users download a custom-built EXE program with the torrent file -integrated into it.

-
-
-

ZyXEL NSA-220

-

ZyXEL NSA220 makes it easy to store, protect and share files between users -on your home network. The built-in DLNA server works with many set top boxes -to allow you to play back music, watch video files, or view photos on your -home theater system, while the built in download manager can automatically -download video and audio podcasts as well as allow you to download bittorrent -files without needing to leave your computer on.

-
- -
-
-
- -
- -
- - diff --git a/docs/python_binding.html b/docs/python_binding.html deleted file mode 100644 index 633a60bb3..000000000 --- a/docs/python_binding.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - -libtorrent python binding - - - - - - - - -
-
- - - - -
-

libtorrent python binding

- --- - - - -
Author:Arvid Norberg, arvid@libtorrent.org
- -
-

building

-

Building the libtorrent python bindings will produce a shared library (DLL) -which is a python module that can be imported in a python program.

-
-

building using setup.py

-

There is a setup.py shipped with libtorrent that can be used on windows. -On windows the setup.py will invoke bjam and assume that you have boost -sources at $BOOST_PATH. The resulting executable is self-contained, it does -not depend any boost or libtorrent dlls.

-

On other systems, the setup.py is generated by running -./configure --enable-python-binding.

-

To build the Python bindings do:

-
    -
  1. Run:

    -
    -python setup.py build
    -
    -
  2. -
  3. As root, run:

    -
    -python setup.py install
    -
    -
  4. -
-
-
-

building using boost build

-

To set up your build environment, you need to add some settings to your -$BOOST_BUILD_PATH/user-config.jam.

-

Make sure your user config contains the following line:

-
-using python : 2.3 ;
-
-

Set the version to the version of python you have installed or want to use. If -you've installed python in a non-standard location, you have to add the prefix -path used when you installed python as a second option. Like this:

-
-using python : 2.6 : /usr/bin/python2.6 : /usr/include/python2.6 : /usr/lib/python2.6 ;
-
-

The bindings require at least python version 2.2.

-

For more information on how to install and set up boost-build, see the -building libtorrent section.

-

Once you have boost-build set up, you cd to the bindings/python -directory and invoke bjam with the apropriate settings. For the available -build variants, see libtorrent build options.

-

For example:

-
-$ bjam dht-support=on link=static
-
-

On Mac OS X, this will produce the following python module:

-
-bin/darwin-4.0/release/dht-support-on/link-static/logging-none/threading-multi/libtorrent.so
-
-
-
-
-

using libtorrent in python

-

The python interface is nearly identical to the C++ interface. Please refer to -the library reference. The main differences are:

-
-
asio::tcp::endpoint
-
The endpoint type is represented as a tuple of a string (as the address) and an int for -the port number. E.g. ('127.0.0.1', 6881) represents the localhost port 6881.
-
libtorrent::time_duration
-
The time duration is represented as a number of seconds in a regular integer.
-
-

The following functions takes a reference to a container that is filled with -entries by the function. The python equivalent of these functions instead returns -a list of entries.

-
    -
  • torrent_handle::get_peer_info
  • -
  • torrent_handle::file_progress
  • -
  • torrent_handle::get_download_queue
  • -
  • torrent_handle::piece_availability
  • -
-

create_torrent::add_node() takes two arguments, one string and one integer, -instead of a pair. The string is the address and the integer is the port.

-

session::set_settings() not only accepts a session_settings object, but also -a dictionary with keys matching the names of the members of the session_settings struct. -When calling set_settings, the dictionary does not need to have every settings set, -keys that are not present, are set to their default value.

-

For backwards compatibility, session::settings() still returns a session_settings -struct. To get a python dictionary of the settings, call session::get_settings.

-

For an example python program, see client.py in the bindings/python -directory.

-

A very simple example usage of the module would be something like this:

-
-import libtorrent as lt
-import time
-
-ses = lt.session()
-ses.listen_on(6881, 6891)
-
-e = lt.bdecode(open("test.torrent", 'rb').read())
-info = lt.torrent_info(e)
-
-params = { 'save_path': '.', \
-        'storage_mode': lt.storage_mode_t.storage_mode_sparse, \
-        'ti': info }
-h = ses.add_torrent(params)
-
-s = h.status()
-while (not s.is_seeding):
-        s = h.status()
-
-        state_str = ['queued', 'checking', 'downloading metadata', \
-                'downloading', 'finished', 'seeding', 'allocating']
-        print '%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
-                (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
-                s.num_peers, state_str[s.state])
-
-        time.sleep(1)
-
-
- -
-
-
- -
- -
- - diff --git a/docs/settings.rst b/docs/settings.rst deleted file mode 100644 index 8893415ad..000000000 --- a/docs/settings.rst +++ /dev/null @@ -1,3268 +0,0 @@ -.. _user_agent: - -.. raw:: html - - - -+------------+--------+----------------------------------+ -| name | type | default | -+============+========+==================================+ -| user_agent | string | "libtorrent/" LIBTORRENT_VERSION | -+------------+--------+----------------------------------+ - -this is the client identification to the tracker. The recommended -format of this string is: "ClientName/ClientVersion -libtorrent/libtorrentVersion". This name will not only be used when -making HTTP requests, but also when sending extended headers to -peers that support that extension. It may not contain \r or \n - -.. _announce_ip: - -.. raw:: html - - - -+-------------+--------+---------+ -| name | type | default | -+=============+========+=========+ -| announce_ip | string | 0 | -+-------------+--------+---------+ - -``announce_ip`` is the ip address passed along to trackers as the -``&ip=`` parameter. If left as the default, that parameter is -omitted. - -.. _mmap_cache: - -.. raw:: html - - - -+------------+--------+---------+ -| name | type | default | -+============+========+=========+ -| mmap_cache | string | 0 | -+------------+--------+---------+ - -``mmap_cache`` may be set to a filename where the disk cache will -be mmapped to. This could be useful, for instance, to map the disk -cache from regular rotating hard drives onto an SSD drive. Doing -that effectively introduces a second layer of caching, allowing the -disk cache to be as big as can fit on an SSD drive (probably about -one order of magnitude more than the available RAM). The intention -of this setting is to set it up once at the start up and not change -it while running. The setting may not be changed as long as there -are any disk buffers in use. This default to the empty string, -which means use regular RAM allocations for the disk cache. The -file specified will be created and truncated to the disk cache size -(``cache_size``). Any existing file with the same name will be -replaced. - -Since this setting sets a hard upper limit on cache usage, it -cannot be combined with -``session_settings::contiguous_recv_buffer``, since that feature -treats the ``cache_size`` setting as a soft (but still pretty hard) -limit. The result of combining the two is peers being disconnected -after failing to allocate more disk buffers. - -This feature requires the ``mmap`` system call, on systems that -don't have ``mmap`` this setting is ignored. - -.. _handshake_client_version: - -.. raw:: html - - - -+--------------------------+--------+---------+ -| name | type | default | -+==========================+========+=========+ -| handshake_client_version | string | 0 | -+--------------------------+--------+---------+ - -this is the client name and version identifier sent to peers in the -handshake message. If this is an empty string, the user_agent is -used instead - -.. _outgoing_interfaces: - -.. raw:: html - - - -+---------------------+--------+---------+ -| name | type | default | -+=====================+========+=========+ -| outgoing_interfaces | string | "" | -+---------------------+--------+---------+ - -sets the network interface this session will use when it opens -outgoing connections. By default, it binds outgoing connections to -INADDR_ANY and port 0 (i.e. let the OS decide). Ths parameter must -be a string containing one or more, comma separated, adapter names. -Adapter names on unix systems are of the form "eth0", "eth1", -"tun0", etc. When specifying multiple interfaces, they will be -assigned in round-robin order. This may be useful for clients that -are multi-homed. Binding an outgoing connection to a local IP does -not necessarily make the connection via the associated NIC/Adapter. -Setting this to an empty string will disable binding of outgoing -connections. - -.. _listen_interfaces: - -.. raw:: html - - - -+-------------------+--------+----------------+ -| name | type | default | -+===================+========+================+ -| listen_interfaces | string | "0.0.0.0:6881" | -+-------------------+--------+----------------+ - -a comma-separated list of IP port-pairs. These -are the listen ports that will be opened for accepting incoming uTP -and TCP connections. It is possible to listen on multiple -IPs and multiple ports. Binding to port 0 will make the -operating system pick the port. The default is "0.0.0.0:6881", which -binds to all interfaces on port 6881. -if binding fails, the listen_failed_alert is posted, potentially -more than once. Once/if binding the listen socket(s) succeed, -listen_succeeded_alert is posted. -Each port will attempt to open both a UDP and a TCP listen socket, -to allow accepting uTP connections as well as TCP. If using the DHT, -this will also make the DHT use the same UDP ports. - -.. note:: - The current support for opening arbitrary UDP sockets is limited. - In this version of libtorrent, there will only ever be two UDP - sockets, one for IPv4 and one for IPv6. - -.. _proxy_hostname: - -.. raw:: html - - - -+----------------+--------+---------+ -| name | type | default | -+================+========+=========+ -| proxy_hostname | string | "" | -+----------------+--------+---------+ - -when using a poxy, this is the hostname where the proxy is running -see proxy_type. - -.. _proxy_username: - -.. _proxy_password: - -.. raw:: html - - - - -+----------------+--------+---------+ -| name | type | default | -+================+========+=========+ -| proxy_username | string | "" | -+----------------+--------+---------+ -| proxy_password | string | "" | -+----------------+--------+---------+ - -when using a proxy, these are the credentials (if any) to use whne -connecting to it. see proxy_type - -.. _i2p_hostname: - -.. raw:: html - - - -+--------------+--------+---------+ -| name | type | default | -+==============+========+=========+ -| i2p_hostname | string | "" | -+--------------+--------+---------+ - -sets the i2p_ SAM bridge to connect to. set the port with the -``i2p_port`` setting. - -.. _i2p: http://www.i2p2.de - -.. _peer_fingerprint: - -.. raw:: html - - - -+------------------+--------+------------+ -| name | type | default | -+==================+========+============+ -| peer_fingerprint | string | "-LT1100-" | -+------------------+--------+------------+ - -this is the fingerprint for the client. It will be used as the -prefix to the peer_id. If this is 20 bytes (or longer) it will be -used as the peer-id - -.. _allow_multiple_connections_per_ip: - -.. raw:: html - - - -+-----------------------------------+------+---------+ -| name | type | default | -+===================================+======+=========+ -| allow_multiple_connections_per_ip | bool | false | -+-----------------------------------+------+---------+ - -determines if connections from the same IP address as existing -connections should be rejected or not. Multiple connections from -the same IP address is not allowed by default, to prevent abusive -behavior by peers. It may be useful to allow such connections in -cases where simulations are run on the same machie, and all peers -in a swarm has the same IP address. - -.. _send_redundant_have: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| send_redundant_have | bool | true | -+---------------------+------+---------+ - -if set to true, upload, download and unchoke limits are ignored for -peers on the local network. This option is *DEPRECATED*, please use -set_peer_class_filter() instead. -``send_redundant_have`` controls if have messages will be sent to -peers that already have the piece. This is typically not necessary, -but it might be necessary for collecting statistics in some cases. -Default is false. - -.. _lazy_bitfields: - -.. raw:: html - - - -+----------------+------+---------+ -| name | type | default | -+================+======+=========+ -| lazy_bitfields | bool | false | -+----------------+------+---------+ - -if this is true, outgoing bitfields will never be fuil. If the -client is seed, a few bits will be set to 0, and later filled in -with have messages. This is to prevent certain ISPs from stopping -people from seeding. - -.. _use_dht_as_fallback: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| use_dht_as_fallback | bool | false | -+---------------------+------+---------+ - -``use_dht_as_fallback`` determines how the DHT is used. If this is -true, the DHT will only be used for torrents where all trackers in -its tracker list has failed. Either by an explicit error message or -a time out. This is false by default, which means the DHT is used -by default regardless of if the trackers fail or not. - -.. _upnp_ignore_nonrouters: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| upnp_ignore_nonrouters | bool | false | -+------------------------+------+---------+ - -``upnp_ignore_nonrouters`` indicates whether or not the UPnP -implementation should ignore any broadcast response from a device -whose address is not the configured router for this machine. i.e. -it's a way to not talk to other people's routers by mistake. - -.. _use_parole_mode: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| use_parole_mode | bool | true | -+-----------------+------+---------+ - -``use_parole_mode`` specifies if parole mode should be used. Parole -mode means that peers that participate in pieces that fail the hash -check are put in a mode where they are only allowed to download -whole pieces. If the whole piece a peer in parole mode fails the -hash check, it is banned. If a peer participates in a piece that -passes the hash check, it is taken out of parole mode. - -.. _use_read_cache: - -.. _use_write_cache: - -.. raw:: html - - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| use_read_cache | bool | true | -+-----------------+------+---------+ -| use_write_cache | bool | true | -+-----------------+------+---------+ - -enable and disable caching of read blocks and blocks to be written -to disk respsectively. the purpose of the read cache is partly -read-ahead of requests but also to avoid reading blocks back from -the disk multiple times for popular pieces. the write cache purpose -is to hold off writing blocks to disk until they have been hashed, -to avoid having to read them back in again. - -.. _dont_flush_write_cache: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| dont_flush_write_cache | bool | false | -+------------------------+------+---------+ - -this will make the disk cache never flush a write piece if it would -cause is to have to re-read it once we want to calculate the piece -hash - -.. _explicit_read_cache: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| explicit_read_cache | bool | false | -+---------------------+------+---------+ - -``explicit_read_cache`` defaults to 0. If set to something greater -than 0, the disk read cache will not be evicted by cache misses and -will explicitly be controlled based on the rarity of pieces. Rare -pieces are more likely to be cached. This would typically be used -together with ``suggest_mode`` set to ``suggest_read_cache``. The -value is the number of pieces to keep in the read cache. If the -actual read cache can't fit as many, it will essentially be -clamped. - -.. _coalesce_reads: - -.. _coalesce_writes: - -.. raw:: html - - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| coalesce_reads | bool | false | -+-----------------+------+---------+ -| coalesce_writes | bool | false | -+-----------------+------+---------+ - -allocate separate, contiguous, buffers for read and write calls. -Only used where writev/readv cannot be used will use more RAM but -may improve performance - -.. _auto_manage_prefer_seeds: - -.. raw:: html - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| auto_manage_prefer_seeds | bool | false | -+--------------------------+------+---------+ - -prefer seeding torrents when determining which torrents to give -active slots to, the default is false which gives preference to -downloading torrents - -.. _dont_count_slow_torrents: - -.. raw:: html - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| dont_count_slow_torrents | bool | true | -+--------------------------+------+---------+ - -if ``dont_count_slow_torrents`` is true, torrents without any -payload transfers are not subject to the ``active_seeds`` and -``active_downloads`` limits. This is intended to make it more -likely to utilize all available bandwidth, and avoid having -torrents that don't transfer anything block the active slots. - -.. _close_redundant_connections: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| close_redundant_connections | bool | true | -+-----------------------------+------+---------+ - -``close_redundant_connections`` specifies whether libtorrent should -close connections where both ends have no utility in keeping the -connection open. For instance if both ends have completed their -downloads, there's no point in keeping it open. - -.. _prioritize_partial_pieces: - -.. raw:: html - - - -+---------------------------+------+---------+ -| name | type | default | -+===========================+======+=========+ -| prioritize_partial_pieces | bool | false | -+---------------------------+------+---------+ - -If ``prioritize_partial_pieces`` is true, partial pieces are picked -before pieces that are more rare. If false, rare pieces are always -prioritized, unless the number of partial pieces is growing out of -proportion. - -.. _rate_limit_ip_overhead: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| rate_limit_ip_overhead | bool | true | -+------------------------+------+---------+ - -if set to true, the estimated TCP/IP overhead is drained from the -rate limiters, to avoid exceeding the limits with the total traffic - -.. _announce_to_all_tiers: - -.. _announce_to_all_trackers: - -.. raw:: html - - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| announce_to_all_tiers | bool | false | -+--------------------------+------+---------+ -| announce_to_all_trackers | bool | false | -+--------------------------+------+---------+ - -``announce_to_all_trackers`` controls how multi tracker torrents -are treated. If this is set to true, all trackers in the same tier -are announced to in parallel. If all trackers in tier 0 fails, all -trackers in tier 1 are announced as well. If it's set to false, the -behavior is as defined by the multi tracker specification. It -defaults to false, which is the same behavior previous versions of -libtorrent has had as well. - -``announce_to_all_tiers`` also controls how multi tracker torrents -are treated. When this is set to true, one tracker from each tier -is announced to. This is the uTorrent behavior. This is false by -default in order to comply with the multi-tracker specification. - -.. _prefer_udp_trackers: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| prefer_udp_trackers | bool | true | -+---------------------+------+---------+ - -``prefer_udp_trackers`` is true by default. It means that trackers -may be rearranged in a way that udp trackers are always tried -before http trackers for the same hostname. Setting this to false -means that the trackers' tier is respected and there's no -preference of one protocol over another. - -.. _strict_super_seeding: - -.. raw:: html - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| strict_super_seeding | bool | false | -+----------------------+------+---------+ - -``strict_super_seeding`` when this is set to true, a piece has to -have been forwarded to a third peer before another one is handed -out. This is the traditional definition of super seeding. - -.. _lock_disk_cache: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| lock_disk_cache | bool | false | -+-----------------+------+---------+ - -if this is set to true, the memory allocated for the disk cache -will be locked in physical RAM, never to be swapped out. Every time -a disk buffer is allocated and freed, there will be the extra -overhead of a system call. - -.. _disable_hash_checks: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| disable_hash_checks | bool | false | -+---------------------+------+---------+ - -when set to true, all data downloaded from peers will be assumed to -be correct, and not tested to match the hashes in the torrent this -is only useful for simulation and testing purposes (typically -combined with disabled_storage) - -.. _allow_i2p_mixed: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| allow_i2p_mixed | bool | false | -+-----------------+------+---------+ - -if this is true, i2p torrents are allowed to also get peers from -other sources than the tracker, and connect to regular IPs, not -providing any anonymization. This may be useful if the user is not -interested in the anonymization of i2p, but still wants to be able -to connect to i2p peers. - -.. _low_prio_disk: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| low_prio_disk | bool | true | -+---------------+------+---------+ - -``low_prio_disk`` determines if the disk I/O should use a normal or -low priority policy. This defaults to true, which means that it's -low priority by default. Other processes doing disk I/O will -normally take priority in this mode. This is meant to improve the -overall responsiveness of the system while downloading in the -background. For high-performance server setups, this might not be -desirable. - -.. _volatile_read_cache: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| volatile_read_cache | bool | false | -+---------------------+------+---------+ - -``volatile_read_cache``, if this is set to true, read cache blocks -that are hit by peer read requests are removed from the disk cache -to free up more space. This is useful if you don't expect the disk -cache to create any cache hits from other peers than the one who -triggered the cache line to be read into the cache in the first -place. - -.. _guided_read_cache: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| guided_read_cache | bool | false | -+-------------------+------+---------+ - -``guided_read_cache`` enables the disk cache to adjust the size of -a cache line generated by peers to depend on the upload rate you -are sending to that peer. The intention is to optimize the RAM -usage of the cache, to read ahead further for peers that you're -sending faster to. - -.. _no_atime_storage: - -.. raw:: html - - - -+------------------+------+---------+ -| name | type | default | -+==================+======+=========+ -| no_atime_storage | bool | true | -+------------------+------+---------+ - -``no_atime_storage`` this is a linux-only option and passes in the -``O_NOATIME`` to ``open()`` when opening files. This may lead to -some disk performance improvements. - -.. _incoming_starts_queued_torrents: - -.. raw:: html - - - -+---------------------------------+------+---------+ -| name | type | default | -+=================================+======+=========+ -| incoming_starts_queued_torrents | bool | false | -+---------------------------------+------+---------+ - -``incoming_starts_queued_torrents`` defaults to false. If a torrent -has been paused by the auto managed feature in libtorrent, i.e. the -torrent is paused and auto managed, this feature affects whether or -not it is automatically started on an incoming connection. The main -reason to queue torrents, is not to make them unavailable, but to -save on the overhead of announcing to the trackers, the DHT and to -avoid spreading one's unchoke slots too thin. If a peer managed to -find us, even though we're no in the torrent anymore, this setting -can make us start the torrent and serve it. - -.. _report_true_downloaded: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| report_true_downloaded | bool | false | -+------------------------+------+---------+ - -when set to true, the downloaded counter sent to trackers will -include the actual number of payload bytes downloaded including -redundant bytes. If set to false, it will not include any redundancy -bytes - -.. _strict_end_game_mode: - -.. raw:: html - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| strict_end_game_mode | bool | true | -+----------------------+------+---------+ - -``strict_end_game_mode`` defaults to true, and controls when a -block may be requested twice. If this is ``true``, a block may only -be requested twice when there's ay least one request to every piece -that's left to download in the torrent. This may slow down progress -on some pieces sometimes, but it may also avoid downloading a lot -of redundant bytes. If this is ``false``, libtorrent attempts to -use each peer connection to its max, by always requesting -something, even if it means requesting something that has been -requested from another peer already. - -.. _broadcast_lsd: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| broadcast_lsd | bool | true | -+---------------+------+---------+ - -if ``broadcast_lsd`` is set to true, the local peer discovery (or -Local Service Discovery) will not only use IP multicast, but also -broadcast its messages. This can be useful when running on networks -that don't support multicast. Since broadcast messages might be -expensive and disruptive on networks, only every 8th announce uses -broadcast. - -.. _enable_outgoing_utp: - -.. _enable_incoming_utp: - -.. _enable_outgoing_tcp: - -.. _enable_incoming_tcp: - -.. raw:: html - - - - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| enable_outgoing_utp | bool | true | -+---------------------+------+---------+ -| enable_incoming_utp | bool | true | -+---------------------+------+---------+ -| enable_outgoing_tcp | bool | true | -+---------------------+------+---------+ -| enable_incoming_tcp | bool | true | -+---------------------+------+---------+ - -when set to true, libtorrent will try to make outgoing utp -connections controls whether libtorrent will accept incoming -connections or make outgoing connections of specific type. - -.. _ignore_resume_timestamps: - -.. raw:: html - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| ignore_resume_timestamps | bool | false | -+--------------------------+------+---------+ - -``ignore_resume_timestamps`` determines if the storage, when -loading resume data files, should verify that the file modification -time with the timestamps in the resume data. This defaults to -false, which means timestamps are taken into account, and resume -data is less likely to accepted (torrents are more likely to be -fully checked when loaded). It might be useful to set this to true -if your network is faster than your disk, and it would be faster to -redownload potentially missed pieces than to go through the whole -storage to look for them. - -.. _no_recheck_incomplete_resume: - -.. raw:: html - - - -+------------------------------+------+---------+ -| name | type | default | -+==============================+======+=========+ -| no_recheck_incomplete_resume | bool | false | -+------------------------------+------+---------+ - -``no_recheck_incomplete_resume`` determines if the storage should -check the whole files when resume data is incomplete or missing or -whether it should simply assume we don't have any of the data. By -default, this is determined by the existence of any of the files. -By setting this setting to true, the files won't be checked, but -will go straight to download mode. - -.. _anonymous_mode: - -.. raw:: html - - - -+----------------+------+---------+ -| name | type | default | -+================+======+=========+ -| anonymous_mode | bool | false | -+----------------+------+---------+ - -``anonymous_mode`` defaults to false. When set to true, the client -tries to hide its identity to a certain degree. The peer-ID will no -longer include the client's fingerprint. The user-agent will be -reset to an empty string. Trackers will only be used if they are -using a proxy server. The listen sockets are closed, and incoming -connections will only be accepted through a SOCKS5 or I2P proxy (if -a peer proxy is set up and is run on the same machine as the -tracker proxy). Since no incoming connections are accepted, -NAT-PMP, UPnP, DHT and local peer discovery are all turned off when -this setting is enabled. - -If you're using I2P, it might make sense to enable anonymous mode -as well. - -.. _report_web_seed_downloads: - -.. raw:: html - - - -+---------------------------+------+---------+ -| name | type | default | -+===========================+======+=========+ -| report_web_seed_downloads | bool | true | -+---------------------------+------+---------+ - -specifies whether downloads from web seeds is reported to the -tracker or not. Defaults to on. Turning it off also excludes web -seed traffic from other stats and download rate reporting via the -libtorrent API. - -.. _announce_double_nat: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| announce_double_nat | bool | false | -+---------------------+------+---------+ - -set to true if uTP connections should be rate limited This option -is *DEPRECATED*, please use set_peer_class_filter() instead. -if this is true, the ``&ip=`` argument in tracker requests (unless -otherwise specified) will be set to the intermediate IP address if -the user is double NATed. If the user is not double NATed, this -option does not have an affect - -.. _seeding_outgoing_connections: - -.. raw:: html - - - -+------------------------------+------+---------+ -| name | type | default | -+==============================+======+=========+ -| seeding_outgoing_connections | bool | true | -+------------------------------+------+---------+ - -``seeding_outgoing_connections`` determines if seeding (and -finished) torrents should attempt to make outgoing connections or -not. By default this is true. It may be set to false in very -specific applications where the cost of making outgoing connections -is high, and there are no or small benefits of doing so. For -instance, if no nodes are behind a firewall or a NAT, seeds don't -need to make outgoing connections. - -.. _no_connect_privileged_ports: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| no_connect_privileged_ports | bool | false | -+-----------------------------+------+---------+ - -when this is true, libtorrent will not attempt to make outgoing -connections to peers whose port is < 1024. This is a safety -precaution to avoid being part of a DDoS attack - -.. _smooth_connects: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| smooth_connects | bool | true | -+-----------------+------+---------+ - -``smooth_connects`` is true by default, which means the number of -connection attempts per second may be limited to below the -``connection_speed``, in case we're close to bump up against the -limit of number of connections. The intention of this setting is to -more evenly distribute our connection attempts over time, instead -of attempting to connect in batches, and timing them out in -batches. - -.. _always_send_user_agent: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| always_send_user_agent | bool | false | -+------------------------+------+---------+ - -always send user-agent in every web seed request. If false, only -the first request per http connection will include the user agent - -.. _apply_ip_filter_to_trackers: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| apply_ip_filter_to_trackers | bool | true | -+-----------------------------+------+---------+ - -``apply_ip_filter_to_trackers`` defaults to true. It determines -whether the IP filter applies to trackers as well as peers. If this -is set to false, trackers are exempt from the IP filter (if there -is one). If no IP filter is set, this setting is irrelevant. - -.. _use_disk_read_ahead: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| use_disk_read_ahead | bool | true | -+---------------------+------+---------+ - -``use_disk_read_ahead`` defaults to true and will attempt to -optimize disk reads by giving the operating system heads up of disk -read requests as they are queued in the disk job queue. - -.. _lock_files: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| lock_files | bool | false | -+------------+------+---------+ - -``lock_files`` determines whether or not to lock files which -libtorrent is downloading to or seeding from. This is implemented -using ``fcntl(F_SETLK)`` on unix systems and by not passing in -``SHARE_READ`` and ``SHARE_WRITE`` on windows. This might prevent -3rd party processes from corrupting the files under libtorrent's -feet. - -.. _contiguous_recv_buffer: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| contiguous_recv_buffer | bool | true | -+------------------------+------+---------+ - -``contiguous_recv_buffer`` determines whether or not libtorrent -should receive data from peers into a contiguous intermediate -buffer, to then copy blocks into disk buffers from, or to make many -smaller calls to ``read()``, each time passing in the specific -buffer the data belongs in. When downloading at high rates, the -latter may save some time copying data. When seeding at high rates, -all incoming traffic consists of a very large number of tiny -packets, and enabling ``contiguous_recv_buffer`` will provide -higher performance. When this is enabled, it will only be used when -seeding to peers, since that's when it provides performance -improvements. - -.. _ban_web_seeds: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| ban_web_seeds | bool | true | -+---------------+------+---------+ - -when true, web seeds sending bad data will be banned - -.. _allow_partial_disk_writes: - -.. raw:: html - - - -+---------------------------+------+---------+ -| name | type | default | -+===========================+======+=========+ -| allow_partial_disk_writes | bool | true | -+---------------------------+------+---------+ - -when set to false, the ``write_cache_line_size`` will apply across -piece boundaries. this is a bad idea unless the piece picker also -is configured to have an affinity to pick pieces belonging to the -same write cache line as is configured in the disk cache. - -.. _force_proxy: - -.. raw:: html - - - -+-------------+------+---------+ -| name | type | default | -+=============+======+=========+ -| force_proxy | bool | false | -+-------------+------+---------+ - -If true, disables any communication that's not going over a proxy. -Enabling this requires a proxy to be configured as well, see -``set_proxy_settings``. The listen sockets are closed, and incoming -connections will only be accepted through a SOCKS5 or I2P proxy (if -a peer proxy is set up and is run on the same machine as the -tracker proxy). This setting also disabled peer country lookups, -since those are done via DNS lookups that aren't supported by -proxies. - -.. _support_share_mode: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| support_share_mode | bool | true | -+--------------------+------+---------+ - -if false, prevents libtorrent to advertise share-mode support - -.. _support_merkle_torrents: - -.. raw:: html - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| support_merkle_torrents | bool | true | -+-------------------------+------+---------+ - -if this is false, don't advertise support for the Tribler merkle -tree piece message - -.. _report_redundant_bytes: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| report_redundant_bytes | bool | true | -+------------------------+------+---------+ - -if this is true, the number of redundant bytes is sent to the -tracker - -.. _listen_system_port_fallback: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| listen_system_port_fallback | bool | true | -+-----------------------------+------+---------+ - -if this is true, libtorrent will fall back to listening on a port -chosen by the operating system (i.e. binding to port 0). If a -failure is preferred, set this to false. - -.. _use_disk_cache_pool: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| use_disk_cache_pool | bool | false | -+---------------------+------+---------+ - -``use_disk_cache_pool`` enables using a pool allocator for disk -cache blocks. Enabling it makes the cache perform better at high -throughput. It also makes the cache less likely and slower at -returning memory back to the system, once allocated. - -.. _announce_crypto_support: - -.. raw:: html - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| announce_crypto_support | bool | true | -+-------------------------+------+---------+ - -when this is true, and incoming encrypted connections are enabled, -&supportcrypt=1 is included in http tracker announces - -.. _enable_upnp: - -.. raw:: html - - - -+-------------+------+---------+ -| name | type | default | -+=============+======+=========+ -| enable_upnp | bool | true | -+-------------+------+---------+ - -Starts and stops the UPnP service. When started, the listen port -and the DHT port are attempted to be forwarded on local UPnP router -devices. - -The upnp object returned by ``start_upnp()`` can be used to add and -remove arbitrary port mappings. Mapping status is returned through -the portmap_alert and the portmap_error_alert. The object will be -valid until ``stop_upnp()`` is called. See upnp-and-nat-pmp_. - -.. _enable_natpmp: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| enable_natpmp | bool | true | -+---------------+------+---------+ - -Starts and stops the NAT-PMP service. When started, the listen port -and the DHT port are attempted to be forwarded on the router -through NAT-PMP. - -The natpmp object returned by ``start_natpmp()`` can be used to add -and remove arbitrary port mappings. Mapping status is returned -through the portmap_alert and the portmap_error_alert. The object -will be valid until ``stop_natpmp()`` is called. See -upnp-and-nat-pmp_. - -.. _enable_lsd: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| enable_lsd | bool | true | -+------------+------+---------+ - -Starts and stops Local Service Discovery. This service will -broadcast the infohashes of all the non-private torrents on the -local network to look for peers on the same swarm within multicast -reach. - -.. _enable_dht: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| enable_dht | bool | true | -+------------+------+---------+ - -starts the dht node and makes the trackerless service available to -torrents. - -.. _prefer_rc4: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| prefer_rc4 | bool | false | -+------------+------+---------+ - -if the allowed encryption level is both, setting this to true will -prefer rc4 if both methods are offered, plaintext otherwise - -.. _proxy_hostnames: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| proxy_hostnames | bool | true | -+-----------------+------+---------+ - -if true, hostname lookups are done via the configured proxy (if -any). This is only supported by SOCKS5 and HTTP. - -.. _proxy_peer_connections: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| proxy_peer_connections | bool | true | -+------------------------+------+---------+ - -if true, peer connections are made (and accepted) over the -configured proxy, if any. Web seeds as well as regular bittorrent -peer connections are considered "peer connections". Anything -transporting actual torrent payload (trackers and DHT traffic are -not considered peer connections). - -.. _auto_sequential: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| auto_sequential | bool | true | -+-----------------+------+---------+ - -if this setting is true, torrents with a very high availability of -pieces (and seeds) are downloaded sequentially. This is more -efficient for the disk I/O. With many seeds, the download order is -unlikely to matter anyway - -.. _proxy_tracker_connections: - -.. raw:: html - - - -+---------------------------+------+---------+ -| name | type | default | -+===========================+======+=========+ -| proxy_tracker_connections | bool | true | -+---------------------------+------+---------+ - -if true, tracker connections are made over the configured proxy, if -any. - -.. _tracker_completion_timeout: - -.. raw:: html - - - -+----------------------------+------+---------+ -| name | type | default | -+============================+======+=========+ -| tracker_completion_timeout | int | 30 | -+----------------------------+------+---------+ - -``tracker_completion_timeout`` is the number of seconds the tracker -connection will wait from when it sent the request until it -considers the tracker to have timed-out. Default value is 60 -seconds. - -.. _tracker_receive_timeout: - -.. raw:: html - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| tracker_receive_timeout | int | 10 | -+-------------------------+------+---------+ - -``tracker_receive_timeout`` is the number of seconds to wait to -receive any data from the tracker. If no data is received for this -number of seconds, the tracker will be considered as having timed -out. If a tracker is down, this is the kind of timeout that will -occur. - -.. _stop_tracker_timeout: - -.. raw:: html - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| stop_tracker_timeout | int | 5 | -+----------------------+------+---------+ - -the time to wait when sending a stopped message before considering -a tracker to have timed out. this is usually shorter, to make the -client quit faster - -.. _tracker_maximum_response_length: - -.. raw:: html - - - -+---------------------------------+------+-----------+ -| name | type | default | -+=================================+======+===========+ -| tracker_maximum_response_length | int | 1024*1024 | -+---------------------------------+------+-----------+ - -this is the maximum number of bytes in a tracker response. If a -response size passes this number of bytes it will be rejected and -the connection will be closed. On gzipped responses this size is -measured on the uncompressed data. So, if you get 20 bytes of gzip -response that'll expand to 2 megabytes, it will be interrupted -before the entire response has been uncompressed (assuming the -limit is lower than 2 megs). - -.. _piece_timeout: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| piece_timeout | int | 20 | -+---------------+------+---------+ - -the number of seconds from a request is sent until it times out if -no piece response is returned. - -.. _request_timeout: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| request_timeout | int | 60 | -+-----------------+------+---------+ - -the number of seconds one block (16kB) is expected to be received -within. If it's not, the block is requested from a different peer - -.. _request_queue_time: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| request_queue_time | int | 3 | -+--------------------+------+---------+ - -the length of the request queue given in the number of seconds it -should take for the other end to send all the pieces. i.e. the -actual number of requests depends on the download rate and this -number. - -.. _max_allowed_in_request_queue: - -.. raw:: html - - - -+------------------------------+------+---------+ -| name | type | default | -+==============================+======+=========+ -| max_allowed_in_request_queue | int | 500 | -+------------------------------+------+---------+ - -the number of outstanding block requests a peer is allowed to queue -up in the client. If a peer sends more requests than this (before -the first one has been sent) the last request will be dropped. the -higher this is, the faster upload speeds the client can get to a -single peer. - -.. _max_out_request_queue: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| max_out_request_queue | int | 500 | -+-----------------------+------+---------+ - -``max_out_request_queue`` is the maximum number of outstanding -requests to send to a peer. This limit takes precedence over -``request_queue_time``. i.e. no matter the download speed, the -number of outstanding requests will never exceed this limit. - -.. _whole_pieces_threshold: - -.. raw:: html - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| whole_pieces_threshold | int | 20 | -+------------------------+------+---------+ - -if a whole piece can be downloaded in this number of seconds, or -less, the peer_connection will prefer to request whole pieces at a -time from this peer. The benefit of this is to better utilize disk -caches by doing localized accesses and also to make it easier to -identify bad peers if a piece fails the hash check. - -.. _peer_timeout: - -.. raw:: html - - - -+--------------+------+---------+ -| name | type | default | -+==============+======+=========+ -| peer_timeout | int | 120 | -+--------------+------+---------+ - -``peer_timeout`` is the number of seconds the peer connection -should wait (for any activity on the peer connection) before -closing it due to time out. This defaults to 120 seconds, since -that's what's specified in the protocol specification. After half -the time out, a keep alive message is sent. - -.. _urlseed_timeout: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| urlseed_timeout | int | 20 | -+-----------------+------+---------+ - -same as peer_timeout, but only applies to url-seeds. this is -usually set lower, because web servers are expected to be more -reliable. - -.. _urlseed_pipeline_size: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| urlseed_pipeline_size | int | 5 | -+-----------------------+------+---------+ - -controls the pipelining size of url-seeds. i.e. the number of HTTP -request to keep outstanding before waiting for the first one to -complete. It's common for web servers to limit this to a relatively -low number, like 5 - -.. _urlseed_wait_retry: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| urlseed_wait_retry | int | 30 | -+--------------------+------+---------+ - -time to wait until a new retry of a web seed takes place - -.. _file_pool_size: - -.. raw:: html - - - -+----------------+------+---------+ -| name | type | default | -+================+======+=========+ -| file_pool_size | int | 40 | -+----------------+------+---------+ - -sets the upper limit on the total number of files this session will -keep open. The reason why files are left open at all is that some -anti virus software hooks on every file close, and scans the file -for viruses. deferring the closing of the files will be the -difference between a usable system and a completely hogged down -system. Most operating systems also has a limit on the total number -of file descriptors a process may have open. It is usually a good -idea to find this limit and set the number of connections and the -number of files limits so their sum is slightly below it. - -.. _max_failcount: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| max_failcount | int | 3 | -+---------------+------+---------+ - -``max_failcount`` is the maximum times we try to connect to a peer -before stop connecting again. If a peer succeeds, the failcounter -is reset. If a peer is retrieved from a peer source (other than -DHT) the failcount is decremented by one, allowing another try. - -.. _min_reconnect_time: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| min_reconnect_time | int | 60 | -+--------------------+------+---------+ - -the number of seconds to wait to reconnect to a peer. this time is -multiplied with the failcount. - -.. _peer_connect_timeout: - -.. raw:: html - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| peer_connect_timeout | int | 15 | -+----------------------+------+---------+ - -``peer_connect_timeout`` the number of seconds to wait after a -connection attempt is initiated to a peer until it is considered as -having timed out. This setting is especially important in case the -number of half-open connections are limited, since stale half-open -connection may delay the connection of other peers considerably. - -.. _connection_speed: - -.. raw:: html - - - -+------------------+------+---------+ -| name | type | default | -+==================+======+=========+ -| connection_speed | int | 6 | -+------------------+------+---------+ - -``connection_speed`` is the number of connection attempts that are -made per second. If a number < 0 is specified, it will default to -200 connections per second. If 0 is specified, it means don't make -outgoing connections at all. - -.. _inactivity_timeout: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| inactivity_timeout | int | 600 | -+--------------------+------+---------+ - -if a peer is uninteresting and uninterested for longer than this -number of seconds, it will be disconnected. default is 10 minutes - -.. _unchoke_interval: - -.. raw:: html - - - -+------------------+------+---------+ -| name | type | default | -+==================+======+=========+ -| unchoke_interval | int | 15 | -+------------------+------+---------+ - -``unchoke_interval`` is the number of seconds between -chokes/unchokes. On this interval, peers are re-evaluated for being -choked/unchoked. This is defined as 30 seconds in the protocol, and -it should be significantly longer than what it takes for TCP to -ramp up to it's max rate. - -.. _optimistic_unchoke_interval: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| optimistic_unchoke_interval | int | 30 | -+-----------------------------+------+---------+ - -``optimistic_unchoke_interval`` is the number of seconds between -each *optimistic* unchoke. On this timer, the currently -optimistically unchoked peer will change. - -.. _num_want: - -.. raw:: html - - - -+----------+------+---------+ -| name | type | default | -+==========+======+=========+ -| num_want | int | 200 | -+----------+------+---------+ - -``num_want`` is the number of peers we want from each tracker -request. It defines what is sent as the ``&num_want=`` parameter to -the tracker. - -.. _initial_picker_threshold: - -.. raw:: html - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| initial_picker_threshold | int | 4 | -+--------------------------+------+---------+ - -``initial_picker_threshold`` specifies the number of pieces we need -before we switch to rarest first picking. This defaults to 4, which -means the 4 first pieces in any torrent are picked at random, the -following pieces are picked in rarest first order. - -.. _allowed_fast_set_size: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| allowed_fast_set_size | int | 10 | -+-----------------------+------+---------+ - -the number of allowed pieces to send to peers that supports the -fast extensions - -.. _suggest_mode: - -.. raw:: html - - - -+--------------+------+-------------------------------------+ -| name | type | default | -+==============+======+=====================================+ -| suggest_mode | int | settings_pack::no_piece_suggestions | -+--------------+------+-------------------------------------+ - -``suggest_mode`` controls whether or not libtorrent will send out -suggest messages to create a bias of its peers to request certain -pieces. The modes are: - -* ``no_piece_suggestsions`` which is the default and will not send - out suggest messages. -* ``suggest_read_cache`` which will send out suggest messages for - the most recent pieces that are in the read cache. - -.. _max_queued_disk_bytes: - -.. raw:: html - - - -+-----------------------+------+-------------+ -| name | type | default | -+=======================+======+=============+ -| max_queued_disk_bytes | int | 1024 * 1024 | -+-----------------------+------+-------------+ - -``max_queued_disk_bytes`` is the number maximum number of bytes, to -be written to disk, that can wait in the disk I/O thread queue. -This queue is only for waiting for the disk I/O thread to receive -the job and either write it to disk or insert it in the write -cache. When this limit is reached, the peer connections will stop -reading data from their sockets, until the disk thread catches up. -Setting this too low will severely limit your download rate. - -.. _handshake_timeout: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| handshake_timeout | int | 10 | -+-------------------+------+---------+ - -the number of seconds to wait for a handshake response from a peer. -If no response is received within this time, the peer is -disconnected. - -.. _send_buffer_low_watermark: - -.. _send_buffer_watermark: - -.. _send_buffer_watermark_factor: - -.. raw:: html - - - - - -+------------------------------+------+------------+ -| name | type | default | -+==============================+======+============+ -| send_buffer_low_watermark | int | 10 * 1024 | -+------------------------------+------+------------+ -| send_buffer_watermark | int | 500 * 1024 | -+------------------------------+------+------------+ -| send_buffer_watermark_factor | int | 50 | -+------------------------------+------+------------+ - -``send_buffer_low_watermark`` the minimum send buffer target size -(send buffer includes bytes pending being read from disk). For good -and snappy seeding performance, set this fairly high, to at least -fit a few blocks. This is essentially the initial window size which -will determine how fast we can ramp up the send rate - -if the send buffer has fewer bytes than ``send_buffer_watermark``, -we'll read another 16kB block onto it. If set too small, upload -rate capacity will suffer. If set too high, memory will be wasted. -The actual watermark may be lower than this in case the upload rate -is low, this is the upper limit. - -the current upload rate to a peer is multiplied by this factor to -get the send buffer watermark. The factor is specified as a -percentage. i.e. 50 -> 0.5 This product is clamped to the -``send_buffer_watermark`` setting to not exceed the max. For high -speed upload, this should be set to a greater value than 100. For -high capacity connections, setting this higher can improve upload -performance and disk throughput. Setting it too high may waste RAM -and create a bias towards read jobs over write jobs. - -.. _choking_algorithm: - -.. _seed_choking_algorithm: - -.. raw:: html - - - - -+------------------------+------+-----------------------------------+ -| name | type | default | -+========================+======+===================================+ -| choking_algorithm | int | settings_pack::fixed_slots_choker | -+------------------------+------+-----------------------------------+ -| seed_choking_algorithm | int | settings_pack::round_robin | -+------------------------+------+-----------------------------------+ - -``choking_algorithm`` specifies which algorithm to use to determine -which peers to unchoke. - -The options for choking algorithms are: - -* ``fixed_slots_choker`` is the traditional choker with a fixed - number of unchoke slots (as specified by - ``session::set_max_uploads()``). - -* ``rate_based_choker`` opens up unchoke slots based on the upload - rate achieved to peers. The more slots that are opened, the - marginal upload rate required to open up another slot increases. - -* ``bittyrant_choker`` attempts to optimize download rate by - finding the reciprocation rate of each peer individually and - prefers peers that gives the highest *return on investment*. It - still allocates all upload capacity, but shuffles it around to - the best peers first. For this choker to be efficient, you need - to set a global upload rate limit - (``session::set_upload_rate_limit()``). For more information - about this choker, see the paper_. This choker is not fully - implemented nor tested. - -.. _paper: http://bittyrant.cs.washington.edu/#papers - -``seed_choking_algorithm`` controls the seeding unchoke behavior. -The available options are: - -* ``round_robin`` which round-robins the peers that are unchoked - when seeding. This distributes the upload bandwidht uniformly and - fairly. It minimizes the ability for a peer to download everything - without redistributing it. - -* ``fastest_upload`` unchokes the peers we can send to the fastest. - This might be a bit more reliable in utilizing all available - capacity. - -* ``anti_leech`` prioritizes peers who have just started or are - just about to finish the download. The intention is to force - peers in the middle of the download to trade with each other. - -.. _cache_size: - -.. _cache_buffer_chunk_size: - -.. _cache_expiry: - -.. raw:: html - - - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| cache_size | int | 1024 | -+-------------------------+------+---------+ -| cache_buffer_chunk_size | int | 0 | -+-------------------------+------+---------+ -| cache_expiry | int | 300 | -+-------------------------+------+---------+ - -``cache_size`` is the disk write and read cache. It is specified -in units of 16 KiB blocks. Buffers that are part of a peer's send -or receive buffer also count against this limit. Send and receive -buffers will never be denied to be allocated, but they will cause -the actual cached blocks to be flushed or evicted. If this is set -to -1, the cache size is automatically set to the amount of -physical RAM available in the machine divided by 8. If the amount -of physical RAM cannot be determined, it's set to 1024 (= 16 MiB). - -Disk buffers are allocated using a pool allocator, the number of -blocks that are allocated at a time when the pool needs to grow can -be specified in ``cache_buffer_chunk_size``. Lower numbers saves -memory at the expense of more heap allocations. If it is set to 0, -the effective chunk size is proportional to the total cache size, -attempting to strike a good balance between performance and memory -usage. It defaults to 0. ``cache_expiry`` is the number of seconds -from the last cached write to a piece in the write cache, to when -it's forcefully flushed to disk. Default is 60 second. - -On 32 bit builds, the effective cache size will be limited to 3/4 of -2 GiB to avoid exceeding the virtual address space limit. - -.. _explicit_cache_interval: - -.. raw:: html - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| explicit_cache_interval | int | 30 | -+-------------------------+------+---------+ - -``explicit_cache_interval`` is the number of seconds in between -each refresh of a part of the explicit read cache. Torrents take -turns in refreshing and this is the time in between each torrent -refresh. Refreshing a torrent's explicit read cache means scanning -all pieces and picking a random set of the rarest ones. There is an -affinity to pick pieces that are already in the cache, so that -subsequent refreshes only swaps in pieces that are rarer than -whatever is in the cache at the time. - -.. _disk_io_write_mode: - -.. _disk_io_read_mode: - -.. raw:: html - - - - -+--------------------+------+--------------------------------+ -| name | type | default | -+====================+======+================================+ -| disk_io_write_mode | int | settings_pack::enable_os_cache | -+--------------------+------+--------------------------------+ -| disk_io_read_mode | int | settings_pack::enable_os_cache | -+--------------------+------+--------------------------------+ - -determines how files are opened when they're in read only mode -versus read and write mode. The options are: - -enable_os_cache - This is the default and files are opened normally, with the OS - caching reads and writes. -disable_os_cache - This opens all files in no-cache mode. This corresponds to the - OS not letting blocks for the files linger in the cache. This - makes sense in order to avoid the bittorrent client to - potentially evict all other processes' cache by simply handling - high throughput and large files. If libtorrent's read cache is - disabled, enabling this may reduce performance. - -One reason to disable caching is that it may help the operating -system from growing its file cache indefinitely. - -.. _outgoing_port: - -.. _num_outgoing_ports: - -.. raw:: html - - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| outgoing_port | int | 0 | -+--------------------+------+---------+ -| num_outgoing_ports | int | 0 | -+--------------------+------+---------+ - -this is the first port to use for binding outgoing connections to. -This is useful for users that have routers that allow QoS settings -based on local port. when binding outgoing connections to specific -ports, ``num_outgoing_ports`` is the size of the range. It should -be more than a few - -.. warning:: setting outgoing ports will limit the ability to keep - multiple connections to the same client, even for different - torrents. It is not recommended to change this setting. Its main - purpose is to use as an escape hatch for cheap routers with QoS - capability but can only classify flows based on port numbers. - -It is a range instead of a single port because of the problems with -failing to reconnect to peers if a previous socket to that peer and -port is in ``TIME_WAIT`` state. - -.. _peer_tos: - -.. raw:: html - - - -+----------+------+---------+ -| name | type | default | -+==========+======+=========+ -| peer_tos | int | 0 | -+----------+------+---------+ - -``peer_tos`` determines the TOS byte set in the IP header of every -packet sent to peers (including web seeds). The default value for -this is ``0x0`` (no marking). One potentially useful TOS mark is -``0x20``, this represents the *QBone scavenger service*. For more -details, see QBSS_. - -.. _`QBSS`: http://qbone.internet2.edu/qbss/ - -.. _active_downloads: - -.. _active_seeds: - -.. _active_checking: - -.. _active_dht_limit: - -.. _active_tracker_limit: - -.. _active_lsd_limit: - -.. _active_limit: - -.. _active_loaded_limit: - -.. raw:: html - - - - - - - - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| active_downloads | int | 3 | -+----------------------+------+---------+ -| active_seeds | int | 5 | -+----------------------+------+---------+ -| active_checking | int | 1 | -+----------------------+------+---------+ -| active_dht_limit | int | 88 | -+----------------------+------+---------+ -| active_tracker_limit | int | 1600 | -+----------------------+------+---------+ -| active_lsd_limit | int | 60 | -+----------------------+------+---------+ -| active_limit | int | 15 | -+----------------------+------+---------+ -| active_loaded_limit | int | 100 | -+----------------------+------+---------+ - -for auto managed torrents, these are the limits they are subject -to. If there are too many torrents some of the auto managed ones -will be paused until some slots free up. ``active_downloads`` and -``active_seeds`` controls how many active seeding and downloading -torrents the queuing mechanism allows. The target number of active -torrents is ``min(active_downloads + active_seeds, active_limit)``. -``active_downloads`` and ``active_seeds`` are upper limits on the -number of downloading torrents and seeding torrents respectively. -Setting the value to -1 means unlimited. -For example if there are 10 seeding torrents and 10 downloading -torrents, and ``active_downloads`` is 4 and ``active_seeds`` is 4, -there will be 4 seeds active and 4 downloading torrents. If the -settings are ``active_downloads`` = 2 and ``active_seeds`` = 4, -then there will be 2 downloading torrents and 4 seeding torrents -active. Torrents that are not auto managed are not counted against -these limits. - -``active_checking`` is the limit of number of simultaneous checking -torrents. - -``active_limit`` is a hard limit on the number of active (auto -managed) torrents. This limit also applies to slow torrents. - -``active_dht_limit`` is the max number of torrents to announce to -the DHT. By default this is set to 88, which is no more than one -DHT announce every 10 seconds. - -``active_tracker_limit`` is the max number of torrents to announce -to their trackers. By default this is 360, which is no more than -one announce every 5 seconds. - -``active_lsd_limit`` is the max number of torrents to announce to -the local network over the local service discovery protocol. By -default this is 80, which is no more than one announce every 5 -seconds (assuming the default announce interval of 5 minutes). - -You can have more torrents *active*, even though they are not -announced to the DHT, lsd or their tracker. If some peer knows -about you for any reason and tries to connect, it will still be -accepted, unless the torrent is paused, which means it won't accept -any connections. - -``active_loaded_limit`` is the number of torrents that are allowed -to be *loaded* at any given time. Note that a torrent can be active -even though it's not loaded. if an unloaded torrents finds a peer -that wants to access it, the torrent will be loaded on demand, -using a user-supplied callback function. If the feature of -unloading torrents is not enabled, this setting have no effect. If -this limit is set to 0, it means unlimited. For more information, -see dynamic-loading-of-torrent-files_. - -.. _auto_manage_interval: - -.. raw:: html - - - -+----------------------+------+---------+ -| name | type | default | -+======================+======+=========+ -| auto_manage_interval | int | 30 | -+----------------------+------+---------+ - -``auto_manage_interval`` is the number of seconds between the -torrent queue is updated, and rotated. - -.. _seed_time_limit: - -.. raw:: html - - - -+-----------------+------+--------------+ -| name | type | default | -+=================+======+==============+ -| seed_time_limit | int | 24 * 60 * 60 | -+-----------------+------+--------------+ - -this is the limit on the time a torrent has been an active seed -(specified in seconds) before it is considered having met the seed -limit criteria. See queuing_. - -.. _auto_scrape_interval: - -.. _auto_scrape_min_interval: - -.. raw:: html - - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| auto_scrape_interval | int | 1800 | -+--------------------------+------+---------+ -| auto_scrape_min_interval | int | 300 | -+--------------------------+------+---------+ - -``auto_scrape_interval`` is the number of seconds between scrapes -of queued torrents (auto managed and paused torrents). Auto managed -torrents that are paused, are scraped regularly in order to keep -track of their downloader/seed ratio. This ratio is used to -determine which torrents to seed and which to pause. - -``auto_scrape_min_interval`` is the minimum number of seconds -between any automatic scrape (regardless of torrent). In case there -are a large number of paused auto managed torrents, this puts a -limit on how often a scrape request is sent. - -.. _max_peerlist_size: - -.. _max_paused_peerlist_size: - -.. raw:: html - - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| max_peerlist_size | int | 3000 | -+--------------------------+------+---------+ -| max_paused_peerlist_size | int | 1000 | -+--------------------------+------+---------+ - -``max_peerlist_size`` is the maximum number of peers in the list of -known peers. These peers are not necessarily connected, so this -number should be much greater than the maximum number of connected -peers. Peers are evicted from the cache when the list grows passed -90% of this limit, and once the size hits the limit, peers are no -longer added to the list. If this limit is set to 0, there is no -limit on how many peers we'll keep in the peer list. - -``max_paused_peerlist_size`` is the max peer list size used for -torrents that are paused. This default to the same as -``max_peerlist_size``, but can be used to save memory for paused -torrents, since it's not as important for them to keep a large peer -list. - -.. _min_announce_interval: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| min_announce_interval | int | 5 * 60 | -+-----------------------+------+---------+ - -this is the minimum allowed announce interval for a tracker. This -is specified in seconds and is used as a sanity check on what is -returned from a tracker. It mitigates hammering misconfigured -trackers. - -.. _auto_manage_startup: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| auto_manage_startup | int | 60 | -+---------------------+------+---------+ - -this is the number of seconds a torrent is considered active after -it was started, regardless of upload and download speed. This is so -that newly started torrents are not considered inactive until they -have a fair chance to start downloading. - -.. _seeding_piece_quota: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| seeding_piece_quota | int | 20 | -+---------------------+------+---------+ - -``seeding_piece_quota`` is the number of pieces to send to a peer, -when seeding, before rotating in another peer to the unchoke set. -It defaults to 3 pieces, which means that when seeding, any peer -we've sent more than this number of pieces to will be unchoked in -favour of a choked peer. - -.. _max_rejects: - -.. raw:: html - - - -+-------------+------+---------+ -| name | type | default | -+=============+======+=========+ -| max_rejects | int | 50 | -+-------------+------+---------+ - -TODO: deprecate this -``max_rejects`` is the number of piece requests we will reject in a -row while a peer is choked before the peer is considered abusive -and is disconnected. - -.. _recv_socket_buffer_size: - -.. _send_socket_buffer_size: - -.. raw:: html - - - - -+-------------------------+------+---------+ -| name | type | default | -+=========================+======+=========+ -| recv_socket_buffer_size | int | 0 | -+-------------------------+------+---------+ -| send_socket_buffer_size | int | 0 | -+-------------------------+------+---------+ - -``recv_socket_buffer_size`` and ``send_socket_buffer_size`` -specifies the buffer sizes set on peer sockets. 0 (which is the -default) means the OS default (i.e. don't change the buffer sizes). -The socket buffer sizes are changed using setsockopt() with -SOL_SOCKET/SO_RCVBUF and SO_SNDBUFFER. - -.. _file_checks_delay_per_block: - -.. raw:: html - - - -+-----------------------------+------+---------+ -| name | type | default | -+=============================+======+=========+ -| file_checks_delay_per_block | int | 0 | -+-----------------------------+------+---------+ - -``file_checks_delay_per_block`` is the number of milliseconds to -sleep in between disk read operations when checking torrents. This -defaults to 0, but can be set to higher numbers to slow down the -rate at which data is read from the disk while checking. This may -be useful for background tasks that doesn't matter if they take a -bit longer, as long as they leave disk I/O time for other -processes. - -.. _read_cache_line_size: - -.. _write_cache_line_size: - -.. raw:: html - - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| read_cache_line_size | int | 32 | -+-----------------------+------+---------+ -| write_cache_line_size | int | 16 | -+-----------------------+------+---------+ - -``read_cache_line_size`` is the number of blocks to read into the -read cache when a read cache miss occurs. Setting this to 0 is -essentially the same thing as disabling read cache. The number of -blocks read into the read cache is always capped by the piece -boundary. - -When a piece in the write cache has ``write_cache_line_size`` -contiguous blocks in it, they will be flushed. Setting this to 1 -effectively disables the write cache. - -.. _optimistic_disk_retry: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| optimistic_disk_retry | int | 10 * 60 | -+-----------------------+------+---------+ - -``optimistic_disk_retry`` is the number of seconds from a disk -write errors occur on a torrent until libtorrent will take it out -of the upload mode, to test if the error condition has been fixed. - -libtorrent will only do this automatically for auto managed -torrents. - -You can explicitly take a torrent out of upload only mode using -set_upload_mode(). - -.. _max_suggest_pieces: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| max_suggest_pieces | int | 10 | -+--------------------+------+---------+ - -``max_suggest_pieces`` is the max number of suggested piece indices -received from a peer that's remembered. If a peer floods suggest -messages, this limit prevents libtorrent from using too much RAM. -It defaults to 10. - -.. _local_service_announce_interval: - -.. raw:: html - - - -+---------------------------------+------+---------+ -| name | type | default | -+=================================+======+=========+ -| local_service_announce_interval | int | 5 * 60 | -+---------------------------------+------+---------+ - -``local_service_announce_interval`` is the time between local -network announces for a torrent. By default, when local service -discovery is enabled a torrent announces itself every 5 minutes. -This interval is specified in seconds. - -.. _dht_announce_interval: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| dht_announce_interval | int | 15 * 60 | -+-----------------------+------+---------+ - -``dht_announce_interval`` is the number of seconds between -announcing torrents to the distributed hash table (DHT). - -.. _udp_tracker_token_expiry: - -.. raw:: html - - - -+--------------------------+------+---------+ -| name | type | default | -+==========================+======+=========+ -| udp_tracker_token_expiry | int | 60 | -+--------------------------+------+---------+ - -``udp_tracker_token_expiry`` is the number of seconds libtorrent -will keep UDP tracker connection tokens around for. This is -specified to be 60 seconds, and defaults to that. The higher this -value is, the fewer packets have to be sent to the UDP tracker. In -order for higher values to work, the tracker needs to be configured -to match the expiration time for tokens. - -.. _default_cache_min_age: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| default_cache_min_age | int | 1 | -+-----------------------+------+---------+ - -``default_cache_min_age`` is the minimum number of seconds any read -cache line is kept in the cache. This defaults to one second but -may be greater if ``guided_read_cache`` is enabled. Having a lower -bound on the time a cache line stays in the cache is an attempt -to avoid swapping the same pieces in and out of the cache in case -there is a shortage of spare cache space. - -.. _num_optimistic_unchoke_slots: - -.. raw:: html - - - -+------------------------------+------+---------+ -| name | type | default | -+==============================+======+=========+ -| num_optimistic_unchoke_slots | int | 0 | -+------------------------------+------+---------+ - -``num_optimistic_unchoke_slots`` is the number of optimistic -unchoke slots to use. It defaults to 0, which means automatic. -Having a higher number of optimistic unchoke slots mean you will -find the good peers faster but with the trade-off to use up more -bandwidth. When this is set to 0, libtorrent opens up 20% of your -allowed upload slots as optimistic unchoke slots. - -.. _default_est_reciprocation_rate: - -.. _increase_est_reciprocation_rate: - -.. _decrease_est_reciprocation_rate: - -.. raw:: html - - - - - -+---------------------------------+------+---------+ -| name | type | default | -+=================================+======+=========+ -| default_est_reciprocation_rate | int | 16000 | -+---------------------------------+------+---------+ -| increase_est_reciprocation_rate | int | 20 | -+---------------------------------+------+---------+ -| decrease_est_reciprocation_rate | int | 3 | -+---------------------------------+------+---------+ - -``default_est_reciprocation_rate`` is the assumed reciprocation -rate from peers when using the BitTyrant choker. This defaults to -14 kiB/s. If set too high, you will over-estimate your peers and be -more altruistic while finding the true reciprocation rate, if it's -set too low, you'll be too stingy and waste finding the true -reciprocation rate. - -``increase_est_reciprocation_rate`` specifies how many percent the -estimated reciprocation rate should be increased by each unchoke -interval a peer is still choking us back. This defaults to 20%. -This only applies to the BitTyrant choker. - -``decrease_est_reciprocation_rate`` specifies how many percent the -estimated reciprocation rate should be decreased by each unchoke -interval a peer unchokes us. This default to 3%. This only applies -to the BitTyrant choker. - -.. _max_pex_peers: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| max_pex_peers | int | 50 | -+---------------+------+---------+ - -the max number of peers we accept from pex messages from a single -peer. this limits the number of concurrent peers any of our peers -claims to be connected to. If they claim to be connected to more -than this, we'll ignore any peer that exceeds this limit - -.. _tick_interval: - -.. raw:: html - - - -+---------------+------+---------+ -| name | type | default | -+===============+======+=========+ -| tick_interval | int | 500 | -+---------------+------+---------+ - -``tick_interval`` specifies the number of milliseconds between -internal ticks. This is the frequency with which bandwidth quota is -distributed to peers. It should not be more than one second (i.e. -1000 ms). Setting this to a low value (around 100) means higher -resolution bandwidth quota distribution, setting it to a higher -value saves CPU cycles. - -.. _share_mode_target: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| share_mode_target | int | 3 | -+-------------------+------+---------+ - -``share_mode_target`` specifies the target share ratio for share -mode torrents. This defaults to 3, meaning we'll try to upload 3 -times as much as we download. Setting this very high, will make it -very conservative and you might end up not downloading anything -ever (and not affecting your share ratio). It does not make any -sense to set this any lower than 2. For instance, if only 3 peers -need to download the rarest piece, it's impossible to download a -single piece and upload it more than 3 times. If the -share_mode_target is set to more than 3, nothing is downloaded. - -.. _upload_rate_limit: - -.. _download_rate_limit: - -.. raw:: html - - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| upload_rate_limit | int | 0 | -+---------------------+------+---------+ -| download_rate_limit | int | 0 | -+---------------------+------+---------+ - -``upload_rate_limit``, ``download_rate_limit``, -``local_upload_rate_limit`` and ``local_download_rate_limit`` sets -the session-global limits of upload and download rate limits, in -bytes per second. The local rates refer to peers on the local -network. By default peers on the local network are not rate -limited. - -These rate limits are only used for local peers (peers within the -same subnet as the client itself) and it is only used when -``ignore_limits_on_local_network`` is set to true (which it is by -default). These rate limits default to unthrottled, but can be -useful in case you want to treat local peers preferentially, but -not quite unthrottled. - -A value of 0 means unlimited. - -.. _dht_upload_rate_limit: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| dht_upload_rate_limit | int | 4000 | -+-----------------------+------+---------+ - -``dht_upload_rate_limit`` sets the rate limit on the DHT. This is -specified in bytes per second and defaults to 4000. For busy boxes -with lots of torrents that requires more DHT traffic, this should -be raised. - -.. _unchoke_slots_limit: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| unchoke_slots_limit | int | 8 | -+---------------------+------+---------+ - -``unchoke_slots_limit`` is the max number of unchoked peers in the -session. The number of unchoke slots may be ignored depending on -what ``choking_algorithm`` is set to. - -.. _connections_limit: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| connections_limit | int | 200 | -+-------------------+------+---------+ - -``connections_limit`` sets a global limit on the number of -connections opened. The number of connections is set to a hard -minimum of at least two per torrent, so if you set a too low -connections limit, and open too many torrents, the limit will not -be met. - -.. _connections_slack: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| connections_slack | int | 10 | -+-------------------+------+---------+ - -``connections_slack`` is the the number of incoming connections -exceeding the connection limit to accept in order to potentially -replace existing ones. - -.. _utp_target_delay: - -.. _utp_gain_factor: - -.. _utp_min_timeout: - -.. _utp_syn_resends: - -.. _utp_fin_resends: - -.. _utp_num_resends: - -.. _utp_connect_timeout: - -.. _utp_loss_multiplier: - -.. raw:: html - - - - - - - - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| utp_target_delay | int | 100 | -+---------------------+------+---------+ -| utp_gain_factor | int | 3000 | -+---------------------+------+---------+ -| utp_min_timeout | int | 500 | -+---------------------+------+---------+ -| utp_syn_resends | int | 2 | -+---------------------+------+---------+ -| utp_fin_resends | int | 2 | -+---------------------+------+---------+ -| utp_num_resends | int | 3 | -+---------------------+------+---------+ -| utp_connect_timeout | int | 3000 | -+---------------------+------+---------+ -| utp_loss_multiplier | int | 50 | -+---------------------+------+---------+ - -``utp_target_delay`` is the target delay for uTP sockets in -milliseconds. A high value will make uTP connections more -aggressive and cause longer queues in the upload bottleneck. It -cannot be too low, since the noise in the measurements would cause -it to send too slow. The default is 50 milliseconds. -``utp_gain_factor`` is the number of bytes the uTP congestion -window can increase at the most in one RTT. This defaults to 300 -bytes. If this is set too high, the congestion controller reacts -too hard to noise and will not be stable, if it's set too low, it -will react slow to congestion and not back off as fast. -``utp_min_timeout`` is the shortest allowed uTP socket timeout, -specified in milliseconds. This defaults to 500 milliseconds. The -timeout depends on the RTT of the connection, but is never smaller -than this value. A connection times out when every packet in a -window is lost, or when a packet is lost twice in a row (i.e. the -resent packet is lost as well). - -The shorter the timeout is, the faster the connection will recover -from this situation, assuming the RTT is low enough. -``utp_syn_resends`` is the number of SYN packets that are sent (and -timed out) before giving up and closing the socket. -``utp_num_resends`` is the number of times a packet is sent (and -lossed or timed out) before giving up and closing the connection. -``utp_connect_timeout`` is the number of milliseconds of timeout -for the initial SYN packet for uTP connections. For each timed out -packet (in a row), the timeout is doubled. ``utp_loss_multiplier`` -controls how the congestion window is changed when a packet loss is -experienced. It's specified as a percentage multiplier for -``cwnd``. By default it's set to 50 (i.e. cut in half). Do not -change this value unless you know what you're doing. Never set it -higher than 100. - -.. _mixed_mode_algorithm: - -.. raw:: html - - - -+----------------------+------+----------------------------------+ -| name | type | default | -+======================+======+==================================+ -| mixed_mode_algorithm | int | settings_pack::peer_proportional | -+----------------------+------+----------------------------------+ - -The ``mixed_mode_algorithm`` determines how to treat TCP -connections when there are uTP connections. Since uTP is designed -to yield to TCP, there's an inherent problem when using swarms that -have both TCP and uTP connections. If nothing is done, uTP -connections would often be starved out for bandwidth by the TCP -connections. This mode is ``prefer_tcp``. The ``peer_proportional`` -mode simply looks at the current throughput and rate limits all TCP -connections to their proportional share based on how many of the -connections are TCP. This works best if uTP connections are not -rate limited by the global rate limiter (which they aren't by -default). - -.. _listen_queue_size: - -.. raw:: html - - - -+-------------------+------+---------+ -| name | type | default | -+===================+======+=========+ -| listen_queue_size | int | 5 | -+-------------------+------+---------+ - -``listen_queue_size`` is the value passed in to listen() for the -listen socket. It is the number of outstanding incoming connections -to queue up while we're not actively waiting for a connection to be -accepted. The default is 5 which should be sufficient for any -normal client. If this is a high performance server which expects -to receive a lot of connections, or used in a simulator or test, it -might make sense to raise this number. It will not take affect -until listen_on() is called again (or for the first time). - -.. _torrent_connect_boost: - -.. raw:: html - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| torrent_connect_boost | int | 10 | -+-----------------------+------+---------+ - -``torrent_connect_boost`` is the number of peers to try to connect -to immediately when the first tracker response is received for a -torrent. This is a boost to given to new torrents to accelerate -them starting up. The normal connect scheduler is run once every -second, this allows peers to be connected immediately instead of -waiting for the session tick to trigger connections. - -.. _alert_queue_size: - -.. raw:: html - - - -+------------------+------+---------+ -| name | type | default | -+==================+======+=========+ -| alert_queue_size | int | 1000 | -+------------------+------+---------+ - -``alert_queue_size`` is the maximum number of alerts queued up -internally. If alerts are not popped, the queue will eventually -fill up to this level. - -.. _max_metadata_size: - -.. raw:: html - - - -+-------------------+------+------------------+ -| name | type | default | -+===================+======+==================+ -| max_metadata_size | int | 3 * 1024 * 10240 | -+-------------------+------+------------------+ - -``max_metadata_size`` is the maximum allowed size (in bytes) to be -received by the metadata extension, i.e. magnet links. - -.. _hashing_threads: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| hashing_threads | int | 1 | -+-----------------+------+---------+ - -``hashing_threads`` is the number of threads to use for piece hash -verification. It defaults to 1. For very high download rates, on -machines with multiple cores, this could be incremented. Setting it -higher than the number of CPU cores would presumably not provide -any benefit of setting it to the number of cores. If it's set to 0, -hashing is done in the disk thread. - -.. _checking_mem_usage: - -.. raw:: html - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| checking_mem_usage | int | 256 | -+--------------------+------+---------+ - -the number of blocks to keep outstanding at any given time when -checking torrents. Higher numbers give faster re-checks but uses -more memory. Specified in number of 16 kiB blocks - -.. _predictive_piece_announce: - -.. raw:: html - - - -+---------------------------+------+---------+ -| name | type | default | -+===========================+======+=========+ -| predictive_piece_announce | int | 0 | -+---------------------------+------+---------+ - -if set to > 0, pieces will be announced to other peers before they -are fully downloaded (and before they are hash checked). The -intention is to gain 1.5 potential round trip times per downloaded -piece. When non-zero, this indicates how many milliseconds in -advance pieces should be announced, before they are expected to be -completed. - -.. _aio_threads: - -.. _aio_max: - -.. raw:: html - - - - -+-------------+------+---------+ -| name | type | default | -+=============+======+=========+ -| aio_threads | int | 4 | -+-------------+------+---------+ -| aio_max | int | 300 | -+-------------+------+---------+ - -for some aio back-ends, ``aio_threads`` specifies the number of -io-threads to use, and ``aio_max`` the max number of outstanding -jobs. - -.. _network_threads: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| network_threads | int | 0 | -+-----------------+------+---------+ - -``network_threads`` is the number of threads to use to call -``async_write_some`` (i.e. send) on peer connection sockets. When -seeding at extremely high rates, this may become a bottleneck, and -setting this to 2 or more may parallelize that cost. When using SSL -torrents, all encryption for outgoing traffic is done within the -socket send functions, and this will help parallelizing the cost of -SSL encryption as well. - -.. _ssl_listen: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| ssl_listen | int | 4433 | -+------------+------+---------+ - -``ssl_listen`` sets the listen port for SSL connections. If this is -set to 0, no SSL listen port is opened. Otherwise a socket is -opened on this port. This setting is only taken into account when -opening the regular listen port, and won't re-open the listen -socket simply by changing this setting. - -.. _tracker_backoff: - -.. raw:: html - - - -+-----------------+------+---------+ -| name | type | default | -+=================+======+=========+ -| tracker_backoff | int | 250 | -+-----------------+------+---------+ - -``tracker_backoff`` determines how aggressively to back off from -retrying failing trackers. This value determines *x* in the -following formula, determining the number of seconds to wait until -the next retry: - - delay = 5 + 5 * x / 100 * fails^2 - -This setting may be useful to make libtorrent more or less -aggressive in hitting trackers. - -.. _share_ratio_limit: - -.. _seed_time_ratio_limit: - -.. raw:: html - - - - -+-----------------------+------+---------+ -| name | type | default | -+=======================+======+=========+ -| share_ratio_limit | int | 200 | -+-----------------------+------+---------+ -| seed_time_ratio_limit | int | 700 | -+-----------------------+------+---------+ - -when a seeding torrent reaches either the share ratio (bytes up / -bytes down) or the seed time ratio (seconds as seed / seconds as -downloader) or the seed time limit (seconds as seed) it is -considered done, and it will leave room for other torrents these -are specified as percentages - -.. _peer_turnover: - -.. _peer_turnover_cutoff: - -.. _peer_turnover_interval: - -.. raw:: html - - - - - -+------------------------+------+---------+ -| name | type | default | -+========================+======+=========+ -| peer_turnover | int | 4 | -+------------------------+------+---------+ -| peer_turnover_cutoff | int | 90 | -+------------------------+------+---------+ -| peer_turnover_interval | int | 300 | -+------------------------+------+---------+ - -peer_turnover is the percentage of peers to disconnect every -turnover peer_turnover_interval (if we're at the peer limit), this -is specified in percent when we are connected to more than limit * -peer_turnover_cutoff peers disconnect peer_turnover fraction of the -peers. It is specified in percent peer_turnover_interval is the -interval (in seconds) between optimistic disconnects if the -disconnects happen and how many peers are disconnected is -controlled by peer_turnover and peer_turnover_cutoff - -.. _connect_seed_every_n_download: - -.. raw:: html - - - -+-------------------------------+------+---------+ -| name | type | default | -+===============================+======+=========+ -| connect_seed_every_n_download | int | 10 | -+-------------------------------+------+---------+ - -this setting controls the priority of downloading torrents over -seeding or finished torrents when it comes to making peer -connections. Peer connections are throttled by the connection_speed -and the half-open connection limit. This makes peer connections a -limited resource. Torrents that still have pieces to download are -prioritized by default, to avoid having many seeding torrents use -most of the connection attempts and only give one peer every now -and then to the downloading torrent. libtorrent will loop over the -downloading torrents to connect a peer each, and every n:th -connection attempt, a finished torrent is picked to be allowed to -connect to a peer. This setting controls n. - -.. _max_http_recv_buffer_size: - -.. raw:: html - - - -+---------------------------+------+------------+ -| name | type | default | -+===========================+======+============+ -| max_http_recv_buffer_size | int | 4*1024*204 | -+---------------------------+------+------------+ - -the max number of bytes to allow an HTTP response to be when -announcing to trackers or downloading .torrent files via the -``url`` provided in ``add_torrent_params``. - -.. _max_retry_port_bind: - -.. raw:: html - - - -+---------------------+------+---------+ -| name | type | default | -+=====================+======+=========+ -| max_retry_port_bind | int | 10 | -+---------------------+------+---------+ - -if binding to a specific port fails, should the port be incremented -by one and tried again? This setting specifies how many times to -retry a failed port bind - -.. _alert_mask: - -.. raw:: html - - - -+------------+------+---------------------------+ -| name | type | default | -+============+======+===========================+ -| alert_mask | int | alert::error_notification | -+------------+------+---------------------------+ - -a bitmask combining flags from alert::category_t defining which -kinds of alerts to receive - -.. _out_enc_policy: - -.. _in_enc_policy: - -.. raw:: html - - - - -+----------------+------+---------------------------+ -| name | type | default | -+================+======+===========================+ -| out_enc_policy | int | settings_pack::pe_enabled | -+----------------+------+---------------------------+ -| in_enc_policy | int | settings_pack::pe_enabled | -+----------------+------+---------------------------+ - -control the settings for incoming and outgoing connections -respectively. see enc_policy enum for the available options. -Keep in mind that protocol encryption degrades performance in -several respects: - -1. It prevents "zero copy" disk buffers being sent to peers, since - each peer needs to mutate the data (i.e. encrypt it) the data - must be copied per peer connection rather than sending the same - buffer to multiple peers. -2. The encryption itself requires more CPU than plain bittorrent - protocol. The highest cost is the Diffie Hellman exchange on - connection setup. -3. The encryption handshake adds several round-trips to the - connection setup, and delays transferring data. - -.. _allowed_enc_level: - -.. raw:: html - - - -+-------------------+------+------------------------+ -| name | type | default | -+===================+======+========================+ -| allowed_enc_level | int | settings_pack::pe_both | -+-------------------+------+------------------------+ - -determines the encryption level of the connections. This setting -will adjust which encryption scheme is offered to the other peer, -as well as which encryption scheme is selected by the client. See -enc_level enum for options. - -.. _inactive_down_rate: - -.. _inactive_up_rate: - -.. raw:: html - - - - -+--------------------+------+---------+ -| name | type | default | -+====================+======+=========+ -| inactive_down_rate | int | 2048 | -+--------------------+------+---------+ -| inactive_up_rate | int | 2048 | -+--------------------+------+---------+ - -the download and upload rate limits for a torrent to be considered -active by the queuing mechanism. A torrent whose download rate is -less than ``inactive_down_rate`` and whose upload rate is less than -``inactive_up_rate`` for ``auto_manage_startup`` seconds, is -considered inactive, and another queued torrent may be started. -This logic is disabled if ``dont_count_slow_torrents`` is false. - -.. _proxy_type: - -.. raw:: html - - - -+------------+------+---------------------+ -| name | type | default | -+============+======+=====================+ -| proxy_type | int | settings_pack::none | -+------------+------+---------------------+ - -proxy to use, defaults to none. see proxy_type_t. - -.. _proxy_port: - -.. raw:: html - - - -+------------+------+---------+ -| name | type | default | -+============+======+=========+ -| proxy_port | int | 0 | -+------------+------+---------+ - -the port of the proxy server - -.. _i2p_port: - -.. raw:: html - - - -+----------+------+---------+ -| name | type | default | -+==========+======+=========+ -| i2p_port | int | 0 | -+----------+------+---------+ - -sets the i2p_ SAM bridge port to connect to. set the hostname with -the ``i2p_hostname`` setting. - -.. _i2p: http://www.i2p2.de - diff --git a/docs/stats_counters.rst b/docs/stats_counters.rst deleted file mode 100644 index f3f8bfc47..000000000 --- a/docs/stats_counters.rst +++ /dev/null @@ -1,2031 +0,0 @@ -.. _peer.error_peers: - -.. _peer.disconnected_peers: - -.. raw:: html - - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| peer.error_peers | counter | -+-------------------------+---------+ -| peer.disconnected_peers | counter | -+-------------------------+---------+ - - -``error_peers`` is the total number of peer disconnects -caused by an error (not initiated by this client) and -disconnected initiated by this client (``disconnected_peers``). - -.. _peer.eof_peers: - -.. _peer.connreset_peers: - -.. _peer.connrefused_peers: - -.. _peer.connaborted_peers: - -.. _peer.notconnected_peers: - -.. _peer.perm_peers: - -.. _peer.buffer_peers: - -.. _peer.unreachable_peers: - -.. _peer.broken_pipe_peers: - -.. _peer.addrinuse_peers: - -.. _peer.no_access_peers: - -.. _peer.invalid_arg_peers: - -.. _peer.aborted_peers: - -.. raw:: html - - - - - - - - - - - - - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| peer.eof_peers | counter | -+-------------------------+---------+ -| peer.connreset_peers | counter | -+-------------------------+---------+ -| peer.connrefused_peers | counter | -+-------------------------+---------+ -| peer.connaborted_peers | counter | -+-------------------------+---------+ -| peer.notconnected_peers | counter | -+-------------------------+---------+ -| peer.perm_peers | counter | -+-------------------------+---------+ -| peer.buffer_peers | counter | -+-------------------------+---------+ -| peer.unreachable_peers | counter | -+-------------------------+---------+ -| peer.broken_pipe_peers | counter | -+-------------------------+---------+ -| peer.addrinuse_peers | counter | -+-------------------------+---------+ -| peer.no_access_peers | counter | -+-------------------------+---------+ -| peer.invalid_arg_peers | counter | -+-------------------------+---------+ -| peer.aborted_peers | counter | -+-------------------------+---------+ - - -these counters break down the peer errors into more specific -categories. These errors are what the underlying transport -reported (i.e. TCP or uTP) - -.. _peer.piece_requests: - -.. _peer.max_piece_requests: - -.. _peer.invalid_piece_requests: - -.. _peer.choked_piece_requests: - -.. _peer.cancelled_piece_requests: - -.. _peer.piece_rejects: - -.. raw:: html - - - - - - - - -+-------------------------------+---------+ -| name | type | -+===============================+=========+ -| peer.piece_requests | counter | -+-------------------------------+---------+ -| peer.max_piece_requests | counter | -+-------------------------------+---------+ -| peer.invalid_piece_requests | counter | -+-------------------------------+---------+ -| peer.choked_piece_requests | counter | -+-------------------------------+---------+ -| peer.cancelled_piece_requests | counter | -+-------------------------------+---------+ -| peer.piece_rejects | counter | -+-------------------------------+---------+ - - -the total number of incoming piece requests we've received followed -by the number of rejected piece requests for various reasons. -max_piece_requests mean we already had too many outstanding requests -from this peer, so we rejected it. cancelled_piece_requests are ones -where the other end explicitly asked for the piece to be rejected. - -.. _peer.error_incoming_peers: - -.. _peer.error_outgoing_peers: - -.. raw:: html - - - - -+---------------------------+---------+ -| name | type | -+===========================+=========+ -| peer.error_incoming_peers | counter | -+---------------------------+---------+ -| peer.error_outgoing_peers | counter | -+---------------------------+---------+ - - -these counters break down the peer errors into -whether they happen on incoming or outgoing peers. - -.. _peer.error_rc4_peers: - -.. _peer.error_encrypted_peers: - -.. raw:: html - - - - -+----------------------------+---------+ -| name | type | -+============================+=========+ -| peer.error_rc4_peers | counter | -+----------------------------+---------+ -| peer.error_encrypted_peers | counter | -+----------------------------+---------+ - - -these counters break down the peer errors into -whether they happen on encrypted peers (just -encrypted handshake) and rc4 peers (full stream -encryption). These can indicate whether encrypted -peers are more or less likely to fail - -.. _peer.error_tcp_peers: - -.. _peer.error_utp_peers: - -.. raw:: html - - - - -+----------------------+---------+ -| name | type | -+======================+=========+ -| peer.error_tcp_peers | counter | -+----------------------+---------+ -| peer.error_utp_peers | counter | -+----------------------+---------+ - - -these counters break down the peer errors into -whether they happen on uTP peers or TCP peers. -these may indicate whether one protocol is -more error prone - -.. _peer.connect_timeouts: - -.. _peer.uninteresting_peers: - -.. _peer.timeout_peers: - -.. _peer.no_memory_peers: - -.. _peer.too_many_peers: - -.. _peer.transport_timeout_peers: - -.. _peer.num_banned_peers: - -.. _peer.banned_for_hash_failure: - -.. _peer.connection_attempts: - -.. _peer.connection_attempt_loops: - -.. _peer.incoming_connections: - -.. raw:: html - - - - - - - - - - - - - -+-------------------------------+---------+ -| name | type | -+===============================+=========+ -| peer.connect_timeouts | counter | -+-------------------------------+---------+ -| peer.uninteresting_peers | counter | -+-------------------------------+---------+ -| peer.timeout_peers | counter | -+-------------------------------+---------+ -| peer.no_memory_peers | counter | -+-------------------------------+---------+ -| peer.too_many_peers | counter | -+-------------------------------+---------+ -| peer.transport_timeout_peers | counter | -+-------------------------------+---------+ -| peer.num_banned_peers | counter | -+-------------------------------+---------+ -| peer.banned_for_hash_failure | counter | -+-------------------------------+---------+ -| peer.connection_attempts | counter | -+-------------------------------+---------+ -| peer.connection_attempt_loops | counter | -+-------------------------------+---------+ -| peer.incoming_connections | counter | -+-------------------------------+---------+ - - -these counters break down the reasons to -disconnect peers. - -.. _peer.num_tcp_peers: - -.. _peer.num_socks5_peers: - -.. _peer.num_http_proxy_peers: - -.. _peer.num_utp_peers: - -.. _peer.num_i2p_peers: - -.. _peer.num_ssl_peers: - -.. _peer.num_ssl_socks5_peers: - -.. _peer.num_ssl_http_proxy_peers: - -.. _peer.num_ssl_utp_peers: - -.. _peer.num_peers_half_open: - -.. _peer.num_peers_connected: - -.. _peer.num_peers_up_interested: - -.. _peer.num_peers_down_interested: - -.. _peer.num_peers_up_unchoked_all: - -.. _peer.num_peers_up_unchoked_optimistic: - -.. _peer.num_peers_up_unchoked: - -.. _peer.num_peers_down_unchoked: - -.. _peer.num_peers_up_requests: - -.. _peer.num_peers_down_requests: - -.. _peer.num_peers_end_game: - -.. _peer.num_peers_up_disk: - -.. _peer.num_peers_down_disk: - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - -+---------------------------------------+---------+ -| name | type | -+=======================================+=========+ -| peer.num_tcp_peers | counter | -+---------------------------------------+---------+ -| peer.num_socks5_peers | counter | -+---------------------------------------+---------+ -| peer.num_http_proxy_peers | counter | -+---------------------------------------+---------+ -| peer.num_utp_peers | counter | -+---------------------------------------+---------+ -| peer.num_i2p_peers | counter | -+---------------------------------------+---------+ -| peer.num_ssl_peers | counter | -+---------------------------------------+---------+ -| peer.num_ssl_socks5_peers | counter | -+---------------------------------------+---------+ -| peer.num_ssl_http_proxy_peers | counter | -+---------------------------------------+---------+ -| peer.num_ssl_utp_peers | counter | -+---------------------------------------+---------+ -| peer.num_peers_half_open | counter | -+---------------------------------------+---------+ -| peer.num_peers_connected | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_interested | counter | -+---------------------------------------+---------+ -| peer.num_peers_down_interested | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_unchoked_all | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_unchoked_optimistic | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_unchoked | counter | -+---------------------------------------+---------+ -| peer.num_peers_down_unchoked | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_requests | counter | -+---------------------------------------+---------+ -| peer.num_peers_down_requests | counter | -+---------------------------------------+---------+ -| peer.num_peers_end_game | counter | -+---------------------------------------+---------+ -| peer.num_peers_up_disk | counter | -+---------------------------------------+---------+ -| peer.num_peers_down_disk | counter | -+---------------------------------------+---------+ - - -the number of peer connections for each kind of socket. -these counts include half-open (connecting) peers. -``num_peers_up_unchoked_all`` is the total number of unchoked peers, -whereas ``num_peers_up_unchoked`` only are unchoked peers that count -against the limit (i.e. excluding peers that are unchoked because the -limit doesn't apply to them). ``num_peers_up_unchoked_optimistic`` is -the number of optimistically unchoked peers. - -.. _net.on_read_counter: - -.. _net.on_write_counter: - -.. _net.on_tick_counter: - -.. _net.on_lsd_counter: - -.. _net.on_lsd_peer_counter: - -.. _net.on_udp_counter: - -.. _net.on_accept_counter: - -.. _net.on_disk_queue_counter: - -.. _net.on_disk_counter: - -.. raw:: html - - - - - - - - - - - -+---------------------------+---------+ -| name | type | -+===========================+=========+ -| net.on_read_counter | counter | -+---------------------------+---------+ -| net.on_write_counter | counter | -+---------------------------+---------+ -| net.on_tick_counter | counter | -+---------------------------+---------+ -| net.on_lsd_counter | counter | -+---------------------------+---------+ -| net.on_lsd_peer_counter | counter | -+---------------------------+---------+ -| net.on_udp_counter | counter | -+---------------------------+---------+ -| net.on_accept_counter | counter | -+---------------------------+---------+ -| net.on_disk_queue_counter | counter | -+---------------------------+---------+ -| net.on_disk_counter | counter | -+---------------------------+---------+ - - -These counters count the number of times the -network thread wakes up for each respective -reason. If these counters are very large, it -may indicate a performance issue, causing the -network thread to wake up too ofte, wasting CPU. -mitigate it by increasing buffers and limits -for the specific trigger that wakes up the -thread. - -.. _net.sent_payload_bytes: - -.. _net.sent_bytes: - -.. _net.sent_ip_overhead_bytes: - -.. _net.sent_tracker_bytes: - -.. _net.recv_payload_bytes: - -.. _net.recv_bytes: - -.. _net.recv_ip_overhead_bytes: - -.. _net.recv_tracker_bytes: - -.. raw:: html - - - - - - - - - - -+----------------------------+---------+ -| name | type | -+============================+=========+ -| net.sent_payload_bytes | counter | -+----------------------------+---------+ -| net.sent_bytes | counter | -+----------------------------+---------+ -| net.sent_ip_overhead_bytes | counter | -+----------------------------+---------+ -| net.sent_tracker_bytes | counter | -+----------------------------+---------+ -| net.recv_payload_bytes | counter | -+----------------------------+---------+ -| net.recv_bytes | counter | -+----------------------------+---------+ -| net.recv_ip_overhead_bytes | counter | -+----------------------------+---------+ -| net.recv_tracker_bytes | counter | -+----------------------------+---------+ - - -total number of bytes sent and received by the session - -.. _net.limiter_up_queue: - -.. _net.limiter_down_queue: - -.. raw:: html - - - - -+------------------------+---------+ -| name | type | -+========================+=========+ -| net.limiter_up_queue | counter | -+------------------------+---------+ -| net.limiter_down_queue | counter | -+------------------------+---------+ - - -the number of sockets currently waiting for upload and download -bandwidht from the rate limiter. - -.. _net.limiter_up_bytes: - -.. _net.limiter_down_bytes: - -.. raw:: html - - - - -+------------------------+---------+ -| name | type | -+========================+=========+ -| net.limiter_up_bytes | counter | -+------------------------+---------+ -| net.limiter_down_bytes | counter | -+------------------------+---------+ - - -the number of upload and download bytes waiting to be handed out from -the rate limiter. - -.. _net.recv_failed_bytes: - -.. raw:: html - - - -+-----------------------+---------+ -| name | type | -+=======================+=========+ -| net.recv_failed_bytes | counter | -+-----------------------+---------+ - - -the number of bytes downloaded that had to be discarded because they -failed the hash check - -.. _net.recv_redundant_bytes: - -.. raw:: html - - - -+--------------------------+---------+ -| name | type | -+==========================+=========+ -| net.recv_redundant_bytes | counter | -+--------------------------+---------+ - - -the number of downloaded bytes that were discarded because they -were downloaded multiple times (from different peers) - -.. _net.has_incoming_connections: - -.. raw:: html - - - -+------------------------------+---------+ -| name | type | -+==============================+=========+ -| net.has_incoming_connections | counter | -+------------------------------+---------+ - - -is false by default and set to true when -the first incoming connection is established -this is used to know if the client is behind -NAT or not. - -.. _ses.num_checking_torrents: - -.. _ses.num_stopped_torrents: - -.. _ses.num_upload_only_torrents: - -.. _ses.num_downloading_torrents: - -.. _ses.num_seeding_torrents: - -.. _ses.num_queued_seeding_torrents: - -.. _ses.num_queued_download_torrents: - -.. _ses.num_error_torrents: - -.. raw:: html - - - - - - - - - - -+----------------------------------+---------+ -| name | type | -+==================================+=========+ -| ses.num_checking_torrents | counter | -+----------------------------------+---------+ -| ses.num_stopped_torrents | counter | -+----------------------------------+---------+ -| ses.num_upload_only_torrents | counter | -+----------------------------------+---------+ -| ses.num_downloading_torrents | counter | -+----------------------------------+---------+ -| ses.num_seeding_torrents | counter | -+----------------------------------+---------+ -| ses.num_queued_seeding_torrents | counter | -+----------------------------------+---------+ -| ses.num_queued_download_torrents | counter | -+----------------------------------+---------+ -| ses.num_error_torrents | counter | -+----------------------------------+---------+ - - -these gauges count the number of torrents in -different states. Each torrent only belongs to -one of these states. For torrents that could -belong to multiple of these, the most prominent -in picked. For instance, a torrent with an error -counts as an error-torrent, regardless of its other -state. - -.. _ses.non_filter_torrents: - -.. raw:: html - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| ses.non_filter_torrents | counter | -+-------------------------+---------+ - - -the number of torrents that don't have the -IP filter applied to them. - -.. _ses.num_loaded_torrents: - -.. _ses.num_pinned_torrents: - -.. raw:: html - - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| ses.num_loaded_torrents | counter | -+-------------------------+---------+ -| ses.num_pinned_torrents | counter | -+-------------------------+---------+ - - -the number of torrents that are currently loaded - -.. _ses.num_piece_passed: - -.. _ses.num_piece_failed: - -.. _ses.num_have_pieces: - -.. _ses.num_total_pieces_added: - -.. raw:: html - - - - - - -+----------------------------+---------+ -| name | type | -+============================+=========+ -| ses.num_piece_passed | counter | -+----------------------------+---------+ -| ses.num_piece_failed | counter | -+----------------------------+---------+ -| ses.num_have_pieces | counter | -+----------------------------+---------+ -| ses.num_total_pieces_added | counter | -+----------------------------+---------+ - - -these count the number of times a piece has passed the -hash check, the number of times a piece was successfully -written to disk and the number of total possible pieces -added by adding torrents. e.g. when adding a torrent with -1000 piece, num_total_pieces_added is incremented by 1000. - -.. _ses.torrent_evicted_counter: - -.. raw:: html - - - -+-----------------------------+---------+ -| name | type | -+=============================+=========+ -| ses.torrent_evicted_counter | counter | -+-----------------------------+---------+ - - -this counts the number of times a torrent has been -evicted (only applies when `dynamic loading of torrent files`_ -is enabled). - -.. _ses.num_unchoke_slots: - -.. raw:: html - - - -+-----------------------+---------+ -| name | type | -+=======================+=========+ -| ses.num_unchoke_slots | counter | -+-----------------------+---------+ - - -the number of allowed unchoked peers - -.. _ses.num_incoming_choke: - -.. _ses.num_incoming_unchoke: - -.. _ses.num_incoming_interested: - -.. _ses.num_incoming_not_interested: - -.. _ses.num_incoming_have: - -.. _ses.num_incoming_bitfield: - -.. _ses.num_incoming_request: - -.. _ses.num_incoming_piece: - -.. _ses.num_incoming_cancel: - -.. _ses.num_incoming_dht_port: - -.. _ses.num_incoming_suggest: - -.. _ses.num_incoming_have_all: - -.. _ses.num_incoming_have_none: - -.. _ses.num_incoming_reject: - -.. _ses.num_incoming_allowed_fast: - -.. _ses.num_incoming_ext_handshake: - -.. _ses.num_incoming_pex: - -.. _ses.num_incoming_metadata: - -.. _ses.num_incoming_extended: - -.. _ses.num_outgoing_choke: - -.. _ses.num_outgoing_unchoke: - -.. _ses.num_outgoing_interested: - -.. _ses.num_outgoing_not_interested: - -.. _ses.num_outgoing_have: - -.. _ses.num_outgoing_bitfield: - -.. _ses.num_outgoing_request: - -.. _ses.num_outgoing_piece: - -.. _ses.num_outgoing_cancel: - -.. _ses.num_outgoing_dht_port: - -.. _ses.num_outgoing_suggest: - -.. _ses.num_outgoing_have_all: - -.. _ses.num_outgoing_have_none: - -.. _ses.num_outgoing_reject: - -.. _ses.num_outgoing_allowed_fast: - -.. _ses.num_outgoing_ext_handshake: - -.. _ses.num_outgoing_pex: - -.. _ses.num_outgoing_metadata: - -.. _ses.num_outgoing_extended: - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+---------------------------------+---------+ -| name | type | -+=================================+=========+ -| ses.num_incoming_choke | counter | -+---------------------------------+---------+ -| ses.num_incoming_unchoke | counter | -+---------------------------------+---------+ -| ses.num_incoming_interested | counter | -+---------------------------------+---------+ -| ses.num_incoming_not_interested | counter | -+---------------------------------+---------+ -| ses.num_incoming_have | counter | -+---------------------------------+---------+ -| ses.num_incoming_bitfield | counter | -+---------------------------------+---------+ -| ses.num_incoming_request | counter | -+---------------------------------+---------+ -| ses.num_incoming_piece | counter | -+---------------------------------+---------+ -| ses.num_incoming_cancel | counter | -+---------------------------------+---------+ -| ses.num_incoming_dht_port | counter | -+---------------------------------+---------+ -| ses.num_incoming_suggest | counter | -+---------------------------------+---------+ -| ses.num_incoming_have_all | counter | -+---------------------------------+---------+ -| ses.num_incoming_have_none | counter | -+---------------------------------+---------+ -| ses.num_incoming_reject | counter | -+---------------------------------+---------+ -| ses.num_incoming_allowed_fast | counter | -+---------------------------------+---------+ -| ses.num_incoming_ext_handshake | counter | -+---------------------------------+---------+ -| ses.num_incoming_pex | counter | -+---------------------------------+---------+ -| ses.num_incoming_metadata | counter | -+---------------------------------+---------+ -| ses.num_incoming_extended | counter | -+---------------------------------+---------+ -| ses.num_outgoing_choke | counter | -+---------------------------------+---------+ -| ses.num_outgoing_unchoke | counter | -+---------------------------------+---------+ -| ses.num_outgoing_interested | counter | -+---------------------------------+---------+ -| ses.num_outgoing_not_interested | counter | -+---------------------------------+---------+ -| ses.num_outgoing_have | counter | -+---------------------------------+---------+ -| ses.num_outgoing_bitfield | counter | -+---------------------------------+---------+ -| ses.num_outgoing_request | counter | -+---------------------------------+---------+ -| ses.num_outgoing_piece | counter | -+---------------------------------+---------+ -| ses.num_outgoing_cancel | counter | -+---------------------------------+---------+ -| ses.num_outgoing_dht_port | counter | -+---------------------------------+---------+ -| ses.num_outgoing_suggest | counter | -+---------------------------------+---------+ -| ses.num_outgoing_have_all | counter | -+---------------------------------+---------+ -| ses.num_outgoing_have_none | counter | -+---------------------------------+---------+ -| ses.num_outgoing_reject | counter | -+---------------------------------+---------+ -| ses.num_outgoing_allowed_fast | counter | -+---------------------------------+---------+ -| ses.num_outgoing_ext_handshake | counter | -+---------------------------------+---------+ -| ses.num_outgoing_pex | counter | -+---------------------------------+---------+ -| ses.num_outgoing_metadata | counter | -+---------------------------------+---------+ -| ses.num_outgoing_extended | counter | -+---------------------------------+---------+ - - -bittorrent message counters. These counters are incremented -every time a message of the corresponding type is received from -or sent to a bittorrent peer. - -.. _ses.waste_piece_timed_out: - -.. _ses.waste_piece_cancelled: - -.. _ses.waste_piece_unknown: - -.. _ses.waste_piece_seed: - -.. _ses.waste_piece_end_game: - -.. _ses.waste_piece_closing: - -.. raw:: html - - - - - - - - -+---------------------------+---------+ -| name | type | -+===========================+=========+ -| ses.waste_piece_timed_out | counter | -+---------------------------+---------+ -| ses.waste_piece_cancelled | counter | -+---------------------------+---------+ -| ses.waste_piece_unknown | counter | -+---------------------------+---------+ -| ses.waste_piece_seed | counter | -+---------------------------+---------+ -| ses.waste_piece_end_game | counter | -+---------------------------+---------+ -| ses.waste_piece_closing | counter | -+---------------------------+---------+ - - -the number of wasted downloaded bytes by reason of the bytes being -wasted. - -.. _picker.piece_picker_partial_loops: - -.. _picker.piece_picker_suggest_loops: - -.. _picker.piece_picker_sequential_loops: - -.. _picker.piece_picker_reverse_rare_loops: - -.. _picker.piece_picker_rare_loops: - -.. _picker.piece_picker_rand_start_loops: - -.. _picker.piece_picker_rand_loops: - -.. _picker.piece_picker_busy_loops: - -.. raw:: html - - - - - - - - - - -+----------------------------------------+---------+ -| name | type | -+========================================+=========+ -| picker.piece_picker_partial_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_suggest_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_sequential_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_reverse_rare_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_rare_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_rand_start_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_rand_loops | counter | -+----------------------------------------+---------+ -| picker.piece_picker_busy_loops | counter | -+----------------------------------------+---------+ - - -the number of pieces considered while picking pieces - -.. _picker.reject_piece_picks: - -.. _picker.unchoke_piece_picks: - -.. _picker.incoming_redundant_piece_picks: - -.. _picker.incoming_piece_picks: - -.. _picker.end_game_piece_picks: - -.. _picker.snubbed_piece_picks: - -.. _picker.interesting_piece_picks: - -.. _picker.hash_fail_piece_picks: - -.. _disk.write_cache_blocks: - -.. _disk.read_cache_blocks: - -.. raw:: html - - - - - - - - - - - - -+---------------------------------------+---------+ -| name | type | -+=======================================+=========+ -| picker.reject_piece_picks | counter | -+---------------------------------------+---------+ -| picker.unchoke_piece_picks | counter | -+---------------------------------------+---------+ -| picker.incoming_redundant_piece_picks | counter | -+---------------------------------------+---------+ -| picker.incoming_piece_picks | counter | -+---------------------------------------+---------+ -| picker.end_game_piece_picks | counter | -+---------------------------------------+---------+ -| picker.snubbed_piece_picks | counter | -+---------------------------------------+---------+ -| picker.interesting_piece_picks | counter | -+---------------------------------------+---------+ -| picker.hash_fail_piece_picks | counter | -+---------------------------------------+---------+ -| disk.write_cache_blocks | counter | -+---------------------------------------+---------+ -| disk.read_cache_blocks | counter | -+---------------------------------------+---------+ - - -This breaks down the piece picks into the event that -triggered it - -.. _disk.request_latency: - -.. _disk.pinned_blocks: - -.. _disk.disk_blocks_in_use: - -.. _disk.queued_disk_jobs: - -.. _disk.num_running_disk_jobs: - -.. _disk.num_read_jobs: - -.. _disk.num_write_jobs: - -.. _disk.num_jobs: - -.. _disk.num_writing_threads: - -.. _disk.num_running_threads: - -.. _disk.blocked_disk_jobs: - -.. raw:: html - - - - - - - - - - - - - -+----------------------------+---------+ -| name | type | -+============================+=========+ -| disk.request_latency | counter | -+----------------------------+---------+ -| disk.pinned_blocks | counter | -+----------------------------+---------+ -| disk.disk_blocks_in_use | counter | -+----------------------------+---------+ -| disk.queued_disk_jobs | counter | -+----------------------------+---------+ -| disk.num_running_disk_jobs | counter | -+----------------------------+---------+ -| disk.num_read_jobs | counter | -+----------------------------+---------+ -| disk.num_write_jobs | counter | -+----------------------------+---------+ -| disk.num_jobs | counter | -+----------------------------+---------+ -| disk.num_writing_threads | counter | -+----------------------------+---------+ -| disk.num_running_threads | counter | -+----------------------------+---------+ -| disk.blocked_disk_jobs | counter | -+----------------------------+---------+ - - -the number of microseconds it takes from receiving a request from a -peer until we're sending the response back on the socket. - -.. _disk.queued_write_bytes: - -.. _disk.arc_mru_size: - -.. _disk.arc_mru_ghost_size: - -.. _disk.arc_mfu_size: - -.. _disk.arc_mfu_ghost_size: - -.. _disk.arc_write_size: - -.. _disk.arc_volatile_size: - -.. raw:: html - - - - - - - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| disk.queued_write_bytes | counter | -+-------------------------+---------+ -| disk.arc_mru_size | counter | -+-------------------------+---------+ -| disk.arc_mru_ghost_size | counter | -+-------------------------+---------+ -| disk.arc_mfu_size | counter | -+-------------------------+---------+ -| disk.arc_mfu_ghost_size | counter | -+-------------------------+---------+ -| disk.arc_write_size | counter | -+-------------------------+---------+ -| disk.arc_volatile_size | counter | -+-------------------------+---------+ - - -the number of bytes we have sent to the disk I/O -thread for writing. Every time we hear back from -the disk I/O thread with a completed write job, this -is updated to the number of bytes the disk I/O thread -is actually waiting for to be written (as opposed to -bytes just hanging out in the cache) - -.. _disk.num_blocks_written: - -.. _disk.num_blocks_read: - -.. raw:: html - - - - -+-------------------------+---------+ -| name | type | -+=========================+=========+ -| disk.num_blocks_written | counter | -+-------------------------+---------+ -| disk.num_blocks_read | counter | -+-------------------------+---------+ - - -the number of blocks written and read from disk in total. A block is -16 kiB. - -.. _disk.num_blocks_hashed: - -.. raw:: html - - - -+------------------------+---------+ -| name | type | -+========================+=========+ -| disk.num_blocks_hashed | counter | -+------------------------+---------+ - - -the total number of blocks run through SHA-1 hashing - -.. _disk.num_blocks_cache_hits: - -.. raw:: html - - - -+----------------------------+---------+ -| name | type | -+============================+=========+ -| disk.num_blocks_cache_hits | counter | -+----------------------------+---------+ - - -the number of blocks read from the disk cache - -.. _disk.num_write_ops: - -.. _disk.num_read_ops: - -.. raw:: html - - - - -+--------------------+---------+ -| name | type | -+====================+=========+ -| disk.num_write_ops | counter | -+--------------------+---------+ -| disk.num_read_ops | counter | -+--------------------+---------+ - - -the number of disk I/O operation for reads and writes. One disk -operation may transfer more then one block. - -.. _disk.num_read_back: - -.. raw:: html - - - -+--------------------+---------+ -| name | type | -+====================+=========+ -| disk.num_read_back | counter | -+--------------------+---------+ - - -the number of blocks that had to be read back from disk in order to -hash a piece (when verifying against the piece hash) - -.. _disk.disk_read_time: - -.. _disk.disk_write_time: - -.. _disk.disk_hash_time: - -.. _disk.disk_job_time: - -.. raw:: html - - - - - - -+----------------------+---------+ -| name | type | -+======================+=========+ -| disk.disk_read_time | counter | -+----------------------+---------+ -| disk.disk_write_time | counter | -+----------------------+---------+ -| disk.disk_hash_time | counter | -+----------------------+---------+ -| disk.disk_job_time | counter | -+----------------------+---------+ - - -cumulative time spent in various disk jobs, as well -as total for all disk jobs. Measured in microseconds - -.. _disk.num_fenced_read: - -.. _disk.num_fenced_write: - -.. _disk.num_fenced_hash: - -.. _disk.num_fenced_move_storage: - -.. _disk.num_fenced_release_files: - -.. _disk.num_fenced_delete_files: - -.. _disk.num_fenced_check_fastresume: - -.. _disk.num_fenced_save_resume_data: - -.. _disk.num_fenced_rename_file: - -.. _disk.num_fenced_stop_torrent: - -.. _disk.num_fenced_cache_piece: - -.. _disk.num_fenced_flush_piece: - -.. _disk.num_fenced_flush_hashed: - -.. _disk.num_fenced_flush_storage: - -.. _disk.num_fenced_trim_cache: - -.. _disk.num_fenced_file_priority: - -.. _disk.num_fenced_load_torrent: - -.. _disk.num_fenced_clear_piece: - -.. _disk.num_fenced_tick_storage: - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - -+----------------------------------+---------+ -| name | type | -+==================================+=========+ -| disk.num_fenced_read | counter | -+----------------------------------+---------+ -| disk.num_fenced_write | counter | -+----------------------------------+---------+ -| disk.num_fenced_hash | counter | -+----------------------------------+---------+ -| disk.num_fenced_move_storage | counter | -+----------------------------------+---------+ -| disk.num_fenced_release_files | counter | -+----------------------------------+---------+ -| disk.num_fenced_delete_files | counter | -+----------------------------------+---------+ -| disk.num_fenced_check_fastresume | counter | -+----------------------------------+---------+ -| disk.num_fenced_save_resume_data | counter | -+----------------------------------+---------+ -| disk.num_fenced_rename_file | counter | -+----------------------------------+---------+ -| disk.num_fenced_stop_torrent | counter | -+----------------------------------+---------+ -| disk.num_fenced_cache_piece | counter | -+----------------------------------+---------+ -| disk.num_fenced_flush_piece | counter | -+----------------------------------+---------+ -| disk.num_fenced_flush_hashed | counter | -+----------------------------------+---------+ -| disk.num_fenced_flush_storage | counter | -+----------------------------------+---------+ -| disk.num_fenced_trim_cache | counter | -+----------------------------------+---------+ -| disk.num_fenced_file_priority | counter | -+----------------------------------+---------+ -| disk.num_fenced_load_torrent | counter | -+----------------------------------+---------+ -| disk.num_fenced_clear_piece | counter | -+----------------------------------+---------+ -| disk.num_fenced_tick_storage | counter | -+----------------------------------+---------+ - - -for each kind of disk job, a counter of how many jobs of that kind -are currently blocked by a disk fence - -.. _dht.dht_nodes: - -.. raw:: html - - - -+---------------+---------+ -| name | type | -+===============+=========+ -| dht.dht_nodes | counter | -+---------------+---------+ - - -The number of nodes in the DHT routing table - -.. _dht.dht_node_cache: - -.. raw:: html - - - -+--------------------+---------+ -| name | type | -+====================+=========+ -| dht.dht_node_cache | counter | -+--------------------+---------+ - - -The number of replacement nodes in the DHT routing table - -.. _dht.dht_torrents: - -.. raw:: html - - - -+------------------+---------+ -| name | type | -+==================+=========+ -| dht.dht_torrents | counter | -+------------------+---------+ - - -the number of torrents currently tracked by our DHT node - -.. _dht.dht_peers: - -.. raw:: html - - - -+---------------+---------+ -| name | type | -+===============+=========+ -| dht.dht_peers | counter | -+---------------+---------+ - - -the number of peers currently tracked by our DHT node - -.. _dht.dht_immutable_data: - -.. raw:: html - - - -+------------------------+---------+ -| name | type | -+========================+=========+ -| dht.dht_immutable_data | counter | -+------------------------+---------+ - - -the number of immutable data items tracked by our DHT node - -.. _dht.dht_mutable_data: - -.. raw:: html - - - -+----------------------+---------+ -| name | type | -+======================+=========+ -| dht.dht_mutable_data | counter | -+----------------------+---------+ - - -the number of mutable data items tracked by our DHT node - -.. _dht.dht_allocated_observers: - -.. raw:: html - - - -+-----------------------------+---------+ -| name | type | -+=============================+=========+ -| dht.dht_allocated_observers | counter | -+-----------------------------+---------+ - - -the number of RPC observers currently allocated - -.. _dht.dht_messages_in: - -.. _dht.dht_messages_out: - -.. raw:: html - - - - -+----------------------+---------+ -| name | type | -+======================+=========+ -| dht.dht_messages_in | counter | -+----------------------+---------+ -| dht.dht_messages_out | counter | -+----------------------+---------+ - - -the total number of DHT messages sent and received - -.. _dht.dht_messages_out_dropped: - -.. raw:: html - - - -+------------------------------+---------+ -| name | type | -+==============================+=========+ -| dht.dht_messages_out_dropped | counter | -+------------------------------+---------+ - - -the number of outgoing messages that failed to be -sent - -.. _dht.dht_bytes_in: - -.. _dht.dht_bytes_out: - -.. raw:: html - - - - -+-------------------+---------+ -| name | type | -+===================+=========+ -| dht.dht_bytes_in | counter | -+-------------------+---------+ -| dht.dht_bytes_out | counter | -+-------------------+---------+ - - -the total number of bytes sent and received by the DHT - -.. _dht.dht_ping_in: - -.. _dht.dht_ping_out: - -.. _dht.dht_find_node_in: - -.. _dht.dht_find_node_out: - -.. _dht.dht_get_peers_in: - -.. _dht.dht_get_peers_out: - -.. _dht.dht_announce_peer_in: - -.. _dht.dht_announce_peer_out: - -.. _dht.dht_get_in: - -.. _dht.dht_get_out: - -.. _dht.dht_put_in: - -.. _dht.dht_put_out: - -.. raw:: html - - - - - - - - - - - - - - -+---------------------------+---------+ -| name | type | -+===========================+=========+ -| dht.dht_ping_in | counter | -+---------------------------+---------+ -| dht.dht_ping_out | counter | -+---------------------------+---------+ -| dht.dht_find_node_in | counter | -+---------------------------+---------+ -| dht.dht_find_node_out | counter | -+---------------------------+---------+ -| dht.dht_get_peers_in | counter | -+---------------------------+---------+ -| dht.dht_get_peers_out | counter | -+---------------------------+---------+ -| dht.dht_announce_peer_in | counter | -+---------------------------+---------+ -| dht.dht_announce_peer_out | counter | -+---------------------------+---------+ -| dht.dht_get_in | counter | -+---------------------------+---------+ -| dht.dht_get_out | counter | -+---------------------------+---------+ -| dht.dht_put_in | counter | -+---------------------------+---------+ -| dht.dht_put_out | counter | -+---------------------------+---------+ - - -the number of DHT messages we've sent and received -by kind. - -.. _dht.dht_invalid_announce: - -.. _dht.dht_invalid_get_peers: - -.. _dht.dht_invalid_put: - -.. _dht.dht_invalid_get: - -.. raw:: html - - - - - - -+---------------------------+---------+ -| name | type | -+===========================+=========+ -| dht.dht_invalid_announce | counter | -+---------------------------+---------+ -| dht.dht_invalid_get_peers | counter | -+---------------------------+---------+ -| dht.dht_invalid_put | counter | -+---------------------------+---------+ -| dht.dht_invalid_get | counter | -+---------------------------+---------+ - - -the number of failed incoming DHT requests by kind of request - -.. _utp.utp_packet_loss: - -.. _utp.utp_timeout: - -.. _utp.utp_packets_in: - -.. _utp.utp_packets_out: - -.. _utp.utp_fast_retransmit: - -.. _utp.utp_packet_resend: - -.. _utp.utp_samples_above_target: - -.. _utp.utp_samples_below_target: - -.. _utp.utp_payload_pkts_in: - -.. _utp.utp_payload_pkts_out: - -.. _utp.utp_invalid_pkts_in: - -.. _utp.utp_redundant_pkts_in: - -.. raw:: html - - - - - - - - - - - - - - -+------------------------------+---------+ -| name | type | -+==============================+=========+ -| utp.utp_packet_loss | counter | -+------------------------------+---------+ -| utp.utp_timeout | counter | -+------------------------------+---------+ -| utp.utp_packets_in | counter | -+------------------------------+---------+ -| utp.utp_packets_out | counter | -+------------------------------+---------+ -| utp.utp_fast_retransmit | counter | -+------------------------------+---------+ -| utp.utp_packet_resend | counter | -+------------------------------+---------+ -| utp.utp_samples_above_target | counter | -+------------------------------+---------+ -| utp.utp_samples_below_target | counter | -+------------------------------+---------+ -| utp.utp_payload_pkts_in | counter | -+------------------------------+---------+ -| utp.utp_payload_pkts_out | counter | -+------------------------------+---------+ -| utp.utp_invalid_pkts_in | counter | -+------------------------------+---------+ -| utp.utp_redundant_pkts_in | counter | -+------------------------------+---------+ - - -uTP counters. Each counter represents the number of time each event -has occurred. - -.. _utp.num_utp_idle: - -.. _utp.num_utp_syn_sent: - -.. _utp.num_utp_connected: - -.. _utp.num_utp_fin_sent: - -.. _utp.num_utp_close_wait: - -.. _utp.num_utp_deleted: - -.. raw:: html - - - - - - - - -+------------------------+---------+ -| name | type | -+========================+=========+ -| utp.num_utp_idle | counter | -+------------------------+---------+ -| utp.num_utp_syn_sent | counter | -+------------------------+---------+ -| utp.num_utp_connected | counter | -+------------------------+---------+ -| utp.num_utp_fin_sent | counter | -+------------------------+---------+ -| utp.num_utp_close_wait | counter | -+------------------------+---------+ -| utp.num_utp_deleted | counter | -+------------------------+---------+ - - -the number of uTP sockets in each respective state - -.. _sock_bufs.socket_send_size3: - -.. _sock_bufs.socket_send_size4: - -.. _sock_bufs.socket_send_size5: - -.. _sock_bufs.socket_send_size6: - -.. _sock_bufs.socket_send_size7: - -.. _sock_bufs.socket_send_size8: - -.. _sock_bufs.socket_send_size9: - -.. _sock_bufs.socket_send_size10: - -.. _sock_bufs.socket_send_size11: - -.. _sock_bufs.socket_send_size12: - -.. _sock_bufs.socket_send_size13: - -.. _sock_bufs.socket_send_size14: - -.. _sock_bufs.socket_send_size15: - -.. _sock_bufs.socket_send_size16: - -.. _sock_bufs.socket_send_size17: - -.. _sock_bufs.socket_send_size18: - -.. _sock_bufs.socket_send_size19: - -.. _sock_bufs.socket_send_size20: - -.. _sock_bufs.socket_recv_size3: - -.. _sock_bufs.socket_recv_size4: - -.. _sock_bufs.socket_recv_size5: - -.. _sock_bufs.socket_recv_size6: - -.. _sock_bufs.socket_recv_size7: - -.. _sock_bufs.socket_recv_size8: - -.. _sock_bufs.socket_recv_size9: - -.. _sock_bufs.socket_recv_size10: - -.. _sock_bufs.socket_recv_size11: - -.. _sock_bufs.socket_recv_size12: - -.. _sock_bufs.socket_recv_size13: - -.. _sock_bufs.socket_recv_size14: - -.. _sock_bufs.socket_recv_size15: - -.. _sock_bufs.socket_recv_size16: - -.. _sock_bufs.socket_recv_size17: - -.. _sock_bufs.socket_recv_size18: - -.. _sock_bufs.socket_recv_size19: - -.. _sock_bufs.socket_recv_size20: - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+------------------------------+---------+ -| name | type | -+==============================+=========+ -| sock_bufs.socket_send_size3 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size4 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size5 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size6 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size7 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size8 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size9 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size10 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size11 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size12 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size13 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size14 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size15 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size16 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size17 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size18 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size19 | counter | -+------------------------------+---------+ -| sock_bufs.socket_send_size20 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size3 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size4 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size5 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size6 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size7 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size8 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size9 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size10 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size11 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size12 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size13 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size14 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size15 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size16 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size17 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size18 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size19 | counter | -+------------------------------+---------+ -| sock_bufs.socket_recv_size20 | counter | -+------------------------------+---------+ - - -the buffer sizes accepted by -socket send and receive calls respectively. -The larger the buffers are, the more efficient, -because it reqire fewer system calls per byte. -The size is 1 << n, where n is the number -at the end of the counter name. i.e. -8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, -16384, 32768, 65536, 131072, 262144, 524288, 1048576 -bytes - diff --git a/docs/todo.html b/docs/todo.html deleted file mode 100644 index 4d759622a..000000000 --- a/docs/todo.html +++ /dev/null @@ -1,10465 +0,0 @@ - - - - -

libtorrent todo-list

-0 urgent -21 important -61 relevant -7 feasible -177 notes -
relevance 3../src/file.cpp:538find out what error code is reported when the filesystem does not support hard links.
relevance 3../src/peer_connection.cpp:2962instead of having to ask the torrent whether it's in graceful pause mode or not, the peers should keep that state (and the torrent should update them when it enters graceful pause). When a peer enters graceful pause mode, it should cancel all outstanding requests and clear its request queue.
relevance 3../src/peer_connection.cpp:3832once peers are properly put in graceful pause mode, they can cancel all outstanding requests and this test can be removed.
relevance 3../src/session_impl.cpp:2065port map SSL udp socket here
relevance 3../src/session_impl.cpp:3806it would probably make sense to have a separate list of peers that are eligible for optimistic unchoke, similar to the torrents perhaps this could even iterate over the pool allocators of torrent_peer objects. It could probably be done in a single pass and collect the n best candidates
relevance 3../src/session_impl.cpp:3828peers should know whether their torrent is paused or not, instead of having to ask it over and over again
relevance 3../src/session_impl.cpp:4105there should be a pre-calculated list of all peers eligible for unchoking
relevance 3../src/torrent.cpp:9611this really needs to be moved to do_async_save_resume_data. flags need to be passed on
relevance 3../src/upnp.cpp:94listen_interface is not used. It's meant to bind the broadcast socket. it would probably have to be changed to a vector of interfaces to bind to though, since the broadcast socket opens one socket per local interface by default
relevance 3../src/kademlia/node_id.cpp:54the XORing should be done at full words instead of bytes
relevance 3../src/kademlia/node_id.cpp:66the XORing should be done at full words instead of bytes
relevance 3../src/kademlia/node_id.cpp:82the xoring should be done at full words and _builtin_clz() could be used as the last step
relevance 3../src/kademlia/routing_table.cpp:698the call to compare_ip_cidr here is expensive. peel off some layers of abstraction here to make it quicker. Look at xoring and using _builtin_ctz()
relevance 3../src/kademlia/rpc_manager.cpp:87move this into it's own .cpp file
relevance 3../include/libtorrent/socks5_stream.hpp:114enable this assert and fix remaining causes of it triggering
relevance 3../include/libtorrent/torrent.hpp:1347factor out the links (as well as update_list() to a separate class that torrent can inherit)
relevance 3../include/libtorrent/torrent_handle.hpp:237consider replacing all the setters and getters for pause, resume, stop-when-ready, share-mode, upload-mode, super-seeding, apply-ip-filter, resolve-countries, pinned, sequential-download, seed-mode with just set_flags() and clear_flags() using the flags from add_torrent_params. Perhaps those flags should have a more generic name.
relevance 3../include/libtorrent/torrent_handle.hpp:484unify url_seed and http_seed with just web_seed, using the web_seed_entry.
relevance 3../include/libtorrent/web_peer_connection.hpp:131if we make this be a disk_buffer_holder instead we would save a copy use allocate_disk_receive_buffer and release_disk_receive_buffer
relevance 3../include/libtorrent/kademlia/routing_table.hpp:99to improve memory locality and scanning performance, turn the routing table into a single vector with boundaries for the nodes instead. Perhaps replacement nodes should be in a separate vector.
relevance 3../include/libtorrent/aux_/allocating_handler.hpp:77make sure the handlers we pass in are potentially movable!
relevance 2../test/test_dht.cpp:514split this test up into smaller test cases
relevance 2../test/test_dht.cpp:2141split this up into smaller test cases
relevance 2../test/test_piece_picker.cpp:281split this up into smaller tests (where we print_title)
relevance 2../test/test_storage.cpp:485split this test up into smaller parts
relevance 2../src/alert.cpp:1461the salt here is allocated on the heap. It would be nice to allocate in in the stack_allocator
relevance 2../src/alert_manager.cpp:90keep a count of the number of threads waiting. Only if it's > 0 notify them
relevance 2../src/block_cache.cpp:1723turn these return values into enums returns -1: block not in cache -2: out of memory
relevance 2../src/escape_string.cpp:209this should probably be moved into string_util.cpp
relevance 2../src/file.cpp:567test this on a FAT volume to see what error we get!
relevance 2../src/http_tracker_connection.cpp:379returning a bool here is redundant. Instead this function should return the peer_entry
relevance 2../src/instantiate_connection.cpp:43peer_connection and tracker_connection should probably be flags
relevance 2../src/instantiate_connection.cpp:44move this function into libtorrent::aux namespace
relevance 2../src/peer_connection.cpp:2382this should probably be based on time instead of number of request messages. For a very high throughput connection, 300 may be a legitimate number of requests to have in flight when getting choked
relevance 2../src/peer_connection.cpp:3116since we throw away the queue entry once we issue the disk job, this may happen. Instead, we should keep the queue entry around, mark it as having been requested from disk and once the disk job comes back, discard it if it has been cancelled. Maybe even be able to cancel disk jobs?
relevance 2../src/peer_connection.cpp:4791use a deadline_timer for timeouts. Don't rely on second_tick()! Hook this up to connect timeout as well. This would improve performance because of less work in second_tick(), and might let use remove ticking entirely eventually
relevance 2../src/peer_list.cpp:495it would be nice if there was a way to iterate over these torrent_peer objects in the order they are allocated in the pool instead. It would probably be more efficient
relevance 2../src/piece_picker.cpp:1982make the 2048 limit configurable
relevance 2../src/piece_picker.cpp:2614the first_block returned here is the largest free range, not the first-fit range, which would be better
relevance 2../src/piece_picker.cpp:3395it would be nice if this could be folded into lock_piece() the main distinction is that this also maintains the m_num_passed counter and the passed_hash_check member Is there ever a case where we call write filed without also locking the piece? Perhaps write_failed() should imply locking it.
relevance 2../src/session_impl.cpp:463is there a reason not to move all of this into init()? and just post it to the io_service?
relevance 2../src/session_impl.cpp:1946the udp socket(s) should be using the same generic mechanism and not be restricted to a single one we should open a one listen socket for each entry in the listen_interfaces list
relevance 2../src/session_impl.cpp:2049use bind_to_device in udp_socket
relevance 2../src/session_impl.cpp:2069use bind_to_device in udp_socket
relevance 2../src/session_impl.cpp:3576make a list for torrents that want to be announced on the DHT so we don't have to loop over all torrents, just to find the ones that want to announce
relevance 2../src/session_impl.cpp:6057this should be factored into the udp socket, so we only have the code once
relevance 2../src/session_impl.cpp:6761perhaps DHT logging should be disabled by TORRENT_DISABLE_LOGGING too
relevance 2../src/storage.cpp:1069we probably need to do this unconditionally in this function. Even if the resume data file appears stale, we need to create these hard links, right?
relevance 2../src/storage.cpp:1093is this risky? The upper layer will assume we have the whole file. Perhaps we should verify that at least the size of the file is correct
relevance 2../src/torrent.cpp:681post alert
relevance 2../src/torrent.cpp:1907add a unit test where we don't have metadata, connect to a peer that sends a bitfield that's too large, then we get the metadata
relevance 2../src/torrent.cpp:4941abort lookups this torrent has made via the session host resolver interface
relevance 2../src/torrent.cpp:8127if peer is a really good peer, maybe we shouldn't disconnect it perhaps this logic should be disabled if we have too many idle peers (with some definition of idle)
relevance 2../src/tracker_manager.cpp:200some of these arguments could probably be moved to the tracker request itself. like the ip_filter and settings
relevance 2../src/udp_socket.cpp:810the udp_socket should really just be a single socket, and the session should support having more than one, just like with TCP sockets for now, just make bind failures non-fatal
relevance 2../src/udp_tracker_connection.cpp:83support authentication here. tracker_req().auth
relevance 2../src/ut_metadata.cpp:123if we were to initialize m_metadata_size lazily instead, we would probably be more efficient initialize m_metadata_size
relevance 2../src/utp_socket_manager.cpp:235we may want to take ec into account here. possibly close connections quicker
relevance 2../src/utp_stream.cpp:389it would be nice if not everything would have to be public here
relevance 2../src/web_peer_connection.cpp:328do we really need a special case here? wouldn't the multi-file case handle single file torrents correctly too?
relevance 2../src/web_peer_connection.cpp:550just make this peer not have the pieces associated with the file we just requested. Only when it doesn't have any of the file do the following
relevance 2../src/web_peer_connection.cpp:603create a mapping of file-index to redirection URLs. Use that to form URLs instead. Support to reconnect to a new server without destructing this peer_connection
relevance 2../src/kademlia/dht_storage.cpp:110make this configurable in dht_settings
relevance 2../src/kademlia/node.cpp:656it would be nice to have a bias towards node-id prefixes that are missing in the bucket
relevance 2../src/kademlia/node.cpp:734use the non deprecated function instead of this one
relevance 2../src/kademlia/node.cpp:893find_node should write directly to the response entry
relevance 2../src/kademlia/routing_table.cpp:132use the non deprecated function instead of this one
relevance 2../src/kademlia/routing_table.cpp:991move the lowest priority nodes to the replacement bucket
relevance 2../include/libtorrent/alert_types.hpp:1416should the alert baseclass have this object instead?
relevance 2../include/libtorrent/build_config.hpp:40instead of using a dummy function to cause link errors when incompatible build configurations are used, make the namespace name depend on the configuration, and have a using declaration in the headers to pull it into libtorrent.
relevance 2../include/libtorrent/enum_net.hpp:151this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex()
relevance 2../include/libtorrent/heterogeneous_queue.hpp:56add emplace_back() version
relevance 2../include/libtorrent/peer_connection.hpp:1116rename this target queue size
relevance 2../include/libtorrent/piece_picker.hpp:594having 8 priority levels is probably excessive. It should probably be changed to 3 levels + dont-download
relevance 2../include/libtorrent/proxy_base.hpp:260use the resolver interface that has a built-in cache
relevance 2../include/libtorrent/session_handle.hpp:78the ip filter should probably be saved here too
relevance 2../include/libtorrent/socks5_stream.hpp:144add async_connect() that takes a hostname and port as well
relevance 2../include/libtorrent/tracker_manager.hpp:290this class probably doesn't need to have virtual functions.
relevance 2../include/libtorrent/aux_/session_impl.hpp:1163the throttling of saving resume data could probably be factored out into a separate class
relevance 2../include/libtorrent/aux_/session_interface.hpp:137the IP voting mechanism should be factored out to its own class, not part of the session
relevance 2../include/libtorrent/aux_/session_interface.hpp:162remove this. There's already get_resolver()
relevance 2../include/libtorrent/aux_/session_interface.hpp:217factor out the thread pool for socket jobs into a separate class used to (potentially) issue socket write calls onto multiple threads
relevance 1../src/disk_io_thread.cpp:218it would be nice to have the number of threads be set dynamically
relevance 1../src/http_seed_connection.cpp:129in chunked encoding mode, this assert won't hold. the chunk headers should be subtracted from the receive_buffer_size
relevance 1../src/session_impl.cpp:5449report the proper address of the router as the source IP of this understanding of our external address, instead of the empty address
relevance 1../src/torrent.cpp:1240make this depend on the error and on the filesystem the files are being downloaded to. If the error is no_space_left_on_device and the filesystem doesn't support sparse files, only zero the priorities of the pieces that are at the tails of all files, leaving everything up to the highest written piece in each file
relevance 1../src/torrent.cpp:7227save the send_stats state instead of throwing them away it may pose an issue when downgrading though
relevance 1../src/torrent.cpp:8471should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though
relevance 1../include/libtorrent/ip_voter.hpp:124instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc.
relevance 0../test/test_block_cache.cpp:469test try_evict_blocks
relevance 0../test/test_block_cache.cpp:470test evicting volatile pieces, to see them be removed
relevance 0../test/test_block_cache.cpp:471test evicting dirty pieces
relevance 0../test/test_block_cache.cpp:472test free_piece
relevance 0../test/test_block_cache.cpp:473test abort_dirty
relevance 0../test/test_block_cache.cpp:474test unaligned reads
relevance 0../test/test_bloom_filter.cpp:130test size()
relevance 0../test/test_bloom_filter.cpp:131test clear()
relevance 0../test/test_dht.cpp:103ideally the mock_socket would contain this queue of packets, to make tests independent
relevance 0../test/test_dht.cpp:420check to make sure the "best" items are stored
relevance 0../test/test_dht.cpp:513test obfuscated_get_peers
relevance 0../test/test_fast_extension.cpp:880test sending invalid requests (out of bound piece index, offsets and sizes)
relevance 0../test/test_file_progress.cpp:109test the update function too
relevance 0../test/test_file_storage.cpp:214test file_storage::optimize
relevance 0../test/test_file_storage.cpp:215test map_block
relevance 0../test/test_file_storage.cpp:216test piece_size(int piece)
relevance 0../test/test_file_storage.cpp:217test file_index_at_offset
relevance 0../test/test_file_storage.cpp:218test file attributes
relevance 0../test/test_file_storage.cpp:219test symlinks
relevance 0../test/test_file_storage.cpp:220test pad_files
relevance 0../test/test_file_storage.cpp:221test reorder_file (make sure internal_file_entry::swap() is used)
relevance 0../test/test_peer_list.cpp:939test erasing peers
relevance 0../test/test_peer_list.cpp:940test update_peer_port with allow_multiple_connections_per_ip and without
relevance 0../test/test_peer_list.cpp:941test add i2p peers
relevance 0../test/test_peer_list.cpp:942test allow_i2p_mixed
relevance 0../test/test_peer_list.cpp:943test insert_peer failing with all error conditions
relevance 0../test/test_peer_list.cpp:944test IPv6
relevance 0../test/test_peer_list.cpp:945test connect_to_peer() failing
relevance 0../test/test_peer_list.cpp:946test connection_closed
relevance 0../test/test_peer_list.cpp:947connect candidates recalculation when incrementing failcount
relevance 0../test/test_resolve_links.cpp:80test files with different piece size (negative test)
relevance 0../test/test_resolve_links.cpp:83it would be nice to test resolving of more than just 2 files as well. like 3 single file torrents merged into one, resolving all 3 files.
relevance 0../test/test_resume.cpp:232test what happens when loading a resume file with both piece priorities and file priorities (file prio should take presedence)
relevance 0../test/test_resume.cpp:235make sure a resume file only ever contain file priorities OR piece priorities. Never both.
relevance 0../test/test_resume.cpp:238generally save
relevance 0../test/test_resume.cpp:695test all other resume flags here too. This would require returning more than just the torrent_status from test_resume_flags. Also http seeds and trackers for instance
relevance 0../test/test_settings_pack.cpp:140load_pack_from_dict
relevance 0../test/test_ssl.cpp:394test using a signed certificate with the wrong info-hash in DN
relevance 0../test/test_ssl.cpp:492also test using a hash that refers to a valid torrent but that differs from the SNI hash
relevance 0../test/test_timestamp_history.cpp:54test the case where we have > 120 samples (and have the base delay actually be updated)
relevance 0../test/test_timestamp_history.cpp:55test the case where a sample is lower than the history entry but not lower than the base
relevance 0../test/test_torrent.cpp:135wait for an alert rather than just waiting 10 seconds. This is kind of silly
relevance 0../test/test_torrent_info.cpp:156test remap_files
relevance 0../test/test_torrent_info.cpp:157merkle torrents. specifically torrent_info::add_merkle_nodes and torrent with "root hash"
relevance 0../test/test_torrent_info.cpp:158torrent with 'p' (padfile) attribute
relevance 0../test/test_torrent_info.cpp:159torrent with 'h' (hidden) attribute
relevance 0../test/test_torrent_info.cpp:160torrent with 'x' (executable) attribute
relevance 0../test/test_torrent_info.cpp:161torrent with 'l' (symlink) attribute
relevance 0../test/test_torrent_info.cpp:162creating a merkle torrent (torrent_info::build_merkle_list)
relevance 0../test/test_torrent_info.cpp:163torrent with multiple trackers in multiple tiers, making sure we shuffle them (how do you test shuffling?, load it multiple times and make sure it's in different order at least once)
relevance 0../test/test_torrent_info.cpp:164torrents with a missing name
relevance 0../test/test_torrent_info.cpp:165torrents with a zero-length name
relevance 0../test/test_torrent_info.cpp:166torrents with a merkle tree and add_merkle_nodes
relevance 0../test/test_torrent_info.cpp:167torrent with a non-dictionary info-section
relevance 0../test/test_torrent_info.cpp:168torrents with DHT nodes
relevance 0../test/test_torrent_info.cpp:169torrent with url-list as a single string
relevance 0../test/test_torrent_info.cpp:170torrent with http seed as a single string
relevance 0../test/test_torrent_info.cpp:171torrent with a comment
relevance 0../test/test_torrent_info.cpp:172torrent with an SSL cert
relevance 0../test/test_torrent_info.cpp:173torrent with attributes (executable and hidden)
relevance 0../test/test_torrent_info.cpp:174torrent_info::add_tracker
relevance 0../test/test_torrent_info.cpp:175torrent_info::unload
relevance 0../test/test_torrent_info.cpp:176torrent_info constructor that takes an invalid bencoded buffer
relevance 0../test/test_torrent_info.cpp:177verify_encoding with a string that triggers character replacement
relevance 0../test/test_tracker.cpp:53test scrape requests
relevance 0../test/test_tracker.cpp:54test parse peers6
relevance 0../test/test_tracker.cpp:55test parse tracker-id
relevance 0../test/test_tracker.cpp:56test parse failure-reason
relevance 0../test/test_tracker.cpp:57test all failure paths, including invalid bencoding not a dictionary no files entry in scrape response no info-hash entry in scrape response malformed peers in peer list of dictionaries uneven number of bytes in peers and peers6 string responses
relevance 0../test/test_transfer.cpp:215these settings_pack tests belong in their own test
relevance 0../test/test_transfer.cpp:294factor out the disk-full test into its own unit test
relevance 0../test/test_upnp.cpp:108store the log and verify that some key messages are there
relevance 0../src/block_cache.cpp:987it's somewhat expensive to iterate over this linked list. Presumably because of the random access of memory. It would be nice if pieces with no evictable blocks weren't in this list
relevance 0../src/block_cache.cpp:1051this should probably only be done every n:th time
relevance 0../src/block_cache.cpp:1810create a holder for refcounts that automatically decrement
relevance 0../src/bt_peer_connection.cpp:691this could be optimized using knuth morris pratt
relevance 0../src/bt_peer_connection.cpp:2261if we're finished, send upload_only message
relevance 0../src/choker.cpp:336optimize this using partial_sort or something. We don't need to sort the entire list
relevance 0../src/choker.cpp:339make the comparison function a free function and move it into this cpp file
relevance 0../src/choker.cpp:344make configurable
relevance 0../src/choker.cpp:358make configurable
relevance 0../src/create_torrent.cpp:287this should probably be optional
relevance 0../src/disk_buffer_pool.cpp:322perhaps we should sort the buffers here?
relevance 0../src/disk_io_thread.cpp:883it would be nice to optimize this by having the cache pieces also ordered by
relevance 0../src/disk_io_thread.cpp:926instead of doing a lookup each time through the loop, save cached_piece_entry pointers with piece_refcount incremented to pin them
relevance 0../src/disk_io_thread.cpp:1105instead of doing this. pass in the settings to each storage_interface call. Each disk thread could hold its most recent understanding of the settings in a shared_ptr, and update it every time it wakes up from a job. That way each access to the settings won't require a mutex to be held.
relevance 0../src/disk_io_thread.cpp:1133a potentially more efficient solution would be to have a special queue for retry jobs, that's only ever run when a job completes, in any thread. It would only work if counters::num_running_disk_jobs > 0
relevance 0../src/disk_io_thread.cpp:1147it should clear the hash state even when there's an error, right?
relevance 0../src/disk_io_thread.cpp:1848maybe the tailqueue_iterator should contain a pointer-pointer instead and have an unlink function
relevance 0../src/disk_io_thread.cpp:2113this is potentially very expensive. One way to solve it would be to have a fence for just this one piece.
relevance 0../src/disk_io_thread.cpp:2375we should probably just hang the job on the piece and make sure the hasher gets kicked
relevance 0../src/disk_io_thread.cpp:2442introduce a holder class that automatically increments and decrements the piece_refcount
relevance 0../src/disk_io_thread.cpp:2692it would be nice to not have to lock the mutex every turn through this loop
relevance 0../src/file_progress.cpp:137it would be nice to not depend on alert_manager here
relevance 0../src/http_tracker_connection.cpp:186support this somehow
relevance 0../src/metadata_transfer.cpp:365this is not safe. The torrent could be unloaded while we're still sending the metadata
relevance 0../src/packet_buffer.cpp:180use compare_less_wrap for this comparison as well
relevance 0../src/part_file.cpp:252what do we do if someone is currently reading from the disk from this piece? does it matter? Since we won't actively erase the data from disk, but it may be overwritten soon, it's probably not that big of a deal
relevance 0../src/part_file.cpp:353instead of rebuilding the whole file header and flushing it, update the slot entries as we go
relevance 0../src/peer_connection.cpp:524it would be neat to be able to print this straight into the alert's stack allocator
relevance 0../src/peer_connection.cpp:1031this should be the global download rate
relevance 0../src/peer_connection.cpp:3364sort the allowed fast set in priority order
relevance 0../src/peer_connection.cpp:6176The stats checks can not be honored when authenticated encryption is in use because we may have encrypted data which we cannot authenticate yet
relevance 0../src/piece_picker.cpp:2061this could probably be optimized by incrementally calling partial_sort to sort one more element in the list. Because chances are that we'll just need a single piece, and once we've picked from it we're done. Sorting the rest of the list in that case is a waste of time.
relevance 0../src/piece_picker.cpp:2584when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense
relevance 0../src/session_impl.cpp:523there's no rule here to make uTP connections not have the global or local rate limits apply to it. This used to be the default.
relevance 0../src/session_impl.cpp:1625it would be nice to reserve() these vectors up front
relevance 0../src/session_impl.cpp:1862instead of having a special case for this, just make the default listen interfaces be "0.0.0.0:6881,[::]:6881" and use the generic path. That would even allow for not listening at all.
relevance 0../src/session_impl.cpp:2794should this function take a shared_ptr instead?
relevance 0../src/session_impl.cpp:3162have a separate list for these connections, instead of having to loop through all of them
relevance 0../src/session_impl.cpp:3195this should apply to all bandwidth channels
relevance 0../src/session_impl.cpp:3989use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections
relevance 0../src/session_impl.cpp:4141post a message to have this happen immediately instead of waiting for the next tick
relevance 0../src/session_impl.cpp:4525it might be a nice feature here to limit the number of torrents to send in a single update. By just posting the first n torrents, they would nicely be round-robined because the torrent lists are always pushed back. Perhaps the status_update_alert could even have a fixed array of n entries rather than a vector, to further improve memory locality.
relevance 0../src/session_impl.cpp:4738this logic could probably be less spaghetti looking by being moved to a function with early exits
relevance 0../src/session_impl.cpp:5414perhaps this function should not exist when logging is disabled
relevance 0../src/storage.cpp:895make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info
relevance 0../src/storage.cpp:1234if everything moves OK, except for the partfile we currently won't update the save path, which breaks things. it would probably make more sense to give up on the partfile
relevance 0../src/string_util.cpp:60warning C4146: unary minus operator applied to unsigned type, result still unsigned
relevance 0../src/torrent.cpp:101factor out cache_status to its own header
relevance 0../src/torrent.cpp:468if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.
relevance 0../src/torrent.cpp:580if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.
relevance 0../src/torrent.cpp:1562is verify_peer_cert called once per certificate in the chain, and this function just tells us which depth we're at right now? If so, the comment makes sense. any certificate that isn't the leaf (i.e. the one presented by the peer) should be accepted automatically, given preverified is true. The leaf certificate need to be verified to make sure its DN matches the info-hash
relevance 0../src/torrent.cpp:1984instead of creating the picker up front here, maybe this whole section should move to need_picker()
relevance 0../src/torrent.cpp:2058this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:2074this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:2240there may be peer extensions relying on the torrent extension still being alive. Only do this if there are no peers. And when the last peer is disconnected, if the torrent is unloaded, clear the extensions m_extensions.clear();
relevance 0../src/torrent.cpp:2932this pattern is repeated in a few places. Factor this into a function and generalize the concept of a torrent having a dedicated listen port
relevance 0../src/torrent.cpp:3779add one peer per IP the hostname resolves to
relevance 0../src/torrent.cpp:4719update suggest_piece?
relevance 0../src/torrent.cpp:4863really, we should just keep the picker around in this case to maintain the availability counters
relevance 0../src/torrent.cpp:6926make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info The mapped_files needs to be read both in the network thread and in the disk thread, since they both have their own mapped files structures which are kept in sync
relevance 0../src/torrent.cpp:7059if this is a merkle torrent and we can't restore the tree, we need to wipe all the bits in the have array, but not necessarily we might want to do a full check to see if we have all the pieces. This is low priority since almost no one uses merkle torrents
relevance 0../src/torrent.cpp:7303make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base
relevance 0../src/torrent.cpp:9559add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file
relevance 0../src/torrent.cpp:11186instead of resorting the whole list, insert the peers directly into the right place
relevance 0../src/torrent_peer.cpp:188how do we deal with our external address changing?
relevance 0../src/udp_socket.cpp:320it would be nice to detect this on posix systems also
relevance 0../src/udp_socket.cpp:869use the system resolver_interface here
relevance 0../src/ut_metadata.cpp:320we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer
relevance 0../src/utp_stream.cpp:1761this loop is not very efficient. It could be fixed by having a separate list of sequence numbers that need resending
relevance 0../src/web_connection_base.cpp:81introduce a web-seed default class which has a low download priority
relevance 0../src/kademlia/dht_storage.cpp:426c++11 use a lambda here instead
relevance 0../src/kademlia/node.cpp:721in the future, this function should update all the dht related counter. For now, it just update the storage related ones.
relevance 0../src/kademlia/put_data.cpp:97what if o is not an isntance of put_data_observer? This need to be redesigned for better type saftey.
relevance 0../include/libtorrent/announce_entry.hpp:97include the number of peers received from this tracker, at last announce
relevance 0../include/libtorrent/block_cache.hpp:223make this 32 bits and to count seconds since the block cache was created
relevance 0../include/libtorrent/config.hpp:362Make this count Unicode characters instead of bytes on windows
relevance 0../include/libtorrent/disk_buffer_pool.hpp:137try to remove the observers, only using the async_allocate handlers
relevance 0../include/libtorrent/file.hpp:173move this into a separate header file, TU pair
relevance 0../include/libtorrent/heterogeneous_queue.hpp:184if this throws, should we do anything?
relevance 0../include/libtorrent/identify_client.hpp:50hide these declarations when deprecaated functions are disabled, and expose them internally in a header under aux_.
relevance 0../include/libtorrent/peer_connection.hpp:209make this a raw pointer (to save size in the first cache line) and make the constructor take a raw pointer. torrent objects should always outlive their peers
relevance 0../include/libtorrent/peer_connection.hpp:1044factor this out into its own class with a virtual interface torrent and session should implement this interface
relevance 0../include/libtorrent/peer_connection_interface.hpp:47make this interface smaller!
relevance 0../include/libtorrent/performance_counters.hpp:139should keepalives be in here too? how about dont-have, share-mode, upload-only
relevance 0../include/libtorrent/performance_counters.hpp:450some space could be saved here by making gauges 32 bits
relevance 0../include/libtorrent/performance_counters.hpp:451restore these to regular integers. Instead have one copy of the counters per thread and collect them at convenient synchronization points
relevance 0../include/libtorrent/piece_picker.hpp:756should this be allocated lazily?
relevance 0../include/libtorrent/proxy_base.hpp:174it would be nice to remember the bind port and bind once we know where the proxy is m_sock.bind(endpoint, ec);
relevance 0../include/libtorrent/receive_buffer.hpp:258Detect when the start of the next crpyto packet is aligned with the start of piece data and the crpyto packet is at least as large as the piece data. With a little extra work we could receive directly into a disk buffer in that case.
relevance 0../include/libtorrent/session_handle.hpp:682add get_peer_class_type_filter() as well
relevance 0../include/libtorrent/settings_pack.hpp:1094deprecate this ``max_rejects`` is the number of piece requests we will reject in a row while a peer is choked before the peer is considered abusive and is disconnected.
relevance 0../include/libtorrent/torrent.hpp:195make this a raw pointer. perhaps keep the shared_ptr around further down the object to maintain an owner
relevance 0../include/libtorrent/torrent.hpp:1244this wastes 5 bits per file
relevance 0../include/libtorrent/torrent.hpp:1302These two bitfields should probably be coalesced into one
relevance 0../include/libtorrent/torrent_info.hpp:117there may be some opportunities to optimize the size if torrent_info. specifically to turn some std::string and std::vector into pointers
relevance 0../include/libtorrent/tracker_manager.hpp:392this should be unique_ptr in the future
relevance 0../include/libtorrent/upnp.hpp:132support using the windows API for UPnP operations as well
relevance 0../include/libtorrent/utp_stream.hpp:424implement blocking write. Low priority since it's not used (yet)
relevance 0../include/libtorrent/kademlia/item.hpp:61since this is a public function, it should probably be moved out of this header and into one with other public functions.
relevance 0../include/libtorrent/aux_/session_impl.hpp:859should this be renamed m_outgoing_interfaces?
relevance 0../include/libtorrent/aux_/session_impl.hpp:911replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:916replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:923replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_interface.hpp:241it would be nice to not have this be part of session_interface
relevance 0../include/libtorrent/aux_/session_settings.hpp:78make this a bitfield
\ No newline at end of file diff --git a/docs/troubleshooting.html b/docs/troubleshooting.html deleted file mode 100644 index 92e1c4aeb..000000000 --- a/docs/troubleshooting.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - -
-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
-

The following troubleshooting chart may help in finding out why torrents fail -to download. It is not complete, please submit suggestions via mail to -arvid@libtorrent.org or to the mailing list. Ideally in the form of patches -against docs/troubleshooting.dot.

-

thumb

- -
-
-
- -
- -
- - diff --git a/docs/troubleshooting.png b/docs/troubleshooting.png index 9318e4e4567c0fe51efc68ba686cf2dc2646d9bc..4e4f44ce4697e1582c220c271d2136d1a6837609 100644 GIT binary patch delta 180767 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 +Qyuu$7*d~!dIP-xwQJtibJ4gFs+@Pv&z^1 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 O(6_5^OZfHRh5rHlrsv!M delta 180547 zcmaI8Wk6PWw+H%|s3@s`Qi1|1AOg~<5(3f+ND4?ucf&?OX^@syK)Ophq`MmdX$g^T zxNAG_d){-;J?GARm~loQp1t>ft@W$5Kg<#p%n-S{pDH*ly@sUS#HHk~Tbpi-F+P7^ zqtf@!AG6nbdOV|7%jEG#m1SgH`5d=j)x0~`!7ltcG4ZSi4*7Rd)AF~wyLM%R^WOYj z@1iF*+aw3_dU|@ywiaJRElm$mIvyFAnwvATn~wV`7aC}8E%xvJE?YI*n3JrluNPC- zen28L(J=Y*=UXmIWbP&v)v1lS_S%`|;0Pm5^Qp5GymmMDM_x~!s3T>@qwGG@wyWdy z91~7wFikBj-{XaS9%z0)`*Se#87-mwk(R!(57Ft;5!+G~)ImTY;ML)9NScT<3>6)+0NtB|Q znDTz1&_YNenvl)o*>j;xl`68l-+s&LrsIyi%L=qfsc$||%i%=4yOhG!CEQzgSM=tC zbI<3_G#wn&&PO|TXyO{K=67N;Iye4=I4T`DPi$qOe;0P%XJmZAkdG&V$ZT9xQy@Ki z_Uzt|ocd8}UE2~$&x{;9H9IOT%6g5%e|Zwe@BC-2k#ZVYpKZNx>C$5*C6ase^vt?# zB+sJQB{Ln!a2n5<+f-I}@8Nem5toq2HJ#vpp;4Ufb)oQ# zKPy)ucIv)>#f;~hI=C%PeXQTR?Z-^hAfvicYsStp^snD7tJW1 z`86fwg5h9R{lRKgK)nyK;!)#6th&g*FkNEU*c@Ca`2CHIUTmoN* zKk0x=!vT%)gWuO}XDTI+EgmyYA0Hj;E+hmz^TN}!SnRut-q@<+{q%g{T%LZ}LFa?* zpPk4tYmv#1MI+f~(LA;|%*@QYGr`gyLqm0T=1bzQ^xf3qU~~>H%rN;;`ZMn2P%l(c zoosL#8Lx1}P&D8$TUc7kDk)uXt9iv879Q>~HKirr(`R>|jt;B3Hk=|pKK>b#z~$>K zXBm|X1bv7Yh2o}HR{T`Hnfx3nG%R-5N~>pj-xkY9>PN~UA|-`$cyx4bH9IAx`aL%B zvlD+mKjA8uqi4?$-F4|9442tt3-r^<Jzyq=--iqs4Ymuo*m zySu5gvoY|NsM+ox&9Mqc;`i_0-??+=!ElFNW(i+=z}@b8vgvH@h|vk9tUabik`_}_u5)!>&54^KYXh=)f5zT9i-sfT|V!YYSQ0V z7|nPZIeq$p@yJ6mekYP&zkVf6iv~~#CricPQBasTD8O%JHyUz{kEcfOcS%V}vCT^4 zFGZ_1U01n9m*VK-g*NSpGWcHV^u^EZZe>0u%zeq^?s_XNkByA|bd$gZ!4N9lJ!NNGk zRriD|FReFHB2DAB+%uiusgB8O(HG`6D`N>(;`n8#SKP?W&4r^W`ts%Vp59&>WUng) z$yepuKRBRY5A^iBaCo@UX}3~1h`}(b6xDrV*8Uh57x3kYheF`n7XmmQ(+-?G8j}l$ z7v`xPx0h>FOe@|?3mo+g#}}V{yiz^RC9|}yt*y;$IrmIRRCILK{&D9_-~GBp0XDX4 zl+K&@M2yPrP_f$Zppy0~SZ8D%)vPsvn{+kW0vv!^dSgAi+SG6-PwT~m_6QHMyOHu-+K00vL>l)B!Z)b z_?Ai*W{*3+)hB7~HTU&BM?0>Vm{^kGd;i=SccnqjzPTx-z;qQZo)Im*0fcNGj_iZi zO?Z8oDvE(7S#QEza=vH!*=3*SsBmyD>vMi2D5oo9=_nAlAvrDVp)aIlYc( zDolaRin0f9=XG|x4SJQ2c~N1NcNM}4rLJAOwmId))H9r~$L45bT|d4iCb_4hqq8}z z7uOvu%`b*YF`sTIu=*ueiq@w!R8?QbOV-nZ8}psXhlfrhc{;*W? z4^756PYX)(ZCza%&i4=(7jGIJjiQx`emeTiGkaz#KdP_US5fVOQ~YPw41+@ z;}p0k@$ny}D`XOs+ioup&;0%^m0huYgHg5kBl;)N>x7?0P0ejSC3Nk&7ezz+SRBf|1(hRfWW-=^XV+Ez_RL)>s<$6-$i*=!P?!a_ ztLohL>#sw##jTj;+KMghfq=^Tfcuq zVY+tLrhmbh5fZXGKD1vPD`7o#6Em~ADh+k6h4dH?W~t3gPd~xv&$UH_#KcIV_bEm8 z)@ebBForMd>lQDp+qHaxf(RlxOeyvb4tg8>NZ-H+yGlUt7;PDbmo8m;=3x7)=l#^w zl>YKi?nA2u8F`IjlONm$y-9w}>~zwxS3_s_x0bGwkUYgSH8y&{Xca$x`H(aB-6}GBWPv-EsCOVX!Hn zWnl1?lb25?3ty*W=8-7GA{tI~ddR^Mj`j<^Oh<*sPoCU;_%LM8fvtG4oQ|JA)?stu zksB6n5{*Py*Ya@wuWaOqJ~SK&S5a;3v6RE+nA%9slT4ARK*JMsbz94fxyUubmY|qhnajtz6tUkdJ#C^Ba}Tm%rG2 zrtM6;O{}YSjLlRoD9yX(KBadr@GJM6^@^mi_mjt4C+K0HI61bZrcTSqNSr`Uex$A! zdrufd3>MutT7DTZwY_=w}~*WJL2d zv3^-``?w75lNd^Q(nuRDaR-tySkvo?sw}q!O+O^L+*fXIDgN~7tDfc?itWjS_>yt_ zG4SZ;jhL6;(T~P>>bHd4-Gm9CLUyoQbv9eN&=5c= z4eiOch=lC}JQ%s9fy{^iMNza6$$4z7ib#kOzkbEXD1S4Fc@jIXPde0!AY{fImUUL} zoj(H<;8CSeti7foWp;LUcJ}oHk_C9^Z98LSw%Ov}d!L$_J@`@KsQ70L&QGdT47ZR_ zNNlXs&gz8X?WG@Ow&yt9Zsdlg78E>}-5YrNOAFUzte8p}S9u{RDa)^EcnUs$vsYR` zRz&2(0vil6_M@sGL~=%M_8JipL3gcWAH$H=8JZMl93OJOtJkiH#lqQUYie$oO31LL zr7Mdp{g%XD75yr)xLC<%S|HGAG}QZ|flLoho8}rem%z22`iP@!n0bcujs%pH(xmK0 zpC?=n{QSwd9v|$iCKnfTMm~H)0F&+6wo919>;AIh;^G#BnQuU7OLk1 z>DiTwIl|_Q`|K)H@57G2_S@AAPgD4>aF(f+Sd4jkd&k>v%w3F?4??t>XPahKmAbjH z43{j8)etvkt)&r9#=VDZ?AJDMsgC+b+@Bt>;n3X4gb9_Fo3HB6N=y4e#P7z}lxLQz zTyd4=(<1Aen;Eht!nd-FY^mb`HuNZJIL{g}Kc8MMUezyX!`AnsZzm7E`7ppNv?Q5+ z(tG2U=$tqCm#Xv*$}|<89O3_Vgpg6ztXcF7C1&q4o|BTiO+#}|;PB5GpazPwWcXBE zT-U1(*RjWb{6LWowC>(L06NQ~-*6)$A{Iu!F~LNvv&vR22@MT>Dkb$HJe>ISnKP1& z*q1KlK)Y5gHaoR4Qds+u>Pc6Y8c*+@ukU5xU_W8hHA3O%S|amO1*Q`e!F19eqN1Xx z%ToIJn3?etL<2rZCD%r>8FrOg8~TzkKi(|&?nZwM?%q#dw7qGFPz%UXDIE5>)LPARFL&{+?8KD<@3ja}Z?~B~1=j709e*)LT zxVpMxHkXh=TtMf-VqzCDpQYpY?T+{610y25pj~}&Iokiks^{Onb#I;nW45=h6U}LU z8pU=KmCis^KHZzm84>g@vt6a;=DuM$-%%eRaO|0{*Qs@UxYxC`6~yAXhkNq}j`5== z4heDb9N;CsWLyMr?i-*GB=d^P%BBMZkmKqswX(^%xer}kG7k;cHb-w*Wsv^>M0z%h}Ab^#krGfta=^Qjg456kq-kIYfCj=J<1w`lc0P! z+S@C?#_D^gTbQ2PYT>4X6!wq4KDKII9~fKH(#U@BYc42(heuUJahq&Rok(k|&o7EX zb{X%H`JAEdr$_r+G@TNA!8c}JYp=-;a0dsgN&c`*lgn1;OR7}LTJf$wTX^RU)?Ci+ z-w`p@cC2{+d}?86#ZyVidZ+^L%}pz~vIOl$|0K&Z=Pv^W_cglCu+@}iTLCD9EL|)v zWZo?8mPH9>z{!2Y33)r_q%OsuOXkLgg-d}VE>{n8ZJ45eHaCUD#V>U{sJf_)!Q8}% z2|aoqClHV%8Kni&`5lX{uC5kLZg@gCLBYYf$canAo8I%Rx@|cNgGv^Ja)X|~rhfmv z9}!0wpOb?J!-DU=TB$qSYpsQ@FGS2Q(jCIJfs-Rm&CRDUyf6_+*o{bnGZQ=V2Ryjo zp*HlVEB>6FeILQ97ytP)22kN+dwZ_(iV9|6|4}U*)Pp$g7Ek2tC34FHKV=t}lw6z( z_9Nr5xeUEV^qa|#KRpsmck}%C)=M!eCgBN;7WP`HW0`CNTXE6Rz5q{NzkYoaY7H?Q z$awqh8;6KL*~?k=LVJt5dl|Fl*Q!EWPUX+6ylg#9v3(c*8mdABoSdDR-}Kz}ad|39 z5ku2JzcP`5??XJ-v={!|h)~6p@JWZ1K?7gWehe2wQRoI^;Sw3cHnXU)3J0}9c9HK& zhPg;tnp9gP8#WYM!>``t?gUX>AH-68U7DeUEOY%>+yc&MM`#5tFE1H%^TC-CgMn9= zwJi+I`e=}}eDEOA2JXhO&>{)Fa<(~U*@n&ItI6zgN<)VnSBDQVlU8dOqo=>Wf~tu% zN`W7cTz)DhRs%A_s*!oLzbXYL$2q$jn4Z~86aLk!S0^`r^?LgGA?Gl>c7HIyt^RCm z)B@s5Z=zwh(TxdcX_pPD(-LiT=8C%4tT@Et!b%-N{HkBFSrz}|HV2KRsCI>?A5u8h zn~=!g7Pvv5T5@SAS}@CHW`rZ%M10O%L}^acV*SN@g%!hodaj{$ZP=KH(utgm%;(aR z@Qo`aHm%;OV_osc(V1-(MDqs+{k1cFzhiV)!j1e8xplFX>$Xjml9KAqDd(%}C&~*s zm?}02u2AqQ{TVA;tu)-9Y3>v_c?L(CC5Fdp0k1uh%?AdeFtF~K*;!$@k2k`X zH-KIEW4adm(S8QHm1O0Ry>m5 znfnSQe>5h=Vf14Ed|%a3FHGqmzjm!r~!LiuDVni#3%{qT+zKLRxa z?lGe1NSqUk(;f+YfQ#s2q(o(9WdZwLyT`5O7qS~tHN$%oB zCajVh78_=N8`MAjDV5A^i?=Ez#S?^$ix{;EhyKSn0s;c1R=4-tVR)cOeAcY}&U8FNsQsCr}6(0E`86q}&ixQU!WeUYLm0Yq1663Lj82~Lpq3gXF zFSmcF-EjE^o559pz{;goslU|O?5)B`vXc;PFXDlxf7?)Sr(K7Gn&7`X5u1hf8LkPr zvW^-pO2fVa>sxYLX*Nc5?g^uzcv&|%d_%&Ju%3*U`FCh>b$nrD0esYv}4GNp{MV zov+QKn7puOcq_xkdUmT2=6DxFDTZdkn@ZaMQmA&CZetqXqki2HLsZ?$>y=Zr%s3Iv#}I3Tbg_UA4hg>u_ftj;g{@d#;D{iBt67!W)aW| z%r5=?RXc|AUST>}7AGPTb%3{|G48O$*ncG8W7@Pb80Zz6@9kG0d%&sgXmuKeZMd7lE1_2Rx z@$&NCVPy34^dw?Ze}-9rGD$LY*j^R`xu)Q>&rlK%e)mFmLaJJs4f3Mp8n;O%eLBTz z`38>lLRZb^Du^cX$?fr2__CUsRL%!0--zNuuW}Pzy()xFe81q%U}Ixre1cwP0-NCg z9tKJ|d|4M9MFN!m>1f8M?6s#ne)sQK_B$)B7@*(uC=bD{g8(a-}QMUgNOk5b7A z(2pbhD|W^m&w^|i|H(?TMC2)P7+E|Qs5N~Rj<);jtxS@Qz}%Z_Yu!MdMkIws`pfX< zq9h3k3E#lCC0Y~dz+tcnO2=ge#HKhaKMDp&fs$+CSEn$WS23hosTyAZaZF&(#-gkQ zKIOi8xxT|(ifqCK%*u~4#X#eNwk3kxS(|kFED{f;jXJGk8h4qai7F%x^T3!uKA0{% zNct&S;)YyGONiT7hIkL3DY(N#quvz>PQ~8GS&esl} zQ6*K>&}eOG$y?CwpIY48OqEaW`TWQYw5_>2xjYgSh+u1l2#3koO-unOfW5guE^3&W zTZbZa`0ue}$&mgnRHGJdI>j<+;rmS0X{1Z4f&CLo^Zpjo8jL%ec)9%^GUKvF69HqN z6gos_7Db!K3qpam;+6Go(32yFjeb{kaJxAj9QZp4X z2jXdDdLp89_)OBp&C_`zLq=^V&vxX3L|l52v|jGpp;+@<$}6K+4W*YSQs$nkKu0$N zt;x>OQIRXT_t&2~Lg`naXAYHE(qT}S3gf!4pdS(v@~S&t_!H{Vohs)nQ(JGDBtnIk(jX z5S{8=Pn}_CxpMh(LD&02f6$!Vp+=^nOe>kydW+4q$I9&qJ#Y~6)0k*pdxA%g9wkXX zO3zeOhzJS_$^p?3Qw;F@HmIOStgDUeelz z2Q(5ka>pqzIt=gTqgyU6DEb4ljDWG#^V1dR+`iu4mn5xz_T2|=7zpk{c{#89hY#NB z98SotnQFNmK5DTE9IxR9GnEl!l=hu3X5=Kp@kqEDBjxdJ+yNVA70CaB(2hVG^#_a4 z4)A~qFG$j_mF9k0>|H3_I~}&i>*J)wb)M=2E~P(U{Ye;z=kZTrDv!2R%GX=y<99H) z8$u2h6yWtFX#-&Wpq}0M6RGux_)n37B3lo)@g2<2-dqq9QRELZRj(*LbFUtrtkFaz zc^qC&Thd#+Koau)0Hah8>U=O(R#A{xQ=qAcF~9P-l9t zV6W!N_^q`YXMi_1$mPYoiRO2ayd@!slNPFBrM;ARb+=X31N8Bz7M{5FnzP# zp>=kJM^Q@UGTy32+FLKUc!u+&w0tHaZt1BgOvvSTe6isZkyOF@rv@*J7Njpq0ZEKu zd|X%?#zs;}F*#DazaRPS+qWsU!^I{*;{nr+0Z|RQh4^8-t`$2s5Fjq5nY{)bbnI9; zG(>mE!@{a@q0eoRz3^?n~dpDtg6bMw45c z=?eA64u`kLkZ-BqBvQ%3shOB?aVdBou-O^%pB!4k>Cl3yLGn-^4*=Rbg-m5CM#d}S z$u1B+H6*9I+ z9=yV6X=#~lF34Ucdr!q-QliF>{QD zS;k5%u|SOev$a(Z;FMXv>!#D*Z20b^8}98{tyHKJ(4F1Dh6XJR3lOhcb~Y2V^=qT9 z=cZ@+9D?rAxplF=bnYGpU*TIzE{sVG#@pNb^(t|GLhd*VE9)A#b0aqqs$}-~!B$*t zUpG!g58?2U)8Ec{)c!Q<(;|zr;3V_MAFwZGoBMwsa4T+dqWh|zIXMrOf0PkZQBiT4 zO=8CFrmqY;W~ORX@sAW4`|#NQe(>wNh2N+9;_J%bB0O?Cf2Au=N5W@%j+DPJ#g;3K z;pJ&tTU!K#wwE)BGs}PGqD<3THa-n{@O`A82rIuXaikocP`COXniR*_*w}N%O2g2> zb3>M8WX7-B2}c(-#ASl%6mP|)?`D>e6=m!wh0~xF1!Mw~(wZ<@N?YAi3Xx~{BH=B)1f5V$XXAE@Xps_ub4-`Zb=J-=_@yDPqK)1t!+pJn@brBTRcpaY~ z^tMu-y6ustFwn|O%#rdZ9ylrT$vBbh#%a&3UmA6jcOB23HPr2h_JaOva$iBJP0px%41Tm=pHaE6=sEo7_m47+ zE6`CcIcUIe5Yawd`?K$~()>@kly>5rw)w)3osmG%5+tM8(VPGTFD6%4vkhtkYF<^t zS)ZJqu1)k|+{31^&unQChx0|n%q&~L>p0XO`RNmhYLyFlzHWOS=Y2h_LK_w&8`trs zVkM(JYuJAOKCv_@o55Kq=@;8Qazq1T_eDvgb1SRg-CCakrPW}NV5UXuk>rWNQY1#= zgqDaYB>sg_aDMQu0WqbId6|5prHs?p*^Fbpsu$iEJ>~yK5&iDnVF0VYST7C06R{|| zBjrYeJDE}9S~2fbR5vw(Q0%mCoK{}a#YOV1JHr#;u&B)6v)D=~tOy;7)Nx6CUb$Eh zF4cUPQ@Wc&q#tpB_oUUOHP+HzQ3J`nrm`b7O3Jl2v+a9kd*WNOhExj8?!m$I_R8oB zf6~k6jmFEbUm<0$OM8)yj)9vzJftA$UAS;TP*xTn;332B5(MHRmAg~e&5mC?yg(N@ zi+RCM>GFGwDSw!hC-g z!BW4;jwtEqe68QgV3)!6xh(kNL~~78Q8Y~wA~^qwG}z`m|8EB&wK=Dwc2*{e>0?x< zAx#_`1qFrOMmtB~r%#^X^lQNnPix_V3=JeUn4NablE&Oe4&V2bhvo94W7uaJbRIN{ zv#hIV2%(ujd-F(~HkcG}j^5Xs-{nau47PXn{4%&CtE`+RPFb?vUvvh}1xvWW49G=j zCcuZO@`CFRcIDRZL8G(!9tnfQO1ZYNV=oQ|lyOuRpZG}`>?^7aoK>0*hne{s!(BO@DQmYqL=4RsLJzG<30g_&)FCBsu@M)wif_3y((s{~gfFSl7@n1v+a` zx#D6pzFQ3jg9?~`a%#Z0z5<5}mBs-8oWlGk$bd76m_7q?7SYnu-2ArY6$YQVYE8%I zH)awN9LT>S95<R=<1w2D_0`J%XY?XkTLc)YtD8UK(B|394$Al{E*>f+mUQqg8b7w+RO z@v7dZ{KBq*hQ6A|dVubInjvgq#!PKEVLtIWvWMMQ^Nx-tgR*BGPLGd2jpk0^n`1DL zwOD}Z1>Xn9t>$JFU2rckUPpM&3|{+nE{ogX#=gz2I=+EGV-nWazXLqpCo%DMU0vNI zSk;kzWlAo&#l=Ifv#+!2PX75>YX>y^=hBi7h_qH^&g64RXl~G$l`A{yrXZ_{qTWb@~uP*P`MYLR)!W=;<6oQifl|Kq|rO_R^NcaGt zjc`#nOE$La-M;{Jtnd?Zk?Q$L)yXlBt4ExOp0HS~syIKDy=uK_=Ip{yZbE$F+0;CA z^3BZ6q4N59w^KkMF%)xYK0ZG1<6EwJWXKXshi;o%tUbO=b)t2>*K;diVEP;v4^SBC zt^cBtqey9_H4dB0YyY644sL~WLk%`RfBtN0YpVmU(gl6<-aL7K)?Y5b2c$_D0tofd z$?R0&SeSwzhE}WNd>GuuX%XL@2+A`<4IK;{vbkKYBTCCn#hqI616(B|&i5LY>ef#) z*fVZe%+7gd95-;=hLD~Zlq6%l+7SCvjwF24$n||Q>m<~%0|%&y_ghGBrh0{g_r^zy zja#6<)mu(1=7pP7yPkTs@g(dpZp`Ux>1XyGs)4GZo|F9D4}C6tTr*Q2h*mU`dzt5T zL*_VqbC#p7rDK=qRK7`V^6RFAVO)_S<53W?qW_yOea&YY zJgS+M6-h!msl=7hZ@q9L?y|7-Kzw0u1C?!03u2lkCgNbO(Kv$j21oTXBt7sk4vVSD z`T#nT4uE%x0?#P`vk=T)^7roUG7b*h`1tU_fdK)yr#_>qu8j@5Fd`}{pCICQ0mJw* z&%LF!HNr^C=eLm1|2yO1O+nlf`XXSp^1%PbL;Y7lHM<;ke_nywrrQHP4>?3R^uc-y zYDDGWw{PE`b%pebeovy3F z95z2!IPS2tq9Uq8MJ$9ko`Pa~m6TKhM$JRBNx_!(_7|_u+y#G9)Oe(T3iHtA&<;W& ziPYEK55+r(XYul*KAKYS*!aSHxqtzT;s>6O2wYEJzMk}HK|sqPVPPWhtrNh7i`qnh z2Is$uBI@<>Y>=gHV6N36>Aye-2C1zZ zvNCT_+lx!EaJIG3Eip0iUI|s$eqjeG;dICLgDF%=zGrLbCv!w8;1b>7d;JL}1vG$7uyuRk@x7kaY7drZrW-g99pk-4wfF!* zVvD!Ge-hwcd`zSO!aqAd-wS{?#U9z1JL?LWJ;C#Ck6xg*7WVM-G(_9)UxM-|Bo98D zdioL1EGO!YX{S#_)DrN_I7zHJTB9XUA|7~DJc8I(CLm8!#R6WY+U<8N|?D0B+@@~w5LUM&w#(wMY3zJGMKQQC_X84i1 zePWe;L}3EY@S8@fH{_6=yb$_^ql2Bmu&@t+TN8jSc>jL!jZ{eLek=R%2+; z$B(XHp^|sp$75YP*>{;9@vz)TBLAXXscyKD5(0D1NZQ?hpNB?<)SAmb(kVL2Me*B&{0APk7 zoK|^q>_{g*=d?^72k9O+xP-Ehc9fCKK8xnW2jjzrK5pj#lEULdWt7v!I1OChYl;hL z^cf`>qP{uo#JLUS7QGG_k$8lJZlHfPsgvU4zXkY<)j$!<82jmmM-XzIfr#*}2Z0Q$teOUn#v!{GHE$)AQz1+q^ z8T$AQgN^POajgPrQ%w+Ymoi7@VLQ@oi7lw+?70`JV0jHZj>2ytCI-gsEPu%{aO3D> z3mct?>`&7z_H>Mvlng^7rf(ux3BLCaYG8B@bVK>w3Z-*xFNfrzQfaPp6dKfJV*0jA zkWZ$y;#CzbE)1iAhOXGfja2 zUOmdn%IZr%hohpUO=@_?pN^fipptcm5Sy4uy$%ijB+nharek!+-LU>+f=HFR@e3iZOiFq@G zbGu>uh@{avO=sP18}|5Af0`_gYtXD)Za;cNpvG$ZSBRIT>6v4*(wB@b=HjEHGNpCQN4ov&<7Hxr{Ab_hGVeE}HPzp&YSv5@>#KHI zNXS*E-Jc%!_q5(6*e&Na?)q%rkW*0j0H9l|Ifw@3f8c)o0RkESB3+?_$j=KJ*BK0C zacVZ%xNsW#_j==w-NDTr7}hdto7C0=`mgEHsi^9rIQkxZT2uw_yA_t^k ztwl3xW!7GEZoQ@xR9jnn2J~%rsbtHdJJ5;VKYjXC5X|vw$dobMCNo>xMo{-r?!Y6~ z_-`?#m>rtT?%sSH$XbXu`1CBMZD<&GYI^#S5DN5}4F?#GTc1kRjc?T~jhg=%yPwSc z{V1%~oIJ#T1;RngBsH9D6w?wHk%Q5RkHNuiZ+eq{y5aIyCj{^>8g*ZVqjm~Jlw+;a z$qik=FAtAa5m7*U;N!+H;$S%~x4~BtpWL`M_!;5;%{-&;wimkw3MHq}1TDh#CG5L^ z#=<^qgOqO#sMsxKev?sG_ecM?%55A`Lc8zowLg_Mz>b5g7!?bP+**a-4YtSG>J=Y9 zeuN<1LQoqaA^JYm6^ z|2#|$hUl*$X-wO@Nyc0KQ)`yg(vy#fvr_w50f0`{z8?Vq6-oP4a zbpe!98;8Iq4s@Cq>)ejMdeL6Dv~kn@$odhIjaLB4zJ9*uJ@}ssgCvwaSK1Nrn zJe{6T5*ILn!`ZV^ehH=%mFP}~fk9fn@K3X|sc*EO-Zco$8sL<-%{8wWU@6f$T3_S! zs7>|%6HfS#nrp@>H4QVs?$6{Y1U$so@?14FH6V|^t9jM+^xtRCzhb!HO|V)E8_8wV zU*O+gxOF&jazqJi>9!~i z>FrMmaN{n=BFFa0Ew6q*5ueE|j8%QKv*?<>f8PVq&fe9QPK#HX3 z_WP(H0WqDb=;~B+-s9bA)U$Ni{{^?~`_Btn0nwil@JSn$DYGw@=1qy0`uHJBg<)dp z_Az09{<%kek>P~U@oArZ!o)~5p6pVdOe2Q@Cnarh%p&HTg=qb3E)NqzR;wU28szv> zU=eY;92ScNng8qFE;mER|I@*=dLzWT0)!P$_icPw9m+Xe)tiL_{lli zD&7ossnWD6ZkFwwk)iJ5G*z+#^U3N{;6PAua*{y&qXs!S&{!U?AccyvEz-B4xpnKz z-}Z1rY<0ZCe0@d?Z4aJ*?*@WL+UQN5-2u158*ayc?nZeL#5lF#j7m+gHk|BgNbZhS zI+wkoNFP}Kzzc~tpaBp$<|GpXl*50tDSx=Xlnv(GH4sr2i~=8O0+UAT2IMi=NaG|6 zul@0Z9LmPBh=k0)*AqG)5bE|>USxYn8>(FR@#E6~B23F({nNfV$;wbo8IC^4(3+60 zL)-tarSssjK-YB zl!Tz}4N7#nzC7s$=e&0hl6%vTP(y*!{`QIwsOxunuDepJwTX#~vlyG83P0?-<-pz! zWC1W3RFj{NLnxqThl-3z7YDNgxGd+CLLLb{MIa*yyM3s%2MaZik`E@RH6c|3Ow0qC z?&iwq;8g1y;3}RzKDDqi=MPt-J>L*FI!QbGgkk+cKjHrp)qYvl$|sR# z^3qAX*;;w%r5}009}UBh-F(%mT*n;~6dkcT^Cm!4TE{AKP(R_|X@Uw{zWiK)=y3dw>dIqgD?Xa*&+wc%SJpg*F>_l#%TFaKL z2oSyh8Fn57R~GE}|B-cWnsUiSY%RtsaaSEKovqrc> zWd_syG%KLHbLT>w)4ErF{p1}%6aRJskHQ=Cc_DPxptospF_)P8M3#RXfQr$s_fIEh zI)giZDvHBY1VlCfO70*aevt^jPZY)dbrbaY8bB=gFh;?~_M$j5)0it~Nucm!g-cIc z7)jwbx^7AzF?f+m$Cl<$;# z@bHv=3*6ABm<3=F=s1LNf4>gk`b7-HKb{7!!wr1W$-Ci8tMjkM)MxY0N>JZ@9S9Oe z!nu`zE`}t+t`4{J{zH8HBZwyT6&fmzz?RF8O6RCBCJiZdb#+wK8Qm<06cQc=C=o|` zH2uAM)S!%>7F5huFXWtu;28+s)YS24>I!U3aZvjbV4DyY7877n;{VO0=H;<~CzSA4 zrc|zQC`^rpELm5MCQ`cqJIBw})ukYJ!NLYo{$~0A6)?^FujQ2mW(Bnjdl+AQTYd7+ zznQ3|rKCJ)&KO*J0~C{J5LjF=fEdXW7r^q(u)~JRp%4xKESn$_2qCSn65)|qTz_M` z$p6gk(on}ksmlU&yokwEEeT4JjzeRWbePSb9+a0_ByRtPdh_h>g%q#^7_9Kyf$l}X zxT4v28qgE#XY`T2TOvizLtp3?eUi7Eg_m*MHew3)fIP@&k|!Pi$#Qyn>Q6Tye$PQF z=~>!BxAtTO1u>^SL$d#QprjACCKnS;aF0VzBuFxW72)B__#Q@H0$N*Z11hFo1HnWq za?f-vA*=)LvD8^tG|mRnc>&PuG{^u{Z1zZ?dxMd@_AHX1F+yg*kA(UAluIgFaCo^} z!4{o#)Hk>gi`%C@qmdB*7YYhJXoeJ;l+f*oSa&=_QG@At87KU7fs)))=|?l0mH%gs zShnoKFU|C-H1g@@tsfajxw1@4L$%c5(MVcuZl-aVu!%xRUjaEAC$)(g#l8X{q>Gp< z*IDY~Co&Mp4CO*^So8o99Gd>ekPsmZx^x7Dj26=cauy`To_vff%dOL7Y%F1z75hPN zEyXZM&0!)NMcktd5GSL{T&1Da-rgQn#<@Y2g>9l9=;+V16*tPihESjn34?Abic+wQ?2s*jx+0MF3Au-%KRHE=!g_OL!9;@Z|#Oe=>`))fFo5O-|ua@N^P#8%_ zjY504cJ=B((iGhQT*FdTcfydu3NzFAA+6XCR3aARt87pI40c*eB&ECcu}B<&D6| zz)i&GQ%xbR9pKhXWo3@&>kA%uJ_z^F$VWhnpV~^b^;kNkDt``6EG?$M`M{=^S$psQ z6BzAfEO^_vNf^poHY8 zEcS%zYYhnOLITI-tm}CkvZt`>ZeH|MN(XKeY^qNFJ>c-3h^OFd0FaMn^p@-kL&6CY z8=@J^m6pu2RPE(<^4gwcHh#>QCMvY2Vzj0sh_k&&uE?YAG9P1`0w!q^lAM$j$)1+K z@MtrKa(8>w^saz_#`>o|&M<4K?`dUxb4FShW<%Ux=jr&jv1AiIF*&YYTs4@#&UTI; zfoXESr4p(8Y4&g)h5z8pbR)1|MJC`vhVEPD3-^#!s0YBiIJAL#{d=eg{R7Q#Ato!? zLJEN_lyNU~QAxH;|BLAl5pQ(LtinndXmmn=Fd4J1b6ed3GvZIbqQF1ek`q z5bk{>gmDFZhA6vy-MilU%8iGJt9rIaRaMomArSY#_&0}T222V|5kOZa7uc6T1q1&r zK-_@*Ncf#N!H?w9D7CtanFKGasi~N?9~C4`uqS2d@H=K*bH0owAO<<4BrXuwh4&t|hY&akfPhI@>uhJY?cX{6C4-=XLfEfQ zsyqs$D!$w;TX33p*4AoZPu3Mxvq4Df!$MZh$6F5`$PC2&J@KZQ{WFE z5EL>5H6}LXiqG9_=ANIFXuVH9yIzip}RW7I_6t{3CRWza>;X*N5ETx(O?jmC=c zVepYae`7Zuafc-qZk5|*%&;f!1P2^lOM@P^V)PdUO}~bhySReS4vS_63cBD|Am|d| z?c2A}6mMiG5cIz+E*E#s=k9!G92UmT-u|U38WA~#0n+hGk?a3T-obiF0E{bCFL*cK z2{JNV*k_&AFrr32UfyRX6G@V!b&ZYa${Csp0Iv#&>!OSr0$k&PPRmuJk%EhWIcibw zYF_T)c4kcLf#BLv6y290r3Xt{}Pr66oC?pjAH#PAOapJI7^d zpSTMzaKOKD!y9;$Hpq{ti2^bB`rFw<`F(wv(b5;ylE21;jy#e$DHQ35EBwtdhK!9d z9H(EUv0jJ#A4`A4r)SE$hQ=bs0P1nSOe^mo2JAO4WODSS%41>Ri@oNi9rQQ$3Ldzy z)y#0zRBpe4M?mln0Fx#FF9>P)-la_~EPT$>!*c(0*j6J8JKhs9Us!>qarIz&=-I4A z&v3lx%S<7`pc5+5A^^7uIU~qJnqTmes083q>+SFnIC}h$U8xVEkudu+`3M*gFJtV7LfQhnQvhPBQz+2|zxc1*1bJ3aD7p*AU}tuDqDrHe1(onoIIvyg z^yur$d|iwy;4VZ(wHKs#^!@@7Elg*C8CkL9gg-y#7RU0_Y2tG3X+AefH*05oOvmq11C+`GqO zY@=Ndj6587;p^6@j$U(~1A=h(U6&oAK#wo!+;h`%PsrAF!ykSZ$_rgOE?%D>FtLdzo-w<{5 z)eyJ)T{15Np%%!NMzV8Q9Am-rNKPWWdeyzJ?|Cm%wxud*?!Q`3t6Xd!$;)57eb=W2 zRjjZI5U!d?$U2}qxt^Y$)xfLquV43qy8H=H=T*-W!Xo!~$dFR@S2eu&@rl!%8eX{5vT10IKH1b^sBctF zSm^oclQerC3k&4j-mI#O|7t4aF;aSgl<>Br(-?T)%+ORRsCvkk@^Uig{Y}{;hA<7~ zjX!^?A)xOCj}}A?yxwGKy?X~BG{7=X=6bW`tp;fi1l`AJw6wHb1JU&-B$Jh38YVr9 z(Av+i1=Q7>UoVp`0sE(2$6jlv6aq9mrmNw4{)M>1AOltd1V_VO0M0K7z&dzdem*`iadPRiLTmbY`Nt@V`)ZTp zaiV-{wo`on3UnrTx0R$$zKB@NkeuH3pTQCLgsFhAqqwl67`BWRC1a!R#XZQjL2B#~ z;0YirZ$a*e=txC!*(7*+?%h`&j2jzry~b7H*NGA{%LwJqI;8TWw)u5(L?ttaz1P`w z1EXHtcl7V&9I-&7+&3OJZOVNIscl!{A~kAl?@S=`Omt=j51}C8e$_*|3RRw1p8mTz zl&mNIe!+@csFx*e_~X=?eR$Xga|QChy{Af-Pf3#;r3xVnSzFQV{jYK%zR#l9J`3e7 zYG}~tuaDCx{NVWUCa%DtD+Dm$#YdyV)LbF3+=4pn>?hQCXr-qKz^k-KxUEv=W2OU`6pQRFW1XvM*pG*tI#DwSY=5U|@L{UhKsW?@M?Ggm)T(z!1a} zdi3b+`{jnEdjGrK!cal~>pOy&I9)p1+l660P0Vys^Ee$|di3?{*G~^LPeZryK!rIl zrXZb9j2iKfQ+XD{eXaV$-o2L1a;hgE zJ`4L0>37G!U)Y$9tylhL!LK8>UmjOu`+mC{P&6te&81XA z2oX}7G@w#Z3Mo?=8YD`dXhcPtDU?csq$tWfHJYM9DNQmIDN4PC&boHIuXE1toc=iH z^ZUMN@8`MiYgpG>>(Z8!^DStUnCZv|8Z^GlNKg|9p)YyzkN?#Q{X6#?? z%kG|EeS5U2%(}G$j+37W!(srFqlz2{1E|`b?}^V_826yAQ8n~fb@zxg8wN@Hq|~I# zb*ol>!BfBg?3pl-p*cJGpn}o^xCrXM>-SIA78VwKbq32B;k;iNdqTDf88-@Eeq@fe zd9421AMPl+GIkD^V>W$Gbwb5Cv3DZzm`tWm7Lb^6w>GI@DvSh{p@^b^(|O|gz}!Ni z|5%+=jh@rvQovO*@5`c8Jf@fT*Ln$*&fmHQ?Q-3lP2Z*^wmKD;XRgU!hEq~j&XhyM z7KrNhnD+5_8P*A)=>V_fRaHy(9PibPcAZ)t?{Dd;X!Er8p-7o3e`)gGn;KR!X> z{GZ2PHCnYQ+wIPOY#8~05FkwhpRPRn00ET}s}gW6w5qC5>{|Am!SO{o6xCFK*+c|J z?zg_zG0sb!ZeKv5umZEw7@c=HyXJDtz} zkO{V&Dia(tM)B7ARj^q}29@_{Xy{~NVPVO6E^=+}-n~G9O#CZeUozoAk{zd$%ATMJ zVS_3&Z{DkxwVO66_+apDc`5XNBuV|pkvjDB?BZ3Z5tUiIzL+q6MBM-r7Jw!w44~$H z8gE!zTPrRty#gay1=dx^(y*C}((mF?@utp6l$rpVmsE z$;-045sd)$zft!*!@sfl4d2Sge7DKqj9jx{c*vPd>(;KWzytN~`R zeB2XlST&8{ z7Cgc9^mNNJDm7;=+JF8M`EY5DtFI{m#8-oJ*zB6@4Hxd-)#cX31AT+m-~%W1!Fb#dZGOif+0e*dG|O=%-p_^wZCH@%WB_|ptHsEUhwO2RG2d*<3t!@7wUZqK^eU5`$>)HZs{>;wmZCYE!^tRbf zSBlVR-8uQ&eEH;0x1DRIZTTCxdM>KE@5zY=&1o&Ly`rIq4D-YFQ(fMeESo$xpb@Pk zpH)y)3{OZ1MUr3^tmBlW^A3HvGbBSM2gL6J^}}iXK?@6U8j6Bqz0b?bY5k&MlJv@* z8-Mh7vwSghyRndb30>UXuk=sWXzd1mMP4rW>f>%+11q>~=-HcFK}#()cCeVBC7PNd zo+4w7j!!eZN?nlHvl( z$L-2_Hlaw$poRZPyz>N}gs4H6z~JSojYfPzLi5|VO8Xn;?ta6D)q%}bW?T33Mwl_! zZC?y(YE8lP%72`_Mgz6i8lOm8#E>yUv+Tfn})KgZV6;YUF|cZr zQy6_j*<1)o_x5ObmRBqMF71xx#EfU=Pbaa+lC;5Nn_YXJ>T$!JVR4DA78sc$NSs6Y zgSQjOyzMm_Co6j#S@HbAM=#dC+Y!|M;#Xy$>Qg3Fr_s`&{rz>Qxzh6)%vEpojSH!* zF@NTnx^05<{DT7nBa3EObRv`|p|o(>vxkjw6_8Y`3!f)$YJV1c+uhS{aI3kSVfxwL zTgOx0&QXrh9@s9NaeVK2d1{N{a1{EMdFu!Uzbvj*F(9F~u+5ezX^%o$hG!7dH!^L> zy8Imz!4YsB=-Cdk<59gtU0d7uOV1il7=Cm&+8(r`;aS#ppMf{)VqC@C?VK$wYkp>B z%Q_$J&v2HHA}xZ9i|Gag($DRtgZ+}8tZq*c$h7G7mEQeQ1%`Sq>&`^~1-#RQi9Y%0iJbo(*A z$x3(6odf^ANv`dKtDUB~_q<$Qi1vp#I?%r_0jQ2?=Y7}DHZPp=XzHz^Z0a{bM8p@v z;6@DQmnEoZpWOd{y)-7G(AN1$!h)J6j^qrQ*XsRDM@MmW6>68R`(vid&7C{JC}k{; zY~|0Ln72kLzni3H;1S`PxlTDn*7?J!hp%#LzMpy$+d6eZ`r!S@R!2A6ts5--oxZm2#^TbPC>Ph-JLg#AjLiUWfY~kS-xB@Z>6m!p+0UX6nxJ;> z#{B)m?dQ4{>!N>IE9Lfl(+pn}AGy)XCaYSFITBa07Gi<`5$+&iMmEqUD|&%YxHSzV znw%f^`t3{I0|t%l?E@1*!PA2K;AlXfu$PisxKJ9r@dqzbjN8JdWCps$qgG(%&0OI) z62TxAtY*xdM8}N_h*|Gt*tvZCWN7!$!4(6dtAO&dpjAZFY#}5#G|972i?Y6U-YPSk ziH!88H?*Ze2;WxJ`WjfSKLCSKw!uGFf!^6^!vy$P;R*4{U*6Zf>2a*4e)Wd-jIhew z6Pr)iT)3Fn8Rs{-W~=i&WdOuc3%IpJqJQ8!2Y%Bu^N@*;oB?9Jl+Hd8E-o&&VkeQS zHaoMUL-3K=6-n#d_Ath-ymRuC&K zDbYpi4y6VN+aqB?Q=n*l6?H9!J_;%-2AxybY>QR+ujH4UW}$XvcX??kKOOdE=QRiO z@sE&FU?`Igpuhe> zK0aR8k)ulm%i%d(E%4iM4)k&8cfY!9zpXZRGHUcGp5l13D)>hcenwV0dEDBuD#e_L zUcI>*^wyJ3iH~Q-E5Lsni6VM|(JgJyPAQUyK_bJ_MaKT#*>DURvoEhOl@2YxXjnDV zMs0Q5?DyS;P)(vn%t7fMaVaJ^O` z(4ZkheYfOQ3?cxz#7BsgY{5`gpGh=r!clWGkXN_YXq8CaXuLVA>_yqGBdtljK2IEu z4EhGAEpl<=Hj@U?#~!|9u^2S$?X2flQBlF84}dR^Jgke+jzlaNEh<_SfqM#kTnJTc zR?O#g3pLn5$*ZepuFp3>4q{s*5VW)QGWm&}q;Jf4^-QV0WOod;Ee{KLCK;Q9S2c7G zGioQ>Eh{pjE6n56E@&UGL6++-Q_pS!o~QZI>qxNVSof<71ao|pPa5M<5i<-lLi`G{ zv4en$#x`Dkof@7xr_WV6arx30#&DP$0k#+enYJ)JtNS)ZnvBW4=rWtAl&FTW#Y;N| zPZf{t;}SLVX?n|>WP{eB7|3B4%yXoHP3!O3GaL3lN}f|Q30?%<4IXACbR^mjEjxb? zop<|AZ$udsVfeq(ukFO25*4-7f~hQ_xCke12I+I*(eeNc>u$7Y+^iozm>)BCzqx6Y zoxaQ32Shr}Qm_BMF^lJ=k>QeekK7apxOy{J+PQNMg#Wpr$sO+G#4m$$=P?UOb>B zP^Y{N+ZurzSpmD#gWbn>7-8i0&s*M^NAp4)EH0!ja`X9~pb?rE`S%+QFX%1{DOpaU z;N{B+CplNKZN|pCtO7>SS|dP@z&LvhruX$VcqUq?wT0mvZ8-^s6u7t;pH+42wNx8N z{>>16%$ql_vLpWp;y}p&cvK?^orkm7^E(U^BD1jYMPr_g1_mL4P_L7&3*v-P;7lV@ zntdGk5=rFp=JN5#rgTh2^gb}RYV+U|xh>Cz zIpBK*;LL%Qrk`bnv4`EYOCaMBFA0#J6$EXB<%|3axLy|jrXM0k^5==>psqrsDUUjc zusAe-6+o4YS`9&Z(L>{oe*oWo$f!mZ0UsgUFV zm~5U$bl3;WwC)l`=J<#8YgSL}-F$sR7_Me3z6T{;T&AW^pKL#B4OGkfQ%>qewZ0_X zA_*tROXbj-nAJ`TqsvSaB5gWHeZ~Y5EPEc-)m;rXUn0i!d=~R5wre~XZ6h4KeEmS( zPSwwex83~{-CyHZ<4p;LNNSB{e*L3@Cz`@|-!V^rD9ijfgf3KQ@7}#I(DaLlh)DjV zwfRL&zU2I3$@a$O_9hzw(&W{rOu0K@!+}FUT4f<5j775!7m34|x|K*jdAB{UE@dA{Qi76i{*R<<&QRD7>BTz#UkW&+=oV{3%URoh_M93RFfTs?1|QI=VYRT&z#i7nq&{a?E z2Z8nmOYZ3zX5qSzyFn2Zh0EV~JwAHP{HSzE;X@hsC=h1T+0NA_2LSs=y@9ySv-#b- z)IkQYtc#o5Sg0*e_8DM+gM=pv>Zd3Yw_fm_BG*r!KSNf$Eu{u_fp!>?n(@iAVXQ`6 z3zi%i4m3Ce(;C5I$aTEK&MEEVJJ>k-&OA4@YBOa*m&aH@;_a8l4O2(R-U<*#L_NIry zqJ=ww<9*OLpD18$ZB73J11LftXyH*{Qb*C^S*-N85y^8O+)pFIYf+1;Uo zS%vZD9j+@nGQDmlR~o9et-rZ1XJ6Oer8YLFFe!iT6V_94ZI#pf&Vlb&D!n$AgTL-y zuzPy#rUmRG&B|S4?5{7p_)*IKLw!C%LIp_FT)GFKXlFKoDA$5#FaeXBaX=);Awu8? z=$XXMSTaR?wCLEe3fkTtaZXO2{xc4QX=od3*xP>o%cethqP`d>f3t?C8~;~3^8 zV^9+0pg?#1Ip9&?P{DJ?yHi_KMrN9)K$4dSOtBJ8rywaGt~U$e*2N^QR9b(|z$M1M zW2W-CFT1sRRRnvzJ7xxMEX%E_+#OTr8Eqq^+PW&R42mZWRxqqR*k5L<*323h7$~xx ziz{rz5<$&dxEb6ZP!Z0EU{ZH7?2v_d@lwI6TXiAElB+j3FDRPacHOXcR8h#6+N402 zpSo}6OoY=VNWcbh~gf?4Oc=6&4PS z;^hslS?|4~ZwNt^1V^_b#Qgg^mZ`EDLRIDcK@UDD!QeoO=mjIMRG@qzYMZ53Be?f$ z)Co&*V0YD`3Q+Tz`0e0I2W1sLdGgZWWw~Mk)Q}6H7#bc`H8r(8<&fE5x?wiOUj(0R z*2lO0D4(cpYZy8%rJZ!60{;Pc`FKzxMW9eCtRafJaKk=9K}K*Kh^$`Mw7?g@3qsAP zvIn)!I%QTc`Dqo+lq@r~vQkEotcqGA)2MA5M1!5jlme?MAOKCa-2Sx}_-1ePg+d4U z6qz*_+PhDhtE5D(3oeTg1F`fW6aq_KU31>(=gc>B)v^g}@cp;x<6fk?!K*F^=pkiT+ZblO~Cm5q0T7@D5sP@esj9!&Bh= ztFLc)eQGXyOcXoe#_Y7sTdbPbxbC$k@9Jo~;8VqWlD{XUL_T=lACc&Wdyk9*mSX-(S{99wRq3!=;a@hWmiKkrcYo%3p5O+gk?=s*lcUz)R6h)dUEA}&1ubP z^2v5Vl69lq$PyL8MrJu=S1m!Z2X#@kw}n-nL**g2Xwmw< zezXWqYf-73NJ!9leV(t%Nef&@$J#kmR9YWLOJfiCn&pdmxn5=!P5-icP8rDT=VehH z+>i?xlTtQ|c;4uXi7H-rM_qh0LfV?a{;#7(j2d+w)If$QB}Q%59_>o$1O5ZGm!NW2LM&0;l6io5pY5L0s+=M%q$@|S6lez4Wtyw z+GOWIz#KLf-Q959-E+?#f2+(9EaIx*YCIw)Hw?k;-`r&O(|{Hv5PVI$?RJ4-e&^3C zB6wFI(l_MdR^5H`Mg}9Q^Si98a278E?)`yyBcbh<+_?}hmntK8SxwH;Pc$WoGoP?9 zZomQ-3&7Zmb!Xbc0usHZMn%q7O{o{IyY8w;JCRWLh@%jj6T75+5wpMRx^en+^A0Z2 zQUjwK8dZLD7PGEgnZ>$WQ?sV;6xt4+{>+5JY*ZdorcEot#R@4~pLZ*x^T4z=Dd)1E zj%nF?l_$vP8;o8yV1Vu?a~qqWZ`8y36hwEAvrO((o2>D;W^ToDuz~jOD+0FkHf+h* zk2eCDtnygjNaxm!pN8o_*RKwhuT1$QeCd3uM~8Z5rJIB#Gt)w-DZASr_p${-%PP(p zY~Ob@GS~CNb1uv&i-CCJhK^*dy|P6R1CVs@P)!GCt?>EN)bcv3w%F$8_gXqB>ld#m zTa@;M>H@76Ko<-BMS?>@9)?V0W_2OikaPIST}Q)RNqz*F@(1jC&=M*r%vx?@;*U21 zq+F%^JBnapMd8Jk<@!*upDTpFs1MRN73nA}(28J&dB15e(kP{Kj2C$OES9Y7S)**t zo`C+r?EToSf`vQ*DF3)v$clbj&oVya?{1iTlXVV+kf=9vVQ|1Ave&(x5}Ej4V!_@; zXJ-nbF=PxJl<_DQw0|d zewx*AhroR_CiwTuHjPc}@l}4(4el$TqX$Cc@QMs`6d|n0>@DR#dVcoh#I8u{V zZ;(++kr6TbnZEOeUBakmq8{6KpPs$_>+@W6%v`!D-%dq-GOtrtW!|q{{YAycXIxTX z6Cx!^S7{dx6{BBn^~umg7b$i2&N_?EeHMNgoe_Zr@WY&Rkk3hj)fTp7S=vX*{7Vkp zMPU;vQySNu*7PromOimadr3w{+l<-29MhzVW>l_XW@qwh1f)kV3xvW1>fJf zA#w6g@>&B64pMk4!d@IlN`{WaAZX4%*%yq^B=V-1rw@+cU|dPfocfHt zpI#ZQ;y#hVz+v$2h7HM=jLNQ?!yShP=Cr;DZ;v!qhy+|LtXyJ|BF@t5_=O89Xu)|W zOqg)~n~|pX_Z_x3_6mYI^?+C@Q*EyDf#rS|-Iog-q%a1*_vFcwsjqMEh5&_Rt@Ibj zlWO;^-tljI`s{$EGg3Hy6H)($qDuAa$avDf9&I&7xrc?M=U4Vi>Q6*^1@X%tLq?ly z9u^Ye5vV6Np=yS6k?fBjKU^Tb_!yumuj*lLR3IykSq5oT(8xtad+*!VloGQ(qvy-7 z?i0DIWOO=r`t~uC6hEnv+_;%J*N;IEZ z#N_g%o{cw+O6*qAZ<`UAc(AatTReR;L&R5ai`QB1EC0c=UFY1mY@mT;gRlT29_Qf zKzoY|!EBo?Sv!*h5pG@p@gDRPVHgB=$PC$?-Z1WaZ|?|Sn^jE6&id<`AB#n9xKVH1TORVGKvn>2^V(x11K?+wmVp^(4tzBvSv%_WA`qNJfb?Su zgy_SK*HZ+e$K5ACe{k5n`#9P&3UB1Vl!IR8CaRdiJAEH2cmQbie`U(2tQlH4}r$36DaC ztodv7srFUw{+ge&3UZBiW(y=Ztf;!P|HN%N5bzfkLEs3W&0&~pzCtELx9*28?$#1I zuEHsgbrMPnW}e9_umd+5|)NuG2^dKl*{oG>z4Y*)7L zsODw{-@e~nw*-Q{-V)&ft9)47X8+wqRLwXk};7dOJiG8cgwD=qx?}oXy7;m zQ{r*bP64!dw2lin5kHDnzk~#7jL_5w{G6GH))mIg04&N+=?`O{xm!3eQMn~iZeCqy zToo}}?`rAm;QB)*0Gi&6PaXac>ikkkLur%#Dn1i19lx;J<8OzcI`vyGnoNY{n z!hx=PqhJ=Rci?~yxgOs6`FVF?O&%N&)?Bi^2dfAduw@X-EN|QbwWFc6j%y2D9v$XMLQv4erhALuvdLNo?FRWuN%q-!6yG;p z$Xqh4YUSj#xh&)#gKJ+l9Ozz3PHafHMIcEyKjzWpoK-(mSydBMdz+ASijjGHwV+0-|JI@*%2pi6@Jes{8o_Yelc=qRjSXW z^lZ#tU=)hR^6-T-Ud(9pZ6xjkWfzFU$OQ`y2HdX$90r&T57!b&rS}r(iWss#0HY1Z z>ZER?)(*QO-eg!Se_mxIy*1;r#9`HPp-P=p#k?<5Q=|fm&I&~Fu!zTn>Cq+tR)u{Q zcFHMdr)}0*>Qws$(6c0XHHT3qwp1_%vROTI(;b`#mP=32+7co*V;91oPu3HOn99~I z+hh@WB!Ap=y9vCRcL{qws1{_s(1LXVW0@b_LG`XXo}xi}2$K~QbZoXV(MfQIR6GT` z5rf9CS^(p5Dk+8B(Gb95&7Vo9M6VOzfctOWtl#sAd1XensJ39S7Vj0HszVZ-RV2fyIV;*nf_Eid*QyWbHl(2e6MIJ++}X21B}n?(%1B%m6bKy9b3IW4fD6i4c}`h%rdYDrILR6Smp7Sv>|QvpcJ z%c6-&ctnIEQXD=!wxH2AKUdJpoXV$cK5OAwFDR|9+N;YakBFmy38Ds69!@$!f@UBE z%;@_(dEJhnl6ir3JLQw}f~pb}1rlCE9wZ0WlRPUJaMpTkrd)|c$A`fcmoDe|!wlsp zBIt+w#qce1efM~xVQuD?jPwT4`(4^rjrj*bi?X@)Obfkk#%kHmf#PscZGragWp5Q0 ztxUfS46eW-oPR28pHO_4O8YIJ1B)*O9Ua?FiIZF+penf)p9n~FepMI7FJZHL#ZN>1 zpKt2ICug0Qoc;hlQO3(Lq?Q(iKZ5kOePo!9TW9^d>k%KlBw@Rx011NnR!vQ z0Cg1}A*=a5ww^RU?rv9fJy~k5{vc}Z#-_E=Sz&V9*#BBX~p*3sPK%lS*wC&t2 zgh%F%#CT{F3;g2p_~e7oX5M%)J!ss72@mewOSJ01c0V-`r$!qX7{E0x3CHDRW2RN6 zC@L}J^)-Wi2*&adKEpr_QRL<6=3m)C!lQuBFyE3xp+o4!M*&t`+Ff!h6%ripE((_6xOUq+c!FZ8~=3GB|N@$m#|mAt26qb;h@|!Zyjipqt?Q6=ki(= zE$O~f1mn?GUDTym)D?S4*9y3R43r+rej26b?8uW=XkEVZnqXd#R)S)3{;J)+b} z4krdzrWrxU%^;keXeu{t+RB>u*R;$p**nitHjU}#cK_}zi^{U`nf2;B4ItU9NDf;( zQO#hYUbvDqK*ty>)zW%&#y;|1C~pvzBM2fGdr?0w&VG!?}rlS zJ7%`7VERgZ0E(pAPxoXg6!6P;VKfI2Wy|z)=mU6 zJ4;R9V{QleDr5gfpzxypyG?}|gYw4*Vqg>=1zLKo@?M)PU@#d)(d7pjUC;Dj6sH@=q9O~2$5YZ z1M4e)xR%#flsp7)i|G&BVFSz*`SraB_t+YISrrewYK&xX+1&)l;~z zVGs)zoM*8tI72eWlN*BI+l=xrMbRLP%7q|!gOj2kS*E6ZFNBpGddjX~>m&!JIIJ0G zlX%&hAZmbUhcW&ryxDo+M8Z75>BZ*;7?Go*TekS~Vaf5;JPJu=Z`(6Pst9|c70M2f zTbrsy?L(ls48A9O~}(Q zV|y*w zXmI-f`N#UP?n5|~k|>63TabZ>@`0Zh=^)6Fojx9e9CoDP>u1M&Mqhb#eg5hR!)z1g z|3f#KQ=1QQKis2u<$1Bl1lolyUB)Zt1o!#|f3SDM4G$sbA1WWI$DmFeg_1ogK;?h5 zHs|g*;Kp4$9~dxAz3=?|J_%%osjx$S8)mw-SNoS^sN{W3Wd$Z_fRNY-jCPJA&XeK) z;-5WYyQf*7xN!C$edJ;kwq)l~!nt>Hs;c}5#xV;5$!8x6!bXHHdr-^wo zJ9G2sJEq(8ab;O|K?r%L#Qut`Hi5Wce1oERNFK$aO1Y|pSdg{N`df?_S^5Bpax+MB zqOu$37UaYz4w=Fn&9;=Zw5Wu{6wgQ_+^#?9+b|D>K5=kx2%%#jqxSdr%gvrG4%X2_ ztmX;G1a2pQZeC916j2Q$Q+2FEU(|Dlk9;bESdhWA6C?wQ4w=4uSAm zbS}5>1B869re*?+eCZD-*}T{`o7^I#q@>=4nH$1fJJM(}0syEK^!kT?#@65VnS_51 zu7~$=U`d4od97_<4{xp=Kv0a$^f^Gco>C@y*>l&K>k>fbPtw=LkBW-vgEfdJz=oTl zoqdF?OOwM_uV0r-9}~cr1!G4Cahvlimw}&Q081-y$?DByTK>fxh@tT3CmihG?op_i z$?S}72iRleT0(S@taWn>TAA<>&zmqL(Fu1aLon20EBLtg3!*CFAoC?lc7^j%$_;6wX#Q}v}Q#6f_AOL|$&#ER^ zc;5xB#HIQE2=-EDDKM%Po%`RT0k3SI|UBtz&J`S82lER=$ z!t4!{Ls3z~D0zQ zu5Vq*c4Q8YmiIrgfHzzfegTsZ*$nV}b5P}msXC;KWu%-zKQdIK?fPJttw+2 zP7ukT3tB5_=P`BmoY^Mb$l;$ID**}+wTZKh9qx_Tuet!&XDT%*@PsvmQyP*YR)TG${Y|k!B=~oQ?p92Ok6$A$-X$ zWAzAnQeywW$H=W%Q9XH>z7_my1B$q&m}Yk#aoQRHiz;92nG(h<3hN<~aUcBggb1_; zg^Y8yd4WYc<=J#fjD%&d3?>KoJio&p=Ycq#fF%npUMC`A)7?Xa_E6Cd1CovKEZFwu zWCuL>@widS?qe0oH*Vb;gq!8YxN%d2DaG?B$$-3f1W{>dpaJ$9AT+RF9XC-! z0b701Nt4t$SeP8@8lYyT=@wL3XIUw#sv3fu`R|XQ5zY%Lz$Pr+M2mY4Favock|6-) z1rB{Id8BS;RnpR9%y@XT#(|kRH4vp0QHYTNKOur#w1Qcyqd`$p(LA7IDM>IkS|sqbU=jp%&6r4qglBO_K0l($~{txM?8dspGT}nGQG> zh7gWsX#QPLkI(=epC+^wiNy%L)FZ56A~FzaqeOrQZUzdoB%xI!zfQy<&Wn;69vTD! zVyZV&;vYTwFiLL_E{J;i=jWmo#yi;WEDWqbiGg4pCP66Dmx5spqpP+s13_^-hlP)! zxdm?4EbLA%DEuNllc!h+iBXf!c(tg}_&@=49>Yr>BUXsOgB7MA=;uA9Kzms>jA5TM zPk$Sx5El_4hJq%sV%zW2&v{dhmN+w_3<$~C$FdQJhD^S|wdg|C;_&aGNk4>dpA>|h zbu1QWCYx7sGGu-Tj*AnYya*Jypvw^7iV8Opu6a()P{HS=)FdRMGt3+%GbMnJiJ z{5Q|F#eevzmIS)Gaa)s<@sH2DnFqAWfPg3{d=Do`XJ%`BMA-sFChRxm&y1$e|0WjZ z(G+ABAa}qm|Kx7Y^L|tY3Nh`dfcT4CD@h|vr6t+MQQX_-=zw_&(W4OOGXhcO{XV=G z`#-3R+vUz@BV3>A*!CIP`U?p&@Ef!U`5THoJAOOo1bNhY*vp%xbl6X&Lu7Vgkx ziho5Eg=6MsW{2<#LI3S(uNni$ZXZTzCr+O}hG#`pS!b~0c_OZ0q(fM?7S0Gg&$mS= zgez!rjm^hPFjL2)qy+&z>Y3g|-(`v}#xLNq}maV_u^2+~tDa+`kT!fGa zA?ZGvRWMvWRA-&WPR1>WhE#AO*|&u;_+7$;^Zp6=kv3-O79@iJ)8g-2;}`*%6B;G* zbXp4~3vN1fFwmv|L8BT#aV!@LcUXM%2o7qApx@fs>IcLG58yZ5c?T}miKS%F3LQ0( zCX18iN9+t1y&e7Fm_PubxvXEE;^pai<`O< z0RY@C+Vmf9G-KaUK;zgW* zxiM837_iX%6#xv%=(J_1U;*{G6~}D#;u+5XzIgx!Xjgk?Hl-_6y_c^zj7urAxw?%D zjPl<%N7NVm5ZWh0rzK@&C5OksDM5aRen%@fZ4|@rp$RoADkPY$5Qjk@w;1gjxb|&f z%N2^6PPhJ2AUw1(MfRh!$EM2 z!m2(vr-CV@h*fEzh9J|Zca^LC50kqc@F}jzA)^$q&l8{wCxZ#e&}Ebq|NMBk z;UG@6&gDf{Mx!yBG?FBx@PZ1b5eZML2I}jACAxSL%U(P{#sSEN(9MxbfEGLwm$-Bb zjvn1tilOMmu&@tp!^Pz&kpKYrqr@QoWyzM53l|hYS%`UZfJc%k`&l{)LZgS*8V?>L zzvbVQXAnx?;=zw4!YwisJ%kE0FH@q7sI?mY=)=!|)Hh(bZo=*fD&bLlBY0UU!^;m| zdGnASP#P*IoCXJx7p}y6KG$KsqKpJXI|(mdWTyUo5DbaOXYD6QPdPTr7ljiKu9WETp za8m#YFq49WWuwvig+Ecnwne00PHSnhY#3ntjV^MI$@p|Y0N&p}EdiSxoK`9#r>?&# zK?YE`DTMcXvK6kBqdr0HWWRg&bUcw`$S?Gll_t;!asB7(W+G(6<<=J$#Gha6EfdBT z^o0-zpE=}r@TiT)5IPA@5T*`p2AX(a0Wb-NQj^nkQr5x`AIk+x*$#lX(|JH*yQmOx(L_#gf{yy1d`4L|{chk+S=;6sQ`aP)w!kVPvEn(%t8sh_25 z=~vR?(OEx{#q{^^Qe%+eiC4Yl3KY_q(2Pw?OvDUE7UFyN0!1?(jGF>5R#f;+c$uU4 zS6Qz)24NqC%Ww(INp<0Z|6mT712>yJ;A`REV)^2RH_=nNxli*;-q@du7ik|_j`>C1 zU8c132;wS!(%vA1#Knt{X+FWQwA}Eb-3?l{8@*t>)<*o(uL?cX(N1v!yV&1>JvQKf z4D4n+o-oNZIio`!(EZ?dX}Y$ssr5tcjfoLvXKsvvQmzE(6%R1|#=%&wfKnST3r{4; zs~EMBIn5Hl`JmPufD=YEZg)c-@4|QuT!>}A+ut3B{|fiwSK#*Ye;4yaWujS12#44w5IQrbnDVqD`Upm0c)t$lY@v1Ns(&MAELp$Gp-^Jdi(8gA} z5H|&nmQ+9H=3`+zWzp*V|59OaEx1wUz6FZsP}CVvCXK=4FwLxz+HuZ^!O{K!K#TQ=jh;_~5Mw z;(lmj5VX-xv}d1Sv&Yj##-xQT?mfzr^E;|vq%QcAf<`tsGtI0J=hdvApGUv`uV;VV zL!AZUF4>dd!VwDu6AKoQ&aCc*HyfAsEbd!8rtgc!?5l%f?9_KK#)9Co#UT2oQ3peN^H80FnlKSGepGUG)JSHV5i%@^zt+0}>byQcU zW?HDh&UsxQlfHBG#_M+Wr~fUr9T(svU51trSSQgx*WNj}5NiR2f&Tyn!1rXm`J&)O z#S_Fec)gQ8{p43z-44Gh>Pj%3JGf=|zM&DQVrmIEMRi1oIaS^;GI~>k-SSP3CT!qk z(a;b0B{m%RA`Aix%<#5@@{Di@@*ATA;^FZKyu_nG5lN9X4{MpM%a>MfhBp|_4tWZB zl;fr!^=$Ov5OXiCJBTa*;Px(DhXVqb0CLkO>IPYmKvjofAJLLr;RD8Eeja^{UG&sa zaB~cm@k^>4J^~ywz?nxky=U&tKtk(`h#(3!|FfOVi^I9dH*(2hNHzRC$wi;)3(6&t^-5{WZMl}=VEc*xze zILK6QAkd(dokORJvCx`m#sIF2y&4sd>u|H8lxObgs1~Fl%#h08gksPC2*oQ*xt*o} z-X`o4SI)|YkpaYs6Gfb^KoNNQ!OMoA4;C%X_MvJB2n2x;KEQLCfju}V2}j{w@v^`hNJ5oO^p2iOgWyapUAtBS zmkaoxKZ*w(_=<0tE+!g2`FAOUTd}(xF~Z^Pt37k(ObQk7i?ILtwiG1$?Flu{a6*{$`Pzx|s}C}VOCsr1Lr(Qk zS;Zpg>_keUGqn(SLaZ>GAeVU9QYsS@7yn4r{!Mxw)FQE#8yja{t%ox_@WaC(PBEp| z469dUS)GU6497%2r41)`Tg@eDVy4meMLfQIZOD07G$dPi+*q`i;n@IV=7+d{nx37u zq>m>~xNB=*Z5bM#BZNjm!bjfN%WgfhdA;Y~`l%!OBSP)=ze8;j6W9#L1b8#>15wI> zr6rnEMSzp23XAX`R?O6FUW9PM4eg=e%9Z<0nQ?PTO!h1n_R$ z9aDr-_W25GCvmGe-@gYR3M+BbUa&6So-<-b{iVw*{+&|f?qaApLUc1q(L>fEo&#;u zq3#b;7jmbM{`~degz&2>Dmo=L6cbKrMu_#tasGwXm>Qq_1W!`R8N^ln0R}Y$>Flf; zOH)%;Q}%@!^`6)qkJ7b6WN9_@+@^S8E)urVo!67*lEiz3I;(S5ab_+sL8{E7XfPiD({z&muopy>f#6+eF+d1 z{pgEX_&jaxwkglPTwiZ>{9|-<^yU2gWiBq4ZT9af7MB}p9erH&Ppiq^j13}EnC%LT z88fDb>8KILc!Er$2%f@`yI}FOySr~%MhVh&*Fdjx-aY=d-ah`MmY(J&-p*O{&sa!` zL+W6o0$U6gy_y)X}X`gnOHgP@AsZy=?GYc=(4zjeq??%*r*bGv>ZbNk{CiUDhYR- z=0%)@#!OzRoVzPjH*yTf%L0?;2tb#32>5zPNQlwG2ly)pM_hPOv2k%xUV|3-q+`eT ze*gj~%yBH*R<2x0s~qy2s%Bs6>uT07ah$n!?b^5drlFnzpMBpzPkPb&Bf(`ipm8FD z|9#ypBYJv!$Jnj1UXVKUelat254oVb=i};1?6k2w)2KP3&+0(h-2YJn0_xE?n)8Yl> z?|Wb#cJy9i7Y{=jf(ZT4f(Amh`j$tG^9D6FHD}D8J+<;K z@3~Ju7cH@{ef;E!S&Gp(lmypwJ6z9F07|-VZY1ryXZ5mWBMAv7?+w(zYfC=zxPtM8wQ_ATCx`1P7NT!wbhB^_P9~{Qz?VRga>gqHVA9HK?=4DUn(I zyGFpDi~~875Fea|V!TGOHpX!t2~;r6CNHD1nK$}vCPSd`e9Y9;zh*3Q}KT&_{ zR)FUkTy_!B4%Y#K|CQ}iPC}7;A2!ymKqJ5b>5h$wIL_?+(Jt$?;);`G_wQmlqNbTOH;xWCc+s2BvM7JPHO)TAWTkygsmAj z6=YU+gz^d(xaDBckMMEX#Wam0adf)kSTiovw0N>+@>)AyiO>+D=RS~+AEmtQ~j4?k~26~vV}_{tg9V=-idBUKPcnOJDJOw0JNiE_kz zWzliwfXP^l3q2nnlteS;%z4+u0bkU{NyVEk!PympjHn1RYU=Kw>{*VdGZ_Jc2f?8T z|B0S~g))Zm_ex6*+a*q3xq8(m!Fsh_qy?V6~FiTet z)AJBWfvA*}0LCR4ZlpVmHPbwL(?A)fq3_^ElY71RK5{2R!MaDb@l06#yGI8aNdExfUJ zXZ&JDCO<#l+(1EX9D*TTPFy8=6&9(ykeXtm^c-G@^N+4XC+rIf7uFwDGMwu`&nH;T zAM1WF+~J0Ms2-pS>}QaK)ddz&8sX5Gr$^$@M9n~aQk!pVY>fY(V!rvkd;H@#+vw1s z-$gV8kdaJ* zBwG7Q^9ww?-#=yr-|_0ftCp&+u0~)Zc?NM9VIpgf(Q_I~^-9qrY2p+_EAWz1@w(n~MQn?Ii%4b6+`n{$5DJQu}JzIXpVH?#w=tPlfT3nzUE z7=P`tY$Yzvvw~GN3$(?nzc2dDR;ie_wP-AWB8`xhWn@VW2dFh_{@8FOnZ*Y~0RQTE ze-|M4kK4BwA=I!~07AxIP*ixa0x@^StXa_aBvhL1If`FMMICsmM4B=mW<1j8Qu~I& z1DyY97uQ`ALh(gjY}MHts2}Q1b!O9h);ahi)=w<>sB9W0ttZOc5Q`Ss z8pQBnC^WwYsWn)`7vmC+!aJOjbV<>QOVcnvr*?{Qg)SA<7m4r<)*A2oOS<|r6oSRsI6 zeKF47WzgPfjD{yF6|2kE*754$1D<#&O=7LJwfuj<=BcZTp0+z;C`L>V9zNtn8)5)8 z6@rZtfsM=o*rk}NeLEu;I16l#HgTwDkl@JSAJ^NE+`7h$S$+BlsL{WFW|spEMZ^N= z)qR}#!9&i|u*G(PIRl(YCPJXNq$qdMxi`%++^P{+782TZ7 zs+RZfM=_Yf?g2&)93;&$Ga4662_;Q4MsXm5yw}z}gx4AD24*Mei%hRzgboS-qn{2z~U`2_$BEtrHrSS5lQBnV`QW+3;)fZXR9b2FmjjBq$m zc&3Ccv6zN;*NpoMV)=>Th!N$0tW|_zo&&r=39%>Q7hv>vUZQi%mO45(@GM?@$M)=d z%5fgTSX7LuHK)c%dWj*O2sm3F0)LK?LPA%6w*y5UD=RCCJZKTs=muTCKJU+n8!0`? z3}N~5<;y2fUlwfKyg2}O7bS;LOlTa>oQcv40?~hw#;ASD{3i&FBqqZO+~k=0I37rc zeh!XR;ndAvL;S?b(u$AE(uxui%dJe9KLRHXS>@wZl1(E+1(~N?sK0-V$lpF(-_QNf z(P50Bq&;sQz&8w7E&i&HQra=grM+qG)mdY31|Zv@t!m)x-lwFpbEk#}gREjex1hf= z!*WbuV4&16bAR$te3)~nt2unVGb~r*|C4Rv=YU?#*l55FC7zgzRS)`IO<9 zJt}$eVk{<=!{Ii`%_MF}A=wzz93r;RMWC@AhRV1IWdi#8`l#TDUbFApJ3;V$wB5Ny zE!P?v8WI=+p5I861yn=;0>@NbCqABuPYzq7j99V>{Ugg)Wz`vi{V?N0zfcU$mXhoI zKc^un=>~KskV_vzijoHn27v|i=;KAT8ApPTwu5-yj{$-GmMtUEnWE#wFrKO^O|bS_ z=#3#)C+#a*9t7GES`&1)6NodDrw@Hjr`EY_-Y0PTYUfU%NbBbiOXE-!O_reUs0s5h} zSGR@lkv~$#g*Wh{W5dvWfGWrYOt9Kid~DX2J6l=0Ha3#G-rVFztqX~Zo?#sq ziW}~Jj@uWZnD#)z`DY4^E0a@Glib?M_Vsm2`wmU&`i{wo@x+KfVK>bbFYYqd3qp-W zgCU&brHI1dOz%5*BG@S4)~$t|IDf}*SuL&6tjb^?3$(_%t5yjk(PG9!n#;*1Mx0`l z{AB(;fy(|O=0S3#0YX?nr7`ZUn>MHfq=iS6r2-cP4E=5DDbvr74=yOs23ZL4ip?(Q z$99v;U{a?$oM2~Iq%(&h(Y8GsQw{?W{PwP}ZTl7tyN^$0i1UxYZ#VBQe|O8^m)EEbGh zd8j&O8d&_G@(KbkMP-?6hUW*_U!`WSQVzbGkX&YyiHXTqsd#*g8Q=p6ne-0l$^H`1Q?=Xi>CAOH(Dh@nQ| zL&Q%$6s%N*x3j-qDd4SCm+pg3P2jku&U@OC4uo_(S4pN{~rAau=QU@$s3wQqO!lgf@U2v%0lY z%=uC9)?-yUpuuTvj)fgyJp&X^sO!rY{@Bq$r@SA_nE(1hmKOM`#JmH|NzUIFh1{=S zgS%s6W79PH03za7G8-{cpkR;oj4TGh>^wEMUQQtae;mCB#!pclGeNE(*Bm3wac2LJ z7asCS3nqj_KCg78^PVPk(pcKp7gR>QX=@tA@k`+rLiR@8d)d_naHUrpv)$7EBFP5|IW{=aVl~! z+C%Lquc5(c6ubYvZs_B~&zzaIgaWSGGpDMI6xXABasFW_aTfj|p}gsP8Yw&>Ht4Nd zHNDs!Uvq|*R+Jq0?885nv#ImP#m4ldYRdpBj)%aPXvT(^NHZFG(8MdgGxTc`%%3sR zW1dYmS;>yPK~6MADKicBBlBRf(v&3%NneZa-#<*%6rS(Hw?8IGN1ehEq%qj&0KL!t z_TM*S{(J;&+k^7*%t$eKOq%Wg4rdsc<7Eh*tbF-WA8_yt7+vs3e4LYFegxx@bNjzd zKd683&p`d1_8F%9l-nu#74(y)1e}wfj3khF-RpT*@ExKIY@T8SfWtpKJG;o;n$0du zBTB}K6_)C&r-*|ZtxaIv5p&U~>F?gX<6s+_oPR7HS!ZnBWqTe(wi6w9{imX`yz^^7 z9ihlrmF}D+Z)z%&s-3zly1ebxm94_K!R++1Ky)O{8-@mAiqcaMpgA85|BunhJ9idC zYkL@}b9;P(G)v7ggH#8Yl$_xa3r;hE$bCgvoETp-wRy1ny`0?ZaloNq|VoG0s z{Ns-K+v1u-{B8wO_%s0b7;-VCpg(KY74wyb2tsYvNH|q8<&HB6&YLr5&e+Ln>wqM3 zqwoa|k{;#$U&j#@iOP-$<9HlPy}Z0Gm8YbpZUR(_oM5M#s;Hng9|w>;TYA?{i#ZQ2 zHgtIx{L_QWCICi9H?W);Mh41Mg;t)RB~m8xh6-_`%DUS6*$IqS`r-3@c(L81w;q(3JspiWzy|QB)g^bXcWp2pECpw$u{N zv#gbmD7}o;f>cb;j5D!(I$VEqVs<@DrZu5hK7c8{h@LKA_?P)`5&@vPQ8gJ4U_Cfp z`YA?HES4T0h*4`l>*$D%3k?VufhIHly)I)wH$UlqOA{}ZD0j=tjkTU+n5X-jDElG) zVCQHU&?d6Fk-+L~BrFBjx)%=U=0Pa9hqX=MY!Dp+;Ads@M`#`~RWqQ0)8(8TPzesP zx4XlSK!Si^BqecH%}r4N6^+)oWk|J4wv;3eZf9?nEvO` zrs?cQdXBMA;nCvx`u0dnTnbbafUP#g+)m+<83P2l6}mbwWAtL)r|?YWIkWIV%=lCu zYXQ`OQ@d_!`0K7+8yn-D%A?L;v;bs^o_L#Cn0l}*ss&mf2yTY?Th+ebzV!5d08#*w zScFGKrZI+{MxE{Lqt~pdG2cCRI{cc75Tsoom7#5Y5Hy-DoD233ksAAp7ypvCzh7V4 z=9aKP^Q4xkuCjWdOzV7I+RmR42D2NOO z&!8xq8v&Llf3Bi$2MBEyIzZT*_+qe2ec5a({~1{65Yk`L<|ZK_@uB{U880|<%P(~5 zE`(Jdbvx32Y0m`&1d#Dvu;Wi^(E%zd{(14JW4GICz*4xn%@_`o|K;zT6{d3>8+9K0R5Oa#O^|uP&PRKd~9E-JQ*Sbj(65!4<3$e9?2bYp6c#I=Q4VV3z zC=yd#Z&86fa%2mt1eEPT07TFpaFxYU2s}yjhdsQ5*3IjI{p`5Zvt2I+J*i9GS5P0 z4l)%o9m6q&lsS|#&t!;gh|KwMWGFHxgc4D^l4+NajG@d_lp|7xq7+3^z28;NdCv2^ z@BhC)pT~1J&TjAfci-z?>sr@!Eog4ZtE{^R4;?Fw#R-VkVcPfMau?@Tvu{^7Wu?A* z5l<7cABNVfrSyK~>#8K~WfU2kMhijsxcn!tUcK5eEAN1m%lwu0ojQp;#5M(eyO_Yq zsBavr)pC_8+312s7=7mMd_$1}$^$!Q10_@BkE|%KiBl8q?i$}{qqB2kzz4-UICwik z+3J`(3i?jlLU5k1pVWk|iI?e6HrUpv_covb|8#@HzTOFD<<`*;knliv2{LIlN@<;T zWP<6vx!p85B{h2=jauVaGv&+LB}2yMn%d2tEoC3#Q$L#oHy0Nv1qXjjT5kM_D7bN@NHFY}3&?}7ZB~vv zw2B-J?22zfaWv=FD6NR~rkmy^J}&1p38RY4CVYKeXoi&|ubeu4`bh72gpMREw5yR# z)*_WLE7ycP(*(aZ$jV;hCK7OJL1^KR#eH41j}0_dHq%p(^u7Y6hF%|WWzsqlzHtPR zA;5j|bucA`ki2vMeq$103*cLEE2$V$woz1o*BARQte_7M%!el^1}LajY;jfu0T$W! zO+JZa8SEqjCa>StIaxZ9)ii-}Y@{li$)Ei9_JB!6@^?gOyrv*`R)?8)>xh+?eEkmS z5l|sF$GzhQ$?1lnEo!i5@9QqV$eK0!Sr^^&`IO;4H1tcX43k-jPI=7H)=f9hwYyiDwz zL}duoPob%}L4>h!Yhpqo#4CUryibeWM}T#4xG0SUkM%3lhff!TWiOtj34v8db!g7+ zmfa#GJ5mO@Y$eqpzvi%r5?Z?Tps+h;ZL6wco?Zuz(rv4kSm4J@{9w|ijl?Da$1tnB z%3WB7#6?I^Y+5OUfYJnEcFUd<6+B3S%;-j=2#um?R|Kch-6t|iS#~8dvc-cnD}R3P zAcQ+n=rgW@YW*fX5^l;zW}1pkN~yx~i?5n+Zq9mE-0$#%;9;6PnP{`qpC@&|U>cNh6ize(;5{C>VjZdS1 z)R~4VwmWnFnn{;aQTQOGKNt9@Q!KfL7a^AdZJub`V)q?U(&^?j*WG)Yo?eA#&Q~9x z+v?&{{x{Rreit_Xr2Q%+e3EMWx+P1lZ_o_}_rZ6)8|&^Zp__}Pt$`x)Gtku+7ncQJ zaq=ECKmXul&#{^rnK?QAsoiE`Z$+PK8raP8EH$}&U{FvdPdjCQlODtnx0DtwS|~58 zDtD&Mom){6iKI4=BPG%!nwf{Q=luR@_SA$@SsDEZ7BqpU0y1kW{`HMY8bslpXMk{P z$ijzq-YlM_?Vg70xHIFFPPf6+v%Xwb%D!%kkEgECq&;2QD(+7;-ScMdbL$-!D&(yw z3a`cSS$;iM`BxKYm(QN=iq#}?jMA_28zwH^?RaYuh@37ZEvB`Kq1~h(~-7h#TR7{B*#9;)$I>2fRX?7GDHtahKXBBA@3?$Q^EPf1bqGiDPy7tY)E~j4klq(D(q!RrmZ48ukEU(gRvE1N zo*9uajd;r4X~EUZ-Mg0Xrp;NU30*L?Ov~A48$lKMJ<;x*?T!cjNk4o3(;Slg+R!lS z{)-n4fQkPGkv9L{a>V{w_VyJNagQ3eg1F~>;>0H6bL~~0uyXZ27o?{=cUrEur0*Fb zK^66ZS8oPK^p@%sW>yj*XCuE&PmBzVY)~PgYy9KmRT&68g3$C6YAY#oAMQ7An_8;_51c;Tfv)FN zJ3HI=nnyks6(@wL4yCyguHYId5}-?~bE~h-NeFGfzQ(!dRb9WF_4RgikA0_CeD41K z)wZV;q)=<1SNv)Pr&KD-_l~>lv`V=`dKnY7fEiy@)%03QDwr4$*+#d~kaTf4>eU<9 z=6R7FDfg^;3((^;lqw$%8F!h4SW8jc2~_0eW_@jsbYoiE1GJok}Af$ zx^XtT=^1BATRuTwF7h?`@adqAGx#s)J2$KBnH*M5?$-n@| zmzSNkprpblR9)8m;I^nUa1%ufmxsSod#Ck}2_hcA0DS|B#59KDu!gzNL(r&T;mxYpYjJ#-J zVS$sa+JoC$SqrZ%d4B*Vos#QOe+6B5_6Ns%R*;uiDEcR5 zEybRXT38^M{J}$q7AN0M^+1Sa`<$8r>(&xYN-3`h2#R;TPbV#p2ik>)hs%;fDJjFp z><>;~y@px?KMZfjMzekVy>xTV!f=JeWh~pD8Hb1huW-Crxf}SFNT3mhI5co@#4#rm z+O6_ZGTQBVkQ!07d9!AIy$WBi9J}m$;pfhFCMWzaf6P4_d*|dSjs25NV@0c5qehLM zYC!`;hIzg;!9JBk>p49w6T`M06oL zNe>$A{f)54Fz2`D9!gccx#1TsTQ&fDvsA;@QO2+W(Hmdk)*+iL2}SY}{>zEklAd!& zr^9OS-LWf53w|&)YLBthSS~sa<~qWIa5tc@HpePhp(N3L!79T1SVIsI<<+7+^6^|7 zmTkG?emuY{DURN&{5z2*mVZfPmK2 zj*7V5XcB61=k%keC^1CLqVeUd51Ln~D8kjJ&6RS%lIbW^U+}j35&WlWG;T0dj*x3g z+5)5Z#D(^gJ?D)TMF@&XCN~YR6(jcc?AO~VsTb2Ir)^eXEi#~|(+>mSm0Nt!9ayJe zSS>cbqU}+pz(CMm9F*eW&+#UB+~CLvUremcfJX!?1sG+F(I{`z?<3~t2U>bkG3c9l z(}<;fas~)dWnt;CPDd>}8%S8jO-TLUzkmOFp?|Tc4qxv8%AW@MQr03172>UOg~=nQ zfo&8S!=c}>p&J>`G+;7iEq}EsTq+tGGGk16h3)ti(w$DR9=%l7Y;khyd7eDNC)%oK z;r!52&~Ne`acifXkxRLnHc--f7=)Iz*IVGBhL-GVD{XrK2cJdHxd;6VC?yM!ObnTG zvzg24^YY_ei`q4tyQ^-+A=2bh|o{zne$mz|s&q6vMIWqOgS-n2w zFT~-eQLasAP3D*_#Ws>zqTIl&cDhhA0hYXu8t0TkyX2; zCe)KSgvQk>Xk2GCC=D`aB$2{)nbpH%jS~!e{Y~MVb2$2)?THYl0|{h-p7H4s@kRqD zmd@=dkCRT4c69Jb$GwmLsA6OD)6_k5S9+ry_2skPlCdzT^ibPFEu-kmbMH#BL1BIM z=~II%d3BxBp8BsRPdCJF?bD^VD#dV#un8v*Y}nHY^yW9|V({F%JV+rO>@e?Hdl(dB zY`dTbkhFmdzInsl&AjJ$))u|`LeN4h9z(A9=ZExN4tp4Y8#J7;U{fnENqt%#>~QodQ}7AEtbG^& z081obpIQQmWp{p`{+e-A_51G$+Tb=OdTmqkKlqqYY!oELv?Q1)u6Ttnx(5td)0 zKD$bo6f-87tVyS`tnw^DO_)xV%8-F(P*Q_0d>9I^?$qjB2MU^$_yV#9*-&7M(!rKi ztjr)M2I?(Wzj&~xPyljo9wCkcNIx1gn%2T2(sW1@*JEQxeM{reHvc~APLvDD^&#bp0_r3)1&KITAEz%vi zwzxF}zCXOahQnO7b%bfOb(n*l&a-YqW+ze$L{bDEde=pa{qBKtX1;&a^cRA$qUo7T zrtj2q^>5(7^bPK?=J90|xIrU*H2OQ2vdNnf*qy2Mf#BV{SNX8^|2sS$ZkY;HtEi31 z7B=Xc(XAgqyK*z4w+c!U7>qVc%AX+59XlEa1_qi>o93gPMqF!;vyG*!kUKf%4Wkq)D%WU4*w%t> z)e`h+-`oW9ZXc>!aU!)(q3Pg5Q;Y=w9lODHE3I(x?wXMHqkRNIw{g#r=QW36b`yq% ztsNxzQPGp16^PX>*Gv)}2<;ixxS}Erp4`{~&BX&DE12+tal=L-Z<&Nb5t(rI_=yu+ zYN;mUHuDDBD3-wj#M~TNWo$w}&u{CyM5la<{}S!lJg-aK@!{mk?Euw$SDOC*`$$Mh zzqHpZL=>$cQ zWasbpC#B;c9m$g%cy&VC(Vpr1B`GU<4UCh+Ay#T@^0P-X<*|WiqDUim?As^40I%5` zH>n~;sfa3~k7go47_qkGE!s1*HLkD?)%@(*0`QYpD$0+XPrwJH^T63z6Nm2>M+fe5 z<>iB9{TemY^-NswGnqbRino2sA%qz*I*ghAA4ow4J0o6^2ED)v@x$r9U8mvhFhi!2 z5PMI-UzP$h?4(zH%ViN=agX<0^cvvvDh0pIcHM_%mfBH46=;wGS@}iDyiVq#TCx?u9%gWZ0QTT{MLr5mI&4=LPj$I{o9+;6aZ ztJkEc<1|$@FRS(`$ngC6<0mQKinsX>Hzo9pSV^)c)>zZf7}%$UveIOp(YnG;I@@R8 zJ`>FtcvflEs=U<+O%1`F?+MHR03FTaF)}^YiYY^)hzaVMW>)AkZ~MoLvYNfo!3(elJuvHKRj2brvt`6saH$b@ zg0@{+eSX5!yf(neL-w|Lq-BDE;p0HASjo`1kBLRcimlaBN-a2KDVNmWukOBtZJGC} z0?>;hPeedh@+$883!-6G$`CG-QMLt5xKS@I%ODm9_0iN?8qT2>5MT^6>N1t;C>zYI zyt8{J<50n}iic2tJU{Sw+V#$I)=*1JJ%#jpbn9TUIw(~m$dSxa9_AQ+sai9nuoKm; z2rs6pc6ROy!YwqRbP42!kbFf>2%ccebF+LS?YQ&s1$BnR?DoLpY0hoSHNm|iE;ahG z(DU8s1+jM!TCti6XXrNly)xBsqFxi6D<&Blhb5i7GR0Dj)pg%+sH*8P5a#u>Bxw>Hn##3j?e5!x3(XI4-MpzGKI0;*m-w^oFFAwrAY=)zn*h3aqh_tyQ2XsXq7I&bd9L=rN5wvtY3% zt#akcCJWzw)YJ@l001!lRfzF2qR;)z1b;6twGo__4Ya@qH4Fy$`BsJS7QJ}pfivDd zUf(>Dx~81j=Ct>s>&pDfWs9HXpdCC*o|LrfQHP#2Pw4ia2Dr!U9;I!cOp?f{0R*x0U)^KsP|RzhZExBtNcMRd<^NiLwvU&(%BTg-(@}L zQ&nI0Bd0Plz>uaR3g$B|+xh$K0HfgXwL``)y8X$KHl#Od0y#|LQ4U|4_=E}Wg@K>u zrbC19$UFN$_I5|;F!}Tpr~$ib5kn|wKwO}c*ydT9OiM`+bf?p7k(L= z_y59q1m;m*6{dIcI&eTc?prQ>XK@MAHw(H?<%2e-6hPBqVF z1?K+-vaYZidI~Vry|bo@w0j|wx&jU$VyM8${)I_`J^74F$I*XzUXF<%kM9ejcVQmN zT^{gTUT*FYnaV{|>Q3k+O+w7MdmHqh@j&hCqXResNk-Cz$b(KlzV?Ooe|qt|VOzmz zDMZ9S8a}50BtfB@LNYe}+#5|6@6k0>lb)2cYe6_oool3gw(BckS0{vd+UHUL!EA_o zw&{6-{X_3{qnvV%fM;D%Z{FMxv8C2gatmS3u_*)x_zXNI>HuN{7vg$f-{!2v=r+F} zeJ>8jQ)vBuXJZ}PW<9%SM!S0pqU;*x4L$3+I^U8XEif~Az`$b0bySU=Zg5y1j+o#> zMmDO|C+X^wzqk(`U)pNlgnsJAO4X=)NA;>wv0@EHh8vtad7Wtx=Pz8S<@eX0C8VD^ z_?+7%(5F#w1FXnY!BLL48a{NW0n>u?S(@E##?K!-S2YT%6n{B_PK$reax~@F?%oX? z({V;{kFEzMEwhR>+0rR|8wr6c!AR>q@$%}i)Ex$4y;MzNqnj}ih+6fz{cl=(=*LI& zUSd0^LD^QVj4uyQNx|YyUyN1BQE7y`Qh5zIaN=0rfVdx%<4*n3(Hr%cXga*p>hB9F z|2{QHLFZ}!i!khDZAL`Qn>VkNqSvR>oX6%+P%OwN#eh#5c6xnS3w7XxOUtbSvK`(q z-;dtxY@Utm0!sH9NG+=~5J=Rc8^mGa)R{BYl^YzTo7@oM8IG2!mU4sS?CF~8j247` zJ_ZQ}((C(u!8~0sZ6X-W z(k#S9Gax(XVNSmHr{WUEKK^a|*EuL#fG&d+DF&ReMQ>sYh~%sQrN3`Gskv8BGJ+5 zuua_kJdeG*ep+^m2#G48>F6=T%iY#4<%j34X*2_{N@-He+;25thM8aDwwu_;5skW~ zKeql&JQkQZ92@4}vf}P&xUpPW*GTJ?OI|A<55wB5>Jn?c@@-&mINom>H zHX3zMU(f{dDs7L~Gb~HK022^f(K8cjZs?McAw$XPcNyyVu7x5cs!Yv>+-ax__D_F2 zCbVaVE?pvt-MGn({pjeC^X?2jT2S4ereCoglkz&>s@|=2u7l$)52wdamDKt=MRRLM z1EqOl?+dYo7dGajg%(#e^XDJ3R``&t%)PWFpTjr>udGFHovZd*{av5#6)d~b_MzTs zplnxe-yWF#NAu>Tp>LG7|I+Vo9dzNXm*KZ=EzB=0scKFREZ1c9dh^y6&63s(a^0@= zX})t$b;t5_Tdiew$A7|iLdFO>r7OgDQEu~C+{@k%;jefJ{?gI^LCx^WI zwrO(C^u-C!@3lBPXwrjQ*N^_S|M$f&QMHWwVmj;i)P8poL|P+~2zW7^f5(#-XHNzv zwZC<&vL^lk5)oS67Lz8)+;mz@8_1F0pPM}K{xV!wi+!wh@ok$nEs2;pHdc-GJsI~d zcZb=N(?eWB&n-SVCxTMYkDQG@2a^gbgE_gK-fQd8MT5S7)Z5dyZ|Z0HJb2ROFlZ%l z>;coDQ||FI#p#msenWq~qc!>(q`*tf!w0 z>=JNa8?Ao#jFN$*!aQc__x32#>}i_}{d$^1e)tv8jgXavDntq>^%$BvHg6~j*x6~@dzfET%dYDSy6rl^-;xnk%6+lQbsXu{W*Ukzq+si>s zE+=LIXcff_%;Y4!GWfWSgh)Wb)5Lkis!zd}x0hbN^h-C|R^V)6fI18KD7?1j5ETJ(jj1n~!?oandR5T%B_+{SwmBp-bTl z^Cv^7x!Y_z)T&nGR!s6D4nUal91V$}xmyuzUgo(A%^$hI$gIoJbMsv1jW<|Evfg&G zdbtuF3Zl;d!?p|Qw<5(ir=?|n_2oIPnG9=r#n%(IGLJ#Jm8pw_o-IwIQKM=BcO1Kr zDc*UM$fD53LQflC(E81)v0iaEzev_h`^|vYlhV@i`TJTwRMnL-wx_pn+tl?giW0-Q(Q2eo@PQ|CK1Y2c2^%uQaO~ zzaU2IJ}le*;>66pu{HPa6T?C@@Z$pbw;~q;`5OCf<(7;9!zG$;N!>bYz6A^kZ_(nx zW8e5;>Xb)I)_h%IdhFqnkJd>sb`cO_wS^uXI~=)m;oO|x`+4pgQD4kau-YewM(k;h zN1;vHvEe^bUh?T?=M>Z2H`v4RE|Sgep&O2`@w1#i z-rm#QV^dt0cmDUjySQ$RF$z#Wxw*MTyM=~qk2sB-oFXZuN|Eud{jQ{7Ygo(MM+LX5 zRJCet2CY|9Zh(B;qzbKnTa;mm><+3Y_2985zOjVEVNacR|@kJH5Qx zb(#Od2sBPy23x0$an?^lSSNF*g`|~)ekCcoU4#K4%0Br1?s^`_-?W}D+%juAL8Ww)-UQzq*{>B$c~?5~TS!gH)5KF{6fs}LHlYkNlt)imVF6!>9KG?R<*!Sh zUX#DlEpPARoSM%^m1`p2K$+-D1o2z=`cIhFv-WF7Oj_ZeKPYNhfBKg4d8wgY*?qO? zp@h&!JI&sl>3?exEoPZ-t!xJW+?=QuPUO~;e=esgNoYbwC#ZI-+ogTEKyoBWBD3GE z=#Xxae+K9X$ajK--IU%k#5?9&>og4;HoOU5u|ePNTUASqw2D;BA-w@XxJd zoCmS37Pz^M)BU@54Jy~`q|Zr8`7HxkW=#5SNxyMP9^!thy4lKMgGV03$k(Tzx~Yl} z6)4j{`jpFTvtSn0AUNIAq?K%23k2Nz7kMm8oIJ9DY+w#z4e*5|*o!sk8Iy}rhYk)3 zxO8dno~7-AO*I)_qnn)w48Cye>#Z}}a@SWieHdnP>}x;&Fpa9sM~jpGH)cZ;^y;Sao)!VYhB$b!}U>9wJc?L*9VBblV3h`jl`r z&B{IEx|IoM+F0DNR50N*hq6~kC6B@EX#lopYy<#E=j15_f3qo|;N+5tG)`C^nFzb2o zYS})H>$UIqB@)kcPBk+c9f?O~{ud#zi$8=Kfqa*F&7`RYe3~(G7RIO2@y}b678Lrl%$rG)+cZPB9uX=UcvSr1;P1^}$OBLhAmiogVLr+ZCVgtHzv2 z%U?XvA?k;Ai09==qw0@7W^ydKzwg_S)(1AlHGgMp_tV)l(tb~D;l@FP2Pk}SE znZ_o*_VEQ}s{Xc>F_^RuEgU8s*cN;qer9D#tc{+Y-e}GDCh!}_ z*>|(lw99@WZB2jyJyGhV}lv`R;nMn;~NpE|q8J@q>FHJW^O!ew=JU9wo)Pcoq#i}^n11X zm)a^6i(brqE0;}Fk``I@}a)od5U7aT5{ zONH_zK8TDEh_4?ld*DCgWq;U4f^pHu0uH&Q$~57a@bQKnhcdB2Ih=A*nbR%n% zz1dN302rm7!bxhrEp5e*sJZT=CR?O?&Gj4^J9=U~5iw2M~At8~h zzNB8-`3?rux$DTgNTx@phHynIhx1FOuCOj_GV0)->GY6GD`Rldb5BbMZKnt+!(_Y~ zvd2KO1+fOkHh%xHGdg#~JD{8l=SP#&_tk1Li-TbJQo!Zp9+e+N@2FJG94v>%yo_8ylzj!VyNPj+b3sNREtu zD2eHX-;>K~>*}NDh=g85rP0w9sg!YF*%99?z;&;Bx%Z&l`+|y7i%pq6{bzCF#%ufJs1*-$de*SY_WhL6 zt*Dv8FEw@#9+FTu(5I|wQq3w`{9F|9k=p-$_=2Erb#r4z1rHmvpb7AqOS80-h+}hjK_Io&TONrv@Oz2xo(PYOsxf&C$@Cvh6rgdY!y%X!hWUDvL) z!ICic&<#6X|AOnJWfvxRg5ArWJB<*R{=U!M6Ps^$=q3X{L<|FGluqU&INV_MAA){< z$saU00&{H^>MG&RvHNe9l`>b2)l!sS!50yII%9k>{h7TEkfJFJ45E^6i!!?W^w^?@ zX1g=7l0X#2uZ{i7t)pv#qPPylS*gY*1125L%IZ+_uTUGXYYTclw9f;dnhCc7z7hBNW-^lo=^I>6wwheirX4dQq`NP$D(wmy< zxIUQci>)XBUR32=o4R2m6Xvd(e;8b|n=sJGZff>4yl%5IZP<|!e!X1!x}rN0k~~-7 z$nZ$)8&d5OYyQ=R2Zv#cIcH7Aal(?R12E-|7>!P+%)iJy0+q`#*=q#o=!jc!46pzL)OV(AnIEtL! z*gtc_!@Fo;Fb!aFUz1T^6L&C)$Ut?VJqxfVrN8F=Ws%L-2?i&OgKc*%jms_wYa2G6 zbD5D7G<&u6v{?7!Juh8$IDGTgaGTgMl{IgE9Y;Nd1@!1vT_T9q_-n^*;wXLPY$G+> z;>=kHX_}BlpkXc!7KKHf1+Kl$;&_i^!E!#TXx>E+PKHoIp`N~e|9%x|jZtW@L(~~X4c5pm2KE%ylV{s_VKtad?1vYqgNz+O41~;Xgh?ZWA>^#iA3x3$%TLi@DfgU)crNDQdFT9y zqyRoTIbsbChejlMgK#4nd)H~wtj>6W3 z;TJtY47o?`Gl`V1Q7*%w^-mpxkQ>2}3m;1CzqxithdZ1Kbn-ZU?oF)Y_$H;~ymap^ zc2JGD+-rWkXQ$AwXgU5kpU0L2Icy0)jilJZ%f@E2VkhD_G~5KTc? zS+QSm#3$;+y#-~8?+BmNk1%Rw!m>?OBmXMkXF@cXfS~Ebr!8gP-AA{Biep2l8rl`5 zYv4O0uW*-G_8CnTbD+RXnA>lHLSLHM*z9?krrk`jD$`G-3CSS6)}7ABjn^D6bw94HzVKdM-Z|nNwnLL`J*L+k95P`?BKl4%@#RNT zR~BKrk=>&Gf@uh^O0Un*eeL`5sfWn8Dj8Ct=#vfB>`?FYpbvi&2Rd{R6F+^(Mu@gL z+wb{KJQqW>8{-#*GsRj(M6sE)VypluGS77y`Iwo%4RR)Qx78JMj!O|lnL2ZMUXGIwPnW?EyV zUMf0&Y3DmNoV*h(%9x4~Q368~F{D z2z?EBT?gzZvi)xm+brzuwUHqn4)c!>JJgEwLk4iPH2wLxUx$@nXJb~;1k;)5tw1qN z7{w>$t*YpwU^^)$f26Cmr0Q30z|FNF8E|p>5bwdwG1jn56X#^XW%w$T+(#w7fbVn>g$@7YuBd4uG_mh_N0;?FZ$n=<6i7EZMbG?_uVkA(#pg*M;b&)t>! zaF)FfSn!@PqjoMnGN^Cgb<5wlb(QBIn-I0XwuxJpOo$N!Wl^-N_5<7qAUzFHGFB@i z1>r=?d*rFcH~DsF!i|2wh6F7~K# zaC6_kq63C|l&RyWqk&yw zTMU@{{>_3`BY_5P%2rrb?6ug>$a#c%<13{x&4HlIJ5M$yfkvS2rJK{v(Fw;oFxIlj z2Ec8uKYo1X@pO)7wQ19)O3MU$Miba%|L0GUbcsJcWEbejbXNP?ZJO7fQ-B3>DHL^*S_fRfKIv)59fm-|?3s!}J`sT2R0Ns~M5mOa4%A_mNSZ;6* zM;k|{vH5&^*?u8K+fO?`;)HgbUFh~Bx`;g)Z?!XK|Gm$$o@ATuWEA2gHQ({lm-{{3 ztL?oCF|H=)>nT{OgM+B`x{JQRwBY-6<-y@H^RPt#vwQ`&&Hw2I-wO+0mspvjeiYU3 z6>c8s*?=r%zPehHCgJUdhp+l+O-DWv-Z=N>=w8h)Yo#udcVzTgK+MvOdus=!E(gkw zHf-LgY4gJQ2t5>$y}-;o`j_7Obx*s9_y|NeAY`alhtbIsdJZ2vDZuB`$xr!TT$7!$ zZ9Oi>n}+&ix*s?EG;+d<70We?565rw^1D68?eXjy!A-VD_zxA@6GS25O-D5>@?4Bj zVhT=9fnX9faq?G>*Y8T!P(OTEY~qzS@g%!Lx^-1LRatY=h37=CcZoLOyPJDbjT)`a zWYD$Qvt;MWe&+Tom~KxBn-+QUa?#^}e;e~`FUDtm2?5cX;4?o4j1^S2vCo0NssFjr zn<0r1IwNF;n7u7AtOL##RxKnvL-9-yp(-heb^XmNGG6u)*&ks*h%KqG*ZWcNv z#p}Em=c|Q;s3FqhTRUt0cj{McE6P%O3s2&c=?pfR$aRRpGVb24?eKvEuZRK#2o#`B zT6I^>_Vx13yxFG<)3tM?QxBw44Z=2 zM7_MSy_z-$;!{DdHCY)BLx(a3q;IB6`L%1N$7WA3XxTj2_R-R~oPre=S@hP1O#U?f zps7RonsdC8qN1;lZdQcOU5>Ojc+}!$eD{J#5>lF$yL%KF>}i{9?Nqyop{CcGpLH;g zy?y^a%~h@5GcWCZ8l$2n7pkL(4*yh3S4^(*k96vGW2b`Lcko_D);~`cmtm|O{>Mif0e;@mKvvNg# zlNhd$`04emKOup>E#|b6nvmU#ybcY5t)o;Ljhwz(xwK5JHF^HjsYmKfm`$Qb-tP^~ z5Gn5pmp8dGhutyNhO72Bm8prpnSOs&vZz^=O$sRkV1&WTUw;j;aU;Y6z)LY3vJI0z zBSDZB%2zWU&?W~4VVS{!Yx|I<&;XMKG# zOA&)J67=`aPOD7|Fhh7FM$5pT@FtqYv`krk&iKTKgL7O%X^--En$rAwgr_~keD{@Y zk3}}k9%uBJuTSkeVR~WXzuGtIXLGTAqUQU7t_!w7#folNB+8C4@Y%<;u-UrS$jY5i z(R6S~zCAdo|7+pr0|OQAgnmF73oirqaq7(_=q1NT{S?xr+eE$ zvR3r}t8ZZA)u`9XX3A!42>tgmU9tjjvk1d<`RvU8g5e|jZsIJJ*fh?ABy~X(=0r23 za{>KGLW6yZ;urHp@;OlF0Mk|KiWM%n>ie0tn{a-_Is2Hw*|{_gXaJNeH^O9OD|g`$ zN#3ZnLp4#`I&f0>I3$tflxbLC+NVk1lWbMHsL{vY3y;qAVho8s1npXQ_E@`zEzk79 zOST4W;$3OG9eP?v&FS9gK$1xkP7d6jPgC1|nlMmx86Tzld_}7<{Boj3#yWIai;>RLJx^Hf_XxXw`gmPQxl;KTwhH%73 zAe;jQ&l%J$PF^CfflMM7 zAJ@c*aVo7t2#v4U@gmJ;x$tXgC*db$mj(=gQ6bp^}08A2343g8&ut#EQprt zl$kR(k^+eFFTk$0Bb@;37S|Iv5HOdbc`A7Ni_wF?EGZu5f-I%`*hz!;`&gm`AW2Pbba?BHg&HbqldUaEyoQa7D= zGtKMK$p->+^Y~EySdE|5>0yLn_MmQulTtbz+79Q_qkhI0*Wtrq$&W=JOJ zfyh{JvVKE!;tFba_R^k?8*d=HP!{HV9IHzq+zP*kX1>iF$9Bvr^@4&t+b zAFngUm-9`{wm!bQ@$i@GZ+TmnIz^HxDdH2VOA)tqyee!`oNS)tJ~UWRjhclk|fi3 z=ntn7VAu`CViOfg50@4FziSLk z+r&BuWXYsGQrGz|T_-Vu2Q!424pm@J(#h{jjy_luK@gNa+;`{`f+Q1~l;t@#1$0*# zd-9ufDS#4%3xzyoZ;x^frg$0q%=M~ErY$yul;TC>cTrOIQTr%>)xu4>!x8??m?K=( zGP4$hAPWbFj<~IFKqF+>vgL`Vi<>l`Zya~+3r2rnsn<{SH`W#I@3ymE>cNCA`=lRDU52dKvyrNu%g13E=dcuJu5(!Qj)u>FY_mm zq*npxQHuOc$pVE#Zr`EiqWZ=nS%ih%dPz8GJXz;R0q7D#Hv z@cVLp&Uh*4p~f=r4;Pr5oENb=TJrH(HI14OVnKo^12S}1voHu1FF;K6x64pkdTQ%E zJVyI#W>fys$<_l26w08quLS4k+uQ)f5M8Hj4>4?p91sbYY;yXFsb2nLydcT;pFP`1 z=Gu~?$t57}Wzw2~V=+iVwhZ|mlmgfm-K&vxQt7p{BJmyLv5Qj&6?N-HVm36fefm#-a0e_=V*Qc^3dqOeuL}w%R;m%{%{-wwo9AS zs0PnI%`uuAW+1Rp-yc`bp7>e2^5+5=5}EMV)T3w_pixHx6wvS#!(S=z;07q4Ki(@% z?}RSkI9)b`0P=~dWy@}=o`%!DjDHbx{Qmvzdbe|P>L1}G!MBK48{0kR!~!D!p5<;^ zw?6%GzAd3&5%C)EqD)j77c+JC3afrwHf{E65ulb|5yxqs0%cw6;$CzUUPx*h>T-LE zxXS-3(g}k9s?p8ZShgwL)tki731TVtQRG^^k~V4FFEVF?`%7F8#b=p)IN0g>T75aA z=U3-;MGO0u;bf81&s0f zZ{YVPI|By|8FHPFD-v*76ti+v!GG2B{O3OR`%|>Ns7z$!wb&=PWIsr(h|G7C8q_Ja ziSN*Ad}cR0@v@}O9P;u+2#@zO-@zm7a$w(Y7lsX0MofFS^wAAx(H62+QrPod1eo=Y z5`B#3^MpsemT1a;^%#AbjBxhjV=klerh6F=N-%vw1g-G*BWXR@bFLVSll%~gPcBr$ zS@W1doHQgWhQENil5*kHb;ddbqmz>C4>__jJ~}yhM&N|7>d-vD!^WFxZ|};914gdH zf8URWBPMN3oMD$66ED{sIiy~Xl%K;?}qBOJ%_oQU<9Vu)n|errXx zZx9}8z59u9?Ol5EB1stmXP_4;}TMm21=TRh_Sw2XyJ zjq7iJ$m8_+FvTA0n<;BO9ma!atIaps1Gxxs2hqmwGQ^Mase&MJm;>OD7n9yM+Qn&O zE6=BMU-M99zML41B~RATBp94D(Bs*@)hPr&(IeiWZBgSHKi~o;n7nN zI9@&BwZ@gtJdF^&oD>cuqB1zC*v&(6xk)xC_5gHL^u*JODF_e6S?TiXx>AZPS<=SJ zOTPp)*)M2FMZfFuBeQ>7fBloU0n}+Wu$Q`&2>EV_k+*l7Zh)rc=jpZ zlYcAzyaKOwYz74Hu&Iw-`x~&*^D5c)>K9&%BbPiAV2Z`K{R^&94h+bsUhR(2Kg5&H zL^v_K`PYjoqaY_?D)Q!wgg% z=x|Vy*|kzjjJZ|5LeUNLpI>aM33x@83&Q{6NYP2`%oJ?%84o$K|34*0oV~aK{J*P% zW-)I_f`pqEI!@hBT9(A=HTzFFqW)8kSULn+I3A*T88E%sKhL-LA08hgK)|2EZsx$> zA8eL&tV|uYwQJC9J-igP#3q;5ikXV07oHuc;33 zY3dy^?|BJ@uCdZ>BERx1QGL}FiT&#b$$78%mdZu*!>k)@UTIm+Kr~D5c=rC})-0(RLoa_uF(?^h>Z) zDQMRpJ=zpc4;M1sH@JbB9_?36#VlHn*}38=9^DWZ@<~z`OiN~pw+_=V_f=(+e(b;oY|EpTw0MC1Jn;Y zyVaBR)!rXGbl7`5r6ssghILCi(hAn*M$*5ihGllv13SX@`8TRQ3sNly2Zw)W=Uj3d z$lRw&g1&U=sBpchoMf>UR21=$`F&Ou3V^XQCrUD_lFjztT4x=7Iq|kfv{GWNLz@T;!U4Q&PtZ1IH0bd3_V%6dRAU~D zl%TjVBQ*dwvflRWfpz; z3LSR!Pz-$@3%uQ}gP!=U+8%K!f90&_4ZyjS^Z|o=Nqg~I_92-GfLY1VBu!0Q+*i8W}@&DKBv6z@)7*i7K2Z$66rB>r~OKNy- zZrrf+&+M}$A(Xn}Tn(kqR``I_pNMHpp;_51rn@c+Ba%dJCPDXKfkgea|qbND+cJN^6NGgA_9@ky+t)M%mz7@_jwg&Y>Ky2F zx)-nOGy@dC9HoZjm8iqHXmA=3>#?wYO&?bf2n1@psgw`JFJX1?C#As3gj7qBDz}n& zLy0#zAOxMJ#>GFZD_kdGG0{C;edS;o6yEah<(!d{%cv+Q4J|maDOKDCRxh4V^ec0) zT`b@BUoV?&Xc=*Itp#%=%YhDyw8klOWTM|Marq*aR!9jZ~F{`zF{w`MGanqB1oppp(?|J+vG zTWRoIB?8RbZWZUY5}OqPKo*Brd^!KPljuA=Sg zuy)phs&dG9J+9fZCC)cPhwka|pCHJ|abVE-RFx+vv);MF#TiW6lLz;(S9JF!^q|m{ zKcQLU-s51sn^b?ex+5{T)zWLVpja|E5fohF9$Thd5uuu$MNjBD5c7Y$TJZ6DNDt%nN&n- zIzGifOG~1PHpR6?OJO;__4rh-R9*GQhn9cz=pl51I*d<3EOv^?UNVCu{UM7y<20_> z!uh}vMa<-1yneczcF;}nSpg-5K~;$-aGjsUoo}>kw#|^vOxfj*0p>@-Ba5kx{Do)n zc116HHzJZSlNj?}O2wsrD_c{Bf3tobggryU=VAdxE<~?YMjs?sIT1@L3Hh)u?y3TN zkSiTQe#H|Fd~w9eBnB4x((-NSK>AlS;<`C7Rlh|qFbqx)(&6mTqelL7t`#Fa_w`my zq3slXYSp|!+7b`ij$xDr1Dl*CW2Rq-md1Zc*oqOL@k+LP7Q+)#d%5Uo{bw7^!1 zK_&v1A*GklNKHcUwr~9R(|7%!rypOja^(#W8N`TMB5>`t6YzWuAZua)1Gk(0C?^(m z6b5uZn#oXS+!bX!sq|lfEXB71IK`^+bdBa-*P^S)YQul7A~~>*X`SHQTz$v&j%pbVN<{AF+t;NQ$S*n+W@avX%^s!)EKg2 z`a{2suRM$Pu%C~d9FHFrOI1=2agK$h&P0+L@JSj;tAys#di2IGj>wm}1itD`gjk;U zDU^q_dgu`*q;JfomDIERT#1S5(7#wu|}Jw57`sdilF@T(rjjvzhHv*ol%F zX3E}E!RBsZcJdG|E4dn*zt%5TOZ*7va5v~;eJK1#YJf1nrTItwgb=d~s2+PSW*<== zuY@9!D3Y?;t^;O@?%3f%F3cKwXc;-LwdzsTB+*!-uE+|f6a z@vs=~aJU5o1uCjTLQse%aZ# znwf}{py-wbSCK4-v`-2-+4fet?80XkGd{P{=FvvdwthB-AwQHN{RqeIY(011d_3_)> z^_%j4Ki+j?!Zz+J_OYuRU_Yxr5_VhH1>`w`C zAC20(+?=)(<@~nadZ}7O`Ez05+asRB$y~Fv(~DUQ^czt0;s5Ig>}zFgJP6bvD<@~K zhlj_S+?3kbGsb?zJI|mZmCXUDtnBOU6%qmHt)-|M?!u6Ic{t*e&mO&LL$m2;k7RZQIVgRYLK8hS>KB{Cuv` z_Ggd2GUbEUz(x+`mt%a0#3E{`<<2ZCulX*r0ynJ&i?p(BxRv39wv8rz zTj||@O;dv-w2bdrNs15?p{h3{BM&sJ+`?$|$%A~jnM*72_Rox5Yy9(57Cw+6I>UQq z?-2;q>Bol?6&P%^zoT98&jHqN)vZU50J74V1J+euPR6Js?b@($V=9e{y`G+){8TpY z44y&1Ko(t9*8b`Jhu%N$|Lq283C>Eb4`7!S3#Q;!Ps zHnTi*4m#7wxOcGINRCN`s#Ux8sFhxAlq`3jz9atgNY@&MQk^=!f7q8YGajrFd)j%$ zZ>rK*H%36lN$$$KVxI16ps(*uBF8(M6SO_}ITV|AOFJ2yW}#01-y7ec?)CPah?=?I zzrW9Y=QWyHWlnePL6gGcKaMdfLGxkv)H)Z|7%9U+#FzZBW_WZeT;jj=Wwwf2` zt?(MsGBoVM(ob3vD$hL)lyn&hCg{`M`-LPp>Yq9-K2p!FZ6qH|Y;}QNjjULpQ(9qEoSY!6T)=PT--iSsZ z>pNTwWhnd4!R@=})q66cfDPS8&Cket@ui{{IZ?9@BuF!E{?7MIE~JFw4NW9g#awn;)vbGXd+G|l z=m8|ZepG_Hca^*n9!g2kyk*M(PTsC#6w0ZnZJ&Y)e|9_kGM_ z{{4Ty>$=YCJip6%M%w0Ssz^Tv>q}f%`(^X(GlZ-vji4UFthUv>*E5TvE@vK4Os1f3 zQn``mzC{YL8Z>ncGi;)(^S>z?g{->^zA))-NqWRYaTVl}JFyp-_Bh00*t3ss7=;7O zFn3`RZP?s2J^C-2KiD#9|Hi-#PeX9-$%s6ffBRB?N#nO<3>ujHXGtH6=g<9l5@ii# z{-8GFq%&#HeTLtuB+hY9mDa^SjTW?~1hiVb)aa1VaL(1*DF~4Mld8yqjz?oc8qfHP z4$Yrao#JE`A6off*7Vh20_oO^TDBg?xz<#Hie9)(=r%##aWNW8e#QZ%=fnpbsEv2* zi_)j^yz_zmuYdNrTJNk#yFlM9&wkmsE@f2hS&FqGsCql^`c^fc)@jIKdf`p^{;EU8 zDTwG3KxncdIC(x|1K{$AUv}{{07ChjH!~RPrMa4mqUzo68**(nY}g+Y6N6?Xq`=p4 z+AU?*7et_=8(|DTs`O5C@^f^)zcf#7RrODrKh*`^)vL$?--Gl=gG87ex?C03^Jxp* z9@b7b=DJlbaHA(iTFK_B7C9t0jvd>oO>twsE%PPD6Dzh{wf{Bt1n#W9y?alf;&s=Q z2qbxhqN%N;GntGu9bxC$7`dI0{7m7*T+=MXK{10A;34{9qq?_ghS%Bz@9wsB(uW*m zBc(b8-4w3moi!!3%Jnk4lmR2DUjPthjvc$>Lx^d1`;GY#JZu(k=OHSmN@h;Q-Bnzb z9Xs@OW}oh%A}u$)`i_b_;r{&@NCSuW{8}x0mbh<`QqgwYZ)p~g<{S`TC$5z}%xR&) z9T1Xcj>GF(QZ=CEyP;()<{FTxF7&$O{G1|5lKH^n?fYLa;v#>5t}Foj1@Y}9cEde4 zrI)cg4a-hH-;gq3KDRs-&2WQHsO{SXG0zkjsdam|M_Cfk20qZAIxk%pIE17SdB^J2`oCQU^NuGHakb9j0f&;vg|AMVaNxj!ox?t@ zdVeCXxHu_6j(uFmX7}~}l}uXfqHh}@g0`JM|BMncrFfE7e#qjO{wn0FO6X;V-KwDC zJ(qTJD>a;FKwkhN_Dj4}>2)L=K@+<>&4y;b7ID1AjZaW2+-pDG@Ic->4t5YK1E4Rr z?3|o)CEzd;{Gr1FaA0V&&*(lSznIedyITYCjC@zLay_w0(!e?N1&B-e>~hdHrMmn> zmev=FgM4l-uGOo^!Cmjzl!i zLv1@CtmpAgjPRL>*9-UNF>-z#J-r#c_PJckOjD==T?B$YW`*&U!!U z^s7xofJW0!mG%E|X(!qKGLM*xe?Cq1EhmoE>)5rcE_#!^O245E%)A^wetZz!Qx%$i z&;Rn|$J=WYfnm-dT`NLJRQ~#PoNWvlpboZ266wS15hq^K{rXo%Mji+;;)SrQMnabC zS~q4rloL}C&5qFhlATaVRV~SO%U1^-ou3vx4iCnxb&{m*kVZ?s+_2sj)p~z_)%~AY zv~It|m;)LJfca+sciUSf@HKQu;px&mI?<_ZH^bBP4_a<^sE3MkkaX$K8^8VbJuybT zcaL0%Q-AKzI)I=WrnVmM>jGp=-L;)i~mFtf^l_;*OwZfv{!nzCX2n&AkQtx zuB|OCA6e~9_&#yB+~cV$v1%T1|JN0N%4gQnl)z2tIXlMLNis|>2g`{+m8$mve)iV* zSf1tI&B~t_tEhx)(D;SJkTm|P>7*C)$deN8`O=D2A-^zNyzR|S@o?bknqM`l>wanN z#mFox@{QJ*2)L~{(!Ikhj9#OPd<71T6ubFD`B%TX>dv$R!Q)ZVFr&s{?$WL z`~8d6rBZ47>0wOumx^A*pSW}p;fGq)MHo%^NS!o~_L}j$e|vkw-aBedDOAD{oYqyv zG{_WqQk`+~tLOw~InnVCz}K**WO?W4O&^iyfB5)W&_d+jK2Myg7C|H))@Y@sww#W@ zli5;cU-wbF{0uZHolL9piDOxz|GrT(sbb!u1w5ir^yAH@2sfa4gcDo$5PV9!>dEJ? zzdMp?L;5dH^w~W7!=PDrinYf4sITbj$LHoQrltD~5}`_Jy98cCpJ_e=c@4kO-nZ#Z z3~2r)j>6>3!Fwawnb5^y&(+knFO(j$f*~3hbZhzj8|lT~^3zY(z-zNn-38SxD@*yQ zVtf)NXlU(0ZEh87@#xA0z4yP!ac%mU3!d?c!$H0g#9ddhy(jzW8A109?Tj<^wtpwa zZ^?a7tNbXj8wrK>z=8LQ=f!%`LBeYtWKc9Bv_UnlFzdl!Ozb4CKj4f@(&ek2? zVv<6_5MMlr_us>dpf%Ozqdh}8USy9&C=?{Y7lo)1*%CMEAcOfApBESFs?M6Q_qH4Q zH>=Ft0$Af$;4Xp)BzX3-vhT{yX+-YQArn3;N1gvILSTppm+rQbUPkSy<^8a37>5_CN3M8{!}XXa7uA7 z_%T3l@=jL`JI{z;w*a!4Lq3u(UEcN2Y24l_n~Q%azOCd#dgBPT0}T}FoH&1w$-dg! zzdZZIa09lQ7ez(EA|&FhYz0huNV>^zk9&OfIj9A0sngMGJ>2!<`v6_qA z@(%AQQVazmO`&v}gE1XpM^BY{pFe(_b9`(|ik|7*(UTP>#S3A|uLL7LtdZQi@pHGo zKk?5y{-ebv78OBv5IH(^wR`L`J%g|K-Ypp{2C!<{L1*@UngUTEoM!L_Lab>N2to3< zVDEj040%v|`i9X%X3Le(teAikDW*sw>0-pw$+L3p_fz%tP*eTz{cOHw=KZy;|9efk znULepMi>u#Z{?&$LXq9TN_vKzru}%9B)n9^C#f&jaG}k=zBOEMnD(eZ`PVhLa*qoHOqV4-xW&L8y>@?p?bM5@QpPEjA=uNAd} ze>Mp2(}*ix-0G4x2PIT$Oj>d zBNnlI9=mt%u4h0Wu`Rj@uPgtl`OAspR0NPwu8!T)0d!BV@q70H;X%i>VpYUE-7}EY zazT#eYyTbVpWZq%E6|nlREJ-7RNwA)@v16CqcLXg@7^rH8TLRueqK^qn4GP}7wQ{Pe)YZuh}ogQ>au60e0UA2Vh<3F|uhOSKcoiZ@Xa zgjqC(q-N;LYc-UmZVGsx%nqUm@s^OUZbE*X$LQ?iIov2xZ+!NPS{CiSgTP*{({rT; zsXRj?j)PXp+quyc`P(&%{N2=~Fa#jKgz6zP^Ud@hNQSNsT9NRQ9Ax_D#hW*7d?0=| zu!Z&ql@^yz5-^U8+;j$1jhgQp0m-N(M-t96?@#&b?Z-Gs_TTuUl`mTz7wby|UM5_C zO|R#dz`&JPpZyH9DVO{2KWr}{hdP3zG#qIAC>=TgnYhjGvHjWld!k~w1wOl~Y^^*a z87V-*A&t-Z{3`ulmv-8f`R#{arlw}H5iL{@|9%zey)7i2LEHU(NJOb2zic@BnObN3 zazB6-xM|{hW~)x7G#aMgVM#4Yo^W!W>u+vgcTvsv>(mx2_OG=0* zGg2PW&6QX~IZ@%fPDzB;r zJEH*jx%ekf%-zoR?LANT>!MNIaAee%nDDe}@&vUjeoO$EhA7{J`KzRN`W{*{ZWb$( z#$3eUcpN5EieSQiIHrC)PL&T$kBqQ6L6JWMmB$yI2Wc*9aZ-~k zv510sHsD4${Tev_huue7?`qdQgn&3Iv4mLpDmSLVXo_5g3x01rEKT1r_8#Tr2~VZp z0v(otz&(t8Wkn7oxI<`8!SUVQQUMpv2KQBq_3-z%@XTHEh1$-gH@3Gx<21-%*Hl2I zJ<_DN9~N7%ge%ZI=ZV=1A~wHzpn^wmr`({WhUb9A>z6&wHl92=72NAAYqTOVg~K_U zx9fPQwd8-7Z{IC$`cm@$THEO5G=sc}TfGOFj6*p+;a;KPyK5Uox$LXdJG5^9dJMeO zeO}V?PM^m789TtaL(O^8_eO+$-$?ISA8uGlIndV8AniDXX(3>dTulN1xVx*LJay_- zA`=83wCcWXiT#U(Hnz5@#D%<o^K(38XO%^--S{mRr7vJJ8wr{G2e$so-q)0*J^Te$8L`zj}NA%dG`RH@_t? zpa)AX9x>)e1_S)S9bEXBb0ewz!LRsL%TbiuWUik+b?QS%tp_;KbLb4+?PP)t=?2vCy6maomft6(Yja>Xr8L?Dm~wZQ!RPB{|~v4KfWw# z@|Ax&CFZg!a;?F`do1l#rM2h@k2;O)KmEJ=wAglVboBOV3{g9pUC_&J3~VFCA?U}} z7Y8O1q0}DO)>6|B5T3o3}!?L;{j)URjDJqJ!CA6DwT*4f`+*0GH`S-AjU|WXFt`@Csi|-2Y;c;yS)#?^`(Y0v?N%~)Xgqos0kp#UU6IGE zPgs_nQuH(H-}KYNw43tY#$&)@^KXW&9ca+nWEEc8+5Qv0VDAZ>j(6K~;zy<0;G3L` zAY=+VAD0QrM?2v{o+$0}0oRU!tSFpY6}03m?!HY-e*c2LR28aqROI!2_4=VLuYa4r>Fb~I74k*4Z?e#Jat}K9`B>-qee=x>CHU4!d5Lrqx^t= zKXAV4XFytl5HZz|{z$S*(2AWv^nLqVtL~>2{HG%P;xKC#N+yRmNRAr2KG5;deXcoP zn2@kIxmT?#gJ+V?qh#4%ueJnaKDQ`pF62YMx6!2i!H^p7f)sU1)Uo` zQ8*k&7ZA7XqWbCcG!M9r^lJ?l>$fLAZrz{3lvqgoaL5*F+URc7(P!vkDA{6eiv9UqaMX!+Ih7SOD1wYgnv0=9^t5x#kl1)|suSjUqw{LhSZ-pYmQx>9`9ioIBwJh;aSj ztf_GhkP`cbS`P0XsWBj``tJJvrIRO3x(7nJk$cHu%NAsn%6c6d51r~9dc>>vZqKM~ zhvT*F(6mUbl9X)Z$oW)T0)Ei1S=YcIYGGMV6%b$E5t->bw`Z++n5$hqmeu6;h zPvf31x{q4OpArt5B8%Su#OY_a*ULNdZX&~x`KkJ*X?r!@KWiV+#?PP4((&EH6>b!snq!og)t=PE~0~T=KR-xJbQM6Wfnq_{B*x2ndMYj zdiqpeqIn8f_ONj_W2LvR zm}yxX#c5qbC3j@-O4sn0&&pt-B~dG4WoOkXHI-@S1|9ImZ@50$ew6KCbNhlzFd@1H z&q9FrS7DSC1Q%?h2Wn2~kU|irjGPvd-z%yjuK!}d$-!^^a%%hJXn)Pvr8HvdicVZ^ zBLg6!g{R!}>#u3Ztv!RCGz%eWx-ez{vVRB`M)0vS3gKlw9qKEq=1_DAj$984E$au< z0dN4X^YBG!X@Ayl;XYZvqQBNJ%4hT6x516NH5{8)nPGvf^;+QX?R%lUL!_`2NP=s` zEnq2#X42sDW1du&B&l^QNL0K0s$N;QL9ZxgK_smo7O z@^zs}94xI2`w9XYqW-#%FESh#0(TBb_DjO&0nKnM64X|m2Q6k^6)AQoGPEo-MmR&CbAleg4SN8Ip{sWm`94((>1cW|(xeih5-JwJjHg>l?;RU`k_K zfBA)?p5U070uaFc(l=KbU5Exh4U;h@o2zYh{*TB2erdB#qK9T9_5Xmuv?3_^K&mdw zDa($u6MTctQl~IVec)5?yY(`rA<6(8O4{RcnFTu&9n;zK-wa(7fK{QWh}Ri}Ex@hx zY%$*BV7|mk?~?PF*LO&Y?u5{V3`{@iiH2E;*CLUlb}i@`@qERmY5K{ryj9r;B(!Od z(}B@q@7$4eKc|yfvhn)6Jp=U{f_(-VZ_ckQs}ppGQaYh>6!r2*dVB10C}jx2+>nJq zoGQVs69yIJ<_+QXUG2f^llYT8pjnD~VFv#pFiR7T|B>2-8B#H$u06{=b_VVoO6cfh zPu(D(y+rEi#ZHwTMDG)lw1G}WzDm1$w||b(s~LYAYFH|iElJA*!m}_N_%-iQjro+! zQ&3SOED4VeVa}4kg7lUNB7u+>46x_5?s5!~X8-l;*S~7t9xl z4b0~jxTh`b%28U8;Es#OBUPiS>gFffMGo=F4ljljIK=yOz&6x**MTCZ(vZ0{0sHfp zKEC@kIZ-c0Seg&Yvs6Mpx1HL!Z|c4)7+wAMiT)${5*z|Sa9W4Ha}oBiuh5qXHZKY( zp$PxOrmM!gm&TmhaYAK_BhCPsNBkX$>}P$qB;igbhY$K$AoD zu3gXa3RW?m5*%bE$_A0*5I7A@Eqp+mC~`7rL&Z7LCi7{XVs)2a@dFKLO!*CV*HY%| zdT#7H{Drc@r#RmN$3n|41BTnN^_r9nfP`z-#ULSs>3UI8azCh#SLtO7iZG0rIXx51;u@QYJtW}Hp}Em%A^af z+A6l?eE>~fUO%GeBsc8m8*%NHJi0gz-RV^@LZYQQci`$_s;f57cWIJHON&}T)_G0g zgwC}EA?VNqmc#FJ9AY}KXmr$B{p5+}w-bwfYzKGbQi6{?3?38WWxiE~YbTwktGuOQ z&iwB6$*aw6?YfyISLf#S4%393S(JLTm1mjcg@WW>ceZ^T$g_1}N;gZtF+Ztu(I`Nk z2L!Y;WJB|_Bh4$s5(%_5&;yIQ21eASy8LiL>!Nago?_ZB2!+CO{+c)a!%TW#gwtx8)CTQKi zg78n~!9EA`8>HEpi@1lZu6W4QJCu-tBq_k~NV>}NE^c{rE^QS3cPUz(+ zNQd%^Q7_pb4}6a8akyq@PWf$k#Jz|eEJwEDNDd`7v_bc6QUAW$A>l~Qw&i(c&sPl3 zRWg%ffi1qcHPD4p$)6px3w8@h!F?Lh_aq0LUg4JGu-t3FVEq+O$c|=E1demlLp1iB zG++Y5E@oU_Yc|g9%YXfA$$P|0`lSbbeAY7BH;t)xXP=gqt``@*Z_T2D}~Ibr$LBl-lvu}Fn*Y9wrHr4t8-eHUR4k)A}R=7sQ>L~cwor56SO`Hu$oT#%TqIy z#c$~XbF>YKRFF0J8ncMVKSb9i#sed2Q;==6$R9tqVn(OudG`Hb^-h6$&pB=KZPjlL zz0VgM=rH(648#p$({UuziMBBm1!v$W-2&JXLCfRalxn$m7R|FeeDK*j{kab~M8~nq zf~F*p$1HYQNF)+@Dmc7kvuhWJukjF~6+w{}`dpAc{ci1%%8Ham1PV|PnkwOckdmFN z-G(`2>$}XALus}J9(Ct&JuuoDM0eFAy>6C6_P;E*sATPj9_(+h4D; z^>e4YMGnhjU8>FlR_K>*ju`m;%;?YC2V^I2TAJKzkMGh>!a;Hu_8`F$0-S0*ezOAN zNY(p*ozS6k=O9oZ!^L&)!v}tApx>dl4>Qb!#rgHuS)er!!P$x~E4=J;W?>V!Fih#D zjbj&e_!nPvGaRw#&21W*oZ{9N>Cc+n=<5hR!@8DXnNI~G5XXs8RkodeeoFt`MOWdikawlF zy;V9^8Ue!uD<^G#$ltckF39=l1qG1$mGe6uUELH+3Hg9GiToi51gi^YU9(Z7djG^u z5!7Lxu>uJaQ8%K@#$2E~xikCFe+b?qZjfmWH5oB){gj6HeQwPYog0E~lqE(Yjp7VF zq;Wv`(XtQ-p;w1j`W~QQdg5HWP9P659Ai@-lhEby8(T`pHR?TXd>l_Q!1Y5!_M});8mq;YrP8O>4Hc2}W>0^|qEwdV7~HBy zm!kdpkm9v}|1lCRSqL2@`hdf%z_8U%Z|;P7K|vrQZLx*WGiHZo5LaLgqM);p z9TB&2^@#A4n@4m3^ko`CSMZI`>u{neHS|fH4Y7@eRYarEOt=;HU)@~hTd-~O=Y~}B zXDGDJunukkU-q03(AW1*1E>pN^CGT#FXsCkPwFMl-Kev;>hCk;FD=1`qwtL#u&Qb% zI7reLqR}%vMs$ZeAAsttpP3RWlOQ>f2U}-bqYl-SBCYUoLv@O>2Ejz`5xPf2b^R>) z@?)CIK9*QW#8jOz3p*9BYTUUQIIB*;L&=^Ls7;_ipyMlJoJvVR+(hwx(h7zrX=C0c zsTEdTQ<4~68ARp=2=cwJYgj~t*V0bu8DN(WSKDK6kSEW;0z+-F@i4er1oAbgkfQ^{}%4k8t#!1rr5fW!7XldD)J9&_hZ{MSv+5 zcdDQORG8&Cenggw7Q69y%PgC*Q;rM=6&<Vr&mW{<_6xxVEqe8>rI7{8t*!ln zpQHQf3+yJmP;PZ;$h`}I_ieI5bxck}VEZOy7pTpO47k(VOJF_Z~YeySQA93<2mwnHkzEeuF zYOvBk_?|$Y`I6y`#KnS3T;1EMss&HRIW0ODoUz}j3g>aJw`Q=An( zCQ6?o+~uFy2j?-r?EB5Xo=HnhwcS)KEGwC;sQ;_)(hTC;!n4jzR{mS;F zWBFf;I7Sf+8So?W*IDD>i(Uk!4E@*ly zN5Y644qLZMo!n5RH1y$akb0k{Oz!TL3%|A7+a?1fMFun{moMEQs?#!ISn{1h$m*<-P|<5ay%75-gNcMFxX6*ItRTo+imWxUCG846{^{XEG#G z@@%jYSnVHD8@zY3;zc$L0Z#?u227;((QK5}lczF#;y5Ig;N6si$g(545ghl2Y*-3d zB(i$qLRwyQ*2?weBABARpe%2PFTea&H4^tUJr_gBGX)=qfJoQdtnhgvDk3qAf7n$H zj$JeM^U)#7q%))`mUpx+BjreTHCaUt6ihk>%=TNcR@Kg=Cs~}#R}?B{&V#LISmBbu zvEhCE`USfc4;MR!RGl~yCT(cbWbS~-dZnTjErwuxYaS|R+(LbWqsSrFFWo}Z+=pNc zu=s^At{DIYYu7wHn)Ia1C#1!rwqa${xtQjl@0`;4o67~nm3wH9&$f%Jt*$mRohbT4 zDSiMHlGzYkTyyEbGPqe z8r=N|bwyOC&F^(XK{@rn``J>4CCyT#l(GP`j zza$?u7`|wMq@~yIt_j)mJZ1g&=!^>m0^7JU8VF>Wt#aa8VsYKwS6#N3=+)N$@U)w4 zk?34$8F3D_a>%XA2!FIbkVb@}u#$q(S7RLRpIb1T*U&F*9RuHv7&?T~B)}){4ON#& zXi5IO0&RLRm18Ow-9w`Fii`7v8!fsFF28)szZFy*IC#cfy}Uw6^jwX&Jbg!t!n=Du zr%t^PU5Y795Jk2={xoCc`&+M$Lfv@|zqnyul!%mtCIaZ6gOb)md)5R_qOHCC-3w)m zK@&By00iVnHZz<==zGqepX~BH02?K(lwI`-_Z%^%F}r)o+H6 z4s%W`m#c%*teOe)gF*Z(-}fc8cS8A}#dmu}S>+SO(c+{6Z@$H+P{_#@g;4V73)f)x z*l60g>Nws4#0v!mj<3q}+dM79>HCo1l4O_(>9GYlxOJvJ6( z#niqn^#7{YWGS;aj5>>>uK_aj(ysNZMB?|7x`{PUrzGmY0mkbFV;oE#Lkzy?dN`{{ zd%);E`cCI^ z-r3G^>WZrRyrJ#(r04j(N$Tb@pue~Xjy-Rff2fD{qNO(%6SZ{4Egif5MeoHVePvh!bmYRn-yxwfrBXIqlRQW7(cy_)gx!Yk_D{n?K93n?MLMrKv&UF4B>A7_Z^!^k< zxOeZ~w`nmqe0oKdSIqlZy4YoOvPdGSv<5_8>7tjP+fW}7q%4dKg{*dQ$n!9rg0n%s z^nvA=maWhW>Bg=H&FIlLkq$RZUGamBrKRU1ejCP`l&B5_`VUdJ&r(JbZXHrH~~A%sPgRA3izN zzUb(p%%h+lmXyYO19bgVw>zZ))Y;*@uyA>9mD9X?~{q@$1f=ebTO?qI&i{A3Jvox!xk{E*_@fJ;Zy@vbYr5Hq&NE zjH|6qL}lW1!$|FrDm}HGKNYo8QycNIw+Pjmeo6<6y!&G2+IOuAS{s{pGp8TxKrSzg z$VnHyN}gQLa__(BF-=#$v2ao0C*G@c89E4`OPnqJ#GIxAeoTdZ*Sk$jx!p-+N$T)! z7?8p#V)eV+bC*yiG4~h8MZ7|X>H+har6!A zIX2Fxt2jp!+#I0!OV1>(&z@Tm-9vv%AVKf&(p$SSm3BNN6=z~*mX|CEkJK2q$qD*n=45rRngl8-`Twq{!cyV8SkDQvkKHVnnsc>pD<~N%J~>Db;c-~XXlvbqwz!bC7xS1NY#;&?4k%WbA_r3 zrWeLp0Y@O_1xe6U#EScF7|Hm3Zlsc!1*^mGON)0(q_fwHVHX;?)~@;|z;Z{rn7OST zw!pXGmStEFF9pAmkO(N%jzI!EE=u(1+lONZft;1d40wO&G%FC2##{7aZB5O{uDMj; zlHy&jdzWSQY)zJO`5YVEEAY*T`MK}}9UniQ?3xjwm64v4W0Y97^Ke8>pfUcuetu1SJ;(>$G%CK^uCI!bU$*E&^oVwF#gt$P6n+1B^&ED|ik@E9juSKHfA z(0sa=CPt)530FOPnb|+Tyme|v%~nd8XnHApr@3J+38a7#U+B&ulY>Z|)?{C~DE$oB z>G76ftH~n}e;rs}H$Ng_P1DMj5r!*{=DLnLANqXNxvn|whSS2XEG2Nq3!jHw7lbbV zMYN{a@&=|<9WcmS=^S=2r$(~ElsB@HH?H4S@*631`Md44E?`iah1{&uvV1O(gv-|w z*mS0I?N5IocybG1hpt?m1~jgM-{0n17j@-IT&IIpZ8l$KKDD?8AZJ3?jpp3#)-$el zoVUPDP=5wEVG=SCju9Jsz{GA2ns?qokjzPDc+VzWD!VTlyWSa2cQ4gU1O{R51uG3* z(<4r2yt`{(WxK8{_EGCJ1lAi(4+Fz$7P8se?n|+bUa-m07czbp?yC8oH3C108_eA< zXA~#w!MWsi4mqFL#Bh>Y#@D{jUjk3?mcC1caM`oTqeNp=@)K0Q59~qMwzrL>g8=@qThjF{~hJ?Req9z|1VkNLu?CjDI8Xf(5 zoTcR{!LPANcgrPr>9(gGC65xeRofCx0BME zo@;Uq$&;u;zyWO6`W-oP1`alux~r{)SJ!=I=@H-avMNHZUUQAVztH1F`1K46yUWUn zCq5e-eH|Sf3aKv=%SC-X)*z$A;-c-;r!hVUs-&a_9eXRTH!*tu`m6DAKN&JBq9{j40cnJ1wK8B;%JCBb3jN<5^Lcw63GJ|-hlI~OX&6)C zlTjVMr?!je54P8~_>UU|(nZ1xd_Ql6GpDHnw7)ykx&FO_69t-^WQ)dbG~zyTG8xMB zH1lDEKU*^ej`JP~J5#pK>gGxLj&H4B?AowQEaAz9eg=$o#8W#P1DZODdrUnvcT#4} z$N1}dM|wmGvk5Tybl|&dF4pWr2iJyauK8y)&zD^9<~=xXcy7hBcZOB3U*Fr_;^WZw z*<0IB`94R2xq5w(c|jctm*A-l<-&|NY&ff;mgi&ROa_%FM&-$^sQEGU5EoLzCN8d@8Box#ZE4>8 z+=MbRHZ5)K!jKxD1fu#LgJDV^*_(|&*}DOmPOzMTM`NgHxI{g~nQUtAFdjGC11Kt~ ze86&5H6`C(h1C<44N8&A-J?)9h@ETPt~LkW=3395W^5c5p-W~5J!IP0AhtBzVE2F3W~ z|31Tcc}7OR$UKMjQZ^Jue9>hs92$Yxe}C;g822q-5PF(2>E`PYlzLC<>kGqG!pk5r^Ldx6ZHwjj1@7ThP3VCrHOp1_R#yaY4!h zQb&sEG&Ea1<0lP5E^_pM{7+^w&Hz6(teXW zma#1SRG8DfnrVpL!@$bcJ{O8@HI&kU<#3Kmz#*pqRw69bbDIL(EU9uPf8q_yz1tK@ zuVf$__va(*5~{Mxdj>|kT=Xo+lq8gLFZ_Iw$gv4hQ-t2tluD?A+fZ3yU>bSOdcD59 z?^$3pwT759(^9wQ^w-jgW86nx^_6RJMNXNWEPy_jl8mme&7?+w&sbXMysEOI(7t7IWcD*( zq@iyhxZS33SId)%8tuSx+|Egy`6SZ6eon)3?K%DQQZ#9Fi&*m8juUN)e6?Qb-|ZhWc+enh>V_7? zmHj8zP0O2`S5QO6uchU!=kWe9oBzYlh#XvD>cq;XEcmKP&85t>*qCRsL=_veshHgl z9}XfZeeoz?A)^w&gYGqgGu$)Lp!_#pHYzm`{oj`Gb&Q40J6t01!O$$k} zG?k{yZTav%4)Oc4@_MEGI(Ax-Ro;<=eG94*_@-a4iHS%obBgRyy5dP-KtQ&KBT}iI z&b~y!Rb1&?nPe4qE@DtV$@v+I{zl_7BKK|yrn(N-rSxzvH;70H_EArtuV1rGXYI}o zo6YkxU%mfYGq810^xTC?nFT=hR*00L8~(WQ-LIcVIzHXm@h#%Omw@)3nqPDsVL~o; zj~vO)(2`3TJ6TL!iBX*SwCd|9^rZI_*0l?>*Y6x$ufd)6$E#*uuKk;#l}ynQ2*`vU z#bBtXPq%m176IJ6#ok)q?FXg8o3EWW-)}(@uQ{}#3KUDj*D7xRx6<)v;Uc9r=1Es0 zt(S#`hpn#5(T}XW;2*HI`+GXzKBO8Sf|+}Ff$gQ}s-nm9XY9Y2*K4znc9ed+vGa@H zXZUv9>64z3Fmz|bRj-V-o+itZz#Hwi7Qd*u?0jevI)%i6(jj7roHTwV5Hmk;`79 z>#Eqp2|pgmma_<5P#7!1GNonF94r)^K~E(`p}V{g(!fR!;U~I_EkOL6_~t|@4uc|M zGjK$*UN0&PxSD<`VGr#ylP^B3?^Os0DK|gl;2c64Pc;pgQ+g2uWLMOJR;I#HTtZxA zR9hU@Hc^tEzQda3JW6BIBMNnZglV}xCT>P=esAA4E4zNf(rI*~3887DV|l;(bBiB` z8_THnx)zhwqi-f?tcSI89{GI|RGwT3oOk{okG z1wsl*>l$j4IXtPD`f0&5UD%eB$%zrn$Q{E%&f&;0>K?_bp(x)(1k3K)L@X289kI*= zu?F!@+gh=8qk$+^xV&z`y4>iT%;WB>Fs8IsL>*_I8j#jXnn8f1Vh9MJagsA*zK)D?x=N%u z$wVd|Sm7|giXJS5hi;Ch5D=F?Y2nIMPA>|vv zh_|Rp#i0T~CLLZ%oUSvZLC|)Xsgt?|SHcXVMs$r`|B!O!EmT$_>RxgnK4`<`h6#}y zp6+0Fxw45pI~{hx9RaB{^iT=EK*BxL=ngqFCak= z#!&!5VdHt31--D()Gg29a%%r5{mYMIG^ZXNIR}RweL4JrGXmNDDmNi6fs>6B^kb~w zV3P#8@bFYTErV#-acsmgyT4208&0o~JsEkoFa21&Z&bD$i4k=r){017j%s{m@-hyV zRHQlNq8o`n{OB8WH3(_nV>9hqD2n#)-hF4$reWSwr5gZ3ST4R^Dycs-SCfY~`bil~ z#lKXh@R4aS$pQ!9WY?r94vva#M1Lr6()i`HAx&9>fGSM-XHzAptwBWg7R zt#n-#yhGv6j^)Qn^+p%E(;-v4$VY$K3g2^=qwHKOQXBZUf{oOEx&zSUG(8-oHKRl|PXe+w zB_QIQi;X#V*Ncrkc^bF>AEQKzgLUR*Lw#9;k49_T8Gu(tXcOOce=={o+rJGb+B|>t z3PNg6M$a!7Dt*S3ivM4*%Ps4+ah;zbsU{9dpE@phW48b)@V9Ky`tG}%^;BeC#O{xm zWm(9bk!KR8L9uHFk))U}) zvHYg$E5+GY7k5l|%2Hk#7Hl>OH7JFYyeHTkrKBnqZqEZki+E#f>yw+R*uA1|@N6tu z{hw8O(T?TAk8bU)?)5$3Sm}!qpLtyVY0GjtG>Bh&E}7KjO2Fp_C@+U#JQNiNXN5*g zJBSeUwp)5KPzfw}w0TT z54+z31a|TcuBJjPgAY&~oFLm;E$tcMLVcZUR;yeq7Sya8_md`Ki1|9`^0ZtZH8uro z{N5YWFn&CaPgdtW~^aX2nSoN9p&5i24Y;kVoDjYR}cgsK{>K3l>eo$234C?gP(q zE`}LQf+(-3==<~G4Z5Q*<_3X%y3N+|KDusL)*|bfT3XZq2s`{uYISu8H?XVsM3qF^ zVnt{ZxlGulcxm(G%T`i=JBmxh_hHGvv2tNIvrD1p?T- zhRToKp1~2p!1=GrvfR;)p`#ZllN*C9^;I*uY{bec)jnp*clOfU0Arv0aaDs;-|t!C z>q;_mANM0i){M@@<%mqrfL*GexaF@fl8V1v+E@ZyU9!F`8Vfo>p1@oAlD?zF<9mSV zBJgu;<0gR+)F&s};RafCB#(1ZH6dL)L+CPdeLgn})x%2dGT3#w$Hk37MyaI9;_z<( zUw*3})}n94+VGsCc0OM9qibIFl)R4BCh#FiE?;D=ieurZvu1;?aXqv%`|qvYy$IbI z*;pkNu0i9@W-7wryehfU8tP&i3IbNyN*4gq7qk8Y+A6|bNY=(yX`3av3##NP$KQH& z-<&_z{8^~Z0INCo>=@x^4tp?*fHV{W2am#OaL?*j#yT}t{v#GU#%9uJQS8$iTo@r& zNlt=jT|S>~;sT#bb|r0#(5A~a;@pWd5gG0;PaKp24atq>0t(t1rO(LW)l}kwo#aNN zE>u`uRH=-_lS~BMYc=Gk^k1cWP%ug68SGAv(Y!U@nyF%xrYxzXIMgM z*+*m)M&l|CkHn0L+L^mAzLP(SAS>PwFtN|cPPD>66(@)=EBx*%DMxipjSgv@T$yB_ zXZh2?L@crfC52?#!#)??-XgoT;Ywjda%UzZJfNH6agJ;-F-|T7Y2M4z87COUAS;u0 z%6q%&r_R(zVqvplaD?^KzgdJEPQB=t9#flB_7)ZT98i|6Kh{tZe5ijv*B+^+6}djA zFFR=d@`5;}$jRYDRY#iB;_e7IVat#aUU#oupz}6@DlBj z)}_5a?#%IXx9hLI(=mK5nNq66;nBR)o#`uQEdD08`tiX%1x{1kq+Kp9Olfnp=Ua`R*H-oZw&dr($1nK z!fj0V)D=Gtr-&(COmAb^*~ymDQh5%lHX5j{Ty5cU|G&zwuna$3S(4I_!9O@Yu9Z>s zi-T?f3LE)x_YnKdn={zCed&|VE;5GeIRi0|$l2DVLrMht!;&7gt-xQ$OtG$!!PqT6k8iDVnVw|yxhxU`i6 zdc6~`t>`m&@GJ`28MMZE2xXLv5N!gKkW2f0HLTX2T`he&!+I4vWQmJQjyxqle z^ZLG47hvI``Cn0BaI(Ev?S8bmkmet5(tzSao!eCA{)$w&LfzZns%ONT1@Yr1))_02 z=OaDr+%?%CbKzvg?#xz7Fn2EcqGzPh&x=tTtxdEuNS_>|9|Sn-j4h_1`bt*br53;4 zzx|1J!6V9&SFayovO3LydY5Z$^nQT$;&0k(u86dL(Px)WcDDsK*@t9+`1QA`#-Qa= zn(_))o_BoqOP|oSidsVdn0BBO+`f{Un$;vX<--=u^WhL+aio#6$Y_o$#@cFs)SE=w zt`I{ZLb8K2>O9Sf7-3vTE^tVM(3?I`4Enr6f~f80&0d-kk7-AC4+)5^OHucRKX(goM8=9{Q8nH0O=Fu;%Bb)g z7TwT$$qkM}cdRItIl7*CKbB@SmmTQEmjpq4FBvJ z^lW4Jh9lGURy+IF^xhS_gq=RmDE;<7*;X-is;{A$bQ2WE6cTap@gVY;ouRujk7m8< z^5D!IF99o!8BG zDdciCd-A94O6P{s%`s^(#Etz&QRuw0N5hcm32dnD_$i0F$^WNT70wm>4Ve?DY57N$ zJ>yYjcbGX_%_NlYei%R4cSaM<%M$5@b2}}qBBUG#UA#yR@Ka_bqK#W8|8vpnO@9l4 zFc)6m`p~@l*Iy&xA(`o9;ldEM@B_=iZ>+3E4qrjJSkPq_%6BD+z7L_lKY|{qEn{5l z1h>QVQSp3ks}s{}@ZhxB=jK0TUd^LK{4UEItovF>hlc~pf!mi@KY#w*!mp!+%WA9{ zorkWO?OBn|uO5QEEyJe!hz+PDx;wp{;b}XuuEX4H{k)q;ZB{H_eh3`u2os?mWif37 zF^KX(4N@MnYi|DU3G>hefrvJ#Ac|K|LY^YHSdv+rJ%;wn5cLRi5c0e1({nxlg@tYR z7=Ob{sWJXTH*a*^q2*e2(SRlg9hMClb3ZOAX$Tj~U}+5{dLh7y!Ke@{;YxcC9Xj;R zbIh9n#7dv3mX`U8HtBm5v{Z6|hgSZP{I||Qttt|fHV*QhkbBbCu~dKM?vK?rd`Bg> z&Y^iF7asFwNwd1rvF@LO@&|sY&{PN`&!Qa}!xTtvL#fhlSqJ7`QyjvG_@duzQSS>vd`CcZLT`~TTKjv8CchflUV|Kem|U?QE9 zQf(shB6jbdxO69V&xYyEYSUw%5Mg!;X-pBAfT1h%Df{0?GcftH&9<91JtTbfQn3j| zk;zb(kUCd-ry^jK0tiP)2=%%a9pN)7==3&Dp#Erj75tSukv^Ymr`3@e^T*Lwsdwsh zn#@*m@Kibm>yFYbKByocUI$U4ePVZ?@ex)n{If% zKdW-F+- zZ-3Cj`^3UqJ5DR$0Gg}8KFt!W9-iq%hA}5(p&6->G;j)iPcZ2-y})LOJXq_#R_6EY zBon!D{bn=S$X7SAvK9b;rIF{QTNc|v&pDQX zjYQ5B(`NO$$yl+KkMV9#uc{98tM*R54LAS#*1n(oxb!=CTknsF{jZV>mi+q)Y4pw1 zl_&40x36L!5PJoKHb4c|(2|S>M9LYad4}VL6z>5SVv4ORuhEPQCzXUstnXHaAa5R; z0+EYNTWSlsUWwpeeA&=v8%dgU*ICC0z5m+6h3Xw}Q&artQm?}J=%_qzZ!DVnDZtn} z=M*YGXz$Jz(zi_NN<|9G(P|2p!n(}R@nV-|J=}rY*KLc)uYreqH>hu&80}iRE=bVt zSn3k|e`*6dtoq_y(k~ttC#6Dbey18qH<;^Z$!(B(Zm z$=K!p27O|$48x5NVqT0e)yTW5xfjnB^||c`bJ=lPYa(M7e<^>}_*2Ed-TIRDHi4)_ z<`At6yT`B*blag-v&{hdUAcSzc)YpNE`?gBh#|fANk;`5D8ynjXTpSC0^tI#D+>@w z0Br=Xe{wAdlBvjAsr8mB5k;|l1z-Zth=_=~tjE@-;3a~vzO&9wnM!dWX$vE_F~83T zZhH`eZAJPlwrJ5pv_$o9_9>IxL_i_3X)Jt_l1oWc8B%V*r91^z@7KIuTN+g(ss(|ra<^6NWw{%hG|`5tCPk_DM`12H2kxRnw&D{K;GwhL4A&Dv{gH{9i)}IUAl}U z-dTwIpKo{7YSxc)$ho+5(ZMHNoJ#nS#;k&fde%%)(0Y6|9cq*w@f96%OPHDVfnhD^ za^6Ev-xdVcqu+wLqz`EnJ~VBu-d43DJZ8u3qZtdCzUBtaF^69h^=i+WFFsGCu)*)w z7pXh7O4z;Hly&dtR@~d;lb(HFKg9g{8MI2oSN-V)QJbvIAjj*KpX?jwbW@b=IjgLM z<1z)cajvgkDM>sI0FhaR-O`y2DlhI23YeoBt;^{QJ|42~ZpQ6R@E`A+f#+jBE0+ox z>67%R3LDpgmbT8r`lyE!T#D$HAb19-@b-_cb_BybpNbYIO_%Bcg_1OEm1{6; zT;GkcZ|vwts21xT+>BtkvY3Gfry;JEIQtAEDT&PyT{W%|7KGrpWR({fv1kEl#C316|$H1_qw$IB)ClV8F65*Bycx0ng{S5e5?v}U@8yB)2ki( zc@?P=rKoa@O{j&`A@ix)m;=Ui!)EdiIgd=iQKeF-h2zSU0Tm=R@m~r>5qmJWS#R1g zPdNqmkSj~ybD>P`wr!8LQ4AJ0bY_PUc1c#NBNxq4|n+KnK?Qo1y%83eGy&^1<~2^oL)(~YNoPnTxc z@Z@6krZ<@>zC9p{PUiH8dtC)i#$t>zo;HzA0)REhvyK0K5hDS#2O*(6Y@skL4XMozBubY zgrv$Rb|1kq3aMIJ{F*$2Iy6w--LAVF zB*43(;(y66d*48W_)vfIDsJ)ujYU)er`Ys%mZ&CA-h0X-GytZ830CWyzo( zbgE4o|35>`O?J;zZUhM)glc}#{$RGDw5}tq77rOOPi%$6uj*=r%`Y9V)gqVt1Ne;j z%oM~?o(j~|)?Vf`jJYfm194-C&Qh94^C;3Tjjp(&(9V1+Pjq2>v)Z-Yb`nh)8iTde zrtvejYie_`lJAH$9QigPzwZ^X&B9KIbBp??xarlrXs*cZrba*@8OR{-ZhA4@HjtPT zgQOdrjP_H>3W^As?+0(DuRm6vsQR~NMMA4F1ipvpB*{Yb8+WkbG1+>`|Bt%9$aVk)@sqBdBA+n1N3&yT*n^}&=H$^~ zr0MK`rSt!`^};**FZ@eO(0m)R|J1*1{+VN-m@4sEY3u3TZwx@kKH&sNTU5G^8cDAo z)>|T@Fr|Y1OBwyG+yz?8njO(C+u@+h(1blLk=sy99eIvmHvrr8yBb03Lmkw%_wOtB zq4MnPx5&ele)}I^1QnfRQaD?iLQeLb|78mvJSdHs|Ji~YK5G6MOGK6e222wV;expG zCz3Boz6sBg2oBLofop(Mmlj^K6M)s5&eZny&2WQ1T0Cby1uCaE?<5w@b3@xs<}F5A zwx(MEiJ3Iq6>|hq`GY;>51Dkm(2NvsA#J9ljTuyyUE^WUI@K8Yl>hJ0XX5f7pY(vf zN0MYy5q|h2OIO?}+z4bR3%>mFOWAi+v+A8YYtzwU~AjnTWvasu89;UX$847Fz|3}jvfPq(>gf%fP(f4Rp#XnsHrn_lh+6#`iBwcd2f zq%Xw`B*wF6&vuv2%zQht*z~52^8YaQ9&kPH?H~WwI`-aMWM>pIlD)DODx^cQ8X_4b zpU$zV5LuC(m69}sGRr6lm6njSWLGNb|GaWW=l8$=kH_ER@w@NyJNG&D{eC|0_cdOx z*Y&!Br~Lbc6xFK=V($u#Db_Q;f_Z__|IfhZxVe15Im_E)SM^-+(=7W|H+5y%8>3wE zedz}be*gWL7>TuR-2)fMvM0mu9}-?ZPP{;^B94gQ(Z7yeqvKGv-Ow+i4v5FQQY`E! z^kjnyNd1amPiDNT{FAx)^LxZlnH!cJUca8N+M~$G=@`sFWXZZIao^;*8Lm)PToy4E zg@lgIC|;DRrZ#3cVp0lW;aN8~dMa?mP`$xc?Te!bC>0DrTRI>hm`Y11Uv ziCR&>E6@Y6VO-#!(24=T@5?W;20b!r#95YPjLd%~NKk|PF$m&=}QY!uAKn*kAV+1@0(B75A3rjg%v(DQ<>fwu6qgk%RA0z>mlrIw;kVV@C5t1#+{L7X z*$;0f^fR#yDPq7Y{o}`FOBAyaycM3*Ma*5wI(jJp#m}4D9K)>sqGdq}|ebNi_mFL83KfIaPh*KHtQ5TmNbhFp{Z=i5oqiTf=1~Vg= zhd`?PMopS{Q5uUN@8!#vYqP}}6QtMe6lGNw+bw7ECCRwrL@~h)!R~VwS4zDRt+2(B zp2Q1S$AF*yoM!`RW|(QV(H4CFYk?d|jdEO&O4geS8bG=A)x-|ETh?>sVWoY)SqD9V zm5B=KvJ)c)>h(MtA`7I3^4x@}Ame3|CFzAlut%l|P@r=4p7QrTro7@;jThV3|D6Ek zK7|(dkfFV@nZ3*M62unaKQn%^S&i@4SNZv4-O-l!>MAn(bhDdbxsq6w;egyXJw5$2 z+6Bde+-jUnok@5F=3y5?{|7M3*wZZ;`+}bI*Zr`M`@NJ@BtC^= zt52vg0l>T;&Y79|ltl@P8A}v>ps4(yiI*r`Gg;9LWW9Z*+3h1tfV9`c|7PsIFQ^5@ zLV?Q}y2$U<%U5OB*Qi`kr5fiZCl^tY6#uJZ-OB^3Ww>f$j;x+Q{~?}`#;#YvE97K@ z0Loe;(P6@WZRCGD35X=id`1revUVyq!6ktY+Ci*$v8tjil|duUFvg#U8;E;XM?IWu zqV#`qwyAkimMlM>`Kj!%dY7wXRqC=GZ#p7`er&?9%n{;RWa_+~J%DOA1`imZ{C^Dw z{VXwejsdG!;JjPiF6-%N?&b{2jE@h*j{n10StAYihdkL=_8MYUBSkFZ06f$gr!qpt z=3f?r&t+HSKyh%CjpA+p9G$S-0!!idmf& zJl@x3v#a{Rb%#&vJ>BKu#IuJ_EV$p>gUD>3yXcFYq177O6@e;1ESVs^n85Tge zDT7HIM}Z_I+N< z7gQO~`*(MU%A1%VraKg^Gsy@OgKmHc&til}VKvt7*PrQ1-S5qx#tF1~XkcI<;y>gj zXOf^uZGtA?Mob?m)CVBe1@vZRYteudaCsXW@#rbB@FaNTx%v0Di%rDIw03pPuMGGj zS~~pu+jpFl|Niyo*e4sdtiaCZVLxGk#zYBW->r8N%}WRDO(%A4uZL5IyOzf4DR=c7Mw}1XSsD}b{vCR-h&B$9F`83V-=&pvdjILIRG`29 zya)y^5g|KaNj5x+2$f+WSwHRwZmEdQ;$#Qv_vAR1f7X?~7UHS2y=gC>A&y0h8AK4c zXl37<4{;J9krpveR9MzAUi;6l`Gg5Cp;0omv~<#qi&qi7kXC&K z5#=B%2wf~oP!b59 z^V;KiGpr7^i#%d+QKC>BzrW{2_;)>#g@D-_9dJteb#;F4<$3t;AEk1tMRg|Cq4Klv z3`j$3S>p97&<3wRz$y80xJyfJs(7r*-d=CbpU)`*&+?Z83w z?8A-+v1CL!fG;MRNR6^i(8loha_3tM%*6|pbf#n|g6GLJes-fla4y2q ziqezRyOjB#vf(;B<77W9aDc1gD)_3Z%I0#`WcQ!*)Ww#FJM!13*-d{W{$Nbj2&KuY z`cr%`qobZEYO^!9%8!`(%Bb99nV6!KmWVqGjpG96bt0z)1qEGGQ>F>=FMV;yDGpvm5=2*dC&4#1VHa9__N$MrV*@WL2YX z8vi1k!vZBAONoH+$rYbu)h=H-h2+Td2ny|y)U1Tb;uMNJQa&J<#k;?rPZz&`R~o7k z*obkF2?XUFsOq4y&l9>8IVXT^I*=Ufk7QF(*NEPdn)7}_LPAV^Im5@Mnw5L=m+>|d zOGinl98(Tu~G;%mSs5@u9q|>PR`O>}n>T=YwUrm*9et-g| zi2h2T3z+9Dvh_1?WzL6YRWFefIbGXQKHa^_7jIg65LpVk6l*wnANvrN~ahUU@UD(S!c!$*4UsI|RO*AwkW zZ$G;@<^&Fg2V@~HDdU9k=p7G{4lrri^VQu1TO6%8F_NFTZtoZR8G$05<2aQ?D3x`? zp057_p-xGZ;3?lIWO7omQj$%;9L-%dd4bXg?%%Pma{DR|`2>0UFYl||QOi_0qPO~{ zl_f$YS65E3`i^^VGRv~hu8)UXm6NChg~6_$MToY)`u@rt6_K~$`?#_!hsakSR-t?V z{4$E{N)vYy8>h0sUiNg3IhB8NYfp^Z-Cp*W3_(;bn?K9KQrSOPWo!8)(MM#W+ZuEf z;I%B^{L0Xc{&SY1>5MIq02Sf4od-WQXiy!e5t)dked!V{*TZ-%^q)e(7?qE7tzy&x zuyzszZ)jSferfRXv~M`5r)M4@lF6{1J(jayJ2w1Kt5A2K>JakzSc_8DUO~(CbKaW(*m&-!?{pMVue=tMQZODq{3XLMTjDu7dvD+VSgkU> z+%YNb@R1{5JJ$W6Q8;kb*V)5UR_DJg6Bs!izFM;HVWqM+A>aSl6ICVMDswLtK}@7nq7%J0|G~81^adf+lQjm2e!I}D zi7rD-NfDsU?rbs?4p=NU)nx$+jWb(aWNAB-*w4Ag8vZTJL>UW5bdFAy(-ZihhzGZX zfGU39q7q!>xi&me03%$`FJ&evLB8rsz<9(9pe%thramj0WFuBJ!j#gK&E#=kj&z@q zl>aRXWzsQBTPC;(eoxYZkm<^hAO(}`=|HZmWm!Oskz6h40f5*N&LB<3Ol%HV3}o%U zY*mJPY`)ND?c0yopj53JN1nL=3M+G^z8-;p=Mws&saggHQ(g|nxA&owC&F3 zeegj8g6ao$&1m&=&5UT}=#(Itjd7uVG!C>pSV%n;NiKH*6)FVW@h-;F>>ypuY}1H) z_YMLX#`h&pJgUXuS%1!Ie<|W9PBf`4!eQ|V10BXT7bgKa3@i16)T0Mrcs&RkSjBO5 zLn{G>qq?Zj9tq z`oE9xP7FM=jJk7yLc8y*ZVOlE5#s3R7===YH^_8NfBJ{;l$4ZOxb$z_xbXmyr=^}3 zE#^DW>{Uk%XC{fur~$P>8pxM4h7<$8t7D*-e*p1z>|c(2gmy~_408(HZ-BX!m=%o4 z&-ce(UbE04H9b~WSrl3N;o9M3+qHUb+nk*>b_F_Jza0!)Hf(bF5ML-Rd*QLM{ZihJ zRc+eQp=oE(t^;&EE%d@uQ&TleLi(o2MqI40;;-X!t)0%?zZYp?A=eMfL4bM7K6;7G z%w$hWu6h<{^8kacIXMasQ>4cHk1uN>$I^C->tcDyAL%~TYsO17fhaeGQ!KxNsQHKKFbECCuK0tZr0(hb~Zrr7P5Nn-N zPHgrtj}O#!#Fwo`hX;dVQk$7g_EZKh;j}jDBZ>fMblV{ zSuWAuI{&8b=nMG?05r+0(%8zZW-z?&SY3@1z8v1FeUb|GLj>+Zhe=% z9L)4vYRD9zMA4RDq%1u-NdU2?K5$$fYXBA;>TxYFH%o4rxKPM6w2ao#;hv*+G|r!Z zxfv$d?dcvZWSC0~u?Z|mc5@Y;Ezwh5j|S?JCr^JGv0NxCw%mt&0tB_SuuP?J4g>7=*k4@J!i! zC?J~@rF`uGe84@-MvNROvOJ+~$OfX&kje9$e8H=LWa375$iI9h*CQplf0G@fp$vrf zfO(cNFtLOkxkafHHLXcj;u=A=7%sAiUyBS{BkAiZ+ONW|A!2(5+arjHI1n(IdwY;i zA2*LsH_PHjFa11rzb_g%^y5GW|E6&cb%G5LuBxy_zn!+s2TY77_Na^5tQkN4xynpWv*(B@kqmu&1a);8H_7Vi2 zr~os)XU7EPahQW9JcI0T;I^K6AKg7Dqlca#nUKh`07o2@`K&Swu9Y&hSJ6Yh_CfEW zfngEXbQ6~Cm#;mMRStqp7VbVpjDE2f(PrW;J^Hw*2mTYp9?}5_mjz#Rg$G21Wuvr| z)e!1SC@r+p#rvFQLvn~-yl4Ae05K;+N=iyP>S0oHe^0He^Zbk~J=gD=z2)_=k+k0J zRC=R^Pp{iH4xvmQ(c=L-0NnQO+qZ9?15MLYUY_8BT?Y(!vCsk9P`E7#D0|Vor515N zt2`UjZ}Q=wl~(od((l@#43{OOBFPZS z2SwtdU}bKeJGY~cah~nuaEJ9NtAp<7R!!D})ZCLhgx4su0ToX1IBw={FJF$!FqmS% zLLL@2EGAJ;ttQO()6&pMB@1ER%fsA{r19l%TtFA-CN_VWXoqE5Qoa-5X$~yEKtus9 z9^$ zg%XT)^AD>rg<~2N9x7qhDw%&p^hvH42LN?ZA;HMXsIXx1QqLfHfbWS*gCm=MW$`rN z$w?@icTUp5B0@&81>>fT>4I^w2o_6!mc+85X=g3}glDTJ7cIoL`pdU(GU>+9)c$!M z{Y5VbGM|^nhmnR_Hq$+RnsIe#xn!96F`?Q+`*`K~G6 z3*w^lT?=wDJlYle?jS(L#~cmag?*QvSy;x|4uCj?&RWnm+w9w8{*L* zq9Pe^0iS5qy6Vl^ps;5sSs&I98}gGWcoxw0m2rI{>crVK__G|2Xy^UJjv ztsD26JBNw)Clm|;*pSGQM>m1#5$P=93<=2pTp<#nA)ZVpag;(w(zA~vYnTMe7p4GX z_LJN^mJiPaIoGFodkeKkW@2Mc$D~>;!;oD#b~rc?ru23WDUv-Pr&%D;ok{Lb)%}0RfvtPt5}t3hHuD=oNxN zcj{HC_E0b{DDhekmL{MZ7fl}y#wsyny$@7aEFCd)lqCWKDc~U7^f$-*F`7kLzsAdI z=%<^N?D?*_A6haD!91}t9YAS1eW`!zu|%+^l!fYg^2Mr3jls?VMo zLz8Ty^(eo1#&OELf;n>?F!g(m6W+C^NvbMQY~98CAqIuLTh^Y@Fet}4Wv8y4A>TRW zXms*7fAd!rL6O$R0#lx!MLE3?Z9~!wpjR#xi&dmU=0!cyHa+++d9rSE@nMFrIYj%^ zCB7_w>jWljWK6nQdL>WU+3XMPrDv>k{;y~Fn5*7R6O&&8|l$T8(4o%IDH zzxl>-0)4^J2tGB1@D6e+#@2^{4&Y?vH(I?V$B` zFB%HPGuH0wf}F@s*B8kSB(EvsgJT2z(Mz{svH6RD-me$JquyV2wCs~RmSk1V?>TYT z7aw2s;)oAX@3R&;L^!N}xq4HHXQdB~!~s>H5@4!RN&8R))BX=^Cq#sG=fP&I6vlb<{VAmIY9|OIyG1HtZ#pIFh^m5lE zY9ww*?y*sPegT-IQZ?F+t+cfk?U;~=;~>i-7@#_V&0FgOi=qB`o!Mp6Q^qMwNk=b! zSSAHVEj-G%_Q*w$S7&_j(EPcEFNZq)X+Sj3+0y{S%shJ9K?CaZORbxhN6$x6q32*X zB5V}He*FdgQN>+UW}lHYocLn6y8fB;L`ov~I>F0bUG=*Npi8|V5EW_fKo5HYyMe}ceRonbpFS_~_#HL3<*~hZKU1Q??mmD&@e=e|vY^K<-Mg_`BjYIt|Ozkmo*HhE@ z$nf4D+a6Rr(6?D#U0i9?ey}Le?S}>pcV&ppHTvGM5j?HJyZ2)L2|+5G)e?}UR7db6 z4ytrzuCA4jsha&?VCZV8!fU3$nmO0O&BmK zu$ko&ZIBG2So)jC=12Jib=9M46XOdefkl+8rw<$T4JnQI>qtn23}%4$m}OES+`e~1 z7q097#E_n*W9O+)&!M3-*&(WLKsSbdFtG+mgA zOhbRm9u$V)5-m%yw~~oWazdHpAM`}5TJ^*S!4Av==b^J$c}PM<`zJ#bgfm&hB~>*4 zu(l$Te84>W)ul8=ekpnhapxC81+g3r-vn3R62ztA0w?xkQjvg5h^+(+`+X3Ug{kke zA1`&7dC)~uO5#-?U-n?ni;O#vpc3YuY{~tQZDS%!7rmPd-U|ZCq~19Nz{ybDhdu>+ zhi|zN--RMOA}YS$1Kbg5qNDvMCEy04Etp)jrq=RrBkQ%_RbE0%zNw znItOg591lV^E$TP@dqQ?9(>nB96F>BZE>QiYUXDYNh5Kwn0>i-DDIx0I(=F>$d~ls zX?chy?;~V3zTHVZ9lLnEH@5RL)U=s)FogPg*GAMS;qZ@fqw<`>fdC-4zJC3>0LaZ* zUd~XBCXKDO+eDsGR9W+}&~Ww4B>#uF&-#WIoj-^uL-So?mlaWxwAi$QJrx03Aw@SLROQ$$&sFc%bK)lW37IW zr;4}(+V>ie_%SbhaEt!02q<_3$Tg6=Vy-q1hl?rJmV zbFBG}x?2FYoH%iQe;#jZw@9E|7tQ!46W-=04y8K_pYL}-40UJahqqkDP6)Wq@B{B7 z+;y!M?M*mfq3p2u2WopcAZy4O+Vfw|yJ;Uk9?hya%pqcnZhYp#{BL8&#OJ;Hbt{9O zmKMs>x2gTnkg_Pjx^&Uge?s&t*WR#CgiQm=wC6yDXiA0+VF1Dq?>lebw)UB7j<{IG z#nS{#|E#>Z*HI5}U20g&YAmxq{fmz+p;{4bAf1A!#`W}nA!JrBr$}dx>@%AlM|g`q zkqf6J^{>e`1M!CxT9NR(Pt3!_lOvJ5Bng8-W|4;jrUYI)@;8vCfTYpJbfB2}8%%q* z8)|QUN%1dq@aM{mWTLGsfELc5n7J?Qrx6l!!rVpVxJCuOyace&8N4tK)nt(l;ZDBD zfSPJiU}2v(@80e6@n)dH?G(NDI5$~nx%xx$9Ft-?sYeQ|E4+E!Ws#bqPm&GUa8bK* zgNx8eUAEFW8TmB80)k=^9f$0n7Yag9yE%F8>d2r4tAHp&;BpvH|4gldYwn+Sw|4k& z$Jyt?0-epv_Qn=((aklFE0uWZG&|yNT8{s(Q4J_{rG@7FjRG|>ZI=B<)iyTJLRIea zpq;-3x#3;ZRvw{^#rIP(>QeT{X@nUSJs_SeaU$wCRg&RPDQiV0#3404s%_&>zy5$( z4fqpjUXi7mr@Z?Iw^KTrCWa;uuVw8OBEi48+ekZ~8Gg9OF`Rq#C7p+cA6866V48J7+uSKkd6^=~ zxd;QXp;ix>CokK@Ci_B|R+*~RsEKq$LPZi$WC*lQ)Md(aW|fRh+u{$!KB^I$r)+!> z_2O~n0l|v!CM5+k#AhC2h9vAf#k2UOCH(+e5t1UXI6Z(8Qh+H&`yjkmcs^fCq1!_t zt|=vX`vHZ{5!(`PY^BFb)?KrrOtew>&il;OJa5mt|;t zOLru7{DQI=O&tG*Oi1==$gr!7th8;r%)pe6ZhMm+=OJ#hhzWlCs#d8|Hozz$i1k~t zJ3)p-5vdw7wxJcd?^)n7ZK@;L#cYqQwYnbVQ=D+^7%a;~ZG3L6X1#~eNeaUR&v!Yp zogODcR_2K&Nv2fjUU5{vAw$(bfRQ1xDOMmlF&s23`TShLrjuk52lMVlKb0+O8EIU^ zvJOJ<0-dOAqmUf}(!#Uapsc%s8qzhHE&d#UnIiC%3&uc9JSB|$W~rs!yv^Q$;l`zL zeObB^9MZFY{Lc`y<3z7nroDi@=+*obZj+C-L*nBu{_4%m`m)TvxtX`4K2zM%<%L9( zKW(o}eQlqbGQh7uK;u;|bscKlNKBJ@ZmBkPoY)Q<+ zh{H>%v}G!TANP%^k*}4vUtx-$B_#wfM=@XDsivWmLxE~)>T4ABHd0ZrEF9 zFajy?x{n$&=Fp$t^OjQ-bTz(wYWD)1rmQ)7krBhG;gbS?(D%_rEs`Z z3=0vUn&Eu8lsGZ}XKHD&qPzoH&&sY%0SlBn&ah3xhGrzxdFsve!ci!r`{?t?d7xGC z7;dCClv+^N9ox6d&aL3|Rln6~wHU*+Bj&~Z1GD%A0->N5Gsj5^?VuR?!^f2^G^0>? zf!9iSE1gvuk3ud#T1!*GW(Qj{#m~t3-h53uv3@k1m)eA3$0q!EhX>--Nw@ZpFtuVcm0Nkc=49E`KK7f^5~=5ZH>{ng1eY}jxTEq)ZH zb{66i)CZsTuk@OUS8{W5EJR1K=g^@;=~roVz*CkW66_ZN7!(Dy{C`ULex1@ZEk72I zwJshSrl&=Bw#n-!Waw<)bQe@}kqS-Vk`K~^2p*i)cC`<^P2@W}0>DJlU+cZ^4v`5D zf`r&2`^}j$fByV^5pNe-nhp(5O47MANM<5fNq11|-mJJ#M+ZK)nd1$HaymSy)lxfh z);?H(o@0lLJ{jiX!JZI~{z7Jw=Q*}!&!76irpnwkY7utn1;t=9HX1uLOM~8)>1NAL zUYAk)<6gwldw1`OgF(!4C!IuW;2J@n-u{-8#tZT2ti}mjR5aIyPdhPew6Pl!({5Cg zqMTiu)PKUniDH~N$(US0@Ux$g%Raji!j6FSzkm3d_+NUT*1+p$PC5;k0WAb38Eda) zU+$cNdhsI38(KjtH00mAMaU%a39pe{%%Xk0P2KDuq??2OH))?@XS1@^Jpxg=R12 zUd<}~fuQ*>0bP^rMckmbX!Xfzj97F^$p?iKQ+RPPL2Sc)a*N+RZL1{{)8aZ!TfU@6 zPRg|)F@xcK>!?2?0yM@}iWr_)^3i?oHNPV%nr2FbYb^5?r$OKsb28md!5_UCoMlDB zCK6-8YGE9W9)UKW2l09P_W9R|BHK$X{b?A+*2Nz2;`q)hlAUL6J~v8v*g~1k!X3ml z`{Bm|6o;>j%9Gft1q;|$PAu3bnhs^lq|6Gh2K1jY?(x#)!)DfOsE*6x_`NxRn)LxyCTJiMN|qWu}dJY&(x zD^jj5NxGMw*w;0(({qP4Yu*MwK747>y0`f)(yt8FYI&zHwvA;KrAig?MU|OVcBAHT zWoHM8kpDk|s~s924Yr!ph17>uDPr)5$zD2(fT#;)F@emu zGleQ%o7mq??9W_t45@SOaula;s zR$8<)PU+ls-KRfjjLlLC=oj5i!G=8aSx*R9y)&}3Yyi0|9H<6}UysZx@~C7&70gyu zMK&M&A6miHb?+jOWU-1G8!;|}+Fhn7sF8K~PYJg?5r=lx^pkj=L9TEq6 zHZasNWZ}D(=+Z8W=sK1m@_vh-+zh#yMW+e-pGra?dH?tu(;)m zGy{42!nHklZy_=egVX^bP^RShB%u+c8f4Ei4!V)BFqjd&CTEc@6 z`K3tZ={LFq7RovU@p0sbl?^_yINs7V+NT#NR3D)lsgh!;)qQ29iWoz)X2;dvp8egF z6)S9Q4LHnJoo<-oM9R{t7>XiUA()pLGqPbPW#XlQKS5)~W&b(;2I3H9kNhx?qHKIf z;IUIMH8OrlT0Knwv7qeci<+OgwE1s!z?rh;$^9&VWuf=QsXqraHk;5R!+VIx7p^_5 ztJNZ@O4Q3xzXDGk5LB@kXIR{VIa@_aNAbz_xK};F#l`!>9&ms}jUt(_%|k(emV13+ z45;I)RSSO|0{+u!L^ki#i$06hTrXf>bY`KKeH|aMX#$~;HE#~G3ecGOtdnVPw-G)L zF?7`&(w9u-IXHoYp)+V7tCooUO7h;W28j0Px3n2ASg}$)8CBH%`}ao}l!7FfsUMVv zF(g`0owChF0CoQxNfIDQJSLpg`>g&j$07k{calt0Okd4^P9i&5x`4*47MniU6P+TnpErf*5P2M+>~>|P*MK$*12Mctp$+adu6zlCTd zBk5RdpEqUZwEth&Q@A)x4zd6jIEN-+QUb{DGWiFo1ij7w2ICTZ`Cgs+_EnyH`A}$| z(a8XWp8cqd9{2Pv!##_N5EKH57=Q5a@N+C_hApk^6IeMEfSkpkklI=oZK>~BYQ+Ib z$#6GGef!qa0<}r?nl=4H*`n452+xZKPXMpAs|p@S#W9h?D2tvJ6kL7TB`j5`TS4Vy z_PN}|S)*A{aU!rngmH?{1ySTwQT9Da{Gi*J$~0B0)}5#91#*{6CnZ1ZJPm~@{Hd#J zM?FbgQdAQYvl;FZ!By+l)op@vrqu5`_j<7U5*pb=HVfy?&hS;lf)Lxv6L6dA&q8P? zFYsWN07+?u!sr0$mGF+z7DVcklNpQ^41Aumc}pAmg_H&%V|*zxE{UUx?}C%}Z< zj?vUw>DWNisWbs=PxW(ver`UK2Jctr1bLKru6a{kPv6qg(#sBHKw&wkYWvapk-LIy$qP zo_it0zl>f3KI}i4rnTbhi_phlIWle&6t;hVe2<_dzAcNxU;15wLD!3KvNJg|++u0; zi~HF_uExluDi(={J=wbwJfZx2Vm2=e_F9*QUAj?~6i229v=0-TeJ+eX{+wz<>Bg?P;~5 z!%06AqXeBM^l$2VWdgg1yqv$j)-*a;Il zVFg#$6%jgAM*xbf@Yy!8;3_ubGT<)G%c?z%o$&{`Xrf$;E2{k|_{OKXyZvwlmIW41 zh{zo1c3DcQRv5T}ha&)q;ptPS#B#zo&KR6mvMP9*cuF&rcroey#Uvn8lv4u-?dNvM zFq;UY#5$eun8T-&Dn`9)yLQ8f9#08fmafH|ue@7I)wT<+>H4OOADW?k;of|`f>D(n zS|KW+WRACu*6l2Snf|O~&+9QC%D zTKoAU>MVI5XL)T)zo3NVKuz2GT^C##(eku;P}YL(RwHK4s}Y;IdjC|zr^An?wq0*B z)DW=J=ac=AHU(w{c_r(Ie2gx({XW+=b;!{ikAq#q*3%Y&4OgMNX^|u#CS}R4{rjux z=v-?N0bVy^?%X!u4@p~2oM`_(DX8x1k1t`!f1~C(b7hiRWu9lcN5qlCho3MsN2IBv zdiCzzZxbd=_+C^rpPY~y7?gq_IUiQ}R>*5kJi-B-7>JJ+!{mv+-SHV$s}48Kzy7W1D!-{$o0+xISE z@eh7{d$L1(R=sH*GP1L`GfVVw*Z9-58w~B;`_k|?+Iu%g#>d7sW|X2C9!d|jJ5M^a zkyCi%){3dhJL9O`7cO+iPqcVq;)$a8C#j8H1Zey*scrvdFYi)i{6^vA+;(UiL`PeW zA6G*o?cOH%b3s7_yr(Alr_}%(6%;=Lk;*cu2(dfeED3DxCcxAu#=GLX<#PcwG1gvV zZ-4vNtqNf9BhV(!TefVc^q=P}3qZO7uOr}KKF1oG&O=OXvwV34RkLQzUh%IIT^bTN zwgH36Rr$``6yd(6OMyEyVFV4AN@ePp*O(?02;l&My{;F4S zsrTrK&&3+OPr25V&R$m~me=Eyi4&in?{ywxxABN--#(_cg@UhEv*sP{-k)E-tXKy- zf*0IfCJyVjY`KH{YeogdSlwvaoL5;{Qe2(@Yacgh(mjCiN(U!yhN^$Vve_?#*_5#J z@Znanns@7t9V6$>Q=`+{0b8-O@csg=_o-oRNwvxyk7c3TXgXBvSRXZgdL!{dxZF0t zIEjw?&!C|GPMxcc2Q=G2v|QT;%5D^=Q^jKUO5epR%*N@sw|6ZDGwuPP{-&x{yY@X` z38WCU+}Bnd#$ew}vy)M_YVPAd0|=ksEj81&Y)0<=MDIP1e*cmZ6cjk_+X<}?_986G}5U_jKSv5Q+Z_*p5 z_i8rO7kuXrp0G)1f`2HX_BW{d@AN;}{j5jEj1GO6h%B}z3uaxsy)}*~S5kM0We#cl z^(KeSbDPx8Gx^+i+o(Trf1Bu`oqN^UG?wGN%gwD~_wL<|jEtV2_1UwhAxTB-{bxly zj*8lJ?i?!xI6I3GmnCXHdi03Y@CQ%c$k_Ot#_F879^=#-xSRJ)@m*%uJmb*2qF1*n zu@Lc`?%iYK=PC1!kGSFH)_|k-e8A&p%u?<;c(8hh4jm47c*J*&+c7LDV3&tSP5uUh z0<8!H;o;%256{kOnK+~~RzZuQf-V++@ecFl>0~CnDV;sxpZm#QL_@{}9s`E`#C3sM zu{%9owXhu+fA)Ko~Ln8mII80o&)leE@z(*w?m&X7AoNX~XCJ{<{-?@Ezm#1ePGc&WuqeI&gw5!#sHOknyd1PcH*~4qa%PS>5PZqXnnSJfg zpGUWCt3Fq8$PH)_e{E$}1MiC$XSA94M0-{Gt;(tvbvrSezjji~JPHz{GsSrq1Ji0f zA8a@yby4D3`(wv_sy6IqMshp-c=_B$i9Vao9Ib6$wV^83Vq{Xrsh(9E%4z7>?%x~3 zUwQTslw&cab+BV`ppSu?y;|j}Rh1o^zvrX@|5QVPP+^$ZnSdr65^v|K>OsKn->-w% z*$7?nxbfo~@Um}{lQdvy)HoCvYS*t*r_LK*Lt}Gu^Z7KIw;9!6$&L{#SE}g-Xlt4_ zZru0{@%03t+4Q0G!g0{GmX~u2bVR z-lL-2SZ@UJ%CuSY=GD(l?qpG~zq)=@_+k?bUiC zwgR6Ld^Rz)G9rOSZ3p5yeiiye*&n2;r?X0VKQ-wc&{GfI&_=-W16ZEPtK2nCeLi!2 zwTFz&4ma}n4rDr?!2X6ibi&(vA_Ah33^>drjn`D$xQ20q#-7JPgEe8R3hf(>_}XIT z{*zjE#kk+-==|Y6 zR$<+*G>_O^!IDL9G3kwUEmabI%8hC`HAH{9|E~H{?915rUOk;eB zM(cb#E^a1TxiQBN1Hmqa5g4bZSARq`O{{Y&41)`)q2_71#`n~FPi?u`55LSX=eSf< zoH$qdXOoz;Bx}c*P8_A@9aj zi%s+Gx}LXuDJZBZ$cdY&4&E~Idr6-SM|5d3dF%G=4TvoD`D|alBu1VNX?5ZJ&VGim zB*@AtKL#)h16W|Wtfrx1e2aiAR_oae7{0Z$g?`HG%4%0;KROidrxw;dJKKE7;avv~ zbOB6~0#c^6eV(bcZ*38oYDk2gzWQNm@!0Y)_xaZ5&704oK(w*7y@TkEICVB>@78fu zMvfe*a=Li&;*VL78{)8{8a8#RQV%_@A3C4H5+3i(@bKSA+Y!fxZ|J*k?e|Y=M7}LV zMx*tn?RVd#bP-QN4^u)Sjt_NIWc|@IXEvc&?3+KK{qFmv4ht5j11897y{>y%D$3zZ|IXoAskVuxar>7ogRJ=BslHG;ueajdExmtA3oHz?SD!Zpt?SiE>E619gz3*IL*B!d`w7&=DQKeo;}U>g<8 zA0Qv|0oT6BL6gEmj7y%3p>kjXYX{AHw=2F;gADhZ&B#;y-kk?t7!0KAicYKsjlzae z?Qc=M{=&>?WjHf>yy5!~W^$SwqgvM} zOZsR(9IPvc`reBd%?Ljue*e9lpre=+oS@Fv*4D08t=di0Ntf`&S@-2Z=UM5;Cwb_f zYoxH7ZRTtabhW9vKM%bz4Ov+ol5q>aY{ZT8MD&}{(RBeMyL9WOZ&Ww&@#&C$U#=7x z+0M{YZ*U#(`_s2?oW07#*Da_V&7kc1E%hHV!-UhjoJUqW-(Wu0S?u^ED=Qe`W(5_q3*Gl-z3}Tm>G&rIf<~( zt?tCfH-(oNws+tBAYu65x`C5}Re^7+;d)tF6#h<(WWPw(563!>2PnA?{hOFDlaPW_>M@yCG%NGV1 z1Pry?y?5_M>iF1^GbNZs*QwjN-ru)Lj*hJr7+7yDEqm+!z3bn|?53Q%e&x#a^*ws^ zs!M#WH-h53Hkp9k!}mChyZ7ze4C#*M^wym_l~jHA9qc`?qNSD9awN%x;aO5*cIxyS zmD@OF^5ijV*RBmn=JToAQ41n-lWxV*QiDdkD*X&u^0Xtiw<9M{uEVjRymBQfn(>x+ z2cs7*^tzr53mU^)=GRqFVfm~YobY_E`(=kjXBV%}GxjYrpM73q)|F~uCHXC({%fdu z_v?4>l-?d(3Y?}XC&$d_ZmO@}ewkrxGm`ade(SCW3%-0&?K*mNC(5Ps$&qtSZ83s9 zwUXdAbl&aC-*S_hat3Zf6np~PHlqaR8cIT}FgRgi&A|!Nb(!gn^wez$R60b~KBy9- zIv!i^GWa4&QoFgf=QZX8*Mmc)$lRbDIb!0HwDK=B;(vk>mrbnVE_24ueym}?s?Fdv zPF#$Kb=@+#1P#CLMMPAUU4(zV;24hOI&>kibvDV1 z?YHz#xg^TpHzjjmQ&zL6H`vBgjkW7GD*7}XP)t3=u@!c+6bMyRn&@1XXFP6QzfmJ~ z-IO}Hjb zPZ%cEnKoyRci*v7rc6;&+{cfm4%ieH7Dj(@R`PdQt;2xn{dYVruFrQ*i@=SYtxvQz&1u5SM#-M5knbnCi(s}2Z51t|GEp#L>XOL3n zvot2Q=sJRerREJAG}y>|i=t|0pZ~rq8hm%xX&AuKP`RkuVQ-*DR=o?|Fp4x$MfEx- zr#rn_3rpAME`HjdnUT1MGH27M_VtMgwb~Au19UuvlV zmXTF zZ}jOetV#b;JC)AS*T;gfQh*&tSVgC~$=*HQKwr`S-Q2uN&6+h`tSlyY_)Qx-BlJAZ ziFasFUnjyPF8x+A>zQ`!x#)rCC;Y&Y;v`{|taEO7{`Txa`)BmKd&ri%0}cmkG9yRZ z*4B33(xo+yy|WnGQVO`x?%5;S?`}6>Kr?QsL(jCKH4(%$)3xs_6C63yJ!>l1yZ^Ce zOI1evd>85as^N=ViGo|_=Z~*bR5zh2mm`i`U~YcS`&qN%Y3G(I+1Y?AMmOyHQ6}ef z^z^w=t*j0_b!d8g_3{z3e(V<1Ouunbzaw9JjWcjr;t|3mL(ARcc!k9`5`weeDRz@Q zURI#s8kL?GKi6T>g;f?K{(214bq}bHg?l`*Nc0+%H*l=oHs7WG>nA<8>v`e)$9}6( z(HhO3eIfUPw$+dl4eh(fhfhj-Q7^Uea~tV*k@kU(ok`SHs|+q{13#6SlXE97t_c$N zy{Tc2#oCDJcON<8g8sd#+1;)6XT`=g3gX!!#pbnb-mqcA4}0DmNp;u0eS&(Ts=f8} zss8$*-MiO>YeJ?yeCg6|u5E|b0T+RcYiMt8->*f}83V_R9?g1{Dh;+(rl6Ig^VR$J zwN!Zcv_J^B>+oS``Hd(rzN~qeU16AFZ$F48Phtzidi&nJ>(NN|?$c)j3WxB|4<9|c zLqL8F&?VgROV9H;{|kt?Qpz;g0K4o)AWIlD)B&3aEKPi}%C&El-J~LeB)b|a21uLW zOXAA8f`T>9SuYh))`%$O=iUDxCeO!F`OFiPk2$hk3{sYrn4T@E0wbh+W9=yNhpN&_ z`xu=Y2vP zDDb2|@K8YCz}g@AO63R8G=>`CRc@|}9Cchhfe$LHHg4K<9E{H>blpJQ^!}7G8L{U9 zT?cK7v8idxr@5N}(o1}&PdY{t|5E!a8{)zlX9vpo14imi+tTk!gb2FUV=(eCWzm3v#_x}Az zB)=a|T=~(fRSuFtS|GtIeRlZG6}0u+PL&gbv3D%k+n5f!Dgti zA*i5gx934`P76pyb@YR>ukrP}cbg#;J20MZWnx#LI>v(&h5m@1n8h3z;y8%#yYa!E z0gsi|GyYZ$biVWac_ZZOH?d)oDw7)cc0xjP+K)=AZ`rXmQCiYRj>JFDhQ7ar%eIhK zxw*N-mhC7J=3(SR+gVkG=&m+5obV?Y@%!A|`e>YYo;yDmCx*s})-fkGT{p1`w?LLL zVBPoLFO~JhR+|Pq^oiyK0gY@qd9uSP{jR7zRJOKXmzE$mj9?sm0}eBHc}HO*eabw!sr; z8;V@nECeuLzrJqMR!XZ@Qq}zUu@1a>Mts(j30_yOpzvzWg}bn7O8eb%c;r~(&R#)9 zyQgvjFd-b9LBVlyH-iU%NWNOBWy_Xx!q%I}!|v9+S+g$dT%DcoGW63MjD1rMNo&NC zC0*HeP*WwPv+6}+;=@Nw+g4K8+(L}7TH#$3C{TH!Z_XJnul7U~u^)ZxQ!-oP+nTr3#aUXPgnT_WKA)N z%X&tSJ{4n7nH@MEElDi8#y_R3B85-=n3|`ddgL|vhl1kc-g$p;6x*wFvK2RP;Ynnd&*@n+_&ATZ*Qo+bx z7csg}K?QKsEhjrCCqDb)+(XI=?~sA1^e}|0H5o@%OK9a;Qd~~oG23HONx#;;%we1> zzj`oy!=ZN_K+RERw1|He_ssTG?i`C}M?-v`jd#CFtr36KSH4^AZKW67{;uHUzvm8M zm}GIhPwSVC1tunEM#w+3^hfS8Wh9eBQxzklv)@8*+|Y%fy~HH>sIg;DqHnn$9leFt z7|*`#moIC%`^|`rT{-0-vn?tWNv^Ta>h~||qg5VGkg-U#bLpFIWM})6g20cRm*D0V z;EVp?usjV8NO*4g?6bbtv15oSIVkoI&JC&CdGMs9t8rdK?M%)n?o!jME?v3eZ7zWI zR?ph!d>WQNy6w*|8#89iivWwJV)Mer##S;lVmE$Nuf5>6OP6(8^7K^oiIXP9FwO`3 zIr_pN(2dPUjKIfdhrZXZ>cAbbJVY`dueVtx;-`HD|d<}vdQgV(e`jMImw;YSFYm45Ewqf3wb zXlY&I33!`aYr>!L8KI$ZBS)@bM)*iZm}bF8^ZAPwZ7Ka(5EkpRfA8LQ>gtu-C~exj z2()V1Y2pDV4tcx2eH*cZcQ`#ST;uDsv<|+k(R6GzWL-0Efq`*6itF?npqAaEmP5Fx zJO^i>^V@4$3Y9W-=FH#5j*YNy-O$eQ=ul+{b^C3P%ECZN&q_i4C1~nddy5gV{p*c8 ztv{H`I_~P?3ksdR$_XXFP0-IA`-fd}#yZCQb92lbDDI&uuH##g_tKPra-!&N|Npju zHM0<(Y-HRS%Z%wi8}zClI~f9eH;^|(wQL<`7uYas>z=fl;N6>HtQ&Li^uN2mVkjg{ z#IEu$qcWMdcyTq3zRJnZPgB5m)IWDpQd*-hZ`S*F)wjGnKTsK%*7jYyR>ve^>$Yuw z@Gqh#+eC>u=Z1Y_;N{zhTw7dECEDLZ!%bWA{FPO|%2r?H0o7~J;7{uBG#VscDSXDq z>tE|ASPWfj5qsgm;iH4>Y9J1xUjO~#*XilzMj4RzFM^h}?P(fXYgl1&e7ybQYI&Na zE?1Rad*}il#=m~Hu^ueSmUUuUl>UfjgbVeLbghg(ps{+xBb8QlXkEjLfV7pNNwE%@hZhZK z(QRl+n}QD}3l=PpN8iGBpz?FD@{{A(0XMtjb!YfaA(?_m^9b6_H#4iC!eea=#K~oU ze}>7N;U1H3I5gEdIB`hTzgyvlb*FX7*%H_{YImUR#YqYy8~QnRMOP>_Za;WXT{JQw zM@dAMK*m=HAs{vC_ z{ye7zejG#0w%>NTX5u@AD!IZiQsA}8xiaiLiIO?~?Bq!q$=od=^SVx%;TdE%wcyRfN|TaG?U-~pn)JOk>sCyK43ebx+MXVieAy7Zt*Lxs({-OW zNwx7~J>EN+2+dXPRMmj|0aQ-;`FI6Ws{JAxbRCrZMigXU>|efodHeC>$wFyRrH@7B zKY78zg*DVRZgq8S5*HU&(dhurKf$&cuGO%DkVm50$kcF`?%kg)o!B=WoTB3?{d0?B z&%3{12EX2jYSKyne>c)I;<{^SG-6yzaZ^(97TbAG%=!8UR6ZgCxwS5C}U}M!rHY;*&rzO_4 zTC6knkQ6Eu4e|CzW_Ih^wZ8l#rG?STl@H1yv;6CdDLHtz{nJG@KmYjWjPMuZIwOAD zfz?AQ984PogMR_%bDQx1rrVnUfTJM*E)Ayv)5L;Uy;G+XxIcXvbUr%}P5tYms@}j0 z)Y&FhJ%9V{H!zv$YfC91gs%rowhUOVTsiLRTX)+i{fq%2C#-(zXYI+YY?ph1Vu?~> z>GU&Rwm!bTra3?QuJw#tYc-?9&f478)HLUKrz?)uIc7iYVutEJ53#e5h%e!X#y36Q zqo2iQ)-003+i_b_0M^J8EF0bFn|~VPr{_5bAn3|nvdsDP1aIR$Xe%4nZ8Lb-`0+Ko zy}cW~T&%@lJakg`=g2Jwc}+PwH%&8UZyGZdRNPf*mkSFXaF6}aBW?P)|Ia@wQtF?* zxX9Ad8QKYynfuj9)q7!NvrVR1hWj5uPc8=_S(@tb&}Vh_^Xe2F3@|90U`d5JI5_b) zknFVwgZ8d0RHI_i$B~iuT;bd}V)Hi*?;z$s1=^hUp*owi%^KOqB^jFTz7zodBI-V~6 z)tfgJq1hRwJ^`L?vuf3EDro@Qx35UaM1`;smL0A*;BhYO;yq-IPv~!$^EjPY^8aF} zk865`45DuXHrcduXI=29ouN?~=Sb7wPV_7C)3qJQy=?~?Up zfsHon4Qe|{I~(iud-=&EX<*Y4?KCy(ivYsKr8ddxLV$_Kz-edvyuVVk3LBz&0{zH< zNiAu9nDSTMjESjF|1^l`S-(}QTF~{(+zXy4iHj81s#U9{?!|1&FgfW|lrbg6_QH0r zLf@!lFtIe$%0}1MXiA?BDMZXO!wQnZ+529#-Gji(Z*qo(BL#OfTz})sr~A)ZhFoB% z@8r{*?Chlt4Y8JQDD&(6e5$J8yJC#OA3dtcvVR}Gb`O2yTdx2&p+A8Z1x_y3=69w0}nfUCP(D8Vxg0GO4{R7 zwu283lhFS6pI+CIdmf{V{*F`1XFNJ-=uYephqt2B_#-$tc-FE+p9@@oll(K%`_lt% zo~c}%RY4^ME<#LPM{gx1wS-PWhgOwwY_HGz6DN!xFKB^UWq{sG__IbH>Q@s8bMJnT zz!A_#F#OJFVsC;kNY~20H9dTWVP_4ET2xFUsXI2-gEt(*Um#NxY-}BFQYt4Y1gNA3 zD7Novp>W^S|K*xW6cs%6wK# zers!er2~km#8B|zUh zT+N$%Ooyjlnx~A6>U^;YzKEY6>wG+hctyq3!Edh+V(woy**EI&;tQJIw!~VbF~8#o zBu9y)H_yUi2Muu=a7vA3m+n7)9M0z?k?cf={))q!=e8lxV!B7hlmy!gt|5iKxyjMM zVNALWSeaQ*2nUJ*)lHDoPl~TnBFKVKu+2P^EiUJKBP1ai!oKvho|D%_N#6ep!#A~!Bg zM?>dKF47*?bIQ=K3Lh#Mt~p@R1Df>PJe>cBu=jxLasU7SFMAv-TV!TsWEHYyWkw~+ ztdpaXj50E=?2ZVjL`Gy(R6q%yd_2PO7hcS|g^o4DnB4*$MKZfh;Oh#6D0hh%fDB*)3MrYasQ=UZKc6<;A;4c*!bn<%XVX+# zqN^Dh;WLc)EJ7C3 z6W4FM9zEJ9fC~P0=Omj$(Xk| zB6Zx2D3S_D)GFvUi?Prnxeug|1plm7t(q%~a#KJ_KA}vcxp#?KaA@kbo@&IzKI*6| z>XIul6aj79wq+J-sr$C50-L1m5Xus!{i-s-ODX&Il!rr*5rnE@Mo-8DeAGwz?N z2f_disRV+soZ@8+Z>it2yCm|>^26ulEP6%mfLt5!VWEK5@CL{K_n9%hp~8ryaXW*Z zB5ere3n0n%K58MY5n_$7cCUK}oeG<2cw~RwBwFEBlT*VAR(%D|Sv5y3cv~(hDT%6d zT)-#T?tT09D*>=qs*sq*)bSxU(Z;WEsUn1(yjC}Y%`KT=gAhm-TfKU<;;Qn;G@niO zE1=^oqi~qljg7i7z#;2Y@Rz!iZ8WbNlyjxVlYk|BQmI^C02 zGCBR(@#B19CRlH>Q=5@zPG63aFrlFlGkrm~--_xZ)}EWq4yrP$;cX zp_`w41=LJ=ec^%WnCEdKX3s|CFUV&8oT}EUQNRpd(u5=U1PHw1o0Mnq#$CcdTjRXW;GFl04#_0c8?K zbA^@FXlIKc$C@=8w{KsCUO969>xN)EFzq9f8h!flHe_8;>(~l4TEsESkjlW(K!zFA zPB5LwPtj2KF>FnX4Pl+GTsH_~ zAGc`%G~sd4POX(V%4m*pf9@@NL;H-6&q;y55S(e={bO)w>j2yJB}Y~HWBU67vn4a3 zcY7TVvi%;hb&>NoEb9kbSZphJ&kJ{?lK%zBju}*ZCZuY_tVDmHh46^Rj`e|qcP)x3 z>*&p~y?f)nUAOn*NNFAi4<0O!SV!~)JI;PQ08z1uvK`qv4gK(%5Q{cvAe+6v8+0ca zZj8s@zE*#TEhdaT1Usvd*J@!8_)Z{&$FO@f*ixdSqXkeQaO?n0$nbSU3>Sv>9##ph z5QOMoz6ms>Rq)>qA3a(FjI$2-ss?XW1H{(O8p+d9dyuhs9CG4*bpS>ylA{$wbD_fR zp768nJrxTQ4qRj8FvHoIUDj2!kV<2G<#kCL%|I>&B&$B{7^R|G!gI6|`i^`8Lit(L z8XM5X3v*kv%^!mZSY)cN?so5p5`BrjQuq?6r>7qP1SnswT)7f`>Eor0kkKc*p-pA9 z!57H1ad2=L2+6QkR-}$YR!>$J8G#N`ssZ#@BOR%a!DRQ)kCt?Ws89=RCSu#>XAV2e zT|T|pT^DDuvk@$O0r9!4vM<)Q7k2GKpG``42^@MyPiN)4E4z+7JFesKZ1TOk2Xh}# z7p#)t6zvqW0BXj0%A!>ai0P28y7bm5Q4O#|FEnG^;~E-jdYz@x{l?tX?w@wRcXQR^RT3YJu_=;2#<)y*_yO5N$93Crtfbj>9H?Lj+ z#Dtpgm_>R942u>O9a}bOYL`N#yBf?PS2d_iWVTcOn{Y!&A(A!W1IHI;+bWwbpQa;Dnylm00gBzUaic3S2zEe4VW+V~z;oraV^RR;sLLsk zzFAIAY0f%%B~vpp5&=2t-&2=$=lz2ljhWc;w{B){8yVQ~{PS?GCV8f1n_uVNWXFGa z^T?2ha&U2}A=aIM93~#P+KNS>#-wW0Wj>+MB+DUECQ*OJBLdXedrq!b3)24C!eXwh z1m#{W^PF}l@~fix1HahR9&z%9%&Zd0aZWob@>_bl7ll^^RG8~AWh#;Vu`BXp~Kaw`g<{JuZR)za%elim}eML@NdsSc)r|K zyD*0JGA!8K_18q0tOjMIOTRrxsC9pFz}F(WKrwQ7d5fwU{812dPcBupZqRR)R?iLkoh zz>JX%n{LWB7%16(&lb%M<%@rJjS`TR&XPW>)vNb6$D?rIsP5ww{mRHxQ@lYsc`c3% zOZhAOw@Jbcrpa3o64DM{$lp*18GJV(7YQE{Bw{^a#+xaHWW&+T;(lL<8So>K)D5gW z?)Z#)U2jw$9WWPt?HP9?HE5w^Y^BPi5>8Q$LAx^l;?0M0P2IA)k6qYU>hJ7ZM_UT1 zhqmTz-=A-j_@B2K^_h5_irNLNrXdtE8m)zoAlPmIHNX6t_IU~$$+^dBMn*?B?b@{t zBQ@KNpH$AvdY#Kh-<`@FW?J8@soXLHe`ieS>GK#uEI0$M`}T&VBZqJTr!{q0TgYPE7h+9+E32jq zHY-rQ7Y>7s$Bm4GiNhf1S zis{Ib^}@UVV*#SH!hf{f-Te>k>J?-H%f4P5b7f@~)Sm(Bph3{_>dQCZD~O_aKR3cr)5>-l6m=M>}L@ZG$4b@;uh?qi1A|v z7@%RboIda&w;*!qHvbgZE(0}5OM(ekbT)DF)5eIQwx9;hn z?oF?4B~14(U!qBA5pk7OBvwrnSBg8~@R9Wy01pC)ptWDd^_U8WKyl^Ck~Jn-NMe*P zv;zM8ROs>9?BAc-0kS77G}^tkVV&~-4E~GKR*-rX8A(~G8y7XFIg`FaLhh-Fkkn(~jk;Z?Z#39`|r&=X~os}&>kX=y?32-&Mk|$sm#Zfhivp8zcQe52<$DH zTf;o0E?g#;hgl?A1_EOZ8nn8gZ^@$PKgM_Of13Tkj$a{1OQuAIr!fm%+`)87;J}mVJv?&09C|Uy;r;cDj5XEz^DTu2O?W;F*xPK- zx;Q?;o1`{jX@TwbLHE**jdGm*;f4Nnux?-8}w3rGO?M z?+JQpaj+GtVKFNQT2Y9~r4=T`IunX>1#DZY+**mnVBz*!6i<=_3*VPWT%D6r@#BA4 z?@#O8I+(Da;8S?PTmTZG>;sIgn)C7XgG8#7^sIMI+gEEQ-p)GEdh)}I%Qlg7C}?X7 z$zkNqo_|9Cgye8+Y*cmIcc0!`Z&!OQs!g}KV%4fLfaJ5-&z6|YyeE?VH;DEtIO5p` zW`#A!wI=^5Lar^}vZanJI|Wz^IzmQ0oT0=sJ1?U3__(4x#SjYlV6mekXq{~ZRy7Csr(S3E?yaWCJTyB?fid;e5a z!fey7tAk$=kpnO3vXVZ@kqspD)y|+|y9Tp^Zp;|1V0X6C)ivKnj&Z2Lv6scx(_eDh z$YF${Y4^-$$Yz@A&&yUqIxWNRAjcEO`?x_WORlOd>y7_hWNi)a#O&Yt_#pvQ$+Dk} z&W9E_zVM}U2EtIjdsn?17u$R3(q0SRD1<*4)5}+_8W{3KmJ^r?ND;+0*YNLKVtQ0P z7<~7~j~}HmASI-2QX>mzk4PPowl`{|3ozM|cmN9E`AMUR_NV*kw07**ZyC^L9$|RW$H+)$WE$zu+dO@sB_@!FWn8f1J(9fD z=vj}JGhC~QYz=o5*^rDEZXJvUo^~vOl~l(l-(oJRfx}^o>%o@Bc;z6CQLxDYk6W7* zQTuek$2-Y+xTE9iIa;Hx)k3pv;@GxtzMd`pJobHCBQW%^)`M-I++Fv+)x<^e@xqW< zZuHr|LkTtG2^Eq^JJ}q)<%LuTLx?26C)ODG_+vO1mkMp1{j2XOW_}wv2yWjsYEC`4 zC7kY&wcX=i3{i~R%a>ykZ}Zn*$>+|Ud(llvN+n5b;dMX+-g#Dh?jp@kIl=1qs9OVdLsrt2Q(ECS%DJd1O648%0TSLYts-A5WWK{depC&fe~?HNeNg{spov%+ubySAA4%)_$4CzH?&N`;^i!JWB>R?D=(T$K}lA3N4% ze8|{aFXv(363mE3#8(kQ;528lJYY9(fP9>d1B!W|&pO8gBin-F2_^b$G!t@X6rJ#4 zWh#&`O(@?e25J)3ga$9wu=^hy3gm?X7kr}b|MkbAk?}c$D_K zwQtRYcC}Uai$==B56=6RFK2#26E^~s6SJ?Ye03+5nC;m8#m_u;fw_z$Xa~Px{zO>GbvBt*!49nRS=_k7Nsd#}Q z3*T8phM`6R z#BYNpE4}b>(^ixzd#Lt+gf9}SDD8l#J&{BcX>|UCDc_@O;rUd&{#c7d^3NaFIa&B% zkmu~OukOyla*{Q_!VfxgH~g?RpyB#{BS3#lM~?I;_y%x^dae9X(Z()1p#FD@U*fx^ zMLI{!tQf&26Fdl>T?)_p-?+D@8z0#B6@bDW*cXq{_uEkQ!i z&gWW2&ctC14HE=Cy7a&dM$xJ8J-6jQuRUvX!ShjS;dw*syftod^a_QKLDyDvDtz^^ z2hE7x-eCP-KD<0=DjvZ&)`)k;VD6@(m>3reA$JFel?@XM(V7pU1*44KLd;j<^eB@y zr`vhon`zFp0ky>-c&Ui>QHsb}p*vC$uK=F@r;pF}=r?=O(f^*9Hmz5gT`p&iazji}Izt`sf;!KAaFCq}3Fe@{#gj5K$$(?qkR3D!_Ysz3QIyh@4w0Ozo}U{QLFglXZZq3@Ab#=s(U&+Hih1C9v=Gg zz?@h`7iCM)apcZRaiu}gOq4Wvjz_V+gb!htqR08}@nQ)=8GaRelbF0~!(6hq{*?x- zi6*_TT+N}a|F;AE&v{mV9%$Dd%i}v#I`^X5uhWB135p~`$Vo{TE-)-OiM96#NjS!> zfo6y`Jbhwt$CGW!`XQ~4SY2=uwrXhv<`orEwd&QgomZ1rG_5{z8U^~VpI1bcku)ir zD*mDVk$=;A!`~m*^1{(%AT-9se8=uybcFZ;5*c;SbOl+tUQ{~tFDwxh-}CXs%8lSolmA z{P^vPW-%9!{r1w)1=LT%5Z6G?r(yzYQ3n@7q6879&;t!Mf2J?3x^?sI!xh4}yktPJ zCnr$ZiIaq6Ewsf0X^Wb}ot8^EYuKO2*x6IQNiGvtA*R@nRmLMFeFzLIKdw|&-=gqn zT(L4o z@_Y}K6>3KDWNup!W6{4vOGJ;YE);;mw4H+}QSz@1 z)3t@yBlIa##DGxVMMOi`u7NZQS)=nOii`Hv{>UsU15xvzxQbBY8i*>GQk#z zdD>teslLto6)QZAE3j-b4(d*tVbxw@-#~jO57f+N3=NHG?s?vsKjKXoN2^o#-Ahi1psNGZg7WG3?QV76Dw;;M)}>m5GzB znl&?oK~J{X#R(d*T_S}#Q}4jR`SPoxpDFs_sbVcU@8m=_KRj;DCL=8S85p_KBDy?j zNxqpp^`Z$)wM9#a@qJ*f&hU+UU0oHCRdy+On@Gqi5@F3O^a0J#dkGY}+FG9&*O8Gf-;tIcdb5QFV7uXLf#E{v_54$(N3<+j1G z$UTgdQ_4m<)CuRTlzNi;p;@%pPr#20NhsFJ^=YD z{p0&0ap&>uLhCKh4$l+^@H$G{Z4Raf3)Y$ecg`zIXWGCR8jnwv%!$YmF|MI6eZk2ZlU-e(^PqH-+t)9QuXTyiV@QxLxx1* zUNHv0Mlm#*e}CcNE%$eQMoLPoH$8fTS&gPDk~{*e(1uMI88%2u$jT4`<>IIc5^#;e zv-!7=R}7UCgXlc8jZhPub&NYg1J-Jp7Z>$p2)Sw9| zReqgAa@Y$38Y`ZSfz?o!HD!q4gFw=)a7C#FGXJwecL8xcI?zc3gZ;pw$$(`@^5JTP%xev7Z2_#^TN^1SQWB-K3ngqq(~Vi$RZODIMH zM9BTXoziNHV*#`$D{Ix-(RS+D=0pT@7KQVmQ?=pqQHOiFC;wQqYd={Py!ZgS&|?x= zPuxNF-pAld%?ibY}00#C(M>-(|bTXLpB1CNfIFwtX#ec>y>L7 zEMeJv4*(_*!p`W-t(=u9RorJk@7nd>!|gqC^yp2L1YR(UcN60prj>TRW6X(oG4CWj z!uOBr4|AfpIkN-tgn`wBA*HWY_;68R7yW4LWX{^$fvx~9yB|feVVl%YkV{% zP*Ga@Lyh3C5puHu7mfiTFCo0Y`|v@3kq+M|a^P>b3NM?HK|d1(@KQ?_H3~B$3Pqd5 z;L`8Xe)j6c_#N(S>9dfBTP$6{QrSrp!O$ zpvV+0y=2pmkCV z{5h`@Z|%FXIOe5)HOQppCBy+?jEn`S%%gdg;&WE5?%mbygnrL^GcyoD$lLX!U@*a5 z6U%jUGVy@5pLf2#Cv~KF12Z`FXSH}QL-eiE2G9}K_zeMRA+;!Hsn^@{HSAFOpq861 z1zDr*2F^o85=lBwwp^cs3RWy%{wm1Zfj8=#S$cM97hbq!?x))l#0Z>#9`^t<`3Hct z{J8pEu%fn_S6=?1=qEFPq7i!DP&i5G#W=&>lP~mY0cj_d91y`FakzhKJl9R!70Om^ zc!(z$DDut=x2_`qy(vp5-T$0dQ&lo9{I}Bj4SsbvkL$R5@PNA>zgPoxbjM1$*|1@# z`Ym@dk6`B>wUxWGImjdfX@Z?|$BO?j@$?#a0=}}1i%`Z>%_mG)(4`RcdsVZbY~lAQ zsz2{e<7_nXyVQbQ)9Zao=Pzur2#`2`Wf3R|F1hc(frCY$q}a;W!pMd@2GS!J#MN*0 zZ}&Uxh|RDibZr%@RyF5-%QM9@5a)2g1uJc7ht;WuEEeVv#;y|rQ<4fRG1net zV@pVaFZwwV#FPnr6@gw&aaj|5kJszFZws_-(i)H{31g_N3W~2A+X-zzrhlv5l@kq$ zgC7nrSg1HC(W3((7{l45J9q8~H2+-A3Z)-^(PX7FR!xI0)e9c03*)YI)&sVDZC0k9 zdbcNK4~J+Y0+EHmYW_WEL7e>0igLJs-?wJy3*;{+;6{ia>_(dLAc@9YGO)H^&#nNU zisD_mcp-D5J8Mp~WWi8e1&7UJ!h2mlT@#yW(~{@~?9~6eSMxtxyiTp;H1f;n{u@b{pSvgZn-#t@ElEs)_4u&6Mrc=+PCjHvhXG2B98p0V~Gpt411Zo zDXn@TZdygT>m)vLw1XUMZ(rX)0$oyKqB=r8UW@04kq>^AEwJMZ)O)bahuO}~h2Cc<8Ccd3G*$Jk zQv5h;*)g-0V@A0gfhGyXSDdpE$mhM8TR<>LLo(%{<=5f4U=)nq?KUo({}^0{S5aQg zkMGSa{oUKQQ3Ii@D8{!Uix1RXyVETkAaO_w07W-^KKHR#!9fS>8w@}0R7`jll8 zT6FDdjz%!e$?v_nO0&u=uOUW)n>nHWV|tL{DFOF-Hf%YUi^YxMR&}Z2$w~7+QXC0! z-MRRkk@zI>F$CnIzw7(&2`h$o{&v6~9=}csV=gmktpAkoaZW0j35L{H_x{O853E%D z+3-gKBp=?n++k=T5Ug#uQTODf+RQ~ILNfV9+Rm2(FZA&^w#r}YQ#<6V6A zs0=Oafzd3mJU&CrL6|A{SC_3F@e7i~K(-=<3&z8H(1Gvcoh6qVmt~?!B=Uy-<^)mk z9^R3HQUSm8Ee5~1s?{O>hzparLCIbiP#^_J-!k$ai3dG5hKZ^`AheHenbQs1;AyYVbDQR2+wE;;$YSAbb3WVHY zzQeyoM(LSbQFO<5_)@1HWflK*pem?%{*7PXYnY{cLthZ4k5Udb%N`&wX+ zP;6pD$;ymT2cwmLr?V!)hs^;HaAAQ>(9=j^vG8yW>#1KsiM#a3YMvaapFg!MSy}w^ z=&d|z8Zjg}rKK5ZNY@~={vj7M8lZq3vk8>Fs=gH93r(2r)NTxI)<2K zOcR|Cp*vR`Rw;{8Jc=q*of5?#Uawn!=$`VIkp>0(?a0{yP#^_Y&3MEGlwm#RUiy@C z9RwCeAcU9{ScvAz^TWxm^xHkVNInnSr7rzqL>>_U7$nWz;m2clT^V}ZKVHSO1DiiZ z0b3$huxZd9@$vXx@EMmOndcQvFFDa!e-^(@-tGh{gw{ei{f2vM0;xy;}St2Y)*g0EN!%J(cPa}_qXSN8aKlP zcv3)MoZQefw-G3fOQ3BFcTYU=aQmGyXUxOPV~{-JR8jecj0^7{Tky_Z%qt}YvYV}* zZn*T*)Tqcefr_yPeD-WePN(hq0A+%l*+C>>yeHK`a=UYM*8$RejPv9BkseJkMkY5M zOZiIXA4DV=gRS_J*X3fLF%RZJnXD&e7sH2PcYRpz<%S4*fei88EU}Xze^y+ORFuB5 zIjT`XPe?GW8HNysX?#g5SDhQZ9w`J~-or?0SmYDT?P8N=g_-?%*N^FK_i^3-jk|Hq zQFtLrVMV=_%$SeYA>w*!)3#pP)#t&}m2o=|lSvFO*`JS^#vFrFZF^pI(_r8@7K8+) z?_Ln-h_?PEQMB+8-V*bG=WINr3-g7QHtGCiXM*|z%5Pg~&n#FcYcXn~W8?@p^5e)iiT^_AR>j#(jutHNA)c&#=drD82c$2* z&))*byg4YK>Aqh)3}@Q*O9&KSVt;&%oztsornqBEi;3&37**HK(y;BT(KL$|L zD{H+TIrYRHId1X_u~x+|-LFJn`25ehC$|$zVAP8oby~HWb?n)*XSpCh(JvkiR5G8i z$RkiAH5tKrA1w^kdk%%7TnH~8pZ#2-iCijg88EbW?ZhUo857d`i{Fos7EG#JZJ`=) z{xO|8M5$wj#Wt4K5}z^Ui-P2 z_dRFxaQJ6uXV>q2-8?5S|kb#0r@o!>`4a9RpIOwI`7k>H6ZkHgeF0B)GeZsJMN zE^t7=6>&*%nCyO_?5sAzqElHtJ!RF1=WVct>(Qg{M_iQAef2x-YP-u9fL4(MrEDz2 zGoY&Zx0ddEse)?O`T8v4@`)}$S<#O_tYy0*YC^^Mq)wOj)taMYG4(d+kgm80PD^Yx zdc1k9;7T7Y29Ca#9~$_P@lUJChcf;J0Mv)uB+HVlx$muxTb+Fk)6JGG2Bz5;+Knt{ zI-Jb1q1OjrNS)@e`uY+C&! zAT?mPG-75xC;w~h7NvA{!s8PUcStls17hoe{v@aR*V?tzTCExV(^ZM#9Y-WY^mwRR zZ-6~fk+h~t0Kr>J2`sP4_ra>IC*#9m@ZQtNOIml>rwU{{J%Z(5QAxr#iSd!+r$}_v zJof@k)o+;V0_4*M<4=yl7&|+=aEE_qRO+uGRV(N1kc19$VueM5KAk@y{WƩ%}? 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 diff --git a/docs/tuning.html b/docs/tuning.html deleted file mode 100644 index 63e23f57f..000000000 --- a/docs/tuning.html +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - - - - diff --git a/docs/udp_tracker_protocol.html b/docs/udp_tracker_protocol.html deleted file mode 100644 index c111f5b7d..000000000 --- a/docs/udp_tracker_protocol.html +++ /dev/null @@ -1,605 +0,0 @@ - - - - - - -Bittorrent udp-tracker protocol extension - - - - - - - - -
-
- - - - -
-

Bittorrent udp-tracker protocol extension

- --- - - - -
Author:Arvid Norberg, arvid@libtorrent.org
- -
-

introduction

-

A tracker with the protocol "udp://" in its URI -is supposed to be contacted using this protocol.

-

This protocol is supported by -xbt-tracker.

-

For additional information and descritptions of -the terminology used in this document, see -the protocol specification

-

All values are sent in network byte order (big endian). The sizes -are specified with ANSI-C standard types.

-

If no response to a request is received within 15 seconds, resend -the request. If no reply has been received after 60 seconds, stop -retrying.

-
-
-

connecting

-

Client sends packet:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int64_tconnection_idMust be initialized to 0x41727101980 -in network byte order. This will -identify the protocol.
int32_taction0 for a connection request
int32_ttransaction_idRandomized by client.
-

Server replies with packet:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tactionDescribes the type of packet, in this -case it should be 0, for connect. -If 3 (for error) see errors.
int32_ttransaction_idMust match the transaction_id sent -from the client.
int64_tconnection_idA connection id, this is used when -further information is exchanged with -the tracker, to identify you. -This connection id can be reused for -multiple requests, but if it's cached -for too long, it will not be valid -anymore.
-
-
-

announcing

-

Client sends packet:

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int64_tconnection_idThe connection id acquired from -establishing the connection.
int32_tactionAction. in this case, 1 for announce. -See actions.
int32_ttransaction_idRandomized by client.
int8_t[20]info_hashThe info-hash of the torrent you want -announce yourself in.
int8_t[20]peer_idYour peer id.
int64_tdownloadedThe number of byte you've downloaded -in this session.
int64_tleftThe number of bytes you have left to -download until you're finished.
int64_tuploadedThe number of bytes you have uploaded -in this session.
int32_tevent

The event, one of

-
-
    -
  • none = 0
  • -
  • completed = 1
  • -
  • started = 2
  • -
  • stopped = 3
  • -
-
-
uint32_tipYour ip address. Set to 0 if you want -the tracker to use the sender of -this udp packet.
uint32_tkeyA unique key that is randomized by the -client.
int32_tnum_wantThe maximum number of peers you want -in the reply. Use -1 for default.
uint16_tportThe port you're listening on.
uint16_textensionsSee extensions
-

Server replies with packet:

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tactionThe action this is a reply to. Should -in this case be 1 for announce. -If 3 (for error) see errors. -See actions.
int32_ttransaction_idMust match the transaction_id sent -in the announce request.
int32_tintervalthe number of seconds you should wait -until reannouncing yourself.
int32_tleechersThe number of peers in the swarm that -has not finished downloading.
int32_tseedersThe number of peers in the swarm that -has finished downloading and are -seeding.
-

The rest of the server reply is a variable number of the following structure:

- ----- - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tipThe ip of a peer in the swarm.
uint16_tportThe peer's listen port.
-
-
-

scraping

-

Client sends packet:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int64_tconnection_idThe connection id retreived from the -establishing of the connection.
int32_tactionThe action, in this case, 2 for -scrape. See actions.
int32_ttransaction_idRandomized by client.
-

The following structure is repeated for each info-hash to scrape, but limited by -the MTU.

- ----- - - - - - - - - - - - - -
sizenamedescription
int8_t[20]info_hashThe info hash that is to be scraped.
-

Server replies with packet:

- ----- - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tactionThe action, should in this case be -2 for scrape. -If 3 (for error) see errors.
int32_ttransaction_idMust match the sent transaction id.
-

The rest of the packet contains the following structures once for each info-hash -you asked in the scrape request.

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tcompleteThe current number of connected seeds.
int32_tdownloadedThe number of times this torrent has -been downloaded.
int32_tincompleteThe current number of connected -leechers.
-
-
-

errors

-

In case of a tracker error,

-

server replies packet:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int32_tactionThe action, in this case 3, for error. -See actions.
int32_ttransaction_idMust match the transaction_id sent -from the client.
int8_t[]error_stringThe rest of the packet is a string -describing the error.
-
-
-

actions

-

The action fields has the following encoding:

-
-
    -
  • connect = 0
  • -
  • announce = 1
  • -
  • scrape = 2
  • -
  • error = 3 (only in server replies)
  • -
-
-
-
-

extensions

-

The extensions field is a bitmask. The following -bits are assigned:

-
- -
-

If multiple bits are present in the extension field, the extension -bodies are appended to the packet in the order of least significant -bit first. For instance, if both bit 1 and 2 are set, the extension -represented by bit 1 comes first, followed by the extension represented -by bit 2.

-
-

authentication

-

The packet will have an authentication part -appended to it. It has the following format:

- ----- - - - - - - - - - - - - - - - - - - - - -
sizenamedescription
int8_tusername_lengthThe number of characters in the -username.
int8_t[]usernameThe username, the number of characters -as specified in the previous field.
uint8_t[8]passwd_hashsha1(packet + sha1(password)) -The packet in this case means the -entire packet except these 8 bytes -that are the password hash. These are -the 8 first bytes (most significant) -from the 20 bytes hash calculated.
-
-
-
-

request string

-

The request string extension is meant to allow torrent creators pass along -cookies back to the tracker. This can be useful for authenticating that a -torrent is allowed to be tracked by a tracker for instance. It could also -be used to authenticate users by generating torrents with unique tokens -in the tracker URL for each user. The extension body has the following format:

- ----- - - - - - - - - - - - - - - - - -
sizenamedescription
int8_trequest lengthThe number of bytes in the request -string.
int8_t[]request stringThe string that comes after the host- -name and port in the udp tracker URL. -Typically this starts with "/announce" -The bittorrent client is not expected -to append query string arguments for -stats reporting, like "uploaded" and -"downloaded" since this is already -reported in the udp tracker protocol. -However, the client is free to add -arguments as extensions.
-
-
-

credits

-

Protocol designed by Olaf van der Spek and extended by Arvid Norberg

-
- -
-
-
- -
- -
- - diff --git a/docs/utp.html b/docs/utp.html deleted file mode 100644 index dd29d0588..000000000 --- a/docs/utp.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - -libtorrent manual - - - - - - - - -
-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
- -
-

uTP

-

uTP (uTorrent transport protocol) is a transport protocol which uses one-way -delay measurements for its congestion controller. This article is about uTP -in general and specifically about libtorrent's implementation of it.

-
-

rationale

-

One of the most common problems users are experiencing using bittorrent is -that their internet "stops working". This can be caused by a number of things, -for example:

-
    -
  1. a home router that crashes or slows down when its NAT pin-hole -table overflows, triggered by DHT or simply many TCP connections.
  2. -
  3. a home router that crashes or slows down by UDP traffic (caused by -the DHT)
  4. -
  5. a home DSL or cable modem having its send buffer filled up by outgoing -data, and the buffer fits seconds worth of bytes. This adds seconds -of delay on interactive traffic. For a web site that needs 10 round -trips to load this may mean 10s of seconds of delay to load compared -to without bittorrent. Skype or other delay sensitive applications -would be affected even more.
  6. -
-

This document will cover (3).

-

Typically this is solved by asking the user to enter a number of bytes -that the client is allowed to send per second (i.e. setting an upload -rate limit). The common recommendation is to set this limit to 80% of the -uplink's capacity. This is to leave some headroom for things like TCP -ACKs as well as the user's interactive use of the connection such as -browsing the web or checking email.

-

There are two major drawbacks with this technique:

-
    -
  1. The user needs to actively make this setting (very few protocols -require the user to provide this sort of information). This also -means the user needs to figure out what its up-link capacity is. -This is unfortunately a number that many ISPs are not advertizing -(because it's often much lower than the download capacity) which -might make it hard to find.
  2. -
  3. The 20% headroom is wasted most of the time. Whenever the user -is not using the internet connection for anything, those extra 20% -could have been used by bittorrent to upload, but they're already -allocated for interactive traffic. On top of that, 20% of the up-link -is often not enough to give a good and responsive browsing experience.
  4. -
-

The ideal bandwidth allocation would be to use 100% for bittorrent when -there is no interactive cross traffic, and 100% for interactive traffic -whenever there is any. This would not waste any bandwidth while the user -is idling, and it would make for a much better experience when the user -is using the internet connection for other things.

-

This is what uTP does.

-
-
-

TCP

-

The reason TCP will fill the send buffer, and cause the delay on all traffic, -is because its congestion control is only based on packet loss (and timeout).

-

Since the modem is buffering, packets won't get dropped until the entire queue -is full, and no more packets will fit. The packets will be dropped, TCP will -detect this within an RTT or so. When TCP notices a packet loss, it will slow -down its send rate and the queue will start to drain again. However, TCP will -immediately start to ramp up its send rate again until the buffer is full and -it detects packet loss again.

-

TCP is designed to fully utilize the link capacity, without causing congestion. -Whenever it sense congestion (through packet loss) it backs off. TCP is not -designed to keep delays low. When you get the first packet loss (assuming the -kind of queue described above, tail-queue) it is already too late. Your queue -is full and you have the maximum amount of delay your modem can provide.

-

TCP controls its send rate by limiting the number of bytes in-flight at any -given time. This limit is called congestion window (cwnd for short). During -steady state, the congestion window is constantly increasing linearly. Each -packet that is successfully transferred will increase cwnd.

-
-            cwnd
-send_rate = ----
-            RTT
-
-

Send rate is proportional to cwnd divided by RTT. A smaller cwnd will cause -the send rate to be lower and a larger cwnd will cause the send rate to be -higher.

-

Using a congestion window instead of controlling the rate directly is simple -because it also introduces an upper bound for memory usage for packets that -haven't been ACKed yet and needs to be kept around.

-

The behavior of TCP, where it bumps up against the ceiling, backs off and then -starts increasing again until it hits the ceiling again, forms a saw tooth shape. -If the modem wouldn't have any send buffer at all, a single TCP stream would -not be able to fully utilize the link because of this behavior, since it would -only fully utilize the link right before the packet loss and the back-off.

-
-
-

LEDBAT congestion controller

-

The congestion controller in uTP is called LEDBAT, which also is an IETF working -group attempting to standardize it. The congestion controller, on top of reacting -to packet loss the same way TCP does, also reacts to changes in delays.

-

For any uTP (or LEDBAT) implementation, there is a target delay. This is the -amount of delay that is acceptable, and is in fact targeted for the connection. -The target delay is defined to 25 ms in LEDBAT, uTorrent uses 100 ms and -libtorrent uses 75 ms. Whenever a delay measurement is lower than the target, -cwnd is increased proportional to (target_delay - delay). Whenever the measurement -is higher than the target, cwnd is decreased proportional to (delay - target_delay).

-

It can simply be expressed as:

-
-cwnd += gain * (target_delay - delay)
-
-cwnd_thumb.png -

Similarly to TCP, this is scaled so that the increase is evened out over one RTT.

-

The linear controller will adjust the cwnd more for delays that are far off the -target, and less for delays that are close to the target. This makes it converge -at the target delay. Although, due to noise there is almost always some amount of -oscillation. This oscillation is typically smaller than the saw tooth TCP forms.

-

The figure to the right shows how (TCP) cross traffic causese uTP to essentially -entirely stop sending anything. Its delay measurements are mostly well above the target -during this time. The cross traffic is only a single TCP stream in this test.

-

As soon as the cross traffic ceases, uTP will pick up its original send rate within -a second.

-

Since uTP constantly measures the delay, with every single packet, the reaction time -to cross traffic causing delays is a single RTT (typically a fraction of a second).

-
-
-

one way delays

-

uTP measures the delay imposed on packets being sent to the other end -of the connection. This measurement only includes buffering delay along -the link, not propagation delay (the speed of light times distance) nor -the routing delay (the time routers spend figuring out where to forward -the packet). It does this by always comparing all measurements to a -baseline measurement, to cancel out any fixed delay. By focusing on the -variable delay along a link, it will specifically detect points where -there might be congestion, since those points will have buffers.

-delays_thumb.png -

Delay on the return link is explicitly not included in the delay measurement. -This is because in a peer-to-peer application, the other end is likely to also -be connected via a modem, with the same send buffer restrictions as we assume -for the sending side. The other end having its send queue full is not an indication -of congestion on the path going the other way.

-

In order to measure one way delays for packets, we cannot rely on clocks being -synchronized, especially not at the microsecond level. Instead, the actual time -it takes for a packet to arrive at the destination is not measured, only the changes -in the transit time is measured.

-

Each packet that is sent includes a time stamp of the current time, in microseconds, -of the sending machine. The receiving machine calculates the difference between its -own timestamp and the one in the packet and sends this back in the ACK. This difference, -since it is in microseconds, will essentially be a random 32 bit number. However, -the difference will stay somewhat similar over time. Any changes in this difference -indicates that packets are either going through faster or slower.

-

In order to measure the one-way buffering delay, a base delay is established. The -base delay is the lowest ever seen value of the time stamp difference. Each delay -sample we receive back, is compared against the base delay and the delay is the -difference.

-

This is the delay that's fed into the congestion controller.

-

A histogram of typical delay measurements is shown to the right. This is from -a transfer between a cable modem connection and a DSL connection.

-

The details of the delay measurements are slightly more complicated since the -values needs to be able to wrap (cross the 2^32 boundry and start over at 0).

-
-
-

Path MTU discovery

-

MTU is short for Maximum Transfer Unit and describes the largest packet size that -can be sent over a link. Any datagrams which size exceeds this limit will either -be fragmented or dropped. A fragmented datagram means that the payload is split up -in multiple packets, each with its own individual packet header.

-

There are several reasons to avoid sending datagrams that get fragmented:

-
    -
  1. A fragmented datagram is more likely to be lost. If any fragment is lost, -the whole datagram is dropped.
  2. -
  3. Bandwidth is likely to be wasted. If the datagram size is not divisible -by the MTU the last packet will not contain as much payload as it could, and the -payload over protocol header ratio decreases.
  4. -
  5. It's expensive to fragment datagrams. Few routers are optimized to handle large -numbers of fragmented packets. Datagrams that have to fragment are likely to -be delayed significantly, and contribute to more CPU being used on routers. -Typically fragmentation (and other advanced IP features) are implemented in -software (slow) and not hardware (fast).
  6. -
-

The path MTU is the lowest MTU of any link along a path from two endpoints on the -internet. The MTU bottleneck isn't necessarily at one of the endpoints, but can -be anywhere in between.

-

The most common MTU is 1500 bytes, which is the largest packet size for ethernet -networks. Many home DSL connections, however, tunnel IP through PPPoE (Point to -Point Protocol over Ethernet. Yes, that is the old dial-up modem protocol). This -protocol uses up 8 bytes per packet for its own header.

-

If the user happens to be on an internet connection over a VPN, it will add another -layer, with its own packet headers.

-

In short; if you would pick the largest possible packet size on an ethernet network, -1472, and stick with it, you would be quite likely to generate fragments for a lot -of connections. The fragments that will be created will be very small and especially -inflate the overhead waste.

-

The other approach of picking a very conservative packet size, that would be very -unlikely to get fragmented has the following drawbacks:

-
    -
  1. People on good, normal, networks will be penalized with a small packet size. -Both in terms of router load but also bandwidth waste.
  2. -
  3. Software routers are typically not limited by the number of bytes they can route, -but the number of packets. Small packets means more of them, and more load on -software routers.
  4. -
-

The solution to the problem of finding the optimal packet size, is to dynamically -adjust the packet size and search for the largest size that can make it through -without being fragmented along the path.

-

To help do this, you can set the DF bit (Don't Fragment) in your Datagrams. This -asks routers that otherwise would fragment packets to instead drop them, and send -back an ICMP message reporting the MTU of the link the packet couldn't fit. With -this message, it's very simple to discover the path MTU. You simply mark your packets -not to be fragmented, and change your packet size whenever you receive the ICMP -packet-too-big message.

-

Unfortunately it's not quite that simple. There are a significant number of firewalls -in the wild blocking all ICMP messages. This means we can't rely on them, we also have -to guess that a packet was dropped because of its size. This is done by only marking -certain packets with DF, and if all other packets go through, except for the MTU probes, -we know that we need to lower our packet sizes.

-

If we set up bounds for the path MTU (say the minimum internet MTU, 576 and ethernet's 1500), -we can do a binary search for the MTU. This would let us find it in just a few round-trips.

-

On top of this, libtorrent has an optimization where it figures out which interface a -uTP connection will be sent over, and initialize the MTU ceiling to that interface's MTU. -This means that a VPN tunnel would advertize its MTU as lower, and the uTP connection would -immediately know to send smaller packets, no search required. It also has the side-effect -of being able to use much larger packet sizes for non-ethernet interfaces or ethernet links -with jumbo frames.

-
-
-

clock drift

-our_delay_base_thumb.png -

Clock drift is clocks progressing at different rates. It's different from clock -skew which means clocks set to different values (but which may progress at the same -rate).

-

Any clock drift between the two machines involved in a uTP transfer will result -in systematically inflated or deflated delay measurements.

-

This can be solved by letting the base delay be the lowest seen sample in the last -n minutes. This is a trade-off between seeing a single packet go straight through -the queue, with no delay, and the amount of clock drift one can assume on normal computers.

-

It turns out that it's fairly safe to assume that one of your packets will in fact go -straight through without any significant delay, once every 20 minutes or so. However, -the clock drift between normal computers can be as much as 17 ms in 10 minutes. 17 ms -is quite significant, especially if your target delay is 25 ms (as in the LEDBAT spec).

-

Clocks progresses at different rates depending on temperature. This means computers -running hot are likely to have a clock drift compared to computers running cool.

-

So, by updating the delay base periodically based on the lowest seen sample, you'll either -end up changing it upwards (artificaially making the delay samples appear small) without -the congestion or delay actually having changed, or you'll end up with a significant clock -drift and have artificially low samples because of that.

-

The solution to this problem is based on the fact that the clock drift is only a problem -for one of the sides of the connection. Only when your delay measurements keep increasing -is it a problem. If your delay measurements keep decreasing, the samples will simply push -down the delay base along with it. With this in mind, we can simply keep track of the -other end's delay measurements as well, applying the same logic to it. Whenever the -other end's base delay is adjusted downwards, we adjust our base delay upwards by the same -amount.

-

This will accurately keep the base delay updated with the clock drift and improve -the delay measurements. The figure on the right shows the absolute timestamp differences -along with the base delay. The slope of the measurements is caused by clock drift.

-

For more information on the clock drift compensation, see the slides from BitTorrent's -presentation at IPTPS10.

-
-
-

features

-

libtorrent's uTP implementation includes the following features:

-
    -
  • Path MTU discovery, including jumbo frames and detecting restricted -MTU tunnels. Binary search packet sizes to find the largest non-fragmented.
  • -
  • Selective ACK. The ability to acknowledge individual packets in the -event of packet loss
  • -
  • Fast resend. The first time a packet is lost, it's resent immediately. -Triggered by duplicate ACKs.
  • -
  • Nagle's algorithm. Minimize protocol overhead by attempting to lump -full packets of payload together before sending a packet.
  • -
  • Delayed ACKs to minimize protocol overhead.
  • -
  • Microsecond resolution timestamps.
  • -
  • Advertised receive window, to support download rate limiting.
  • -
  • Correct handling of wrapping sequence numbers.
  • -
  • Easy configuration of target-delay, gain-factor, timeouts, delayed-ack -and socket buffers.
  • -
-
-
- -
-
-
- -
- -
- - From 8b9dfc824421b73bc17f19021f8f6f97c0f0ed4a Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 20:22:20 -0400 Subject: [PATCH 07/11] fix travis installation of dot and PIL --- .travis.yml | 2 ++ docs/troubleshooting.png | Bin 373382 -> 0 bytes 2 files changed, 2 insertions(+) delete mode 100644 docs/troubleshooting.png diff --git a/.travis.yml b/.travis.yml index 65fba8eb1..c4f95afb2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,6 +47,8 @@ before_install: echo ''import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")'' >> /Users/travis/Library/Python/2.7/lib/python/site-packages/homebrew.pth; sudo easy_install Pygments; sudo easy_install -U aafigure; + brew install --quiet graphviz; + brew install --quiet Homebrew/python/pillow; fi' # disable simulations on OSX for now. It hangs on travis diff --git a/docs/troubleshooting.png b/docs/troubleshooting.png deleted file mode 100644 index 4e4f44ce4697e1582c220c271d2136d1a6837609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373382 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

<*b~99^+xXv_pV>L&~YdK{a5`%j{LJCGbP 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�DxsQyaYl( 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 $Ngj=T|DZ=cgVx?ezR|RXh7p8!6zCcC=({iHzRB zHZ7xvK%0Lu&B|)Rgk7_41|etli11pdHZn{4{4c+NOK4o+FjN8WqMT&L$ zz#D9zH7S(om98i$f;)8i=04^ZKvV)NJ@m7Mg@uA1IulI=;o&Nv@Q=m!MtM6MojLpF z#f#O*bJl==FamIc_P?yK(#+7-3>~>(w_{3Im#?QjGjwI@hV97jyh$yqFZ54*p)tKX z4{to67B|4X|E}crxTL<|=I=6F?_st%RNJw+;Y+uqwh4as#3$<6ait{igv(=M&v z>9Ol5d3YFZ>27!X;^r>UDf9GRnU+uP{(VaK`MTcW{ zq+N>;mNy~D`Tn)|qfa`tvK=yZY%n$LZ32$x;p>GK^%!SaZyK>Cji*dMP_p&7N2!^4Z%lP1t z(STLK(Xq{1N0A?#`&{Rmw8w*SiEyLM8n@y4gSW2*>K*lMjfLF#xG(a~@Y6OwZT>GJ z|KZdxXLDP`ulV`L^kXyY%Ft}ivt@{`3;RwQLW(K)|I!%>eJTtiGTct#-sRtY6lZ~s zjqZ2l@5(HuTeoh#Eh%YydT&BPc46O}5O-+29e(p*=caWP%LJ1+3q14JPZ}TM@M2{} zme9}7Z#+$)aJ(vdR&-%p5^r51U6}ReeoscRX!q{@KsopEH-{;9FLbRT;4S(7_oP!L zd7~7|sE!C_6j9`cB@etjJrP*Z&S^ehqukKY@I1J&v`7EnN=wVizj=(fG|ngc>Q#Ty z4Rr}jsfVU?R+j6)+)?Myza@81W7~C(dm(#nARzZKNzj4*vrzrBOb2&0$ z_g5+=t|$SoTWMo7fV0B#i50d)cc8XU=$N?t6U% zYnXg`bLxdd9U70bgO16;=fciAI(g7#B5FeH^HlU4r%LY%G@Zcj@4M`Mq4RX3M^ds| zyU

<4OWYoEUk=6F5fSRVjyN!}d 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�&r7`LrBt)<#IilL9_^AKcO|Qu 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 Date: Sat, 19 Mar 2016 01:44:21 -0400 Subject: [PATCH 08/11] deprecate more parts of explicit cache as well as fixing typos of TORRENT_NO_DEPRECATE preprocessor tests --- bindings/python/src/create_torrent.cpp | 5 ++++- examples/make_torrent.cpp | 2 +- include/libtorrent/aux_/session_impl.hpp | 2 +- include/libtorrent/create_torrent.hpp | 11 ++++++----- include/libtorrent/disk_interface.hpp | 4 ++-- include/libtorrent/disk_io_job.hpp | 2 +- include/libtorrent/disk_io_thread.hpp | 4 ++-- include/libtorrent/settings_pack.hpp | 6 +++--- include/libtorrent/torrent.hpp | 2 +- src/block_cache.cpp | 11 +++++++---- src/disk_io_thread.cpp | 10 +++++----- src/session_handle.cpp | 2 +- src/session_impl.cpp | 4 ++-- src/torrent.cpp | 4 ++-- test/test_checking.cpp | 3 ++- test/test_remap_files.cpp | 2 +- 16 files changed, 41 insertions(+), 33 deletions(-) diff --git a/bindings/python/src/create_torrent.cpp b/bindings/python/src/create_torrent.cpp index 540813b79..d8e99bed8 100644 --- a/bindings/python/src/create_torrent.cpp +++ b/bindings/python/src/create_torrent.cpp @@ -198,7 +198,7 @@ void bind_create_torrent() .def(init()) .def(init(arg("ti"))) .def(init((arg("storage"), arg("piece_size") = 0 - , arg("pad_file_limit") = -1, arg("flags") = int(libtorrent::create_torrent::optimize)))) + , arg("pad_file_limit") = -1, arg("flags") = int(libtorrent::create_torrent::optimize_alignment)))) .def("generate", &create_torrent::generate) @@ -220,7 +220,10 @@ void bind_create_torrent() ; enum_("create_torrent_flags_t") +#ifndef TORRENT_NO_DEPRECATE .value("optimize", create_torrent::optimize) +#endif + .value("optimize_alignment", create_torrent::optimize_alignment) .value("merkle", create_torrent::merkle) .value("modification_time", create_torrent::modification_time) .value("symlinks", create_torrent::symlinks) diff --git a/examples/make_torrent.cpp b/examples/make_torrent.cpp index e441b1626..281451367 100644 --- a/examples/make_torrent.cpp +++ b/examples/make_torrent.cpp @@ -264,7 +264,7 @@ int main(int argc, char* argv[]) case 'p': ++i; pad_file_limit = atoi(argv[i]); - flags |= create_torrent::optimize; + flags |= create_torrent::optimize_alignment; break; case 's': ++i; diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index a0cab6bf4..429f74cac 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -933,7 +933,7 @@ namespace libtorrent // torrents. int m_auto_scrape_time_scaler; -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // the index of the torrent that we'll // refresh the next time int m_next_explicit_cache_torrent; diff --git a/include/libtorrent/create_torrent.hpp b/include/libtorrent/create_torrent.hpp index 905386d0a..ed9d4008d 100644 --- a/include/libtorrent/create_torrent.hpp +++ b/include/libtorrent/create_torrent.hpp @@ -114,7 +114,7 @@ namespace libtorrent // files, to keep the impact down for clients that don't support // them. optimize_alignment = 1, -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // same as optimize_alignment, for backwards compatibility optimize = 1, #endif @@ -158,8 +158,8 @@ namespace libtorrent // If a ``pad_size_limit`` is specified (other than -1), any file larger than // the specified number of bytes will be preceeded by a pad file to align it // with the start of a piece. The pad_file_limit is ignored unless the - // ``optimize`` flag is passed. Typically it doesn't make sense to set this - // any lower than 4kiB. + // ``optimize_alignment`` flag is passed. Typically it doesn't make sense + // to set this any lower than 4kiB. // // The overload that takes a ``torrent_info`` object will make a verbatim // copy of its info dictionary (to preserve the info-hash). The copy of @@ -175,7 +175,8 @@ namespace libtorrent // eligible files are aligned to. The default is -1, which means the // piece size of the torrent. create_torrent(file_storage& fs, int piece_size = 0 - , int pad_file_limit = -1, int flags = optimize, int alignment = -1); + , int pad_file_limit = -1, int flags = optimize_alignment + , int alignment = -1); create_torrent(torrent_info const& ti); // internal @@ -302,7 +303,7 @@ namespace libtorrent private: file_storage& m_files; - // if m_info_dict is initialized, it is + // if m_info_dict is initialized, it is // used instead of m_files to generate // the info dictionary entry m_info_dict; diff --git a/include/libtorrent/disk_interface.hpp b/include/libtorrent/disk_interface.hpp index 523f0f66a..a28c75a5d 100644 --- a/include/libtorrent/disk_interface.hpp +++ b/include/libtorrent/disk_interface.hpp @@ -71,6 +71,8 @@ namespace libtorrent , std::vector& links , boost::function const& handler) = 0; #ifndef TORRENT_NO_DEPRECATE + virtual void async_cache_piece(piece_manager* storage, int piece + , boost::function const& handler) = 0; virtual void async_finalize_file(piece_manager*, int file , boost::function const& handler = boost::function()) = 0; @@ -78,8 +80,6 @@ namespace libtorrent virtual void async_flush_piece(piece_manager* storage, int piece , boost::function const& handler = boost::function()) = 0; - virtual void async_cache_piece(piece_manager* storage, int piece - , boost::function const& handler) = 0; virtual void async_stop_torrent(piece_manager* storage , boost::function const& handler)= 0; virtual void async_rename_file(piece_manager* storage, int index, std::string const& name diff --git a/include/libtorrent/disk_io_job.hpp b/include/libtorrent/disk_io_job.hpp index e64c5d889..25bbdc485 100644 --- a/include/libtorrent/disk_io_job.hpp +++ b/include/libtorrent/disk_io_job.hpp @@ -92,8 +92,8 @@ namespace libtorrent , save_resume_data , rename_file , stop_torrent - , cache_piece #ifndef TORRENT_NO_DEPRECATE + , cache_piece , finalize_file #endif , flush_piece diff --git a/include/libtorrent/disk_io_thread.hpp b/include/libtorrent/disk_io_thread.hpp index da302f9c9..1d093efd0 100644 --- a/include/libtorrent/disk_io_thread.hpp +++ b/include/libtorrent/disk_io_thread.hpp @@ -323,9 +323,9 @@ namespace libtorrent , boost::function const& handler); void async_stop_torrent(piece_manager* storage , boost::function const& handler); +#ifndef TORRENT_NO_DEPRECATE void async_cache_piece(piece_manager* storage, int piece , boost::function const& handler); -#ifndef TORRENT_NO_DEPRECATE void async_finalize_file(piece_manager* storage, int file , boost::function const& handler = boost::function()); @@ -417,8 +417,8 @@ namespace libtorrent int do_rename_file(disk_io_job* j, jobqueue_t& completed_jobs); int do_stop_torrent(disk_io_job* j, jobqueue_t& completed_jobs); int do_read_and_hash(disk_io_job* j, jobqueue_t& completed_jobs); - int do_cache_piece(disk_io_job* j, jobqueue_t& completed_jobs); #ifndef TORRENT_NO_DEPRECATE + int do_cache_piece(disk_io_job* j, jobqueue_t& completed_jobs); int do_finalize_file(disk_io_job* j, jobqueue_t& completed_jobs); #endif int do_flush_piece(disk_io_job* j, jobqueue_t& completed_jobs); diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index 2a7f6af7d..456eaee4f 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -264,7 +264,7 @@ namespace libtorrent // reading blocks back from the disk multiple times for popular // pieces. use_read_cache, -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE use_write_cache, #else deprecated7, @@ -275,7 +275,7 @@ namespace libtorrent // hash dont_flush_write_cache, -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // ``explicit_read_cache`` defaults to 0. If set to something greater // than 0, the disk read cache will not be evicted by cache misses and // will explicitly be controlled based on the rarity of pieces. Rare @@ -928,7 +928,7 @@ namespace libtorrent cache_buffer_chunk_size, cache_expiry, -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // ``explicit_cache_interval`` is the number of seconds in between // each refresh of a part of the explicit read cache. Torrents take // turns in refreshing and this is the time in between each torrent diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index c9f418d31..fee3e2273 100644 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -676,7 +676,7 @@ namespace libtorrent void get_peer_info(std::vector& v); void get_download_queue(std::vector* queue) const; -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE void refresh_explicit_cache(int cache_size); #endif diff --git a/src/block_cache.cpp b/src/block_cache.cpp index 03141a5d3..2c0ba7d06 100644 --- a/src/block_cache.cpp +++ b/src/block_cache.cpp @@ -203,8 +203,8 @@ const char* const job_action_name[] = "save_resume_data", "rename_file", "stop_torrent", - "cache_piece", #ifndef TORRENT_NO_DEPRECATE + "cache_piece", "finalize_file", #endif "flush_piece", @@ -218,6 +218,12 @@ const char* const job_action_name[] = "resolve_links" }; +#if __cplusplus >= 201103L +// make sure the job names array covers all the job IDs +static_assert(sizeof(job_action_name)/sizeof(job_action_name[0]) + == disk_io_job::num_job_ids, "disk-job-action and action-name-array mismatch"); +#endif + #if TORRENT_USE_ASSERTS char const* const piece_log_t::job_names[7] = @@ -359,9 +365,6 @@ block_cache::block_cache(int block_size, io_service& ios , m_send_buffer_blocks(0) , m_pinned_blocks(0) { - // make sure the job names array covers all the job IDs - TORRENT_ASSERT(sizeof(job_action_name)/sizeof(job_action_name[0]) - == disk_io_job::num_job_ids); } // returns: diff --git a/src/disk_io_thread.cpp b/src/disk_io_thread.cpp index 62f5fa1a5..10ae2c7fd 100644 --- a/src/disk_io_thread.cpp +++ b/src/disk_io_thread.cpp @@ -1040,8 +1040,8 @@ namespace libtorrent &disk_io_thread::do_save_resume_data, &disk_io_thread::do_rename_file, &disk_io_thread::do_stop_torrent, - &disk_io_thread::do_cache_piece, #ifndef TORRENT_NO_DEPRECATE + &disk_io_thread::do_cache_piece, &disk_io_thread::do_finalize_file, #endif &disk_io_thread::do_flush_piece, @@ -1951,6 +1951,7 @@ namespace libtorrent add_completed_jobs(completed_jobs); } +#ifndef TORRENT_NO_DEPRECATE void disk_io_thread::async_cache_piece(piece_manager* storage, int piece , boost::function const& handler) { @@ -1968,7 +1969,6 @@ namespace libtorrent add_job(j); } -#ifndef TORRENT_NO_DEPRECATE void disk_io_thread::async_finalize_file(piece_manager* storage, int file , boost::function const& handler) { @@ -1985,7 +1985,7 @@ namespace libtorrent add_job(j); } -#endif +#endif // TORRENT_NO_DEPRECATE void disk_io_thread::async_flush_piece(piece_manager* storage, int piece , boost::function const& handler) @@ -2618,6 +2618,7 @@ namespace libtorrent return j->error ? -1 : 0; } +#ifndef TORRENT_NO_DEPRECATE int disk_io_thread::do_cache_piece(disk_io_job* j, jobqueue_t& /* completed_jobs */ ) { INVARIANT_CHECK; @@ -2719,13 +2720,12 @@ namespace libtorrent return 0; } -#ifndef TORRENT_NO_DEPRECATE int disk_io_thread::do_finalize_file(disk_io_job* j, jobqueue_t& /* completed_jobs */) { j->storage->get_storage_impl()->finalize_file(j->piece, j->error); return j->error ? -1 : 0; } -#endif +#endif // TORRENT_NO_DEPRECATE namespace { diff --git a/src/session_handle.cpp b/src/session_handle.cpp index f6d656f70..08f437fb6 100644 --- a/src/session_handle.cpp +++ b/src/session_handle.cpp @@ -1013,7 +1013,7 @@ namespace libtorrent p.set_bool(settings_pack::enable_natpmp, false); apply_settings(p); } -#endif // TORRENT_NO_DEPRECATED +#endif // TORRENT_NO_DEPRECATE int session_handle::add_port_mapping(session::protocol_type t, int external_port, int local_port) { diff --git a/src/session_impl.cpp b/src/session_impl.cpp index d5dc33629..885e85216 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -393,7 +393,7 @@ namespace aux { , m_optimistic_unchoke_time_scaler(0) , m_disconnect_time_scaler(90) , m_auto_scrape_time_scaler(180) -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE , m_next_explicit_cache_torrent(0) , m_cache_rotation_timer(0) #endif @@ -3335,7 +3335,7 @@ retry: ++m_next_suggest_torrent; } -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // -------------------------------------------------------------- // refresh explicit disk read cache // -------------------------------------------------------------- diff --git a/src/torrent.cpp b/src/torrent.cpp index ced7edf54..04226a615 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -10576,7 +10576,7 @@ namespace libtorrent update_want_peers(); } -#ifndef TORRENT_NO_DEPRECATED +#ifndef TORRENT_NO_DEPRECATE // TODO: 2 this should probably be removed void torrent::refresh_explicit_cache(int cache_size) { @@ -10675,7 +10675,7 @@ namespace libtorrent } } } -#endif +#endif // TORRENT_NO_DEPRECATE void torrent::sent_bytes(int bytes_payload, int bytes_protocol) { diff --git a/test/test_checking.cpp b/test/test_checking.cpp index f78f3b04b..f489c05b6 100644 --- a/test/test_checking.cpp +++ b/test/test_checking.cpp @@ -103,7 +103,8 @@ void test_checking(int flags = read_only_files) , file_sizes, num_files); add_files(fs, combine_path("tmp1_checking", "test_torrent_dir")); - libtorrent::create_torrent t(fs, piece_size, 0x4000, libtorrent::create_torrent::optimize); + libtorrent::create_torrent t(fs, piece_size, 0x4000 + , libtorrent::create_torrent::optimize_alignment); // calculate the hash for all pieces set_piece_hashes(t, "tmp1_checking", ec); diff --git a/test/test_remap_files.cpp b/test/test_remap_files.cpp index ee6f2c0de..e7eed2238 100644 --- a/test/test_remap_files.cpp +++ b/test/test_remap_files.cpp @@ -410,7 +410,7 @@ void test_remap_files_prio(storage_mode_t storage_mode = storage_mode_sparse) add_files(fs1, combine_path("tmp1_remap3", "test_torrent_dir")); libtorrent::create_torrent ct(fs1, piece_size, 0x4000 - , libtorrent::create_torrent::optimize); + , libtorrent::create_torrent::optimize_alignment); // calculate the hash for all pieces set_piece_hashes(ct, "tmp1_remap3", ec); From d705dc295332b186cb3032c5941f16b698925f6c Mon Sep 17 00:00:00 2001 From: arvidn Date: Wed, 24 Feb 2016 23:20:42 -0500 Subject: [PATCH 09/11] attempt to fix issue with binding udp sockets on windows --- src/udp_socket.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/udp_socket.cpp b/src/udp_socket.cpp index a923a8af6..3229ee223 100644 --- a/src/udp_socket.cpp +++ b/src/udp_socket.cpp @@ -694,22 +694,13 @@ void udp_socket::close() TORRENT_ASSERT(m_magic == 0x1337); error_code ec; - // if we close the socket here, we can't shut down - // utp connections or NAT-PMP. We need to cancel the - // outstanding operations - m_ipv4_sock.cancel(ec); - if (ec == error::operation_not_supported) - m_ipv4_sock.close(ec); + m_ipv4_sock.close(ec); TORRENT_ASSERT_VAL(!ec || ec == error::bad_descriptor, ec); #if TORRENT_USE_IPV6 - m_ipv6_sock.cancel(ec); - if (ec == error::operation_not_supported) - m_ipv6_sock.close(ec); + m_ipv6_sock.close(ec); TORRENT_ASSERT_VAL(!ec || ec == error::bad_descriptor, ec); #endif - m_socks5_sock.cancel(ec); - if (ec == error::operation_not_supported) - m_socks5_sock.close(ec); + m_socks5_sock.close(ec); TORRENT_ASSERT_VAL(!ec || ec == error::bad_descriptor, ec); m_resolver.cancel(); m_timer.cancel(); From e9a5985609383f0a881ad6530c8ef6bd2be3fac6 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 5 Mar 2016 15:42:29 -0500 Subject: [PATCH 10/11] if a udp socket is already bound to the IP and port we want to bind it to, don't reopen it --- src/session_impl.cpp | 134 +++++++++++++++++++++++-------------------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/src/session_impl.cpp b/src/session_impl.cpp index d5dc33629..1de8400c6 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -2069,83 +2069,96 @@ retry: #ifdef TORRENT_USE_OPENSSL int const ssl_port = m_settings.get_int(settings_pack::ssl_listen); udp::endpoint ssl_bind_if(m_listen_interface.address(), ssl_port); + tcp::endpoint ssl_bind_ep(m_listen_interface.address(), ssl_port); // if ssl port is 0, we don't want to listen on an SSL port if (ssl_port != 0) { - // TODO: 2 use bind_to_device in udp_socket - m_ssl_udp_socket.bind(ssl_bind_if, ec); - if (ec) + // if the socket is already open with the port we want, just leave it + error_code err; + if (!m_ssl_udp_socket.is_open() + || m_ssl_udp_socket.local_endpoint(err) != ssl_bind_ep + || err) { -#ifndef TORRENT_DISABLE_LOGGING - session_log("SSL: cannot bind to UDP interface \"%s\": %s" - , print_endpoint(m_listen_interface).c_str(), ec.message().c_str()); -#endif - if (m_alerts.should_post()) + m_ssl_udp_socket.bind(ssl_bind_if, ec); + if (ec) { - error_code err; - m_alerts.emplace_alert(ssl_bind_if.address().to_string() - , ssl_port, listen_failed_alert::bind, ec, listen_failed_alert::utp_ssl); +#ifndef TORRENT_DISABLE_LOGGING + session_log("SSL: cannot bind to UDP interface \"%s\": %s" + , print_endpoint(m_listen_interface).c_str(), ec.message().c_str()); +#endif + if (m_alerts.should_post()) + { + m_alerts.emplace_alert(ssl_bind_if.address().to_string() + , ssl_port, listen_failed_alert::bind, ec, listen_failed_alert::utp_ssl); + } + ec.clear(); + } + else + { + maybe_update_udp_mapping(0, true, ssl_port, ssl_port); + maybe_update_udp_mapping(1, true, ssl_port, ssl_port); } - ec.clear(); } else { - maybe_update_udp_mapping(0, true, ssl_port, ssl_port); - maybe_update_udp_mapping(1, true, ssl_port, ssl_port); - } - } - else - { - m_ssl_udp_socket.close(); + m_ssl_udp_socket.close(); - // if there are mappings for the SSL socket, delete them now - if (m_ssl_udp_mapping[0] != -1 && m_natpmp) - { - m_natpmp->delete_mapping(m_ssl_udp_mapping[0]); - m_ssl_udp_mapping[0] = -1; - } - if (m_ssl_udp_mapping[1] != -1 && m_upnp) - { - m_upnp->delete_mapping(m_ssl_udp_mapping[1]); - m_ssl_udp_mapping[1] = -1; + // if there are mappings for the SSL socket, delete them now + if (m_ssl_udp_mapping[0] != -1 && m_natpmp) + { + m_natpmp->delete_mapping(m_ssl_udp_mapping[0]); + m_ssl_udp_mapping[0] = -1; + } + if (m_ssl_udp_mapping[1] != -1 && m_upnp) + { + m_upnp->delete_mapping(m_ssl_udp_mapping[1]); + m_ssl_udp_mapping[1] = -1; + } } } #endif // TORRENT_USE_OPENSSL - // TODO: 2 use bind_to_device in udp_socket - m_udp_socket.bind(udp::endpoint(m_listen_interface.address() - , m_listen_interface.port()), ec); - if (ec) + udp::endpoint const udp_bind_ep(m_listen_interface.address() + , m_listen_interface.port()); + + // if the socket is already open with the port we want, just leave it + error_code err; + if (!m_udp_socket.is_open() + || m_udp_socket.local_endpoint(err) != m_listen_interface + || err) { + m_udp_socket.bind(udp_bind_ep, ec); + if (ec) + { #ifndef TORRENT_DISABLE_LOGGING - session_log("cannot bind to UDP interface \"%s\": %s" - , print_endpoint(m_listen_interface).c_str(), ec.message().c_str()); + session_log("cannot bind to UDP interface \"%s\": %s" + , print_endpoint(m_listen_interface).c_str(), ec.message().c_str()); #endif - if (m_alerts.should_post()) - { - error_code err; - m_alerts.emplace_alert(m_listen_interface.address().to_string() - , m_listen_interface.port() - , listen_failed_alert::bind - , ec, listen_failed_alert::udp); + if (m_alerts.should_post()) + { + m_alerts.emplace_alert(m_listen_interface.address().to_string() + , m_listen_interface.port() + , listen_failed_alert::bind + , ec, listen_failed_alert::udp); + } + if (listen_port_retries > 0) + { + m_listen_interface.port(m_listen_interface.port() + 1); + // update the actual port m_listen_interface was derived from also + if (!m_listen_interfaces.empty()) + m_listen_interfaces[0].second += 1; + --listen_port_retries; + goto retry; + } + return; } - if (listen_port_retries > 0) + else { - m_listen_interface.port(m_listen_interface.port() + 1); - // update the actual port m_listen_interface was derived from also - if (!m_listen_interfaces.empty()) - m_listen_interfaces[0].second += 1; - --listen_port_retries; - goto retry; + m_external_udp_port = m_udp_socket.local_port(); + maybe_update_udp_mapping(0, false, m_listen_interface.port(), m_listen_interface.port()); + maybe_update_udp_mapping(1, false, m_listen_interface.port(), m_listen_interface.port()); } - return; - } - else - { - m_external_udp_port = m_udp_socket.local_port(); - maybe_update_udp_mapping(0, false, m_listen_interface.port(), m_listen_interface.port()); - maybe_update_udp_mapping(1, false, m_listen_interface.port(), m_listen_interface.port()); } // we made it! now post all the listen_succeeded_alerts @@ -2159,9 +2172,9 @@ retry: if (!m_alerts.should_post()) continue; - error_code err; - tcp::endpoint bind_ep = i->sock->local_endpoint(err); - if (err) continue; + error_code error; + tcp::endpoint bind_ep = i->sock->local_endpoint(error); + if (error) continue; m_alerts.emplace_alert(bind_ep, socket_type); } @@ -2171,8 +2184,7 @@ retry: { if (m_alerts.should_post()) m_alerts.emplace_alert( - tcp::endpoint(ssl_bind_if.address(), ssl_bind_if.port()) - , listen_succeeded_alert::utp_ssl); + ssl_bind_ep, listen_succeeded_alert::utp_ssl); } #endif From 53b5e964d208f390d51bd9793346e58fbba6fd6f Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 23:32:57 -0400 Subject: [PATCH 11/11] fix merge issue and properly close ssl udp socket when disabled, prevents the extra listen_succeeded alert for the ssl udp socket --- src/session_impl.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 1de8400c6..dfd4762ce 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -2092,6 +2092,7 @@ retry: m_alerts.emplace_alert(ssl_bind_if.address().to_string() , ssl_port, listen_failed_alert::bind, ec, listen_failed_alert::utp_ssl); } + m_ssl_udp_socket.close(); ec.clear(); } else @@ -2100,21 +2101,21 @@ retry: maybe_update_udp_mapping(1, true, ssl_port, ssl_port); } } - else - { - m_ssl_udp_socket.close(); + } + else + { + m_ssl_udp_socket.close(); - // if there are mappings for the SSL socket, delete them now - if (m_ssl_udp_mapping[0] != -1 && m_natpmp) - { - m_natpmp->delete_mapping(m_ssl_udp_mapping[0]); - m_ssl_udp_mapping[0] = -1; - } - if (m_ssl_udp_mapping[1] != -1 && m_upnp) - { - m_upnp->delete_mapping(m_ssl_udp_mapping[1]); - m_ssl_udp_mapping[1] = -1; - } + // if there are mappings for the SSL socket, delete them now + if (m_ssl_udp_mapping[0] != -1 && m_natpmp) + { + m_natpmp->delete_mapping(m_ssl_udp_mapping[0]); + m_ssl_udp_mapping[0] = -1; + } + if (m_ssl_udp_mapping[1] != -1 && m_upnp) + { + m_upnp->delete_mapping(m_ssl_udp_mapping[1]); + m_ssl_udp_mapping[1] = -1; } } #endif // TORRENT_USE_OPENSSL @@ -2142,6 +2143,7 @@ retry: , listen_failed_alert::bind , ec, listen_failed_alert::udp); } + m_udp_socket.close(); if (listen_port_retries > 0) { m_listen_interface.port(m_listen_interface.port() + 1); @@ -2166,7 +2168,7 @@ retry: for (std::list::iterator i = m_listen_sockets.begin() , end(m_listen_sockets.end()); i != end; ++i) { - listen_succeeded_alert::socket_type_t socket_type = i->ssl + listen_succeeded_alert::socket_type_t const socket_type = i->ssl ? listen_succeeded_alert::tcp_ssl : listen_succeeded_alert::tcp;

-
- - - - -
-

libtorrent manual

- --- - - - - - -
Author:Arvid Norberg, arvid@libtorrent.org
Version:1.1.0
-
-
-

tuning libtorrent

-

libtorrent expose most constants used in the bittorrent engine for -customization through the session_settings. This makes it possible to -test and tweak the parameters for certain algorithms to make a client -that fits a wide range of needs. From low memory embedded devices to -servers seeding thousands of torrents. The default settings in libtorrent -are tuned for an end-user bittorrent client running on a normal desktop -computer.

-

This document describes techniques to benchmark libtorrent performance -and how parameters are likely to affect it.

-
-
-

reducing memory footprint

-

These are things you can do to reduce the memory footprint of libtorrent. You get -some of this by basing your default session_settings on the min_memory_usage() -setting preset function.

-

Keep in mind that lowering memory usage will affect performance, always profile -and benchmark your settings to determine if it's worth the trade-off.

-

The typical buffer usage of libtorrent, for a single download, with the cache -size set to 256 blocks (256 * 16 kiB = 4 MiB) is:

-
-read cache:      128.6 (2058 kiB)
-write cache:     103.5 (1656 kiB)
-receive buffers: 7.3   (117 kiB)
-send buffers:    4.8   (77 kiB)
-hash temp:       0.001 (19 Bytes)
-
-

The receive buffers is proportional to the number of connections we make, and is -limited by the total number of connections in the session (default is 200).

-

The send buffers is proportional to the number of upload slots that are allowed -in the session. The default is auto configured based on the observed upload rate.

-

The read and write cache can be controlled (see section below).

-

The "hash temp" entry size depends on whether or not hashing is optimized for -speed or memory usage. In this test run it was optimized for memory usage.

-
-

disable disk cache

-

The bulk of the memory libtorrent will use is used for the disk cache. To save -the absolute most amount of memory, you can disable the cache by setting -session_settings::cache_size to 0. You might want to consider using the cache -but just disable caching read operations. You do this by settings -session_settings::use_read_cache to false. This is the main factor in how much -memory will be used by the client. Keep in mind that you will degrade performance -by disabling the cache. You should benchmark the disk access in order to make an -informed trade-off.

-
-
-

remove torrents

-

Torrents that have been added to libtorrent will inevitably use up memory, even -when it's paused. A paused torrent will not use any peer connection objects or -any send or receive buffers though. Any added torrent holds the entire .torrent -file in memory, it also remembers the entire list of peers that it's heard about -(which can be fairly long unless it's capped). It also retains information about -which blocks and pieces we have on disk, which can be significant for torrents -with many pieces.

-

If you need to minimize the memory footprint, consider removing torrents from -the session rather than pausing them. This will likely only make a difference -when you have a very large number of torrents in a session.

-

The downside of removing them is that they will no longer be auto-managed. Paused -auto managed torrents are scraped periodically, to determine which torrents are -in the greatest need of seeding, and libtorrent will prioritize to seed those.

-
-
-

socket buffer sizes

-

You can make libtorrent explicitly set the kernel buffer sizes of all its peer -sockets. If you set this to a low number, you may see reduced throughput, especially -for high latency connections. It is however an opportunity to save memory per -connection, and might be worth considering if you have a very large number of -peer connections. This memory will not be visible in your process, this sets -the amount of kernel memory is used for your sockets.

-

Change this by setting session_settings::recv_socket_buffer_size and -session_settings::send_socket_buffer_size.

-
-
-

peer list size

-

The default maximum for the peer list is 4000 peers. For IPv4 peers, each peer -entry uses 32 bytes, which ends up using 128 kB per torrent. If seeding 4 popular -torrents, the peer lists alone uses about half a megabyte.

-

The default limit is the same for paused torrents as well, so if you have a -large number of paused torrents (that are popular) it will be even more -significant.

-

If you're short of memory, you should consider lowering the limit. 500 is probably -enough. You can do this by setting session_settings::max_peerlist_size to -the max number of peers you want in a torrent's peer list. This limit applies per -torrent. For 5 torrents, the total number of peers in peerlists will be 5 times -the setting.

-

You should also lower the same limit but for paused torrents. It might even make sense -to set that even lower, since you only need a few peers to start up while waiting -for the tracker and DHT to give you fresh ones. The max peer list size for paused -torrents is set by session_settings::max_paused_peerlist_size.

-

The drawback of lowering this number is that if you end up in a position where -the tracker is down for an extended period of time, your only hope of finding live -peers is to go through your list of all peers you've ever seen. Having a large -peer list will also help increase performance when starting up, since the torrent -can start connecting to peers in parallel with connecting to the tracker.

-
-
-

send buffer watermark

-

The send buffer watermark controls when libtorrent will ask the disk I/O thread -to read blocks from disk, and append it to a peer's send buffer.

-

When the send buffer has fewer than or equal number of bytes as -session_settings::send_buffer_watermark, the peer will ask the disk I/O thread -for more data to send. The trade-off here is between wasting memory by having too -much data in the send buffer, and hurting send rate by starving out the socket, -waiting for the disk read operation to complete.

-

If your main objective is memory usage and you're not concerned about being able -to achieve high send rates, you can set the watermark to 9 bytes. This will guarantee -that no more than a single (16 kiB) block will be on the send buffer at a time, for -all peers. This is the least amount of memory possible for the send buffer.

-

You should benchmark your max send rate when adjusting this setting. If you have -a very fast disk, you are less likely see a performance hit.

-
-
-

optimize hashing for memory usage

-

When libtorrent is doing hash checks of a file, or when it re-reads a piece that -was just completed to verify its hash, there are two options. The default one -is optimized for speed, which allocates buffers for the entire piece, reads in -the whole piece in one read call, then hashes it.

-

The second option is to optimize for memory usage instead, where a single buffer -is allocated, and the piece is read one block at a time, hashing it as each -block is read from the file. For low memory environments, this latter approach -is recommended. Change this by settings session_settings::optimize_hashing_for_speed -to false. This will significantly reduce peak memory usage, especially for -torrents with very large pieces.

-
-
-

reduce executable size

-

Compilers generally add a significant number of bytes to executables that make use -of C++ exceptions. By disabling exceptions (-fno-exceptions on GCC), you can -reduce the executable size with up to 45%. In order to build without exception -support, you need to patch parts of boost.

-

Also make sure to optimize for size when compiling.

-

Another way of reducing the executable size is to disable code that isn't used. -There are a number of TORRENT_* macros that control which features are included -in libtorrent. If these macros are used to strip down libtorrent, make sure the same -macros are defined when building libtorrent as when linking against it. If these -are different the structures will look different from the libtorrent side and from -the client side and memory corruption will follow.

-

One, probably, safe macro to define is TORRENT_NO_DEPRECATE which removes all -deprecated functions and struct members. As long as no deprecated functions are -relied upon, this should be a simple way to eliminate a little bit of code.

-

For all available options, see the building libtorrent secion.

-
-
-
-

play nice with the disk

-

When checking a torrent, libtorrent will try to read as fast as possible from the disk. -The only thing that might hold it back is a CPU that is slow at calculating SHA-1 hashes, -but typically the file checking is limited by disk read speed. Most operating systems -today do not prioritize disk access based on the importance of the operation, this means -that checking a torrent might delay other disk accesses, such as virtual memory swapping -or just loading file by other (interactive) applications.

-

In order to play nicer with the disk, and leave some spare time for it to service other -processes that might be of higher importance to the end-user, you can introduce a sleep -between the disc accesses. This is a direct tradeoff between how fast you can check a -torrent and how soft you will hit the disk.

-

You control this by setting the session_settings::file_checks_delay_per_block to greater -than zero. This number is the number of milliseconds to sleep between each read of 16 kiB.

-

The sleeps are not necessarily in between each 16 kiB block (it might be read in larger chunks), -but the number will be multiplied by the number of blocks that were read, to maintain the -same semantics.

-
-
-

high performance seeding

-

In the case of a high volume seed, there are two main concerns. Performance and scalability. -This translates into high send rates, and low memory and CPU usage per peer connection.

-
-

file pool

-

libtorrent keeps an LRU file cache. Each file that is opened, is stuck in the cache. The main -purpose of this is because of anti-virus software that hooks on file-open and file close to -scan the file. Anti-virus software that does that will significantly increase the cost of -opening and closing files. However, for a high performance seed, the file open/close might -be so frequent that it becomes a significant cost. It might therefore be a good idea to allow -a large file descriptor cache. Adjust this though session_settings::file_pool_size.

-

Don't forget to set a high rlimit for file descriptors in your process as well. This limit -must be high enough to keep all connections and files open.

-
-
-

disk cache

-

You typically want to set the cache size to as high as possible. The -session_settings::cache_size is specified in 16 kiB blocks. Since you're seeding, -the cache would be useless unless you also set session_settings::use_read_cache -to true.

-

In order to increase the possibility of read cache hits, set the -session_settings::cache_expiry to a large number. This won't degrade anything as -long as the client is only seeding, and not downloading any torrents.

-

In order to increase the disk cache hit rate, you can enable suggest messages based on -what's in the read cache. To do this, set session_settings::suggest_mode to -session_settings::suggest_read_cache. This will send suggest messages to peers -for the most recently used pieces in the read cache. This is especially useful if you -also enable explicit read cache, by settings session_settings::explicit_read_cache -to the number of pieces to keep in the cache. The explicit read cache will make the -disk read cache stick, and not be evicted by cache misses. The explicit read cache -will automatically pull in the rarest pieces in the read cache.

-

Assuming that you seed much more data than you can keep in the cache, to a large -numbers of peers (so that the read cache wouldn't be useful anyway), this may be a -good idea.

-

When peers first connect, libtorrent will send them a number of allow-fast messages, -which lets the peers download certain pieces even when they are choked, since peers -are choked by default, this often triggers immediate requests for those pieces. In the -case of using explicit read cache and suggesting those pieces, allowing fast pieces -should be disabled, to not systematically trigger requests for pieces that are not cached -for all peers. You can turn off allow-fast by settings session_settings::allowed_fast_set_size -to 0.

-

As an alternative to the explicit cache and suggest messages, there's a guided cache -mode. This means the size of the read cache line that's stored in the cache is determined -based on the upload rate to the peer that triggered the read operation. The idea being -that slow peers don't use up a disproportional amount of space in the cache. This -is enabled through session_settings::guided_read_cache.

-

In cases where the assumption is that the cache is only used as a read-ahead, and that no -other peer will ever request the same block while it's still in the cache, the read -cache can be set to be volatile. This means that every block that is requested out of -the read cache is removed immediately. This saves a significant amount of cache space -which can be used as read-ahead for other peers. This mode should never be combined -with either explicit_read_cache or suggest_read_cache, since those uses opposite -strategies for the read cache. You don't want to on one hand attract peers to request -the same pieces, and on the other hand assume that they won't request the same pieces -and drop them when the first peer requests it. To enable volatile read cache, set -session_settings::volatile_read_cache to true.

-
-
-

SSD as level 2 cache

-

It is possible to introduce a second level of cache, below the RAM disk cache. This is done -by setting session_settings::mmap_cache to a file path pointing to the SSD drive, and -increasing the session_settings::cache_size to the number of 16 kiB blocks would fit -on the drive (or less).

-

This will allocate disk buffers (for reading and writing) from a memory region that has -been mapped to the specified file. If the drive this file lives on is not significantly -faster than the destination drive, performance will be degraded. The point is to take -advantage primarily of the fast read speed from SSD drives and use it to extend the read -cache, improving seed performance.

-

Which parts of the cache that actually live in RAM is determined by the operating system.

-

Note that when using this feature, any block which ends up being pulled from the mmapped -file will be considered a cache hit.

-
-
-

uTP-TCP mixed mode

-

libtorrent supports uTP, which has a delay based congestion controller. In order to -avoid having a single TCP bittorrent connection completely starve out any uTP connection, -there is a mixed mode algorithm. This attempts to detect congestion on the uTP peers and -throttle TCP to avoid it taking over all bandwidth. This balances the bandwidth resources -between the two protocols. When running on a network where the bandwidth is in such an -abundance that it's virtually infinite, this algorithm is no longer necessary, and might -even be harmful to throughput. It is adviced to experiment with the -session_setting::mixed_mode_algorithm, setting it to session_settings::prefer_tcp. -This setting entirely disables the balancing and unthrottles all connections. On a typical -home connection, this would mean that none of the benefits of uTP would be preserved -(the modem's send buffer would be full at all times) and uTP connections would for the most -part be squashed by the TCP traffic.

-
-
-

send buffer low watermark

-

libtorrent uses a low watermark for send buffers to determine when a new piece should -be requested from the disk I/O subsystem, to be appended to the send buffer. The low -watermark is determined based on the send rate of the socket. It needs to be large -enough to not draining the socket's send buffer before the disk operation completes.

-

The watermark is bound to a max value, to avoid buffer sizes growing out of control. -The default max send buffer size might not be enough to sustain very high upload rates, -and you might have to increase it. It's specified in bytes in -session_settings::send_buffer_watermark.

-
-
-

peers

-

First of all, in order to allow many connections, set the global connection limit -high, session::set_max_connections(). Also set the upload rate limit to -infinite, session::set_upload_rate_limit(), passing 0 means infinite.

-

When dealing with a large number of peers, it might be a good idea to have slightly -stricter timeouts, to get rid of lingering connections as soon as possible.

-

There are a couple of relevant settings: session_settings::request_timeout, -session_settings::peer_timeout and session_settings::inactivity_timeout.

-

For seeds that are critical for a delivery system, you most likely want to allow -multiple connections from the same IP. That way two people from behind the same NAT -can use the service simultaneously. This is controlled by -session_settings::allow_multiple_connections_per_ip.

-

In order to always unchoke peers, turn off automatic unchoke -session_settings::auto_upload_slots and set the number of upload slots to a large -number via session::set_max_uploads(), or use -1 (which means infinite).

-
-
-

torrent limits

-

To seed thousands of torrents, you need to increase the session_settings::active_limit -and session_settings::active_seeds.

-
-
-

SHA-1 hashing

-

When downloading at very high rates, it is possible to have the CPU be the bottleneck -for passing every downloaded byte through SHA-1. In order to enable calculating SHA-1 -hashes in parallel, on multi-core systems, set session_settings::hashing_threads -to the number of threads libtorrent should start to do SHA-1 hashing. This defaults -to 1, and only if that thread is close to saturating one core does it make sense to -increase the number of threads.

-
-
-
-

scalability

-

In order to make more efficient use of the libtorrent interface when running a large -number of torrents simultaneously, one can use the session::get_torrent_status() call -together with session::refresh_torrent_status(). Keep in mind that every call into -libtorrent that return some value have to block your thread while posting a message to -the main network thread and then wait for a response (calls that don't return any data -will simply post the message and then immediately return). The time this takes might -become significant once you reach a few hundred torrents (depending on how many calls -you make to each torrent and how often). get_torrent_status lets you query the -status of all torrents in a single call. This will actually loop through all torrents -and run a provided predicate function to determine whether or not to include it in -the returned vector. If you have a lot of torrents, you might want to update the status -of only certain torrents. For instance, you might only be interested in torrents that -are being downloaded.

-

The intended use of these functions is to start off by calling get_torrent_status -to get a list of all torrents that match your criteria. Then call refresh_torrent_status -on that list. This will only refresh the status for the torrents in your list, and thus -ignore all other torrents you might be running. This may save a significant amount of -time, especially if the number of torrents you're interested in is small. In order to -keep your list of interested torrents up to date, you can either call get_torrent_status -from time to time, to include torrents you might have become interested in since the last -time. In order to stop refreshing a certain torrent, simply remove it from the list.

-

A more efficient way however, would be to subscribe to status alert notifications, and -update your list based on these alerts. There are alerts for when torrents are added, removed, -paused, resumed, completed etc. Doing this ensures that you only query status for the -minimal set of torrents you are actually interested in.

-
-
-

benchmarking

-

There is a bunch of built-in instrumentation of libtorrent that can be used to get an insight -into what it's doing and how well it performs. This instrumentation is enabled by defining -preprocessor symbols when building.

-

There are also a number of scripts that parses the log files and generates graphs (requires -gnuplot and python).

-
-

disk metrics

-

To enable disk I/O instrumentation, define TORRENT_DISK_STATS when building. When built -with this configuration libtorrent will create three log files, measuring various aspects of -the disk I/O. The following table is an overview of these files and what they measure.

- ---- - - - - - - - - - - - - - - - - -
filenamedescription
disk_io_thread.logThis is a log of which operation the disk I/O thread is -engaged in, with timestamps. This tells you what the thread -is spending its time doing.
disk_buffers.logThis log keeps track of what the buffers allocated from the -disk buffer pool are used for. There are 5 categories. -receive buffer, send buffer, write cache, read cache and -temporary hash storage. This is key when optimizing memory -usage.
disk_access.logThis is a low level log of read and write operations, with -timestamps and file offsets. The file offsets are byte -offsets in the torrent (not in any particular file, in the -case of a multi-file torrent). This can be used as an -estimate of the physical drive location. The purpose of -this log is to identify the amount of seeking the drive has -to do.
-
-

disk_io_thread.log

-

The structure of this log is simple. For each line, there are two columns, a timestamp and -the operation that was started. There is a special operation called idle which means -it looped back to the top and started waiting for new jobs. If there are more jobs to -handle immediately, the idle state is still there, but the timestamp is the same as the -next job that is handled.

-

Some operations have a 3:rd column with an optional parameter. read and write tells -you the number of bytes that were requested to be read or written. flushing tells you -the number of bytes that were flushed from the disk cache.

-

This is an example excerpt from a log:

-
-3702 idle
-3706 check_fastresume
-3707 idle
-4708 save_resume_data
-4708 idle
-8230 read 16384
-8255 idle
-8431 read 16384
-
-

The script to parse this log and generate a graph is called parse_disk_log.py. It takes -the log file as the first command line argument, and produces a file: disk_io.png. -The time stamp is in milliseconds since start.

-

You can pass in a second, optional, argument to specify the window size it will average -the time measurements over. The default is 5 seconds. For long test runs, it might be interesting -to increase that number. It is specified as a number of seconds.

-disk_io.png -

This is an example graph generated by the parse script.

-
-
-

disk_buffers.log

-

The disk buffer log tells you where the buffer memory is used. The log format has a time stamp, -the name of the buffer usage which use-count changed, colon, and the new number of blocks that are -in use for this particular key. For example:

-
-23671 write cache: 18
-23671 receive buffer: 3
-24153 receive buffer: 2
-24153 write cache: 19
-24154 receive buffer: 3
-24198 receive buffer: 2
-24198 write cache: 20
-24202 receive buffer: 3
-24305 send buffer: 0
-24305 send buffer: 1
-24909 receive buffer: 2
-24909 write cache: 21
-24910 receive buffer: 3
-
-

The time stamp is in milliseconds since start.

-

To generate a graph, use parse_disk_buffer_log.py. It takes the log file as the first -command line argument. It generates disk_buffer.png.

-disk_buffer_sample.png -

This is an example graph generated by the parse script.

-
-
-

disk_access.log

-

The disk access log is now binary

-

The disc access log has three fields. The timestamp (milliseconds since start), operation -and offset. The offset is the absolute offset within the torrent (not within a file). This -log is only useful when you're downloading a single torrent, otherwise the offsets will not -be unique.

-

In order to easily plot this directly in gnuplot, without parsing it, there are two lines -associated with each read or write operation. The first one is the offset where the operation -started, and the second one is where the operation ended.

-

Example:

-
-15437 read 301187072
-15437 read_end 301203456
-16651 read 213385216
-16680 read_end 213647360
-25879 write 249036800
-25879 write_end 249298944
-26811 read 325582848
-26943 read_end 325844992
-36736 read 367001600
-36766 read_end 367263744
-
-

The disk access log does not have any good visualization tool yet. There is however a gnuplot -file, disk_access.gnuplot which assumes disk_access.log is in the current directory.

-disk_access.png -

The density of the disk seeks tells you how hard the drive has to work.

-
-
-
-
-

understanding the disk threads

-

This section is somewhat outdated, there are potentially more than one disk -thread

-

All disk operations are funneled through a separate thread, referred to as the -disk thread. The main interface to the disk thread is a queue where disk jobs -are posted, and the results of these jobs are then posted back on the main -thread's io_service.

-

A disk job is essentially one of:

-
    -
  1. -
    write this block to disk, i.e. a write job. For the most part this is just a
    -

    matter of sticking the block in the disk cache, but if we've run out of -cache space or completed a whole piece, we'll also flush blocks to disk. -This is typically very fast, since the OS just sticks these buffers in its -write cache which will be flushed at a later time, presumably when the drive -head will pass the place on the platter where the blocks go.

    -
    -
    -
  2. -
  3. -
    read this block from disk. The first thing that happens is we look in the
    -

    cache to see if the block is already in RAM. If it is, we'll return -immediately with this block. If it's a cache miss, we'll have to hit the -disk. Here we decide to defer this job. We find the physical offset on the -drive for this block and insert the job in an ordered queue, sorted by the -physical location. At a later time, once we don't have any more non-read -jobs left in the queue, we pick one read job out of the ordered queue and -service it. The order we pick jobs out of the queue is according to an -elevator cursor moving up and down along the ordered queue of read jobs. If -we have enough space in the cache we'll read read_cache_line_size number of -blocks and stick those in the cache. This defaults to 32 blocks. If the -system supports asynchronous I/O (Windows, Linux, Mac OS X, BSD, Solars for -instance), jobs will be issued immediately to the OS. This especially -increases read throughput, since the OS has a much greater flexibility to -reorder the read jobs.

    -
    -
    -
  4. -
-

Other disk job consist of operations that needs to be synchronized with the -disk I/O, like renaming files, closing files, flushing the cache, updating the -settings etc. These are relatively rare though.

-
-
-

contributions

-

If you have added instrumentation for some part of libtorrent that is not -covered here, or if you have improved any of the parser scrips, please consider -contributing it back to the project.

-

If you have run tests and found that some algorithm or default value in -libtorrent is suboptimal, please contribute that knowledge back as well, to -allow us to improve the library.

-

If you have additional suggestions on how to tune libtorrent for any specific -use case, please let us know and we'll update this document.

-
- -
-
-
- -
- -